diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 00000000..17c575c7 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,9 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check/.codespellrc +# See: https://github.com/codespell-project/codespell#using-a-config-file +[codespell] +# In the event of a false positive, add the problematic word, in all lowercase, to a comma-separated list here: +ignore-words-list = afterall,clude +skip = ./.git,./.licenses,.pytest_cache,__pycache__,node_modules,./go.mod,./go.sum,./package-lock.json,./poetry.lock,./yarn.lock +builtin = clear,informal,en-GB_to_en-US +check-filenames = +check-hidden = diff --git a/.ecrc b/.ecrc new file mode 100644 index 00000000..0d68a484 --- /dev/null +++ b/.ecrc @@ -0,0 +1,14 @@ +{ + "Exclude": [ + "^\\.git[/\\\\]", + "^\\.licenses[/\\\\]", + ".pytest_cache[/\\\\]", + "__pycache__[/\\\\]", + "node_modules[/\\\\]", + "^LICENSE\\.txt$", + "^poetry\\.lock$", + "\\.py$", + "^compilesketches[/\\\\]tests[/\\\\]testdata[/\\\\]test_get_warning_count_from_output[/\\\\]has-warnings\\.txt$", + "^compilesketches[/\\\\]tests[/\\\\]testdata[/\\\\]test_get_warning_count_from_output[/\\\\]no-warnings\\.txt$" + ] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..eda85443 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,60 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/general/.editorconfig +# See: https://editorconfig.org/ +# The formatting style defined in this file is the official standardized style to be used in all Arduino Tooling +# projects and should not be modified. +# Note: indent style for each file type is defined even when it matches the universal config in order to make it clear +# that this type has an official style. + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{adoc,asc,asciidoc}] +indent_size = 2 +indent_style = space + +[*.{bash,sh}] +indent_size = 2 +indent_style = space + +[*.{c,cc,cp,cpp,cxx,h,hh,hpp,hxx,ii,inl,ino,ixx,pde,tpl,tpp,txx}] +indent_size = 2 +indent_style = space + +[*.{go,mod}] +indent_style = tab + +[*.java] +indent_size = 2 +indent_style = space + +[*.{js,jsx,json,jsonc,json5,ts,tsx}] +indent_size = 2 +indent_style = space + +[*.{md,mdx,mkdn,mdown,markdown}] +indent_size = unset +indent_style = space + +[*.proto] +indent_size = 2 +indent_style = space + +[*.py] +indent_size = 4 +indent_style = space + +[*.svg] +indent_size = 2 +indent_style = space + +[*.{yaml,yml}] +indent_size = 2 +indent_style = space + +[{.gitconfig,.gitmodules}] +indent_style = tab diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000..57b9d240 --- /dev/null +++ b/.flake8 @@ -0,0 +1,12 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-python/.flake8 +# See: https://flake8.pycqa.org/en/latest/user/configuration.html +# The code style defined in this file is the official standardized style to be used in all Arduino tooling projects and +# should not be modified. + +[flake8] +doctests = True +# W503 and W504 are mutually exclusive. PEP 8 recommends line break before. +ignore = E501,W503 +max-complexity = 10 +max-line-length = 120 +select = E,W,F,C,N diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 00000000..ef1e427a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,56 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/forms/general/bug-report.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms + +name: Bug report +description: Report a problem with the code or documentation in this repository. +labels: + - "type: imperfection" +body: + - type: textarea + id: description + attributes: + label: Describe the problem + validations: + required: true + - type: textarea + id: reproduce + attributes: + label: To reproduce + description: Provide the specific set of steps we can follow to reproduce the problem. + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What would you expect to happen after following those instructions? + validations: + required: true + - type: input + id: project-version + attributes: + label: "'arduino/compile-sketches' version" + description: | + Which version of `arduino/compile-sketches` are you using? + _This should be the most recent version available._ + validations: + required: true + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any additional information here. + validations: + required: false + - type: checkboxes + id: checklist + attributes: + label: Issue checklist + description: Please double-check that you have done each of the following things before submitting the issue. + options: + - label: I searched for previous reports in [the issue tracker](https://github.com/arduino/compile-sketches/issues?q=) + required: true + - label: I verified the problem still occurs when using the latest version + required: true + - label: My report contains all necessary details + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..137d89ec --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,17 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/template-choosers/github-actions/config.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#configuring-the-template-chooser + +blank_issues_enabled: false +contact_links: + - name: Learn about using this project + url: https://github.com/arduino/compile-sketches#readme + about: Detailed usage documentation is available here. + - name: Learn about GitHub Actions + url: https://docs.github.com/actions + about: Everything you need to know to get started with GitHub Actions. + - name: Support request + url: https://forum.arduino.cc/ + about: We can help you out on the Arduino Forum! + - name: Discuss development work on the project + url: https://groups.google.com/a/arduino.cc/g/developers + about: Arduino Developers Mailing List diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 00000000..63fe618c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,51 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/issue-templates/forms/general/bug-report.yml +# See: https://docs.github.com/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms + +name: Feature request +description: Suggest an enhancement to this project. +labels: + - "type: enhancement" +body: + - type: textarea + id: description + attributes: + label: Describe the request + validations: + required: true + - type: textarea + id: current + attributes: + label: Describe the current behavior + description: | + What is the current behavior of `arduino/compile-sketches` in relation to your request? + How can we reproduce that behavior? + validations: + required: true + - type: input + id: project-version + attributes: + label: "'arduino/compile-sketches' version" + description: | + Which version of `arduino/compile-sketches` are you using? + _This should be the most recent version available._ + validations: + required: true + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any additional information here. + validations: + required: false + - type: checkboxes + id: checklist + attributes: + label: Issue checklist + description: Please double-check that you have done each of the following things before submitting the issue. + options: + - label: I searched for previous requests in [the issue tracker](https://github.com/arduino/compile-sketches/issues?q=) + required: true + - label: I verified the feature was still missing when using the latest version + required: true + - label: My request contains all necessary details + required: true diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..6c85ad4f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,34 @@ +# See: https://docs.github.com/en/code-security/supply-chain-security/configuration-options-for-dependency-updates#about-the-dependabotyml-file +version: 2 + +updates: + # Configure check for outdated GitHub Actions actions in workflows and action metadata. + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/dependabot/README.md + # See: https://docs.github.com/en/code-security/supply-chain-security/keeping-your-actions-up-to-date-with-dependabot + - package-ecosystem: github-actions + assignees: + - per1234 + directory: / + open-pull-requests-limit: 100 + schedule: + interval: daily + labels: + - "topic: infrastructure" + - package-ecosystem: npm + assignees: + - per1234 + directory: / + open-pull-requests-limit: 100 + schedule: + interval: daily + labels: + - "topic: infrastructure" + - package-ecosystem: pip + assignees: + - per1234 + directory: / + open-pull-requests-limit: 100 + schedule: + interval: daily + labels: + - "topic: infrastructure" diff --git a/.github/workflows/check-action-metadata-task.yml b/.github/workflows/check-action-metadata-task.yml new file mode 100644 index 00000000..e836ca0a --- /dev/null +++ b/.github/workflows/check-action-metadata-task.yml @@ -0,0 +1,77 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-action-metadata-task.md +name: Check Action Metadata + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-action-metadata-task.ya?ml" + - "action.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/check-action-metadata-task.ya?ml" + - "action.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + validate: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Validate action.yml + run: task --silent action:validate diff --git a/.github/workflows/check-files-task.yml b/.github/workflows/check-files-task.yml new file mode 100644 index 00000000..baa5d44e --- /dev/null +++ b/.github/workflows/check-files-task.yml @@ -0,0 +1,78 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-files-task.md +name: Check Files + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + pull_request: + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 8 * * THU" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-filenames: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Check filenames + run: task --silent general:check-filenames + + check-symlinks: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Check symlinks + run: task --silent general:check-symlinks diff --git a/.github/workflows/check-general-formatting-task.yml b/.github/workflows/check-general-formatting-task.yml new file mode 100644 index 00000000..ab9bf863 --- /dev/null +++ b/.github/workflows/check-general-formatting-task.yml @@ -0,0 +1,82 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-general-formatting-task.md +name: Check General Formatting + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + pull_request: + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage caused by changes to tools. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Set environment variables + run: | + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable + echo "EC_INSTALL_PATH=${{ runner.temp }}/editorconfig-checker" >> "$GITHUB_ENV" + + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Download latest editorconfig-checker release binary package + id: download + uses: MrOctopus/download-asset-action@1.1 + with: + repository: editorconfig-checker/editorconfig-checker + excludes: prerelease, draft + asset: linux-amd64.tar.gz + target: ${{ env.EC_INSTALL_PATH }} + + - name: Install editorconfig-checker + run: | + cd "${{ env.EC_INSTALL_PATH }}" + tar --extract --file="${{ steps.download.outputs.name }}" + # Give the binary a standard name + mv "${{ env.EC_INSTALL_PATH }}/bin/ec-linux-amd64" "${{ env.EC_INSTALL_PATH }}/bin/ec" + # Add installation to PATH: + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-system-path + echo "${{ env.EC_INSTALL_PATH }}/bin" >> "$GITHUB_PATH" + + - name: Check formatting + run: task --silent general:check-formatting diff --git a/.github/workflows/check-license.yml b/.github/workflows/check-license.yml new file mode 100644 index 00000000..f48d8476 --- /dev/null +++ b/.github/workflows/check-license.yml @@ -0,0 +1,109 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-license.md +name: Check License + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-license.ya?ml" + # See: https://github.com/licensee/licensee/blob/master/docs/what-we-look-at.md#detecting-the-license-file + - "[cC][oO][pP][yY][iI][nN][gG]*" + - "[cC][oO][pP][yY][rR][iI][gG][hH][tH]*" + - "[lL][iI][cC][eE][nN][cCsS][eE]*" + - "[oO][fF][lL]*" + - "[pP][aA][tT][eE][nN][tT][sS]*" + pull_request: + paths: + - ".github/workflows/check-license.ya?ml" + - "[cC][oO][pP][yY][iI][nN][gG]*" + - "[cC][oO][pP][yY][rR][iI][gG][hH][tH]*" + - "[lL][iI][cC][eE][nN][cCsS][eE]*" + - "[oO][fF][lL]*" + - "[pP][aA][tT][eE][nN][tT][sS]*" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 6 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check-license: + name: ${{ matrix.check-license.path }} + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + + matrix: + check-license: + - path: ./ + expected-filename: LICENSE.txt + # SPDX identifier: https://spdx.org/licenses/ + expected-type: GPL-3.0 + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ruby # Install latest version + + - name: Install licensee + run: gem install licensee + + - name: Check license file for ${{ matrix.check-license.path }} + run: | + EXIT_STATUS=0 + + # Go into folder path + cd ./${{ matrix.check-license.path }} + + # See: https://github.com/licensee/licensee + LICENSEE_OUTPUT="$(licensee detect --json --confidence=100)" + + DETECTED_LICENSE_FILE="$(echo "$LICENSEE_OUTPUT" | jq .matched_files[0].filename | tr --delete '\r')" + echo "Detected license file: $DETECTED_LICENSE_FILE" + if [ "$DETECTED_LICENSE_FILE" != "\"${{ matrix.check-license.expected-filename }}\"" ]; then + echo "::error file=${DETECTED_LICENSE_FILE}::detected license file $DETECTED_LICENSE_FILE doesn't match expected: ${{ matrix.check-license.expected-filename }}" + EXIT_STATUS=1 + fi + + DETECTED_LICENSE_TYPE="$(echo "$LICENSEE_OUTPUT" | jq .matched_files[0].matched_license | tr --delete '\r')" + echo "Detected license type: $DETECTED_LICENSE_TYPE" + if [ "$DETECTED_LICENSE_TYPE" != "\"${{ matrix.check-license.expected-type }}\"" ]; then + echo "::error file=${DETECTED_LICENSE_FILE}::detected license type $DETECTED_LICENSE_TYPE doesn't match expected \"${{ matrix.check-license.expected-type }}\"" + EXIT_STATUS=1 + fi + + exit $EXIT_STATUS diff --git a/.github/workflows/check-markdown-task.yml b/.github/workflows/check-markdown-task.yml new file mode 100644 index 00000000..01461764 --- /dev/null +++ b/.github/workflows/check-markdown-task.yml @@ -0,0 +1,115 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-markdown-task.md +name: Check Markdown + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-markdown-task.ya?ml" + - ".markdown-link-check.json" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + - "**/.markdownlint*" + - "**.mdx?" + - "**.mkdn" + - "**.mdown" + - "**.markdown" + pull_request: + paths: + - ".github/workflows/check-markdown-task.ya?ml" + - ".markdown-link-check.json" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + - "**/.markdownlint*" + - "**.mdx?" + - "**.mkdn" + - "**.mdown" + - "**.markdown" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage caused by external changes. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + lint: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Initialize markdownlint-cli problem matcher + uses: xt0rted/markdownlint-problem-matcher@v3 + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Lint + run: task markdown:lint + + links: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Check links + run: task --silent markdown:check-links diff --git a/.github/workflows/check-npm-task.yml b/.github/workflows/check-npm-task.yml new file mode 100644 index 00000000..00557876 --- /dev/null +++ b/.github/workflows/check-npm-task.yml @@ -0,0 +1,117 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-npm-task.md +name: Check npm + +# See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-npm-task.ya?ml" + - "**/.npmrc" + - "**/package.json" + - "**/package-lock.json" + - "Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/check-npm-task.ya?ml" + - "**/.npmrc" + - "**/package.json" + - "**/package-lock.json" + - "Taskfile.ya?ml" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + validate: + name: validate (${{ matrix.project.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + matrix: + project: + - path: . + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Validate package.json + run: task --silent npm:validate PROJECT_PATH="${{ matrix.project.path }}" + + check-sync: + name: check-sync (${{ matrix.project.path }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + matrix: + project: + - path: . + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Install npm dependencies + run: task npm:install-deps PROJECT_PATH="${{ matrix.project.path }}" + + - name: Check package-lock.json + run: git diff --color --exit-code "${{ matrix.project.path }}/package-lock.json" diff --git a/.github/workflows/check-poetry-task.yml b/.github/workflows/check-poetry-task.yml new file mode 100644 index 00000000..073fcc3f --- /dev/null +++ b/.github/workflows/check-poetry-task.yml @@ -0,0 +1,109 @@ +name: Check Poetry + +on: + create: + push: + paths: + - ".github/workflows/check-poetry-task.ya?ml" + - "**/poetry.lock" + - "**/pyproject.toml" + - "Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/check-poetry-task.ya?ml" + - "**/poetry.lock" + - "**/pyproject.toml" + - "Taskfile.ya?ml" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 11 * * THU" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + validate: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version-file: pyproject.toml + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Validate pyproject.toml + run: | + task \ + --silent \ + poetry:validate + + check-sync: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version-file: pyproject.toml + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Sync lockfile + run: | + task \ + --silent \ + poetry:sync + + - name: Check if lockfile was out of sync + run: | + git diff \ + --color \ + --exit-code \ + poetry.lock diff --git a/.github/workflows/check-prettier-formatting-task.yml b/.github/workflows/check-prettier-formatting-task.yml new file mode 100644 index 00000000..d80ad57f --- /dev/null +++ b/.github/workflows/check-prettier-formatting-task.yml @@ -0,0 +1,258 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-prettier-formatting-task.md +name: Check Prettier Formatting + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-prettier-formatting-task.ya?ml" + - ".npmrc" + - "Taskfile.ya?ml" + - "**/.prettierignore" + - "**/.prettierrc*" + # CSS + - "**.css" + - "**.wxss" + # PostCSS + - "**.pcss" + - "**.postcss" + # Less + - "**.less" + # SCSS + - "**.scss" + # GraphQL + - "**.graphqls?" + - "**.gql" + # handlebars + - "**.handlebars" + - "**.hbs" + # HTML + - "**.mjml" + - "**.html?" + - "**.html.hl" + - "**.st" + - "**.xht" + - "**.xhtml" + # Vue + - "**.vue" + # JavaScript + - "**.flow" + - "**._?jsb?" + - "**.bones" + - "**.cjs" + - "**.es6?" + - "**.frag" + - "**.gs" + - "**.jake" + - "**.jscad" + - "**.jsfl" + - "**.js[ms]" + - "**.[mn]js" + - "**.pac" + - "**.wxs" + - "**.[xs]s?js" + - "**.xsjslib" + # JSX + - "**.jsx" + # TypeScript + - "**.ts" + # TSX + - "**.tsx" + # JSON + - "**/.eslintrc" + - "**.json" + - "**.avsc" + - "**.geojson" + - "**.gltf" + - "**.har" + - "**.ice" + - "**.JSON-tmLanguage" + - "**.mcmeta" + - "**.tfstate" + - "**.topojson" + - "**.webapp" + - "**.webmanifest" + - "**.yyp?" + # JSONC + - "**/.babelrc" + - "**/.jscsrc" + - "**/.js[hl]intrc" + - "**.jsonc" + - "**.sublime-*" + # JSON5 + - "**.json5" + # Markdown + - "**.mdx?" + - "**.markdown" + - "**.mk?down" + - "**.mdwn" + - "**.mkdn?" + - "**.ronn" + - "**.workbook" + # YAML + - "**/.clang-format" + - "**/.clang-tidy" + - "**/.gemrc" + - "**/glide.lock" + - "**.ya?ml*" + - "**.mir" + - "**.reek" + - "**.rviz" + - "**.sublime-syntax" + - "**.syntax" + pull_request: + paths: + - ".github/workflows/check-prettier-formatting-task.ya?ml" + - ".npmrc" + - "Taskfile.ya?ml" + - "**/.prettierignore" + - "**/.prettierrc*" + # CSS + - "**.css" + - "**.wxss" + # PostCSS + - "**.pcss" + - "**.postcss" + # Less + - "**.less" + # SCSS + - "**.scss" + # GraphQL + - "**.graphqls?" + - "**.gql" + # handlebars + - "**.handlebars" + - "**.hbs" + # HTML + - "**.mjml" + - "**.html?" + - "**.html.hl" + - "**.st" + - "**.xht" + - "**.xhtml" + # Vue + - "**.vue" + # JavaScript + - "**.flow" + - "**._?jsb?" + - "**.bones" + - "**.cjs" + - "**.es6?" + - "**.frag" + - "**.gs" + - "**.jake" + - "**.jscad" + - "**.jsfl" + - "**.js[ms]" + - "**.[mn]js" + - "**.pac" + - "**.wxs" + - "**.[xs]s?js" + - "**.xsjslib" + # JSX + - "**.jsx" + # TypeScript + - "**.ts" + # TSX + - "**.tsx" + # JSON + - "**/.eslintrc" + - "**.json" + - "**.avsc" + - "**.geojson" + - "**.gltf" + - "**.har" + - "**.ice" + - "**.JSON-tmLanguage" + - "**.mcmeta" + - "**.tfstate" + - "**.topojson" + - "**.webapp" + - "**.webmanifest" + - "**.yyp?" + # JSONC + - "**/.babelrc" + - "**/.jscsrc" + - "**/.js[hl]intrc" + - "**.jsonc" + - "**.sublime-*" + # JSON5 + - "**.json5" + # Markdown + - "**.mdx?" + - "**.markdown" + - "**.mk?down" + - "**.mdwn" + - "**.mkdn?" + - "**.ronn" + - "**.workbook" + # YAML + - "**/.clang-format" + - "**/.clang-tidy" + - "**/.gemrc" + - "**/glide.lock" + - "**.ya?ml*" + - "**.mir" + - "**.reek" + - "**.rviz" + - "**.sublime-syntax" + - "**.syntax" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 4 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Format with Prettier + run: task general:format-prettier + + - name: Check formatting + run: git diff --color --exit-code diff --git a/.github/workflows/check-python-task.yml b/.github/workflows/check-python-task.yml new file mode 100644 index 00000000..ff9f8730 --- /dev/null +++ b/.github/workflows/check-python-task.yml @@ -0,0 +1,112 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-python-task.md +name: Check Python + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-python-task.ya?ml" + - "**/.flake8" + - "**/poetry.lock" + - "**/pyproject.toml" + - "**/setup.cfg" + - "Taskfile.ya?ml" + - "**/tox.ini" + - "**.py" + pull_request: + paths: + - ".github/workflows/check-python-task.ya?ml" + - "**/.flake8" + - "**/poetry.lock" + - "**/pyproject.toml" + - "**/setup.cfg" + - "Taskfile.ya?ml" + - "**/tox.ini" + - "**.py" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 8 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + lint: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version-file: pyproject.toml + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Run flake8 + uses: liskin/gh-problem-matcher-wrap@v3 + with: + linters: flake8 + run: task python:lint + + formatting: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version-file: pyproject.toml + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Format Python code + run: task python:format + + - name: Check formatting + run: git diff --color --exit-code diff --git a/.github/workflows/check-taskfiles.yml b/.github/workflows/check-taskfiles.yml new file mode 100644 index 00000000..f2ac4770 --- /dev/null +++ b/.github/workflows/check-taskfiles.yml @@ -0,0 +1,98 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-taskfiles.md +name: Check Taskfiles + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-taskfiles.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "**/Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/check-taskfiles.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "**/Taskfile.ya?ml" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + validate: + name: Validate ${{ matrix.file }} + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + + matrix: + file: + - ./**/Taskfile.yml + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Download JSON schema for Taskfiles + id: download-schema + uses: carlosperate/download-file-action@v2 + with: + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/taskfile.json + file-url: https://taskfile.dev/schema.json + location: ${{ runner.temp }}/taskfile-schema + + - name: Install JSON schema validator + run: npm install + + - name: Validate ${{ matrix.file }} + run: | + # See: https://github.com/ajv-validator/ajv-cli#readme + npx \ + --package=ajv-cli \ + --package=ajv-formats \ + ajv validate \ + --all-errors \ + --strict=false \ + -c ajv-formats \ + -s "${{ steps.download-schema.outputs.file-path }}" \ + -d "${{ matrix.file }}" diff --git a/.github/workflows/check-toc-task.yml b/.github/workflows/check-toc-task.yml new file mode 100644 index 00000000..5331a181 --- /dev/null +++ b/.github/workflows/check-toc-task.yml @@ -0,0 +1,91 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-toc-task.md +name: Check ToC + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/check-toc-task.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "README.md" + pull_request: + paths: + - ".github/workflows/check-toc-task.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "README.md" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 3 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + name: ${{ matrix.file.name }} + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + + matrix: + file: + - name: README.md + # Max ToC depth, for use with the markdown-toc --maxdepth flag. + maxdepth: 5 + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Rebuild ToC + run: | + task markdown:toc \ + FILE_PATH="${{ github.workspace }}/${{ matrix.file.name }}" \ + MAX_DEPTH=${{ matrix.file.maxdepth }} + + - name: Check ToC + run: git diff --color --exit-code diff --git a/.github/workflows/check-workflows-task.yml b/.github/workflows/check-workflows-task.yml new file mode 100644 index 00000000..ec8dccec --- /dev/null +++ b/.github/workflows/check-workflows-task.yml @@ -0,0 +1,48 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-workflows-task.md +name: Check Workflows + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + push: + paths: + - ".github/workflows/*.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + pull_request: + paths: + - ".github/workflows/*.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + - "Taskfile.ya?ml" + schedule: + # Run every Tuesday at 8 AM UTC to catch breakage resulting from changes to the JSON schema. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + validate: + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Validate workflows + run: task --silent ci:validate diff --git a/.github/workflows/check-yaml-task.yml b/.github/workflows/check-yaml-task.yml new file mode 100644 index 00000000..3cdb51a8 --- /dev/null +++ b/.github/workflows/check-yaml-task.yml @@ -0,0 +1,110 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/check-yaml-task.md +name: Check YAML + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".yamllint*" + - "poetry.lock" + - "pyproject.toml" + # Source: https://github.com/ikatyang/linguist-languages/blob/master/data/YAML.json (used by Prettier) + - "**/.clang-format" + - "**/.clang-tidy" + - "**/.gemrc" + - "**/glide.lock" + - "**.ya?ml*" + - "**.mir" + - "**.reek" + - "**.rviz" + - "**.sublime-syntax" + - "**.syntax" + pull_request: + paths: + - ".yamllint*" + - "poetry.lock" + - "pyproject.toml" + # Source: https://github.com/ikatyang/linguist-languages/blob/master/data/YAML.json (used by Prettier) + - "**/.clang-format" + - "**/.clang-tidy" + - "**/.gemrc" + - "**/glide.lock" + - "**.ya?ml*" + - "**.mir" + - "**.reek" + - "**.rviz" + - "**.sublime-syntax" + - "**.syntax" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 9 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + check: + name: ${{ matrix.configuration.name }} + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + strategy: + fail-fast: false + + matrix: + configuration: + - name: Generate problem matcher output + # yamllint's "github" output type produces annotated diffs, but is not useful to humans reading the log. + format: github + # The other matrix job is used to set the result, so this job is configured to always pass. + continue-on-error: true + - name: Check formatting + # yamllint's "colored" output type is most suitable for humans reading the log. + format: colored + continue-on-error: false + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version-file: pyproject.toml + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Check YAML + continue-on-error: ${{ matrix.configuration.continue-on-error }} + run: task yaml:lint YAMLLINT_FORMAT=${{ matrix.configuration.format }} diff --git a/.github/workflows/lint-python.yml b/.github/workflows/lint-python.yml deleted file mode 100644 index 1791f5af..00000000 --- a/.github/workflows/lint-python.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Lint Python code - -on: - pull_request: - paths: - - '.github/workflows/lint-python.yml' - - 'compilesketches/**.py' - - push: - paths: - - '.github/workflows/lint-python.yml' - - 'compilesketches/**.py' - - # Scheduled trigger checks for workflow failures resulting from updates to the linting tools - schedule: - # run every Tuesday at 3 AM UTC - - cron: "0 3 * * 2" - - # workflow_dispatch event allows the workflow to be triggered manually - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch - workflow_dispatch: - - # repository_dispatch event allows the workflow to be triggered via the GitHub API - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#repository_dispatch - repository_dispatch: - -jobs: - lint: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Run the set up script - id: setup - run: | - "${{ github.workspace }}/action-setup.sh" - - - name: Install flake8 - run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - "${{ steps.setup.outputs.python-command }}" \ - -m \ - pip install \ - flake8 \ - pep8-naming - - - name: Lint with flake8 - env: - PYTHON_PROJECT_PATH: ${GITHUB_WORKSPACE}/compilesketches - run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - flake8 --config "${{ env.PYTHON_PROJECT_PATH }}/.flake8" --show-source "${{ env.PYTHON_PROJECT_PATH }}" diff --git a/.github/workflows/lint-shell.yml b/.github/workflows/lint-shell.yml deleted file mode 100644 index d0a6c283..00000000 --- a/.github/workflows/lint-shell.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Lint shell scripts - -on: - push: - paths: - - '.github/workflows/lint-shell.yml' - - '**.sh' - pull_request: - paths: - - '.github/workflows/lint-shell.yml' - - '**.sh' - -jobs: - lint: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - # Recursively lint all shell scripts in the repository - # See: https://github.com/azohra/shell-linter/blob/latest/README.md - - name: ShellCheck - uses: azohra/shell-linter@latest diff --git a/.github/workflows/spell-check-task.yml b/.github/workflows/spell-check-task.yml new file mode 100644 index 00000000..2f4d8485 --- /dev/null +++ b/.github/workflows/spell-check-task.yml @@ -0,0 +1,63 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/spell-check-task.md +name: Spell Check + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + pull_request: + schedule: + # Run every Tuesday at 8 AM UTC to catch new misspelling detections resulting from dictionary updates. + - cron: "0 8 * * TUE" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + permissions: {} + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + spellcheck: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version-file: pyproject.toml + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Spell check + run: task general:check-spelling diff --git a/.github/workflows/spell-check.yml b/.github/workflows/spell-check.yml deleted file mode 100644 index 2f9fba74..00000000 --- a/.github/workflows/spell-check.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Spell Check - -on: [push, pull_request] - -jobs: - spellcheck: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Spell check - uses: arduino/actions/libraries/spell-check@master - with: - ignore-words-list: etc/codespell-ignore-words-list.txt diff --git a/.github/workflows/sync-labels-npm.yml b/.github/workflows/sync-labels-npm.yml new file mode 100644 index 00000000..568728af --- /dev/null +++ b/.github/workflows/sync-labels-npm.yml @@ -0,0 +1,162 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/sync-labels-npm.md +name: Sync Labels + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + push: + paths: + - ".github/workflows/sync-labels-npm.ya?ml" + - ".github/label-configuration-files/*.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + pull_request: + paths: + - ".github/workflows/sync-labels-npm.ya?ml" + - ".github/label-configuration-files/*.ya?ml" + - ".npmrc" + - "package.json" + - "package-lock.json" + schedule: + # Run daily at 8 AM UTC to sync with changes to shared label configurations. + - cron: "0 8 * * *" + workflow_dispatch: + repository_dispatch: + +env: + CONFIGURATIONS_FOLDER: .github/label-configuration-files + CONFIGURATIONS_ARTIFACT_PREFIX: label-configuration-file- + +jobs: + check: + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Download JSON schema for labels configuration file + id: download-schema + uses: carlosperate/download-file-action@v2 + with: + file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/arduino-tooling-gh-label-configuration-schema.json + location: ${{ runner.temp }}/label-configuration-schema + + - name: Install JSON schema validator + run: npm install + + - name: Validate local labels configuration + run: | + # See: https://github.com/ajv-validator/ajv-cli#readme + npx \ + --package=ajv-cli \ + --package=ajv-formats \ + ajv validate \ + --all-errors \ + -c ajv-formats \ + -s "${{ steps.download-schema.outputs.file-path }}" \ + -d "${{ env.CONFIGURATIONS_FOLDER }}/*.{yml,yaml}" + + download: + needs: check + runs-on: ubuntu-latest + permissions: {} + + strategy: + matrix: + filename: + # Filenames of the shared configurations to apply to the repository in addition to the local configuration. + # https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/sync-labels + - universal.yml + - tooling.yml + + steps: + - name: Download + uses: carlosperate/download-file-action@v2 + with: + file-url: https://raw.githubusercontent.com/arduino/tooling-project-assets/main/workflow-templates/assets/sync-labels/${{ matrix.filename }} + + - name: Pass configuration files to next job via workflow artifact + uses: actions/upload-artifact@v5 + with: + path: | + *.yaml + *.yml + if-no-files-found: error + name: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}${{ matrix.filename }} + + sync: + needs: download + runs-on: ubuntu-latest + permissions: + contents: read + issues: write + + steps: + - name: Set environment variables + run: | + # See: https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#setting-an-environment-variable + echo "MERGED_CONFIGURATION_PATH=${{ runner.temp }}/labels.yml" >> "$GITHUB_ENV" + + - name: Determine whether to dry run + id: dry-run + if: > + github.event_name == 'pull_request' || + ( + ( + github.event_name == 'push' || + github.event_name == 'workflow_dispatch' + ) && + github.ref != format('refs/heads/{0}', github.event.repository.default_branch) + ) + run: | + # Use of this flag in the github-label-sync command will cause it to only check the validity of the + # configuration. + echo "flag=--dry-run" >> $GITHUB_OUTPUT + + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Download configuration file artifacts + uses: actions/download-artifact@v6 + with: + merge-multiple: true + pattern: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}* + path: ${{ env.CONFIGURATIONS_FOLDER }} + + - name: Remove unneeded artifacts + uses: geekyeggo/delete-artifact@v5 + with: + name: ${{ env.CONFIGURATIONS_ARTIFACT_PREFIX }}* + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version-file: package.json + + - name: Merge label configuration files + run: | + # Merge all configuration files + shopt -s extglob + cat "${{ env.CONFIGURATIONS_FOLDER }}"/*.@(yml|yaml) > "${{ env.MERGED_CONFIGURATION_PATH }}" + + - name: Install github-label-sync + run: npm install + + - name: Sync labels + env: + GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # See: https://github.com/Financial-Times/github-label-sync + npx \ + github-label-sync \ + --labels "${{ env.MERGED_CONFIGURATION_PATH }}" \ + ${{ steps.dry-run.outputs.flag }} \ + ${{ github.repository }} diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml index 82fc8b28..bd72136a 100644 --- a/.github/workflows/test-integration.yml +++ b/.github/workflows/test-integration.yml @@ -1,40 +1,78 @@ name: Run integration tests on: + create: + pull_request: paths: - - '.github/workflows/test-integration.yml' - - '.github/workflows/testdata/**' - - 'action.yml' - - 'action-setup.sh' - - 'compilesketches/**' + - ".github/workflows/test-integration.yml" + - ".github/workflows/testdata/**" + - "poetry.lock" + - "pyproject.toml" + - "action.yml" + - "compilesketches/**" push: paths: - - '.github/workflows/test-integration.yml' - - '.github/workflows/testdata/**' - - 'action.yml' - - 'action-setup.sh' - - 'compilesketches/**' + - ".github/workflows/test-integration.yml" + - ".github/workflows/testdata/**" + - "poetry.lock" + - "pyproject.toml" + - "action.yml" + - "compilesketches/**" + + repository_dispatch: + + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 12 * * THU" + + workflow_dispatch: env: SKETCHES_REPORTS_PATH: sketches-reports + TESTDATA_PLATFORMS_PATH: .github/workflows/testdata/platforms TESTDATA_SKETCHES_PATH: .github/workflows/testdata/sketches - TESTDATA_REPORTS_PATH: .github/workflows/testdata/reports + TESTDATA_REPORTS_PATH: .github/workflows/testdata/reports jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + default-inputs: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest steps: - name: Checkout Servo library - uses: actions/checkout@v2 + uses: actions/checkout@v5 with: repository: arduino-libraries/servo ref: 1.1.7 - name: Checkout local repo - uses: actions/checkout@v2 + uses: actions/checkout@v5 with: # Must be checked out to a subfolder to not interfere with the checked out library under test path: extras/compile-sketches @@ -43,8 +81,9 @@ jobs: # Use action from local path uses: ./extras/compile-sketches - all-inputs: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest strategy: @@ -53,6 +92,7 @@ jobs: matrix: board: - fqbn: arduino:avr:uno + artifact-name-suffix: arduino-avr-uno platforms: | - name: arduino:avr version: 1.8.3 @@ -61,6 +101,7 @@ jobs: version: 1.1.7 # Board that requires Boards Manager URL - fqbn: esp8266:esp8266:huzzah + artifact-name-suffix: esp8266-esp8266-huzzah platforms: | - name: esp8266:esp8266 source-url: https://arduino.esp8266.com/stable/package_esp8266com_index.json @@ -68,17 +109,18 @@ jobs: libraries: | # The official Servo library is not compatible with ESP8266, but that platform has a bundled Servo lib # so there are no library dependencies - - + [] steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v5 - name: Run action # Use action from local path uses: ./ with: cli-version: 0.15.1 + github-token: ${{ secrets.GITHUB_TOKEN }} platforms: ${{ matrix.board.platforms }} fqbn: ${{ matrix.board.fqbn }} libraries: ${{ matrix.board.libraries }} @@ -100,34 +142,191 @@ jobs: [ -d ${{ env.TESTDATA_SKETCHES_PATH }}/BareMinimum/build ] - name: Set report artifact name - id: report-artifact-name + id: report-artifact-prefix run: | - echo "::set-output name=report-artifact-name::${{ github.job }}" + echo "report-artifact-prefix=${{ github.job }}" >> "$GITHUB_OUTPUT" - name: Save sketches report as workflow artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v5 with: path: sketches-reports - name: ${{ steps.report-artifact-name.outputs.report-artifact-name }} + name: ${{ steps.report-artifact-prefix.outputs.report-artifact-prefix }}-${{ matrix.board.artifact-name-suffix }} outputs: - report-artifact-name: ${{ steps.report-artifact-name.outputs.report-artifact-name }} + report-artifact-prefix: ${{ steps.report-artifact-prefix.outputs.report-artifact-prefix }} + + multiple-steps: + name: multiple-steps (${{ matrix.board.source-type }}) + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + strategy: + fail-fast: false + + matrix: + board: + - source-type: manager + fqbn: arduino:avr:uno + platforms: | + - name: arduino:avr + version: 1.8.3 + libraries: | + - name: Servo + version: 1.1.7 + - source-type: path + fqbn: arduino:avr:uno + platforms: | + - name: arduino:avr + version: 1.8.3 + - source-path: extras/ArduinoCore-avr + name: arduino:avr + libraries: | + - source-path: ./ + name: Servo + - source-type: repo + fqbn: arduino:avr:uno + platforms: | + - name: arduino:avr + version: 1.8.3 + - source-url: https://github.com/arduino/ArduinoCore-avr.git + name: arduino:avr + version: 1.8.3 + libraries: | + - source-url: https://github.com/arduino-libraries/Servo.git + name: Servo + version: 1.1.7 + - source-type: archive + fqbn: arduino:avr:uno + platforms: | + - name: arduino:avr + version: 1.8.3 + - source-url: https://github.com/arduino/ArduinoCore-avr/archive/refs/tags/1.8.3.zip + name: arduino:avr + libraries: | + - source-url: https://github.com/arduino-libraries/Servo/archive/refs/tags/1.1.7.zip + name: Servo + + steps: + - name: Checkout library + uses: actions/checkout@v5 + with: + repository: arduino-libraries/Servo + ref: 1.1.7 + + - name: Checkout platform + if: matrix.board.source-type == 'path' + uses: actions/checkout@v5 + with: + repository: arduino/ArduinoCore-avr + ref: 1.8.3 + path: extras/ArduinoCore-avr + + - name: Checkout local repo + uses: actions/checkout@v5 + with: + path: extras/compile-sketches + + - name: Run action + # Use action from local path + uses: ./extras/compile-sketches + with: + platforms: ${{ matrix.board.platforms }} + fqbn: ${{ matrix.board.fqbn }} + libraries: ${{ matrix.board.libraries }} + sketch-paths: | + - examples/Sweep + + - name: Run action again + uses: ./extras/compile-sketches + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + platforms: ${{ matrix.board.platforms }} + fqbn: ${{ matrix.board.fqbn }} + libraries: ${{ matrix.board.libraries }} + sketch-paths: | + - examples/Sweep + + python-package-dependency: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout local repo + uses: actions/checkout@v5 + - name: Install Python package dependency + run: | + pip install \ + --ignore-installed \ + --user \ + cowsay + + - name: Run action with board that has external Python package dependency + # Use action from local path + uses: ./ + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + platforms: | + - name: arduino:avr + - source-path: ${{ env.TESTDATA_PLATFORMS_PATH }}/PythonPackageDependent + name: PythonPackageDependent:avr + fqbn: PythonPackageDependent:avr:package_dependent + libraries: | + [] + sketch-paths: | + - ${{ env.TESTDATA_SKETCHES_PATH }}/BareMinimum + + # Targeted testing for ESP32 boards platform support. + pyserial-dependency: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout local repo + uses: actions/checkout@v5 + + - name: Install pyserial + run: | + # Use of pip3 and omission of recommended flags done to reproduce established use pattern: + # https://github.com/arduino-libraries/ArduinoIoTCloud/blob/1.11.0/.github/workflows/compile-examples.yml#L206 + pip3 install pyserial + + - name: Run action with board that has pyserial dependency + # Use action from local path + uses: ./ + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + platforms: | + - name: arduino:avr + - source-path: ${{ env.TESTDATA_PLATFORMS_PATH }}/PyserialDependent + name: PyserialDependent:avr + fqbn: PyserialDependent:avr:pyserial_dependent + libraries: | + [] + sketch-paths: | + - ${{ env.TESTDATA_SKETCHES_PATH }}/BareMinimum check-sketches-reports: - needs: all-inputs + needs: + - run-determination + - all-inputs + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest steps: # Checkout is needed to get the golden reports - name: Checkout local repo - uses: actions/checkout@v2 + uses: actions/checkout@v5 - name: Download sketches reports artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v6 with: - name: ${{ needs.all-inputs.outputs.report-artifact-name }} + merge-multiple: true path: ${{ env.SKETCHES_REPORTS_PATH }} + pattern: ${{ needs.all-inputs.outputs.report-artifact-prefix }}* - name: Compare generated sketches report to golden report run: | @@ -148,8 +347,12 @@ jobs: jq \ --null-input \ --exit-status \ - --slurpfile generated "$reportPath" \ - --slurpfile golden "${{ env.TESTDATA_REPORTS_PATH }}/${{ needs.all-inputs.outputs.report-artifact-name }}/$(basename "$reportPath")" \ + --slurpfile \ + generated \ + "$reportPath" \ + --slurpfile \ + golden \ + "${{ env.TESTDATA_REPORTS_PATH }}/${{ needs.all-inputs.outputs.report-artifact-prefix }}/$(basename "$reportPath")" \ '($generated|.[0].boards) == ($golden|.[0].boards)' ) && ( # Check the commit_hash value @@ -177,13 +380,14 @@ jobs: exit $EXIT_STATUS - expected-failed-compilation: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' runs-on: ubuntu-latest steps: - name: Checkout local repo - uses: actions/checkout@v2 + uses: actions/checkout@v5 - name: Compile sketch that is expected to error id: compile-sketches @@ -191,8 +395,9 @@ jobs: uses: ./ with: fqbn: arduino:avr:uno + github-token: ${{ secrets.GITHUB_TOKEN }} libraries: | - - + [] sketch-paths: | - ${{ env.TESTDATA_SKETCHES_PATH }}/Error diff --git a/.github/workflows/test-python-poetry-task.yml b/.github/workflows/test-python-poetry-task.yml new file mode 100644 index 00000000..a9d42ca6 --- /dev/null +++ b/.github/workflows/test-python-poetry-task.yml @@ -0,0 +1,112 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/test-python-poetry-task.md +name: Test Python + +# See: https://docs.github.com/actions/using-workflows/events-that-trigger-workflows +on: + create: + push: + paths: + - ".github/workflows/test-python-poetry-task.ya?ml" + - ".github/.?codecov.ya?ml" + - "dev/.?codecov.ya?ml" + - ".?codecov.ya?ml" + - "Taskfile.ya?ml" + - "poetry.lock" + - "pyproject.toml" + - "compilesketches/tests/**" + - "**.py" + - "**/pytest.ini" + pull_request: + paths: + - ".github/workflows/test-python-poetry-task.ya?ml" + - ".github/.?codecov.ya?ml" + - "dev/.?codecov.ya?ml" + - ".?codecov.ya?ml" + - "Taskfile.ya?ml" + - "poetry.lock" + - "pyproject.toml" + - "compilesketches/tests/**" + - "**.py" + - "**/pytest.ini" + schedule: + # Run periodically to catch breakage caused by external changes. + - cron: "0 12 * * WED" + workflow_dispatch: + repository_dispatch: + +jobs: + run-determination: + runs-on: ubuntu-latest + outputs: + result: ${{ steps.determination.outputs.result }} + permissions: {} + steps: + - name: Determine if the rest of the workflow should run + id: determination + run: | + RELEASE_BRANCH_REGEX="^refs/heads/v[0-9]+$" + # The `create` event trigger doesn't support `branches` filters, so it's necessary to use Bash instead. + if [[ + "${{ github.event_name }}" != "create" || + "${{ github.ref }}" =~ $RELEASE_BRANCH_REGEX + ]]; then + # Run the other jobs. + RESULT="true" + else + # There is no need to run the other jobs. + RESULT="false" + fi + + echo "result=$RESULT" >> $GITHUB_OUTPUT + + test: + needs: run-determination + if: needs.run-determination.outputs.result == 'true' + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version-file: pyproject.toml + + - name: Install Task + uses: arduino/setup-task@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + version: 3.x + + - name: Run tests + uses: liskin/gh-problem-matcher-wrap@v3 + with: + linters: pytest + run: task python:test + + - name: Display code coverage report + run: task python:coverage-report + + # A token is used to avoid intermittent spurious job failures caused by rate limiting. + - name: Set up Codecov upload token + run: | + if [[ "${{ github.repository }}" == "arduino/compile-sketches" ]]; then + # In order to avoid uploads of data from forks, only use the token for runs in the parent repo. + # Token is intentionally exposed. + # See: https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954 + CODECOV_TOKEN="0c2a8127-e253-4812-8b83-6dcc586c2bf7" + else + # codecov/codecov-action does unauthenticated upload if empty string is passed via the `token` input. + CODECOV_TOKEN="" + fi + echo "CODECOV_TOKEN=$CODECOV_TOKEN" >> "$GITHUB_ENV" + + - name: Upload coverage report to Codecov + uses: codecov/codecov-action@v3 + with: + fail_ci_if_error: true + file: coverage.xml + token: ${{ env.CODECOV_TOKEN }} diff --git a/.github/workflows/test-python.yml b/.github/workflows/test-python.yml deleted file mode 100644 index 22895e0f..00000000 --- a/.github/workflows/test-python.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: Test Python code - -on: - pull_request: - paths: - - '.github/workflows/test-python.yml' - - 'action-setup.sh' - - 'compilesketches/**' - - push: - paths: - - '.github/workflows/test-python.yml' - - 'action-setup.sh' - - 'compilesketches/**' - - # Catch issues resulting from new patch releases of Python in the APT repository - schedule: - # run every Tuesday at 3 AM UTC - - cron: "0 3 * * 2" - - # workflow_dispatch event allows the workflow to be triggered manually - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch - workflow_dispatch: - - # repository_dispatch event allows the workflow to be triggered via the GitHub API - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#repository_dispatch - repository_dispatch: - -jobs: - test: - runs-on: ubuntu-latest - - env: - PYTHON_PROJECT_PATH: ${GITHUB_WORKSPACE}/compilesketches - PYTHON_PROJECT_TESTS_PATH: ${GITHUB_WORKSPACE}/compilesketches/tests - COVERAGE_DATA_FILENAME: coverage.xml - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Run the set up script - id: setup - run: | - "${{ github.workspace }}/action-setup.sh" - - - name: Install test dependencies - run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - "${{ steps.setup.outputs.python-command }}" \ - -m \ - pip install \ - --requirement "${{ env.PYTHON_PROJECT_TESTS_PATH }}/requirements.txt" - - - name: Run Python unit tests and record code coverage data - run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - export PYTHONPATH="${{ env.PYTHON_PROJECT_PATH }}" - "${{ steps.setup.outputs.python-command }}" \ - -m \ - coverage run \ - --rcfile="${{ env.PYTHON_PROJECT_TESTS_PATH }}/.coveragerc" \ - --source="${{ env.PYTHON_PROJECT_PATH }}" \ - --module \ - pytest "${{ env.PYTHON_PROJECT_TESTS_PATH }}" - # Generate coverage data file for consumption by `codecov/codecov-action`. - # Otherwise that action generates the file using the system Python environment, which doesn't work. - "${{ steps.setup.outputs.python-command }}" \ - -m \ - coverage xml \ - -o "${{ github.workspace }}/${{ env.COVERAGE_DATA_FILENAME }}" - - - name: Display code coverage report - run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - "${{ steps.setup.outputs.python-command }}" \ - -m \ - coverage report - - - name: Upload coverage report to Codecov - uses: codecov/codecov-action@v1 - with: - file: ${{ env.COVERAGE_DATA_FILENAME }} - fail_ci_if_error: true diff --git a/.github/workflows/testdata/platforms/PyserialDependent/boards.txt b/.github/workflows/testdata/platforms/PyserialDependent/boards.txt new file mode 100644 index 00000000..ba4d86b8 --- /dev/null +++ b/.github/workflows/testdata/platforms/PyserialDependent/boards.txt @@ -0,0 +1,8 @@ +pyserial_dependent.name=pyserial Dependent Board +pyserial_dependent.upload.maximum_size=32256 +pyserial_dependent.upload.maximum_data_size=2048 +pyserial_dependent.build.mcu=atmega328p +pyserial_dependent.build.f_cpu=16000000L +pyserial_dependent.build.board=FOO +pyserial_dependent.build.core=arduino:arduino +pyserial_dependent.build.variant=arduino:standard diff --git a/.github/workflows/testdata/platforms/PyserialDependent/platform.txt b/.github/workflows/testdata/platforms/PyserialDependent/platform.txt new file mode 100644 index 00000000..11879ca2 --- /dev/null +++ b/.github/workflows/testdata/platforms/PyserialDependent/platform.txt @@ -0,0 +1,5 @@ +name=pyserial Dependent Platform +version=0.0.0 +# python3 is used to parallel ESP32 platform configuration: +# https://github.com/espressif/arduino-esp32/blob/2.0.7/platform.txt#L220 +recipe.hooks.prebuild.1.pattern=python3 -c 'import serial' diff --git a/.github/workflows/testdata/platforms/PythonPackageDependent/boards.txt b/.github/workflows/testdata/platforms/PythonPackageDependent/boards.txt new file mode 100644 index 00000000..41554a0a --- /dev/null +++ b/.github/workflows/testdata/platforms/PythonPackageDependent/boards.txt @@ -0,0 +1,8 @@ +package_dependent.name=External Python Package Dependent Board +package_dependent.upload.maximum_size=32256 +package_dependent.upload.maximum_data_size=2048 +package_dependent.build.mcu=atmega328p +package_dependent.build.f_cpu=16000000L +package_dependent.build.board=FOO +package_dependent.build.core=arduino:arduino +package_dependent.build.variant=arduino:standard diff --git a/.github/workflows/testdata/platforms/PythonPackageDependent/dependent.py b/.github/workflows/testdata/platforms/PythonPackageDependent/dependent.py new file mode 100644 index 00000000..b372e828 --- /dev/null +++ b/.github/workflows/testdata/platforms/PythonPackageDependent/dependent.py @@ -0,0 +1,2 @@ +# Import external package to verify Python package dependencies can be installed by user into runner environment. +import cowsay # noqa: F401 diff --git a/.github/workflows/testdata/platforms/PythonPackageDependent/platform.txt b/.github/workflows/testdata/platforms/PythonPackageDependent/platform.txt new file mode 100644 index 00000000..ada9a867 --- /dev/null +++ b/.github/workflows/testdata/platforms/PythonPackageDependent/platform.txt @@ -0,0 +1,3 @@ +name=External Python Package Dependent Platform +version=0.0.0 +recipe.hooks.prebuild.1.pattern=python "{runtime.platform.path}/dependent.py" diff --git a/.github/workflows/testdata/reports/all-inputs/arduino-avr-uno.json b/.github/workflows/testdata/reports/all-inputs/arduino-avr-uno.json index c4ef5294..cbc15276 100644 --- a/.github/workflows/testdata/reports/all-inputs/arduino-avr-uno.json +++ b/.github/workflows/testdata/reports/all-inputs/arduino-avr-uno.json @@ -193,4 +193,4 @@ } } ] -} \ No newline at end of file +} diff --git a/.github/workflows/testdata/reports/all-inputs/esp8266-esp8266-huzzah.json b/.github/workflows/testdata/reports/all-inputs/esp8266-esp8266-huzzah.json index 242a6ed5..fa28e0e5 100644 --- a/.github/workflows/testdata/reports/all-inputs/esp8266-esp8266-huzzah.json +++ b/.github/workflows/testdata/reports/all-inputs/esp8266-esp8266-huzzah.json @@ -193,4 +193,4 @@ } } ] -} \ No newline at end of file +} diff --git a/.github/workflows/validate-action_yml.yml b/.github/workflows/validate-action_yml.yml deleted file mode 100644 index ea20dbce..00000000 --- a/.github/workflows/validate-action_yml.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Validate action.yml - -on: - pull_request: - paths: - - ".github/workflows/validate-action_yml.yml" - - "action.yml" - push: - paths: - - ".github/workflows/validate-action_yml.yml" - - "action.yml" - # Scheduled trigger to catch workflow failure resulting from changes to the JSON schema - schedule: - # run every Tuesday at 3 AM UTC - - cron: "0 3 * * 2" - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#workflow_dispatch - workflow_dispatch: - # See: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#repository_dispatch - repository_dispatch: - -jobs: - validate: - runs-on: ubuntu-latest - - env: - JSON_SCHEMA_FOLDER: etc/github-action-json-schema - JSON_SCHEMA_FILENAME: github-action.json - - steps: - - name: Checkout local repository - uses: actions/checkout@v2 - - # See: https://github.com/carlosperate/download-file-action/blob/master/README.md - - name: Download JSON schema for action.yml - uses: carlosperate/download-file-action@v1.0.3 - with: - # See: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/github-action.json - file-url: https://json.schemastore.org/github-action - location: ${{ env.JSON_SCHEMA_FOLDER }} - file-name: ${{ env.JSON_SCHEMA_FILENAME }} - - - name: Install JSON schema validator - run: sudo npm install --global ajv-cli - - # See: https://github.com/ajv-validator/ajv-cli/blob/master/README.md - - name: Validate action.yml - run: ajv -s "${{ env.JSON_SCHEMA_FOLDER }}/${{ env.JSON_SCHEMA_FILENAME }}" -d action.yml diff --git a/.gitignore b/.gitignore index f6f487ba..e1539262 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,5 @@ venv/ *.bak *.code-workspace *.sublime-workspace + +/node_modules/ diff --git a/.markdown-link-check.json b/.markdown-link-check.json new file mode 100644 index 00000000..c5e178dd --- /dev/null +++ b/.markdown-link-check.json @@ -0,0 +1,13 @@ +{ + "httpHeaders": [ + { + "urls": ["https://docs.github.com/"], + "headers": { + "Accept-Encoding": "gzip, deflate, br" + } + } + ], + "retryOn429": true, + "retryCount": 3, + "aliveStatusCodes": [200, 206] +} diff --git a/.markdownlint.yml b/.markdownlint.yml new file mode 100644 index 00000000..65b6ef7d --- /dev/null +++ b/.markdownlint.yml @@ -0,0 +1,62 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown/.markdownlint.yml +# See: https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md +# The code style defined in this file is the official standardized style to be used in all Arduino projects and should +# not be modified. +# Note: Rules disabled solely because they are redundant to Prettier are marked with a "Prettier" comment. + +default: false +MD001: false +MD002: false +MD003: false # Prettier +MD004: false # Prettier +MD005: false # Prettier +MD006: false # Prettier +MD007: false # Prettier +MD008: false # Prettier +MD009: + br_spaces: 0 + strict: true + list_item_empty_lines: false # Prettier +MD010: false # Prettier +MD011: true +MD012: false # Prettier +MD013: false +MD014: false +MD018: true +MD019: false # Prettier +MD020: true +MD021: false # Prettier +MD022: false # Prettier +MD023: false # Prettier +MD024: false +MD025: + level: 1 + front_matter_title: '^\s*"?title"?\s*[:=]' +MD026: false +MD027: false # Prettier +MD028: false +MD029: + style: one +MD030: + ul_single: 1 + ol_single: 1 + ul_multi: 1 + ol_multi: 1 +MD031: false # Prettier +MD032: false # Prettier +MD033: false +MD034: false +MD035: false # Prettier +MD036: false +MD037: true +MD038: true +MD039: true +MD040: false +MD041: false +MD042: true +MD043: false +MD044: false +MD045: true +MD046: + style: fenced +MD047: false # Prettier diff --git a/.markdownlintignore b/.markdownlintignore new file mode 100644 index 00000000..0022748d --- /dev/null +++ b/.markdownlintignore @@ -0,0 +1,4 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown/.markdownlintignore +.licenses/ +__pycache__/ +node_modules/ diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..0aa10674 --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/npm/.npmrc +# See: https://docs.npmjs.com/cli/configuring-npm/npmrc + +engine-strict=true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..bbb5e440 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +.licenses/ +.pytest_cache/ +__pycache__/ +node_modules/ diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 00000000..67630dcc --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,76 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-yaml/.yamllint.yml +# See: https://yamllint.readthedocs.io/en/stable/configuration.html +# The code style defined in this file is the official standardized style to be used in all Arduino tooling projects and +# should not be modified. +# Note: Rules disabled solely because they are redundant to Prettier are marked with a "Prettier" comment. + +rules: + braces: + level: error + forbid: non-empty + min-spaces-inside: -1 # Prettier + max-spaces-inside: -1 # Prettier + min-spaces-inside-empty: -1 # Prettier + max-spaces-inside-empty: -1 # Prettier + brackets: + level: error + forbid: non-empty + min-spaces-inside: -1 # Prettier + max-spaces-inside: -1 # Prettier + min-spaces-inside-empty: -1 # Prettier + max-spaces-inside-empty: -1 # Prettier + colons: disable # Prettier + commas: disable # Prettier + comments: disable # Prettier + comments-indentation: disable # Prettier + document-end: disable # Prettier + document-start: disable + empty-lines: disable # Prettier + empty-values: disable + hyphens: disable # Prettier + indentation: disable # Prettier + key-duplicates: disable # Prettier + key-ordering: disable + line-length: + level: warning + max: 120 + allow-non-breakable-words: true + allow-non-breakable-inline-mappings: true + new-line-at-end-of-file: disable # Prettier + new-lines: disable # Prettier + octal-values: + level: warning + forbid-implicit-octal: true + forbid-explicit-octal: false + quoted-strings: disable + trailing-spaces: disable # Prettier + truthy: + level: error + allowed-values: + - "true" + - "false" + - "on" # Used by GitHub Actions as a workflow key. + check-keys: true + +yaml-files: + # Source: https://github.com/ikatyang/linguist-languages/blob/master/data/YAML.json (used by Prettier) + - ".clang-format" + - ".clang-tidy" + - ".gemrc" + - ".yamllint" + - "glide.lock" + - "*.yml" + - "*.mir" + - "*.reek" + - "*.rviz" + - "*.sublime-syntax" + - "*.syntax" + - "*.yaml" + - "*.yaml-tmlanguage" + - "*.yaml.sed" + - "*.yml.mysql" + +ignore: | + /.git/ + __pycache__/ + node_modules/ diff --git a/LICENSE b/LICENSE.txt similarity index 98% rename from LICENSE rename to LICENSE.txt index fdb63837..f288702d 100644 --- a/LICENSE +++ b/LICENSE.txt @@ -1,17 +1,3 @@ -This file includes licensing information for Arduino GitHub Actions. - -Copyright (c) 2019 ARDUINO SA - -The software is released under the GNU General Public License, which covers the main body -of the [insert app name] code. The terms of this license can be found at: -https://www.gnu.org/licenses/gpl-3.0.en.html - -You can be released from the requirements of the above licenses by purchasing -a commercial license. Buying such a license is mandatory if you want to modify or -otherwise use the software for commercial activities involving the Arduino -software without disclosing the source code of your own applications. To purchase -a commercial license, send an email to license@arduino.cc - GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 diff --git a/README.md b/README.md index 7be3edda..fb2ba384 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,21 @@ # `arduino/compile-sketches` action -[![Tests](https://github.com/arduino/compile-sketches/workflows/Test%20Python%20code/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Test+Python+code) -[![Lint](https://github.com/arduino/compile-sketches/workflows/Lint%20Python%20code/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Lint+Python+code) -[![Spell Check](https://github.com/arduino/compile-sketches/workflows/Spell%20Check/badge.svg)](https://github.com/arduino/compile-sketches/actions?workflow=Spell+Check) +[![Check Action Metadata status](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-action-metadata-task.yml) +[![Check Files status](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-files-task.yml) +[![Check General Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-general-formatting-task.yml) +[![Check License status](https://github.com/arduino/compile-sketches/actions/workflows/check-license.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-license.yml) +[![Check Markdown status](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-markdown-task.yml) +[![Check npm status](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-npm-task.yml) +[![Check Poetry status](https://github.com/arduino/compile-sketches/actions/workflows/check-poetry-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-poetry-task.yml) +[![Check Prettier Formatting status](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-prettier-formatting-task.yml) +[![Check Python status](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-python-task.yml) +[![Check Taskfiles status](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-taskfiles.yml) +[![Check ToC status](https://github.com/arduino/compile-sketches/actions/workflows/check-toc-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-toc-task.yml) +[![Check Workflows status](https://github.com/arduino/compile-sketches/actions/workflows/check-workflows-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-workflows-task.yml) +[![Check YAML status](https://github.com/arduino/compile-sketches/actions/workflows/check-yaml-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/check-yaml-task.yml) +[![Spell Check status](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/spell-check-task.yml) +[![Sync Labels status](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/sync-labels-npm.yml) +[![Test Python status](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml/badge.svg)](https://github.com/arduino/compile-sketches/actions/workflows/test-python-poetry-task.yml) [![codecov](https://codecov.io/gh/arduino/compile-sketches/branch/main/graph/badge.svg?token=Uv6f1ebMZ4)](https://codecov.io/gh/arduino/compile-sketches) This action checks whether [Arduino](https://www.arduino.cc/) sketches compile and produces a report of data from the compilations. @@ -35,6 +48,7 @@ This action checks whether [Arduino](https://www.arduino.cc/) sketches compile a - [How it works](#how-it-works) - [`enable-warnings-report`](#enable-warnings-report) - [Example usage](#example-usage) +- [Additional resources](#additional-resources) @@ -62,6 +76,7 @@ If the board is from one of the platforms provided by Arduino's [default package If a platform dependency from a non-Boards Manager source of the same name as another Boards Manager source platform dependency is defined, they will both be installed, with the non-Boards Manager dependency overwriting the Boards Manager platform installation. This permits testing against a non-release version of a platform while using Boards Manager to install the platform's tools dependencies. Example: + ```yaml platforms: | # Install the latest release of Arduino SAMD Boards and its toolchain via Boards Manager @@ -76,6 +91,7 @@ platforms: | ##### Boards Manager Keys: + - **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). - **`version`** - version of the platform to install. - **Default**: the latest version. @@ -85,14 +101,16 @@ Keys: ##### Local path Keys: + - **`source-path`** - (**required**) path to install as a platform. Relative paths are assumed to be relative to the root of the repository. - **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). ##### Repository Keys: + - **`source-url`** - (**required**) URL to clone the repository from. It must start with `git://` or end with `.git`. -- **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). +- **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). - **`version`** - [Git ref](https://git-scm.com/book/en/v2/Git-Internals-Git-References) of the repository to checkout. The special version name `latest` will cause the latest tag to be used. - **Default**: the repository is checked out to the tip of the default branch. - **`source-path`** - path to install as a platform. Paths are relative to the root of the repository. @@ -101,8 +119,9 @@ Keys: ##### Archive download Keys: -- **`source-url`** - (**required**) download URL for the archive (e.g., `https://github.com/arduino/ArduinoCore-avr/archive/master.zip`). -- **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). + +- **`source-url`** - (**required**) download URL for the archive (e.g., `https://github.com/arduino/ArduinoCore-avr/archive/master.zip`). +- **`name`** - (**required**) platform name in the form of `VENDOR:ARCHITECTURE` (e.g., `arduino:avr`). - **`source-path`** - path to install as a platform. Paths are relative to the root folder of the archive, or the root of the archive if it has no root folder. - **Default**: root folder of the archive. @@ -111,7 +130,7 @@ Keys: [YAML](https://en.wikipedia.org/wiki/YAML)-format list of library dependencies to install. **Default**: `"- source-path: ./"` -This causes the repository to be installed as a library. If there are no library dependencies and you want to override the default, set the `libraries` input to an empty list (`- libraries: '-'`). +This causes the repository to be installed as a library. If there are no library dependencies and you want to override the default, set the `libraries` input to an empty list (`- libraries: '[]'`). Libraries are installed under the Arduino user folder at `~/Arduino/libraries`. @@ -122,17 +141,20 @@ Libraries are installed under the Arduino user folder at `~/Arduino/libraries`. ##### Library Manager Keys: + - **`name`** - (**required**) name of the library, as defined in the `name` field of its [library.properties](https://arduino.github.io/arduino-cli/latest/library-specification/#libraryproperties-file-format) metadata file. - **`version`** - version of the library to install. - **Default**: the latest version. **Notes**: + - The library will be installed to a folder matching its name, but with any spaces replaced by `_`. - If the library's author defined dependencies, those libraries will be installed automatically. ##### Local path Keys: + - **`source-path`** - (**required**) path to install as a library. Relative paths are assumed to be relative to the root of the repository. - **`destination-name`** - folder name to install the library to. - **Default**: the folder will be named according to the source repository or subfolder name. @@ -140,6 +162,7 @@ Keys: ##### Repository Keys: + - **`source-url`** - (**required**) URL to clone the repository from. It must start with `git://` or end with `.git`. - **`version`** - [Git ref](https://git-scm.com/book/en/v2/Git-Internals-Git-References) of the repository to checkout. The special version name `latest` will cause the latest tag to be used. - **Default**: the tip of the default branch. @@ -151,6 +174,7 @@ Keys: ##### Archive download Keys: + - **`source-url`** - (**required**) download URL for the archive (e.g., `https://github.com/arduino-libraries/Servo/archive/master.zip`). - **`source-path`** - path to install as a library. Paths are relative to the root folder of the archive, or the root of the archive if it has no root folder. - **Default**: root folder of the archive. @@ -179,7 +203,7 @@ Set to true to show verbose output in the log. Path in which to save a JSON formatted file containing data from the sketch compilations. Should be used only to store reports. Relative paths are relative to [`GITHUB_WORKSPACE`](https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables). The folder will be created if it doesn't already exist. -This report is used by the [`arduino/report-size-deltas`](https://github.com/arduino/report-size-deltas) and [`arduino/report-size-trends`](https://github.com/arduino/report-size-trends) actions. +This report is used by the [`arduino/report-size-deltas`](https://github.com/arduino/report-size-deltas) action. **Default**: `"sketches-reports"` @@ -220,9 +244,16 @@ Set to `true` to cause the action to record the compiler warning count for each ```yaml - uses: arduino/compile-sketches@v1 with: - fqbn: 'arduino:avr:uno' + fqbn: "arduino:avr:uno" libraries: | - name: Servo - name: Stepper version: 1.1.3 ``` + +## Additional resources + +- [Introductory article about **arduino/compile-sketches**](https://blog.arduino.cc/2021/04/09/test-your-arduino-projects-with-github-actions/) +- [Frequently asked questions about **arduino/compile-sketches**](docs/FAQ.md#frequently-asked-questions) +- [**GitHub Actions** documentation](https://docs.github.com/actions/learn-github-actions/understanding-github-actions) +- [Discuss or request assistance on **Arduino Forum**](https://forum.arduino.cc/) diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 00000000..84f5a547 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,536 @@ +# See: https://taskfile.dev/#/usage +version: "3" + +vars: + PYTHON_PROJECT_PATH: compilesketches + # Last version of ajv-cli with support for the JSON schema "Draft 4" specification + SCHEMA_DRAFT_4_AJV_CLI_VERSION: 3.3.0 + +tasks: + check: + desc: Check for problems with the project + deps: + - task: action:validate + - task: ci:validate + - task: general:check-formatting + - task: general:check-spelling + - task: markdown:check-links + - task: markdown:lint + - task: npm:validate + - task: python:lint + - task: python:test + - task: yaml:lint + + fix: + desc: Make automated corrections to the project's files + deps: + - task: general:correct-spelling + - task: general:format-prettier + - task: markdown:fix + - task: markdown:toc + vars: + FILE_PATH: README.md + MAX_DEPTH: 5 + - task: python:format + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-action-metadata-task/Taskfile.yml + action:validate: + desc: Validate GitHub Actions metadata against JSON schema + vars: + ACTION_METADATA_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="github-action-schema-XXXXXXXXXX.json" + deps: + - task: npm:install-deps + cmds: + - | + wget \ + --quiet \ + --output-document="{{.ACTION_METADATA_SCHEMA_PATH}}" \ + https://json.schemastore.org/github-action + - | + npx \ + ajv-cli \ + validate \ + --strict=false \ + -s "{{.ACTION_METADATA_SCHEMA_PATH}}" \ + -d "action.yml" + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-workflows-task/Taskfile.yml + ci:validate: + desc: Validate GitHub Actions workflows against their JSON schema + vars: + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/github-workflow.json + WORKFLOW_SCHEMA_URL: https://json.schemastore.org/github-workflow + WORKFLOW_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="workflow-schema-XXXXXXXXXX.json" + WORKFLOWS_DATA_PATH: "./.github/workflows/*.{yml,yaml}" + deps: + - task: npm:install-deps + cmds: + - | + wget \ + --quiet \ + --output-document="{{.WORKFLOW_SCHEMA_PATH}}" \ + {{.WORKFLOW_SCHEMA_URL}} + - | + npx \ + --package=ajv-cli \ + --package=ajv-formats \ + ajv validate \ + --all-errors \ + --strict=false \ + -c ajv-formats \ + -s "{{.WORKFLOW_SCHEMA_PATH}}" \ + -d "{{.WORKFLOWS_DATA_PATH}}" + + docs:generate: + desc: Create all generated documentation content + # This is an "umbrella" task used to call any documentation generation processes the project has. + # It can be left empty if there are none. + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-files-task/Taskfile.yml + general:check-filenames: + desc: Check for non-portable filenames + cmds: + - | + find . \ + -type d -name '.git' -prune -o \ + -type d -name '.licenses' -prune -o \ + -type d -name '__pycache__' -prune -o \ + -type d -name 'node_modules' -prune -o \ + -exec \ + sh \ + -c \ + ' \ + basename "$0" | \ + grep \ + --extended-regexp \ + --regexp='"'"'([<>:"/\\|?*'"'"'"$(printf "\001-\037")"'"'"'])|(.+\.$)'"'"' \ + --silent \ + && \ + echo "$0" + ' \ + '{}' \ + \; \ + -execdir \ + false \ + '{}' \ + + \ + || \ + { + echo + echo "Prohibited characters found in filenames" + echo "See:" + echo "https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions:~:text=except%20for%20the%20following" + false + } + - | + find . \ + -type d -name '.git' -prune -o \ + -type d -name '.licenses' -prune -o \ + -type d -name '__pycache__' -prune -o \ + -type d -name 'node_modules' -prune -o \ + -exec \ + sh \ + -c \ + ' \ + basename "$0" | \ + grep \ + --ignore-case \ + --extended-regexp \ + --regexp='"'"'^(con|prn|aux|nul|com[0-9]+|lpt[0-9]+)$'"'"' \ + --silent \ + && \ + echo "$0" + ' \ + '{}' \ + \; \ + -execdir \ + false \ + '{}' \ + + \ + || \ + { + echo + echo "Reserved filenames found" + echo "See:" + echo "https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions:~:text=use%20the%20following-,reserved%20names,-for%20the%20name" + false + } + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-general-formatting-task/Taskfile.yml + general:check-formatting: + desc: Check basic formatting style of all files + cmds: + - | + if ! which ec &>/dev/null; then + echo "ec not found or not in PATH." + echo "Please install: https://github.com/editorconfig-checker/editorconfig-checker#installation" + exit 1 + fi + - ec + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check-task/Taskfile.yml + general:check-spelling: + desc: Check for commonly misspelled words + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run codespell + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-files-task/Taskfile.yml + general:check-symlinks: + desc: Check for bad symlinks + cmds: + - | + find . \ + -type d -name '.git' -prune -o \ + -type d -name '.licenses' -prune -o \ + -type d -name '__pycache__' -prune -o \ + -type d -name 'node_modules' -prune -o \ + -type l \ + -execdir \ + test ! -e '{}' \ + \; \ + -exec \ + echo '{}' \ + \; \ + -execdir \ + false \ + '{}' \ + + \ + || \ + { + echo 'Broken or circular symlink found' + false + } + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/spell-check-task/Taskfile.yml + general:correct-spelling: + desc: Correct commonly misspelled words where possible + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run codespell --write-changes + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-prettier-formatting-task/Taskfile.yml + general:format-prettier: + desc: Format all supported files with Prettier + deps: + - task: npm:install-deps + cmds: + - npx prettier --write . + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown-task/Taskfile.yml + markdown:check-links: + desc: Check for broken links + vars: + # The command is defined in a Taskfile variable to allow it to be broken into multiple lines for readability. + # This can't be done in the `cmd` object of the Taskfile because `npx --call` uses the native shell, which causes + # standard newline escaping syntax to not work when the task is run on Windows. + # + # Using -regex instead of -name to avoid Task's behavior of globbing even when quoted on Windows + # The odd method for escaping . in the regex is required for windows compatibility because mvdan.cc/sh gives + # \ characters special treatment on Windows in an attempt to support them as path separators. + # + # prettier-ignore + CHECK_LINKS_COMMAND: + " + find . \ + -type d -name \".git\" -prune -o \ + -type d -name \".licenses\" -prune -o \ + -type d -name \"__pycache__\" -prune -o \ + -type d -name \"node_modules\" -prune -o \ + -regex \".*[.]md\" \ + -exec \ + markdown-link-check \ + --quiet \ + --config \"./.markdown-link-check.json\" \ + \\{\\} \ + + + " + deps: + - task: docs:generate + - task: npm:install-deps + cmds: + - | + npx \ + --package=markdown-link-check \ + --call='{{.CHECK_LINKS_COMMAND}}' + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown-task/Taskfile.yml + markdown:fix: + desc: Automatically correct linting violations in Markdown files where possible + deps: + - task: npm:install-deps + cmds: + - npx markdownlint-cli --fix "**/*.md" + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-markdown-task/Taskfile.yml + markdown:lint: + desc: Check for problems in Markdown files + deps: + - task: npm:install-deps + cmds: + - npx markdownlint-cli "**/*.md" + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-toc-task/Taskfile.yml + markdown:toc: + desc: Update the table of contents + deps: + - task: npm:install-deps + cmds: + - | + npx markdown-toc \ + --bullets=- \ + --maxdepth={{.MAX_DEPTH}} \ + -i \ + "{{.FILE_PATH}}" + + # Parameter variables: + # - PROJECT_PATH: path of the npm-managed project. Default value: "./" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/npm-task/Taskfile.yml + npm:install-deps: + desc: Install dependencies managed by npm + run: once + dir: | + "{{default "./" .PROJECT_PATH}}" + cmds: + - npm install + + # Parameter variables: + # - PROJECT_PATH: path of the npm-managed project. Default value: "./" + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-npm-task/Taskfile.yml + npm:validate: + desc: Validate npm configuration files against their JSON schema + vars: + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/package.json + SCHEMA_URL: https://json.schemastore.org/package.json + SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="package-json-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/ava.json + AVA_SCHEMA_URL: https://json.schemastore.org/ava.json + AVA_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="ava-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/base.json + BASE_SCHEMA_URL: https://json.schemastore.org/base.json + BASE_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="base-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/eslintrc.json + ESLINTRC_SCHEMA_URL: https://json.schemastore.org/eslintrc.json + ESLINTRC_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="eslintrc-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/jscpd.json + JSCPD_SCHEMA_URL: https://json.schemastore.org/jscpd.json + JSCPD_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="jscpd-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/npm-badges.json + NPM_BADGES_SCHEMA_URL: https://json.schemastore.org/npm-badges.json + NPM_BADGES_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="npm-badges-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/partial-eslint-plugins.json + PARTIAL_ESLINT_PLUGINS_SCHEMA_URL: https://json.schemastore.org/partial-eslint-plugins.json + PARTIAL_ESLINT_PLUGINS_PATH: + sh: task utility:mktemp-file TEMPLATE="partial-eslint-plugins-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/prettierrc.json + PRETTIERRC_SCHEMA_URL: https://json.schemastore.org/prettierrc.json + PRETTIERRC_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="prettierrc-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/semantic-release.json + SEMANTIC_RELEASE_SCHEMA_URL: https://json.schemastore.org/semantic-release.json + SEMANTIC_RELEASE_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="semantic-release-schema-XXXXXXXXXX.json" + # Source: https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/stylelintrc.json + STYLELINTRC_SCHEMA_URL: https://json.schemastore.org/stylelintrc.json + STYLELINTRC_SCHEMA_PATH: + sh: task utility:mktemp-file TEMPLATE="stylelintrc-schema-XXXXXXXXXX.json" + INSTANCE_PATH: >- + {{default "." .PROJECT_PATH}}/package.json + PROJECT_FOLDER: + sh: pwd + WORKING_FOLDER: + sh: task utility:mktemp-folder TEMPLATE="dependabot-validate-XXXXXXXXXX" + cmds: + - wget --quiet --output-document="{{.SCHEMA_PATH}}" {{.SCHEMA_URL}} + - wget --quiet --output-document="{{.AVA_SCHEMA_PATH}}" {{.AVA_SCHEMA_URL}} + - wget --quiet --output-document="{{.BASE_SCHEMA_PATH}}" {{.BASE_SCHEMA_URL}} + - wget --quiet --output-document="{{.ESLINTRC_SCHEMA_PATH}}" {{.ESLINTRC_SCHEMA_URL}} + - wget --quiet --output-document="{{.JSCPD_SCHEMA_PATH}}" {{.JSCPD_SCHEMA_URL}} + - wget --quiet --output-document="{{.NPM_BADGES_SCHEMA_PATH}}" {{.NPM_BADGES_SCHEMA_URL}} + - wget --quiet --output-document="{{.PARTIAL_ESLINT_PLUGINS_PATH}}" {{.PARTIAL_ESLINT_PLUGINS_SCHEMA_URL}} + - wget --quiet --output-document="{{.PRETTIERRC_SCHEMA_PATH}}" {{.PRETTIERRC_SCHEMA_URL}} + - wget --quiet --output-document="{{.SEMANTIC_RELEASE_SCHEMA_PATH}}" {{.SEMANTIC_RELEASE_SCHEMA_URL}} + - wget --quiet --output-document="{{.STYLELINTRC_SCHEMA_PATH}}" {{.STYLELINTRC_SCHEMA_URL}} + - | + cd "{{.WORKING_FOLDER}}" # Workaround for https://github.com/npm/cli/issues/3210 + npx ajv-cli@{{.SCHEMA_DRAFT_4_AJV_CLI_VERSION}} validate \ + --all-errors \ + -s "{{.SCHEMA_PATH}}" \ + -r "{{.AVA_SCHEMA_PATH}}" \ + -r "{{.BASE_SCHEMA_PATH}}" \ + -r "{{.ESLINTRC_SCHEMA_PATH}}" \ + -r "{{.JSCPD_SCHEMA_PATH}}" \ + -r "{{.NPM_BADGES_SCHEMA_PATH}}" \ + -r "{{.PARTIAL_ESLINT_PLUGINS_PATH}}" \ + -r "{{.PRETTIERRC_SCHEMA_PATH}}" \ + -r "{{.SEMANTIC_RELEASE_SCHEMA_PATH}}" \ + -r "{{.STYLELINTRC_SCHEMA_PATH}}" \ + -d "{{.PROJECT_FOLDER}}/{{.INSTANCE_PATH}}" + + poetry:install: + desc: Install Poetry + run: once + cmds: + - | + if ! which pipx &>/dev/null; then + echo "pipx not found or not in PATH." + echo "Please install: https://pipx.pypa.io/stable/installation/#installing-pipx" + exit 1 + fi + - | + if ! which yq &>/dev/null; then + echo "yq not found or not in PATH." + echo "Please install: https://github.com/mikefarah/yq/#install" + exit 1 + fi + - | + export PIPX_DEFAULT_PYTHON="$( \ + task utility:normalize-path \ + RAW_PATH="$(which python)" \ + )" + pipx install \ + --force \ + "poetry==$( \ + yq \ + --input-format toml \ + --output-format yaml \ + '.tool.poetry.group.pipx.dependencies.poetry' \ + < pyproject.toml + )" + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/poetry-task/Taskfile.yml + poetry:install-deps: + desc: Install dependencies managed by Poetry + run: when_changed + deps: + - task: poetry:install + cmds: + - | + poetry install \ + {{if .POETRY_GROUPS}} --only {{.POETRY_GROUPS}} {{end}} + + poetry:sync: + desc: Sync poetry.lock + deps: + - task: poetry:install + cmds: + - | + poetry lock \ + --no-cache + + poetry:validate: + desc: Validate pyproject.toml + deps: + - task: poetry:install + cmds: + - | + poetry check \ + --lock + + python:coverage-report: + desc: Show code coverage report + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - | + poetry run \ + coverage report + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-python-task/Taskfile.yml + python:format: + desc: Format Python files + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run black . + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-python-task/Taskfile.yml + python:lint: + desc: Lint Python code + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run flake8 --show-source + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/test-python-poetry-task/Taskfile.yml + python:test: + desc: Run Python tests + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev,main + cmds: + - | + poetry run \ + coverage run \ + --source="{{.PYTHON_PROJECT_PATH}}" \ + --module \ + pytest "{{.PYTHON_PROJECT_PATH}}/tests" + - | + poetry run \ + coverage xml + + # Make a temporary file named according to the passed TEMPLATE variable and print the path passed to stdout + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml + utility:mktemp-file: + vars: + RAW_PATH: + sh: mktemp --tmpdir "{{.TEMPLATE}}" + cmds: + - task: utility:normalize-path + vars: + RAW_PATH: "{{.RAW_PATH}}" + + # Make a temporary folder named according to the passed TEMPLATE variable and print the path passed to stdout + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml + utility:mktemp-folder: + vars: + RAW_PATH: + sh: mktemp --directory --tmpdir "{{.TEMPLATE}}" + cmds: + - task: utility:normalize-path + vars: + RAW_PATH: "{{.RAW_PATH}}" + + # Print a normalized version of the path passed via the RAW_PATH variable to stdout + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/windows-task/Taskfile.yml + utility:normalize-path: + cmds: + - | + if [[ "{{.OS}}" == "Windows_NT" ]] && which cygpath &>/dev/null; then + # Even though the shell handles POSIX format absolute paths as expected, external applications do not. + # So paths passed to such applications must first be converted to Windows format. + cygpath -w "{{.RAW_PATH}}" + else + echo "{{.RAW_PATH}}" + fi + + # Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/check-yaml-task/Taskfile.yml + yaml:lint: + desc: Check for problems with YAML files + deps: + - task: poetry:install-deps + vars: + POETRY_GROUPS: dev + cmds: + - poetry run yamllint --format {{default "colored" .YAMLLINT_FORMAT}} . diff --git a/action-setup.sh b/action-setup.sh deleted file mode 100755 index 9f32d9b7..00000000 --- a/action-setup.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -# Set up the Python environment for the action's script to run in - -readonly PYTHON_PACKAGE_VERSION='3.8' - -# https://stackoverflow.com/a/29835459 -readonly SCRIPT_PATH="$( - CDPATH='' \ - cd -- "$( - dirname -- "$0" - )" && ( - pwd -P - ) -)" - -readonly PYTHON_COMMAND="python${PYTHON_PACKAGE_VERSION}" -readonly PYTHON_VENV_PATH="${SCRIPT_PATH}/compilesketches/.venv" -readonly PYTHON_VENV_ACTIVATE_SCRIPT_PATH="${PYTHON_VENV_PATH}/bin/activate" - -# Install Python -sudo apt-get install --yes software-properties-common > /dev/null -sudo add-apt-repository --yes ppa:deadsnakes/ppa > /dev/null -sudo apt-get update --yes > /dev/null -sudo apt-get install --yes python${PYTHON_PACKAGE_VERSION} > /dev/null -echo "Using Python version: $("$PYTHON_COMMAND" --version)" - -sudo apt-get install --yes python3-setuptools > /dev/null -sudo apt-get install --yes python${PYTHON_PACKAGE_VERSION}-venv > /dev/null - -# Create Python virtual environment -"$PYTHON_COMMAND" -m venv --system-site-packages "$PYTHON_VENV_PATH" - -# Activate Python virtual environment -# shellcheck source=/dev/null -. "$PYTHON_VENV_ACTIVATE_SCRIPT_PATH" - -# Install Python dependencies -"$PYTHON_COMMAND" -m pip install --upgrade pip > /dev/null -"$PYTHON_COMMAND" -m pip install --quiet --requirement "${SCRIPT_PATH}/compilesketches/requirements.txt" - -# Set outputs for use in GitHub Actions workflow steps -# See: https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-output-parameter -echo "::set-output name=python-command::$PYTHON_COMMAND" -echo "::set-output name=python-venv-activate-script-path::$PYTHON_VENV_ACTIVATE_SCRIPT_PATH" diff --git a/action.yml b/action.yml index 1f593b4d..c57b1907 100644 --- a/action.yml +++ b/action.yml @@ -1,61 +1,119 @@ -name: 'Compile Arduino Sketches' -description: 'Checks whether Arduino sketches will compile and produces a report of data from the compilations' +name: "Compile Arduino Sketches" +description: >- + Checks whether Arduino sketches will compile and produces a report of data from the compilations inputs: cli-version: - description: 'Version of Arduino CLI to use when building' - default: 'latest' + description: >- + Version of Arduino CLI to use when building + default: "latest" required: true fqbn: - description: 'Full qualified board name, with Boards Manager URL if needed' - default: 'arduino:avr:uno' + description: >- + Full qualified board name, with Boards Manager URL if needed + default: "arduino:avr:uno" required: true libraries: - description: 'YAML-format list of library dependencies to install' - default: '- source-path: ./' + description: >- + YAML-format list of library dependencies to install + default: "- source-path: ./" required: true platforms: - description: 'YAML-format list of platform dependencies to install' - default: '' + description: >- + YAML-format list of platform dependencies to install + default: "" required: true sketch-paths: - description: 'YAML-format list of paths containing sketches to compile.' - default: '- examples' + description: >- + YAML-format list of paths containing sketches to compile. + default: "- examples" required: true cli-compile-flags: - description: 'YAML-format list of flags to add to the Arduino CLI sketch compilation command.' - default: '' + description: >- + YAML-format list of flags to add to the Arduino CLI sketch compilation command. + default: "" required: false verbose: - description: 'Set to true to show verbose output in the log' - default: 'false' + description: >- + Set to true to show verbose output in the log + default: "false" required: true sketches-report-path: - description: 'Path in which to save a JSON formatted file containing data from the sketch compilations' - default: 'sketches-reports' + description: >- + Path in which to save a JSON formatted file containing data from the sketch compilations + default: "sketches-reports" required: true github-token: - description: 'GitHub access token used to get information from the GitHub API. Only needed if you are using the deltas report feature in a private repository.' - default: '' + description: >- + GitHub access token used to get information from the GitHub API. + + Only needed if you are using the deltas report feature in a private repository. + default: "" required: true enable-deltas-report: - description: 'Set to true to cause the action to determine the change in memory usage and compiler warnings of the compiled sketches between the head and base refs of a PR and the immediate parent commit of a push' - default: 'false' + description: >- + Set to true to cause the action to determine the change in memory usage and compiler warnings of the compiled + sketches between the head and base refs of a PR and the immediate parent commit of a push + default: "false" required: true enable-warnings-report: - description: 'Set to true to cause the action to record the compiler warning count for each sketch compilation in the sketches report' - default: 'false' + description: >- + Set to true to cause the action to record the compiler warning count for each sketch compilation in the sketches + report + default: "false" required: true runs: using: composite steps: - - name: Run the set up script - id: setup + # User installations of external Python package platform dependencies will be located here. + - name: Get system Python "user site-packages" path + id: system-user-site-packages + shell: bash + run: | + # Get system Python "user site-packages" path. + echo "path=$(python -m site --user-site)" >> $GITHUB_OUTPUT + + - name: Install Python + uses: actions/setup-python@v6 + with: + python-version-file: ${{ github.action_path }}/pyproject.toml + + - name: Action setup shell: bash + working-directory: ${{ github.action_path }} run: | - # Group action setup log output - echo "::group::Action set up" - "${{ github.action_path }}/action-setup.sh" + echo "::group::Action setup" + + # Install Poetry. + pipx install \ + --python "$(which python)" \ + "poetry==$( \ + yq \ + --input-format toml \ + --output-format yaml \ + '.tool.poetry.group.pipx.dependencies.poetry' \ + < pyproject.toml + )" + + # Install Python dependencies. + poetry install \ + --only main,external + + # Make user-installed Python packages available to platforms. + readonly PYTHON_ENVIRONMENT_PATH="$( + poetry env info \ + --path + )" + readonly VENV_SITE_PACKAGES_PATH="$( + poetry run \ + python -c \ + 'import site; print(site.getsitepackages()[0])' + )" + echo \ + "${{ steps.system-user-site-packages.outputs.path }}" > \ + "${VENV_SITE_PACKAGES_PATH}/system-user-site-packages.pth" + + # Terminate action setup group echo "::endgroup::" - name: Run script @@ -72,6 +130,8 @@ runs: INPUT_ENABLE-DELTAS-REPORT: ${{ inputs.enable-deltas-report }} INPUT_ENABLE-WARNINGS-REPORT: ${{ inputs.enable-warnings-report }} INPUT_SKETCHES-REPORT-PATH: ${{ inputs.sketches-report-path }} + working-directory: ${{ github.action_path }} run: | - source "${{ steps.setup.outputs.python-venv-activate-script-path }}" - "${{ steps.setup.outputs.python-command }}" "${{ github.action_path }}/compilesketches/compilesketches.py" + # Run action + poetry run \ + python compilesketches/compilesketches.py diff --git a/compilesketches/.flake8 b/compilesketches/.flake8 deleted file mode 100644 index ca383b05..00000000 --- a/compilesketches/.flake8 +++ /dev/null @@ -1,8 +0,0 @@ -[flake8] -doctests = True -extend-exclude = .venv -# W503 and W504 are mutually exclusive. PEP 8 recommends line break before. -ignore = W503 -max-complexity = 10 -max-line-length = 120 -select = E,W,F,C,N diff --git a/compilesketches/compilesketches.py b/compilesketches/compilesketches.py index 5b8a81be..00236a82 100644 --- a/compilesketches/compilesketches.py +++ b/compilesketches/compilesketches.py @@ -1,3 +1,5 @@ +import atexit +import time import contextlib import enum import json @@ -25,18 +27,24 @@ def main(): print("::warning::The size-report-sketch input is no longer used") if "INPUT_SIZE-DELTAS-REPORT-FOLDER-NAME" in os.environ: - print("::warning::The size-deltas-report-folder-name input is deprecated. Use the equivalent input: " - "sketches-report-path instead.") + print( + "::warning::The size-deltas-report-folder-name input is deprecated. Use the equivalent input: " + "sketches-report-path instead." + ) os.environ["INPUT_SKETCHES-REPORT-PATH"] = os.environ["INPUT_SIZE-DELTAS-REPORT-FOLDER-NAME"] if "INPUT_ENABLE-SIZE-DELTAS-REPORT" in os.environ: - print("::warning::The enable-size-deltas-report input is deprecated. Use the equivalent input: " - "enable-deltas-report instead.") + print( + "::warning::The enable-size-deltas-report input is deprecated. Use the equivalent input: " + "enable-deltas-report instead." + ) os.environ["INPUT_ENABLE-DELTAS-REPORT"] = os.environ["INPUT_ENABLE-SIZE-DELTAS-REPORT"] if "INPUT_ENABLE-SIZE-TRENDS-REPORT" in os.environ: - print("::warning::The size trends report feature has been moved to a dedicated action. See the documentation " - "at https://github.com/arduino/actions/tree/report-size-trends-action/libraries/report-size-trends") + print( + "::warning::The size trends report feature has been moved to a dedicated action. See the documentation " + "at https://github.com/arduino/actions/tree/report-size-trends-action/libraries/report-size-trends" + ) compile_sketches = CompileSketches( cli_version=os.environ["INPUT_CLI-VERSION"], @@ -49,7 +57,7 @@ def main(): github_token=os.environ["INPUT_GITHUB-TOKEN"], enable_deltas_report=os.environ["INPUT_ENABLE-DELTAS-REPORT"], enable_warnings_report=os.environ["INPUT_ENABLE-WARNINGS-REPORT"], - sketches_report_path=os.environ["INPUT_SKETCHES-REPORT-PATH"] + sketches_report_path=os.environ["INPUT_SKETCHES-REPORT-PATH"], ) compile_sketches.compile_sketches() @@ -118,8 +126,20 @@ class ReportKeys: latest_release_indicator = "latest" - def __init__(self, cli_version, fqbn_arg, platforms, libraries, sketch_paths, cli_compile_flags, verbose, - github_token, enable_deltas_report, enable_warnings_report, sketches_report_path): + def __init__( + self, + cli_version, + fqbn_arg, + platforms, + libraries, + sketch_paths, + cli_compile_flags, + verbose, + github_token, + enable_deltas_report, + enable_warnings_report, + sketches_report_path, + ): """Process, store, and validate the action's inputs.""" self.cli_version = cli_version @@ -183,8 +203,10 @@ def get_pull_request_base_ref(self): try: repository_api = self.github_api.get_repo(full_name_or_id=os.environ["GITHUB_REPOSITORY"]) except github.UnknownObjectException: - print("::error::Unable to access repository data. Please specify the github-token input in your " - "workflow configuration.") + print( + "::error::Unable to access repository data. Please specify the github-token input in your " + "workflow configuration." + ) sys.exit(1) return repository_api.get_pull(number=pull_request_number).base.ref @@ -233,7 +255,7 @@ def install_arduino_cli(self): # The Arduino CLI has no root folder, so just install the arduino-cli executable from the archive root source_path="arduino-cli", destination_parent_path=self.arduino_cli_installation_path, - force=False + force=False, ) # Configure the location of the Arduino CLI user directory @@ -287,10 +309,12 @@ def install_from_download(self, url, source_path, destination_parent_path, desti print("::error::Archive source path:", source_path, "not found") sys.exit(1) - self.install_from_path(source_path=absolute_source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) + self.install_from_path( + source_path=absolute_source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) def install_platforms(self): """Install Arduino boards platforms.""" @@ -336,14 +360,14 @@ def sort_dependency_list(self, dependency_list): if dependency is not None: if self.dependency_source_url_key in dependency: # Repositories are identified by the URL starting with git:// or ending in .git - if ( - dependency[self.dependency_source_url_key].rstrip("/").endswith(".git") - or dependency[self.dependency_source_url_key].startswith("git://") - ): + if dependency[self.dependency_source_url_key].rstrip("/").endswith(".git") or dependency[ + self.dependency_source_url_key + ].startswith("git://"): sorted_dependencies.repository.append(dependency) - elif re.match( - pattern=".*/package_.*index.json", string=dependency[self.dependency_source_url_key] - ) is not None: + elif ( + re.match(pattern=".*/package_.*index.json", string=dependency[self.dependency_source_url_key]) + is not None + ): # URLs that match the filename requirements of the package_index.json specification are assumed # to be additional Board Manager URLs (platform index) sorted_dependencies.manager.append(dependency) @@ -389,12 +413,14 @@ def install_platforms_from_board_manager(self, platform_list): core_install_command.append(self.get_manager_dependency_name(platform)) # Download the platform index for the platform - self.run_arduino_cli_command(command=core_update_index_command, - enable_output=self.get_run_command_output_level()) + self.run_arduino_cli_command( + command=core_update_index_command, enable_output=self.get_run_command_output_level() + ) # Install the platform - self.run_arduino_cli_command(command=core_install_command, - enable_output=self.get_run_command_output_level()) + self.run_arduino_cli_command( + command=core_install_command, enable_output=self.get_run_command_output_level() + ) def get_manager_dependency_name(self, dependency): """Return the appropriate name value for a manager dependency. This allows the NAME@VERSION syntax to be used @@ -436,9 +462,9 @@ def run_arduino_cli_command(self, command, enable_output=RunCommandOutput.ON_FAI full_command.extend(command) if self.verbose: full_command.extend(["--log-level", debug_output_log_level, "--verbose"]) - arduino_cli_output = self.run_command(command=full_command, - enable_output=enable_output, - exit_on_failure=exit_on_failure) + arduino_cli_output = self.run_command( + command=full_command, enable_output=enable_output, exit_on_failure=exit_on_failure + ) return arduino_cli_output @@ -456,15 +482,19 @@ def run_command(self, command, enable_output=RunCommandOutput.ON_FAILURE, exit_o command_data = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) # Print output if appropriate - if (enable_output == self.RunCommandOutput.ALWAYS - or (command_data.returncode != 0 - and (enable_output == self.RunCommandOutput.ON_FAILURE - or enable_output == self.RunCommandOutput.ALWAYS))): - + if enable_output == self.RunCommandOutput.ALWAYS or ( + command_data.returncode != 0 + and (enable_output == self.RunCommandOutput.ON_FAILURE or enable_output == self.RunCommandOutput.ALWAYS) + ): # Cast args to string and join them to form a string - print("::group::Running command:", list_to_string(command_data.args), "\n", - command_data.stdout, "\n", - "::endgroup::") + print( + "::group::Running command:", + list_to_string(command_data.args), + "\n", + command_data.stdout, + "\n", + "::endgroup::", + ) if command_data.returncode != 0: print("::error::Command failed") @@ -492,10 +522,12 @@ def install_platforms_from_path(self, platform_list): platform_installation_path = self.get_platform_installation_path(platform=platform) # Install the platform - self.install_from_path(source_path=source_path, - destination_parent_path=platform_installation_path.path.parent, - destination_name=platform_installation_path.path.name, - force=platform_installation_path.is_overwrite) + self.install_from_path( + source_path=source_path, + destination_parent_path=platform_installation_path.path.parent, + destination_name=platform_installation_path.path.name, + force=platform_installation_path.is_overwrite, + ) def get_platform_installation_path(self, platform): """Determines the correct installation path for the given platform and returns an object with the attributes: @@ -526,17 +558,15 @@ def __init__(self): self.run_arduino_cli_command(command=["core", "update-index"]) # Use Arduino CLI to get the list of installed platforms command_data = self.run_arduino_cli_command(command=["core", "list", "--format", "json"]) - installed_platform_list = json.loads(command_data.stdout) + installed_platform_list = self.cli_core_list_platform_list(json.loads(command_data.stdout)) for installed_platform in installed_platform_list: - if installed_platform[self.cli_json_key("core list", "ID")] == platform[self.dependency_name_key]: + if installed_platform[self.cli_json_key("core list", "id")] == platform[self.dependency_name_key]: # The platform has been installed via Board Manager, so do an overwrite - platform_installation_path.path = ( - self.board_manager_platforms_path.joinpath( - platform_vendor, - "hardware", - platform_architecture, - installed_platform[self.cli_json_key("core list", "Installed")] - ) + platform_installation_path.path = self.board_manager_platforms_path.joinpath( + platform_vendor, + "hardware", + platform_architecture, + installed_platform[self.cli_json_key("core list", "installed_version")], ) platform_installation_path.is_overwrite = True @@ -559,11 +589,14 @@ def install_from_path(self, source_path, destination_parent_path, destination_na destination_path = destination_parent_path.joinpath(destination_name) - if destination_path.exists(): + if destination_path.exists() or destination_path.is_symlink(): if force: - # Clear existing folder + # Clear existing item self.verbose_print("Overwriting installation at:", destination_path) - shutil.rmtree(path=destination_path) + if destination_path.is_symlink() or destination_path.is_file(): + destination_path.unlink() + else: + shutil.rmtree(path=destination_path) else: print("::error::Installation already exists:", destination_path) sys.exit(1) @@ -573,6 +606,10 @@ def install_from_path(self, source_path, destination_parent_path, destination_na destination_path.symlink_to(target=source_path, target_is_directory=source_path.is_dir()) + # Remove the symlink on script exit. The source path files added by the script are stored in a temporary folder + # which is deleted on exit, so the symlink will serve no purpose. + atexit.register(destination_path.unlink) + def install_platforms_from_repository(self, platform_list): """Install libraries by cloning Git repositories @@ -591,12 +628,14 @@ def install_platforms_from_repository(self, platform_list): destination_path = self.get_platform_installation_path(platform=platform) - self.install_from_repository(url=platform[self.dependency_source_url_key], - git_ref=git_ref, - source_path=source_path, - destination_parent_path=destination_path.path.parent, - destination_name=destination_path.path.name, - force=destination_path.is_overwrite) + self.install_from_repository( + url=platform[self.dependency_source_url_key], + git_ref=git_ref, + source_path=source_path, + destination_parent_path=destination_path.path.parent, + destination_name=destination_path.path.name, + force=destination_path.is_overwrite, + ) def get_repository_dependency_ref(self, dependency): """Return the appropriate git ref value for a repository dependency @@ -611,13 +650,9 @@ def get_repository_dependency_ref(self, dependency): return git_ref - def install_from_repository(self, - url, - git_ref, - source_path, - destination_parent_path, - destination_name=None, - force=False): + def install_from_repository( + self, url, git_ref, source_path, destination_parent_path, destination_name=None, force=False + ): """Install by cloning a repository Keyword arguments: @@ -637,10 +672,12 @@ def install_from_repository(self, clone_folder = tempfile.mkdtemp(dir=self.temporary_directory.name, prefix="install_from_repository-") self.clone_repository(url=url, git_ref=git_ref, destination_path=clone_folder) # Install to the final location - self.install_from_path(source_path=pathlib.Path(clone_folder, source_path), - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) + self.install_from_path( + source_path=pathlib.Path(clone_folder, source_path), + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) def clone_repository(self, url, git_ref, destination_path): """Clone a Git repository to a specified location and check out the specified ref @@ -686,11 +723,13 @@ def install_platforms_from_download(self, platform_list): destination_path = self.get_platform_installation_path(platform=platform) - self.install_from_download(url=platform[self.dependency_source_url_key], - source_path=source_path, - destination_parent_path=destination_path.path.parent, - destination_name=destination_path.path.name, - force=destination_path.is_overwrite) + self.install_from_download( + url=platform[self.dependency_source_url_key], + source_path=source_path, + destination_parent_path=destination_path.path.parent, + destination_name=destination_path.path.name, + force=destination_path.is_overwrite, + ) def install_libraries(self): """Install Arduino libraries.""" @@ -702,8 +741,7 @@ def install_libraries(self): library_list = self.sort_dependency_list(libraries.value) else: # libraries input uses the old space-separated list syntax - library_list.manager = [{self.dependency_name_key: library_name} - for library_name in libraries.value] + library_list.manager = [{self.dependency_name_key: library_name} for library_name in libraries.value] # The original behavior of the action was to assume the root of the repo is a library to be installed, so # that behavior is retained when using the old input syntax @@ -758,9 +796,7 @@ def install_libraries_from_path(self, library_list): if self.dependency_destination_name_key in library: # If a name was specified, use it destination_name = library[self.dependency_destination_name_key] - elif ( - source_path == absolute_path(os.environ["GITHUB_WORKSPACE"]) - ): + elif source_path == absolute_path(os.environ["GITHUB_WORKSPACE"]): # If source_path is the root of the workspace (i.e., repository root), name the folder according to the # repository name, otherwise it will unexpectedly be "workspace" destination_name = os.environ["GITHUB_REPOSITORY"].split(sep="/")[1] @@ -768,10 +804,12 @@ def install_libraries_from_path(self, library_list): # Use the existing folder name destination_name = None - self.install_from_path(source_path=source_path, - destination_parent_path=self.libraries_path, - destination_name=destination_name, - force=True) + self.install_from_path( + source_path=source_path, + destination_parent_path=self.libraries_path, + destination_name=destination_name, + force=True, + ) def install_libraries_from_repository(self, library_list): """Install libraries by cloning Git repositories @@ -797,12 +835,14 @@ def install_libraries_from_repository(self, library_list): else: source_path = "." - self.install_from_repository(url=library[self.dependency_source_url_key], - git_ref=git_ref, - source_path=source_path, - destination_parent_path=self.libraries_path, - destination_name=destination_name, - force=True) + self.install_from_repository( + url=library[self.dependency_source_url_key], + git_ref=git_ref, + source_path=source_path, + destination_parent_path=self.libraries_path, + destination_name=destination_name, + force=True, + ) def install_libraries_from_download(self, library_list): """Install libraries by downloading them @@ -822,11 +862,13 @@ def install_libraries_from_download(self, library_list): else: destination_name = None - self.install_from_download(url=library[self.dependency_source_url_key], - source_path=source_path, - destination_parent_path=self.libraries_path, - destination_name=destination_name, - force=True) + self.install_from_download( + url=library[self.dependency_source_url_key], + source_path=source_path, + destination_parent_path=self.libraries_path, + destination_name=destination_name, + force=True, + ) def find_sketches(self): """Return a list of all sketches under the paths specified in the sketch paths list recursively.""" @@ -885,9 +927,12 @@ def compile_sketch(self, sketch_path, clean_build_cache): if clean_build_cache: for cache_path in pathlib.Path("/tmp").glob(pattern="arduino*"): shutil.rmtree(path=cache_path) - + start_time = time.monotonic() compilation_data = self.run_arduino_cli_command( - command=compilation_command, enable_output=self.RunCommandOutput.NONE, exit_on_failure=False) + command=compilation_command, enable_output=self.RunCommandOutput.NONE, exit_on_failure=False + ) + diff_time = time.monotonic() - start_time + # Group compilation output to make the log easy to read # https://github.com/actions/toolkit/blob/master/docs/commands.md#group-and-ungroup-log-lines print("::group::Compiling sketch:", path_relative_to_workspace(path=sketch_path)) @@ -901,6 +946,14 @@ class CompilationResult: if not CompilationResult.success: print("::error::Compilation failed") + else: + time_summary = "" + if diff_time > 60: + if diff_time > 360: + time_summary += f"{int(diff_time / 360)}h " + time_summary += f"{int(diff_time / 60) % 60}m " + time_summary += f"{int(diff_time) % 60}s" + print("Compilation time elapsed:", time_summary) return CompilationResult() @@ -917,9 +970,9 @@ def get_sketch_report(self, compilation_result): current_warning_count = None previous_sizes = None previous_warning_count = None - if self.do_deltas_report(compilation_result=compilation_result, - current_sizes=current_sizes, - current_warnings=current_warning_count): + if self.do_deltas_report( + compilation_result=compilation_result, current_sizes=current_sizes, current_warnings=current_warning_count + ): # Get data for the sketch at the base ref # Get the head ref repository = git.Repo(path=os.environ["GITHUB_WORKSPACE"]) @@ -930,29 +983,28 @@ def get_sketch_report(self, compilation_result): # Compile the sketch again print("Compiling previous version of sketch to determine memory usage change") - previous_compilation_result = self.compile_sketch(sketch_path=compilation_result.sketch, - clean_build_cache=self.enable_warnings_report) + previous_compilation_result = self.compile_sketch( + sketch_path=compilation_result.sketch, clean_build_cache=self.enable_warnings_report + ) # git checkout the head ref to return the repository to its previous state repository.git.checkout(original_git_ref, recurse_submodules=True) previous_sizes = self.get_sizes_from_output(compilation_result=previous_compilation_result) if self.enable_warnings_report: - previous_warning_count = ( - self.get_warning_count_from_output(compilation_result=previous_compilation_result) + previous_warning_count = self.get_warning_count_from_output( + compilation_result=previous_compilation_result ) # Add global data for sketch to report sketch_report = { self.ReportKeys.name: str(path_relative_to_workspace(path=compilation_result.sketch)), self.ReportKeys.compilation_success: compilation_result.success, - self.ReportKeys.sizes: self.get_sizes_report(current_sizes=current_sizes, - previous_sizes=previous_sizes), + self.ReportKeys.sizes: self.get_sizes_report(current_sizes=current_sizes, previous_sizes=previous_sizes), } if self.enable_warnings_report: - sketch_report[self.ReportKeys.warnings] = ( - self.get_warnings_report(current_warnings=current_warning_count, - previous_warnings=previous_warning_count) + sketch_report[self.ReportKeys.warnings] = self.get_warnings_report( + current_warnings=current_warning_count, previous_warnings=previous_warning_count ) return sketch_report @@ -973,8 +1025,8 @@ def get_sizes_from_output(self, compilation_result): # The regular expression for the total memory self.ReportKeys.maximum: ( r"Sketch uses [0-9]+ bytes .*of program storage space\. Maximum is ([0-9]+) bytes." - ) - } + ), + }, }, { "name": "RAM for global variables", @@ -982,9 +1034,9 @@ def get_sizes_from_output(self, compilation_result): self.ReportKeys.absolute: r"Global variables use ([0-9]+) bytes .*of dynamic memory", self.ReportKeys.maximum: ( r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." - ) - } - } + ), + }, + }, ] sizes = [] @@ -994,26 +1046,30 @@ def get_sizes_from_output(self, compilation_result): # Set default memory usage value, to be used if memory usage can't be determined self.ReportKeys.absolute: self.not_applicable_indicator, self.ReportKeys.maximum: self.not_applicable_indicator, - self.ReportKeys.relative: self.not_applicable_indicator + self.ReportKeys.relative: self.not_applicable_indicator, } if compilation_result.success is True: # Determine memory usage of the sketch by parsing Arduino CLI's output - size_data = self.get_size_data_from_output(compilation_output=compilation_result.output, - memory_type=memory_type, - size_data_type=self.ReportKeys.absolute) + size_data = self.get_size_data_from_output( + compilation_output=compilation_result.output, + memory_type=memory_type, + size_data_type=self.ReportKeys.absolute, + ) if size_data: size[self.ReportKeys.absolute] = size_data - size_data = self.get_size_data_from_output(compilation_output=compilation_result.output, - memory_type=memory_type, - size_data_type=self.ReportKeys.maximum) + size_data = self.get_size_data_from_output( + compilation_output=compilation_result.output, + memory_type=memory_type, + size_data_type=self.ReportKeys.maximum, + ) if size_data: size[self.ReportKeys.maximum] = size_data size[self.ReportKeys.relative] = round( (100 * size[self.ReportKeys.absolute] / size[self.ReportKeys.maximum]), - self.relative_size_report_decimal_places + self.relative_size_report_decimal_places, ) sizes.append(size) @@ -1043,7 +1099,9 @@ def get_size_data_from_output(self, compilation_output, memory_type, size_data_t # - upload.maximum_size is not defined in boards.txt # RAM usage will not be reported in the Arduino CLI output self.verbose_print( - "::warning::Unable to determine the: \"" + size_data_type + "\" value for memory type: \"" + '::warning::Unable to determine the: "' + + size_data_type + + '" value for memory type: "' + memory_type["name"] + "\". The board's platform may not have been configured to provide this information." ) @@ -1077,12 +1135,8 @@ def do_deltas_report(self, compilation_result, current_sizes, current_warnings): self.enable_deltas_report and compilation_result.success and ( - any(size.get(self.ReportKeys.absolute) != self.not_applicable_indicator for - size in current_sizes) - or ( - current_warnings is not None - and current_warnings != self.not_applicable_indicator - ) + any(size.get(self.ReportKeys.absolute) != self.not_applicable_indicator for size in current_sizes) + or (current_warnings is not None and current_warnings != self.not_applicable_indicator) ) ) @@ -1092,12 +1146,14 @@ def checkout_deltas_base_ref(self): # git fetch the deltas base ref origin_remote = repository.remotes["origin"] - origin_remote.fetch(refspec=self.deltas_base_ref, - verbose=self.verbose, - no_tags=True, - prune=True, - depth=1, - recurse_submodules=True) + origin_remote.fetch( + refspec=self.deltas_base_ref, + verbose=self.verbose, + no_tags=True, + prune=True, + depth=1, + recurse_submodules=True, + ) # git checkout the deltas base ref repository.git.checkout(self.deltas_base_ref, recurse_submodules=True) @@ -1116,8 +1172,7 @@ def get_sizes_report(self, current_sizes, previous_sizes): sizes_report = [] for current_size, previous_size in zip(current_sizes, previous_sizes): - sizes_report.append(self.get_size_report(current_size=current_size, - previous_size=previous_size)) + sizes_report.append(self.get_size_report(current_size=current_size, previous_size=previous_size)) return sizes_report @@ -1134,8 +1189,8 @@ def get_size_report(self, current_size, previous_size): self.ReportKeys.maximum: current_size[self.ReportKeys.maximum], self.ReportKeys.current: { self.ReportKeys.absolute: current_size[self.ReportKeys.absolute], - self.ReportKeys.relative: current_size[self.ReportKeys.relative] - } + self.ReportKeys.relative: current_size[self.ReportKeys.relative], + }, } if previous_size is not None: @@ -1146,7 +1201,7 @@ def get_size_report(self, current_size, previous_size): ): absolute_delta = self.not_applicable_indicator else: - absolute_delta = (current_size[self.ReportKeys.absolute] - previous_size[self.ReportKeys.absolute]) + absolute_delta = current_size[self.ReportKeys.absolute] - previous_size[self.ReportKeys.absolute] if ( absolute_delta == self.not_applicable_indicator @@ -1155,8 +1210,10 @@ def get_size_report(self, current_size, previous_size): relative_delta = self.not_applicable_indicator else: # Calculate from absolute values to avoid rounding errors - relative_delta = round((100 * absolute_delta / size_report[self.ReportKeys.maximum]), - self.relative_size_report_decimal_places) + relative_delta = round( + (100 * absolute_delta / size_report[self.ReportKeys.maximum]), + self.relative_size_report_decimal_places, + ) # Size deltas reports are enabled # Print the memory usage change data to the log @@ -1167,11 +1224,11 @@ def get_size_report(self, current_size, previous_size): size_report[self.ReportKeys.previous] = { self.ReportKeys.absolute: previous_size[self.ReportKeys.absolute], - self.ReportKeys.relative: previous_size[self.ReportKeys.relative] + self.ReportKeys.relative: previous_size[self.ReportKeys.relative], } size_report[self.ReportKeys.delta] = { self.ReportKeys.absolute: absolute_delta, - self.ReportKeys.relative: relative_delta + self.ReportKeys.relative: relative_delta, } return size_report @@ -1192,10 +1249,7 @@ def get_warnings_report(self, current_warnings, previous_warnings): if previous_warnings is not None: # Deltas reports are enabled # Calculate the change in the warnings count - if ( - current_warnings == self.not_applicable_indicator - or previous_warnings == self.not_applicable_indicator - ): + if current_warnings == self.not_applicable_indicator or previous_warnings == self.not_applicable_indicator: warnings_delta = self.not_applicable_indicator else: warnings_delta = current_warnings - previous_warnings @@ -1203,12 +1257,8 @@ def get_warnings_report(self, current_warnings, previous_warnings): # Print the warning count change to the log print("Change in compiler warning count:", warnings_delta) - warnings_report[self.ReportKeys.previous] = { - self.ReportKeys.absolute: previous_warnings - } - warnings_report[self.ReportKeys.delta] = { - self.ReportKeys.absolute: warnings_delta - } + warnings_report[self.ReportKeys.previous] = {self.ReportKeys.absolute: previous_warnings} + warnings_report[self.ReportKeys.delta] = {self.ReportKeys.absolute: warnings_delta} return warnings_report @@ -1222,19 +1272,13 @@ def get_sketches_report(self, sketch_report_list): sketches_report = { self.ReportKeys.commit_hash: current_git_ref, - self.ReportKeys.commit_url: ("https://github.com/" - + os.environ["GITHUB_REPOSITORY"] - + "/commit/" - + current_git_ref), + self.ReportKeys.commit_url: ( + "https://github.com/" + os.environ["GITHUB_REPOSITORY"] + "/commit/" + current_git_ref + ), # The action is currently designed to only compile for one board per run, so the boards list will only have # a single element, but this provides a report format that can accommodate the possible addition of multiple # boards support - self.ReportKeys.boards: [ - { - self.ReportKeys.board: self.fqbn, - self.ReportKeys.sketches: sketch_report_list - } - ] + self.ReportKeys.boards: [{self.ReportKeys.board: self.fqbn, self.ReportKeys.sketches: sketch_report_list}], } sizes_summary_report = self.get_sizes_summary_report(sketch_report_list=sketch_report_list) @@ -1256,92 +1300,74 @@ def get_sizes_summary_report(self, sketch_report_list): sizes_summary_report = [] for sketch_report in sketch_report_list: for size_report in sketch_report[self.ReportKeys.sizes]: - if self.ReportKeys.delta in size_report: - # Determine the sizes_summary_report index for this memory type - size_summary_report_index_list = [ - index for index, size_summary in enumerate(sizes_summary_report) - if size_summary.get(self.ReportKeys.name) == size_report[self.ReportKeys.name] - ] - if not size_summary_report_index_list: - # There is no existing entry in the summary list for this memory type, so create one - sizes_summary_report.append( - { - self.ReportKeys.name: size_report[self.ReportKeys.name], - self.ReportKeys.maximum: size_report[self.ReportKeys.maximum], - self.ReportKeys.delta: { - self.ReportKeys.absolute: { - self.ReportKeys.minimum: size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute], - self.ReportKeys.maximum: size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute] - }, - self.ReportKeys.relative: { - self.ReportKeys.minimum: size_report[self.ReportKeys.delta][ - self.ReportKeys.relative], - self.ReportKeys.maximum: size_report[self.ReportKeys.delta][ - self.ReportKeys.relative] - }, - } - } - ) - else: - size_summary_report_index = size_summary_report_index_list[0] + # Determine the sizes_summary_report index for this memory type + size_summary_report_index_list = [ + index + for index, size_summary in enumerate(sizes_summary_report) + if size_summary.get(self.ReportKeys.name) == size_report[self.ReportKeys.name] + ] + if not size_summary_report_index_list: + # There is no existing entry in the summary list for this memory type, so create one + sizes_summary_report.append({self.ReportKeys.name: size_report[self.ReportKeys.name]}) + size_summary_report_index = len(sizes_summary_report) - 1 + else: + size_summary_report_index = size_summary_report_index_list[0] - if ( - sizes_summary_report[size_summary_report_index][ - self.ReportKeys.maximum] == self.not_applicable_indicator - ): - sizes_summary_report[size_summary_report_index][ - self.ReportKeys.maximum] = size_report[self.ReportKeys.maximum] + if ( + self.ReportKeys.maximum not in sizes_summary_report[size_summary_report_index] + or sizes_summary_report[size_summary_report_index][self.ReportKeys.maximum] + == self.not_applicable_indicator + ): + sizes_summary_report[size_summary_report_index][self.ReportKeys.maximum] = size_report[ + self.ReportKeys.maximum + ] + if self.ReportKeys.delta in size_report: + if ( + self.ReportKeys.delta not in sizes_summary_report[size_summary_report_index] + or sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ + self.ReportKeys.absolute + ][self.ReportKeys.minimum] + == self.not_applicable_indicator + ): + sizes_summary_report[size_summary_report_index][self.ReportKeys.delta] = { + self.ReportKeys.absolute: { + self.ReportKeys.minimum: size_report[self.ReportKeys.delta][self.ReportKeys.absolute], + self.ReportKeys.maximum: size_report[self.ReportKeys.delta][self.ReportKeys.absolute], + }, + self.ReportKeys.relative: { + self.ReportKeys.minimum: size_report[self.ReportKeys.delta][self.ReportKeys.relative], + self.ReportKeys.maximum: size_report[self.ReportKeys.delta][self.ReportKeys.relative], + }, + } + elif size_report[self.ReportKeys.delta][self.ReportKeys.absolute] != self.not_applicable_indicator: if ( - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.minimum] == self.not_applicable_indicator + size_report[self.ReportKeys.delta][self.ReportKeys.absolute] + < sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ + self.ReportKeys.absolute + ][self.ReportKeys.minimum] ): sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute] + self.ReportKeys.absolute + ][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][self.ReportKeys.absolute] sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.relative] + self.ReportKeys.relative + ][self.ReportKeys.minimum] = size_report[self.ReportKeys.delta][self.ReportKeys.relative] + if ( + size_report[self.ReportKeys.delta][self.ReportKeys.absolute] + > sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ + self.ReportKeys.absolute + ][self.ReportKeys.maximum] + ): sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.absolute] + self.ReportKeys.absolute + ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][self.ReportKeys.absolute] sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][ - self.ReportKeys.relative] - - elif size_report[self.ReportKeys.delta][self.ReportKeys.absolute] != ( - self.not_applicable_indicator - ): - if (size_report[self.ReportKeys.delta][self.ReportKeys.absolute] - < sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.minimum]): - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.minimum] = ( - size_report[self.ReportKeys.delta][self.ReportKeys.absolute] - ) - - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative][self.ReportKeys.minimum] = ( - size_report[self.ReportKeys.delta][self.ReportKeys.relative] - ) - - if (size_report[self.ReportKeys.delta][self.ReportKeys.absolute] - > sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.maximum]): - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.absolute][self.ReportKeys.maximum] = ( - size_report[self.ReportKeys.delta][self.ReportKeys.absolute] - ) - - sizes_summary_report[size_summary_report_index][self.ReportKeys.delta][ - self.ReportKeys.relative][self.ReportKeys.maximum] = ( - size_report[self.ReportKeys.delta][self.ReportKeys.relative] - ) + self.ReportKeys.relative + ][self.ReportKeys.maximum] = size_report[self.ReportKeys.delta][self.ReportKeys.relative] return sizes_summary_report @@ -1358,14 +1384,11 @@ def get_warnings_summary_report(self, sketch_report_list): self.ReportKeys.warnings in sketch_report and self.ReportKeys.delta in sketch_report[self.ReportKeys.warnings] ): - sketch_report_delta = ( - sketch_report[self.ReportKeys.warnings][self.ReportKeys.delta][self.ReportKeys.absolute] - ) + sketch_report_delta = sketch_report[self.ReportKeys.warnings][self.ReportKeys.delta][ + self.ReportKeys.absolute + ] - if ( - summary_report_minimum is None - or summary_report_minimum == self.not_applicable_indicator - ): + if summary_report_minimum is None or summary_report_minimum == self.not_applicable_indicator: summary_report_minimum = sketch_report_delta elif ( sketch_report_delta != self.not_applicable_indicator @@ -1373,10 +1396,7 @@ def get_warnings_summary_report(self, sketch_report_list): ): summary_report_minimum = sketch_report_delta - if ( - summary_report_maximum is None - or summary_report_maximum == self.not_applicable_indicator - ): + if summary_report_maximum is None or summary_report_maximum == self.not_applicable_indicator: summary_report_maximum = sketch_report_delta elif ( sketch_report_delta != self.not_applicable_indicator @@ -1389,7 +1409,7 @@ def get_warnings_summary_report(self, sketch_report_list): self.ReportKeys.delta: { self.ReportKeys.absolute: { self.ReportKeys.minimum: summary_report_minimum, - self.ReportKeys.maximum: summary_report_maximum + self.ReportKeys.maximum: summary_report_maximum, } } } @@ -1412,94 +1432,79 @@ def create_sketches_report_file(self, sketches_report): sketches_report_path.mkdir(parents=True, exist_ok=True) # Write the memory usage data to a file named according to the FQBN - with open(file=sketches_report_path.joinpath(self.fqbn.replace(":", "-") + ".json"), mode="w", - encoding="utf-8") as report_file: + with open( + file=sketches_report_path.joinpath(self.fqbn.replace(":", "-") + ".json"), mode="w", encoding="utf-8" + ) as report_file: json.dump(obj=sketches_report, fp=report_file, indent=2) - def cli_json_key(self, command, original_key_name): + def cli_core_list_platform_list(self, data): + """Extract the list of platform data from the `arduino-cli core list` command output according to the Arduino + CLI version in use. + + Keyword arguments: + data -- Arduino CLI command output data + """ + # Interface was changed at this Arduino CLI release: + # https://arduino.github.io/arduino-cli/dev/UPGRADING/#cli-changed-json-output-for-some-lib-core-config-board-and-sketch-commands + first_new_interface_version = "1.0.0" + + if ( + not semver.VersionInfo.is_valid(version=self.cli_version) + or semver.Version.parse(version=self.cli_version).compare(other=first_new_interface_version) >= 0 + ): + # cli_version is either "latest" (which will now always be >=1.0.0) or an explicit version >=1.0.0 + + # Workaround for https://github.com/arduino/arduino-cli/issues/2690 + if data["platforms"] is None: + return [] + + return data["platforms"] + + return data + + def cli_json_key(self, command, key_name): """Return the appropriate JSON output key name for the Arduino CLI version in use. Keyword arguments: command -- Arduino CLI command (e.g., "core list") - original_key_name -- key name used by the original Arduino CLI JSON interface + key_name -- key name used by the current Arduino CLI JSON interface """ - final_original_interface_version = "0.17.0" # Interface was changed in the next Arduino CLI release - - key_translation = { - "board details": { - "identification_pref": "identification_prefs", - "usbID": "usb_id", - "PID": "pid", - "VID": "vid", - "websiteURL": "website_url", - "archiveFileName": "archive_filename", - "propertiesId": "properties_id", - "toolsDependencies": "tools_dependencies" - }, - "board list": { - "FQBN": "fqbn", - "VID": "vid", - "PID": "pid" - }, - "board listall": { - "FQBN": "fqbn", - "Email": "email", - "ID": "id", - "Installed": "installed", - "Latest": "latest", - "Name": "name", - "Maintainer": "maintainer", - "Website": "website" - }, - "board search": { - "FQBN": "fqbn", - "Email": "email", - "ID": "id", - "Installed": "installed", - "Latest": "latest", - "Name": "name", - "Maintainer": "maintainer", - "Website": "website" - }, + key_translations = { "core list": { - "Boards": "boards", - "Email": "email", - "ID": "id", - "Installed": "installed", - "Latest": "latest", - "Maintainer": "maintainer", - "Name": "name", - "Website": "website" - }, - "core search": { - "Boards": "boards", - "Email": "email", - "ID": "id", - "Latest": "latest", - "Maintainer": "maintainer", - "Name": "name", - "Website": "website" - }, - "lib deps": { - "versionRequired": "version_required", - "versionInstalled": "version_installed" - }, - "lib search": { - "archivefilename": "archive_filename", - "cachepath": "cache_path" + "id": [ + {"constraints": [">=0.0.0", "<=0.17.0"], "name": "ID"}, + # https://arduino.github.io/arduino-cli/dev/UPGRADING/#arduino-cli-json-output-breaking-changes + {"constraints": [">0.17.0"], "name": "id"}, + ], + "installed_version": [ + {"constraints": [">=0.0.0", "<=0.17.0"], "name": "Installed"}, + # https://arduino.github.io/arduino-cli/dev/UPGRADING/#arduino-cli-json-output-breaking-changes + {"constraints": [">0.17.0", "<1.0.0"], "name": "installed"}, + # https://arduino.github.io/arduino-cli/dev/UPGRADING/#cli-core-list-and-core-search-changed-json-output + {"constraints": [">=1.0.0"], "name": "installed_version"}, + ], } } - if ( - ( - not semver.VersionInfo.isvalid(version=self.cli_version) - or semver.compare(ver1=self.cli_version, ver2=final_original_interface_version) > 0 - ) - and (command in key_translation and original_key_name in key_translation[command]) - ): - return key_translation[command][original_key_name] + if not semver.VersionInfo.is_valid(version=self.cli_version): + # cli_version is "latest", so use the current key name + return key_name + + for translation in key_translations[command][key_name]: + match = True + for constraint in translation["constraints"]: + if not semver.Version.parse(version=self.cli_version).match(match_expr=constraint): + # The Arduino CLI version does not match the translation's version constraints + match = False + break + + if match: + # The Arduino CLI version matches the translation's version constraints + return translation["name"] - return original_key_name + raise RuntimeError( + f"Translation not implemented for `{key_name}` key of `arduino-cli {command}` for version {self.cli_version}" + ) # pragma: no cover def parse_list_input(list_input): diff --git a/compilesketches/requirements.txt b/compilesketches/requirements.txt deleted file mode 100644 index 6b8da46f..00000000 --- a/compilesketches/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -GitPython==3.1.2 -PyGithub==1.51 -PyYAML==5.3.1 -semver==2.13.0 diff --git a/compilesketches/tests/.coveragerc b/compilesketches/tests/.coveragerc deleted file mode 100644 index 9ca48dd2..00000000 --- a/compilesketches/tests/.coveragerc +++ /dev/null @@ -1,3 +0,0 @@ -[run] -omit = - */.venv/* diff --git a/compilesketches/tests/pytest.ini b/compilesketches/tests/pytest.ini deleted file mode 100644 index f0760026..00000000 --- a/compilesketches/tests/pytest.ini +++ /dev/null @@ -1,5 +0,0 @@ -[pytest] -filterwarnings = - error - ignore::DeprecationWarning - ignore::ResourceWarning diff --git a/compilesketches/tests/requirements.txt b/compilesketches/tests/requirements.txt deleted file mode 100644 index 958c80f2..00000000 --- a/compilesketches/tests/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ ---requirement ../requirements.txt -coverage==5.2.1 -pytest==5.4.2 -pytest-mock==3.1.0 diff --git a/compilesketches/tests/test_compilesketches.py b/compilesketches/tests/test_compilesketches.py index e19b8e3a..95ed1e12 100644 --- a/compilesketches/tests/test_compilesketches.py +++ b/compilesketches/tests/test_compilesketches.py @@ -32,22 +32,24 @@ def get_compilesketches_object( deltas_base_ref="foodeltasbaseref", enable_deltas_report="false", enable_warnings_report="false", - sketches_report_path="foo report_folder_name" + sketches_report_path="foo report_folder_name", ): - with unittest.mock.patch("compilesketches.CompileSketches.get_deltas_base_ref", - autospec=True, - return_value=deltas_base_ref): - compilesketches_object = compilesketches.CompileSketches(cli_version=cli_version, - fqbn_arg=fqbn_arg, - platforms=platforms, - libraries=libraries, - sketch_paths=sketch_paths, - cli_compile_flags=cli_compile_flags, - verbose=verbose, - github_token=github_token, - enable_deltas_report=enable_deltas_report, - enable_warnings_report=enable_warnings_report, - sketches_report_path=sketches_report_path) + with unittest.mock.patch( + "compilesketches.CompileSketches.get_deltas_base_ref", autospec=True, return_value=deltas_base_ref + ): + compilesketches_object = compilesketches.CompileSketches( + cli_version=cli_version, + fqbn_arg=fqbn_arg, + platforms=platforms, + libraries=libraries, + sketch_paths=sketch_paths, + cli_compile_flags=cli_compile_flags, + verbose=verbose, + github_token=github_token, + enable_deltas_report=enable_deltas_report, + enable_warnings_report=enable_warnings_report, + sketches_report_path=sketches_report_path, + ) compilesketches_object.github_api = github_api @@ -74,13 +76,19 @@ def directories_are_same(left_directory, right_directory): def test_directories_are_same(): assert directories_are_same(left_directory=test_data_path, right_directory=test_data_path) is True - assert directories_are_same( - left_directory=test_data_path.joinpath("HasSketches"), right_directory=test_data_path.joinpath("NoSketches") - ) is False - assert directories_are_same( - left_directory=test_data_path.joinpath("HasSketches", "NoSketches"), - right_directory=test_data_path.joinpath("NoSketches") - ) is False + assert ( + directories_are_same( + left_directory=test_data_path.joinpath("HasSketches"), right_directory=test_data_path.joinpath("NoSketches") + ) + is False + ) + assert ( + directories_are_same( + left_directory=test_data_path.joinpath("HasSketches", "NoSketches"), + right_directory=test_data_path.joinpath("NoSketches"), + ) + is False + ) @pytest.fixture @@ -126,8 +134,9 @@ def compile_sketches(self): @pytest.mark.parametrize("use_size_report_sketch", [True, False]) -def test_main_size_report_sketch_deprecation_warning(capsys, monkeypatch, setup_action_inputs, - stub_compilesketches_object, use_size_report_sketch): +def test_main_size_report_sketch_deprecation_warning( + capsys, monkeypatch, setup_action_inputs, stub_compilesketches_object, use_size_report_sketch +): if use_size_report_sketch: monkeypatch.setenv("INPUT_SIZE-REPORT-SKETCH", "foo") @@ -141,8 +150,9 @@ def test_main_size_report_sketch_deprecation_warning(capsys, monkeypatch, setup_ @pytest.mark.parametrize("use_enable_size_trends_report", [True, False]) -def test_main_enable_size_trends_report_deprecation_warning(capsys, monkeypatch, setup_action_inputs, - stub_compilesketches_object, use_enable_size_trends_report): +def test_main_enable_size_trends_report_deprecation_warning( + capsys, monkeypatch, setup_action_inputs, stub_compilesketches_object, use_enable_size_trends_report +): if use_enable_size_trends_report: monkeypatch.setenv("INPUT_ENABLE-SIZE-TRENDS-REPORT", "true") @@ -151,19 +161,18 @@ def test_main_enable_size_trends_report_deprecation_warning(capsys, monkeypatch, expected_output = "" if use_enable_size_trends_report: expected_output = ( - expected_output - + "::warning::The size trends report feature has been moved to a dedicated action. See the " - "documentation at " - "https://github.com/arduino/actions/tree/report-size-trends-action/libraries/report-size-trends" + expected_output + "::warning::The size trends report feature has been moved to a dedicated action. See the " + "documentation at " + "https://github.com/arduino/actions/tree/report-size-trends-action/libraries/report-size-trends" ) assert capsys.readouterr().out.strip() == expected_output @pytest.mark.parametrize("use_size_deltas_report_folder_name", [True, False]) -def test_main_size_deltas_report_folder_name_deprecation(capsys, monkeypatch, setup_action_inputs, - stub_compilesketches_object, - use_size_deltas_report_folder_name): +def test_main_size_deltas_report_folder_name_deprecation( + capsys, monkeypatch, setup_action_inputs, stub_compilesketches_object, use_size_deltas_report_folder_name +): size_deltas_report_folder_name = "foo-size-deltas-report-folder-name" if use_size_deltas_report_folder_name: monkeypatch.setenv("INPUT_SIZE-DELTAS-REPORT-FOLDER-NAME", size_deltas_report_folder_name) @@ -175,7 +184,7 @@ def test_main_size_deltas_report_folder_name_deprecation(capsys, monkeypatch, se expected_output = ( expected_output + "::warning::The size-deltas-report-folder-name input is deprecated. Use the equivalent input: " - "sketches-report-path instead." + "sketches-report-path instead." ) assert capsys.readouterr().out.strip() == expected_output @@ -189,8 +198,9 @@ def test_main_size_deltas_report_folder_name_deprecation(capsys, monkeypatch, se @pytest.mark.parametrize("use_enable_size_deltas_report", [True, False]) -def test_main_enable_size_deltas_report_deprecation(capsys, monkeypatch, setup_action_inputs, - stub_compilesketches_object, use_enable_size_deltas_report): +def test_main_enable_size_deltas_report_deprecation( + capsys, monkeypatch, setup_action_inputs, stub_compilesketches_object, use_enable_size_deltas_report +): enable_size_deltas_report = "foo-enable-size-deltas-report" if use_enable_size_deltas_report: monkeypatch.setenv("INPUT_ENABLE-SIZE-DELTAS-REPORT", enable_size_deltas_report) @@ -200,9 +210,8 @@ def test_main_enable_size_deltas_report_deprecation(capsys, monkeypatch, setup_a expected_output = "" if use_enable_size_deltas_report: expected_output = ( - expected_output - + "::warning::The enable-size-deltas-report input is deprecated. Use the equivalent input: " - "enable-deltas-report instead." + expected_output + "::warning::The enable-size-deltas-report input is deprecated. Use the equivalent input: " + "enable-deltas-report instead." ) assert capsys.readouterr().out.strip() == expected_output @@ -236,7 +245,7 @@ def compile_sketches(self): github_token=setup_action_inputs.github_token, enable_deltas_report=setup_action_inputs.enable_deltas_report, enable_warnings_report=setup_action_inputs.enable_warnings_report, - sketches_report_path=setup_action_inputs.sketches_report_path + sketches_report_path=setup_action_inputs.sketches_report_path, ) CompileSketches.compile_sketches.assert_called_once() @@ -249,8 +258,10 @@ def test_compilesketches(): platforms = unittest.mock.sentinel.platforms libraries = unittest.mock.sentinel.libraries sketch_paths = "examples/FooSketchPath examples/BarSketchPath" - expected_sketch_paths_list = [compilesketches.absolute_path(path="examples/FooSketchPath"), - compilesketches.absolute_path(path="examples/BarSketchPath")] + expected_sketch_paths_list = [ + compilesketches.absolute_path(path="examples/FooSketchPath"), + compilesketches.absolute_path(path="examples/BarSketchPath"), + ] cli_compile_flags = "- --foo\n- --bar" expected_cli_compile_flags = ["--foo", "--bar"] verbose = "false" @@ -260,12 +271,12 @@ def test_compilesketches(): enable_warnings_report = "true" sketches_report_path = "FooSketchesReportFolder" - with unittest.mock.patch("compilesketches.CompileSketches.get_deltas_base_ref", - autospec=True, - return_value=expected_deltas_base_ref): + with unittest.mock.patch( + "compilesketches.CompileSketches.get_deltas_base_ref", autospec=True, return_value=expected_deltas_base_ref + ): compile_sketches = compilesketches.CompileSketches( cli_version=cli_version, - fqbn_arg="\'\"" + expected_fqbn + "\" \"" + expected_additional_url + "\"\'", + fqbn_arg="'\"" + expected_fqbn + '" "' + expected_additional_url + "\"'", platforms=platforms, libraries=libraries, sketch_paths=sketch_paths, @@ -274,7 +285,7 @@ def test_compilesketches(): github_token=github_token, enable_deltas_report=enable_deltas_report, enable_warnings_report=enable_warnings_report, - sketches_report_path=sketches_report_path + sketches_report_path=sketches_report_path, ) assert compile_sketches.cli_version == cli_version @@ -292,8 +303,10 @@ def test_compilesketches(): assert get_compilesketches_object(cli_compile_flags="").cli_compile_flags is None assert get_compilesketches_object(cli_compile_flags="- --foo").cli_compile_flags == ["--foo"] - assert get_compilesketches_object(cli_compile_flags="- --foo\n- \"bar baz\"").cli_compile_flags == ["--foo", - "bar baz"] + assert get_compilesketches_object(cli_compile_flags='- --foo\n- "bar baz"').cli_compile_flags == [ + "--foo", + "bar baz", + ] # Test invalid enable_deltas_report value with pytest.raises(expected_exception=SystemExit, match="1"): @@ -308,16 +321,24 @@ def test_compilesketches(): assert compile_sketches.deltas_base_ref is None -@pytest.mark.parametrize("event_name, expected_ref", - [("pull_request", unittest.mock.sentinel.pull_request_base_ref), - ("push", unittest.mock.sentinel.parent_commit_ref)]) +@pytest.mark.parametrize( + "event_name, expected_ref", + [ + ("pull_request", unittest.mock.sentinel.pull_request_base_ref), + ("push", unittest.mock.sentinel.parent_commit_ref), + ], +) def test_get_deltas_base_ref(monkeypatch, mocker, event_name, expected_ref): monkeypatch.setenv("GITHUB_EVENT_NAME", event_name) - mocker.patch("compilesketches.CompileSketches.get_pull_request_base_ref", autospec=True, - return_value=unittest.mock.sentinel.pull_request_base_ref) - mocker.patch("compilesketches.get_parent_commit_ref", autospec=True, - return_value=unittest.mock.sentinel.parent_commit_ref) + mocker.patch( + "compilesketches.CompileSketches.get_pull_request_base_ref", + autospec=True, + return_value=unittest.mock.sentinel.pull_request_base_ref, + ) + mocker.patch( + "compilesketches.get_parent_commit_ref", autospec=True, return_value=unittest.mock.sentinel.parent_commit_ref + ) compile_sketches = get_compilesketches_object() @@ -327,6 +348,7 @@ def test_get_deltas_base_ref(monkeypatch, mocker, event_name, expected_ref): def test_get_pull_request_base_ref(monkeypatch, mocker): class Github: """Stub""" + ref = unittest.mock.sentinel.pull_request_base_ref def __init__(self): @@ -352,7 +374,9 @@ def get_pull(self, number): github_api_object.get_repo.assert_called_once_with(full_name_or_id=os.environ["GITHUB_REPOSITORY"]) github_api_object.get_pull.assert_called_once_with(number=42) # PR number is hardcoded into test file - mocker.patch.object(Github, "get_repo", side_effect=github.UnknownObjectException(status=42, data="foo")) + mocker.patch.object( + Github, "get_repo", side_effect=github.UnknownObjectException(status=42, data="foo", headers=None) + ) with pytest.raises(expected_exception=SystemExit, match="1"): compile_sketches.get_pull_request_base_ref() @@ -362,6 +386,7 @@ def test_get_parent_commit_ref(mocker): class Repo: """Stub""" + hexsha = parent_commit_ref def __init__(self): @@ -375,16 +400,19 @@ def __init__(self): git.Repo.assert_called_once_with(path=os.environ["GITHUB_WORKSPACE"]) -@pytest.mark.parametrize("enable_warnings_report, expected_clean_build_cache", - [("true", True), - ("false", False)]) -@pytest.mark.parametrize("compilation_success_list, expected_success", - [([True, True, True], True), - ([False, True, True], False), - ([True, False, True], False), - ([True, True, False], False)]) -def test_compile_sketches(mocker, enable_warnings_report, expected_clean_build_cache, compilation_success_list, - expected_success): +@pytest.mark.parametrize("enable_warnings_report, expected_clean_build_cache", [("true", True), ("false", False)]) +@pytest.mark.parametrize( + "compilation_success_list, expected_success", + [ + ([True, True, True], True), + ([False, True, True], False), + ([True, False, True], False), + ([True, True, False], False), + ], +) +def test_compile_sketches( + mocker, enable_warnings_report, expected_clean_build_cache, compilation_success_list, expected_success +): sketch_list = [unittest.mock.sentinel.sketch1, unittest.mock.sentinel.sketch2, unittest.mock.sentinel.sketch3] compilation_result_list = [] @@ -401,8 +429,7 @@ def test_compile_sketches(mocker, enable_warnings_report, expected_clean_build_c mocker.patch("compilesketches.CompileSketches.find_sketches", autospec=True, return_value=sketch_list) mocker.patch("compilesketches.CompileSketches.compile_sketch", autospec=True, side_effect=compilation_result_list) mocker.patch("compilesketches.CompileSketches.get_sketch_report", autospec=True, return_value=sketch_report) - mocker.patch("compilesketches.CompileSketches.get_sketches_report", autospec=True, - return_value=sketches_report) + mocker.patch("compilesketches.CompileSketches.get_sketches_report", autospec=True, return_value=sketches_report) mocker.patch("compilesketches.CompileSketches.create_sketches_report_file", autospec=True) if expected_success: @@ -420,21 +447,20 @@ def test_compile_sketches(mocker, enable_warnings_report, expected_clean_build_c get_sketch_report_calls = [] sketch_report_list = [] for sketch, compilation_result in zip(sketch_list, compilation_result_list): - compile_sketch_calls.append(unittest.mock.call(compile_sketches, - sketch_path=sketch, - clean_build_cache=expected_clean_build_cache)) - get_sketch_report_calls.append(unittest.mock.call(compile_sketches, - compilation_result=compilation_result)) + compile_sketch_calls.append( + unittest.mock.call(compile_sketches, sketch_path=sketch, clean_build_cache=expected_clean_build_cache) + ) + get_sketch_report_calls.append(unittest.mock.call(compile_sketches, compilation_result=compilation_result)) sketch_report_list.append(sketch_report) compile_sketches.compile_sketch.assert_has_calls(calls=compile_sketch_calls) compile_sketches.get_sketch_report.assert_has_calls(calls=get_sketch_report_calls) - compile_sketches.get_sketches_report.assert_called_once_with(compile_sketches, - sketch_report_list=sketch_report_list) + compile_sketches.get_sketches_report.assert_called_once_with( + compile_sketches, sketch_report_list=sketch_report_list + ) compile_sketches.create_sketches_report_file.assert_called_once_with( - compile_sketches, - sketches_report=sketches_report + compile_sketches, sketches_report=sketches_report ) @@ -458,7 +484,7 @@ def test_install_arduino_cli(mocker): url="https://downloads.arduino.cc/arduino-cli/arduino-cli_" + cli_version + "_Linux_64bit.tar.gz", source_path="arduino-cli", destination_parent_path=arduino_cli_installation_path, - force=False + force=False, ) assert os.environ["ARDUINO_DIRECTORIES_USER"] == str(arduino_cli_user_directory_path) @@ -483,12 +509,12 @@ def test_install_platforms(mocker, platforms): compile_sketches = get_compilesketches_object(platforms=platforms) - mocker.patch("compilesketches.CompileSketches.get_fqbn_platform_dependency", - autospec=True, - return_value=fqbn_platform_dependency) - mocker.patch("compilesketches.CompileSketches.sort_dependency_list", - autospec=True, - return_value=dependency_list) + mocker.patch( + "compilesketches.CompileSketches.get_fqbn_platform_dependency", + autospec=True, + return_value=fqbn_platform_dependency, + ) + mocker.patch("compilesketches.CompileSketches.sort_dependency_list", autospec=True, return_value=dependency_list) mocker.patch("compilesketches.CompileSketches.install_platforms_from_board_manager", autospec=True) mocker.patch("compilesketches.CompileSketches.install_platforms_from_path", autospec=True) mocker.patch("compilesketches.CompileSketches.install_platforms_from_repository", autospec=True) @@ -498,39 +524,39 @@ def test_install_platforms(mocker, platforms): if platforms == "": compile_sketches.install_platforms_from_board_manager.assert_called_once_with( - compile_sketches, - platform_list=[fqbn_platform_dependency] + compile_sketches, platform_list=[fqbn_platform_dependency] ) compile_sketches.install_platforms_from_path.assert_not_called() compile_sketches.install_platforms_from_repository.assert_not_called() compile_sketches.install_platforms_from_download.assert_not_called() else: compile_sketches.install_platforms_from_board_manager.assert_called_once_with( - compile_sketches, - platform_list=dependency_list_manager + compile_sketches, platform_list=dependency_list_manager ) compile_sketches.install_platforms_from_path.assert_called_once_with( - compile_sketches, - platform_list=dependency_list_path + compile_sketches, platform_list=dependency_list_path ) compile_sketches.install_platforms_from_repository.assert_called_once_with( - compile_sketches, - platform_list=dependency_list_repository + compile_sketches, platform_list=dependency_list_repository ) compile_sketches.install_platforms_from_download.assert_called_once_with( - compile_sketches, - platform_list=dependency_list_download + compile_sketches, platform_list=dependency_list_download ) @pytest.mark.parametrize( "fqbn_arg, expected_platform, expected_additional_url", - [("arduino:avr:uno", "arduino:avr", None), - # FQBN with space, additional Board Manager URL - ('\'"foo bar:baz:asdf" "https://example.com/platform_foo_index.json"\'', "foo bar:baz", - "https://example.com/platform_foo_index.json"), - # Custom board option - ("arduino:avr:nano:cpu=atmega328old", "arduino:avr", None)] + [ + ("arduino:avr:uno", "arduino:avr", None), + # FQBN with space, additional Board Manager URL + ( + '\'"foo bar:baz:asdf" "https://example.com/platform_foo_index.json"\'', + "foo bar:baz", + "https://example.com/platform_foo_index.json", + ), + # Custom board option + ("arduino:avr:nano:cpu=atmega328old", "arduino:avr", None), + ], ) def test_get_fqbn_platform_dependency(fqbn_arg, expected_platform, expected_additional_url): compile_sketches = get_compilesketches_object(fqbn_arg=fqbn_arg) @@ -546,86 +572,125 @@ def test_get_fqbn_platform_dependency(fqbn_arg, expected_platform, expected_addi @pytest.mark.parametrize( "dependency_list, expected_dependency_type_list", - [([None], []), - ([{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar.git"}], ["repository"]), - ( - [{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar.git/"}], - ["repository"]), - ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}], ["repository"]), - ([{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar"}], ["download"]), - ([{compilesketches.CompileSketches.dependency_source_path_key: "foo/bar"}], ["path"]), - ([{compilesketches.CompileSketches.dependency_name_key: "FooBar"}], ["manager"]), - ([{compilesketches.CompileSketches.dependency_name_key: "FooBar", - compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_foo_index.json"}], - ["manager"]), - ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}, - {compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar"}, - {compilesketches.CompileSketches.dependency_source_path_key: "foo/bar"}, - {compilesketches.CompileSketches.dependency_name_key: "FooBar"}], - ["repository", "download", "path", "manager"]), - ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}], ["repository"]), - ] + [ + ([None], []), + ( + [{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar.git"}], + ["repository"], + ), + ( + [{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar.git/"}], + ["repository"], + ), + ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}], ["repository"]), + ([{compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar"}], ["download"]), + ([{compilesketches.CompileSketches.dependency_source_path_key: "foo/bar"}], ["path"]), + ([{compilesketches.CompileSketches.dependency_name_key: "FooBar"}], ["manager"]), + ( + [ + { + compilesketches.CompileSketches.dependency_name_key: "FooBar", + compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_foo_index.json", + } + ], + ["manager"], + ), + ( + [ + {compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}, + {compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/foo/bar"}, + {compilesketches.CompileSketches.dependency_source_path_key: "foo/bar"}, + {compilesketches.CompileSketches.dependency_name_key: "FooBar"}, + ], + ["repository", "download", "path", "manager"], + ), + ([{compilesketches.CompileSketches.dependency_source_url_key: "git://example.com/foo/bar"}], ["repository"]), + ], ) def test_sort_dependency_list(dependency_list, expected_dependency_type_list): compile_sketches = get_compilesketches_object() for dependency, expected_dependency_type in zip(dependency_list, expected_dependency_type_list): - assert dependency in getattr(compile_sketches.sort_dependency_list(dependency_list=[dependency]), - expected_dependency_type) + assert dependency in getattr( + compile_sketches.sort_dependency_list(dependency_list=[dependency]), expected_dependency_type + ) @pytest.mark.parametrize( "platform_list, expected_core_update_index_command_list, expected_core_install_command_list", - [( - [{compilesketches.CompileSketches.dependency_name_key: "Foo"}, - {compilesketches.CompileSketches.dependency_name_key: "Bar"}], - [["core", "update-index"], ["core", "update-index"]], - [["core", "install", "Foo"], ["core", "install", "Bar"]] - ), ( - # Additional Board Manager URL - [{compilesketches.CompileSketches.dependency_name_key: "Foo", - compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_foo_index.json"}, - {compilesketches.CompileSketches.dependency_name_key: "Bar", - compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_bar_index.json"}], - [["core", "update-index", "--additional-urls", "https://example.com/package_foo_index.json"], - ["core", "update-index", "--additional-urls", "https://example.com/package_bar_index.json"]], - [["core", "install", "--additional-urls", "https://example.com/package_foo_index.json", "Foo"], - ["core", "install", "--additional-urls", "https://example.com/package_bar_index.json", "Bar"]] - )]) -def test_install_platforms_from_board_manager(mocker, - platform_list, - expected_core_update_index_command_list, - expected_core_install_command_list): + [ + ( + [ + {compilesketches.CompileSketches.dependency_name_key: "Foo"}, + {compilesketches.CompileSketches.dependency_name_key: "Bar"}, + ], + [["core", "update-index"], ["core", "update-index"]], + [["core", "install", "Foo"], ["core", "install", "Bar"]], + ), + ( + # Additional Board Manager URL + [ + { + compilesketches.CompileSketches.dependency_name_key: "Foo", + compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_foo_index.json", + }, + { + compilesketches.CompileSketches.dependency_name_key: "Bar", + compilesketches.CompileSketches.dependency_source_url_key: "https://example.com/package_bar_index.json", + }, + ], + [ + ["core", "update-index", "--additional-urls", "https://example.com/package_foo_index.json"], + ["core", "update-index", "--additional-urls", "https://example.com/package_bar_index.json"], + ], + [ + ["core", "install", "--additional-urls", "https://example.com/package_foo_index.json", "Foo"], + ["core", "install", "--additional-urls", "https://example.com/package_bar_index.json", "Bar"], + ], + ), + ], +) +def test_install_platforms_from_board_manager( + mocker, platform_list, expected_core_update_index_command_list, expected_core_install_command_list +): run_command_output_level = unittest.mock.sentinel.run_command_output_level compile_sketches = get_compilesketches_object() - mocker.patch("compilesketches.CompileSketches.get_run_command_output_level", autospec=True, - return_value=run_command_output_level) + mocker.patch( + "compilesketches.CompileSketches.get_run_command_output_level", + autospec=True, + return_value=run_command_output_level, + ) mocker.patch("compilesketches.CompileSketches.run_arduino_cli_command", autospec=True) compile_sketches.install_platforms_from_board_manager(platform_list=platform_list) run_arduino_cli_command_calls = [] for expected_core_update_index_command, expected_core_install_command in zip( - expected_core_update_index_command_list, - expected_core_install_command_list + expected_core_update_index_command_list, expected_core_install_command_list ): - run_arduino_cli_command_calls.extend([ - unittest.mock.call(compile_sketches, - command=expected_core_update_index_command, - enable_output=run_command_output_level), - unittest.mock.call(compile_sketches, - command=expected_core_install_command, - enable_output=run_command_output_level) - ]) + run_arduino_cli_command_calls.extend( + [ + unittest.mock.call( + compile_sketches, command=expected_core_update_index_command, enable_output=run_command_output_level + ), + unittest.mock.call( + compile_sketches, command=expected_core_install_command, enable_output=run_command_output_level + ), + ] + ) compile_sketches.run_arduino_cli_command.assert_has_calls(calls=run_arduino_cli_command_calls) -@pytest.mark.parametrize("verbose, expected_output_level", - [("true", compilesketches.CompileSketches.RunCommandOutput.ALWAYS), - ("false", compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE)]) +@pytest.mark.parametrize( + "verbose, expected_output_level", + [ + ("true", compilesketches.CompileSketches.RunCommandOutput.ALWAYS), + ("false", compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE), + ], +) def test_get_run_command_output_level(verbose, expected_output_level): compile_sketches = get_compilesketches_object(verbose=verbose) @@ -647,9 +712,12 @@ def test_run_arduino_cli_command(mocker, verbose): mocker.patch("compilesketches.CompileSketches.run_command", autospec=True, return_value=run_command_return) - assert compile_sketches.run_arduino_cli_command(command=command, - enable_output=enable_output, - exit_on_failure=exit_on_failure) == run_command_return + assert ( + compile_sketches.run_arduino_cli_command( + command=command, enable_output=enable_output, exit_on_failure=exit_on_failure + ) + == run_command_return + ) expected_run_command_command = [arduino_cli_installation_path.joinpath("arduino-cli")] expected_run_command_command.extend(command) @@ -659,18 +727,22 @@ def test_run_arduino_cli_command(mocker, verbose): compile_sketches, command=expected_run_command_command, enable_output=enable_output, - exit_on_failure=exit_on_failure + exit_on_failure=exit_on_failure, ) -@pytest.mark.parametrize("enable_output", [compilesketches.CompileSketches.RunCommandOutput.NONE, - compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE, - compilesketches.CompileSketches.RunCommandOutput.ALWAYS]) -@pytest.mark.parametrize("exit_on_failure, returncode, expected_success", - [(False, 0, True), - (False, 1, True), - (True, 0, True), - (True, 1, False)]) +@pytest.mark.parametrize( + "enable_output", + [ + compilesketches.CompileSketches.RunCommandOutput.NONE, + compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE, + compilesketches.CompileSketches.RunCommandOutput.ALWAYS, + ], +) +@pytest.mark.parametrize( + "exit_on_failure, returncode, expected_success", + [(False, 0, True), (False, 1, True), (True, 0, True), (True, 1, False)], +) def test_run_command(capsys, mocker, enable_output, exit_on_failure, returncode, expected_success): command = unittest.mock.sentinel.command @@ -688,23 +760,28 @@ class CommandData: mocker.patch("subprocess.run", autospec=True, return_value=command_data) if expected_success: - run_command_output = compile_sketches.run_command(command=command, - enable_output=enable_output, - exit_on_failure=exit_on_failure) + run_command_output = compile_sketches.run_command( + command=command, enable_output=enable_output, exit_on_failure=exit_on_failure + ) assert run_command_output == command_data else: with pytest.raises(expected_exception=SystemExit, match=str(returncode)): - compile_sketches.run_command(command=command, - enable_output=enable_output, - exit_on_failure=exit_on_failure) - - expected_output = ("::group::Running command: " + " ".join(command_data.args) + " \n " - + str(CommandData.stdout) + " \n " - + "::endgroup::") + compile_sketches.run_command(command=command, enable_output=enable_output, exit_on_failure=exit_on_failure) + + expected_output = ( + "::group::Running command: " + + " ".join(command_data.args) + + " \n " + + str(CommandData.stdout) + + " \n " + + "::endgroup::" + ) - if returncode != 0 and (enable_output == compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE - or enable_output == compilesketches.CompileSketches.RunCommandOutput.ALWAYS): + if returncode != 0 and ( + enable_output == compilesketches.CompileSketches.RunCommandOutput.ON_FAILURE + or enable_output == compilesketches.CompileSketches.RunCommandOutput.ALWAYS + ): expected_output = expected_output + "\n::error::Command failed" elif enable_output == compilesketches.CompileSketches.RunCommandOutput.ALWAYS: expected_output = expected_output @@ -718,12 +795,25 @@ class CommandData: @pytest.mark.parametrize( "dependency, expected_name", - [({compilesketches.CompileSketches.dependency_name_key: "Foo", - compilesketches.CompileSketches.dependency_version_key: "1.2.3"}, "Foo@1.2.3"), - ({compilesketches.CompileSketches.dependency_name_key: "Foo", - compilesketches.CompileSketches.dependency_version_key: "latest"}, "Foo"), - ({compilesketches.CompileSketches.dependency_name_key: "Foo@1.2.3"}, "Foo@1.2.3"), - ({compilesketches.CompileSketches.dependency_name_key: "Foo"}, "Foo")]) + [ + ( + { + compilesketches.CompileSketches.dependency_name_key: "Foo", + compilesketches.CompileSketches.dependency_version_key: "1.2.3", + }, + "Foo@1.2.3", + ), + ( + { + compilesketches.CompileSketches.dependency_name_key: "Foo", + compilesketches.CompileSketches.dependency_version_key: "latest", + }, + "Foo", + ), + ({compilesketches.CompileSketches.dependency_name_key: "Foo@1.2.3"}, "Foo@1.2.3"), + ({compilesketches.CompileSketches.dependency_name_key: "Foo"}, "Foo"), + ], +) def test_get_manager_dependency_name(dependency, expected_name): compile_sketches = get_compilesketches_object() assert compile_sketches.get_manager_dependency_name(dependency=dependency) == expected_name @@ -731,8 +821,10 @@ def test_get_manager_dependency_name(dependency, expected_name): @pytest.mark.parametrize( "path_exists, platform_list", - [(False, [{compilesketches.CompileSketches.dependency_source_path_key: pathlib.Path("Foo")}]), - (True, [{compilesketches.CompileSketches.dependency_source_path_key: pathlib.Path("Foo")}])] + [ + (False, [{compilesketches.CompileSketches.dependency_source_path_key: pathlib.Path("Foo")}]), + (True, [{compilesketches.CompileSketches.dependency_source_path_key: pathlib.Path("Foo")}]), + ], ) def test_install_platforms_from_path(capsys, mocker, path_exists, platform_list): class PlatformInstallationPath: @@ -746,9 +838,11 @@ def __init__(self): compile_sketches = get_compilesketches_object() mocker.patch.object(pathlib.Path, "exists", autospec=True, return_value=path_exists) - mocker.patch("compilesketches.CompileSketches.get_platform_installation_path", - autospec=True, - return_value=platform_installation_path) + mocker.patch( + "compilesketches.CompileSketches.get_platform_installation_path", + autospec=True, + return_value=platform_installation_path, + ) mocker.patch("compilesketches.CompileSketches.install_from_path", autospec=True) if not path_exists: @@ -776,7 +870,7 @@ def __init__(self): ), destination_parent_path=platform_installation_path.path.parent, destination_name=platform_installation_path.path.name, - force=platform_installation_path.is_overwrite + force=platform_installation_path.is_overwrite, ) ) @@ -787,22 +881,23 @@ def __init__(self): @pytest.mark.parametrize( - "platform," - "command_data_stdout," - "expected_installation_path", + "platform," "command_data_stdout," "expected_installation_path", # No match to previously installed platforms - [({compilesketches.CompileSketches.dependency_name_key: "foo:bar"}, - "[{\"ID\": \"asdf:zxcv\"}]", - pathlib.PurePath("/foo/UserPlatformsPath/foo/bar")), - # Match with previously installed platform - ({compilesketches.CompileSketches.dependency_name_key: "foo:bar"}, - "[{\"ID\": \"foo:bar\", \"Installed\": \"1.2.3\"}]", - pathlib.PurePath("/foo/BoardManagerPlatformsPath/foo/hardware/bar/1.2.3"))] + [ + ( + {compilesketches.CompileSketches.dependency_name_key: "foo:bar"}, + '[{"ID": "asdf:zxcv"}]', + pathlib.PurePath("/foo/UserPlatformsPath/foo/bar"), + ), + # Match with previously installed platform + ( + {compilesketches.CompileSketches.dependency_name_key: "foo:bar"}, + '[{"ID": "foo:bar", "Installed": "1.2.3"}]', + pathlib.PurePath("/foo/BoardManagerPlatformsPath/foo/hardware/bar/1.2.3"), + ), + ], ) -def test_get_platform_installation_path(mocker, - platform, - command_data_stdout, - expected_installation_path): +def test_get_platform_installation_path(mocker, platform, command_data_stdout, expected_installation_path): class CommandData: def __init__(self, stdout): self.stdout = stdout @@ -818,17 +913,21 @@ def __init__(self, stdout): platform_installation_path = compile_sketches.get_platform_installation_path(platform=platform) assert platform_installation_path.path == expected_installation_path - run_arduino_cli_command_calls = [unittest.mock.call(compile_sketches, command=["core", "update-index"]), - unittest.mock.call(compile_sketches, command=["core", "list", "--format", "json"])] + run_arduino_cli_command_calls = [ + unittest.mock.call(compile_sketches, command=["core", "update-index"]), + unittest.mock.call(compile_sketches, command=["core", "list", "--format", "json"]), + ] compilesketches.CompileSketches.run_arduino_cli_command.assert_has_calls(calls=run_arduino_cli_command_calls) def test_install_platforms_from_repository(mocker): platform_list = [ - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url, - compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, - compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name}, - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2} + { + compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url, + compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, + compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name, + }, + {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2}, ] git_ref = unittest.mock.sentinel.git_ref @@ -847,9 +946,11 @@ def __init__(self): compile_sketches = get_compilesketches_object() mocker.patch("compilesketches.CompileSketches.get_repository_dependency_ref", autospec=True, return_value=git_ref) - mocker.patch("compilesketches.CompileSketches.get_platform_installation_path", - autospec=True, - return_value=platform_installation_path) + mocker.patch( + "compilesketches.CompileSketches.get_platform_installation_path", + autospec=True, + return_value=platform_installation_path, + ) mocker.patch("compilesketches.CompileSketches.install_from_repository", autospec=True, return_value=git_ref) compile_sketches.install_platforms_from_repository(platform_list=platform_list) @@ -857,19 +958,21 @@ def __init__(self): get_repository_dependency_ref_calls = [] get_platform_installation_path_calls = [] install_from_repository_calls = [] - for platform, expected_source_path, expected_destination_name in zip(platform_list, - expected_source_path_list, - expected_destination_name_list): + for platform, expected_source_path, expected_destination_name in zip( + platform_list, expected_source_path_list, expected_destination_name_list + ): get_repository_dependency_ref_calls.append(unittest.mock.call(compile_sketches, dependency=platform)) get_platform_installation_path_calls.append(unittest.mock.call(compile_sketches, platform=platform)) install_from_repository_calls.append( - unittest.mock.call(compile_sketches, - url=platform[compilesketches.CompileSketches.dependency_source_url_key], - git_ref=git_ref, - source_path=expected_source_path, - destination_parent_path=platform_installation_path.path.parent, - destination_name=platform_installation_path.path.name, - force=platform_installation_path.is_overwrite) + unittest.mock.call( + compile_sketches, + url=platform[compilesketches.CompileSketches.dependency_source_url_key], + git_ref=git_ref, + source_path=expected_source_path, + destination_parent_path=platform_installation_path.path.parent, + destination_name=platform_installation_path.path.name, + force=platform_installation_path.is_overwrite, + ) ) compile_sketches.get_repository_dependency_ref.assert_has_calls(calls=get_repository_dependency_ref_calls) @@ -878,8 +981,7 @@ def __init__(self): @pytest.mark.parametrize( "dependency, expected_ref", - [({compilesketches.CompileSketches.dependency_version_key: "1.2.3"}, "1.2.3"), - ({}, None)] + [({compilesketches.CompileSketches.dependency_version_key: "1.2.3"}, "1.2.3"), ({}, None)], ) def test_get_repository_dependency_ref(dependency, expected_ref): compile_sketches = get_compilesketches_object() @@ -888,10 +990,12 @@ def test_get_repository_dependency_ref(dependency, expected_ref): def test_install_platforms_from_download(mocker): platform_list = [ - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url1, - compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, - compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name}, - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2} + { + compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url1, + compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, + compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name, + }, + {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2}, ] class PlatformInstallationPath: @@ -906,75 +1010,98 @@ def __init__(self): compile_sketches = get_compilesketches_object() - mocker.patch("compilesketches.CompileSketches.get_platform_installation_path", - autospec=True, - return_value=platform_installation_path) + mocker.patch( + "compilesketches.CompileSketches.get_platform_installation_path", + autospec=True, + return_value=platform_installation_path, + ) mocker.patch("compilesketches.CompileSketches.install_from_download", autospec=True) compile_sketches.install_platforms_from_download(platform_list=platform_list) get_platform_installation_path_calls = [] install_from_download_calls = [] - for platform, expected_source_path, in zip(platform_list, expected_source_path_list): + for ( + platform, + expected_source_path, + ) in zip(platform_list, expected_source_path_list): get_platform_installation_path_calls.append(unittest.mock.call(compile_sketches, platform=platform)) install_from_download_calls.append( - unittest.mock.call(compile_sketches, - url=platform[compilesketches.CompileSketches.dependency_source_url_key], - source_path=expected_source_path, - destination_parent_path=platform_installation_path.path.parent, - destination_name=platform_installation_path.path.name, - force=platform_installation_path.is_overwrite) + unittest.mock.call( + compile_sketches, + url=platform[compilesketches.CompileSketches.dependency_source_url_key], + source_path=expected_source_path, + destination_parent_path=platform_installation_path.path.parent, + destination_name=platform_installation_path.path.name, + force=platform_installation_path.is_overwrite, + ) ) compile_sketches.install_from_download.assert_has_calls(calls=install_from_download_calls) @pytest.mark.parametrize( "libraries, expected_manager, expected_path, expected_repository, expected_download", - [("", - [], - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], - [], - []), - ("foo bar", - [{compilesketches.CompileSketches.dependency_name_key: "foo"}, - {compilesketches.CompileSketches.dependency_name_key: "bar"}], - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], - [], - []), - ("\"foo\" \"bar\"", - [{compilesketches.CompileSketches.dependency_name_key: "foo"}, - {compilesketches.CompileSketches.dependency_name_key: "bar"}], - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], - [], - []), - ("-", - [], - [], - [], - []), - ("- " + compilesketches.CompileSketches.dependency_name_key + ": foo", - [{compilesketches.CompileSketches.dependency_name_key: "foo"}], - [], - [], - []), - ("- " + compilesketches.CompileSketches.dependency_source_path_key + ": /foo/bar", - [], - [{compilesketches.CompileSketches.dependency_source_path_key: "/foo/bar"}], - [], - []), - ("- " + compilesketches.CompileSketches.dependency_source_url_key + ": https://example.com/foo.git", - [], - [], - [{"source-url": "https://example.com/foo.git"}], - []), - ("- " + compilesketches.CompileSketches.dependency_source_url_key + ": https://example.com/foo.zip", - [], - [], - [], - [{"source-url": "https://example.com/foo.zip"}])] + [ + ( + "", + [], + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], + [], + [], + ), + ( + "foo bar", + [ + {compilesketches.CompileSketches.dependency_name_key: "foo"}, + {compilesketches.CompileSketches.dependency_name_key: "bar"}, + ], + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], + [], + [], + ), + ( + '"foo" "bar"', + [ + {compilesketches.CompileSketches.dependency_name_key: "foo"}, + {compilesketches.CompileSketches.dependency_name_key: "bar"}, + ], + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], + [], + [], + ), + ("-", [], [], [], []), + ("[]", [], [], [], []), + ( + "- " + compilesketches.CompileSketches.dependency_name_key + ": foo", + [{compilesketches.CompileSketches.dependency_name_key: "foo"}], + [], + [], + [], + ), + ( + "- " + compilesketches.CompileSketches.dependency_source_path_key + ": /foo/bar", + [], + [{compilesketches.CompileSketches.dependency_source_path_key: "/foo/bar"}], + [], + [], + ), + ( + "- " + compilesketches.CompileSketches.dependency_source_url_key + ": https://example.com/foo.git", + [], + [], + [{"source-url": "https://example.com/foo.git"}], + [], + ), + ( + "- " + compilesketches.CompileSketches.dependency_source_url_key + ": https://example.com/foo.zip", + [], + [], + [], + [{"source-url": "https://example.com/foo.zip"}], + ), + ], ) -def test_install_libraries(mocker, libraries, expected_manager, expected_path, expected_repository, - expected_download): +def test_install_libraries(mocker, libraries, expected_manager, expected_path, expected_repository, expected_download): libraries_path = pathlib.Path("/foo/LibrariesPath") compile_sketches = get_compilesketches_object(libraries=libraries) @@ -989,29 +1116,29 @@ def test_install_libraries(mocker, libraries, expected_manager, expected_path, e if len(expected_manager) > 0: compile_sketches.install_libraries_from_library_manager.assert_called_once_with( - compile_sketches, - library_list=expected_manager) + compile_sketches, library_list=expected_manager + ) else: compile_sketches.install_libraries_from_library_manager.assert_not_called() if len(expected_path) > 0: compile_sketches.install_libraries_from_path.assert_called_once_with( - compile_sketches, - library_list=expected_path) + compile_sketches, library_list=expected_path + ) else: compile_sketches.install_libraries_from_path.assert_not_called() if len(expected_repository) > 0: compile_sketches.install_libraries_from_repository.assert_called_once_with( - compile_sketches, - library_list=expected_repository) + compile_sketches, library_list=expected_repository + ) else: compile_sketches.install_libraries_from_repository.assert_not_called() if len(expected_download) > 0: compile_sketches.install_libraries_from_download.assert_called_once_with( - compile_sketches, - library_list=expected_download) + compile_sketches, library_list=expected_download + ) else: compile_sketches.install_libraries_from_download.assert_not_called() @@ -1022,8 +1149,11 @@ def test_install_libraries_from_library_manager(mocker): library_list = [{compile_sketches.dependency_name_key: "foo"}, {compile_sketches.dependency_name_key: "bar"}] - mocker.patch("compilesketches.CompileSketches.get_run_command_output_level", autospec=True, - return_value=run_command_output_level) + mocker.patch( + "compilesketches.CompileSketches.get_run_command_output_level", + autospec=True, + return_value=run_command_output_level, + ) mocker.patch("compilesketches.CompileSketches.run_arduino_cli_command", autospec=True) compile_sketches.install_libraries_from_library_manager(library_list=library_list) @@ -1035,11 +1165,7 @@ def test_install_libraries_from_library_manager(mocker): lib_install_command = lib_install_base_command.copy() lib_install_command.append(library["name"]) run_arduino_cli_command_calls.append( - unittest.mock.call( - compile_sketches, - command=lib_install_command, - enable_output=run_command_output_level - ) + unittest.mock.call(compile_sketches, command=lib_install_command, enable_output=run_command_output_level) ) # noinspection PyUnresolvedReferences @@ -1048,22 +1174,43 @@ def test_install_libraries_from_library_manager(mocker): @pytest.mark.parametrize( "path_exists, library_list, expected_destination_name_list", - [(False, - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + "/Nonexistent"}], - []), - (True, - [{compilesketches.CompileSketches.dependency_destination_name_key: "FooName", - compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + "/FooLibrary"}], - ["FooName"]), - (True, - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], - ["FooRepoName"]), - (True, - [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + "/Bar"}], - [None])] + [ + ( + False, + [ + { + compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + + "/Nonexistent" + } + ], + [], + ), + ( + True, + [ + { + compilesketches.CompileSketches.dependency_destination_name_key: "FooName", + compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + + "/FooLibrary", + } + ], + ["FooName"], + ), + ( + True, + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"]}], + ["FooRepoName"], + ), + ( + True, + [{compilesketches.CompileSketches.dependency_source_path_key: os.environ["GITHUB_WORKSPACE"] + "/Bar"}], + [None], + ), + ], ) -def test_install_libraries_from_path(capsys, monkeypatch, mocker, path_exists, library_list, - expected_destination_name_list): +def test_install_libraries_from_path( + capsys, monkeypatch, mocker, path_exists, library_list, expected_destination_name_list +): libraries_path = pathlib.Path("/foo/LibrariesPath") monkeypatch.setenv("GITHUB_REPOSITORY", "foo/FooRepoName") @@ -1096,7 +1243,7 @@ def test_install_libraries_from_path(capsys, monkeypatch, mocker, path_exists, l ), destination_parent_path=libraries_path, destination_name=expected_destination_name, - force=True + force=True, ) ) @@ -1107,10 +1254,12 @@ def test_install_libraries_from_path(capsys, monkeypatch, mocker, path_exists, l def test_install_libraries_from_repository(mocker): git_ref = unittest.mock.sentinel.git_ref library_list = [ - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url, - compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, - compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name}, - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2} + { + compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url, + compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, + compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name, + }, + {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2}, ] expected_source_path_list = [unittest.mock.sentinel.source_path, "."] expected_destination_name_list = [unittest.mock.sentinel.destination_name, None] @@ -1124,18 +1273,20 @@ def test_install_libraries_from_repository(mocker): get_repository_dependency_ref_calls = [] install_from_repository_calls = [] - for library, expected_source_path, expected_destination_name in zip(library_list, - expected_source_path_list, - expected_destination_name_list): + for library, expected_source_path, expected_destination_name in zip( + library_list, expected_source_path_list, expected_destination_name_list + ): get_repository_dependency_ref_calls.append(unittest.mock.call(compile_sketches, dependency=library)) install_from_repository_calls.append( - unittest.mock.call(compile_sketches, - url=library[compilesketches.CompileSketches.dependency_source_url_key], - git_ref=git_ref, - source_path=expected_source_path, - destination_parent_path=compile_sketches.libraries_path, - destination_name=expected_destination_name, - force=True) + unittest.mock.call( + compile_sketches, + url=library[compilesketches.CompileSketches.dependency_source_url_key], + git_ref=git_ref, + source_path=expected_source_path, + destination_parent_path=compile_sketches.libraries_path, + destination_name=expected_destination_name, + force=True, + ) ) compile_sketches.get_repository_dependency_ref.assert_has_calls(calls=get_repository_dependency_ref_calls) @@ -1144,10 +1295,12 @@ def test_install_libraries_from_repository(mocker): def test_install_libraries_from_download(mocker): library_list = [ - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url1, - compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, - compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name}, - {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2} + { + compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url1, + compilesketches.CompileSketches.dependency_source_path_key: unittest.mock.sentinel.source_path, + compilesketches.CompileSketches.dependency_destination_name_key: unittest.mock.sentinel.destination_name, + }, + {compilesketches.CompileSketches.dependency_source_url_key: unittest.mock.sentinel.source_url2}, ] expected_source_path_list = [unittest.mock.sentinel.source_path, "."] @@ -1160,15 +1313,18 @@ def test_install_libraries_from_download(mocker): compile_sketches.install_libraries_from_download(library_list=library_list) install_libraries_from_download_calls = [] - for library, expected_source_path, expected_destination_name in zip(library_list, expected_source_path_list, - expected_destination_name_list): + for library, expected_source_path, expected_destination_name in zip( + library_list, expected_source_path_list, expected_destination_name_list + ): install_libraries_from_download_calls.append( - unittest.mock.call(compile_sketches, - url=library[compilesketches.CompileSketches.dependency_source_url_key], - source_path=expected_source_path, - destination_parent_path=compilesketches.CompileSketches.libraries_path, - destination_name=expected_destination_name, - force=True) + unittest.mock.call( + compile_sketches, + url=library[compilesketches.CompileSketches.dependency_source_url_key], + source_path=expected_source_path, + destination_parent_path=compilesketches.CompileSketches.libraries_path, + destination_name=expected_destination_name, + force=True, + ) ) compile_sketches.install_from_download.assert_has_calls(calls=install_libraries_from_download_calls) @@ -1177,9 +1333,7 @@ def test_find_sketches(capsys): nonexistent_sketch_path = "/foo/NonexistentSketch" # Test sketch path doesn't exist - compile_sketches = get_compilesketches_object( - sketch_paths="\'\"" + nonexistent_sketch_path + "\"\'" - ) + compile_sketches = get_compilesketches_object(sketch_paths="'\"" + nonexistent_sketch_path + "\"'") with pytest.raises(expected_exception=SystemExit, match="1"): compile_sketches.find_sketches() assert capsys.readouterr().out.strip() == ( @@ -1190,53 +1344,49 @@ def test_find_sketches(capsys): # Test sketch path is a sketch file compile_sketches = get_compilesketches_object( - sketch_paths="\'" + str(test_data_path.joinpath("HasSketches", "Sketch1", "Sketch1.ino")) + "\'" + sketch_paths="'" + str(test_data_path.joinpath("HasSketches", "Sketch1", "Sketch1.ino")) + "'" ) - assert compile_sketches.find_sketches() == [ - test_data_path.joinpath("HasSketches", "Sketch1") - ] + assert compile_sketches.find_sketches() == [test_data_path.joinpath("HasSketches", "Sketch1")] # Test sketch path is a non-sketch file non_sketch_path = str(test_data_path.joinpath("NoSketches", "NotSketch", "NotSketch.foo")) - compile_sketches = get_compilesketches_object(sketch_paths="\'" + non_sketch_path + "\'") + compile_sketches = get_compilesketches_object(sketch_paths="'" + non_sketch_path + "'") with pytest.raises(expected_exception=SystemExit, match="1"): compile_sketches.find_sketches() assert capsys.readouterr().out.strip() == ("::error::Sketch path: " + non_sketch_path + " is not a sketch") # Test sketch path is a sketch folder compile_sketches = get_compilesketches_object( - sketch_paths="\'" + str(test_data_path.joinpath("HasSketches", "Sketch1")) + "\'" + sketch_paths="'" + str(test_data_path.joinpath("HasSketches", "Sketch1")) + "'" ) - assert compile_sketches.find_sketches() == [ - test_data_path.joinpath("HasSketches", "Sketch1") - ] + assert compile_sketches.find_sketches() == [test_data_path.joinpath("HasSketches", "Sketch1")] # Test sketch path does contain sketches - compile_sketches = get_compilesketches_object( - sketch_paths="\'" + str(test_data_path.joinpath("HasSketches")) + "\'") + compile_sketches = get_compilesketches_object(sketch_paths="'" + str(test_data_path.joinpath("HasSketches")) + "'") assert compile_sketches.find_sketches() == [ test_data_path.joinpath("HasSketches", "Sketch1"), - test_data_path.joinpath("HasSketches", "Sketch2") + test_data_path.joinpath("HasSketches", "Sketch2"), ] # Test sketch path doesn't contain any sketches no_sketches_path = str(test_data_path.joinpath("NoSketches")) - compile_sketches = get_compilesketches_object( - sketch_paths="\'" + no_sketches_path + "\'") + compile_sketches = get_compilesketches_object(sketch_paths="'" + no_sketches_path + "'") with pytest.raises(expected_exception=SystemExit, match="1"): compile_sketches.find_sketches() - assert capsys.readouterr().out.strip() == ("::error::No sketches were found in " - + no_sketches_path) + assert capsys.readouterr().out.strip() == ("::error::No sketches were found in " + no_sketches_path) @pytest.mark.parametrize( "input_value, expected_list, expected_was_yaml_list", - [("", [], False), - ("foo", ["foo"], False), - ("\'\"foo bar\" baz\'", ["foo bar", "baz"], False), - ("foo: bar", ["foo:", "bar"], False), - ("-", [None], True), - ("- foo: asdf\n bar: qwer\n- baz: zxcv", [{"foo": "asdf", "bar": "qwer"}, {"baz": "zxcv"}], True)]) + [ + ("", [], False), + ("foo", ["foo"], False), + ("'\"foo bar\" baz'", ["foo bar", "baz"], False), + ("foo: bar", ["foo:", "bar"], False), + ("-", [None], True), + ("- foo: asdf\n bar: qwer\n- baz: zxcv", [{"foo": "asdf", "bar": "qwer"}, {"baz": "zxcv"}], True), + ], +) def test_get_list_from_multiformat_input(input_value, expected_list, expected_was_yaml_list): input_list = compilesketches.get_list_from_multiformat_input(input_value=input_value) assert input_list.value == expected_list @@ -1245,59 +1395,83 @@ def test_get_list_from_multiformat_input(input_value, expected_list, expected_wa # noinspection PyUnresolvedReferences @pytest.mark.parametrize( - "source_path, destination_parent_path, destination_name, expected_destination_path", - [(pathlib.Path("foo/source-path"), - pathlib.Path("bar/destination-parent-path"), - None, - pathlib.Path("bar/destination-parent-path/source-path")), - (pathlib.Path("foo/source-path"), - pathlib.Path("bar/destination-parent-path"), - "destination-name", - pathlib.Path("bar/destination-parent-path/destination-name"))]) -@pytest.mark.parametrize("exists", [True, False]) + "source_sub_path, destination_parent_sub_path, destination_name, expected_destination_sub_path", + [ + ("foo/source-path", "bar/destination-parent-path", None, "bar/destination-parent-path/source-path"), + ( + "foo/source-path", + "bar/destination-parent-path", + "destination-name", + "bar/destination-parent-path/destination-name", + ), + ], +) +@pytest.mark.parametrize("exists", ["no", "yes", "symlink", "broken"]) @pytest.mark.parametrize("force", [True, False]) @pytest.mark.parametrize("is_dir", [True, False]) -def test_install_from_path(capsys, - mocker, - source_path, - destination_parent_path, - destination_name, - expected_destination_path, - exists, - force, - is_dir): - is_dir = unittest.mock.sentinel.is_dir +def test_install_from_path( + capsys, + tmp_path, + source_sub_path, + destination_parent_sub_path, + destination_name, + expected_destination_sub_path, + exists, + force, + is_dir, +): + source_path = tmp_path.joinpath(source_sub_path) - compile_sketches = get_compilesketches_object() + # Generate source path + if is_dir: + source_path.mkdir(parents=True) + else: + source_path.parent.mkdir(parents=True, exist_ok=True) + source_path.touch() - mocker.patch.object(pathlib.Path, "exists", autospec=True, return_value=exists) - mocker.patch("shutil.rmtree", autospec=True) - mocker.patch.object(pathlib.Path, "mkdir", autospec=True) - mocker.patch.object(pathlib.Path, "is_dir", autospec=True, return_value=is_dir) - mocker.patch.object(pathlib.Path, "symlink_to", autospec=True) + destination_parent_path = tmp_path.joinpath(destination_parent_sub_path) + if destination_name is None: + destination_path = destination_parent_path.joinpath(source_path.name) + else: + destination_path = destination_parent_path.joinpath(destination_name) + destination_path.parent.mkdir(parents=True, exist_ok=True) + + # Generate pre-existing destination path + if exists == "yes": + if is_dir: + destination_path.mkdir(parents=True) + else: + # source_path.parent.mkdir(parents=True) + destination_path.touch() + elif exists == "symlink": + destination_path.symlink_to(target=source_path, target_is_directory=source_path.is_dir()) + elif exists == "broken": + destination_path.symlink_to(target=tmp_path.joinpath("nonexistent"), target_is_directory=is_dir) + + expected_destination_path = tmp_path.joinpath(expected_destination_sub_path) - if exists and not force: + compile_sketches = get_compilesketches_object() + + if exists != "no" and not force: with pytest.raises(expected_exception=SystemExit, match="1"): - compile_sketches.install_from_path(source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) + compile_sketches.install_from_path( + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) assert capsys.readouterr().out.strip() == ( - "::error::Installation already exists: " - + str(expected_destination_path) + "::error::Installation already exists: " + str(expected_destination_path) ) else: - compile_sketches.install_from_path(source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) - if exists and force: - shutil.rmtree.assert_called_once_with(path=expected_destination_path) - else: - shutil.rmtree.assert_not_called() + compile_sketches.install_from_path( + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) - pathlib.Path.symlink_to.assert_called_once_with(expected_destination_path, target=source_path, - target_is_directory=is_dir) + assert expected_destination_path.resolve() == source_path def test_install_from_path_functional(tmp_path): @@ -1319,37 +1493,38 @@ def prep_test_folders(): # Test existing destination_parent_path prep_test_folders() destination_parent_path.mkdir(parents=True) - compile_sketches.install_from_path(source_path=source_path, destination_parent_path=destination_parent_path, - destination_name=None) - assert directories_are_same(left_directory=source_path, - right_directory=destination_parent_path.joinpath(source_path.name)) + compile_sketches.install_from_path( + source_path=source_path, destination_parent_path=destination_parent_path, destination_name=None + ) + assert directories_are_same( + left_directory=source_path, right_directory=destination_parent_path.joinpath(source_path.name) + ) # Test custom folder name prep_test_folders() destination_name = "foo-destination-name" - compile_sketches.install_from_path(source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name) - assert directories_are_same(left_directory=source_path, - right_directory=destination_parent_path.joinpath(destination_name)) + compile_sketches.install_from_path( + source_path=source_path, destination_parent_path=destination_parent_path, destination_name=destination_name + ) + assert directories_are_same( + left_directory=source_path, right_directory=destination_parent_path.joinpath(destination_name) + ) # Test install of file # Test naming according to source prep_test_folders() - compile_sketches.install_from_path(source_path=test_file_path, - destination_parent_path=destination_parent_path, - destination_name=None) - assert filecmp.cmp(f1=test_file_path, - f2=destination_parent_path.joinpath(test_file_path.name)) + compile_sketches.install_from_path( + source_path=test_file_path, destination_parent_path=destination_parent_path, destination_name=None + ) + assert filecmp.cmp(f1=test_file_path, f2=destination_parent_path.joinpath(test_file_path.name)) # Test custom folder name prep_test_folders() destination_name = "foo-destination-name" - compile_sketches.install_from_path(source_path=test_file_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name) - assert filecmp.cmp(f1=test_file_path, - f2=destination_parent_path.joinpath(destination_name)) + compile_sketches.install_from_path( + source_path=test_file_path, destination_parent_path=destination_parent_path, destination_name=destination_name + ) + assert filecmp.cmp(f1=test_file_path, f2=destination_parent_path.joinpath(destination_name)) def test_path_is_sketch(): @@ -1357,29 +1532,26 @@ def test_path_is_sketch(): assert compilesketches.path_is_sketch(path=test_data_path.joinpath("HasSketches", "Sketch1", "Sketch1.ino")) is True # Not a sketch file - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("NoSketches", "NotSketch", "NotSketch.foo")) is False + assert ( + compilesketches.path_is_sketch(path=test_data_path.joinpath("NoSketches", "NotSketch", "NotSketch.foo")) + is False + ) # Sketch folder with .ino sketch file - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("HasSketches", "Sketch1")) is True + assert compilesketches.path_is_sketch(path=test_data_path.joinpath("HasSketches", "Sketch1")) is True # Sketch folder with .pde sketch file - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("HasSketches", "Sketch2")) is True + assert compilesketches.path_is_sketch(path=test_data_path.joinpath("HasSketches", "Sketch2")) is True # No files in path - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("HasSketches")) is False + assert compilesketches.path_is_sketch(path=test_data_path.joinpath("HasSketches")) is False # Not a sketch folder - assert compilesketches.path_is_sketch( - path=test_data_path.joinpath("NoSketches", "NotSketch")) is False + assert compilesketches.path_is_sketch(path=test_data_path.joinpath("NoSketches", "NotSketch")) is False @pytest.mark.parametrize("clean_build_cache", [True, False]) -@pytest.mark.parametrize("returncode, expected_success", [(1, False), - (0, True)]) +@pytest.mark.parametrize("returncode, expected_success", [(1, False), (0, True)]) def test_compile_sketch(capsys, mocker, clean_build_cache, returncode, expected_success): stdout = unittest.mock.sentinel.stdout sketch_path = pathlib.Path("FooSketch", "FooSketch.ino").resolve() @@ -1395,15 +1567,13 @@ class CompilationData: compile_sketches = get_compilesketches_object() - mocker.patch("compilesketches.CompileSketches.run_arduino_cli_command", autospec=True, - return_value=CompilationData()) + mocker.patch( + "compilesketches.CompileSketches.run_arduino_cli_command", autospec=True, return_value=CompilationData() + ) mocker.patch.object(pathlib.Path, "glob", autospec=True, return_value=build_cache_paths) mocker.patch("shutil.rmtree", autospec=True) - compilation_result = compile_sketches.compile_sketch( - sketch_path=sketch_path, - clean_build_cache=clean_build_cache - ) + compilation_result = compile_sketches.compile_sketch(sketch_path=sketch_path, clean_build_cache=clean_build_cache) if clean_build_cache: rmtree_calls = [] @@ -1414,12 +1584,17 @@ class CompilationData: shutil.rmtree.assert_has_calls(calls=rmtree_calls) expected_stdout = ( - "::group::Compiling sketch: " + str(compilesketches.path_relative_to_workspace(path=sketch_path)) + "\n" - + str(stdout) + "\n" + "::group::Compiling sketch: " + + str(compilesketches.path_relative_to_workspace(path=sketch_path)) + + "\n" + + str(stdout) + + "\n" + "::endgroup::" ) if not expected_success: expected_stdout += "\n::error::Compilation failed" + else: + expected_stdout += "\nCompilation time elapsed: 0s" assert capsys.readouterr().out.strip() == expected_stdout assert compilation_result.sketch == sketch_path @@ -1462,16 +1637,16 @@ def checkout(self): compile_sketches = get_compilesketches_object(enable_warnings_report=enable_warnings_report) - mocker.patch("compilesketches.CompileSketches.get_sizes_from_output", autospec=True, - side_effect=sizes_list) - mocker.patch("compilesketches.CompileSketches.get_warning_count_from_output", autospec=True, - side_effect=warning_count_list) - mocker.patch("compilesketches.CompileSketches.do_deltas_report", autospec=True, - return_value=do_deltas_report) + mocker.patch("compilesketches.CompileSketches.get_sizes_from_output", autospec=True, side_effect=sizes_list) + mocker.patch( + "compilesketches.CompileSketches.get_warning_count_from_output", autospec=True, side_effect=warning_count_list + ) + mocker.patch("compilesketches.CompileSketches.do_deltas_report", autospec=True, return_value=do_deltas_report) mocker.patch("git.Repo", autospec=True, return_value=Repo()) mocker.patch("compilesketches.CompileSketches.checkout_deltas_base_ref", autospec=True) - mocker.patch("compilesketches.CompileSketches.compile_sketch", autospec=True, - return_value=previous_compilation_result) + mocker.patch( + "compilesketches.CompileSketches.compile_sketch", autospec=True, return_value=previous_compilation_result + ) mocker.patch.object(Repo, "checkout") mocker.patch("compilesketches.CompileSketches.get_sizes_report", autospec=True, return_value=sizes_report) mocker.patch("compilesketches.CompileSketches.get_warnings_report", autospec=True, return_value=warnings_report) @@ -1481,7 +1656,8 @@ def checkout(self): get_sizes_from_output_calls = [unittest.mock.call(compile_sketches, compilation_result=compilation_result)] if enable_warnings_report == "true": get_warning_count_from_output_calls = [ - unittest.mock.call(compile_sketches, compilation_result=compilation_result)] + unittest.mock.call(compile_sketches, compilation_result=compilation_result) + ] else: get_warning_count_from_output_calls = [] @@ -1490,22 +1666,28 @@ def checkout(self): else: expected_current_warnings = None # noinspection PyUnresolvedReferences - compilesketches.CompileSketches.do_deltas_report.assert_called_once_with(compile_sketches, - compilation_result=compilation_result, - current_sizes=sizes_list[0], - current_warnings=expected_current_warnings) + compilesketches.CompileSketches.do_deltas_report.assert_called_once_with( + compile_sketches, + compilation_result=compilation_result, + current_sizes=sizes_list[0], + current_warnings=expected_current_warnings, + ) if do_deltas_report: git.Repo.assert_called_once_with(path=os.environ["GITHUB_WORKSPACE"]) compile_sketches.checkout_deltas_base_ref.assert_called_once() - compile_sketches.compile_sketch.assert_called_once_with(compile_sketches, - sketch_path=compilation_result.sketch, - clean_build_cache=(enable_warnings_report == "true")) + compile_sketches.compile_sketch.assert_called_once_with( + compile_sketches, + sketch_path=compilation_result.sketch, + clean_build_cache=(enable_warnings_report == "true"), + ) Repo.checkout.assert_called_once_with(original_git_ref, recurse_submodules=True) get_sizes_from_output_calls.append( - unittest.mock.call(compile_sketches, compilation_result=previous_compilation_result)) + unittest.mock.call(compile_sketches, compilation_result=previous_compilation_result) + ) if enable_warnings_report == "true": get_warning_count_from_output_calls.append( - unittest.mock.call(compile_sketches, compilation_result=previous_compilation_result)) + unittest.mock.call(compile_sketches, compilation_result=previous_compilation_result) + ) expected_previous_sizes = sizes_list[1] expected_previous_warnings = warning_count_list[1] @@ -1513,20 +1695,20 @@ def checkout(self): expected_previous_sizes = None expected_previous_warnings = None - compilesketches.CompileSketches.get_sizes_from_output.assert_has_calls( - calls=get_sizes_from_output_calls) + compilesketches.CompileSketches.get_sizes_from_output.assert_has_calls(calls=get_sizes_from_output_calls) compilesketches.CompileSketches.get_warning_count_from_output.assert_has_calls( - calls=get_warning_count_from_output_calls) + calls=get_warning_count_from_output_calls + ) - compile_sketches.get_sizes_report.assert_called_once_with(compile_sketches, - current_sizes=sizes_list[0], - previous_sizes=expected_previous_sizes) + compile_sketches.get_sizes_report.assert_called_once_with( + compile_sketches, current_sizes=sizes_list[0], previous_sizes=expected_previous_sizes + ) if enable_warnings_report == "true": # noinspection PyUnresolvedReferences - compile_sketches.get_warnings_report.assert_called_once_with(compile_sketches, - current_warnings=warning_count_list[0], - previous_warnings=expected_previous_warnings) + compile_sketches.get_warnings_report.assert_called_once_with( + compile_sketches, current_warnings=warning_count_list[0], previous_warnings=expected_previous_warnings + ) expected_sketch_report = { compile_sketches.ReportKeys.name: ( @@ -1542,130 +1724,162 @@ def checkout(self): @pytest.mark.parametrize( "compilation_success, compilation_output, flash, maximum_flash, relative_flash, ram, maximum_ram, relative_ram", - [(False, - "foo output", - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator), - (True, - "/home/per/.arduino15/packages/arduino/hardware/megaavr/1.8.5/cores/arduino/NANO_compat.cpp:23:2: warning: #warni" - "ng \"ATMEGA328 registers emulation is enabled. You may encounter some speed issue. Please consider to disable it" - " in the Tools menu\" [-Wcpp]\n" - " #warning \"ATMEGA328 registers emulation is enabled. You may encounter some speed issue. Please consider to dis" - "able it in the Tools menu\"\n" - " ^~~~~~~\n" - "Sketch uses {flash} bytes (1%) of program storage space. Maximum is {maximum_flash} bytes.\n" - "Global variables use {ram} bytes (0%) of dynamic memory, leaving 6122 bytes for local variables. Maximum is" - " {maximum_ram} bytes.\n", - 802, 1604, 50.0, 22, 33, 66.67), - (True, - "In file included from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/in" - "clude/samd21.h:69:0,\n" - " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:10" - "5,\n" - " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540" - ",\n" - " from /home/per/.arduino15/packages/arduino/hardware/samd/1.8.6/cores/arduino/Arduino.h:48,\n" - " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.h:23,\n" - " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.cpp:28:\n" - "/home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226" - ":0: warning: \"LITTLE_ENDIAN\" redefined\n" - " #define LITTLE_ENDIAN 1\n" - " \n" - "In file included from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" - "de/sys/types.h:67:0,\n" - " from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" - "de/stdio.h:61,\n" - " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/minmea/minmea.h:16,\n" - " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.cpp:23:\n" - "/home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17" - ":0: note: this is the location of the previous definition\n" - " #define LITTLE_ENDIAN _LITTLE_ENDIAN\n" - " \n" - "Sketch uses {flash} bytes (12%) of program storage space. Maximum is {maximum_flash} bytes.\n" - "Global variables use {ram} bytes of dynamic memory.\n", - 32740, - 32740, - 100.0, - 3648, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator), - (True, - "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void _initISR(Tc*, uint8_t, uint32_t, IRQn_Ty" - "pe, uint8_t, uint8_t)':\n" - "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:120:56: warning: unused parameter 'id' [-Wunused-parameter]" - "\n" - " static void _initISR(Tc *tc, uint8_t channel, uint32_t id, IRQn_Type irqn, uint8_t gcmForTimer, uint8_t intEnab" - " leBit)\n" - " ^~\n" - "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void finISR(timer16_Sequence_t)':\n" - "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:174:39: warning: unused parameter 'timer' [-Wunused-paramet" - "er]\n" - " static void finISR(timer16_Sequence_t timer)\n" - " ^~~~~\n" - "Sketch uses {flash} bytes (4%) of program storage space. Maximum is {maximum_flash} bytes.\n", - 12636, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator), - (True, - "In file included from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/in" - "clude/samd21.h:69:0,\n" - " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:10" - "5,\n" - " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540" - ",\n" - " from /home/per/.arduino15/packages/arduino/hardware/samd/1.8.6/cores/arduino/Arduino.h:48,\n" - " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.h:23,\n" - " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:22:\n" - "/home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226" - ":0: warning: \"LITTLE_ENDIAN\" redefined\n" - " #define LITTLE_ENDIAN 1\n" - " \n" - "In file included from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" - "de/sys/types.h:67:0,\n" - " from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" - "de/time.h:28,\n" - " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:20:\n" - "/home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17" - ":0: note: this is the location of the previous definition\n" - " #define LITTLE_ENDIAN _LITTLE_ENDIAN\n" - " \n" - "/home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp: In member function 'void RTCZero::begin(bool)':\n" - "/home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:96:26: warning: 'oldTime.RTC_MODE2_CLOCK_Type::reg' may be u" - "sed uninitialized in this function [-Wmaybe-uninitialized]\n" - " RTC->MODE2.CLOCK.reg = oldTime.reg;\n" - "Couldn't determine program size", - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator, - get_compilesketches_object().not_applicable_indicator)] + [ + ( + False, + "foo output", + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ( + True, + "/home/per/.arduino15/packages/arduino/hardware/megaavr/1.8.5/cores/arduino/NANO_compat.cpp:23:2: warning: #warni" + 'ng "ATMEGA328 registers emulation is enabled. You may encounter some speed issue. Please consider to disable it' + ' in the Tools menu" [-Wcpp]\n' + ' #warning "ATMEGA328 registers emulation is enabled. You may encounter some speed issue. Please consider to dis' + 'able it in the Tools menu"\n' + " ^~~~~~~\n" + "Sketch uses {flash} bytes (1%) of program storage space. Maximum is {maximum_flash} bytes.\n" + "Global variables use {ram} bytes (0%) of dynamic memory, leaving 6122 bytes for local variables. Maximum is" + " {maximum_ram} bytes.\n", + 802, + 1604, + 50.0, + 22, + 33, + 66.67, + ), + ( + True, + "In file included from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/in" + "clude/samd21.h:69:0,\n" + " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:10" + "5,\n" + " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540" + ",\n" + " from /home/per/.arduino15/packages/arduino/hardware/samd/1.8.6/cores/arduino/Arduino.h:48,\n" + " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.h:23,\n" + " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.cpp:28:\n" + "/home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226" + ':0: warning: "LITTLE_ENDIAN" redefined\n' + " #define LITTLE_ENDIAN 1\n" + " \n" + "In file included from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" + "de/sys/types.h:67:0,\n" + " from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" + "de/stdio.h:61,\n" + " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/minmea/minmea.h:16,\n" + " from /home/per/Arduino/libraries/Arduino_MKRGPS/src/GPS.cpp:23:\n" + "/home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17" + ":0: note: this is the location of the previous definition\n" + " #define LITTLE_ENDIAN _LITTLE_ENDIAN\n" + " \n" + "Sketch uses {flash} bytes (12%) of program storage space. Maximum is {maximum_flash} bytes.\n" + "Global variables use {ram} bytes of dynamic memory.\n", + 32740, + 32740, + 100.0, + 3648, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ( + True, + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void _initISR(Tc*, uint8_t, uint32_t, IRQn_Ty" + "pe, uint8_t, uint8_t)':\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:120:56: warning: unused parameter 'id' [-Wunused-parameter]" + "\n" + " static void _initISR(Tc *tc, uint8_t channel, uint32_t id, IRQn_Type irqn, uint8_t gcmForTimer, uint8_t intEnab" + " leBit)\n" + " ^~\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void finISR(timer16_Sequence_t)':\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:174:39: warning: unused parameter 'timer' [-Wunused-paramet" + "er]\n" + " static void finISR(timer16_Sequence_t timer)\n" + " ^~~~~\n" + "Sketch uses {flash} bytes (4%) of program storage space. Maximum is {maximum_flash} bytes.\n", + 12636, + 25272, + 50.0, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ( + True, + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void _initISR(Tc*, uint8_t, uint32_t, IRQn_Ty" + "pe, uint8_t, uint8_t)':\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:120:56: warning: unused parameter 'id' [-Wunused-parameter]" + "\n" + " static void _initISR(Tc *tc, uint8_t channel, uint32_t id, IRQn_Type irqn, uint8_t gcmForTimer, uint8_t intEnab" + " leBit)\n" + " ^~\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp: In function 'void finISR(timer16_Sequence_t)':\n" + "/home/per/Arduino/libraries/Servo/src/samd/Servo.cpp:174:39: warning: unused parameter 'timer' [-Wunused-paramet" + "er]\n" + " static void finISR(timer16_Sequence_t timer)\n" + " ^~~~~\n" + "Sketch uses {flash} bytes (4%) of program storage space.\n", + 12636, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ( + True, + "In file included from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/in" + "clude/samd21.h:69:0,\n" + " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:10" + "5,\n" + " from /home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540" + ",\n" + " from /home/per/.arduino15/packages/arduino/hardware/samd/1.8.6/cores/arduino/Arduino.h:48,\n" + " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.h:23,\n" + " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:22:\n" + "/home/per/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226" + ':0: warning: "LITTLE_ENDIAN" redefined\n' + " #define LITTLE_ENDIAN 1\n" + " \n" + "In file included from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" + "de/sys/types.h:67:0,\n" + " from /home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/inclu" + "de/time.h:28,\n" + " from /home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:20:\n" + "/home/per/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17" + ":0: note: this is the location of the previous definition\n" + " #define LITTLE_ENDIAN _LITTLE_ENDIAN\n" + " \n" + "/home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp: In member function 'void RTCZero::begin(bool)':\n" + "/home/per/Arduino/libraries/RTCZero/src/RTCZero.cpp:96:26: warning: 'oldTime.RTC_MODE2_CLOCK_Type::reg' may be u" + "sed uninitialized in this function [-Wmaybe-uninitialized]\n" + " RTC->MODE2.CLOCK.reg = oldTime.reg;\n" + "Couldn't determine program size", + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + get_compilesketches_object().not_applicable_indicator, + ), + ], ) -def test_get_sizes_from_output(compilation_success, - compilation_output, - flash, - maximum_flash, - relative_flash, - ram, - maximum_ram, - relative_ram): +def test_get_sizes_from_output( + compilation_success, compilation_output, flash, maximum_flash, relative_flash, ram, maximum_ram, relative_ram +): sketch_path = pathlib.PurePath("foo/bar") - compilation_output = compilation_output.format(flash=str(flash), - maximum_flash=str(maximum_flash), - ram=str(ram), - maximum_ram=str(maximum_ram)) + compilation_output = compilation_output.format( + flash=str(flash), maximum_flash=str(maximum_flash), ram=str(ram), maximum_ram=str(maximum_ram) + ) compile_sketches = get_compilesketches_object() - compilation_result = type("CompilationResult", (), - {"sketch": sketch_path, - "success": compilation_success, - "output": compilation_output}) + compilation_result = type( + "CompilationResult", (), {"sketch": sketch_path, "success": compilation_success, "output": compilation_output} + ) sizes = compile_sketches.get_sizes_from_output(compilation_result=compilation_result) @@ -1674,42 +1888,48 @@ def test_get_sizes_from_output(compilation_success, compile_sketches.ReportKeys.name: "flash", compile_sketches.ReportKeys.absolute: flash, compile_sketches.ReportKeys.maximum: maximum_flash, - compile_sketches.ReportKeys.relative: relative_flash + compile_sketches.ReportKeys.relative: relative_flash, }, { compile_sketches.ReportKeys.name: "RAM for global variables", compile_sketches.ReportKeys.absolute: ram, compile_sketches.ReportKeys.maximum: maximum_ram, - compile_sketches.ReportKeys.relative: relative_ram - } + compile_sketches.ReportKeys.relative: relative_ram, + }, ] @pytest.mark.parametrize( "compilation_output, memory_type, size_data_type, expected_output", - [("foo output", - { - "name": "RAM for global variables", - "regex": { - get_compilesketches_object().ReportKeys.maximum: ( - r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." - ) - } - }, - get_compilesketches_object().ReportKeys.maximum, - None), - ("Global variables use 11 bytes (0%) of dynamic memory, leaving 22 bytes for local variables. Maximum is" - + " {expected_output} bytes.", - { - "name": "RAM for global variables", - "regex": { - get_compilesketches_object().ReportKeys.maximum: ( - r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." - ) - } - }, - get_compilesketches_object().ReportKeys.maximum, - 42)] + [ + ( + "foo output", + { + "name": "RAM for global variables", + "regex": { + get_compilesketches_object().ReportKeys.maximum: ( + r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." + ) + }, + }, + get_compilesketches_object().ReportKeys.maximum, + None, + ), + ( + "Global variables use 11 bytes (0%) of dynamic memory, leaving 22 bytes for local variables. Maximum is" + + " {expected_output} bytes.", + { + "name": "RAM for global variables", + "regex": { + get_compilesketches_object().ReportKeys.maximum: ( + r"Global variables use [0-9]+ bytes .*of dynamic memory.*\. Maximum is ([0-9]+) bytes." + ) + }, + }, + get_compilesketches_object().ReportKeys.maximum, + 42, + ), + ], ) def test_get_size_data_from_output(capsys, compilation_output, memory_type, size_data_type, expected_output): compilation_output = compilation_output.format(expected_output=str(expected_output)) @@ -1721,7 +1941,9 @@ def test_get_size_data_from_output(capsys, compilation_output, memory_type, size assert size_data == expected_output if expected_output is None: expected_stdout = ( - "::warning::Unable to determine the: \"" + str(size_data_type) + "\" value for memory type: \"" + '::warning::Unable to determine the: "' + + str(size_data_type) + + '" value for memory type: "' + memory_type["name"] + "\". The board's platform may not have been configured to provide this information." ) @@ -1730,21 +1952,23 @@ def test_get_size_data_from_output(capsys, compilation_output, memory_type, size @pytest.mark.parametrize( "compilation_success, test_compilation_output_filename, expected_warning_count", - [(True, - pathlib.Path("test_get_warning_count_from_output", "has-warnings.txt"), - 45), - (True, - pathlib.Path("test_get_warning_count_from_output", "no-warnings.txt"), - 0), - (False, - pathlib.Path("test_get_warning_count_from_output", "has-warnings.txt"), - get_compilesketches_object().not_applicable_indicator)]) + [ + (True, pathlib.Path("test_get_warning_count_from_output", "has-warnings.txt"), 45), + (True, pathlib.Path("test_get_warning_count_from_output", "no-warnings.txt"), 0), + ( + False, + pathlib.Path("test_get_warning_count_from_output", "has-warnings.txt"), + get_compilesketches_object().not_applicable_indicator, + ), + ], +) def test_get_warning_count_from_output(compilation_success, test_compilation_output_filename, expected_warning_count): compile_sketches = get_compilesketches_object() - with open(file=test_data_path.joinpath(test_compilation_output_filename), - mode='r', - encoding="utf-8") as test_compilation_output_file: + with open( + file=test_data_path.joinpath(test_compilation_output_filename), mode="r", encoding="utf-8" + ) as test_compilation_output_file: + class CompilationResult: success = compilation_success output = test_compilation_output_file.read() @@ -1753,72 +1977,114 @@ class CompilationResult: @pytest.mark.parametrize( - "enable_deltas_report," - "compilation_success," - "current_sizes," - "current_warnings," - "do_deltas_report_expected", - [("true", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: 24}, - {compilesketches.CompileSketches.ReportKeys.name: "bar", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}], - compilesketches.CompileSketches.not_applicable_indicator, - True), - ("true", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}, - {compilesketches.CompileSketches.ReportKeys.name: "bar", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}], - 42, - True), - ("false", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: 24}], - True, - False), - ("true", - False, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: 24}], - 42, - False), - ("true", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}, - {compilesketches.CompileSketches.ReportKeys.name: "bar", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}], - compilesketches.CompileSketches.not_applicable_indicator, - False), - ("true", - True, - [{compilesketches.CompileSketches.ReportKeys.name: "foo", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}, - {compilesketches.CompileSketches.ReportKeys.name: "bar", - compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator}], - None, - False) - ] + "enable_deltas_report," "compilation_success," "current_sizes," "current_warnings," "do_deltas_report_expected", + [ + ( + "true", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: 24, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "bar", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + ], + compilesketches.CompileSketches.not_applicable_indicator, + True, + ), + ( + "true", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "bar", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + ], + 42, + True, + ), + ( + "false", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: 24, + } + ], + True, + False, + ), + ( + "true", + False, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: 24, + } + ], + 42, + False, + ), + ( + "true", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "bar", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + ], + compilesketches.CompileSketches.not_applicable_indicator, + False, + ), + ( + "true", + True, + [ + { + compilesketches.CompileSketches.ReportKeys.name: "foo", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "bar", + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + }, + ], + None, + False, + ), + ], ) -def test_do_deltas_report(monkeypatch, - enable_deltas_report, - compilation_success, - current_sizes, - current_warnings, - do_deltas_report_expected): +def test_do_deltas_report( + monkeypatch, enable_deltas_report, compilation_success, current_sizes, current_warnings, do_deltas_report_expected +): compile_sketches = get_compilesketches_object(enable_deltas_report=enable_deltas_report) - compilation_result = type("CompilationResult", (), - {"sketch": "/foo/SketchName", - "success": compilation_success, - "output": "foo compilation output"}) - assert compile_sketches.do_deltas_report(compilation_result=compilation_result, - current_sizes=current_sizes, - current_warnings=current_warnings) == do_deltas_report_expected + compilation_result = type( + "CompilationResult", + (), + {"sketch": "/foo/SketchName", "success": compilation_success, "output": "foo compilation output"}, + ) + assert ( + compile_sketches.do_deltas_report( + compilation_result=compilation_result, current_sizes=current_sizes, current_warnings=current_warnings + ) + == do_deltas_report_expected + ) def test_checkout_deltas_base_ref(monkeypatch, mocker): @@ -1845,12 +2111,14 @@ def checkout(self): compile_sketches.checkout_deltas_base_ref() git.Repo.assert_called_once_with(path=os.environ["GITHUB_WORKSPACE"]) - Repo.fetch.assert_called_once_with(refspec=deltas_base_ref, - verbose=compile_sketches.verbose, - no_tags=True, - prune=True, - depth=1, - recurse_submodules=True) + Repo.fetch.assert_called_once_with( + refspec=deltas_base_ref, + verbose=compile_sketches.verbose, + no_tags=True, + prune=True, + depth=1, + recurse_submodules=True, + ) Repo.checkout.assert_called_once_with(deltas_base_ref, recurse_submodules=True) @@ -1867,9 +2135,9 @@ def test_get_sizes_report(mocker): get_size_report_calls = [] for current_size, previous_size in zip(current_sizes, previous_sizes): - get_size_report_calls.append(unittest.mock.call(compile_sketches, - current_size=current_size, - previous_size=previous_size)) + get_size_report_calls.append( + unittest.mock.call(compile_sketches, current_size=current_size, previous_size=previous_size) + ) compile_sketches.get_size_report.assert_has_calls(get_size_report_calls) @@ -1881,60 +2149,67 @@ def test_get_sizes_report(mocker): get_size_report_calls = [] for current_size in current_sizes: - get_size_report_calls.append(unittest.mock.call(compile_sketches, - current_size=current_size, - previous_size=None)) + get_size_report_calls.append( + unittest.mock.call(compile_sketches, current_size=current_size, previous_size=None) + ) compile_sketches.get_size_report.assert_has_calls(get_size_report_calls) @pytest.mark.parametrize( "size_maximum, current_absolute, previous_size, expected_absolute_delta, expected_relative_delta", - [(compilesketches.CompileSketches.not_applicable_indicator, - compilesketches.CompileSketches.not_applicable_indicator, - {compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 9.91}, - compilesketches.CompileSketches.not_applicable_indicator, - compilesketches.CompileSketches.not_applicable_indicator), - (111, - 42, - {compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, - compilesketches.CompileSketches.ReportKeys.relative: compilesketches.CompileSketches.not_applicable_indicator}, - compilesketches.CompileSketches.not_applicable_indicator, - compilesketches.CompileSketches.not_applicable_indicator), - (111, - 42, - {compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 9.91}, - 31, - 27.93), - (111, - 42, - None, - None, - None)] + [ + ( + compilesketches.CompileSketches.not_applicable_indicator, + compilesketches.CompileSketches.not_applicable_indicator, + { + compilesketches.CompileSketches.ReportKeys.absolute: 11, + compilesketches.CompileSketches.ReportKeys.relative: 9.91, + }, + compilesketches.CompileSketches.not_applicable_indicator, + compilesketches.CompileSketches.not_applicable_indicator, + ), + ( + 111, + 42, + { + compilesketches.CompileSketches.ReportKeys.absolute: compilesketches.CompileSketches.not_applicable_indicator, + compilesketches.CompileSketches.ReportKeys.relative: compilesketches.CompileSketches.not_applicable_indicator, + }, + compilesketches.CompileSketches.not_applicable_indicator, + compilesketches.CompileSketches.not_applicable_indicator, + ), + ( + 111, + 42, + { + compilesketches.CompileSketches.ReportKeys.absolute: 11, + compilesketches.CompileSketches.ReportKeys.relative: 9.91, + }, + 31, + 27.93, + ), + (111, 42, None, None, None), + ], ) -def test_get_size_report(capsys, - size_maximum, - current_absolute, - previous_size, - expected_absolute_delta, - expected_relative_delta): +def test_get_size_report( + capsys, size_maximum, current_absolute, previous_size, expected_absolute_delta, expected_relative_delta +): size_name = "Foo size name" current_relative = 42 current_size = { compilesketches.CompileSketches.ReportKeys.name: size_name, compilesketches.CompileSketches.ReportKeys.maximum: size_maximum, compilesketches.CompileSketches.ReportKeys.absolute: current_absolute, - compilesketches.CompileSketches.ReportKeys.relative: current_relative + compilesketches.CompileSketches.ReportKeys.relative: current_relative, } expected_size_report = { compilesketches.CompileSketches.ReportKeys.name: size_name, compilesketches.CompileSketches.ReportKeys.maximum: size_maximum, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: current_absolute, - compilesketches.CompileSketches.ReportKeys.relative: current_relative - } + compilesketches.CompileSketches.ReportKeys.relative: current_relative, + }, } compile_sketches = get_compilesketches_object() @@ -1946,19 +2221,26 @@ def test_get_size_report(capsys, else: expected_size_report[compilesketches.CompileSketches.ReportKeys.previous] = { compilesketches.CompileSketches.ReportKeys.absolute: previous_size[ - compilesketches.CompileSketches.ReportKeys.absolute], + compilesketches.CompileSketches.ReportKeys.absolute + ], compilesketches.CompileSketches.ReportKeys.relative: previous_size[ - compilesketches.CompileSketches.ReportKeys.relative] + compilesketches.CompileSketches.ReportKeys.relative + ], } expected_size_report[compilesketches.CompileSketches.ReportKeys.delta] = { compilesketches.CompileSketches.ReportKeys.absolute: expected_absolute_delta, - compilesketches.CompileSketches.ReportKeys.relative: expected_relative_delta + compilesketches.CompileSketches.ReportKeys.relative: expected_relative_delta, } if expected_relative_delta == compilesketches.CompileSketches.not_applicable_indicator: assert capsys.readouterr().out.strip() == ("Change in " + size_name + ": " + str(expected_absolute_delta)) else: assert capsys.readouterr().out.strip() == ( - "Change in " + size_name + ": " + str(expected_absolute_delta) + " (" + str(expected_relative_delta) + "Change in " + + size_name + + ": " + + str(expected_absolute_delta) + + " (" + + str(expected_relative_delta) + "%)" ) @@ -1967,49 +2249,58 @@ def test_get_size_report(capsys, @pytest.mark.parametrize( "current_warnings, previous_warnings, expected_report", - [(42, - None, - { - compilesketches.CompileSketches.ReportKeys.current: { - compilesketches.CompileSketches.ReportKeys.absolute: 42 - } - }), - (42, - compilesketches.CompileSketches.not_applicable_indicator, - { - compilesketches.CompileSketches.ReportKeys.current: { - compilesketches.CompileSketches.ReportKeys.absolute: 42 - }, - compilesketches.CompileSketches.ReportKeys.previous: { - compilesketches.CompileSketches.ReportKeys.absolute: ( - compilesketches.CompileSketches.not_applicable_indicator - ) - }, - compilesketches.CompileSketches.ReportKeys.delta: { - compilesketches.CompileSketches.ReportKeys.absolute: ( - compilesketches.CompileSketches.not_applicable_indicator - ) - } - }), - (42, - 43, - { - compilesketches.CompileSketches.ReportKeys.current: { - compilesketches.CompileSketches.ReportKeys.absolute: 42 - }, - compilesketches.CompileSketches.ReportKeys.previous: { - compilesketches.CompileSketches.ReportKeys.absolute: 43 - }, - compilesketches.CompileSketches.ReportKeys.delta: { - compilesketches.CompileSketches.ReportKeys.absolute: -1 - } - })]) + [ + ( + 42, + None, + { + compilesketches.CompileSketches.ReportKeys.current: { + compilesketches.CompileSketches.ReportKeys.absolute: 42 + } + }, + ), + ( + 42, + compilesketches.CompileSketches.not_applicable_indicator, + { + compilesketches.CompileSketches.ReportKeys.current: { + compilesketches.CompileSketches.ReportKeys.absolute: 42 + }, + compilesketches.CompileSketches.ReportKeys.previous: { + compilesketches.CompileSketches.ReportKeys.absolute: ( + compilesketches.CompileSketches.not_applicable_indicator + ) + }, + compilesketches.CompileSketches.ReportKeys.delta: { + compilesketches.CompileSketches.ReportKeys.absolute: ( + compilesketches.CompileSketches.not_applicable_indicator + ) + }, + }, + ), + ( + 42, + 43, + { + compilesketches.CompileSketches.ReportKeys.current: { + compilesketches.CompileSketches.ReportKeys.absolute: 42 + }, + compilesketches.CompileSketches.ReportKeys.previous: { + compilesketches.CompileSketches.ReportKeys.absolute: 43 + }, + compilesketches.CompileSketches.ReportKeys.delta: { + compilesketches.CompileSketches.ReportKeys.absolute: -1 + }, + }, + ), + ], +) def test_get_warnings_report(current_warnings, previous_warnings, expected_report): compile_sketches = get_compilesketches_object() - assert compile_sketches.get_warnings_report( - current_warnings=current_warnings, - previous_warnings=previous_warnings - ) == expected_report + assert ( + compile_sketches.get_warnings_report(current_warnings=current_warnings, previous_warnings=previous_warnings) + == expected_report + ) def test_get_sketches_report(monkeypatch, mocker): @@ -2025,38 +2316,41 @@ def test_get_sketches_report(monkeypatch, mocker): warnings_summary_report = unittest.mock.sentinel.warnings_summary_report sketch_report_list = unittest.mock.sentinel.sketch_report_list - mocker.patch("compilesketches.CompileSketches.get_sizes_summary_report", - autospec=True, - return_value=sizes_summary_report) + mocker.patch( + "compilesketches.CompileSketches.get_sizes_summary_report", autospec=True, return_value=sizes_summary_report + ) - mocker.patch("compilesketches.CompileSketches.get_warnings_summary_report", - autospec=True, - return_value=warnings_summary_report) + mocker.patch( + "compilesketches.CompileSketches.get_warnings_summary_report", + autospec=True, + return_value=warnings_summary_report, + ) compile_sketches = get_compilesketches_object(fqbn_arg=fqbn_arg) assert compile_sketches.get_sketches_report(sketch_report_list=sketch_report_list) == { compilesketches.CompileSketches.ReportKeys.commit_hash: current_git_ref, - compilesketches.CompileSketches.ReportKeys.commit_url: ("https://github.com/" - + github_repository - + "/commit/" - + current_git_ref), + compilesketches.CompileSketches.ReportKeys.commit_url: ( + "https://github.com/" + github_repository + "/commit/" + current_git_ref + ), compilesketches.CompileSketches.ReportKeys.boards: [ { compilesketches.CompileSketches.ReportKeys.board: compile_sketches.fqbn, compilesketches.CompileSketches.ReportKeys.sizes: sizes_summary_report, compilesketches.CompileSketches.ReportKeys.warnings: warnings_summary_report, - compilesketches.CompileSketches.ReportKeys.sketches: sketch_report_list + compilesketches.CompileSketches.ReportKeys.sketches: sketch_report_list, } - ] + ], } - compile_sketches.get_sizes_summary_report.assert_called_once_with(compile_sketches, - sketch_report_list=sketch_report_list) + compile_sketches.get_sizes_summary_report.assert_called_once_with( + compile_sketches, sketch_report_list=sketch_report_list + ) # noinspection PyUnresolvedReferences - compile_sketches.get_warnings_summary_report.assert_called_once_with(compile_sketches, - sketch_report_list=sketch_report_list) + compile_sketches.get_warnings_summary_report.assert_called_once_with( + compile_sketches, sketch_report_list=sketch_report_list + ) # Test no summary report data (size deltas not enabled) compilesketches.CompileSketches.get_sizes_summary_report.return_value = [] @@ -2064,16 +2358,15 @@ def test_get_sketches_report(monkeypatch, mocker): assert compile_sketches.get_sketches_report(sketch_report_list=sketch_report_list) == { compilesketches.CompileSketches.ReportKeys.commit_hash: current_git_ref, - compilesketches.CompileSketches.ReportKeys.commit_url: ("https://github.com/" - + github_repository - + "/commit/" - + current_git_ref), + compilesketches.CompileSketches.ReportKeys.commit_url: ( + "https://github.com/" + github_repository + "/commit/" + current_git_ref + ), compilesketches.CompileSketches.ReportKeys.boards: [ { compilesketches.CompileSketches.ReportKeys.board: compile_sketches.fqbn, - compilesketches.CompileSketches.ReportKeys.sketches: sketch_report_list + compilesketches.CompileSketches.ReportKeys.sketches: sketch_report_list, } - ] + ], } @@ -2086,17 +2379,17 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 42, - compilesketches.CompileSketches.ReportKeys.relative: 5.142 - } + compilesketches.CompileSketches.ReportKeys.relative: 5.142, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 2.242 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 2.242, + }, + }, ] }, { @@ -2106,19 +2399,19 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 8, - compilesketches.CompileSketches.ReportKeys.relative: 1.542 - } + compilesketches.CompileSketches.ReportKeys.relative: 1.542, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 33, - compilesketches.CompileSketches.ReportKeys.relative: 10.042 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 10.042, + }, + }, ] - } + }, ] expected_sizes_summary_report = [ @@ -2128,13 +2421,13 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 8, - compilesketches.CompileSketches.ReportKeys.maximum: 42 + compilesketches.CompileSketches.ReportKeys.maximum: 42, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 1.542, - compilesketches.CompileSketches.ReportKeys.maximum: 5.142 - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 5.142, + }, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", @@ -2142,14 +2435,14 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 11, - compilesketches.CompileSketches.ReportKeys.maximum: 33 + compilesketches.CompileSketches.ReportKeys.maximum: 33, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 2.242, - compilesketches.CompileSketches.ReportKeys.maximum: 10.042 - } - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 10.042, + }, + }, + }, ] compile_sketches = get_compilesketches_object() @@ -2167,17 +2460,17 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: "N/A", compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: "N/A", - compilesketches.CompileSketches.ReportKeys.relative: "N/A" - } + compilesketches.CompileSketches.ReportKeys.relative: "N/A", + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 2.742 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 2.742, + }, + }, ] }, { @@ -2187,19 +2480,19 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 8, - compilesketches.CompileSketches.ReportKeys.relative: 2.442 - } + compilesketches.CompileSketches.ReportKeys.relative: 2.442, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 33, - compilesketches.CompileSketches.ReportKeys.relative: 4.942 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 4.942, + }, + }, ] - } + }, ] expected_sizes_summary_report = [ @@ -2209,13 +2502,13 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 8, - compilesketches.CompileSketches.ReportKeys.maximum: 8 + compilesketches.CompileSketches.ReportKeys.maximum: 8, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 2.442, - compilesketches.CompileSketches.ReportKeys.maximum: 2.442 - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 2.442, + }, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", @@ -2223,14 +2516,14 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 11, - compilesketches.CompileSketches.ReportKeys.maximum: 33 + compilesketches.CompileSketches.ReportKeys.maximum: 33, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 2.742, - compilesketches.CompileSketches.ReportKeys.maximum: 4.942 - } - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 4.942, + }, + }, + }, ] assert compile_sketches.get_sizes_summary_report(sketch_report_list=sketch_report_list) == ( @@ -2246,17 +2539,17 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: "N/A", compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: "N/A", - compilesketches.CompileSketches.ReportKeys.relative: "N/A" - } + compilesketches.CompileSketches.ReportKeys.relative: "N/A", + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 0.842 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 0.842, + }, + }, ] }, { @@ -2266,19 +2559,19 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: "N/A", compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: "N/A", - compilesketches.CompileSketches.ReportKeys.relative: "N/A" - } + compilesketches.CompileSketches.ReportKeys.relative: "N/A", + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: 33, - compilesketches.CompileSketches.ReportKeys.relative: 7.742 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 7.742, + }, + }, ] - } + }, ] expected_sizes_summary_report = [ @@ -2288,13 +2581,13 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: "N/A", - compilesketches.CompileSketches.ReportKeys.maximum: "N/A" + compilesketches.CompileSketches.ReportKeys.maximum: "N/A", }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: "N/A", - compilesketches.CompileSketches.ReportKeys.maximum: "N/A" - } - } + compilesketches.CompileSketches.ReportKeys.maximum: "N/A", + }, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", @@ -2302,14 +2595,14 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 11, - compilesketches.CompileSketches.ReportKeys.maximum: 33 + compilesketches.CompileSketches.ReportKeys.maximum: 33, }, compilesketches.CompileSketches.ReportKeys.relative: { compilesketches.CompileSketches.ReportKeys.minimum: 0.842, - compilesketches.CompileSketches.ReportKeys.maximum: 7.742 - } - } - } + compilesketches.CompileSketches.ReportKeys.maximum: 7.742, + }, + }, + }, ] assert compile_sketches.get_sizes_summary_report(sketch_report_list=sketch_report_list) == ( @@ -2325,17 +2618,17 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: 42, - compilesketches.CompileSketches.ReportKeys.relative: 2.342 - } + compilesketches.CompileSketches.ReportKeys.relative: 2.342, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: 11, - compilesketches.CompileSketches.ReportKeys.relative: 1.142 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 1.142, + }, + }, ] }, { @@ -2345,22 +2638,31 @@ def test_get_sizes_summary_report(): compilesketches.CompileSketches.ReportKeys.maximum: 111, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: 5, - compilesketches.CompileSketches.ReportKeys.relative: 0.542 - } + compilesketches.CompileSketches.ReportKeys.relative: 0.542, + }, }, { compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", - compilesketches.CompileSketches.ReportKeys.maximum: 111, + compilesketches.CompileSketches.ReportKeys.maximum: 222, compilesketches.CompileSketches.ReportKeys.current: { compilesketches.CompileSketches.ReportKeys.absolute: 33, - compilesketches.CompileSketches.ReportKeys.relative: 3.342 - } - } + compilesketches.CompileSketches.ReportKeys.relative: 3.342, + }, + }, ] - } + }, ] - expected_sizes_summary_report = [] + expected_sizes_summary_report = [ + { + compilesketches.CompileSketches.ReportKeys.name: "Foo memory type", + compilesketches.CompileSketches.ReportKeys.maximum: 111, + }, + { + compilesketches.CompileSketches.ReportKeys.name: "Bar memory type", + compilesketches.CompileSketches.ReportKeys.maximum: 222, + }, + ] assert compile_sketches.get_sizes_summary_report(sketch_report_list=sketch_report_list) == ( expected_sizes_summary_report @@ -2384,14 +2686,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: 3 } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 3, - compilesketches.CompileSketches.ReportKeys.maximum: 42 + compilesketches.CompileSketches.ReportKeys.maximum: 42, } } } @@ -2414,14 +2716,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: 42 } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 3, - compilesketches.CompileSketches.ReportKeys.maximum: 42 + compilesketches.CompileSketches.ReportKeys.maximum: 42, } } } @@ -2445,14 +2747,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: 3 } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 3, - compilesketches.CompileSketches.ReportKeys.maximum: 3 + compilesketches.CompileSketches.ReportKeys.maximum: 3, } } } @@ -2475,14 +2777,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: compile_sketches.not_applicable_indicator } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: 42, - compilesketches.CompileSketches.ReportKeys.maximum: 42 + compilesketches.CompileSketches.ReportKeys.maximum: 42, } } } @@ -2505,14 +2807,14 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: compile_sketches.not_applicable_indicator } } - } + }, ] expected_warnings_summary_report = { compilesketches.CompileSketches.ReportKeys.delta: { compilesketches.CompileSketches.ReportKeys.absolute: { compilesketches.CompileSketches.ReportKeys.minimum: compile_sketches.not_applicable_indicator, - compilesketches.CompileSketches.ReportKeys.maximum: compile_sketches.not_applicable_indicator + compilesketches.CompileSketches.ReportKeys.maximum: compile_sketches.not_applicable_indicator, } } } @@ -2536,7 +2838,7 @@ def test_get_warnings_summary_report(): compilesketches.CompileSketches.ReportKeys.absolute: 3 } } - } + }, ] expected_warnings_summary_report = {} @@ -2557,20 +2859,23 @@ def test_get_warnings_summary_report(): def test_create_sketches_report_file(monkeypatch, tmp_path): sketches_report_path = tmp_path - sketches_report = [{ - "sketch": "examples/Foo", - "compilation_success": True, - "flash": 444, - "ram": 9, - "previous_flash": 1438, - "previous_ram": 184, - "flash_delta": -994, - "ram_delta": -175, - "fqbn": "arduino:avr:uno" - }] - - compile_sketches = get_compilesketches_object(sketches_report_path=str(sketches_report_path), - fqbn_arg="arduino:avr:uno") + sketches_report = [ + { + "sketch": "examples/Foo", + "compilation_success": True, + "flash": 444, + "ram": 9, + "previous_flash": 1438, + "previous_ram": 184, + "flash_delta": -994, + "ram_delta": -175, + "fqbn": "arduino:avr:uno", + } + ] + + compile_sketches = get_compilesketches_object( + sketches_report_path=str(sketches_report_path), fqbn_arg="arduino:avr:uno" + ) compile_sketches.create_sketches_report_file(sketches_report=sketches_report) @@ -2578,17 +2883,35 @@ def test_create_sketches_report_file(monkeypatch, tmp_path): assert json.load(sketch_report_file) == sketches_report -@pytest.mark.parametrize("cli_version, command, original_key, expected_key", - [("latest", "core list", "ID", "id"), # Non-semver - ("1.0.0", "core list", "ID", "id"), # > - ("0.17.0", "core list", "ID", "ID"), # == - ("0.14.0-rc2", "core list", "ID", "ID"), # < - ("1.0.0", "foo", "ID", "ID"), # Command has no translation - ("1.0.0", "core list", "foo", "foo")]) # Key has no translation -def test_cli_json_key(cli_version, command, original_key, expected_key): +@pytest.mark.parametrize( + "cli_version, data, assertion", + [ + ("latest", {"platforms": None}, []), # Non-semver + ("latest", {"platforms": [unittest.mock.sentinel.list_item]}, [unittest.mock.sentinel.list_item]), # Non-semver + ("2.0.0", {"platforms": [unittest.mock.sentinel.list_item]}, [unittest.mock.sentinel.list_item]), # > + ("1.0.0", {"platforms": [unittest.mock.sentinel.list_item]}, [unittest.mock.sentinel.list_item]), # == + ("0.1.2", [unittest.mock.sentinel.list_item], [unittest.mock.sentinel.list_item]), # < + ], +) +def test_cli_core_list_platform_list(cli_version, data, assertion): + compile_sketches = get_compilesketches_object(cli_version=cli_version) + + assert compile_sketches.cli_core_list_platform_list(data) == assertion + + +@pytest.mark.parametrize( + "cli_version, command, key_name, expected_key", + [ + ("latest", "core list", "installed_version", "installed_version"), # Non-semver + ("0.1.2", "core list", "installed_version", "Installed"), + ("0.17.1", "core list", "installed_version", "installed"), + ("1.2.3", "core list", "installed_version", "installed_version"), + ], +) +def test_cli_json_key(cli_version, command, key_name, expected_key): compile_sketches = get_compilesketches_object(cli_version=cli_version) - assert compile_sketches.cli_json_key(command, original_key) == expected_key + assert compile_sketches.cli_json_key(command, key_name) == expected_key @pytest.mark.parametrize("verbose", ["true", "false"]) @@ -2602,36 +2925,48 @@ def test_verbose_print(capsys, verbose): compile_sketches.verbose_print(string_print_argument, int_print_argument, path_print_argument) if verbose == "true": - assert capsys.readouterr().out.strip() == (string_print_argument + " " - + str(int_print_argument) + " " - + str(path_print_argument)) + assert capsys.readouterr().out.strip() == ( + string_print_argument + " " + str(int_print_argument) + " " + str(path_print_argument) + ) else: assert capsys.readouterr().out.strip() == "" -@pytest.mark.parametrize("list_argument, expected_list", - [("", []), - ("foobar", ["foobar"]), - ("foo bar", ["foo", "bar"]), - ("\"foo bar\"", ["foo bar"]), - ("\'foo bar\'", ["foo bar"]), - ("\'\"foo bar\" \"baz\"\'", ["foo bar", "baz"]), - ("\'\"foo bar\" baz\'", ["foo bar", "baz"])]) +@pytest.mark.parametrize( + "list_argument, expected_list", + [ + ("", []), + ("foobar", ["foobar"]), + ("foo bar", ["foo", "bar"]), + ('"foo bar"', ["foo bar"]), + ("'foo bar'", ["foo bar"]), + ('\'"foo bar" "baz"\'', ["foo bar", "baz"]), + ("'\"foo bar\" baz'", ["foo bar", "baz"]), + ], +) def test_parse_list_input(list_argument, expected_list): assert compilesketches.parse_list_input(list_argument) == expected_list -@pytest.mark.parametrize("fqbn_arg, expected_fqbn, expected_additional_url", - [("foo:bar:baz", "foo:bar:baz", None), - ("\"foo:bar:baz\"", "foo:bar:baz", None), - ("\"foo asdf:bar:baz\"", "foo asdf:bar:baz", None), - ("\'foo:bar:baz\'", "foo:bar:baz", None), - ("\'\"foo asdf:bar:baz\" https://example.com/package_foo_index.json\'", - "foo asdf:bar:baz", - "https://example.com/package_foo_index.json"), - ("\'\"foo asdf:bar:baz\" \"https://example.com/package_foo_index.json\"\'", - "foo asdf:bar:baz", - "https://example.com/package_foo_index.json")]) +@pytest.mark.parametrize( + "fqbn_arg, expected_fqbn, expected_additional_url", + [ + ("foo:bar:baz", "foo:bar:baz", None), + ('"foo:bar:baz"', "foo:bar:baz", None), + ('"foo asdf:bar:baz"', "foo asdf:bar:baz", None), + ("'foo:bar:baz'", "foo:bar:baz", None), + ( + "'\"foo asdf:bar:baz\" https://example.com/package_foo_index.json'", + "foo asdf:bar:baz", + "https://example.com/package_foo_index.json", + ), + ( + '\'"foo asdf:bar:baz" "https://example.com/package_foo_index.json"\'', + "foo asdf:bar:baz", + "https://example.com/package_foo_index.json", + ), + ], +) def test_parse_fqbn_arg_input(fqbn_arg, expected_fqbn, expected_additional_url): parsed_fqbn_arg = compilesketches.parse_fqbn_arg_input(fqbn_arg=fqbn_arg) @@ -2639,32 +2974,41 @@ def test_parse_fqbn_arg_input(fqbn_arg, expected_fqbn, expected_additional_url): assert parsed_fqbn_arg["additional_url"] == expected_additional_url -@pytest.mark.parametrize("boolean_input, expected_output", - [("true", True), ("True", True), ("false", False), ("False", False), ("foo", None)]) +@pytest.mark.parametrize( + "boolean_input, expected_output", + [("true", True), ("True", True), ("false", False), ("False", False), ("foo", None)], +) def test_parse_boolean_input(boolean_input, expected_output): assert compilesketches.parse_boolean_input(boolean_input=boolean_input) == expected_output -@pytest.mark.parametrize("path, expected_relative_path", - # Path under workspace - [(os.environ["GITHUB_WORKSPACE"] + "/baz", pathlib.PurePath("baz")), - # Path outside workspace - ("/bar/foo", pathlib.Path("/").resolve().joinpath("bar", "foo"))]) +@pytest.mark.parametrize( + "path, expected_relative_path", + # Path under workspace + [ + (os.environ["GITHUB_WORKSPACE"] + "/baz", pathlib.PurePath("baz")), + # Path outside workspace + ("/bar/foo", pathlib.Path("/").resolve().joinpath("bar", "foo")), + ], +) def test_path_relative_to_workspace(path, expected_relative_path): assert compilesketches.path_relative_to_workspace(path=path) == expected_relative_path assert compilesketches.path_relative_to_workspace(path=pathlib.PurePath(path)) == expected_relative_path -@pytest.mark.parametrize("path, expected_absolute_path", - # Absolute path - [("/asdf", pathlib.Path("/").resolve().joinpath("asdf")), - # Relative path - ("asdf", pathlib.Path(os.environ["GITHUB_WORKSPACE"]).resolve().joinpath("asdf")), - # Use of ~ - ("~/foo", pathlib.Path.home().joinpath("foo")), - # Use of .. - ("/foo/bar/../baz", pathlib.Path("/").resolve().joinpath("foo", "baz")) - ]) +@pytest.mark.parametrize( + "path, expected_absolute_path", + # Absolute path + [ + ("/asdf", pathlib.Path("/").resolve().joinpath("asdf")), + # Relative path + ("asdf", pathlib.Path(os.environ["GITHUB_WORKSPACE"]).resolve().joinpath("asdf")), + # Use of ~ + ("~/foo", pathlib.Path.home().joinpath("foo")), + # Use of .. + ("/foo/bar/../baz", pathlib.Path("/").resolve().joinpath("foo", "baz")), + ], +) def test_absolute_path(path, expected_absolute_path): assert compilesketches.absolute_path(path=path) == expected_absolute_path assert compilesketches.absolute_path(path=pathlib.PurePath(path)) == expected_absolute_path @@ -2672,15 +3016,13 @@ def test_absolute_path(path, expected_absolute_path): @pytest.mark.parametrize( "path, expected_path", - [("foo/bar-relative-path", pathlib.PurePath("foo/bar-relative-path")), - ("/foo/bar-absolute-path", pathlib.Path("/").resolve().joinpath("foo", "bar-absolute-path"))] + [ + ("foo/bar-relative-path", pathlib.PurePath("foo/bar-relative-path")), + ("/foo/bar-absolute-path", pathlib.Path("/").resolve().joinpath("foo", "bar-absolute-path")), + ], ) def test_absolute_relative_path_conversion(path, expected_path): - assert compilesketches.path_relative_to_workspace( - path=compilesketches.absolute_path( - path=path - ) - ) == expected_path + assert compilesketches.path_relative_to_workspace(path=compilesketches.absolute_path(path=path)) == expected_path def test_list_to_string(): @@ -2688,19 +3030,19 @@ def test_list_to_string(): assert compilesketches.list_to_string([42, path]) == "42 " + str(path) -@pytest.mark.parametrize("arcname, source_path, destination_name, expected_destination_name, expected_success", - [("FooArcname", ".", None, "FooArcname", True), - ("FooArcname", "./Sketch1", "FooDestinationName", "FooDestinationName", True), - ("FooArcname", "Sketch1", None, "Sketch1", True), - (".", "Sketch1", None, "Sketch1", True), - ("FooArcname", "Nonexistent", None, "", False), ]) -def test_install_from_download(capsys, - tmp_path, - arcname, - source_path, - destination_name, - expected_destination_name, - expected_success): +@pytest.mark.parametrize( + "arcname, source_path, destination_name, expected_destination_name, expected_success", + [ + ("FooArcname", ".", None, "FooArcname", True), + ("FooArcname", "./Sketch1", "FooDestinationName", "FooDestinationName", True), + ("FooArcname", "Sketch1", None, "Sketch1", True), + (".", "Sketch1", None, "Sketch1", True), + ("FooArcname", "Nonexistent", None, "", False), + ], +) +def test_install_from_download( + capsys, tmp_path, arcname, source_path, destination_name, expected_destination_name, expected_success +): url_source_path = test_data_path.joinpath("HasSketches") compile_sketches = get_compilesketches_object() @@ -2718,39 +3060,58 @@ def test_install_from_download(capsys, destination_parent_path = tmp_path.joinpath("destination_parent_path") if expected_success: - compile_sketches.install_from_download(url=url, - source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name) + compile_sketches.install_from_download( + url=url, + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + ) # Verify that the installation matches the source - assert directories_are_same(left_directory=url_source_path.joinpath(source_path), - right_directory=destination_parent_path.joinpath(expected_destination_name)) + assert directories_are_same( + left_directory=url_source_path.joinpath(source_path), + right_directory=destination_parent_path.joinpath(expected_destination_name), + ) else: with pytest.raises(expected_exception=SystemExit, match="1"): - compile_sketches.install_from_download(url=url, - source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name) + compile_sketches.install_from_download( + url=url, + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + ) assert capsys.readouterr().out.strip() == ("::error::Archive source path: " + source_path + " not found") -@pytest.mark.parametrize("archive_extract_path, expected_archive_root_path", - [(test_data_path.joinpath("test_get_archive_root_folder_name", "has-root"), - test_data_path.joinpath("test_get_archive_root_folder_name", "has-root", "root")), - (test_data_path.joinpath("test_get_archive_root_folder_name", "has-file"), - test_data_path.joinpath("test_get_archive_root_folder_name", "has-file")), - (test_data_path.joinpath("test_get_archive_root_folder_name", "has-folders"), - test_data_path.joinpath("test_get_archive_root_folder_name", "has-folders"))]) +@pytest.mark.parametrize( + "archive_extract_path, expected_archive_root_path", + [ + ( + test_data_path.joinpath("test_get_archive_root_folder_name", "has-root"), + test_data_path.joinpath("test_get_archive_root_folder_name", "has-root", "root"), + ), + ( + test_data_path.joinpath("test_get_archive_root_folder_name", "has-file"), + test_data_path.joinpath("test_get_archive_root_folder_name", "has-file"), + ), + ( + test_data_path.joinpath("test_get_archive_root_folder_name", "has-folders"), + test_data_path.joinpath("test_get_archive_root_folder_name", "has-folders"), + ), + ], +) def test_get_archive_root_path(archive_extract_path, expected_archive_root_path): assert compilesketches.get_archive_root_path(archive_extract_path) == expected_archive_root_path -@pytest.mark.parametrize("url, source_path, destination_name, expected_destination_name", - [("https://example.com/foo/FooRepositoryName.git", ".", None, "FooRepositoryName"), - ("https://example.com/foo/FooRepositoryName.git/", "./examples", "FooDestinationName", - "FooDestinationName"), - ("git://example.com/foo/FooRepositoryName", "examples", None, None)]) +@pytest.mark.parametrize( + "url, source_path, destination_name, expected_destination_name", + [ + ("https://example.com/foo/FooRepositoryName.git", ".", None, "FooRepositoryName"), + ("https://example.com/foo/FooRepositoryName.git/", "./examples", "FooDestinationName", "FooDestinationName"), + ("git://example.com/foo/FooRepositoryName", "examples", None, None), + ], +) def test_install_from_repository(mocker, url, source_path, destination_name, expected_destination_name): git_ref = unittest.mock.sentinel.git_ref destination_parent_path = unittest.mock.sentinel.destination_parent_path @@ -2763,27 +3124,29 @@ def test_install_from_repository(mocker, url, source_path, destination_name, exp compile_sketches = get_compilesketches_object() - compile_sketches.install_from_repository(url=url, - git_ref=git_ref, - source_path=source_path, - destination_parent_path=destination_parent_path, - destination_name=destination_name, - force=force) + compile_sketches.install_from_repository( + url=url, + git_ref=git_ref, + source_path=source_path, + destination_parent_path=destination_parent_path, + destination_name=destination_name, + force=force, + ) # noinspection PyUnresolvedReferences - tempfile.mkdtemp.assert_called_once_with(dir=compile_sketches.temporary_directory.name, - prefix="install_from_repository-") - compile_sketches.clone_repository.assert_called_once_with(compile_sketches, - url=url, - git_ref=git_ref, - destination_path=clone_path) + tempfile.mkdtemp.assert_called_once_with( + dir=compile_sketches.temporary_directory.name, prefix="install_from_repository-" + ) + compile_sketches.clone_repository.assert_called_once_with( + compile_sketches, url=url, git_ref=git_ref, destination_path=clone_path + ) # noinspection PyUnresolvedReferences compile_sketches.install_from_path.assert_called_once_with( compile_sketches, source_path=clone_path.joinpath(source_path), destination_parent_path=destination_parent_path, destination_name=expected_destination_name, - force=force + force=force, ) @@ -2811,12 +3174,12 @@ def test_clone_repository(tmp_path, git_ref): cloned_repository.git.checkout(git_ref) # Verify that the installation matches the test clone - assert directories_are_same(left_directory=destination_path, - right_directory=test_clone_path) + assert directories_are_same(left_directory=destination_path, right_directory=test_clone_path) -@pytest.mark.parametrize("github_event, expected_hash", - [("pull_request", "pull_request-head-sha"), ("push", "push-head-sha")]) +@pytest.mark.parametrize( + "github_event, expected_hash", [("pull_request", "pull_request-head-sha"), ("push", "push-head-sha")] +) def test_get_head_commit_hash(monkeypatch, mocker, github_event, expected_hash): # Stub class Repo: diff --git a/compilesketches/tests/testdata/test_get_warning_count_from_output/has-warnings.txt b/compilesketches/tests/testdata/test_get_warning_count_from_output/has-warnings.txt index 2b96b7fe..8156a4a8 100644 --- a/compilesketches/tests/testdata/test_get_warning_count_from_output/has-warnings.txt +++ b/compilesketches/tests/testdata/test_get_warning_count_from_output/has-warnings.txt @@ -1,324 +1,324 @@ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, - from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1, - from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, - from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: -/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h: In function 'void initProperties()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) - ^ -/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:21:16: note: in expansion of macro 'addProperty' - ArduinoCloud.addProperty(switchButton, WRITE, ON_CHANGE, onSwitchButtonChange); - ^~~~~~~~~~~ -In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, - from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:107:10: note: declared here - void addPropertyReal(bool& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, - from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) - ^ -/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:22:16: note: in expansion of macro 'addProperty' - ArduinoCloud.addProperty(location, READ, ON_CHANGE); - ^~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:106:10: note: declared here - void addPropertyReal(Property& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) - ^ -/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:23:16: note: in expansion of macro 'addProperty' - ArduinoCloud.addProperty(color, READWRITE, ON_CHANGE, onColorChange); - ^~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:106:10: note: declared here - void addPropertyReal(Property& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.cpp:22:0: -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h: In constructor 'ConnectionHandler::ConnectionHandler(bool)': -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:209:28: warning: 'ConnectionHandler::_current_net_connection_state' will be initialized after [-Wreorder] - NetworkConnectionState _current_net_connection_state; - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:208:19: warning: 'long unsigned int ConnectionHandler::_lastConnectionTickTime' [-Wreorder] - unsigned long _lastConnectionTickTime; - ^~~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.cpp:28:1: warning: when initialized here [-Wreorder] - ConnectionHandler::ConnectionHandler(bool const keep_alive) - ^~~~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:22:0, - from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.h:25, - from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp:22: -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp: In member function 'virtual NetworkConnectionState WiFiConnectionHandler::update_handleInit()': -/github/home/Arduino/libraries/WiFi101/src/WiFi101.h:24:38: warning: comparison with string literal results in unspecified behavior [-Waddress] - #define WIFI_FIRMWARE_LATEST_MODEL_B "19.6.1" - ^ -/github/home/Arduino/libraries/WiFi101/src/WiFi101.h:27:32: note: in expansion of macro 'WIFI_FIRMWARE_LATEST_MODEL_B' - #define WIFI_FIRMWARE_REQUIRED WIFI_FIRMWARE_LATEST_MODEL_B - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:29:42: note: in expansion of macro 'WIFI_FIRMWARE_REQUIRED' - #define WIFI_FIRMWARE_VERSION_REQUIRED WIFI_FIRMWARE_REQUIRED - ^~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp:69:32: note: in expansion of macro 'WIFI_FIRMWARE_VERSION_REQUIRED' - if (WiFi.firmwareVersion() < WIFI_FIRMWARE_VERSION_REQUIRED) - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In file included from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0, - from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105, - from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540, - from /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Arduino.h:48, - from /github/home/Arduino/libraries/WiFi101/src/utility/WiFiSocket.h:28, - from /github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:36: -/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226:0: warning: "LITTLE_ENDIAN" redefined - #define LITTLE_ENDIAN 1 - -In file included from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/sys/types.h:67:0, - from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/time.h:28, - from /github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:28: -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17:0: note: this is the location of the previous definition - #define LITTLE_ENDIAN _LITTLE_ENDIAN - -/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp: In member function 'char* WiFiClass::firmwareVersion()': -/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:343:7: warning: '%d' directive writing between 1 and 3 bytes into a region of size between 1 and 5 [-Wformat-overflow=] - char* WiFiClass::firmwareVersion() - ^~~~~~~~~ -/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:343:7: note: directive argument in the range [0, 255] -/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:356:10: note: 'sprintf' output between 6 and 12 bytes into a destination of size 9 - sprintf(_version, "%d.%d.%d", rev.u8FirmwareMajor, rev.u8FirmwareMinor, rev.u8FirmwarePatch); - ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/Arduino_DebugUtils/src/Arduino_DebugUtils.cpp: In member function 'void Arduino_DebugUtils::print(int, const __FlashStringHelper*, ...)': -/github/home/Arduino/libraries/Arduino_DebugUtils/src/Arduino_DebugUtils.cpp:86:3: warning: second parameter of 'va_start' not last named argument [-Wvarargs] - va_start(args, fmt_str.c_str()); - ^~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:52:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:124:10: note: declared here - void addPropertyReal(Property& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:85:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:125:10: note: declared here - void addPropertyReal(bool& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:91:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here - void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) - ^~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:107:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:126:10: note: declared here - void addPropertyReal(float& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:113:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here - void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) - ^~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:129:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:127:10: note: declared here - void addPropertyReal(int& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:135:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here - void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) - ^~~~~~~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:151:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:128:10: note: declared here - void addPropertyReal(String& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); - ^~~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:157:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] - addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here - void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) - ^~~~~~~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.h:27, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:25: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:28:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h: In copy constructor 'CryptoUtil::CryptoUtil(const CryptoUtil&)': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h:60:33: warning: unused parameter 'other' [-Wunused-parameter] - CryptoUtil(CryptoUtil const & other) { } - ^~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp: In member function 'ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:208:23: warning: unused variable 'internal_posix_time' [-Wunused-variable] - unsigned long const internal_posix_time = _time_service.getTime(); - ^~~~~~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBOREncoder.h:25, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBOREncoder.cpp:22: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.cpp:28: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/stdio.h: In function 'open_memstream': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:108:1: warning: control reaches end of non-void function [-Wreturn-type] - } - ^ -At top level: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:77:12: warning: 'close_buffer' defined but not used [-Wunused-function] - static int close_buffer(void *cookie) - ^~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:52:16: warning: 'write_to_buffer' defined but not used [-Wunused-function] - static RetType write_to_buffer(void *cookie, const char *data, LenType len) - ^~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/property/PropertyContainer.h:25:0, - from /github/home/Arduino/libraries/ArduinoIoTCloud/src/property/PropertyContainer.cpp:22: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.pbc); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] - setAttribute((int&)_cloud_value.inp); - ^ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/Property.h:45:42: note: in definition of macro 'setAttribute' - #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) - ^ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.cpp:35:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h: In constructor 'BearSSLClient::BearSSLClient(Client*, const br_x509_trust_anchor*, int, GetTimeCallbackFunc)': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h:95:8: warning: 'BearSSLClient::_noSNI' will be initialized after [-Wreorder] - bool _noSNI; - ^~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h:93:23: warning: 'long unsigned int (* BearSSLClient::_get_time_func)()' [-Wreorder] - GetTimeCallbackFunc _get_time_func; - ^~~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.cpp:39:1: warning: when initialized here [-Wreorder] - BearSSLClient::BearSSLClient(Client* client, const br_x509_trust_anchor* myTAs, int myNumTAs, GetTimeCallbackFunc func) : - ^~~~~~~~~~~~~ -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/profile/aiotc_profile.c: In function 'aiotc_client_profile_init': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/profile/aiotc_profile.c:54:7: warning: unused variable 'id' [-Wunused-variable] - int id; - ^~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.cpp:22:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h: In copy constructor 'CryptoUtil::CryptoUtil(const CryptoUtil&)': -/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h:60:33: warning: unused parameter 'other' [-Wunused-parameter] - CryptoUtil(CryptoUtil const & other) { } - ^~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.cpp:25:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.h:57:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] - static char constexpr * NTP_TIME_SERVER = "time.arduino.cc"; - ^~~~~~~~~~~~~~~~~ -In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/TimeService.cpp:26:0: -/github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.h:57:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] - static char constexpr * NTP_TIME_SERVER = "time.arduino.cc"; - ^~~~~~~~~~~~~~~~~ -In file included from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0, - from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105, - from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540, - from /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Arduino.h:48, - from /github/home/Arduino/libraries/RTCZero/src/RTCZero.h:23, - from /github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:22: -/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226:0: warning: "LITTLE_ENDIAN" redefined - #define LITTLE_ENDIAN 1 - -In file included from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/sys/types.h:67:0, - from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/time.h:28, - from /github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:20: -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17:0: note: this is the location of the previous definition - #define LITTLE_ENDIAN _LITTLE_ENDIAN - -/github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp: In member function 'void RTCZero::begin(bool)': -/github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:96:26: warning: 'oldTime.RTC_MODE2_CLOCK_Type::reg' may be used uninitialized in this function [-Wmaybe-uninitialized] - RTC->MODE2.CLOCK.reg = oldTime.reg; -Sketch uses 134184 bytes (51%) of program storage space. Maximum is 262144 bytes. -Global variables use 23208 bytes (70%) of dynamic memory, leaving 9560 bytes for local variables. Maximum is 32768 bytes. +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, + from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1, + from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, + from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: +/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h: In function 'void initProperties()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) + ^ +/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:21:16: note: in expansion of macro 'addProperty' + ArduinoCloud.addProperty(switchButton, WRITE, ON_CHANGE, onSwitchButtonChange); + ^~~~~~~~~~~ +In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, + from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:107:10: note: declared here + void addPropertyReal(bool& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +In file included from /tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:1:0, + from /github/workspace/examples/ArduinoIoTCloud-Advanced/ArduinoIoTCloud-Advanced.ino:14: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) + ^ +/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:22:16: note: in expansion of macro 'addProperty' + ArduinoCloud.addProperty(location, READ, ON_CHANGE); + ^~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:106:10: note: declared here + void addPropertyReal(Property& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:100:64: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + #define addProperty( v, ...) addPropertyReal(v, #v, __VA_ARGS__) + ^ +/tmp/arduino-sketch-0CD64181F5310E3579165DCB549C8EEE/sketch/thingProperties.h:23:16: note: in expansion of macro 'addProperty' + ArduinoCloud.addProperty(color, READWRITE, ON_CHANGE, onColorChange); + ^~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:106:10: note: declared here + void addPropertyReal(Property& property, String name, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.cpp:22:0: +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h: In constructor 'ConnectionHandler::ConnectionHandler(bool)': +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:209:28: warning: 'ConnectionHandler::_current_net_connection_state' will be initialized after [-Wreorder] + NetworkConnectionState _current_net_connection_state; + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:208:19: warning: 'long unsigned int ConnectionHandler::_lastConnectionTickTime' [-Wreorder] + unsigned long _lastConnectionTickTime; + ^~~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.cpp:28:1: warning: when initialized here [-Wreorder] + ConnectionHandler::ConnectionHandler(bool const keep_alive) + ^~~~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:22:0, + from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.h:25, + from /github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp:22: +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp: In member function 'virtual NetworkConnectionState WiFiConnectionHandler::update_handleInit()': +/github/home/Arduino/libraries/WiFi101/src/WiFi101.h:24:38: warning: comparison with string literal results in unspecified behavior [-Waddress] + #define WIFI_FIRMWARE_LATEST_MODEL_B "19.6.1" + ^ +/github/home/Arduino/libraries/WiFi101/src/WiFi101.h:27:32: note: in expansion of macro 'WIFI_FIRMWARE_LATEST_MODEL_B' + #define WIFI_FIRMWARE_REQUIRED WIFI_FIRMWARE_LATEST_MODEL_B + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_ConnectionHandler.h:29:42: note: in expansion of macro 'WIFI_FIRMWARE_REQUIRED' + #define WIFI_FIRMWARE_VERSION_REQUIRED WIFI_FIRMWARE_REQUIRED + ^~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_ConnectionHandler/src/Arduino_WiFiConnectionHandler.cpp:69:32: note: in expansion of macro 'WIFI_FIRMWARE_VERSION_REQUIRED' + if (WiFi.firmwareVersion() < WIFI_FIRMWARE_VERSION_REQUIRED) + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +In file included from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0, + from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105, + from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540, + from /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Arduino.h:48, + from /github/home/Arduino/libraries/WiFi101/src/utility/WiFiSocket.h:28, + from /github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:36: +/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226:0: warning: "LITTLE_ENDIAN" redefined + #define LITTLE_ENDIAN 1 + +In file included from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/sys/types.h:67:0, + from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/time.h:28, + from /github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:28: +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17:0: note: this is the location of the previous definition + #define LITTLE_ENDIAN _LITTLE_ENDIAN + +/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp: In member function 'char* WiFiClass::firmwareVersion()': +/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:343:7: warning: '%d' directive writing between 1 and 3 bytes into a region of size between 1 and 5 [-Wformat-overflow=] + char* WiFiClass::firmwareVersion() + ^~~~~~~~~ +/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:343:7: note: directive argument in the range [0, 255] +/github/home/Arduino/libraries/WiFi101/src/WiFi.cpp:356:10: note: 'sprintf' output between 6 and 12 bytes into a destination of size 9 + sprintf(_version, "%d.%d.%d", rev.u8FirmwareMajor, rev.u8FirmwareMinor, rev.u8FirmwarePatch); + ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/Arduino_DebugUtils/src/Arduino_DebugUtils.cpp: In member function 'void Arduino_DebugUtils::print(int, const __FlashStringHelper*, ...)': +/github/home/Arduino/libraries/Arduino_DebugUtils/src/Arduino_DebugUtils.cpp:86:3: warning: second parameter of 'va_start' not last named argument [-Wvarargs] + va_start(args, fmt_str.c_str()); + ^~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:52:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:124:10: note: declared here + void addPropertyReal(Property& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:85:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:125:10: note: declared here + void addPropertyReal(bool& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(bool&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:91:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here + void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) + ^~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:107:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:126:10: note: declared here + void addPropertyReal(float& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(float&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:113:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here + void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) + ^~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:129:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:127:10: note: declared here + void addPropertyReal(int& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(int&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:135:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here + void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) + ^~~~~~~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:151:84: warning: 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(property, name, -1, permission_type, seconds, fn, minDelta, synFn); + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:128:10: note: declared here + void addPropertyReal(String& property, String name, int tag, permissionType permission_type = READWRITE, long seconds = ON_CHANGE, void(*fn)(void) = NULL, float minDelta = 0.0f, void(*synFn)(Property & property) = CLOUD_WINS) __attribute__((deprecated("Use addProperty(property, Permission::ReadWrite) instead."))); + ^~~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp: In member function 'void ArduinoIoTCloudClass::addPropertyReal(String&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:157:79: warning: 'void ArduinoIoTCloudClass::addPropertyReal(Property&, String, int, permissionType, long int, void (*)(), float, void (*)(Property&))' is deprecated: Use addProperty(property, Permission::ReadWrite) instead. [-Wdeprecated-declarations] + addPropertyReal(*p, name, tag, permission_type, seconds, fn, minDelta, synFn); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.cpp:55:6: note: declared here + void ArduinoIoTCloudClass::addPropertyReal(Property& property, String name, int tag, permissionType permission_type, long seconds, void(*fn)(void), float minDelta, void(*synFn)(Property & property)) + ^~~~~~~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloud.h:32, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.h:27, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:25: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:28:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h: In copy constructor 'CryptoUtil::CryptoUtil(const CryptoUtil&)': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h:60:33: warning: unused parameter 'other' [-Wunused-parameter] + CryptoUtil(CryptoUtil const & other) { } + ^~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp: In member function 'ArduinoIoTCloudTCP::State ArduinoIoTCloudTCP::handle_SyncTime()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/ArduinoIoTCloudTCP.cpp:208:23: warning: unused variable 'internal_posix_time' [-Wunused-variable] + unsigned long const internal_posix_time = _time_service.getTime(); + ^~~~~~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBOREncoder.h:25, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBOREncoder.cpp:22: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.h:29, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/CBORDecoder.cpp:28: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/../property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/stdio.h: In function 'open_memstream': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:108:1: warning: control reaches end of non-void function [-Wreturn-type] + } + ^ +At top level: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:77:12: warning: 'close_buffer' defined but not used [-Wunused-function] + static int close_buffer(void *cookie) + ^~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/cbor/lib/tinycbor/src/open_memstream.c:52:16: warning: 'write_to_buffer' defined but not used [-Wunused-function] + static RetType write_to_buffer(void *cookie, const char *data, LenType len) + ^~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/property/PropertyContainer.h:25:0, + from /github/home/Arduino/libraries/ArduinoIoTCloud/src/property/PropertyContainer.cpp:22: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h: In member function 'virtual void CloudTelevision::setAttributesFromCloud()': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h:229:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.pbc); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/types/automation/CloudTelevision.h:230:39: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] + setAttribute((int&)_cloud_value.inp); + ^ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/property/Property.h:45:42: note: in definition of macro 'setAttribute' + #define setAttribute(x) setAttributeReal(x, getAttributeName(#x, '.')) + ^ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.cpp:35:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h: In constructor 'BearSSLClient::BearSSLClient(Client*, const br_x509_trust_anchor*, int, GetTimeCallbackFunc)': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h:95:8: warning: 'BearSSLClient::_noSNI' will be initialized after [-Wreorder] + bool _noSNI; + ^~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.h:93:23: warning: 'long unsigned int (* BearSSLClient::_get_time_func)()' [-Wreorder] + GetTimeCallbackFunc _get_time_func; + ^~~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/BearSSLClient.cpp:39:1: warning: when initialized here [-Wreorder] + BearSSLClient::BearSSLClient(Client* client, const br_x509_trust_anchor* myTAs, int myNumTAs, GetTimeCallbackFunc func) : + ^~~~~~~~~~~~~ +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/profile/aiotc_profile.c: In function 'aiotc_client_profile_init': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/profile/aiotc_profile.c:54:7: warning: unused variable 'id' [-Wunused-variable] + int id; + ^~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.cpp:22:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h: In copy constructor 'CryptoUtil::CryptoUtil(const CryptoUtil&)': +/github/home/Arduino/libraries/ArduinoIoTCloud/src/tls/utility/CryptoUtil.h:60:33: warning: unused parameter 'other' [-Wunused-parameter] + CryptoUtil(CryptoUtil const & other) { } + ^~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.cpp:25:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.h:57:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] + static char constexpr * NTP_TIME_SERVER = "time.arduino.cc"; + ^~~~~~~~~~~~~~~~~ +In file included from /github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/TimeService.cpp:26:0: +/github/home/Arduino/libraries/ArduinoIoTCloud/src/utility/time/NTPUtils.h:57:53: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] + static char constexpr * NTP_TIME_SERVER = "time.arduino.cc"; + ^~~~~~~~~~~~~~~~~ +In file included from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21.h:69:0, + from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd.h:105, + from /github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/sam.h:540, + from /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Arduino.h:48, + from /github/home/Arduino/libraries/RTCZero/src/RTCZero.h:23, + from /github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:22: +/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/samd21/include/samd21g18a.h:226:0: warning: "LITTLE_ENDIAN" redefined + #define LITTLE_ENDIAN 1 + +In file included from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/sys/types.h:67:0, + from /github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/time.h:28, + from /github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:20: +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/arm-none-eabi/include/machine/endian.h:17:0: note: this is the location of the previous definition + #define LITTLE_ENDIAN _LITTLE_ENDIAN + +/github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp: In member function 'void RTCZero::begin(bool)': +/github/home/Arduino/libraries/RTCZero/src/RTCZero.cpp:96:26: warning: 'oldTime.RTC_MODE2_CLOCK_Type::reg' may be used uninitialized in this function [-Wmaybe-uninitialized] + RTC->MODE2.CLOCK.reg = oldTime.reg; +Sketch uses 134184 bytes (51%) of program storage space. Maximum is 262144 bytes. +Global variables use 23208 bytes (70%) of dynamic memory, leaving 9560 bytes for local variables. Maximum is 32768 bytes. diff --git a/compilesketches/tests/testdata/test_get_warning_count_from_output/no-warnings.txt b/compilesketches/tests/testdata/test_get_warning_count_from_output/no-warnings.txt index f5f157f6..087aa801 100644 --- a/compilesketches/tests/testdata/test_get_warning_count_from_output/no-warnings.txt +++ b/compilesketches/tests/testdata/test_get_warning_count_from_output/no-warnings.txt @@ -1,96 +1,96 @@ -Using board 'mkrwifi1010' from platform in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8 -Using core 'arduino' from platform in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8 -Detecting libraries used... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null -Alternatives for Arduino_LSM9DS1.h: [Arduino_LSM9DS1@1.1.0] -ResolveLibrary(Arduino_LSM9DS1.h) - -> candidates: [Arduino_LSM9DS1@1.1.0] -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null -Alternatives for Wire.h: [Wire@1.0] -ResolveLibrary(Wire.h) - -> candidates: [Wire@1.0] -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/Arduino/libraries/Arduino_LSM9DS1/src/LSM9DS1.cpp -o /dev/null -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire/Wire.cpp -o /dev/null -Generating function prototypes... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/preproc/ctags_target_for_gcc_minus_e.cpp -/github/home/.arduino15/packages/builtin/tools/ctags/5.8-arduino11/ctags -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/preproc/ctags_target_for_gcc_minus_e.cpp -Compiling sketch... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp.o -Compiling libraries... -Compiling library "Arduino_LSM9DS1" -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/Arduino/libraries/Arduino_LSM9DS1/src/LSM9DS1.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Arduino_LSM9DS1/LSM9DS1.cpp.o -Compiling library "Wire" -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire/Wire.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Wire/Wire.cpp.o -Compiling core... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010/variant.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/variant.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -c -g -x assembler-with-cpp -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/pulse_asm.S -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse_asm.S.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WInterrupts.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WInterrupts.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/cortex_handlers.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/cortex_handlers.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/delay.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/delay.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/hooks.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/hooks.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/itoa.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/itoa.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/pulse.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/startup.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/startup.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_analog.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_analog.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_digital.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_digital.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_private.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_private.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_shift.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_shift.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/samd21_host.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/samd21_host.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/avr/dtostrf.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/avr/dtostrf.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/IPAddress.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/IPAddress.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Print.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Print.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Reset.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Reset.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/SERCOM.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/SERCOM.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Stream.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Stream.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Tone.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Tone.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Uart.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Uart.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WMath.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WMath.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WString.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WString.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/abi.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/abi.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/main.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/main.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/new.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/new.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/CDC.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/CDC.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/PluggableUSB.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/PluggableUSB.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/USBCore.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/USBCore.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse_asm.S.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/samd21_host.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WInterrupts.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/avr/dtostrf.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/cortex_handlers.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/delay.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/hooks.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/itoa.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/startup.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_analog.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_digital.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_private.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_shift.c.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/IPAddress.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Print.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Reset.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/SERCOM.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Stream.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Tone.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/CDC.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/PluggableUSB.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/USBCore.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Uart.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WMath.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WString.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/abi.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/main.cpp.o -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/new.cpp.o -Archiving built core (caching) in: /tmp/arduino-core-cache/core_arduino_samd_mkrwifi1010_c2ac4c84ccc3ab26fc3af2e1db872c29.a -Linking everything together... -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -L/tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412 -Os -Wl,--gc-sections -save-temps -T/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010/linker_scripts/gcc/flash_with_bootloader.ld -Wl,-Map,/tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.map --specs=nano.specs --specs=nosys.specs -mcpu=cortex-m0plus -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Arduino_LSM9DS1/LSM9DS1.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Wire/Wire.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/variant.cpp.o -Wl,--start-group -L/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Lib/GCC/ -larm_cortexM0l_math -lm /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a -Wl,--end-group -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-objcopy -O binary /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.bin -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-objcopy -O ihex -R .eeprom /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.hex -Using library Arduino_LSM9DS1 at version 1.1.0 in folder: /github/home/Arduino/libraries/Arduino_LSM9DS1 -Using library Wire at version 1.0 in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire -/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-size -A /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf -Sketch uses 23356 bytes (8%) of program storage space. Maximum is 262144 bytes. -Global variables use 3544 bytes (10%) of dynamic memory, leaving 29224 bytes for local variables. Maximum is 32768 bytes. +Using board 'mkrwifi1010' from platform in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8 +Using core 'arduino' from platform in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8 +Detecting libraries used... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null +Alternatives for Arduino_LSM9DS1.h: [Arduino_LSM9DS1@1.1.0] +ResolveLibrary(Arduino_LSM9DS1.h) + -> candidates: [Arduino_LSM9DS1@1.1.0] +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null +Alternatives for Wire.h: [Wire@1.0] +ResolveLibrary(Wire.h) + -> candidates: [Wire@1.0] +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /dev/null +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/Arduino/libraries/Arduino_LSM9DS1/src/LSM9DS1.cpp -o /dev/null +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire/Wire.cpp -o /dev/null +Generating function prototypes... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -w -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -w -x c++ -E -CC -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/preproc/ctags_target_for_gcc_minus_e.cpp +/github/home/.arduino15/packages/builtin/tools/ctags/5.8-arduino11/ctags -u --language-force=c++ -f - --c++-kinds=svpf --fields=KSTtzns --line-directives /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/preproc/ctags_target_for_gcc_minus_e.cpp +Compiling sketch... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp.o +Compiling libraries... +Compiling library "Arduino_LSM9DS1" +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/Arduino/libraries/Arduino_LSM9DS1/src/LSM9DS1.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Arduino_LSM9DS1/LSM9DS1.cpp.o +Compiling library "Wire" +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 -I/github/home/Arduino/libraries/Arduino_LSM9DS1/src -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire/Wire.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Wire/Wire.cpp.o +Compiling core... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010/variant.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/variant.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -c -g -x assembler-with-cpp -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/pulse_asm.S -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse_asm.S.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WInterrupts.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WInterrupts.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/cortex_handlers.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/cortex_handlers.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/delay.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/delay.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/hooks.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/hooks.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/itoa.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/itoa.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/pulse.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/startup.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/startup.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_analog.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_analog.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_digital.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_digital.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_private.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_private.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/wiring_shift.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_shift.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/samd21_host.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/samd21_host.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-gcc -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu11 -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/avr/dtostrf.c -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/avr/dtostrf.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/IPAddress.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/IPAddress.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Print.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Print.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Reset.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Reset.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/SERCOM.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/SERCOM.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Stream.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Stream.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Tone.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Tone.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/Uart.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Uart.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WMath.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WMath.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/WString.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WString.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/abi.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/abi.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/main.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/main.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/new.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/new.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/CDC.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/CDC.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/PluggableUSB.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/PluggableUSB.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -mcpu=cortex-m0plus -mthumb -c -g -Os -Wall -Wextra -Wno-expansion-to-defined -std=gnu++11 -ffunction-sections -fdata-sections -fno-threadsafe-statics -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -MMD -DF_CPU=48000000L -DARDUINO=10607 -DARDUINO_SAMD_MKRWIFI1010 -DARDUINO_ARCH_SAMD -DUSE_ARDUINO_MKR_PIN_LAYOUT -D__SAMD21G18A__ -DUSB_VID=0x2341 -DUSB_PID=0x8054 -DUSBCON "-DUSB_MANUFACTURER=\"Arduino LLC\"" "-DUSB_PRODUCT=\"Arduino MKR WiFi 1010\"" -DUSE_BQ24195L_PMIC -I/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Include/ -I/github/home/.arduino15/packages/arduino/tools/CMSIS-Atmel/1.2.0/CMSIS/Device/ATMEL/ -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino -I/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010 /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/cores/arduino/USB/USBCore.cpp -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/USBCore.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse_asm.S.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/samd21_host.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WInterrupts.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/avr/dtostrf.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/cortex_handlers.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/delay.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/hooks.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/itoa.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/pulse.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/startup.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_analog.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_digital.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_private.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/wiring_shift.c.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/IPAddress.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Print.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Reset.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/SERCOM.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Stream.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Tone.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/CDC.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/PluggableUSB.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/USB/USBCore.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/Uart.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WMath.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/WString.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/abi.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/main.cpp.o +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-ar rcs /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/new.cpp.o +Archiving built core (caching) in: /tmp/arduino-core-cache/core_arduino_samd_mkrwifi1010_c2ac4c84ccc3ab26fc3af2e1db872c29.a +Linking everything together... +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-g++ -L/tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412 -Os -Wl,--gc-sections -save-temps -T/github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/variants/mkrwifi1010/linker_scripts/gcc/flash_with_bootloader.ld -Wl,-Map,/tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.map --specs=nano.specs --specs=nosys.specs -mcpu=cortex-m0plus -mthumb -Wl,--cref -Wl,--check-sections -Wl,--gc-sections -Wl,--unresolved-symbols=report-all -Wl,--warn-common -Wl,--warn-section-align -o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/sketch/SimpleAccelerometer.ino.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Arduino_LSM9DS1/LSM9DS1.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/libraries/Wire/Wire.cpp.o /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/variant.cpp.o -Wl,--start-group -L/github/home/.arduino15/packages/arduino/tools/CMSIS/4.5.0/CMSIS/Lib/GCC/ -larm_cortexM0l_math -lm /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/core/core.a -Wl,--end-group +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-objcopy -O binary /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.bin +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-objcopy -O ihex -R .eeprom /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.hex +Using library Arduino_LSM9DS1 at version 1.1.0 in folder: /github/home/Arduino/libraries/Arduino_LSM9DS1 +Using library Wire at version 1.0 in folder: /github/home/.arduino15/packages/arduino/hardware/samd/1.8.8/libraries/Wire +/github/home/.arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin/arm-none-eabi-size -A /tmp/arduino-sketch-F9E51E1E7C5D3C9DD5B67BD2EFC85412/SimpleAccelerometer.ino.elf +Sketch uses 23356 bytes (8%) of program storage space. Maximum is 262144 bytes. +Global variables use 3544 bytes (10%) of dynamic memory, leaving 29224 bytes for local variables. Maximum is 32768 bytes. diff --git a/docs/FAQ.md b/docs/FAQ.md new file mode 100644 index 00000000..88d21988 --- /dev/null +++ b/docs/FAQ.md @@ -0,0 +1,110 @@ +# Frequently Asked Questions + +## How can I install dependencies of a boards platform? + +### Managed Dependencies + +The Arduino **Boards Manager** system installs tool dependencies along with a platform. When you specify a [**Boards Manager**-sourced platform dependency](../README.md#boards-manager) via the action's [`platforms` input](../README.md#platforms) the managed platform dependencies are installed automatically. + +If an alternative [platform dependency source](../README.md#supported-platform-sources) is used this automatic tool dependency installation does not occur. The convenient way to install the tool dependencies in this case is to install a **Boards Manager**-sourced platform that has a dependency on the required tools in addition to the target platform from the alternative source. + +--- + +**Example:** + +```yaml +- uses: arduino/compile-sketches@v1 + with: + platforms: | + # Use Boards Manager to install the latest release of the platform to get the toolchain. + - name: arduino:avr + # Overwrite the Boards Manager installation with the development version of the platform. + - source-url: https://github.com/arduino/ArduinoCore-avr.git + name: arduino:avr +``` + +--- + +### External Dependencies + +Arduino boards platforms typically bundle all dependencies. However, there are some platforms that require the user to manually install dependencies on their system in order to use the platform. + +The **arduino/compile-sketches** action runs in the same environment as the rest of the steps of the [workflow job](https://docs.github.com/actions/using-jobs/using-jobs-in-a-workflow), which means you can simply perform the dependency installation in a prior [step](https://docs.github.com/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idsteps) of the job. + +--- + +**Example:** + +```yaml +- run: +- uses: arduino/compile-sketches@v1 +``` + +--- + +#### Python Packages + +The **arduino/compile-sketches** action uses a Python [virtual environment](https://docs.python.org/glossary.html#term-virtual-environment). In order to enable user installation of Python [package](https://docs.python.org/glossary.html#term-package) dependencies of boards platforms, the packages installed in the "[user site-packages](https://peps.python.org/pep-0370/)" folder are included in this virtual environment. + +In order to be certain your installation of a package dependency will be available to the platform, add the [`--ignore-installed`](https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-ignore-installed) and [`--user`](https://pip.pypa.io/en/stable/cli/pip_install/#install-user) flags to the [**pip**](https://pip.pypa.io/) command used to install the package. + +--- + +**Example:** + +```yaml +- run: pip install --ignore-installed --user pyserial +- uses: arduino/compile-sketches@v1 +``` + +--- + +## How can I install a platform or library dependency from an external private repository? + +The **arduino/compile-sketches** action supports installing platform and library dependencies of the sketches by cloning the repository specified via the `source-url` field of the [`platforms`](../README.md#platforms) or [`libraries`](../README.md#libraries) inputs. + +With a public repository, the dependency definition will look something like this: + +```yaml +libraries: | + - source-url: https://github.com/arduino-libraries/Servo.git +``` + +However, if `arduino-libraries/Servo` was a private repository the installation of this library by the action would fail: + +```text +fatal: could not read Username for 'https://github.com': No such device or address +``` + +In this case is necessary to configure the repository URL to provide the authentication required for **Git** to clone the repository, as documented [**here**](https://git-scm.com/docs/git-clone#_git_urls). For private GitHub repositories, the following URL format can be used: + +```text +https://@github.com/.git +``` + +where `` is a "[personal access token](https://docs.github.com/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#about-personal-access-tokens)" with `repo` scope from the account of a user with access to the private repository. + +--- + +**ⓘ** You might find it convenient to create the token under a ["machine user" account](https://docs.github.com/authentication/connecting-to-github-with-ssh/managing-deploy-keys#machine-users). + +--- + +In order to avoid leaking the token, it must be stored in a [secret](https://docs.github.com/actions/security-guides/using-secrets-in-github-actions), and that secret [referenced](https://docs.github.com/actions/security-guides/using-secrets-in-github-actions#using-secrets-in-a-workflow) in the URL. + +--- + +**Example:** + +```yaml +- uses: arduino/compile-sketches@v1 + with: + libraries: | + - source-url: https://${{ secrets.REPO_SCOPE_TOKEN }}@github.com/octocat/SomePrivateLib.git +``` + +--- + +**ⓘ** The automatically generated [`GITHUB_TOKEN` secret](https://docs.github.com/actions/security-guides/automatic-token-authentication#about-the-github_token-secret) can not be used for this purpose as it lacks the necessary permissions. + +--- diff --git a/etc/codespell-ignore-words-list.txt b/etc/codespell-ignore-words-list.txt deleted file mode 100644 index bef1c141..00000000 --- a/etc/codespell-ignore-words-list.txt +++ /dev/null @@ -1,2 +0,0 @@ -afterall -clude diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..d03d9a07 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6740 @@ +{ + "name": "compile-sketches", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "ajv-cli": "5.0.0", + "ajv-formats": "3.0.1", + "github-label-sync": "3.0.0", + "markdown-link-check": "3.14.1", + "markdown-toc": "1.2.0", + "markdownlint-cli": "0.45.0", + "prettier": "3.6.2" + }, + "engines": { + "node": "22.x" + } + }, + "node_modules/@financial-times/origami-service-makefile": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@financial-times/origami-service-makefile/-/origami-service-makefile-7.0.3.tgz", + "integrity": "sha512-aKe65sZ3XgZ/0Sm0MDLbGrcO3G4DRv/bVW4Gpmw68cRZV9IBE7h/pwfR3Rs7njNSZMFkjS4rPG/YySv9brQByA==", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@oozcitak/dom": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", + "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-cli": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ajv-cli/-/ajv-cli-5.0.0.tgz", + "integrity": "sha512-LY4m6dUv44HTyhV+u2z5uX4EhPYTM38Iv1jdgDJJJCyOOuqB8KtZEGjPZ2T+sh5ZIJrXUfgErYx/j3gLd3+PlQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0", + "fast-json-patch": "^2.0.0", + "glob": "^7.1.0", + "js-yaml": "^3.14.0", + "json-schema-migrate": "^2.0.0", + "json5": "^2.1.3", + "minimist": "^1.2.0" + }, + "bin": { + "ajv": "dist/index.js" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", + "dev": true, + "dependencies": { + "gulp-header": "^1.7.1" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.8", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", + "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", + "dev": true, + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "dependencies": { + "fill-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fast-json-patch/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "dependencies": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/github-label-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/github-label-sync/-/github-label-sync-3.0.0.tgz", + "integrity": "sha512-0tmovBWTvgOYV58fX75gv9mCc0Ow4JwPzx4N7iAPwPJ2l670Wt8wfn0SZpHCEUjqtdbXUPi/tIdABAJHeaJWfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@financial-times/origami-service-makefile": "^7.0.3", + "ajv": "^8.6.3", + "chalk": "^4.1.2", + "commander": "^6.2.1", + "got": "^12.5.3", + "js-yaml": "^3.14.1", + "node.extend": "^2.0.2", + "octonode": "^0.10.2" + }, + "bin": { + "github-label-sync": "bin/github-label-sync.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/got": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", + "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==", + "dev": true, + "dependencies": { + "ansi-red": "^0.1.1", + "coffee-script": "^1.12.4", + "extend-shallow": "^2.0.1", + "js-yaml": "^3.8.1", + "toml": "^2.3.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "deprecated": "Removed event-stream from gulp-header", + "dev": true, + "dependencies": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-link-extractor": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-link-extractor/-/html-link-extractor-1.0.5.tgz", + "integrity": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==", + "dev": true, + "dependencies": { + "cheerio": "^1.0.0-rc.10" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative-url": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.1.0.tgz", + "integrity": "sha512-vhIXKasjAuxS7n+sdv7pJQykEAgS+YU8VBQOENXwo/VZpOHDgBBsIbHo7zFKaWBjYWF4qxERdhbPRRtFAeJKfg==", + "dev": true, + "dependencies": { + "is-absolute-url": "^4.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-migrate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", + "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/katex": { + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", + "dev": true, + "dependencies": { + "set-getter": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/link-check": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.5.0.tgz", + "integrity": "sha512-CpMk2zMfyEMdDvFG92wO5pU/2I/wbw72/9pvUFhU9cDKkwhmVlPuvxQJzd/jXA2iVOgNgPLnS5zyOLW7OzNpdA==", + "dev": true, + "dependencies": { + "is-relative-url": "^4.0.0", + "ms": "^2.1.3", + "needle": "^3.3.1", + "node-email-verifier": "^2.0.0", + "proxy-agent": "^6.4.0" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==", + "dev": true, + "dependencies": { + "expand-range": "^1.8.1", + "extend-shallow": "^2.0.1", + "is-number": "^2.1.0", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-link-check": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.14.1.tgz", + "integrity": "sha512-h1tihNL3kmOS3N7H4FyF4xKDxiHnNBNSgs/LWlDiRHlC8O0vfRX0LhDDvesRSs4HM7nS0F658glLxonaXBmuWw==", + "dev": true, + "dependencies": { + "async": "^3.2.6", + "chalk": "^5.3.0", + "commander": "^14.0.0", + "link-check": "^5.5.0", + "markdown-link-extractor": "^4.0.2", + "needle": "^3.3.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "xmlbuilder2": "^3.1.1" + }, + "bin": { + "markdown-link-check": "markdown-link-check" + } + }, + "node_modules/markdown-link-check/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/markdown-link-check/node_modules/commander": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", + "dev": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/markdown-link-extractor": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-4.0.2.tgz", + "integrity": "sha512-5cUOu4Vwx1wenJgxaudsJ8xwLUMN7747yDJX3V/L7+gi3e4MsCm7w5nbrDQQy8nEfnl4r5NV3pDXMAjhGXYXAw==", + "dev": true, + "dependencies": { + "html-link-extractor": "^1.0.5", + "marked": "^12.0.1" + } + }, + "node_modules/markdown-toc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.2", + "diacritics-map": "^0.1.0", + "gray-matter": "^2.1.0", + "lazy-cache": "^2.0.2", + "list-item": "^1.1.1", + "markdown-link": "^0.1.1", + "minimist": "^1.2.0", + "mixin-deep": "^1.1.3", + "object.pick": "^1.2.0", + "remarkable": "^1.7.1", + "repeat-string": "^1.6.1", + "strip-color": "^0.1.0" + }, + "bin": { + "markdown-toc": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdownlint": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.38.0.tgz", + "integrity": "sha512-xaSxkaU7wY/0852zGApM8LdlIfGCW8ETZ0Rr62IQtAnUMlMuifsg09vWJcNYeL4f0anvr8Vo4ZQar8jGpV0btQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "4.0.2", + "micromark-core-commonmark": "2.0.3", + "micromark-extension-directive": "4.0.0", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.1", + "micromark-extension-math": "3.1.0", + "micromark-util-types": "2.0.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.45.0.tgz", + "integrity": "sha512-GiWr7GfJLVfcopL3t3pLumXCYs8sgWppjIA1F/Cc3zIMgD3tmkpyZ1xkm1Tej8mw53B93JsDjgA3KOftuYcfOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "~13.1.0", + "glob": "~11.0.2", + "ignore": "~7.0.4", + "js-yaml": "~4.1.0", + "jsonc-parser": "~3.3.1", + "jsonpointer": "~5.0.1", + "markdown-it": "~14.1.0", + "markdownlint": "~0.38.0", + "minimatch": "~10.0.1", + "run-con": "~1.3.2", + "smol-toml": "~1.3.4" + }, + "bin": { + "markdownlint": "markdownlint.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/markdownlint-cli/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/markdownlint-cli/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/markdownlint-cli/node_modules/glob": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/markdownlint-cli/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/markdownlint-cli/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/marked": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-email-verifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-email-verifier/-/node-email-verifier-2.0.0.tgz", + "integrity": "sha512-AHcppjOH2KT0mxakrxFMOMjV/gOVMRpYvnJUkNfgF9oJ3INdVmqcMFJ5TlM8elpTPwt6A7bSp1IMnnWcxGom/Q==", + "dev": true, + "dependencies": { + "ms": "^2.1.3", + "validator": "^13.11.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/node.extend": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", + "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3", + "is": "^3.2.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/octonode": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", + "integrity": "sha512-lxKJxAvrw3BuM0Wu3A/TRyFkYxMFWbMm8p7fDO3EoG9KDgOy53d91bjlGR1mmNk1EoF5LjGBx7BmIB+PfmMKLQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "deep-extend": "^0.6.0", + "randomstring": "^1.1.5", + "request": "^2.72.0" + }, + "engines": { + "node": ">0.4.11" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", + "dev": true + }, + "node_modules/randomstring": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.3.tgz", + "integrity": "sha512-3dEFySepTzp2CvH6W/ASYGguPPveBuz5MpZ7MuoUkoVehmyNl9+F9c9GFVrz2QPbM9NXTIHGcmJDY/3j4677kQ==", + "dev": true, + "dependencies": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + }, + "bin": { + "randomstring": "bin/randomstring" + }, + "engines": { + "node": "*" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dev": true, + "dependencies": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + }, + "bin": { + "remarkable": "bin/remarkable.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-con": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", + "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~4.1.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" + }, + "bin": { + "run-con": "cli.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true + }, + "node_modules/set-getter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", + "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", + "dev": true, + "dependencies": { + "to-object-path": "^0.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/smol-toml": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.4.tgz", + "integrity": "sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toml": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", + "dev": true + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/validator": { + "version": "13.15.20", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.20.tgz", + "integrity": "sha512-KxPOq3V2LmfQPP4eqf3Mq/zrT0Dqp2Vmx2Bn285LwVahLc+CsxOM0crBHczm8ijlcjZ0Q5Xd6LW3z3odTPnlrw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xmlbuilder2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", + "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oozcitak/dom": "1.15.10", + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8", + "js-yaml": "3.14.1" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + } + }, + "dependencies": { + "@financial-times/origami-service-makefile": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@financial-times/origami-service-makefile/-/origami-service-makefile-7.0.3.tgz", + "integrity": "sha512-aKe65sZ3XgZ/0Sm0MDLbGrcO3G4DRv/bVW4Gpmw68cRZV9IBE7h/pwfR3Rs7njNSZMFkjS4rPG/YySv9brQByA==", + "dev": true + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + } + }, + "@oozcitak/dom": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", + "integrity": "sha512-0JT29/LaxVgRcGKvHmSrUTEvZ8BXvZhGl2LASRUgHqDTC1M5g1pLmVv56IYNyt3bG2CUjDkc67wnyZC14pbQrQ==", + "dev": true, + "requires": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "dev": true, + "requires": { + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "dev": true, + "requires": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "dev": true + }, + "@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.1" + } + }, + "@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, + "@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "requires": { + "@types/ms": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", + "dev": true + }, + "@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true + }, + "@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true + }, + "agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-cli": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ajv-cli/-/ajv-cli-5.0.0.tgz", + "integrity": "sha512-LY4m6dUv44HTyhV+u2z5uX4EhPYTM38Iv1jdgDJJJCyOOuqB8KtZEGjPZ2T+sh5ZIJrXUfgErYx/j3gLd3+PlQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0", + "fast-json-patch": "^2.0.0", + "glob": "^7.1.0", + "js-yaml": "^3.14.0", + "json-schema-migrate": "^2.0.0", + "json5": "^2.1.3", + "minimist": "^1.2.0" + } + }, + "ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha512-GVYjmpL05al4dNlKJm53mKE4w9OOLiuVHWorsIA3YVz+Hu0hcn6PtE3Ydl0EqU7v+7ABC4mjjWsnLUxbpno+CA==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, + "async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "autolinker": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", + "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", + "dev": true, + "requires": { + "gulp-header": "^1.7.1" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true + }, + "cacheable-request": { + "version": "10.2.8", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", + "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true + }, + "character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true + }, + "character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "decode-named-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "dev": true, + "requires": { + "character-entities": "^2.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "requires": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true + }, + "devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "requires": { + "dequal": "^2.0.0" + } + }, + "diacritics-map": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", + "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", + "dev": true + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-patch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz", + "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1" + }, + "dependencies": { + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "dev": true + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "dev": true, + "requires": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-label-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/github-label-sync/-/github-label-sync-3.0.0.tgz", + "integrity": "sha512-0tmovBWTvgOYV58fX75gv9mCc0Ow4JwPzx4N7iAPwPJ2l670Wt8wfn0SZpHCEUjqtdbXUPi/tIdABAJHeaJWfA==", + "dev": true, + "requires": { + "@financial-times/origami-service-makefile": "^7.0.3", + "ajv": "^8.6.3", + "chalk": "^4.1.2", + "commander": "^6.2.1", + "got": "^12.5.3", + "js-yaml": "^3.14.1", + "node.extend": "^2.0.2", + "octonode": "^0.10.2" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "got": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", + "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + } + }, + "gray-matter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", + "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==", + "dev": true, + "requires": { + "ansi-red": "^0.1.1", + "coffee-script": "^1.12.4", + "extend-shallow": "^2.0.1", + "js-yaml": "^3.8.1", + "toml": "^2.3.2" + } + }, + "gulp-header": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", + "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", + "dev": true, + "requires": { + "concat-with-sourcemaps": "*", + "lodash.template": "^4.4.0", + "through2": "^2.0.0" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "html-link-extractor": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-link-extractor/-/html-link-extractor-1.0.5.tgz", + "integrity": "sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==", + "dev": true, + "requires": { + "cheerio": "^1.0.0-rc.10" + } + }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + } + }, + "https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "requires": { + "agent-base": "^7.1.2", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true + }, + "ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "dev": true + }, + "is": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "dev": true + }, + "is-absolute-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", + "dev": true + }, + "is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true + }, + "is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "requires": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "is-relative-url": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-4.1.0.tgz", + "integrity": "sha512-vhIXKasjAuxS7n+sdv7pJQykEAgS+YU8VBQOENXwo/VZpOHDgBBsIbHo7zFKaWBjYWF4qxERdhbPRRtFAeJKfg==", + "dev": true, + "requires": { + "is-absolute-url": "^4.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "jackspeak": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-migrate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-schema-migrate/-/json-schema-migrate-2.0.0.tgz", + "integrity": "sha512-r38SVTtojDRp4eD6WsCqiE0eNDt4v1WalBXb9cyZYw9ai5cGtBwzRNWjHzJl38w6TxFkXAIA7h+fyX3tnrAFhQ==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true + }, + "jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "katex": { + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "dev": true, + "requires": { + "commander": "^8.3.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } + } + }, + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", + "dev": true, + "requires": { + "set-getter": "^0.1.0" + } + }, + "link-check": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/link-check/-/link-check-5.5.0.tgz", + "integrity": "sha512-CpMk2zMfyEMdDvFG92wO5pU/2I/wbw72/9pvUFhU9cDKkwhmVlPuvxQJzd/jXA2iVOgNgPLnS5zyOLW7OzNpdA==", + "dev": true, + "requires": { + "is-relative-url": "^4.0.0", + "ms": "^2.1.3", + "needle": "^3.3.1", + "node-email-verifier": "^2.0.0", + "proxy-agent": "^6.4.0" + } + }, + "linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "requires": { + "uc.micro": "^2.0.0" + } + }, + "list-item": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", + "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "extend-shallow": "^2.0.1", + "is-number": "^2.1.0", + "repeat-string": "^1.5.2" + } + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true + }, + "lru-cache": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", + "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "dev": true + }, + "markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "requires": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + } + } + }, + "markdown-link": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", + "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==", + "dev": true + }, + "markdown-link-check": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/markdown-link-check/-/markdown-link-check-3.14.1.tgz", + "integrity": "sha512-h1tihNL3kmOS3N7H4FyF4xKDxiHnNBNSgs/LWlDiRHlC8O0vfRX0LhDDvesRSs4HM7nS0F658glLxonaXBmuWw==", + "dev": true, + "requires": { + "async": "^3.2.6", + "chalk": "^5.3.0", + "commander": "^14.0.0", + "link-check": "^5.5.0", + "markdown-link-extractor": "^4.0.2", + "needle": "^3.3.1", + "progress": "^2.0.3", + "proxy-agent": "^6.4.0", + "xmlbuilder2": "^3.1.1" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "commander": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", + "dev": true + } + } + }, + "markdown-link-extractor": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/markdown-link-extractor/-/markdown-link-extractor-4.0.2.tgz", + "integrity": "sha512-5cUOu4Vwx1wenJgxaudsJ8xwLUMN7747yDJX3V/L7+gi3e4MsCm7w5nbrDQQy8nEfnl4r5NV3pDXMAjhGXYXAw==", + "dev": true, + "requires": { + "html-link-extractor": "^1.0.5", + "marked": "^12.0.1" + } + }, + "markdown-toc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", + "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", + "dev": true, + "requires": { + "concat-stream": "^1.5.2", + "diacritics-map": "^0.1.0", + "gray-matter": "^2.1.0", + "lazy-cache": "^2.0.2", + "list-item": "^1.1.1", + "markdown-link": "^0.1.1", + "minimist": "^1.2.0", + "mixin-deep": "^1.1.3", + "object.pick": "^1.2.0", + "remarkable": "^1.7.1", + "repeat-string": "^1.6.1", + "strip-color": "^0.1.0" + } + }, + "markdownlint": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.38.0.tgz", + "integrity": "sha512-xaSxkaU7wY/0852zGApM8LdlIfGCW8ETZ0Rr62IQtAnUMlMuifsg09vWJcNYeL4f0anvr8Vo4ZQar8jGpV0btQ==", + "dev": true, + "requires": { + "micromark": "4.0.2", + "micromark-core-commonmark": "2.0.3", + "micromark-extension-directive": "4.0.0", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.1", + "micromark-extension-math": "3.1.0", + "micromark-util-types": "2.0.2" + } + }, + "markdownlint-cli": { + "version": "0.45.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.45.0.tgz", + "integrity": "sha512-GiWr7GfJLVfcopL3t3pLumXCYs8sgWppjIA1F/Cc3zIMgD3tmkpyZ1xkm1Tej8mw53B93JsDjgA3KOftuYcfOw==", + "dev": true, + "requires": { + "commander": "~13.1.0", + "glob": "~11.0.2", + "ignore": "~7.0.4", + "js-yaml": "~4.1.0", + "jsonc-parser": "~3.3.1", + "jsonpointer": "~5.0.1", + "markdown-it": "~14.1.0", + "markdownlint": "~0.38.0", + "minimatch": "~10.0.1", + "run-con": "~1.3.2", + "smol-toml": "~1.3.4" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true + }, + "glob": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.2.tgz", + "integrity": "sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "marked": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", + "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "dev": true + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true + }, + "micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "requires": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "requires": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "requires": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + } + }, + "micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "requires": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "requires": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "requires": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "requires": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "requires": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "requires": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "requires": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "requires": { + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "requires": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "requires": { + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true + }, + "micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true + }, + "micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "requires": { + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "requires": { + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "requires": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true + }, + "micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + } + }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true + }, + "node-email-verifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-email-verifier/-/node-email-verifier-2.0.0.tgz", + "integrity": "sha512-AHcppjOH2KT0mxakrxFMOMjV/gOVMRpYvnJUkNfgF9oJ3INdVmqcMFJ5TlM8elpTPwt6A7bSp1IMnnWcxGom/Q==", + "dev": true, + "requires": { + "ms": "^2.1.3", + "validator": "^13.11.0" + } + }, + "node.extend": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", + "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", + "dev": true, + "requires": { + "has": "^1.0.3", + "is": "^3.2.1" + } + }, + "normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + } + } + }, + "octonode": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/octonode/-/octonode-0.10.2.tgz", + "integrity": "sha512-lxKJxAvrw3BuM0Wu3A/TRyFkYxMFWbMm8p7fDO3EoG9KDgOy53d91bjlGR1mmNk1EoF5LjGBx7BmIB+PfmMKLQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "deep-extend": "^0.6.0", + "randomstring": "^1.1.5", + "request": "^2.72.0" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true + }, + "pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "dev": true, + "requires": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + } + }, + "pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "requires": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + } + }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + } + }, + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "requires": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "dev": true, + "requires": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + } + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==", + "dev": true + }, + "randomstring": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.3.tgz", + "integrity": "sha512-3dEFySepTzp2CvH6W/ASYGguPPveBuz5MpZ7MuoUkoVehmyNl9+F9c9GFVrz2QPbM9NXTIHGcmJDY/3j4677kQ==", + "dev": true, + "requires": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "remarkable": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", + "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", + "dev": true, + "requires": { + "argparse": "^1.0.10", + "autolinker": "~0.28.0" + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "requires": { + "lowercase-keys": "^3.0.0" + } + }, + "run-con": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", + "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~4.1.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "dev": true + }, + "set-getter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", + "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", + "dev": true, + "requires": { + "to-object-path": "^0.3.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "smol-toml": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.4.tgz", + "integrity": "sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==", + "dev": true + }, + "socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "requires": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "requires": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + } + } + }, + "strip-color": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", + "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "toml": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", + "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "validator": { + "version": "13.15.20", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.20.tgz", + "integrity": "sha512-KxPOq3V2LmfQPP4eqf3Mq/zrT0Dqp2Vmx2Bn285LwVahLc+CsxOM0crBHczm8ijlcjZ0Q5Xd6LW3z3odTPnlrw==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xmlbuilder2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-3.1.1.tgz", + "integrity": "sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==", + "dev": true, + "requires": { + "@oozcitak/dom": "1.15.10", + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8", + "js-yaml": "3.14.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..2176a9ef --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "devDependencies": { + "ajv-cli": "5.0.0", + "ajv-formats": "3.0.1", + "github-label-sync": "3.0.0", + "markdown-link-check": "3.14.1", + "markdown-toc": "1.2.0", + "markdownlint-cli": "0.45.0", + "prettier": "3.6.2" + }, + "engines": { + "node": "22.x" + } +} diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..e363b2cf --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1924 @@ +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "4.8.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +groups = ["pipx"] +files = [ + {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, + {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "black" +version = "25.11.0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e"}, + {file = "black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0"}, + {file = "black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37"}, + {file = "black-25.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03"}, + {file = "black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a"}, + {file = "black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170"}, + {file = "black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc"}, + {file = "black-25.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e"}, + {file = "black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac"}, + {file = "black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96"}, + {file = "black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd"}, + {file = "black-25.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409"}, + {file = "black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b"}, + {file = "black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd"}, + {file = "black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993"}, + {file = "black-25.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c"}, + {file = "black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170"}, + {file = "black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545"}, + {file = "black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda"}, + {file = "black-25.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664"}, + {file = "black-25.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3bb5ce32daa9ff0605d73b6f19da0b0e6c1f8f2d75594db539fdfed722f2b06"}, + {file = "black-25.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9815ccee1e55717fe9a4b924cae1646ef7f54e0f990da39a34fc7b264fcf80a2"}, + {file = "black-25.11.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92285c37b93a1698dcbc34581867b480f1ba3a7b92acf1fe0467b04d7a4da0dc"}, + {file = "black-25.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:43945853a31099c7c0ff8dface53b4de56c41294fa6783c0441a8b1d9bf668bc"}, + {file = "black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b"}, + {file = "black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +pytokens = ">=0.3.0" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.10)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "build" +version = "1.2.1" +description = "A simple, correct Python build frontend" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "build-1.2.1-py3-none-any.whl", hash = "sha256:75e10f767a433d9a86e50d83f418e83efc18ede923ee5ff7df93b6cb0306c5d4"}, + {file = "build-1.2.1.tar.gz", hash = "sha256:526263f4870c26f26c433545579475377b2b7588b6f1eac76a001e873ae3e19d"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "os_name == \"nt\""} +packaging = ">=19.1" +pyproject_hooks = "*" + +[package.extras] +docs = ["furo (>=2023.08.17)", "sphinx (>=7.0,<8.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)", "sphinx-issues (>=3.0.0)"] +test = ["build[uv,virtualenv]", "filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0) ; python_version < \"3.10\"", "setuptools (>=56.0.0) ; python_version == \"3.10\"", "setuptools (>=56.0.0) ; python_version == \"3.11\"", "setuptools (>=67.8.0) ; python_version >= \"3.12\"", "wheel (>=0.36.0)"] +typing = ["build[uv]", "importlib-metadata (>=5.1)", "mypy (>=1.9.0,<1.10.0)", "tomli", "typing-extensions (>=3.7.4.3)"] +uv = ["uv (>=0.1.18)"] +virtualenv = ["virtualenv (>=20.0.35)"] + +[[package]] +name = "cachecontrol" +version = "0.14.0" +description = "httplib2 caching for requests" +optional = false +python-versions = ">=3.7" +groups = ["pipx"] +files = [ + {file = "cachecontrol-0.14.0-py3-none-any.whl", hash = "sha256:f5bf3f0620c38db2e5122c0726bdebb0d16869de966ea6a2befe92470b740ea0"}, + {file = "cachecontrol-0.14.0.tar.gz", hash = "sha256:7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938"}, +] + +[package.dependencies] +filelock = {version = ">=3.8.0", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2,<2.0.0" +requests = ">=2.16.0" + +[package.extras] +dev = ["CacheControl[filecache,redis]", "black", "build", "cherrypy", "furo", "mypy", "pytest", "pytest-cov", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"] +filecache = ["filelock (>=3.8.0)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "certifi" +version = "2024.7.4" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +groups = ["main", "pipx"] +files = [ + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +groups = ["main", "pipx"] +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] +markers = {pipx = "sys_platform == \"linux\" or sys_platform == \"darwin\" or platform_python_implementation == \"PyPy\""} + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +groups = ["main", "pipx"] +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "cleo" +version = "2.1.0" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +optional = false +python-versions = ">=3.7,<4.0" +groups = ["pipx"] +files = [ + {file = "cleo-2.1.0-py3-none-any.whl", hash = "sha256:4a31bd4dd45695a64ee3c4758f583f134267c2bc518d8ae9a29cf237d009b07e"}, + {file = "cleo-2.1.0.tar.gz", hash = "sha256:0b2c880b5d13660a7ea651001fb4acb527696c01f15c9ee650f377aa543fd523"}, +] + +[package.dependencies] +crashtest = ">=0.4.1,<0.5.0" +rapidfuzz = ">=3.0.0,<4.0.0" + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "codespell" +version = "2.4.1" +description = "Fix common misspellings in text files" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "codespell-2.4.1-py3-none-any.whl", hash = "sha256:3dadafa67df7e4a3dbf51e0d7315061b80d265f9552ebd699b3dd6834b47e425"}, + {file = "codespell-2.4.1.tar.gz", hash = "sha256:299fcdcb09d23e81e35a671bbe746d5ad7e8385972e65dbb833a2eaac33c01e5"}, +] + +[package.extras] +dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] +hard-encoding-detection = ["chardet"] +toml = ["tomli ; python_version < \"3.11\""] +types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev", "pipx"] +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +markers = {dev = "platform_system == \"Windows\" or sys_platform == \"win32\"", pipx = "os_name == \"nt\""} + +[[package]] +name = "coverage" +version = "7.11.3" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "coverage-7.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c986537abca9b064510f3fd104ba33e98d3036608c7f2f5537f869bc10e1ee5"}, + {file = "coverage-7.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:28c5251b3ab1d23e66f1130ca0c419747edfbcb4690de19467cd616861507af7"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4f2bb4ee8dd40f9b2a80bb4adb2aecece9480ba1fa60d9382e8c8e0bd558e2eb"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e5f4bfac975a2138215a38bda599ef00162e4143541cf7dd186da10a7f8e69f1"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f4cbfff5cf01fa07464439a8510affc9df281535f41a1f5312fbd2b59b4ab5c"}, + {file = "coverage-7.11.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:31663572f20bf3406d7ac00d6981c7bbbcec302539d26b5ac596ca499664de31"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9799bd6a910961cb666196b8583ed0ee125fa225c6fdee2cbf00232b861f29d2"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:097acc18bedf2c6e3144eaf09b5f6034926c3c9bb9e10574ffd0942717232507"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6f033dec603eea88204589175782290a038b436105a8f3637a81c4359df27832"}, + {file = "coverage-7.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd9ca2d44ed8018c90efb72f237a2a140325a4c3339971364d758e78b175f58e"}, + {file = "coverage-7.11.3-cp310-cp310-win32.whl", hash = "sha256:900580bc99c145e2561ea91a2d207e639171870d8a18756eb57db944a017d4bb"}, + {file = "coverage-7.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:c8be5bfcdc7832011b2652db29ed7672ce9d353dd19bce5272ca33dbcf60aaa8"}, + {file = "coverage-7.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:200bb89fd2a8a07780eafcdff6463104dec459f3c838d980455cfa84f5e5e6e1"}, + {file = "coverage-7.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d264402fc179776d43e557e1ca4a7d953020d3ee95f7ec19cc2c9d769277f06"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:385977d94fc155f8731c895accdfcc3dd0d9dd9ef90d102969df95d3c637ab80"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0542ddf6107adbd2592f29da9f59f5d9cff7947b5bb4f734805085c327dcffaa"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d60bf4d7f886989ddf80e121a7f4d140d9eac91f1d2385ce8eb6bda93d563297"}, + {file = "coverage-7.11.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0a3b6e32457535df0d41d2d895da46434706dd85dbaf53fbc0d3bd7d914b362"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:876a3ee7fd2613eb79602e4cdb39deb6b28c186e76124c3f29e580099ec21a87"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a730cd0824e8083989f304e97b3f884189efb48e2151e07f57e9e138ab104200"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b5cd111d3ab7390be0c07ad839235d5ad54d2ca497b5f5db86896098a77180a4"}, + {file = "coverage-7.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:074e6a5cd38e06671580b4d872c1a67955d4e69639e4b04e87fc03b494c1f060"}, + {file = "coverage-7.11.3-cp311-cp311-win32.whl", hash = "sha256:86d27d2dd7c7c5a44710565933c7dc9cd70e65ef97142e260d16d555667deef7"}, + {file = "coverage-7.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:ca90ef33a152205fb6f2f0c1f3e55c50df4ef049bb0940ebba666edd4cdebc55"}, + {file = "coverage-7.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:56f909a40d68947ef726ce6a34eb38f0ed241ffbe55c5007c64e616663bcbafc"}, + {file = "coverage-7.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b771b59ac0dfb7f139f70c85b42717ef400a6790abb6475ebac1ecee8de782f"}, + {file = "coverage-7.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:603c4414125fc9ae9000f17912dcfd3d3eb677d4e360b85206539240c96ea76e"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:77ffb3b7704eb7b9b3298a01fe4509cef70117a52d50bcba29cffc5f53dd326a"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4d4ca49f5ba432b0755ebb0fc3a56be944a19a16bb33802264bbc7311622c0d1"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05fd3fb6edff0c98874d752013588836f458261e5eba587afe4c547bba544afd"}, + {file = "coverage-7.11.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0e920567f8c3a3ce68ae5a42cf7c2dc4bb6cc389f18bff2235dd8c03fa405de5"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4bec8c7160688bd5a34e65c82984b25409563134d63285d8943d0599efbc448e"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:adb9b7b42c802bd8cb3927de8c1c26368ce50c8fdaa83a9d8551384d77537044"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c8f563b245b4ddb591e99f28e3cd140b85f114b38b7f95b2e42542f0603eb7d7"}, + {file = "coverage-7.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e2a96fdc7643c9517a317553aca13b5cae9bad9a5f32f4654ce247ae4d321405"}, + {file = "coverage-7.11.3-cp312-cp312-win32.whl", hash = "sha256:e8feeb5e8705835f0622af0fe7ff8d5cb388948454647086494d6c41ec142c2e"}, + {file = "coverage-7.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:abb903ffe46bd319d99979cdba350ae7016759bb69f47882242f7b93f3356055"}, + {file = "coverage-7.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:1451464fd855d9bd000c19b71bb7dafea9ab815741fb0bd9e813d9b671462d6f"}, + {file = "coverage-7.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84b892e968164b7a0498ddc5746cdf4e985700b902128421bb5cec1080a6ee36"}, + {file = "coverage-7.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f761dbcf45e9416ec4698e1a7649248005f0064ce3523a47402d1bff4af2779e"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1410bac9e98afd9623f53876fae7d8a5db9f5a0ac1c9e7c5188463cb4b3212e2"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:004cdcea3457c0ea3233622cd3464c1e32ebba9b41578421097402bee6461b63"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f067ada2c333609b52835ca4d4868645d3b63ac04fb2b9a658c55bba7f667d3"}, + {file = "coverage-7.11.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:07bc7745c945a6d95676953e86ba7cebb9f11de7773951c387f4c07dc76d03f5"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8bba7e4743e37484ae17d5c3b8eb1ce78b564cb91b7ace2e2182b25f0f764cb5"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbffc22d80d86fbe456af9abb17f7a7766e7b2101f7edaacc3535501691563f7"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:0dba4da36730e384669e05b765a2c49f39514dd3012fcc0398dd66fba8d746d5"}, + {file = "coverage-7.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ae12fe90b00b71a71b69f513773310782ce01d5f58d2ceb2b7c595ab9d222094"}, + {file = "coverage-7.11.3-cp313-cp313-win32.whl", hash = "sha256:12d821de7408292530b0d241468b698bce18dd12ecaf45316149f53877885f8c"}, + {file = "coverage-7.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:6bb599052a974bb6cedfa114f9778fedfad66854107cf81397ec87cb9b8fbcf2"}, + {file = "coverage-7.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:bb9d7efdb063903b3fdf77caec7b77c3066885068bdc0d44bc1b0c171033f944"}, + {file = "coverage-7.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:fb58da65e3339b3dbe266b607bb936efb983d86b00b03eb04c4ad5b442c58428"}, + {file = "coverage-7.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8d16bbe566e16a71d123cd66382c1315fcd520c7573652a8074a8fe281b38c6a"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8258f10059b5ac837232c589a350a2df4a96406d6d5f2a09ec587cbdd539655"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4c5627429f7fbff4f4131cfdd6abd530734ef7761116811a707b88b7e205afd7"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:465695268414e149bab754c54b0c45c8ceda73dd4a5c3ba255500da13984b16d"}, + {file = "coverage-7.11.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4ebcddfcdfb4c614233cff6e9a3967a09484114a8b2e4f2c7a62dc83676ba13f"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:13b2066303a1c1833c654d2af0455bb009b6e1727b3883c9964bc5c2f643c1d0"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d8750dd20362a1b80e3cf84f58013d4672f89663aee457ea59336df50fab6739"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ab6212e62ea0e1006531a2234e209607f360d98d18d532c2fa8e403c1afbdd71"}, + {file = "coverage-7.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a6b17c2b5e0b9bb7702449200f93e2d04cb04b1414c41424c08aa1e5d352da76"}, + {file = "coverage-7.11.3-cp313-cp313t-win32.whl", hash = "sha256:426559f105f644b69290ea414e154a0d320c3ad8a2bb75e62884731f69cf8e2c"}, + {file = "coverage-7.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:90a96fcd824564eae6137ec2563bd061d49a32944858d4bdbae5c00fb10e76ac"}, + {file = "coverage-7.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:1e33d0bebf895c7a0905fcfaff2b07ab900885fc78bba2a12291a2cfbab014cc"}, + {file = "coverage-7.11.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fdc5255eb4815babcdf236fa1a806ccb546724c8a9b129fd1ea4a5448a0bf07c"}, + {file = "coverage-7.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fe3425dc6021f906c6325d3c415e048e7cdb955505a94f1eb774dafc779ba203"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:4ca5f876bf41b24378ee67c41d688155f0e54cdc720de8ef9ad6544005899240"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9061a3e3c92b27fd8036dafa26f25d95695b6aa2e4514ab16a254f297e664f83"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abcea3b5f0dc44e1d01c27090bc32ce6ffb7aa665f884f1890710454113ea902"}, + {file = "coverage-7.11.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:68c4eb92997dbaaf839ea13527be463178ac0ddd37a7ac636b8bc11a51af2428"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:149eccc85d48c8f06547534068c41d69a1a35322deaa4d69ba1561e2e9127e75"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:08c0bcf932e47795c49f0406054824b9d45671362dfc4269e0bc6e4bff010704"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:39764c6167c82d68a2d8c97c33dba45ec0ad9172570860e12191416f4f8e6e1b"}, + {file = "coverage-7.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:3224c7baf34e923ffc78cb45e793925539d640d42c96646db62dbd61bbcfa131"}, + {file = "coverage-7.11.3-cp314-cp314-win32.whl", hash = "sha256:c713c1c528284d636cd37723b0b4c35c11190da6f932794e145fc40f8210a14a"}, + {file = "coverage-7.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:c381a252317f63ca0179d2c7918e83b99a4ff3101e1b24849b999a00f9cd4f86"}, + {file = "coverage-7.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:3e33a968672be1394eded257ec10d4acbb9af2ae263ba05a99ff901bb863557e"}, + {file = "coverage-7.11.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f9c96a29c6d65bd36a91f5634fef800212dff69dacdb44345c4c9783943ab0df"}, + {file = "coverage-7.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2ec27a7a991d229213c8070d31e3ecf44d005d96a9edc30c78eaeafaa421c001"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:72c8b494bd20ae1c58528b97c4a67d5cfeafcb3845c73542875ecd43924296de"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:60ca149a446da255d56c2a7a813b51a80d9497a62250532598d249b3cdb1a926"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb5069074db19a534de3859c43eec78e962d6d119f637c41c8e028c5ab3f59dd"}, + {file = "coverage-7.11.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac5d5329c9c942bbe6295f4251b135d860ed9f86acd912d418dce186de7c19ac"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e22539b676fafba17f0a90ac725f029a309eb6e483f364c86dcadee060429d46"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:2376e8a9c889016f25472c452389e98bc6e54a19570b107e27cde9d47f387b64"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:4234914b8c67238a3c4af2bba648dc716aa029ca44d01f3d51536d44ac16854f"}, + {file = "coverage-7.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f0b4101e2b3c6c352ff1f70b3a6fcc7c17c1ab1a91ccb7a33013cb0782af9820"}, + {file = "coverage-7.11.3-cp314-cp314t-win32.whl", hash = "sha256:305716afb19133762e8cf62745c46c4853ad6f9eeba54a593e373289e24ea237"}, + {file = "coverage-7.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:9245bd392572b9f799261c4c9e7216bafc9405537d0f4ce3ad93afe081a12dc9"}, + {file = "coverage-7.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:9a1d577c20b4334e5e814c3d5fe07fa4a8c3ae42a601945e8d7940bab811d0bd"}, + {file = "coverage-7.11.3-py3-none-any.whl", hash = "sha256:351511ae28e2509c8d8cae5311577ea7dd511ab8e746ffc8814a0896c3d33fbe"}, + {file = "coverage-7.11.3.tar.gz", hash = "sha256:0f59387f5e6edbbffec2281affb71cdc85e0776c1745150a3ab9b6c1d016106b"}, +] + +[package.extras] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] + +[[package]] +name = "crashtest" +version = "0.4.1" +description = "Manage Python errors with ease" +optional = false +python-versions = ">=3.7,<4.0" +groups = ["pipx"] +files = [ + {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, + {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, +] + +[[package]] +name = "cryptography" +version = "44.0.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = "!=3.9.0,!=3.9.1,>=3.7" +groups = ["main", "pipx"] +files = [ + {file = "cryptography-44.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf688f615c29bfe9dfc44312ca470989279f0e94bb9f631f85e3459af8efc009"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7c7e2d71d908dc0f8d2027e1604102140d84b155e658c20e8ad1304317691f"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887143b9ff6bad2b7570da75a7fe8bbf5f65276365ac259a5d2d5147a73775f2"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:322eb03ecc62784536bc173f1483e76747aafeb69c8728df48537eb431cd1911"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:21377472ca4ada2906bc313168c9dc7b1d7ca417b63c1c3011d0c74b7de9ae69"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df978682c1504fc93b3209de21aeabf2375cb1571d4e61907b3e7a2540e83026"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:eb3889330f2a4a148abead555399ec9a32b13b7c8ba969b72d8e500eb7ef84cd"}, + {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6a85a93d0642bd774460a86513c5d9d80b5c002ca9693e63f6e540f1815ed0"}, + {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6f76fdd6fd048576a04c5210d53aa04ca34d2ed63336d4abd306d0cbe298fddf"}, + {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6c8acf6f3d1f47acb2248ec3ea261171a671f3d9428e34ad0357148d492c7864"}, + {file = "cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a"}, + {file = "cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00"}, + {file = "cryptography-44.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a2d8a7045e1ab9b9f803f0d9531ead85f90c5f2859e653b61497228b18452008"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8272f257cf1cbd3f2e120f14c68bff2b6bdfcc157fafdee84a1b795efd72862"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8d181e90a777b63f3f0caa836844a1182f1f265687fac2115fcf245f5fbec3"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:436df4f203482f41aad60ed1813811ac4ab102765ecae7a2bbb1dbb66dcff5a7"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4f422e8c6a28cf8b7f883eb790695d6d45b0c385a2583073f3cec434cc705e1a"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:72198e2b5925155497a5a3e8c216c7fb3e64c16ccee11f0e7da272fa93b35c4c"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a46a89ad3e6176223b632056f321bc7de36b9f9b93b2cc1cccf935a3849dc62"}, + {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:53f23339864b617a3dfc2b0ac8d5c432625c80014c25caac9082314e9de56f41"}, + {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:888fcc3fce0c888785a4876ca55f9f43787f4c5c1cc1e2e0da71ad481ff82c5b"}, + {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:00918d859aa4e57db8299607086f793fa7813ae2ff5a4637e318a25ef82730f7"}, + {file = "cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9"}, + {file = "cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1f9a92144fa0c877117e9748c74501bea842f93d21ee00b0cf922846d9d0b183"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:610a83540765a8d8ce0f351ce42e26e53e1f774a6efb71eb1b41eb01d01c3d12"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fed5cd6102bb4eb843e3315d2bf25fede494509bddadb81e03a859c1bc17b83"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f4daefc971c2d1f82f03097dc6f216744a6cd2ac0f04c68fb935ea2ba2a0d420"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94f99f2b943b354a5b6307d7e8d19f5c423a794462bde2bf310c770ba052b1c4"}, + {file = "cryptography-44.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d9c5b9f698a83c8bd71e0f4d3f9f839ef244798e5ffe96febfa9714717db7af7"}, + {file = "cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14"}, +] +markers = {pipx = "sys_platform == \"linux\""} + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=3.0.0) ; python_version >= \"3.8\""] +docstest = ["pyenchant (>=3)", "readme-renderer (>=30.0)", "sphinxcontrib-spelling (>=7.3.1)"] +nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""] +pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"] +sdist = ["build (>=1.0.0)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi (>=2024)", "cryptography-vectors (==44.0.1)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +groups = ["pipx"] +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "dulwich" +version = "0.24.1" +description = "Python Git Library" +optional = false +python-versions = ">=3.9" +groups = ["pipx"] +files = [ + {file = "dulwich-0.24.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2169c36b7955b40e1ec9b0543301a3dd536718c3b7840959ca70e7ed17397c25"}, + {file = "dulwich-0.24.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:d16507ca6d6c2d29d7d942da4cc50fa589d58ab066030992dfa3932de6695062"}, + {file = "dulwich-0.24.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:e893b800c72499e21d0160169bac574292626193532c336ffce7617fe02d97db"}, + {file = "dulwich-0.24.1-cp310-cp310-win32.whl", hash = "sha256:d7144febcad9e8510ed870a141073b07071390421691285a81cea5b9fa38d888"}, + {file = "dulwich-0.24.1-cp310-cp310-win_amd64.whl", hash = "sha256:1d8226ca444c4347e5820b4a0a3a8f91753c0e39e335eee1eaf59d9672356a9c"}, + {file = "dulwich-0.24.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:31ad6637322aaafeecc4c884f396ac2d963aadf201deb6422134fa0f8ac9a87a"}, + {file = "dulwich-0.24.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:358e4b688f6c1fa5346a8394a2c1ab79ff7126be576b20ffd0f38085ead0df54"}, + {file = "dulwich-0.24.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:50f981edd5307475f6f862ccdbe39e8dd01afc17f2ed8ee0e452c3878389b48c"}, + {file = "dulwich-0.24.1-cp311-cp311-win32.whl", hash = "sha256:741417a6a029a3230c46ad4725a50440cac852f165706824303d9939cf83770c"}, + {file = "dulwich-0.24.1-cp311-cp311-win_amd64.whl", hash = "sha256:816ec4abd152ebd11d05bf25b5d37a4a88c18af59857067ee85d32e43af12b5f"}, + {file = "dulwich-0.24.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d227cebcb2082801ab429e196d973315dbe3818904b5c13a22d80a16f5692c9"}, + {file = "dulwich-0.24.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:5e3c01b8109169aa361842af4987bca672087e3faf38d528ff9f631d1071f523"}, + {file = "dulwich-0.24.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ee80d8e9199124974b486d2c83a7e2d4db17ae59682909fa198111d8bb416f50"}, + {file = "dulwich-0.24.1-cp312-cp312-win32.whl", hash = "sha256:bef4dccba44edd6d18015f67c9e0d6216f978840cdbe703930e1679e2872c595"}, + {file = "dulwich-0.24.1-cp312-cp312-win_amd64.whl", hash = "sha256:83b2fb17bac190cfc6c91e7a94a1d806aa8ce8903aca0e3e54cecb2c3f547a55"}, + {file = "dulwich-0.24.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a11ec69fc6604228804ddfc32c85b22bc627eca4cf4ff3f27dbe822e6f29477"}, + {file = "dulwich-0.24.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:a9800df7238b586b4c38c00432776781bc889cf02d756dcfb8dc0ecb8fc47a33"}, + {file = "dulwich-0.24.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3baab4a01aff890e2e6551ccbd33eb2a44173c897f0f027ad3aeab0fb057ec44"}, + {file = "dulwich-0.24.1-cp313-cp313-win32.whl", hash = "sha256:b39689aa4d143ba1fb0a687a4eb93d2e630d2c8f940aaa6c6911e9c8dca16e6a"}, + {file = "dulwich-0.24.1-cp313-cp313-win_amd64.whl", hash = "sha256:8fca9b863b939b52c5f759d292499f0d21a7bf7f8cbb9fdeb8cdd9511c5bc973"}, + {file = "dulwich-0.24.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:62e3ed32e48e2a7e37c5a97071beac43040cd700d0cab7867514a91335916c83"}, + {file = "dulwich-0.24.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6d87cc4770a69d547ebbbac535c83af8a5b762d9e5b1c886c40cb457a1b5c2c1"}, + {file = "dulwich-0.24.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:10882685a8b03d0de321f277f6c8e6672bb849a378ad9823d482c42bb1ee8ee4"}, + {file = "dulwich-0.24.1-cp39-cp39-win32.whl", hash = "sha256:3df7ed03062e47f50675c83a7a1b73e48a95c9b413c2c8fca329b3e9f2700c04"}, + {file = "dulwich-0.24.1-cp39-cp39-win_amd64.whl", hash = "sha256:38000f553593e183189e06c6ed51377f106d28a2d98942d81eab9a10daef4663"}, + {file = "dulwich-0.24.1-py3-none-any.whl", hash = "sha256:57cc0dc5a21059698ffa4ed9a7272f1040ec48535193df84b0ee6b16bf615676"}, + {file = "dulwich-0.24.1.tar.gz", hash = "sha256:e19fd864f10f02bb834bb86167d92dcca1c228451b04458761fc13dabd447758"}, +] + +[package.dependencies] +urllib3 = ">=1.25" + +[package.extras] +colordiff = ["rich"] +dev = ["dissolve (>=0.1.1)", "mypy (==1.17.0)", "ruff (==0.12.4)"] +fastimport = ["fastimport"] +fuzzing = ["atheris"] +https = ["urllib3 (>=1.24.1)"] +merge = ["merge3"] +paramiko = ["paramiko"] +pgp = ["gpg"] + +[[package]] +name = "fastjsonschema" +version = "2.19.1" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +groups = ["pipx"] +files = [ + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.15.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, + {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8) ; python_version < \"3.11\""] + +[[package]] +name = "findpython" +version = "0.6.2" +description = "A utility to find python versions on your system" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "findpython-0.6.2-py3-none-any.whl", hash = "sha256:bda62477f858ea623ef2269f5e734469a018104a5f6c0fd9317ba238464ddb76"}, + {file = "findpython-0.6.2.tar.gz", hash = "sha256:e0c75ba9f35a7f9bb4423eb31bd17358cccf15761b6837317719177aeff46723"}, +] + +[package.dependencies] +packaging = ">=20" + +[[package]] +name = "flake8" +version = "7.3.0" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e"}, + {file = "flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872"}, +] + +[package.dependencies] +mccabe = ">=0.7.0,<0.8.0" +pycodestyle = ">=2.14.0,<2.15.0" +pyflakes = ">=3.4.0,<3.5.0" + +[[package]] +name = "gitdb" +version = "4.0.10" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, + {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.45" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"}, + {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +doc = ["sphinx (>=7.1.2,<7.2)", "sphinx-autodoc-typehints", "sphinx_rtd_theme"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock ; python_version < \"3.8\"", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions ; python_version < \"3.11\""] + +[[package]] +name = "h11" +version = "0.16.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.16" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.28.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +groups = ["main", "pipx"] +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "installer" +version = "0.7.0" +description = "A library for installing Python wheels." +optional = false +python-versions = ">=3.7" +groups = ["pipx"] +files = [ + {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, + {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +description = "Utility functions for Python class constructs" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"}, + {file = "jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "jaraco-context" +version = "6.0.1" +description = "Useful decorators and context managers" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4"}, + {file = "jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3"}, +] + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["portend", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] + +[[package]] +name = "jaraco-functools" +version = "4.1.0" +description = "Functools like those found in stdlib" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "jaraco.functools-4.1.0-py3-none-any.whl", hash = "sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649"}, + {file = "jaraco_functools-4.1.0.tar.gz", hash = "sha256:70f7e0e2ae076498e212562325e805204fc092d7b4c17e0e86c959e249701a9d"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.classes", "pytest (>=6,!=8.1.*)"] +type = ["pytest-mypy"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +optional = false +python-versions = ">=3.7" +groups = ["pipx"] +markers = "sys_platform == \"linux\"" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] + +[package.extras] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator ; python_version == \"3.6\"", "trio"] + +[[package]] +name = "keyring" +version = "25.6.0" +description = "Store and access your passwords safely." +optional = false +python-versions = ">=3.9" +groups = ["pipx"] +files = [ + {file = "keyring-25.6.0-py3-none-any.whl", hash = "sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd"}, + {file = "keyring-25.6.0.tar.gz", hash = "sha256:0b39998aa941431eb3d9b0d4b2460bc773b9df6fed7621c2dfb291a7e0187a66"}, +] + +[package.dependencies] +"jaraco.classes" = "*" +"jaraco.context" = "*" +"jaraco.functools" = "*" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\""] +completion = ["shtab (>=1.1.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["pyfakefs", "pytest (>=6,!=8.1.*)"] +type = ["pygobject-stubs", "pytest-mypy", "shtab", "types-pywin32"] + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +groups = ["dev"] +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "more-itertools" +version = "10.3.0" +description = "More routines for operating on iterables, beyond itertools" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "more-itertools-10.3.0.tar.gz", hash = "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463"}, + {file = "more_itertools-10.3.0-py3-none-any.whl", hash = "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320"}, +] + +[[package]] +name = "msgpack" +version = "1.0.8" +description = "MessagePack serializer" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, + {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, + {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, + {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, + {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, + {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, + {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, + {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, + {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, + {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, + {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, + {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, + {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, + {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, + {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, + {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, + {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151"}, + {file = "msgpack-1.0.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db"}, + {file = "msgpack-1.0.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2"}, + {file = "msgpack-1.0.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a"}, + {file = "msgpack-1.0.8-cp38-cp38-win32.whl", hash = "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c"}, + {file = "msgpack-1.0.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596"}, + {file = "msgpack-1.0.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228"}, + {file = "msgpack-1.0.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746"}, + {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, + {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, + {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +groups = ["dev"] +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "25.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["dev", "pipx"] +files = [ + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "pbs-installer" +version = "2025.2.12" +description = "Installer for Python Build Standalone" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "pbs_installer-2025.2.12-py3-none-any.whl", hash = "sha256:3d9034047945b2d5f169cd9bb324f1f28c37d0ec120d6110ddb10aa07016fb79"}, + {file = "pbs_installer-2025.2.12.tar.gz", hash = "sha256:c6815165babf312c90d27ccd16afe598de641d616860f88e1855f183b0253b39"}, +] + +[package.dependencies] +httpx = {version = ">=0.27.0,<1", optional = true, markers = "extra == \"download\""} +zstandard = {version = ">=0.21.0", optional = true, markers = "extra == \"install\""} + +[package.extras] +all = ["pbs-installer[download,install]"] +download = ["httpx (>=0.27.0,<1)"] +install = ["zstandard (>=0.21.0)"] + +[[package]] +name = "pep8-naming" +version = "0.15.1" +description = "Check PEP-8 naming conventions, plugin for flake8" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pep8_naming-0.15.1-py3-none-any.whl", hash = "sha256:eb63925e7fd9e028c7f7ee7b1e413ec03d1ee5de0e627012102ee0222c273c86"}, + {file = "pep8_naming-0.15.1.tar.gz", hash = "sha256:f6f4a499aba2deeda93c1f26ccc02f3da32b035c8b2db9696b730ef2c9639d29"}, +] + +[package.dependencies] +flake8 = ">=5.0.0" + +[[package]] +name = "pkginfo" +version = "1.12.0" +description = "Query metadata from sdists / bdists / installed packages." +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "pkginfo-1.12.0-py3-none-any.whl", hash = "sha256:dcd589c9be4da8973eceffa247733c144812759aa67eaf4bbf97016a02f39088"}, + {file = "pkginfo-1.12.0.tar.gz", hash = "sha256:8ad91a0445a036782b9366ef8b8c2c50291f83a553478ba8580c73d3215700cf"}, +] + +[package.extras] +testing = ["pytest", "pytest-cov", "wheel"] + +[[package]] +name = "platformdirs" +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +groups = ["dev", "pipx"] +files = [ + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry" +version = "2.2.1" +description = "Python dependency management and packaging made easy." +optional = false +python-versions = "<4.0,>=3.9" +groups = ["pipx"] +files = [ + {file = "poetry-2.2.1-py3-none-any.whl", hash = "sha256:f5958b908b96c5824e2acbb8b19cdef8a3351c62142d7ecff2d705396c8ca34c"}, + {file = "poetry-2.2.1.tar.gz", hash = "sha256:bef9aa4bb00ce4c10b28b25e7bac724094802d6958190762c45df6c12749b37c"}, +] + +[package.dependencies] +build = ">=1.2.1,<2.0.0" +cachecontrol = {version = ">=0.14.0,<0.15.0", extras = ["filecache"]} +cleo = ">=2.1.0,<3.0.0" +dulwich = ">=0.24.0,<0.25.0" +fastjsonschema = ">=2.18.0,<3.0.0" +findpython = ">=0.6.2,<0.8.0" +installer = ">=0.7.0,<0.8.0" +keyring = ">=25.1.0,<26.0.0" +packaging = ">=24.2" +pbs-installer = {version = ">=2025.1.6,<2026.0.0", extras = ["download", "install"]} +pkginfo = ">=1.12,<2.0" +platformdirs = ">=3.0.0,<5" +poetry-core = "2.2.1" +pyproject-hooks = ">=1.0.0,<2.0.0" +requests = ">=2.26,<3.0" +requests-toolbelt = ">=1.0.0,<2.0.0" +shellingham = ">=1.5,<2.0" +tomlkit = ">=0.11.4,<1.0.0" +trove-classifiers = ">=2022.5.19" +virtualenv = ">=20.26.6" +xattr = {version = ">=1.0.0,<2.0.0", markers = "sys_platform == \"darwin\""} + +[[package]] +name = "poetry-core" +version = "2.2.1" +description = "Poetry PEP 517 Build Backend" +optional = false +python-versions = "<4.0,>=3.9" +groups = ["pipx"] +files = [ + {file = "poetry_core-2.2.1-py3-none-any.whl", hash = "sha256:bdfce710edc10bfcf9ab35041605c480829be4ab23f5bc01202cfe5db8f125ab"}, + {file = "poetry_core-2.2.1.tar.gz", hash = "sha256:97e50d8593c8729d3f49364b428583e044087ee3def1e010c6496db76bd65ac5"}, +] + +[[package]] +name = "pycodestyle" +version = "2.14.0" +description = "Python style guide checker" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d"}, + {file = "pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main", "pipx"] +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +markers = {pipx = "sys_platform == \"linux\" or sys_platform == \"darwin\" or platform_python_implementation == \"PyPy\""} + +[[package]] +name = "pyflakes" +version = "3.4.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f"}, + {file = "pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58"}, +] + +[[package]] +name = "pygithub" +version = "2.8.1" +description = "Use the full Github API v3" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pygithub-2.8.1-py3-none-any.whl", hash = "sha256:23a0a5bca93baef082e03411bf0ce27204c32be8bfa7abc92fe4a3e132936df0"}, + {file = "pygithub-2.8.1.tar.gz", hash = "sha256:341b7c78521cb07324ff670afd1baa2bf5c286f8d9fd302c1798ba594a5400c9"}, +] + +[package.dependencies] +pyjwt = {version = ">=2.4.0", extras = ["crypto"]} +pynacl = ">=1.4.0" +requests = ">=2.14.0" +typing-extensions = ">=4.5.0" +urllib3 = ">=1.26.0" + +[[package]] +name = "pygments" +version = "2.19.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pyjwt" +version = "2.6.0" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "PyJWT-2.6.0-py3-none-any.whl", hash = "sha256:d83c3d892a77bbb74d3e1a2cfa90afaadb60945205d1095d9221f04466f64c14"}, + {file = "PyJWT-2.6.0.tar.gz", hash = "sha256:69285c7e31fc44f68a1feb309e948e0df53259d579295e6cfe2b1792329f05fd"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx (>=4.5.0,<5.0.0)", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + +[[package]] +name = "pyproject-hooks" +version = "1.1.0" +description = "Wrappers to call pyproject.toml-based build backend hooks." +optional = false +python-versions = ">=3.7" +groups = ["pipx"] +files = [ + {file = "pyproject_hooks-1.1.0-py3-none-any.whl", hash = "sha256:7ceeefe9aec63a1064c18d939bdc3adf2d8aa1988a510afec15151578b232aa2"}, + {file = "pyproject_hooks-1.1.0.tar.gz", hash = "sha256:4b37730834edbd6bd37f26ece6b44802fb1c1ee2ece0e54ddff8bfc06db86965"}, +] + +[[package]] +name = "pyserial" +version = "3.5" +description = "Python Serial Port Extension" +optional = false +python-versions = "*" +groups = ["external"] +files = [ + {file = "pyserial-3.5-py2.py3-none-any.whl", hash = "sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0"}, + {file = "pyserial-3.5.tar.gz", hash = "sha256:3c77e014170dfffbd816e6ffc205e9842efb10be9f58ec16d3e8675b4925cddb"}, +] + +[package.extras] +cp2110 = ["hidapi"] + +[[package]] +name = "pytest" +version = "9.0.1" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.10" +groups = ["dev"] +files = [ + {file = "pytest-9.0.1-py3-none-any.whl", hash = "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad"}, + {file = "pytest-9.0.1.tar.gz", hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8"}, +] + +[package.dependencies] +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +iniconfig = ">=1.0.1" +packaging = ">=22" +pluggy = ">=1.5,<2" +pygments = ">=2.7.2" + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-mock" +version = "3.15.1" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d"}, + {file = "pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f"}, +] + +[package.dependencies] +pytest = ">=6.2.5" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "pytokens" +version = "0.3.0" +description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3"}, + {file = "pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a"}, +] + +[package.extras] +dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.2" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +optional = false +python-versions = ">=3.6" +groups = ["pipx"] +markers = "sys_platform == \"win32\"" +files = [ + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main", "dev"] +files = [ + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, +] + +[[package]] +name = "rapidfuzz" +version = "3.9.3" +description = "rapid fuzzy string matching" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "rapidfuzz-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bdb8c5b8e29238ec80727c2ba3b301efd45aa30c6a7001123a6647b8e6f77ea4"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3bd0d9632088c63a241f217742b1cf86e2e8ae573e01354775bd5016d12138c"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:153f23c03d4917f6a1fc2fb56d279cc6537d1929237ff08ee7429d0e40464a18"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a96c5225e840f1587f1bac8fa6f67562b38e095341576e82b728a82021f26d62"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b777cd910ceecd738adc58593d6ed42e73f60ad04ecdb4a841ae410b51c92e0e"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53e06e4b81f552da04940aa41fc556ba39dee5513d1861144300c36c33265b76"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c7ca5b6050f18fdcacdada2dc5fb7619ff998cd9aba82aed2414eee74ebe6cd"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:87bb8d84cb41446a808c4b5f746e29d8a53499381ed72f6c4e456fe0f81c80a8"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:959a15186d18425d19811bea86a8ffbe19fd48644004d29008e636631420a9b7"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a24603dd05fb4e3c09d636b881ce347e5f55f925a6b1b4115527308a323b9f8e"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d055da0e801c71dd74ba81d72d41b2fa32afa182b9fea6b4b199d2ce937450d"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:875b581afb29a7213cf9d98cb0f98df862f1020bce9d9b2e6199b60e78a41d14"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-win32.whl", hash = "sha256:6073a46f61479a89802e3f04655267caa6c14eb8ac9d81a635a13805f735ebc1"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:119c010e20e561249b99ca2627f769fdc8305b07193f63dbc07bca0a6c27e892"}, + {file = "rapidfuzz-3.9.3-cp310-cp310-win_arm64.whl", hash = "sha256:790b0b244f3213581d42baa2fed8875f9ee2b2f9b91f94f100ec80d15b140ba9"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f57e8305c281e8c8bc720515540e0580355100c0a7a541105c6cafc5de71daae"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a4fc7b784cf987dbddc300cef70e09a92ed1bce136f7bb723ea79d7e297fe76d"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b422c0a6fe139d5447a0766268e68e6a2a8c2611519f894b1f31f0a392b9167"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f50fed4a9b0c9825ff37cf0bccafd51ff5792090618f7846a7650f21f85579c9"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b80eb7cbe62348c61d3e67e17057cddfd6defab168863028146e07d5a8b24a89"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f45be77ec82da32ce5709a362e236ccf801615cc7163b136d1778cf9e31b14"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd84b7f652a5610733400307dc732f57c4a907080bef9520412e6d9b55bc9adc"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e6d27dad8c990218b8cd4a5c99cbc8834f82bb46ab965a7265d5aa69fc7ced7"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:05ee0696ebf0dfe8f7c17f364d70617616afc7dafe366532730ca34056065b8a"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2bc8391749e5022cd9e514ede5316f86e332ffd3cfceeabdc0b17b7e45198a8c"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:93981895602cf5944d89d317ae3b1b4cc684d175a8ae2a80ce5b65615e72ddd0"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:754b719a4990735f66653c9e9261dcf52fd4d925597e43d6b9069afcae700d21"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-win32.whl", hash = "sha256:14c9f268ade4c88cf77ab007ad0fdf63699af071ee69378de89fff7aa3cae134"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc1991b4cde6c9d3c0bbcb83d5581dc7621bec8c666c095c65b4277233265a82"}, + {file = "rapidfuzz-3.9.3-cp311-cp311-win_arm64.whl", hash = "sha256:0c34139df09a61b1b557ab65782ada971b4a3bce7081d1b2bee45b0a52231adb"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d6a210347d6e71234af5c76d55eeb0348b026c9bb98fe7c1cca89bac50fb734"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b300708c917ce52f6075bdc6e05b07c51a085733650f14b732c087dc26e0aaad"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83ea7ca577d76778250421de61fb55a719e45b841deb769351fc2b1740763050"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8319838fb5b7b5f088d12187d91d152b9386ce3979ed7660daa0ed1bff953791"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:505d99131afd21529293a9a7b91dfc661b7e889680b95534756134dc1cc2cd86"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c52970f7784518d7c82b07a62a26e345d2de8c2bd8ed4774e13342e4b3ff4200"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:143caf7247449055ecc3c1e874b69e42f403dfc049fc2f3d5f70e1daf21c1318"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b8ab0fa653d9225195a8ff924f992f4249c1e6fa0aea563f685e71b81b9fcccf"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57e7c5bf7b61c7320cfa5dde1e60e678d954ede9bb7da8e763959b2138391401"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:51fa1ba84653ab480a2e2044e2277bd7f0123d6693051729755addc0d015c44f"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:17ff7f7eecdb169f9236e3b872c96dbbaf116f7787f4d490abd34b0116e3e9c8"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:afe7c72d3f917b066257f7ff48562e5d462d865a25fbcabf40fca303a9fa8d35"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-win32.whl", hash = "sha256:e53ed2e9b32674ce96eed80b3b572db9fd87aae6742941fb8e4705e541d861ce"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:35b7286f177e4d8ba1e48b03612f928a3c4bdac78e5651379cec59f95d8651e6"}, + {file = "rapidfuzz-3.9.3-cp312-cp312-win_arm64.whl", hash = "sha256:e6e4b9380ed4758d0cb578b0d1970c3f32dd9e87119378729a5340cb3169f879"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a39890013f6d5b056cc4bfdedc093e322462ece1027a57ef0c636537bdde7531"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b5bc0fdbf419493163c5c9cb147c5fbe95b8e25844a74a8807dcb1a125e630cf"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efe6e200a75a792d37b960457904c4fce7c928a96ae9e5d21d2bd382fe39066e"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de077c468c225d4c18f7188c47d955a16d65f21aab121cbdd98e3e2011002c37"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f917eaadf5388466a95f6a236f678a1588d231e52eda85374077101842e794e"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:858ba57c05afd720db8088a8707079e8d024afe4644001fe0dbd26ef7ca74a65"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d36447d21b05f90282a6f98c5a33771805f9222e5d0441d03eb8824e33e5bbb4"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:acbe4b6f1ccd5b90c29d428e849aa4242e51bb6cab0448d5f3c022eb9a25f7b1"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:53c7f27cdf899e94712972237bda48cfd427646aa6f5d939bf45d084780e4c16"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:6175682a829c6dea4d35ed707f1dadc16513270ef64436568d03b81ccb6bdb74"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:5276df395bd8497397197fca2b5c85f052d2e6a66ffc3eb0544dd9664d661f95"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:77b5c4f3e72924d7845f0e189c304270066d0f49635cf8a3938e122c437e58de"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-win32.whl", hash = "sha256:8add34061e5cd561c72ed4febb5c15969e7b25bda2bb5102d02afc3abc1f52d0"}, + {file = "rapidfuzz-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:604e0502a39cf8e67fa9ad239394dddad4cdef6d7008fdb037553817d420e108"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21047f55d674614eb4b0ab34e35c3dc66f36403b9fbfae645199c4a19d4ed447"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a56da3aff97cb56fe85d9ca957d1f55dbac7c27da927a86a2a86d8a7e17f80aa"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:964c08481aec2fe574f0062e342924db2c6b321391aeb73d68853ed42420fd6d"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e2b827258beefbe5d3f958243caa5a44cf46187eff0c20e0b2ab62d1550327a"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6e65a301fcd19fbfbee3a514cc0014ff3f3b254b9fd65886e8a9d6957fb7bca"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbe93ba1725a8d47d2b9dca6c1f435174859427fbc054d83de52aea5adc65729"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca21c0a34adee582775da997a600283e012a608a107398d80a42f9a57ad323d"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:256e07d3465173b2a91c35715a2277b1ee3ae0b9bbab4e519df6af78570741d0"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:802ca2cc8aa6b8b34c6fdafb9e32540c1ba05fca7ad60b3bbd7ec89ed1797a87"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:dd789100fc852cffac1449f82af0da139d36d84fd9faa4f79fc4140a88778343"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:5d0abbacdb06e27ff803d7ae0bd0624020096802758068ebdcab9bd49cf53115"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:378d1744828e27490a823fc6fe6ebfb98c15228d54826bf4e49e4b76eb5f5579"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-win32.whl", hash = "sha256:5d0cb272d43e6d3c0dedefdcd9d00007471f77b52d2787a4695e9dd319bb39d2"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:15e4158ac4b3fb58108072ec35b8a69165f651ba1c8f43559a36d518dbf9fb3f"}, + {file = "rapidfuzz-3.9.3-cp39-cp39-win_arm64.whl", hash = "sha256:58c6a4936190c558d5626b79fc9e16497e5df7098589a7e80d8bff68148ff096"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5410dc848c947a603792f4f51b904a3331cf1dc60621586bfbe7a6de72da1091"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:282d55700a1a3d3a7980746eb2fcd48c9bbc1572ebe0840d0340d548a54d01fe"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc1037507810833646481f5729901a154523f98cbebb1157ba3a821012e16402"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e33f779391caedcba2ba3089fb6e8e557feab540e9149a5c3f7fea7a3a7df37"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41a81a9f311dc83d22661f9b1a1de983b201322df0c4554042ffffd0f2040c37"}, + {file = "rapidfuzz-3.9.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a93250bd8fae996350c251e1752f2c03335bb8a0a5b0c7e910a593849121a435"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3617d1aa7716c57d120b6adc8f7c989f2d65bc2b0cbd5f9288f1fc7bf469da11"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad04a3f5384b82933213bba2459f6424decc2823df40098920856bdee5fd6e88"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8709918da8a88ad73c9d4dd0ecf24179a4f0ceba0bee21efc6ea21a8b5290349"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b770f85eab24034e6ef7df04b2bfd9a45048e24f8a808e903441aa5abde8ecdd"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930b4e6fdb4d914390141a2b99a6f77a52beacf1d06aa4e170cba3a98e24c1bc"}, + {file = "rapidfuzz-3.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:c8444e921bfc3757c475c4f4d7416a7aa69b2d992d5114fe55af21411187ab0d"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c1d3ef3878f871abe6826e386c3d61b5292ef5f7946fe646f4206b85836b5da"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d861bf326ee7dabc35c532a40384541578cd1ec1e1b7db9f9ecbba56eb76ca22"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cde6b9d9ba5007077ee321ec722fa714ebc0cbd9a32ccf0f4dd3cc3f20952d71"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb6546e7b6bed1aefbe24f68a5fb9b891cc5aef61bca6c1a7b1054b7f0359bb"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d8a57261ef7996d5ced7c8cba9189ada3fbeffd1815f70f635e4558d93766cb"}, + {file = "rapidfuzz-3.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:67201c02efc596923ad950519e0b75ceb78d524177ea557134d6567b9ac2c283"}, + {file = "rapidfuzz-3.9.3.tar.gz", hash = "sha256:b398ea66e8ed50451bce5997c430197d5e4b06ac4aa74602717f792d8d8d06e2"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "requests" +version = "2.32.4" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main", "pipx"] +files = [ + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset_normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["pipx"] +files = [ + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, +] + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +optional = false +python-versions = ">=3.6" +groups = ["pipx"] +markers = "sys_platform == \"linux\"" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "semver" +version = "3.0.4" +description = "Python helper for Semantic Versioning (https://semver.org)" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746"}, + {file = "semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"}, +] + +[[package]] +name = "shellingham" +version = "1.5.4" +description = "Tool to Detect Surrounding Shell" +optional = false +python-versions = ">=3.7" +groups = ["pipx"] +files = [ + {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, + {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, +] + +[[package]] +name = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["pipx"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.5" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +groups = ["pipx"] +files = [ + {file = "tomlkit-0.12.5-py3-none-any.whl", hash = "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f"}, + {file = "tomlkit-0.12.5.tar.gz", hash = "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c"}, +] + +[[package]] +name = "trove-classifiers" +version = "2024.5.22" +description = "Canonical source for classifiers on PyPI (pypi.org)." +optional = false +python-versions = "*" +groups = ["pipx"] +files = [ + {file = "trove_classifiers-2024.5.22-py3-none-any.whl", hash = "sha256:c43ade18704823e4afa3d9db7083294bc4708a5e02afbcefacd0e9d03a7a24ef"}, + {file = "trove_classifiers-2024.5.22.tar.gz", hash = "sha256:8a6242bbb5c9ae88d34cf665e816b287d2212973c8777dfaef5ec18d72ac1d03"}, +] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +groups = ["main", "pipx"] +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main", "pipx"] +files = [ + {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, + {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.26.6" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +groups = ["pipx"] +files = [ + {file = "virtualenv-20.26.6-py3-none-any.whl", hash = "sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2"}, + {file = "virtualenv-20.26.6.tar.gz", hash = "sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8) ; platform_python_implementation == \"PyPy\" or platform_python_implementation == \"CPython\" and sys_platform == \"win32\" and python_version >= \"3.13\"", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10) ; platform_python_implementation == \"CPython\""] + +[[package]] +name = "xattr" +version = "1.1.0" +description = "Python wrapper for extended filesystem attributes" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +markers = "sys_platform == \"darwin\"" +files = [ + {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef2fa0f85458736178fd3dcfeb09c3cf423f0843313e25391db2cfd1acec8888"}, + {file = "xattr-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ccab735d0632fe71f7d72e72adf886f45c18b7787430467ce0070207882cfe25"}, + {file = "xattr-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9013f290387f1ac90bccbb1926555ca9aef75651271098d99217284d9e010f7c"}, + {file = "xattr-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcd5dfbcee73c7be057676ecb900cabb46c691aff4397bf48c579ffb30bb963"}, + {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6480589c1dac7785d1f851347a32c4a97305937bf7b488b857fe8b28a25de9e9"}, + {file = "xattr-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08f61cbed52dc6f7c181455826a9ff1e375ad86f67dd9d5eb7663574abb32451"}, + {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:918e1f83f2e8a072da2671eac710871ee5af337e9bf8554b5ce7f20cdb113186"}, + {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0f06e0c1e4d06b4e0e49aaa1184b6f0e81c3758c2e8365597918054890763b53"}, + {file = "xattr-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a641ac038a9f53d2f696716147ca4dbd6a01998dc9cd4bc628801bc0df7f4d"}, + {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7e4ca0956fd11679bb2e0c0d6b9cdc0f25470cc00d8da173bb7656cc9a9cf104"}, + {file = "xattr-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6881b120f9a4b36ccd8a28d933bc0f6e1de67218b6ce6e66874e0280fc006844"}, + {file = "xattr-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dab29d9288aa28e68a6f355ddfc3f0a7342b40c9012798829f3e7bd765e85c2c"}, + {file = "xattr-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0c80bbf55339c93770fc294b4b6586b5bf8e85ec00a4c2d585c33dbd84b5006"}, + {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d1418705f253b6b6a7224b69773842cac83fcbcd12870354b6e11dd1cd54630f"}, + {file = "xattr-1.1.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687e7d18611ef8d84a6ecd8f4d1ab6757500c1302f4c2046ce0aa3585e13da3f"}, + {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b6ceb9efe0657a982ccb8b8a2efe96b690891779584c901d2f920784e5d20ae3"}, + {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b489b7916f239100956ea0b39c504f3c3a00258ba65677e4c8ba1bd0b5513446"}, + {file = "xattr-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0a9c431b0e66516a078125e9a273251d4b8e5ba84fe644b619f2725050d688a0"}, + {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1a5921ea3313cc1c57f2f53b63ea8ca9a91e48f4cc7ebec057d2447ec82c7efe"}, + {file = "xattr-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6ad2a7bd5e6cf71d4a862413234a067cf158ca0ae94a40d4b87b98b62808498"}, + {file = "xattr-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0683dae7609f7280b0c89774d00b5957e6ffcb181c6019c46632b389706b77e6"}, + {file = "xattr-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54cb15cd94e5ef8a0ef02309f1bf973ba0e13c11e87686e983f371948cfee6af"}, + {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff6223a854229055e803c2ad0c0ea9a6da50c6be30d92c198cf5f9f28819a921"}, + {file = "xattr-1.1.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d44e8f955218638c9ab222eed21e9bd9ab430d296caf2176fb37abe69a714e5c"}, + {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:caab2c2986c30f92301f12e9c50415d324412e8e6a739a52a603c3e6a54b3610"}, + {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d6eb7d5f281014cd44e2d847a9107491af1bf3087f5afeded75ed3e37ec87239"}, + {file = "xattr-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:47a3bdfe034b4fdb70e5941d97037405e3904accc28e10dbef6d1c9061fb6fd7"}, + {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:00d2b415cf9d6a24112d019e721aa2a85652f7bbc9f3b9574b2d1cd8668eb491"}, + {file = "xattr-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:78b377832dd0ee408f9f121a354082c6346960f7b6b1480483ed0618b1912120"}, + {file = "xattr-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6461a43b585e5f2e049b39bcbfcb6391bfef3c5118231f1b15d10bdb89ef17fe"}, + {file = "xattr-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24d97f0d28f63695e3344ffdabca9fcc30c33e5c8ccc198c7524361a98d526f2"}, + {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ad47d89968c9097900607457a0c89160b4771601d813e769f68263755516065"}, + {file = "xattr-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc53cab265f6e8449bd683d5ee3bc5a191e6dd940736f3de1a188e6da66b0653"}, + {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cd11e917f5b89f2a0ad639d9875943806c6c9309a3dd02da5a3e8ef92db7bed9"}, + {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9c5a78c7558989492c4cb7242e490ffb03482437bf782967dfff114e44242343"}, + {file = "xattr-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cebcf8a303a44fbc439b68321408af7267507c0d8643229dbb107f6c132d389c"}, + {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b0d73150f2f9655b4da01c2369eb33a294b7f9d56eccb089819eafdbeb99f896"}, + {file = "xattr-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:793c01deaadac50926c0e1481702133260c7cb5e62116762f6fe1543d07b826f"}, + {file = "xattr-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e189e440bcd04ccaad0474720abee6ee64890823ec0db361fb0a4fb5e843a1bf"}, + {file = "xattr-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afacebbc1fa519f41728f8746a92da891c7755e6745164bd0d5739face318e86"}, + {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b1664edf003153ac8d1911e83a0fc60db1b1b374ee8ac943f215f93754a1102"}, + {file = "xattr-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda2684228798e937a7c29b0e1c7ef3d70e2b85390a69b42a1c61b2039ba81de"}, + {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b735ac2625a4fc2c9343b19f806793db6494336338537d2911c8ee4c390dda46"}, + {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fa6a7af7a4ada43f15ccc58b6f9adcdbff4c36ba040013d2681e589e07ae280a"}, + {file = "xattr-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d1059b2f726e2702c8bbf9bbf369acfc042202a4cc576c2dec6791234ad5e948"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e2255f36ebf2cb2dbf772a7437ad870836b7396e60517211834cf66ce678b595"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dba4f80b9855cc98513ddf22b7ad8551bc448c70d3147799ea4f6c0b758fb466"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb70c16e7c3ae6ba0ab6c6835c8448c61d8caf43ea63b813af1f4dbe83dd156"}, + {file = "xattr-1.1.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83652910ef6a368b77b00825ad67815e5c92bfab551a848ca66e9981d14a7519"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7a92aff66c43fa3e44cbeab7cbeee66266c91178a0f595e044bf3ce51485743b"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d4f71b673339aeaae1f6ea9ef8ea6c9643c8cd0df5003b9a0eaa75403e2e06c"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a20de1c47b5cd7b47da61799a3b34e11e5815d716299351f82a88627a43f9a96"}, + {file = "xattr-1.1.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23705c7079b05761ff2fa778ad17396e7599c8759401abc05b312dfb3bc99f69"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:27272afeba8422f2a9d27e1080a9a7b807394e88cce73db9ed8d2dde3afcfb87"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd43978966de3baf4aea367c99ffa102b289d6c2ea5f3d9ce34a203dc2f2ab73"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded771eaf27bb4eb3c64c0d09866460ee8801d81dc21097269cf495b3cac8657"}, + {file = "xattr-1.1.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ca300c0acca4f0cddd2332bb860ef58e1465d376364f0e72a1823fdd58e90d"}, + {file = "xattr-1.1.0.tar.gz", hash = "sha256:fecbf3b05043ed3487a28190dec3e4c4d879b2fcec0e30bafd8ec5d4b6043630"}, +] + +[package.dependencies] +cffi = ">=1.16.0" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "yamllint" +version = "1.37.1" +description = "A linter for YAML files." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "yamllint-1.37.1-py3-none-any.whl", hash = "sha256:364f0d79e81409f591e323725e6a9f4504c8699ddf2d7263d8d2b539cd66a583"}, + {file = "yamllint-1.37.1.tar.gz", hash = "sha256:81f7c0c5559becc8049470d86046b36e96113637bcbe4753ecef06977c00245d"}, +] + +[package.dependencies] +pathspec = ">=0.5.3" +pyyaml = "*" + +[package.extras] +dev = ["doc8", "flake8", "flake8-import-order", "rstcheck[sphinx]", "sphinx"] + +[[package]] +name = "zstandard" +version = "0.23.0" +description = "Zstandard bindings for Python" +optional = false +python-versions = ">=3.8" +groups = ["pipx"] +files = [ + {file = "zstandard-0.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9"}, + {file = "zstandard-0.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e"}, + {file = "zstandard-0.23.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0"}, + {file = "zstandard-0.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c"}, + {file = "zstandard-0.23.0-cp310-cp310-win32.whl", hash = "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813"}, + {file = "zstandard-0.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4"}, + {file = "zstandard-0.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e"}, + {file = "zstandard-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca"}, + {file = "zstandard-0.23.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78"}, + {file = "zstandard-0.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473"}, + {file = "zstandard-0.23.0-cp311-cp311-win32.whl", hash = "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160"}, + {file = "zstandard-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0"}, + {file = "zstandard-0.23.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094"}, + {file = "zstandard-0.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373"}, + {file = "zstandard-0.23.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90"}, + {file = "zstandard-0.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35"}, + {file = "zstandard-0.23.0-cp312-cp312-win32.whl", hash = "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d"}, + {file = "zstandard-0.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b"}, + {file = "zstandard-0.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9"}, + {file = "zstandard-0.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed"}, + {file = "zstandard-0.23.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057"}, + {file = "zstandard-0.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33"}, + {file = "zstandard-0.23.0-cp313-cp313-win32.whl", hash = "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd"}, + {file = "zstandard-0.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b"}, + {file = "zstandard-0.23.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc"}, + {file = "zstandard-0.23.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152"}, + {file = "zstandard-0.23.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b"}, + {file = "zstandard-0.23.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e"}, + {file = "zstandard-0.23.0-cp38-cp38-win32.whl", hash = "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9"}, + {file = "zstandard-0.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f"}, + {file = "zstandard-0.23.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb"}, + {file = "zstandard-0.23.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58"}, + {file = "zstandard-0.23.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2"}, + {file = "zstandard-0.23.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5"}, + {file = "zstandard-0.23.0-cp39-cp39-win32.whl", hash = "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274"}, + {file = "zstandard-0.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58"}, + {file = "zstandard-0.23.0.tar.gz", hash = "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09"}, +] + +[package.dependencies] +cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""} + +[package.extras] +cffi = ["cffi (>=1.11)"] + +[metadata] +lock-version = "2.1" +python-versions = "3.12.4" +content-hash = "70373b49815ebdf4de4820430eb6166c8154ebba1c3aeeddb6a5e787d988baf7" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..46af4b83 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,42 @@ +[tool.black] +line-length = 120 + +[tool.poetry] +package-mode = false + +[tool.poetry.dependencies] +python = "3.12.4" +GitPython = "3.1.45" +PyGithub = "2.8.1" +PyYAML = "6.0.3" +semver = "3.0.4" + +[tool.poetry.group.dev.dependencies] +black = "25.11.0" +codespell = "2.4.1" +coverage = "7.11.3" +pytest = "9.0.1" +pytest-mock = "3.15.1" +flake8 = "7.3.0" +pep8-naming = "0.15.1" +yamllint = "1.37.1" + +[tool.poetry.group.external] +# Provided only for use by boards platforms +# NOTE: This group is a temporary workaround that will be removed at the 2.0.0 release of the action. +optional = true + +[tool.poetry.group.external.dependencies] +pyserial = "3.5" + +# The dependencies in this group are installed using pipx; NOT Poetry. The use of a `poetry` section is a hack required +# in order to be able to manage updates of these dependencies via Dependabot, as used for all other dependencies. +[tool.poetry.group.pipx] +optional = true + +[tool.poetry.group.pipx.dependencies] +poetry = "2.2.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 00000000..202c1cf8 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,11 @@ +# Source: https://github.com/arduino/tooling-project-assets/blob/main/workflow-templates/assets/test-python/pytest.ini +[pytest] +filterwarnings = + error + ignore::DeprecationWarning + ignore::ResourceWarning + +# --capture=no - disable per-test capture +# --tb=long sets the length of the traceback in case of failures +addopts = --capture=no --tb=long --verbose +pythonpath = compilesketches