diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index ad46b1d2..00000000 --- a/.editorconfig +++ /dev/null @@ -1,6 +0,0 @@ -root = true - -[*] -end_of_line = lf -insert_final_newline = true -charset = utf-8 \ No newline at end of file diff --git a/.github/0001-Suppress-HTML-header-and-footer-for-CLI-highlight.patch b/.github/0001-Suppress-HTML-header-and-footer-for-CLI-highlight.patch deleted file mode 100644 index 5ae3bdc7..00000000 --- a/.github/0001-Suppress-HTML-header-and-footer-for-CLI-highlight.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 31854ba31f6417e1d1747587a20db1124e6be5e9 Mon Sep 17 00:00:00 2001 -From: rsp4jack -Date: Wed, 14 Feb 2024 11:03:09 +0800 -Subject: [PATCH] Suppress HTML header and footer for CLI highlight - ---- - cli/src/main.rs | 8 -------- - 1 file changed, 8 deletions(-) - -diff --git a/cli/src/main.rs b/cli/src/main.rs -index e9308628..c0f89aca 100644 ---- a/cli/src/main.rs -+++ b/cli/src/main.rs -@@ -641,10 +641,6 @@ fn run() -> Result<()> { - highlight_options.paths, - )?; - -- if html_mode && !quiet { -- println!("{}", highlight::HTML_HEADER); -- } -- - let cancellation_flag = util::cancel_on_signal(); - - let mut language = None; -@@ -733,10 +729,6 @@ fn run() -> Result<()> { - eprintln!("No syntax highlighting config found for path {path:?}"); - } - } -- -- if html_mode && !quiet { -- println!("{}", highlight::HTML_FOOTER); -- } - } - - Commands::Tags(tags_options) => { --- -2.41.0.windows.1 - diff --git a/.github/0002-Reduce-lang_not_found-message.patch b/.github/0002-Reduce-lang_not_found-message.patch deleted file mode 100644 index faca18bf..00000000 --- a/.github/0002-Reduce-lang_not_found-message.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 1365a9a24d9fefb2acc1eb653d325bf820fc7bc9 Mon Sep 17 00:00:00 2001 -From: rsp4jack -Date: Wed, 14 Feb 2024 16:19:06 +0800 -Subject: [PATCH] Reduce lang_not_found message - ---- - cli/src/util.rs | 19 +------------------ - 1 file changed, 1 insertion(+), 18 deletions(-) - -diff --git a/cli/src/util.rs b/cli/src/util.rs -index fd4f4699..7d0e8987 100644 ---- a/cli/src/util.rs -+++ b/cli/src/util.rs -@@ -28,25 +28,8 @@ pub fn lang_not_found_for_path(path: &Path, loader_config: &LoaderConfig) -> Str - format!( - indoc! {" - No language found for path `{}` -- -- If a language should be associated with this file extension, please ensure the path to `{}` is inside one of the following directories as specified by your 'config.json':\n\n{}\n -- If the directory that contains the relevant grammar for `{}` is not listed above, please add the directory to the list of directories in your config file, {} - "}, -- path, -- path, -- loader_config -- .parser_directories -- .iter() -- .enumerate() -- .map(|(i, d)| format!(" {}. {}", i + 1, d.display())) -- .collect::>() -- .join(" \n"), -- path, -- if let Ok(Some(config_path)) = Config::find_config_file() { -- format!("located at {}", config_path.display()) -- } else { -- String::from("which you need to create by running `tree-sitter init-config`") -- } -+ path - ) - } - --- -2.41.0.windows.1 - diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 8db4daf2..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: bug -assignees: '' - ---- - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 809b7b05..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: enhancement -assignees: '' - ---- - - diff --git a/.github/actions/check-loser-homework/action.yml b/.github/actions/check-loser-homework/action.yml deleted file mode 100644 index ef157288..00000000 --- a/.github/actions/check-loser-homework/action.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: 'Check Loser Homework' -description: 'Use cmake to check loser homework' -inputs: - shell: - description: 'shell to use' - required: false - default: bash - build-path: - description: 'path to build' - required: false - default: 'build' - extra-gen-params: - description: 'extra cmake generation parameters' - required: false - default: '' - use-ninja: - description: 'use ninja to build' - required: false - default: true -runs: - using: "composite" - steps: - - uses: seanmiddleditch/gha-setup-ninja@master - if: inputs.use-ninja == 'true' - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - # https://github.com/actions/setup-python/issues/719 - # cache: 'pip' - - run: python3 -m pip install -r requirements.txt - shell: ${{ inputs.shell }} - - - name: Configure CMake - if: inputs.use-ninja == 'false' - run: cmake -B ${{ inputs.build-path }} -DCMAKE_BUILD_TYPE=Release ${{ inputs.extra-gen-params}} - shell: ${{ inputs.shell }} - - - name: Build - if: inputs.use-ninja == 'false' - run: cmake --build ${{ inputs.build-path }} --target build_loser_homework - shell: ${{ inputs.shell }} - - - name: Check run - if: inputs.use-ninja == 'false' - run: cmake --build ${{ inputs.build-path }} --target run_loser_homework - shell: ${{ inputs.shell }} - - - name: Configure CMake with Ninja - if: inputs.use-ninja == 'true' - run: cmake -B ${{ inputs.build-path }} -G Ninja -DCMAKE_BUILD_TYPE=Release ${{ inputs.extra-gen-params}} - shell: ${{ inputs.shell }} - - - name: Build with Ninja - if: inputs.use-ninja == 'true' - run: ninja -C ${{ inputs.build-path }} build_loser_homework - shell: ${{ inputs.shell }} - - - name: Check run with Ninja - if: inputs.use-ninja == 'true' - run: ninja -C ${{ inputs.build-path }} run_loser_homework - shell: ${{ inputs.shell }} \ No newline at end of file diff --git a/.github/actions/delete-unchanged-cpp-files/RemoveUnchangedCppFile.ps1 b/.github/actions/delete-unchanged-cpp-files/RemoveUnchangedCppFile.ps1 deleted file mode 100644 index d7bd308f..00000000 --- a/.github/actions/delete-unchanged-cpp-files/RemoveUnchangedCppFile.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -$allChangedFiles = $env:ALL_CHANGED_FILES -$allChangedFiles = $allChangedFiles -split ';' - -$absolutePaths = @() -foreach ($file in $allChangedFiles) { - if ($file -ne "") { - $absolutePath = Convert-Path $file - $absolutePaths += $absolutePath - } -} - -$cppFiles = Get-ChildItem -Path $env:TARGET_PATH -Recurse -File -Include *.cpp, *.cxx, *.cc -foreach ($cppFile in $cppFiles) { - if ($absolutePaths -NotContains $cppFile.FullName) { - Remove-Item $cppFile.FullName - } -} \ No newline at end of file diff --git a/.github/actions/delete-unchanged-cpp-files/action.yml b/.github/actions/delete-unchanged-cpp-files/action.yml deleted file mode 100644 index 79065abd..00000000 --- a/.github/actions/delete-unchanged-cpp-files/action.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: 'Delete unchanged cpp files' -inputs: - shell: - description: 'shell to use' - required: false - default: bash - path: - description: 'path to delete' - required: true -runs: - using: "composite" - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Set ownership - if: inputs.shell == 'bash' - shell: ${{ inputs.shell }} - run: | - # https://github.com/actions/runner/issues/2033 - # this is to fix GIT not liking owner of the checkout dir - chown -R $(id -u):$(id -g) $PWD - - - name: Get changed cpp files - id: changed-cpp-files - uses: tj-actions/changed-files@v42 - with: - separator: ";" - quotepath: false - safe_output: false - files: | - **.cpp - **.cc - **.cxx - - - name: Delete unchanged cpp files - env: - TARGET_PATH: ${{ inputs.path }} - ALL_CHANGED_FILES: ${{ steps.changed-cpp-files.outputs.all_changed_files }} - RUN_SCRIPT: ${{ inputs.shell == 'pwsh' && 'RemoveUnchangedCppFile.ps1' || 'remove_unchanged_cpp_file.sh'}} - shell: ${{ inputs.shell }} - run: .github/actions/delete-unchanged-cpp-files/${{ env.RUN_SCRIPT }} - diff --git a/.github/actions/delete-unchanged-cpp-files/remove_unchanged_cpp_file.sh b/.github/actions/delete-unchanged-cpp-files/remove_unchanged_cpp_file.sh deleted file mode 100755 index ab3f019c..00000000 --- a/.github/actions/delete-unchanged-cpp-files/remove_unchanged_cpp_file.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -exclude_path="" -IFS=';' read -ra FILES <<< "$ALL_CHANGED_FILES" -for file in "${FILES[@]}"; do - exclude_path="$exclude_path ! -path '$file'" -done -find_command="find $TARGET_PATH -type f \( -name "*.cpp" -o -name "*.cxx" -o -name "*.cc" \) $exclude_path -delete" -echo "$find_command" -eval "$find_command" -find "$TARGET_PATH" -type f \( -name "*.cpp" -o -name "*.cxx" -o -name "*.cc" \) \ No newline at end of file diff --git a/.github/docker/clang17/dockerfile b/.github/docker/clang17/dockerfile deleted file mode 100644 index 834e5ae5..00000000 --- a/.github/docker/clang17/dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -FROM ubuntu:22.04 - -ENV TZ=Asia/Shanghai -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone - -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - lsb-release \ - wget \ - curl \ - software-properties-common \ - gnupg \ - ca-certificates \ - gpg \ - software-properties-common - -RUN wget https://apt.llvm.org/llvm.sh && \ - chmod u+x llvm.sh && \ - echo | ./llvm.sh 17 all - -RUN wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null \ - | gpg --dearmor - | tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null && \ - echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main' \ - | tee /etc/apt/sources.list.d/kitware.list >/dev/null - -RUN apt-get update && \ - apt-get install -y --no-install-recommends \ - cmake \ - git - -RUN add-apt-repository ppa:deadsnakes/ppa && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - python3.12 \ - python3-pip \ No newline at end of file diff --git a/.github/tl_packages b/.github/tl_packages deleted file mode 100644 index 7bc46bda..00000000 --- a/.github/tl_packages +++ /dev/null @@ -1,14 +0,0 @@ -ctex -graphics -geometry -xcolor -fancyhdr -minted -tcolorbox -everysel -fancyvrb -upquote -environ -psnfss -bookmark -latexmk diff --git a/.github/tree-sitter.json b/.github/tree-sitter.json deleted file mode 100644 index 3180dcc7..00000000 --- a/.github/tree-sitter.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "parser-directories": [ - "~/tree-sitter-parsers" - ], - "theme": { - "constructor": "#FF6480", - "constant.builtin": { - "color": "#10B1FE" - }, - "number": { - "color": "#CE33C0" - }, - "operator": { - "color": "#7A82DA" - }, - "keyword": { - "color": "#10B1FE", - "italic": true - }, - "punctuation": "#7A82DA", - "delimiter": "#7A82DA", - "string": "#F9C859", - "property": "#CE9887", - "tag": "#3691FF", - "variable.parameter": { - "color": "#8bcdef" - }, - "comment": { - "color": "#636D83", - "italic": true - }, - "function": "#3FC56B", - "variable.builtin": { - "color": "#10B1FE", - "italic": true - }, - "type.builtin": { - "color": "#10B1FE", - "italic": true - }, - "type": "#FF6480", - "attribute": { - "color": "#FF936A" - }, - "constant": "#9F7EFE", - "function.builtin": { - "color": "#10B1FE" - }, - "module": "#FF6480", - "label": "#50acae", - "annotation": "#50acae", - "text": "#ABB2BF", - "none": "#ABB2BF", - "spell": "#ABB2BF", - - "markup.link": { - "color": "#3691FF", - "underline": true - }, - "markup.heading": "#10B1FE", - "markup.bold": { - "color": "#d52753", - "bold": true - } - } -} diff --git a/.github/workflows/build-tex.yml.disabled b/.github/workflows/build-tex.yml.disabled deleted file mode 100644 index 80d327d2..00000000 --- a/.github/workflows/build-tex.yml.disabled +++ /dev/null @@ -1,128 +0,0 @@ -name: Build TeX files - -on: - workflow_dispatch: - inputs: - tag_name: - description: "Tag name for release" - required: false - default: nightly - schedule: - - cron: 0 0 * * * - push: - branches: [ "main" ] - tags: ["v[0-9]+.[0-9]+.[0-9]+*"] - paths: - - "**.tex" - - '**.cmake' - - '**/CMakeLists.txt' - - '.github/workflows/build-tex.yml' - pull_request: - branches: [ "main" ] - paths: - - "**.tex" - - '**.cmake' - - '**/CMakeLists.txt' - - '.github/workflows/build-tex.yml' - -jobs: - build-tex: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - # https://github.com/actions/setup-python/issues/719 - # cache: 'pip' - - run: python3 -m pip install -r requirements.txt - - # - name: Install ghostscript - # run: | - # sudo apt update - # sudo apt install ghostscript - - - name: Install TeX Live - uses: zauguin/install-texlive@v3 - with: - package_file: .github/tl_packages - - - name: Configure CMake - run: | - cmake -B ${{github.workspace}}/build -DBUILD_DOCS=ON -DBUILD_PROG=OFF - - - name: Build - run: cmake --build ${{github.workspace}}/build --target latexmkdocs - - # - name: Copy build files - # run: cp -r build/docs . - - # - name: Git commit - # run: | - # git config user.name github-actions - # git config user.email github-actions@github.com - # git add . - # git commit -m "chore: update generated docs" - # git push - - - name: Update artifacts - uses: actions/upload-artifact@v4 - with: - name: docs - path: build/docs - - release: - runs-on: ubuntu-latest - needs: build-tex - permissions: - contents: write - steps: - - uses: actions/checkout@v4 - - - name: Download artifacts - uses: actions/download-artifact@v4 - with: - name: docs - path: artifacts_docs - - - name: Archive and compress - run: | - find artifacts_docs/ -printf "%P\n" | tar -cvf adocs.tar --no-recursion -C artifacts_docs/ -T - - zstd -z -1 adocs.tar -o loser-homework-docs-nightly.tar.zst - - - if: github.event_name == 'workflow_dispatch' - run: echo "TAG_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV - - - if: github.event_name == 'schedule' - run: echo 'TAG_NAME=nightly' >> $GITHUB_ENV - - - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') - run: | - TAG_NAME=${{ github.ref }} - echo "TAG_NAME=${TAG_NAME#refs/tags/}" >> $GITHUB_ENV - echo "DRAFT=true" >> $GITHUB_ENV - - - if: env.TAG_NAME == 'nightly' - name: Delete previous nightly - env: - GH_TOKEN: ${{ github.token }} - run: | - echo 'PRERELEASE=true' >> $GITHUB_ENV - gh release delete nightly --yes || true - git config user.name github-actions - git config user.email github-actions@github.com - git push origin :nightly || true - - name: Wait a sec - run: sleep 2 - - name: Release - uses: softprops/action-gh-release@v1 - if: env.TAG_NAME != 'pull_request' && env.TAG_NAME != '' - with: - name: "Docs ${{ env.TAG_NAME }}" - prerelease: ${{ env.PRERELEASE != '' }} - files: loser-homework-docs-nightly.tar.zst - tag_name: ${{ env.TAG_NAME }} - draft: ${{ env.DRAFT != '' || null }} - - diff --git a/.github/workflows/check-loser-homework.yml b/.github/workflows/check-loser-homework.yml deleted file mode 100644 index 2318689b..00000000 --- a/.github/workflows/check-loser-homework.yml +++ /dev/null @@ -1,130 +0,0 @@ -name: Check loser homework - -on: - workflow_call: - inputs: - docker_namespaces: - required: true - type: string - workflow_dispatch: - push: - branches: [ "main" ] - paths: - - '.github/actions/**' - - '.github/workflows/check-loser-homework.yml' - - '**.cmake' - - '**/CMakeLists.txt' - - 'src/群友提交/**' - pull_request: - branches: [ "main" ] - paths: - - '.github/actions/**' - - '.github/workflows/check-loser-homework.yml' - - '**.cmake' - - '**/CMakeLists.txt' - - 'src/群友提交/**' - -jobs: - prepare: - runs-on: ubuntu-latest - outputs: - need_build_all: ${{ steps.changed-files.outputs.any_changed == 'true' || - ( github.event_name != 'pull_request' && github.event_name != 'push' ) }} - docker_namespaces: ${{ inputs.docker_namespaces == '' && 'mq-b/loser-homework' || inputs.docker_namespaces}} - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Get the changed files that need to build all - id: changed-files - uses: tj-actions/changed-files@v42 - with: - separator: ";" - quotepath: false - safe_output: false - files: | - .github/actions/** - .github/workflows/check-loser-homework.yml - **.cmake - **/CMakeLists.txt - src/群友提交/script/** - src/群友提交/**/input.txt - src/群友提交/**/output.txt - - check: - needs: prepare - env: - PYTHONIOENCODING: "utf-8" - DOTNET_CLI_FORCE_UTF8_ENCODING: "true" - - strategy: - matrix: - include: - - name: GCC-13 - os: ubuntu-latest - cxx_compiler: g++-13 - c_compiler: gcc-13 - shell: bash - use-ninja: true - - - name: Clang-17 - os: ubuntu-latest - cxx_compiler: clang++-17 - c_compiler: clang-17 - cxx_flags: -stdlib=libc++ - container: ghcr.io/${{ needs.prepare.outputs.docker_namespaces }}/clang17 - shell: bash - use-ninja: true - - - name: MSVC - os: windows-2022 - cxx_compiler: cl - c_compiler: cl - shell: pwsh - use-ninja: true - - name: check in ${{ matrix.name }} - runs-on: ${{ matrix.os }} - container: - image: ${{ matrix.container}} - credentials: - username: ${{ github.actor }} - password: ${{ secrets.github_token }} - - steps: - - uses: actions/checkout@v4 - - name: delete unchanged cpp files - if: | - needs.prepare.outputs.need_build_all == 'false' - uses: ./.github/actions/delete-unchanged-cpp-files - with: - path: src/群友提交 - shell: ${{ matrix.shell }} - - - name: rename evil cjk path - if: ${{ matrix.os == 'windows-2022' }} - run: | - Rename-Item "src/群友提交" -NewName "hw-submit" - $cmakeLists = Get-ChildItem -Recurse -Filter "CMakeLists.txt" - foreach ($file in $cmakeLists) { - $content = Get-Content -Path $file.FullName -encoding UTF8 - $newContent = $content -replace "群友提交", "hw-submit" - Set-Content -Path $file.FullName -Value $newContent - } - - - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: amd64 - if: ${{ matrix.os == 'windows-2022' }} - - - name: Check loser homework - uses: ./.github/actions/check-loser-homework - with: - build-path: ${{github.workspace}}/build - extra-gen-params: > - -DCMAKE_CXX_COMPILER=${{ matrix.cxx_compiler }} - -DCMAKE_C_COMPILER=${{ matrix.c_compiler }} - -DCMAKE_CXX_FLAGS="${{ matrix.cxx_flags }}" - shell: ${{ matrix.shell }} - use-ninja: ${{ matrix.use-ninja }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..11a24db5 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,64 @@ +# 构建 VitePress 站点并将其部署到 GitHub Pages 的示例工作流程 +# +name: Deploy VitePress site to Pages + +on: + # 在针对 `main` 分支的推送上运行。如果你 + # 使用 `master` 分支作为默认分支,请将其更改为 `master` + push: + branches: [vitepress] + + # 允许你从 Actions 选项卡手动运行此工作流程 + workflow_dispatch: + +# 设置 GITHUB_TOKEN 的权限,以允许部署到 GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# 只允许同时进行一次部署,跳过正在运行和最新队列之间的运行队列 +# 但是,不要取消正在进行的运行,因为我们希望允许这些生产部署完成 +concurrency: + group: pages + cancel-in-progress: false + +jobs: + # 构建工作 + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # 如果未启用 lastUpdated,则不需要 + # - uses: pnpm/action-setup@v3 # 如果使用 pnpm,请取消注释 + # - uses: oven-sh/setup-bun@v1 # 如果使用 Bun,请取消注释 + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm # 或 pnpm / yarn + - name: Setup Pages + uses: actions/configure-pages@v4 + - name: Install dependencies + run: npm ci # 或 pnpm install / yarn install / bun install + - name: Build with VitePress + run: npm run docs:build # 或 pnpm docs:build / yarn docs:build / bun run docs:build + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: .vitepress/dist + + # 部署工作 + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + name: Deploy + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/.github/workflows/encodingcheck/CMakeLists.txt b/.github/workflows/encodingcheck/CMakeLists.txt deleted file mode 100644 index 2746dea2..00000000 --- a/.github/workflows/encodingcheck/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -cmake_minimum_required(VERSION 3.17) -project(encodingcheck LANGUAGES CXX) -set(CMAKE_CXX_STANDARD 20) - -include(FetchContent) - -FetchContent_Declare( - xdgmime - GIT_REPOSITORY https://gitlab.freedesktop.org/xdg/xdgmime.git - GIT_TAG master -) - -FetchContent_Declare( - is_utf8 - GIT_REPOSITORY https://github.com/simdutf/is_utf8.git - GIT_TAG v1.3.1 -) - -FetchContent_MakeAvailable(xdgmime is_utf8) - -message(xdgmime_SOURCE_DIR=${xdgmime_SOURCE_DIR}) - -set(xdgmime_SOURCE_DIR ${xdgmime_SOURCE_DIR}) - -include(cmake/xdgmime.cmake) - -add_executable(encodingcheck encodingcheck.cpp) -target_link_libraries(encodingcheck PRIVATE libxdgmime is_utf8::is_utf8) diff --git a/.github/workflows/encodingcheck/cmake/xdgmime.cmake b/.github/workflows/encodingcheck/cmake/xdgmime.cmake deleted file mode 100644 index 7ef33640..00000000 --- a/.github/workflows/encodingcheck/cmake/xdgmime.cmake +++ /dev/null @@ -1,25 +0,0 @@ -cmake_minimum_required(VERSION 3.17) -project(extxdgmime LANGUAGES C) - -add_library(libxdgmime STATIC - ${xdgmime_SOURCE_DIR}/src/xdgmime.c - ${xdgmime_SOURCE_DIR}/src/xdgmimeglob.c - ${xdgmime_SOURCE_DIR}/src/xdgmimeint.c - ${xdgmime_SOURCE_DIR}/src/xdgmimemagic.c - ${xdgmime_SOURCE_DIR}/src/xdgmimealias.c - ${xdgmime_SOURCE_DIR}/src/xdgmimeparent.c - ${xdgmime_SOURCE_DIR}/src/xdgmimecache.c - ${xdgmime_SOURCE_DIR}/src/xdgmimeicon.c -) - -add_executable(test-mime ${xdgmime_SOURCE_DIR}/src/test-mime.c) -target_link_libraries(test-mime PRIVATE libxdgmime) - -add_executable(test-mime-data ${xdgmime_SOURCE_DIR}/src/test-mime-data.c) -target_link_libraries(test-mime-data PRIVATE libxdgmime) - -add_executable(print-mime-data ${xdgmime_SOURCE_DIR}/src/print-mime-data.c) -target_link_libraries(print-mime-data PRIVATE libxdgmime) - -target_include_directories(libxdgmime PUBLIC ${xdgmime_SOURCE_DIR}/src/) -target_compile_definitions(libxdgmime PRIVATE HAVE_MMAP) \ No newline at end of file diff --git a/.github/workflows/encodingcheck/encodingcheck.cpp b/.github/workflows/encodingcheck/encodingcheck.cpp deleted file mode 100644 index ebddc146..00000000 --- a/.github/workflows/encodingcheck/encodingcheck.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/// \file encodingcheck.cpp -/// \brief File encoding check - -// 白酱让我用 C++ 写一个,替换掉原来的 Rust 版本 - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -template -constexpr void print(std::format_string fmt, Args&&... args) -{ - std::fputs(std::format(fmt, std::forward(args)...).c_str(), stdout); -} - -template -constexpr void printerr(std::format_string fmt, Args&&... args) -{ - fflush(stderr); - std::fputs(std::format(fmt, std::forward(args)...).c_str(), stderr); - fflush(stderr); -} - -namespace fs = std::filesystem; - -bool checkutf8(fs::path file) -{ - auto fd = open(file.c_str(), O_RDONLY); - if (fd < 0) { - throw fs::filesystem_error("open()", std::error_code{errno, std::system_category()}); - } - struct stat statbuf { }; - if (fstat(fd, &statbuf) != 0) { - close(fd); - throw fs::filesystem_error("fstat()", std::error_code{errno, std::system_category()}); - } - if (statbuf.st_size == 0) { - close(fd); - return true; - } - auto ptr = static_cast(mmap(nullptr, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0)); - if (ptr == MAP_FAILED) { - throw fs::filesystem_error("mmap()", std::error_code{errno, std::system_category()}); - } - bool result = is_utf8(ptr, statbuf.st_size); - munmap(ptr, statbuf.st_size); - close(fd); - return result; -} - -int main() -{ - auto workdir = fs::current_path(); - print("Working under {}\n", workdir.c_str()); - - size_t success {}; - size_t failure {}; - - for (auto it = fs::recursive_directory_iterator { workdir }; it != fs::recursive_directory_iterator{}; ++it) { - const auto& entry = *it; - if (std::ranges::find(entry.path(), fs::path { ".git" }) != entry.path().end()) { - // print("Skipping {}\n", entry.path().c_str()); - it.disable_recursion_pending(); - continue; - } - if (!entry.is_regular_file()) { - continue; - } - struct stat statbuf { }; - if (stat(entry.path().c_str(), &statbuf) != 0) { - throw fs::filesystem_error("stat()", std::error_code{errno, std::system_category()}); - } - auto mime = xdg_mime_get_mime_type_for_file(entry.path().c_str(), &statbuf); - if (std::string_view { mime }.rfind("text", 0) != 0) { - // print("Skipping {} ({})\n", entry.path().c_str(), mime); - continue; - } - - try { - bool result = checkutf8(entry.path()); - if (result) { - print("CHECKED {} ({})\n", entry.path().c_str(), mime); - ++success; - } else { - printerr("FAILURE {} ({})\n", entry.path().c_str(), mime); - ++failure; - } - } - catch(const std::exception& err){ - printerr("ERROR {} ({})\n", entry.path().c_str(), mime); - printerr("{}", err.what()); - throw err; - } - } - - print("Checked {} files, {} failures.\n", success + failure, failure); - if (failure > 0) { - return 1; - } - return 0; -} diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml deleted file mode 100644 index d7801ab9..00000000 --- a/.github/workflows/markdownlint.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Lint Markdown files - -on: - workflow_dispatch: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: DavidAnson/markdownlint-cli2-action@v15 - with: - globs: | - **/*.md - !.github diff --git a/.github/workflows/mirror-to-gitee.yml b/.github/workflows/mirror-to-gitee.yml deleted file mode 100644 index d3e9e876..00000000 --- a/.github/workflows/mirror-to-gitee.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: Mirror repo to Gitee -on: - workflow_dispatch: {} - push: {} -jobs: - mirror: - runs-on: ubuntu-latest - steps: - - name: Fetch bare repo - run: - git clone --mirror https://github.com/${{ github.repository }}.git repository - - - name: Mirror repo to Gitee - id: mirror-to-gitee - shell: bash - env: - INPUT_SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY_GITEE_MIRROR }} - INPUT_TARGET_REPO_URL: git@gitee.com:Mq-b/Loser-HomeWork.git - run: | - set -eu - - cd repository - - mkdir -p ~/.ssh - echo "$INPUT_SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - - export GIT_SSH_COMMAND="ssh -v -o StrictHostKeyChecking=accept-new" - git push --force --prune --tags "$INPUT_TARGET_REPO_URL" "+refs/heads/*:refs/heads/*" diff --git a/.github/workflows/printcss.yml b/.github/workflows/printcss.yml deleted file mode 100644 index ea1de16a..00000000 --- a/.github/workflows/printcss.yml +++ /dev/null @@ -1,196 +0,0 @@ -name: PrintCSS - -on: - workflow_dispatch: - inputs: - tag_name: - description: "Tag name for release (empty for no release)" - required: false - default: contiguous - push: - branches: [ "main" ] - tags: ["v[0-9]+.[0-9]+.[0-9]+*"] - paths: - - README.md - - "src/现代C\\+\\+题目/**" - - .github/workflows/printcss.yml - pull_request: - branches: [ "main" ] - paths: - - README.md - - "src/现代C\\+\\+题目/**" - - .github/workflows/printcss.yml - -jobs: - prepare: - runs-on: ubuntu-latest - outputs: - cache-hit: ${{ steps.cache.outputs.cache-hit }} - steps: - - uses: actions/cache/restore@v4 - id: cache - with: - lookup-only: true - key: treesitter-cli - path: ~/tree-sitter/tree-sitter - build-tree-sitter: - needs: prepare - if: needs.prepare.outputs.cache-hit != 'true' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - repository: tree-sitter/tree-sitter - - uses: actions/checkout@v4 - with: - path: lhw - - name: Apply CLI patch - run: | - git apply --check --apply lhw/.github/0001-Suppress-HTML-header-and-footer-for-CLI-highlight.patch - git apply --check --apply lhw/.github/0002-Reduce-lang_not_found-message.patch - - run: rustup toolchain install stable-x86_64-unknown-linux-gnu --profile minimal - - uses: Swatinem/rust-cache@v2 - - - name: Build CLI - run: | - cargo build --release - mkdir ~/tree-sitter - cp target/release/tree-sitter ~/tree-sitter/ - - - name: Save cache - uses: actions/cache/save@v4 - with: - path: ~/tree-sitter/tree-sitter - key: treesitter-cli - - build-printcss: - needs: [prepare, build-tree-sitter] - if: ${{ !cancelled() }} - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/cache/restore@v4 - with: - key: treesitter-cli - path: ~/tree-sitter/tree-sitter - fail-on-cache-miss: true - - name: Setup tree-sitter - run: | - echo "$HOME/tree-sitter" >> $GITHUB_PATH - mkdir -p ~/.config/tree-sitter - cp .github/tree-sitter.json ~/.config/tree-sitter/config.json - - uses: actions/cache@v4 - id: cache-tsp - with: - key: treesitter-parsers - path: | - ~/.cache/tree-sitter/ - ~/tree-sitter-parsers/ - - name: Fetch tree-sitter parsers - if: steps.cache-tsp.outputs.cache-hit != 'true' - run: | - mkdir -p ~/tree-sitter-parsers - cd ~/tree-sitter-parsers/ - git clone --depth 1 --no-tags https://github.com/tree-sitter/tree-sitter-cpp.git - pushd tree-sitter-cpp - npm install - popd - - name: Dump tree-sitter parsers - run: | - tree-sitter dump-languages - - - uses: actions/setup-node@v4 - with: - node-version: '>=18' - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - cache: 'pip' - - run: python3 -m pip install -r requirements.txt - - - name: Configure mit2html and pagedgen - run: | - pushd src/现代C++题目/ - pushd mit2html - npm install - popd - pushd pagedgen - npm install - npx playwright install chromium - popd - popd - - - name: Generate HTML - run: | - python3 src/现代C++题目/generate.py - - - name: Generate PDF - run: | - node src/现代C++题目/pagedgen/cli.js generated.html -o homework_problemtext.pdf --additional-script src/现代C++题目/remove_details.js - node src/现代C++题目/pagedgen/cli.js generated.html -o homework_full.pdf --additional-script src/现代C++题目/unwrap_details.js - - - name: Update artifacts - uses: actions/upload-artifact@v4 - with: - name: pdf - path: | - homework_problemtext.pdf - homework_full.pdf - - release: - runs-on: ubuntu-latest - needs: build-printcss - if: (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) || (github.event_name == 'schedule') || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != '') && !cancelled() - permissions: - contents: write - steps: - - uses: actions/checkout@v4 - - - name: Download artifacts - uses: actions/download-artifact@v4 - with: - name: pdf - path: artifacts - - - name: Archive and compress - run: | - find artifacts/ -printf "%P\n" | tar -cvf adocs.tar --no-recursion -C artifacts/ -T - - zstd -z -1 adocs.tar -o loser-homework-pdf.tar.zst - - - if: github.event_name == 'workflow_dispatch' - run: echo "TAG_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV - - - if: github.event_name == 'schedule' - run: echo 'TAG_NAME=contiguous' >> $GITHUB_ENV - - - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') - run: | - TAG_NAME=${{ github.ref }} - echo "TAG_NAME=${TAG_NAME#refs/tags/}" >> $GITHUB_ENV - echo "DRAFT=true" >> $GITHUB_ENV - - - if: env.TAG_NAME == 'contiguous' - name: Delete previous contiguous - env: - GH_TOKEN: ${{ github.token }} - run: | - echo 'PRERELEASE=true' >> $GITHUB_ENV - gh release delete contiguous --yes || true - git config user.name github-actions - git config user.email github-actions@github.com - git push origin :contiguous || true - sleep 2 - - name: Rename release files - run: | - mv loser-homework-pdf.tar.zst loser-homework-pdf-${{ env.TAG_NAME }}.tar.zst - - name: Release - uses: softprops/action-gh-release@v1 - if: github.event_name != 'pull_request' && env.TAG_NAME != '' - with: - name: "Docs ${{ env.TAG_NAME }}" - prerelease: ${{ env.PRERELEASE != '' }} - files: loser-homework-pdf-${{ env.TAG_NAME }}.tar.zst - tag_name: ${{ env.TAG_NAME }} - draft: ${{ env.DRAFT != '' || null }} - diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml deleted file mode 100644 index 37c10f0b..00000000 --- a/.github/workflows/publish-docker.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Publish Docker - -on: - workflow_call: - workflow_dispatch: - push: - branches: [ "main" ] - paths: - - '.github/workflows/publish-docker.yml' - - '.github/docker/**' - pull_request: - branches: [ "main" ] - paths: - - '.github/workflows/publish-docker.yml' - - '.github/docker/**' - - -jobs: - build: - permissions: write-all - runs-on: ubuntu-latest - strategy: - matrix: - include: - - name: 'ghcr.io/${{github.repository}}/clang17' - dockerfile: '.github/docker/clang17/dockerfile' - steps: - - uses: actions/checkout@v4 - - name: Publish to Registry - uses: elgohr/Publish-Docker-Github-Action@v5 - with: - name: ${{ matrix.name }} - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - registry: ghcr.io - dockerfile: ${{ matrix.dockerfile }} - tags: "latest" - no_push: ${{ github.event_name == 'pull_request' }} \ No newline at end of file diff --git a/.github/workflows/test-your-docker.yml b/.github/workflows/test-your-docker.yml deleted file mode 100644 index 0bf51302..00000000 --- a/.github/workflows/test-your-docker.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Test your docker package - -on: - workflow_dispatch: - inputs: - publish_docker: - type: boolean - default: true - description: publish your docker - -jobs: - convert-repo-to-lowercase: - runs-on: ubuntu-latest - outputs: - repo_lowercase: ${{ steps.github-repo-lowercase.outputs.REPO_LC }} - steps: - - name: Convert GITHUB_REPOSITORY lowercase - id: github-repo-lowercase - run: | - echo "REPO_LC=${GITHUB_REPOSITORY@L}" >> $GITHUB_OUTPUT - - publish-docker: - if: inputs.publish_docker - uses: ./.github/workflows/publish-docker.yml - - check-loser-homework: - needs: [convert-repo-to-lowercase, publish-docker] - uses: ./.github/workflows/check-loser-homework.yml - with: - docker_namespaces: ${{ needs.convert-repo-to-lowercase.outputs.repo_lowercase }} diff --git a/.github/workflows/text-encoding.yml b/.github/workflows/text-encoding.yml deleted file mode 100644 index ebf00b2e..00000000 --- a/.github/workflows/text-encoding.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: Check file encoding - -on: - workflow_dispatch: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: Get checker hash - id: computehash - uses: seepine/hash-files@v1 - with: - # The working dir for the action. - # Default: ${{ github.workspace }} - # workdir: '' - - # The patterns used to match files. - patterns: '.github/workflows/encodingcheck/**' - - name: Cache - id: cache - uses: actions/cache@v4 - with: - path: .github/workflows/encodingcheck/build/encodingcheck - key: check-build-cache-${{ steps.computehash.outputs.hash }} - - name: Build - if: steps.cache.outputs.cache-hit != 'true' - run: | - cd .github/workflows/encodingcheck - mkdir build && cd build - - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=gcc-13 -DCMAKE_CXX_COMPILER=g++-13 -DBUILD_ENCODINGCHECK=true .. - cmake --build . -t encodingcheck -j - - name: Check - run: .github/workflows/encodingcheck/build/encodingcheck diff --git a/.gitignore b/.gitignore index e85692fe..99939982 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,5 @@ build cmake-build-* .cache node_modules -/public -/resources -go.sum +.vitepress/cache/ +.vitepress/dist/ \ No newline at end of file diff --git a/.markdownlint.jsonc b/.markdownlint.jsonc deleted file mode 100644 index 555c1585..00000000 --- a/.markdownlint.jsonc +++ /dev/null @@ -1,44 +0,0 @@ -{ - "default": true, - "MD003": { - "style": "atx" - }, - "MD004": { - "style": "sublist" - }, - /* "MD013": { - "line_length": 200 - }, */ - "MD013": false, // I gave up - "MD024": { - "siblings_only": true - }, - "MD033": false, - "MD041": false, - "MD042": false, - "MD043": false, - "MD044": { - "code_blocks": false, - "html_elements": false, - "names": [ - "JavaScript", - "GitHub", - "C++98", - "C++11", - "C++14", - "C++17", - "C++20", - "C++23", - "C++26" - ] - }, - "MD046": { - "style": "fenced" - }, - "MD054": { - "url_inline": false - }, - "MD055": { - "style": "leading_and_trailing" - } -} \ No newline at end of file diff --git a/.vitepress/config.mjs b/.vitepress/config.mjs new file mode 100644 index 00000000..5be1219b --- /dev/null +++ b/.vitepress/config.mjs @@ -0,0 +1,91 @@ +import { defineConfig } from 'vitepress'; +import { repo_base, repo_url, repo_name, icon_url } from './theme/params'; +import footnote_plugin from 'markdown-it-footnote'; + +const guildline_path = '/src/C++CoreGuidelines/'; +const daily_path = '/src/卢瑟日经/'; +const basic_path = '/src/基础性C++题目/' + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + sidebar: [ + { + items: [ + { text: '作业与解析', link: '/' }, + { + text: 'C++CoreGuidelines', + link: guildline_path + 'README.md', + collapsed: true, + items: [ + { text: '第一章-简介', link: guildline_path + '第1章-简介' }, + { text: '第二章-理念', link: guildline_path + '第2章-理念' }, + { text: '第三章-接口', link: guildline_path + '第3章-接口' }, + { text: '第四章-函数', link: guildline_path + '第4章-函数' }, + { text: '第五章-类和类层次结构', link: guildline_path + '第5章-类和类层次结构' }, + ] + }, + { + text: '卢瑟日经', + link: daily_path + 'README.md', + collapsed: true, + items: [ + { text: '赋值运算符求值顺序的问题', link: daily_path + '赋值运算符求值顺序问题' }, + { text: '函数调用禁止隐式转换', link: daily_path + '函数调用禁止隐式转换' }, + { text: '数组&指针', link: daily_path + '数组&指针' }, + { text: '同步、异步、阻塞', link: daily_path + '同步、异步、阻塞' }, + { text: '为什么优先成员初始化器', link: daily_path + '为什么优先成员初始化器' }, + { text: '重载operator=要不要检查自赋值?', link: daily_path + '重载operator=要不要检查自赋值?' }, + { text: 'C&C++伪规则和错误的看法', link: daily_path + 'C&C++伪规则和错误的看法' }, + { text: 'catch(auto)的问题', link: daily_path + 'catch(auto)的问题' }, + { text: 'detach的问题', link: daily_path + 'detach的问题' }, + { text: '如何阅读STL源码?', link: daily_path + '如何阅读STL源码?' }, + { text: 'godbolt使用文档', link: daily_path + 'godbolt使用文档' }, + ] + }, + { + text: '基础性C++题目与答案', + link: basic_path + 'README.md', + collapsed: true, + items: [ + { text: '20231002基础C++题目', link: basic_path + '20231002基础C++题目' }, + { text: '20231017基础C++题目(转换的使用)', link: basic_path + '20231017基础C++题目(转换的使用)' }, + { text: '20231126基础C++题目(数组退化)', link: basic_path + '20231126基础C++题目(数组退化)' }, + ] + }, + ] + }, + ], + logo: icon_url, + editLink: { + pattern: repo_url + 'blob/main/:path', + text: '在 GitHub 上编辑此页面' + }, + socialLinks: [{ icon: 'github', link: repo_url }], + search: { + provider: 'local', + options: { + detailedView: true, + } + }, + outline: { label: '页面导航' }, + docFooter: { + prev: '上一页', + next: '下一页' + }, + returnToTopLabel: '回到顶端', + }, + + rewrites: { 'README.md': 'index.md' }, + base: repo_base + '/', + title: repo_name, + head: [['link', { rel: 'icon', href: repo_base + icon_url }]], + cleanUrls: true, + ignoreDeadLinks: true, + markdown: { + config(md) { + md.use(footnote_plugin); + } + }, +}) diff --git a/.vitepress/theme/Layout.vue b/.vitepress/theme/Layout.vue new file mode 100644 index 00000000..a46d0320 --- /dev/null +++ b/.vitepress/theme/Layout.vue @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/.vitepress/theme/NotFound.vue b/.vitepress/theme/NotFound.vue new file mode 100644 index 00000000..9956e5fd --- /dev/null +++ b/.vitepress/theme/NotFound.vue @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/.vitepress/theme/index.css b/.vitepress/theme/index.css new file mode 100644 index 00000000..dd5cfb2d --- /dev/null +++ b/.vitepress/theme/index.css @@ -0,0 +1,4 @@ +.dark { + --vp-c-bg: #1A1C20; + /* --vp-c-bg-alt: #1A1C20; */ +} \ No newline at end of file diff --git a/.vitepress/theme/index.js b/.vitepress/theme/index.js new file mode 100644 index 00000000..441d6451 --- /dev/null +++ b/.vitepress/theme/index.js @@ -0,0 +1,8 @@ +import DefaultTheme from 'vitepress/theme'; +import Layout from './Layout.vue'; +import './index.css'; + +export default { + extends: DefaultTheme, + Layout, +} \ No newline at end of file diff --git a/.vitepress/theme/params.js b/.vitepress/theme/params.js new file mode 100644 index 00000000..857a1cd0 --- /dev/null +++ b/.vitepress/theme/params.js @@ -0,0 +1,7 @@ +// 不同仓库需要修改的值 +const repo_base = '/Loser-HomeWork'; +const repo_url = `https://github.com/Mq-b${repo_base}/`; +const repo_name = 'Loser HomeWork'; +const icon_url = '/cpp.svg'; + +export { repo_url, repo_base, repo_name, icon_url } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index d613901e..00000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -cmake_minimum_required(VERSION 3.17) -project(loser_homework) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - -option(BUILD_ENCODINGCHECK "Build encodingcheck" OFF) - -add_subdirectory(src) - -if(BUILD_ENCODINGCHECK) - add_subdirectory(.github/workflows/encodingcheck) -endif() diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index 75863982..00000000 --- a/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -/.github/workflows @rsp4jack -/.github/workflows/check*homework.yml @Z1Turn0 -CMakeLists.txt @rsp4jack @Z1Turn0 \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 604ef5bf..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,26 +0,0 @@ -# 贡献指南 - - - -## Issues - -## Discussion - -## Pull Requests - -### 贡献题目 - -如果你想要在题库中**添加一道题目**,请遵循如下指南: - -1. 为了便于管理,题号由负责合并 pr 的管理人员添加,并按照 pr 合并时的序号递增。出题人可以不写序号,或随便写一个占位; -2. 题目需要有一个简单的标题,说明题目的大体内容,设置为二级标题; -3. 题目需要包含日期和出题人 ID,日期和时间均需要前后加反引号并加粗,日期按照 `年/月/日` 格式排列,示例:**`2023/7/21`**、**`mq白`**; -4. 题目的代码部分需要以代码块的形式给出,并注明编程语言(本仓库中一般应为 c++); -5. 题目中应当包含示例运行结果,同样以代码块的形式给出; -6. 难度部分可以省略,或者按照主观判断添加。题目添加后仓库管理人员可能会酌情修改; -7. GitHub 的 markdown 语法在换行时需要在行末添加两个空格,请在 fork 的仓库中确认好格式正常后再提交 pr。 -8. 对于需要代码实现的题目,尽量在代码中写好编译期测试(例如 static_assert)。 - -**太麻烦了你直接看第一题是个啥形式就可以了。** - -P.S. 指南内容还在更新中,提交 pr 前请注意关注该指南是否有更新。 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9e..00000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md index 979bebe7..236b5518 100644 --- a/README.md +++ b/README.md @@ -13,83 +13,13 @@
- cpp + cpp
目录 -- [前言](#前言) -- [`01` 实现管道运算符](#01-实现管道运算符) - + [运行结果](#运行结果) - + [群友提交](#群友提交-0) - + [标准答案](#标准答案-0) - + [解析](#解析-0) -- [`02` 实现自定义字面量 `_f`](#02-实现自定义字面量-_f) - + [运行结果](#运行结果-1) - + [群友提交](#群友提交-1) - + [标准答案](#标准答案-1) - + [解析](#解析-1) -- [`03` 实现 `print` 以及特化 `std::formatter`](#03-实现-print-以及特化-stdformatter) - + [运行结果](#运行结果-2) - + [群友提交](#群友提交-2) - + [标准答案](#标准答案-2) - + [解析](#解析-2) -- [`04` 给定类模板修改,让其对每一个不同类型实例化有不同 ID](#04-给定类模板修改让其对每一个不同类型实例化有不同-id) - + [运行结果](#运行结果-3) - + [群友提交](#群友提交-3) - + [标准答案](#标准答案-3) -- [`05` 实现 `scope_guard` 类型](#05-实现-scope_guard-类型) - + [运行结果](#运行结果-4) - + [群友提交](#群友提交-4) - + [标准答案](#标准答案-4) -- [`06` 解释 `std::atomic` 初始化](#06-解释-stdatomic-初始化) - + [群友提交](#群友提交-5) - + [标准答案](#标准答案-5) -- [`07` `throw new MyException`](#07-throw-new-myexception) - + [运行结果](#运行结果-5) - + [群友提交](#群友提交-6) - + [标准答案](#标准答案-6) -- [`08` 定义`array`推导指引](#08-定义array推导指引) - + [运行结果](#运行结果-6) - + [群友提交](#群友提交-7) - + [标准答案](#标准答案-7) -- [`09` 名字查找的问题](#09-名字查找的问题) - + [运行结果](#运行结果-7) - + [群友提交](#群友提交-8) - + [标准答案](#标准答案-8) -- [`10` 遍历任意类数据成员](#10-遍历任意类数据成员) - + [运行结果](#运行结果-8) - + [群友提交](#群友提交-9) - + [标准答案](#标准答案-9) - - [`C++17` 写法](#c17-写法) - - [`C++20` 写法](#c20-写法) - + [补充说明](#补充说明-0) -- [`11` `emplace_back()` 的问题](#11-emplace_back-的问题) - + [群友提交](#群友提交-10) - + [标准答案](#标准答案-10) -- [`12` 实现`make_vector()`](#12-实现make_vector) - + [运行结果](#运行结果-9) - + [群友提交](#群友提交-11) - + [标准答案](#标准答案-11) - - [运行结果](#运行结果-10) -- [`13` 关于 `return std::move`](#13-关于-return-stdmove) - + [群友提交](#群友提交-12) - + [标准答案](#标准答案-12) -- [`14` 以特殊方法修改命名空间中声明的对象](#14-以特殊方法修改命名空间中声明的对象) - + [运行结果](#运行结果-11) - + [群友提交](#群友提交-13) - + [标准答案](#标准答案-13) - - [利用符号来解决](#利用符号来解决) - - [直接修改内存](#直接修改内存) - - [利用名字查找规则](#利用名字查找规则) -- [`15` 表达式模板](#15-表达式模板) - + [群友提交](#群友提交-14) - + [标准答案](#标准答案-14) - + [解析](#解析-3) -- [`16` 制造传递函数模板的宏](#16-制造传递函数模板的宏) - + [群友提交](#群友提交-15) - + [标准答案](#标准答案-15) +[[toc]]
@@ -2434,3 +2364,10 @@ int main() { ### 标准答案 + + \ No newline at end of file diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index 57098027..00000000 --- a/SUMMARY.md +++ /dev/null @@ -1,25 +0,0 @@ -# Summary - -* [作业与解析](README.md) -* [C++CoreGuidelines](src/C++CoreGuidelines/README.md) - - [第一章-简介](src/C++CoreGuidelines/第1章-简介.md) - - [第二章-理念](src/C++CoreGuidelines/第2章-理念.md) - - [第三章-接口](src/C++CoreGuidelines/第3章-接口.md) - - [第四章-函数](src/C++CoreGuidelines/第4章-函数.md) - - [第五章-类和类层次结构](src/C++CoreGuidelines/第5章-类和类层次结构.md) -* [卢瑟日经](src/卢瑟日经/README.md) - - [赋值运算符求值顺序的问题](src/卢瑟日经/赋值运算符求值顺序问题.md) - - [函数调用禁止隐式转换](src/卢瑟日经/函数调用禁止隐式转换.md) - - [数组&指针](src/卢瑟日经/数组&指针.md) - - [同步、异步、阻塞](src/卢瑟日经/同步、异步、阻塞.md) - - [为什么优先成员初始化器](src/卢瑟日经/为什么优先成员初始化器.md) - - [重载operator=要不要检查自赋值?](src/卢瑟日经/重载operator=要不要检查自赋值?.md) - - [C&C++伪规则和错误的看法](src/卢瑟日经/C&C++伪规则和错误的看法.md) - - [catch(auto)的问题](src/卢瑟日经/catch(auto)的问题.md) - - [detach的问题](src/卢瑟日经/detach的问题.md) - - [如何阅读STL源码?](src/卢瑟日经/如何阅读STL源码?.md) - - [godbolt使用文档](src/卢瑟日经/godbolt使用文档.md) -* [基础性C++题目与答案](src/基础性C++题目/README.md) - - [20231002基础C++题目](src/基础性C++题目/20231002基础C++题目.md) - - [20231017基础C++题目(转换的使用)](src/基础性C++题目/20231017基础C++题目(转换的使用).md) - - [20231126基础C++题目(数组退化)](src/基础性C++题目/20231126基础C++题目(数组退化).md) diff --git a/cmake/CheckLoserHomeWork.cmake b/cmake/CheckLoserHomeWork.cmake deleted file mode 100644 index 619ed4c8..00000000 --- a/cmake/CheckLoserHomeWork.cmake +++ /dev/null @@ -1,178 +0,0 @@ -cmake_minimum_required(VERSION 3.17) - -include(Slugify) - -function(get_subdirs path _subdirs_list) - file(GLOB all_childs - CONFIGURE_DEPENDS "${path}/*") - set(subdirs_list "") - foreach(child ${all_childs}) - if(IS_DIRECTORY ${child}) - list(APPEND subdirs_list ${child}) - endif() - endforeach() - set(${_subdirs_list} ${subdirs_list} PARENT_SCOPE) -endfunction() - -function(to_question_index dir_path _index) - get_filename_component(dir_name ${dir_path} NAME) - string(REGEX MATCH "[0-9]+" index ${dir_name}) - set(${_index} ${index} PARENT_SCOPE) -endfunction() - -function(get_cpp_files path _file_list) - file(GLOB file_list - CONFIGURE_DEPENDS "${path}/*.cpp" - "${path}/*.cxx" "${path}/*.cc") - set(${_file_list} ${file_list} PARENT_SCOPE) -endfunction() - -function(is_valid_target_name name _ret) - set(ret true) - if(NOT name MATCHES "^[a-zA-Z0-9_\+\.\-]+$") - set(ret false) - endif () - set(${_ret} ${ret} PARENT_SCOPE) -endfunction() - -function(get_homework_target_name question_index cpp_file_path _target_name) - get_filename_component(file_name ${cpp_file_path} NAME_WLE) - is_valid_target_name("${file_name}" ret) - if (NOT ret) - slugify("${file_name}" slug) - message(NOTICE "not valid target name: ${file_name}, use: ${slug}") - set(target_name "${question_index}_${slug}") - else () - set(target_name "${question_index}_${file_name}") - endif () - set(${_target_name} ${target_name} PARENT_SCOPE) -endfunction() - -function(is_target_compiler cpp_file _ret) - file(STRINGS ${cpp_file} lines) - list(POP_FRONT lines first_line) - string(REGEX MATCHALL "(!gcc|!msvc|!clang|!all)" match_result ${first_line}) - list(FIND match_result "!all" index) - if (NOT index EQUAL -1) - set(${_ret} false PARENT_SCOPE) - return() - endif () - - if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - list(FIND match_result "!clang" index) - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - list(FIND match_result "!gcc" index) - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - list(FIND match_result "!msvc" index) - endif() - if (NOT index EQUAL -1) - set(${_ret} false PARENT_SCOPE) - return() - endif () - - set(${_ret} true PARENT_SCOPE) -endfunction() - -function(is_use_modules cpp_file _ret) - set(${_ret} false PARENT_SCOPE) - file(STRINGS ${cpp_file} lines) - if("${lines}" MATCHES "import") - set(${_ret} true PARENT_SCOPE) - endif () -endfunction() - -function(add_homework_target target question_index cpp_file) - message(STATUS "add executable: ${target_name} ${cpp_file}") - add_executable (${target} ${cpp_file}) - set_target_properties(${target} - PROPERTIES cpp_file ${cpp_file}) -endfunction() - -function(is_check_run cpp_file _ret) - file(STRINGS ${cpp_file} lines) - list(POP_FRONT lines first_line) - string(REGEX MATCHALL "(!check-run)" match_result ${first_line}) - list(FIND match_result "!check-run" index) - if (NOT index EQUAL -1) - set(${_ret} false PARENT_SCOPE) - return() - endif () - set(${_ret} true PARENT_SCOPE) -endfunction() - -find_package(PowerShell QUIET) -find_package(BASH QUIET) - -function(add_run_homework_target target homework_target _ret) - set(ret false) - get_target_property(cpp_file ${homework_target} cpp_file) - get_filename_component(file_dir ${cpp_file} DIRECTORY) - set(input_file "${file_dir}/input.txt") - set(output_file "${file_dir}/output.txt") - if(EXISTS ${output_file}) - if (POWERSHELL_FOUND) - add_custom_target(${target} - COMMAND powershell -File - ${CMAKE_CURRENT_SOURCE_DIR}/script/RunHomework.ps1 - -Execution $ - -OutputName ${homework_target} - -CorrectExecOutput ${output_file} - -ExecInput ${input_file} - COMMENT "check ${homework_target} run" - DEPENDS ${target} - USES_TERMINAL - ) - set(ret true) - elseif (BASH_FOUND) - add_custom_target(${target} - COMMAND bash - ${CMAKE_CURRENT_SOURCE_DIR}/script/run_homework.sh - -e $ - -o ${homework_target} - -c ${output_file} - -i ${input_file} - COMMENT "check ${homework_target} run" - DEPENDS ${target} - ) - set(ret true) - endif () - endif () - - set(${_ret} ${ret} PARENT_SCOPE) -endfunction() - -function(handle_homework homework_dir _targets_list _run_targets_list) - set(targets_list "") - set(run_targets_list "") - get_subdirs(${homework_dir} subdirs_list) - foreach(subdir ${subdirs_list}) - to_question_index(${subdir} index) - if (NOT ${index} STREQUAL "") - get_cpp_files(${subdir} cpp_files_list) - foreach(cpp_file ${cpp_files_list}) - is_target_compiler(${cpp_file} ret) - if (ret) - get_homework_target_name(${index} ${cpp_file} target) - add_homework_target(${target} ${index} ${cpp_file}) - list(APPEND targets_list ${target}) - is_use_modules(${cpp_file} use_modules) - set_target_properties(${target} - PROPERTIES use_modules ${use_modules}) - if(use_modules) - message(NOTICE "${target}: use modules") - endif() - - is_check_run(${cpp_file} check_run) - if(check_run) - add_run_homework_target("run_${target}" ${target} add_run_ret) - if (add_run_ret) - list(APPEND run_targets_list "run_${target}") - endif () - endif () - endif () - endforeach () - endif () - endforeach() - set(${_targets_list} ${targets_list} PARENT_SCOPE) - set(${_run_targets_list} ${run_targets_list} PARENT_SCOPE) -endfunction() \ No newline at end of file diff --git a/cmake/FindBASH.cmake b/cmake/FindBASH.cmake deleted file mode 100644 index 6315755a..00000000 --- a/cmake/FindBASH.cmake +++ /dev/null @@ -1,6 +0,0 @@ -find_program(BASH_EXECUTABLE NAMES bash) -mark_as_advanced(BASH_EXECUTABLE) - -INCLUDE(FindPackageHandleStandardArgs) -find_package_handle_standard_args(BASH - REQUIRED_VARS BASH_EXECUTABLE) \ No newline at end of file diff --git a/cmake/FindLatexmk.cmake b/cmake/FindLatexmk.cmake deleted file mode 100644 index 6cbb3efb..00000000 --- a/cmake/FindLatexmk.cmake +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright 2020 Keith F Prussing -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in -# the documentation and/or other materials provided with the -# distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#[================================================================[.md: - - - -#]================================================================] - -cmake_minimum_required(VERSION 3.17 FATAL_ERROR) - -# Don't do duplicate work if necessary -if(TARGET Latexmk::Latexmk) - return() -endif() - -include(Slugify) - -# Define the function to locate latexmk -function(_latexmk__find_latexmk) - # First, check if the environment specifies a valid latexmk - if(DEFINED ENV{LATEXMK}) - execute_process(COMMAND $ENV{LATEXMK} -h - RESULT_VARIABLE res - OUTPUT_QUIET ERROR_QUIET) - - if(NOT res EQUAL "0") - message(FATAL_ERROR "LATEXMK=$ENV{LATEXMK} is not valid") - endif() - - set(Latexmk_Executable $ENV{LATEXMK} CACHE PATH - "Latexmk executable path" FORCE) - return() - endif() - - # Check if latexmk has been loaded. - if(NOT DEFINED LATEX_FOUND) - find_package(LATEX REQUIRED) - endif() - - if(NOT LATEX_FOUND) - message(FATAL_ERROR "No underlying LaTeX found") - endif() - - # Otherwise, scan known directories. We do this by inspecting the - # results of :module:`FindLATEX`. Note, we only really care about - # the main compilers. - if(DEFINED Latexmk_DIR AND Latexmk_DIR) - find_program(Latexmk_Executable latexmk - PATHS ${Latexmk_DIR} - NO_DEFAULT_PATH) - return() - else() - set(dirs) - - foreach(compiler LATEX LUALATEX PDFLATEX XELATEX) - if(LATEX_${compiler}_FOUND) - get_filename_component(_dir ${${compiler}_COMPILER} DIRECTORY) - list(APPEND dirs ${_dir}) - endif() - endforeach() - endif() - - list(REMOVE_DUPLICATES dirs) - - if(NOT dirs) - message(FATAL_ERROR "No directories to search for latexmk") - endif() - - # Now actually do the search - find_program(Latexmk_Executable latexmk PATHS ${dirs}) -endfunction() - -# Locate the latexmk if we haven't already. Note this does require the -# user to reset :variable:`Latexmk_Executable`. -if(NOT DEFINED Latexmk_Executable) - _latexmk__find_latexmk() -endif() - -# Make sure we found the executable -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Latexmk DEFAULT_MSG Latexmk_Executable) - -# Create the official target. -add_executable(Latexmk::Latexmk IMPORTED) -set_property(TARGET Latexmk::Latexmk - PROPERTY IMPORTED_LOCATION "${Latexmk_Executable}") - -add_custom_target(latexmkdocs ALL) - -function(add_latex_document source) - cmake_parse_arguments(PARSE_ARGV 1 latexmk "ALL" "ENGINE" "") - - # Split the root and extension from the target - get_filename_component(root ${source} NAME_WE) - - # Determine the output flags and extension based on the given - # ENGINE. - if(latexmk_ENGINE MATCHES "PDFLATEX") - set(ext "pdf") - set(flags "-dvi-;-ps-;-pdf") - elseif(latexmk_ENGINE MATCHES "LUALATEX") - set(ext "pdf") - set(flags "-dvi-;-ps-;-lualatex") - elseif(latexmk_ENGINE MATCHES "XELATEX") - set(ext "pdf") - set(flags "-dvi-;-ps-;-xelatex") - elseif(latexmk_ENGINE MATCHES "(LATEX|DVI)") - set(ext "dvi") - set(flags "-dvi;-ps-;-pdf-") - elseif(latexmk_ENGINE MATCHES "PS") - set(ext "ps") - set(flags "-dvi-;-ps;-pdf-") - elseif(latexmk_ENGINE MATCHES "") - set(ext "pdf") - set(flags "-dvi-;-ps-;-pdf") - else() - message(FATAL_ERROR "Unknown engine '${latexmk_ENGINE}'") - endif() - - set(target ${root}.${ext}) - set(byproducts "${target};${root}.log;${root}.fdb_latexmk") - - # Extra outputs not reported by latexmk. - if(latexmk_ENGINE MATCHES "XELATEX") - list(APPEND byproducts ${root}.xdv) - elseif(latexmk_ENGINE MATCHES "PS") - list(APPEND byproducts ${root}.dvi) - endif() - - # Run Latexmk to determine what it thinks the generated files will - # be so we can add these as byproducts. - execute_process( - COMMAND ${Latexmk_Executable} - ${Latexmk_FLAGS} - -e "print join(';', @generated_exts)" - -e "exit(0)" - ${source} - OUTPUT_VARIABLE exts - ERROR_VARIABLE errors - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) - - if(NOT result EQUAL "0") - message("Error getting generated extensions: ${exts}") - message("Error getting generated extensions: ${result}") - message(FATAL_ERROR "Error getting generated extensions: ${errors}") - endif() - - foreach(ext ${exts}) - list(APPEND byproducts ${root}.${ext}) - endforeach() - - # Finally, create the target. Using :command`add_custom_target` is - # always considered out of date so the dependency resolution is - # pushed to latexmk. - if(latexmk_ALL) - set(_all ALL) - else() - set(_all) - endif() - - slugify(${target} target_slug) - set(Latexmk_TARGET ${target_slug} PARENT_SCOPE) - set(Latexmk_TGNAME ${target} PARENT_SCOPE) - - add_custom_target(${target_slug} ${_all} - COMMAND Latexmk::Latexmk ${flags} -output-directory=${CMAKE_CURRENT_BINARY_DIR} -aux-directory=${CMAKE_CURRENT_SOURCE_DIR} ${Latexmk_FLAGS} ${source} - DEPENDS ${source} ${latexmk_UNPARSED_ARGUMENTS} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - BYPRODUCTS ${byproducts} - ) - add_dependencies(latexmkdocs ${target_slug}) - - cmake_path(RELATIVE_PATH CMAKE_CURRENT_BINARY_DIR BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE reltree) - file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/docs/${reltree}) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/docs/${reltree}) - add_custom_command(TARGET ${target_slug} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/* ${CMAKE_BINARY_DIR}/docs/${reltree}/ - COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_BINARY_DIR}/docs/${reltree}/Makefile ${CMAKE_BINARY_DIR}/docs/${reltree}/*.cmake - ) -endfunction() diff --git a/cmake/FindPowerShell.cmake b/cmake/FindPowerShell.cmake deleted file mode 100644 index 1121b4e4..00000000 --- a/cmake/FindPowerShell.cmake +++ /dev/null @@ -1,6 +0,0 @@ -find_program(POWERSHELL_EXECUTABLE NAMES powershell) -mark_as_advanced(POWERSHELL_EXECUTABLE) - -INCLUDE(FindPackageHandleStandardArgs) -find_package_handle_standard_args(PowerShell - REQUIRED_VARS POWERSHELL_EXECUTABLE) \ No newline at end of file diff --git a/cmake/Slugify.cmake b/cmake/Slugify.cmake deleted file mode 100644 index 74adfc5c..00000000 --- a/cmake/Slugify.cmake +++ /dev/null @@ -1,18 +0,0 @@ -cmake_minimum_required(VERSION 3.17) -cmake_policy(SET CMP0144 NEW) - -find_package(Python COMPONENTS Interpreter REQUIRED) - -function(slugify str _retname) - string(MD5 strhash ${str}) - file(WRITE ${CMAKE_BINARY_DIR}/slugify-${strhash}.txt "${str}") - execute_process( - COMMAND ${Python_EXECUTABLE} "-m" "slugify" "--stdin" - TIMEOUT 10 - INPUT_FILE ${CMAKE_BINARY_DIR}/slugify-${strhash}.txt - OUTPUT_VARIABLE sluggish - COMMAND_ERROR_IS_FATAL ANY - ) - string(STRIP ${sluggish} sluggish) - set(${_retname} ${sluggish} PARENT_SCOPE) -endfunction() diff --git a/docs/_filter_repo_commit_map_1705194650 b/docs/_filter_repo_commit_map_1705194650 deleted file mode 100644 index e8255f26..00000000 --- a/docs/_filter_repo_commit_map_1705194650 +++ /dev/null @@ -1,700 +0,0 @@ -old new -5cb26ff766af1a798c83b6b897f972f940cd7647 a2cdb16ef28009b4388fc7fb4526b1d6d1c57991 -2786c94ddad546b056822855b45614fc8afa9909 3491f1bcfa9c1a200142adbf3a5cddb791ac6ff2 -56a143d19daf6124808fea5754e0834aa9d1bef3 2803ff19eea8e5a09085189786bb70b58b12be15 -b4bd7f22e780dc5c4e844c645ca2fd11c97f5be7 2333645f8ac326fb0b670eb7da78bb7975dc8295 -142c147006dab812bed1f8ad7ff1df54bf9f8cc7 ef0581f70a1dd4ab1a35122a625494f14e52487a -7f15ee9ecbc8b74795610b86c7e142f3c2b3146c 8a6703c7d5ca0942c40f3f44b50ef1f1d6e943db -31137f17ec92d8e2e9807b989b0eddf274afa834 fb8b0822dd34e6236db51f2ef84cdb7ee5d68945 -e41a9d6ba788d0832ca4535025dd71eddb689e10 f61a24fc6c5dff23d9103642389d381efad93c1d -04dfd79f14858de71dae8672f8c7b0c3650dcafb 1fb172a4f84e96505cd6151e7f5d398ffbd8853b -a5f1f9061ea039114363570cbf6127626aeec273 711aa9fa01af731cebd594b07fc588e4bf452285 -428d163040a45a5a2c5a8110688da8ecd1c7c84c ef5f790ef6955b839a25dd2efe5c40085c030524 -cb657679d66e4ec190450b358e9c2fffae215ae2 af6b6c1c64a08743b7b550f85e29ca7e72d87218 -04c177db45368873d343bb1fbb0eb5bbfc53c4c2 e96864f764457e4f52e5a8faab92a1b3d9e653de -83772f96d9807e66d7361f8abe789157313dc3fd 0554eb75c83089f21015c5f86d2cb7cf3f2ce334 -17bec91d97f62335fc3bdb84c1a760bf0aff49e6 2e43bf8f1068cdd8df10a18323cd20b3e9cdc15b -967bb973795b2295b8e311098a53408e3a8e8938 41b3ebb3fcd089efdff0d12e1d8526b751422012 -f3b68ed2f7825b461d7488f38b16164a1ee61e7b 688868562db619c5544101934a7b4f54a50d5e92 -dc06f688e2fe90c2609b1fd84e13ade673d184ac 79c56663641aebd9f0066b6902c2dfa8f115ac76 -360bb20718454d43fd24b7738992e4a1bd6b3324 9790dbb2b017fb09b64629d1dbcd9dc3a030b825 -fa7405a15959e9dd08ef38f70ae8168f31a29d01 87b57de2e593bb082a72c44aa9395f77ce96f5d5 -a8fc9c795acf6660871d84d6c83e0ed41839d22c f73fda659b566873175e4d8f7ff38bbbde5d4b58 -8f10654ab470e32ac345880befea6ee480a1b415 fb64671eb41ac7061da0f697b10ba2cb890e3796 -54f1a55388a009601066f7d68ce08c9de945eafd c5feae14b034fef3bee8a1eeca742eb12d830da9 -84396067fad1fa5d2ff20f9f32d620fec797d2c1 ad04d4604396c5b3d4b68c61725be6549cd3e6d9 -8d3b61b4401bdf52b1f87e32bd7cfc6ce48cd64c 7f2e851c2f713240cd2e4e23c33393803d77f318 -713e6f419bd3a562e3a1a6f4c573801712a1cc2a c6b08fab6c940a1318a75c6f6396188464b86069 -25731e4ac2a0ffadefcff2c2ec37babf1cce5f5a 7e6ded1a61c6d3bb7f6e7f98e78e7e05797fe65b -a9f98f125e0c48fc4713ed980d8dee99bf9e4798 3b29c5ef06b0012b9b924f473ae4a1795a90582e -d2b81715643a8df96f82e3866fadd46f9eae66ea 386075dd2b255d771d4a607d59c0ef3a9eaecc88 -e373b15050fafe8b0c130bc157e24cb745177905 2b25a3351e634008bf4f01b350f5277e90dea9cd -c6261e458bb5da3cb85a124cc0868d4cf218c9d1 6d02e2efaf3daead02bc154ebd063f121ac49e08 -4dc50ab3278b3a303f37faa767be39ed4ddbd4cc cb00bddf2085ef83031ef72d877708e7f3d150ff -ac6fca8be41edf937d59c0ed0867bbf685e40918 138654d734d2f6e2cdded70b1ea5e2416d52d3b6 -f27c776196fce7854e50864f65f2ff3840658f3f 0dc1c05983d7b4054324a5c3bc8e85b0b452b4a2 -947a634d69d1990dea8952e35c9ed5437abd76c9 3cf7ab7eb25f1dbb92ef6cb38df41ffb60c1a11d -df0b1fa8d0b952a1463b9b455cd0ffc0388ed660 68eb8b1f85e5e1763351184372f3aaaa7263d0d7 -b21d59787489ca1ed07281203b4f66137f02d4ec 8422a9f9cf7164b0aaad7439aef2f24639dd9b2d -28b9cccc8fc2390289cdab689548c8619812aeb6 a2e0958832a262199c8d965067dc7b4135970e47 -f18877ccfce6b009437bdb198909a7e1e826b8d1 af6f9fedecb0a7154b6d45130bff06bc547adacc -28bfaa71805e440d6dd4433026153e5f69f0b3f5 2ae5f4ff6e0b0defe6a27e92d6c997cdc2c5d3e2 -52da57fbb1c01129ed582a4552b9ce0c5b52664e 0b2210d9084c976713a791b8ca5e06ff10e6ba4e -074157b8fda33b7f0fd1d4b378dd1cd7c78b8918 0472109e3a57b0a1e30090e3e850ca4f03885e48 -aa1744d099d3160cbaea4425838d311ebcbf32bd f2e8611488bcc428528a0bce2b39b1b59b9bb4dc -574d490bf4ee6e9e0f25227ec2a4bc154f417e6e f438aa02cc1ad624916845ca2abdc65c9d52bb5d -ce825b82653bede435b91981aa182e418da8c1df dd5d591a47fe866a4056bc11475e59fb2cae007a -5cd230c67a9e9d79c10c9d46e7d84eb957c01ffd d3d4cfccc3e8f6c3d0baa094d1ccff23a99008cf -4389c41be33591da763e55b73b714cdee93c8fa6 e48d267902914eef2f6f83d17d0c4d5f36955344 -81152444177d1c1238c54881d1524c970b9acd79 d9d85952dcacd1c95457227d1c86ef364edfe493 -eff061ca90f6738283bc186445f6d3b67a58fec9 39cb15846bba9717ffe6922b37d34719b4d50f33 -3121de80af1833a6291fcec2b614fdda3c7eac5a c34616df7035e0ec43e10d0638a5fe036c6d34f4 -d63594221db7e0bd767328edf1e6f10d0e04cb89 585483ae51f6ed9fb258e425ae469423aa2c74e5 -c2f496606bada349dbe379cb12863baa80d47c6f 29a85b7e0024bbd7ae38acf26b88122ec71394e1 -9b761579430d0e3cc4fa060b93de666522fa51da 6e8713423ee616ecf6d6982fc2ccada1bc15f43d -63bfbe089d04ba4291148efe730293c6827095c6 b5747eda6140c7a3257a906be5635d6017c82e0f -e11af445300078c35ead21f23549182d8f8aeedd 51893836d52966e8b557b41744f414a5119d18ee -12f3d9f77a4e2763b28316575b0d269ac2a60438 dfbda7b1b3a245d4ffd08550b1078e71c0003b64 -e7089a666cbfa38c12d550badeee28174af1f897 371fe0aac0fde5b5072b7c9d1325581b857acc36 -401348d7537ce41292f3c1280aa6ed95f2563784 ac29a36810af2ea09e9f8abeece3bceca9badfb2 -d3f154155bb8776131cc109a5817677e91294c91 d634d06298b93246363ca4cb39d73a5751b35ef6 -07ee2aa4e4883c26d0f08514fabef209339fae2d 38ff4daea195d087e67a0a05715f2d7c4e1b8e89 -1cb1dbd92d637282fdfa92e78bf6bc3750a55cd9 89531d33fef535301d5650459528faf39c78e361 -607f6ea9e0aed335b15ea527cda850e7dc433a3d f2aad892f11aeabfde1e86ff5201269275335281 -7456804e1fb845fea5ff9021e716bdfe25596746 557a912c06701719739d84140fbd11851859fe71 -bc7ffd685c1f77d0e3f43fefed281440187d90c7 be0bfe29bca122ddfd45b0b8f1d6e554ef2e4585 -01c8a7b7ae0282b7493bf75aefacc32085c65d52 e9ad46bbfcbd047ff6a7a10d893d68142531b7e0 -4cb855d2667e7c93e282d0a973c0aa1c70abb763 1ed45d1a290204c321846bbab3d16c6a6015c112 -43e240fd3b396fbd7e91a8b46364c12b50ce57a5 ca3ccaf5471a35f2f89509ce5f72ce09de3dcef5 -374f72afee1520cf2a0460d1107ed72a2006634c 93ed99a7ccc0e3b46f8225a0dafc476c15dfbe4c -f45369c123eb1b1d17775b116e5f63a061ecee5e e83f25a2a2d59a8e247002131dcd080953f36712 -45a7b47e2dee15b58f5bb3a701cf7192739b3e65 54d8b9168e06a4b70934a1666587a62f67ed2506 -f2764f69b7f79eb1fd640504d08642fb0fd4e11c 2969c760677ced00d16f16c7e4b8a6d110694a73 -504538ac81152046b4a3bd889709e07233f9c525 38b55a9ff5aab71fe0b332d47d17735ea8f6d9d5 -1ba08d1b0bc3220a9880b8f4097d60e8ee900fc5 eb0e449354c468b0291dc1c4f9e5d6ff5dd464a4 -373e41436bd28f94c81e5c7332e14831140f279d 9751569a92c3fe176c3620b1f5c17b5b50547e7e -769cd95968c2b41b6aee1cc93eb36ed1936e688d 9035c4ee7af63cb53bc5bb5690033af68795b79c -26faf2d743b36a631aa52d689f9533d928bdc918 2871732125355783fcfa9c618d2878a3de4f2f63 -20b612b635ba68cda5e02ca76a4a2c88c017935f 76f6598e05e11a5a1690ac9811dc9f0df6b9a647 -5d76ba990401eed2ae16dab0e2a6f9ce4014f209 732ef7fb91857690caac768ed0cd835e99a64f1f -5ec1c05ac9dae2b724a877bd1b203dfe2d58c8a8 c65b3f47e57c46f04e6369af1bd59d453fee9988 -3c4afc88f38adc19229e7a4dddd3d7ca13749aa5 0a55ead576d04ca7d565a3cd6bb7a011daea5dd2 -91cb290de94aa303fea2f34dcfdd81189c5aa6c4 7d081af14a7f0d1ee4c16ab6a272490b25d40f1d -223ee9603c6ebd300e3e89b7eba36edb183fdb5d d858bfb9738122507faa96db70d685f127cd0396 -7a7ebe51726453e84fc1e80dac4c4e7d27ccaa83 f265143b6a488fdaf3e94d3820f14fe48f0c75ab -a03b432badd955fb3549444b111c66ce84c19ccb a09ca61d2ae19f590929e68f6cbfd74f737344e6 -87dfd87a4bfca18956abcfa96aefd3f9a2696301 fbd9f1b32bdd1dc015c0cbbc667ba1fad9565c3e -e6c2dc60c80843d0f8a89b7082e311fe205bc651 e08d3f397bab6879313cadde134dbdf9d4d8c2b2 -bc73bce144e5f382aea74e6ccb5eaf45164c33ef 2f5d47a3e35ddaee0ec6e0772ca27be4acf7fd96 -0bb74d9ebcd419d447b632d930f4bccf9cbe6eb2 fb0a4a269eba46747d9c05dc9d1b79d18aa80688 -5704ad5fc7f3cef2eeef2c4f474f5591e235f281 380a8c8bd645f0d705f73a3111cae42533b81193 -3f9d9316bc0fb32adb0bc2f6c6f9e9b50832fba9 dec6687a0a33f6383a5d2cf644016ddc1d237b73 -73ca20161aec2dce7f839054494f48376220d9b0 7833cf747ae99436046ef117c85cb6e72accd557 -64f1971732137463ebe62c4e9beb91ab3235176d 4f5a3099f72473a3a94ce9289d0526701ba367f9 -220d1a4e7ec79a28003e6527a2b497ae2a6e8128 72f809ca1b9060a7f08f693d686deac7aae459bb -13afa42b6ee0e2c2efae15b766d1377ed87fec6a cd2a4e43768894d4abd4086f33a3d43121e722c4 -66e9806422f647d5a9918692f74001c3e2b6a74a 64036eb143d44c90512c567a46713b5c5cbb1c4d -9b42b8a4b65f32ec119403aa52861a5ac94249c2 58787e6142f05142c11a3683c280a3a9a8361cee -2611ecfeff915a809b864fefd6c592a50bce7192 635f332556272c0315703e1e875d2d55ba4d7799 -39c8463d013811ef173f82e06df15e11b4c78efa b10e62a7a74d5f2a3afb455842e302a556789ca6 -d24be13cdf6600d98b842ebf433cc8b35ac601d9 7ca87157ee6879dc2f2130c01c78fe9cfd8af333 -112c036131588516a01a0489c8a7fc642c0d8b1e 0fcc7b4429a1c6221ef51b8ea1dda9b7288b3491 -8d4e50eeffdb683c37bc2f8e8815e82d66cef23e a6eff963c03ec585e19b12c0f687fd34d5526aa8 -5fdb0b2d7ba043996761726080bfeda397938b9c bf61352ea9fea08ab58c35521a3fc37b9ac56450 -cd7558dbd345049acbed6f7f1da27e1ea66c8fb5 260c0191ac3f53e632883093493222ef53cbe268 -aae24480fc515924edaa686bd431723cb7690fec 7db235cc53d53a9b0f56f9b431cd94361516128d -b7f0506d59c59a9200604c0455b9210d529a48a5 55d3f1f879c605479a3ac3f692532734d39e0cfd -2a83b203421cb45f39059caa4785a1d656f5c8a1 5a24efaa9778c5e78f6c5fcb0b34c253c34acb1c -32886e6f05c35a8c6e460ab1064024fe91537d00 fe5ac1d57496a06e617fbb16574d2f8aea2400b7 -b4326b1a0adce6f6905d26520e635384f88932e8 e21654753a84f1851041d7776002d732f40f099f -560f44d3b4d194230be5ad1b2a2d68814df66525 b315aaeb0649d63d19a368cfecf6908e00fc41e8 -323ad60d1be66286aa2368ddcb80c4049c79c235 6f731588f2d811e1424e672cf67ea53597a7e4d9 -6761320c30cd8f86d5f99bfa626a167563f29f19 242e52a581dc9388648050d72494f0d3464da7dc -466a5d4f94195b8c5223004dde5dd61ae1563a35 526f7e67f552da7db4396a43d39ab5a2f3d3de24 -65ed989c58b643092dbd872ef7437c93bd5253c0 a79e8c711c92b78fe0e746287809a1243d3fbfe7 -9f5e9192319bd2302eee867c767d9d0307d71721 642b41a75a64adeab40e47a45d718883790697f8 -4cb90adc8c15b42d69bc4687fd8d55502bbe7fdb 22031e9cbf4632024b2862b917248865eeb5ec67 -7ef7e388e3bb35271ae2e2ec4617de0dc8baf88b fcf6d58967a67ee10039411f4ce56242b83b3ec8 -fa7bc3162999571367e2b24569284c26f1dab1ac 41980d6b2c800ee16f2808419f782fecfe17b021 -d8b4e6d192f1f754a56fab9b4a5da1cc6b555c1c 9fe1bca64b23a16b8ba0ffb293671d5acf7b6a7c -46830fe5d57738c901c162b716e506d307ec4552 5e89fe92b5971ec03f67c1b7ba060944469de7c0 -eefdc62fb56d42f01f7f12445e41cd9ea753d9a5 cfa9b94f92b0d31413e6a3ca9ad0887c356a5c06 -247e4a7d64deef095e8ed2728ea629edddfb1d10 9001cabfd3a349459d6337bca8e0d523bae5aab3 -2670f01a59505ae10cd31ad6d8b81069e15c681d 8c42fe3a046006a7ffcce1247b0459084f27ccb6 -fddfdf150416e8d8ae4070fef0bc5a128079e618 0f1bd14923ddd43723c3d6782af0d6b9149d3375 -b9fa50a9a2aceda78c14b9fd3a911effbd9fbc56 297217a663979d17c0b639df1dd1038767d44aa6 -6c76d7b3e2143920d396216e258a986a97f68c5c 5df9c8c3f994875693e338380b21720d01bb2fd6 -576f782a4205f07a105ddd502942e769d181a3a4 3d4cf1bb9220a7224647dd4bad53b9760a224a90 -fcfe174bd2f6e5114b1e9c64cb5749d5a3a995e7 0edd67e5a75dbe6219aac2cab67c85c309740183 -83de36ad049a20218447319721ee05b384d8827d 45aca081e958e99682f7dc6e1aef65984c5ee159 -d5d8389db017f1d1bc0b2899317b1aa3b95f5556 606e22dfaa236d03094adf440b203346435cdcba -499a83285e6ef46a558087fe07baa749453f129d 719fb1da11dce1215c5e9423e8907ba9926df59b -f8edaa15386295292fd479c241f8a9473fce6ca5 fb2fbf050ff119392d2fba7662402f486cc70b88 -1a55de83db30fe92dac6237a2a62e538ad2eda69 927d069afe40bf2fcc9c95f38f2acad2a2a1d04d -4d224699df1371825703983f32def1b676af37de 4042edffd511aa481adaa18ea0ba4f00070ada1c -84adbf1330e4355613e5ecb037caed03a57a1c5d 752fbce40ed65ca2fb0e0f2da7889bc0feff4962 -d032888b7ba6384dd3a30a432b90d7cf36fcd701 462083b4b213dd68c567405337de2175d48eec7f -893a0e7058ef3390a9ac45355ef1092055a27a34 a633257268ca293b04e06dfff08ad9d37f9ddea3 -26368125813c083270762ac7d7edd6412e695315 2725f583105891d3b2a80872d718523d88dd43d7 -698bff3710aa1f15b0d8289b7e07d50f957cbe50 430d8ba58f88c3c4242cd5019386198e7e54e3d2 -40c9f09923cd16abba203894f65b60d0e329c333 658896e5dd3b551263f17b6a72df5f1b019dcb81 -a72c8fda88f90f971b8b464ccba1af466d32f710 593a8bbc135614fcc42dcb892df08d87fb9ce652 -85c61ff59bb5730115cd7dd22aad42e95d6275b3 db33eed4e3876e0f5f7474e738c18226d40fb844 -5f8ec6bde278e9977f4f0578dc85f06f64d1477b 745a231d03ff937e0f231fb5a6e0a6d499435a5b -a650ca6ebd4bfc9a5161aa436ebc467bb302f552 c6eac235228cf0ae4ecb2b12b6c13ed9a01ccb6b -20017d9745246dce59de1c4015dc328313594025 84de4cbd753edff63f9f3173a38a390cf1431a80 -4244136bef819c3f2a6ee011e89d0e414b99bd90 83b15eb7c010bdff6e8fc7937eb7283fc4ae775b -0018f6f82080f6b5b21cab86010987e53adc5abe 71cd26bbe5ead9521066b39245990ecfaf459c3e -dd4ddce7109021815b91431bcb2bb526e69d0cc9 08a6254c49aa83891fe8352ae4a32b4fa1277c3f -0ac261028df36ba83ed5917caecba235fe61019a 3a405fd6c6967bb1a036aa8316e773fb7806b85a -ad17ab7c3342b87a7fb1e24e2d6f6860fd3a2495 2b34041c087d4294cd801f5705c8dcf3bd5433a5 -cc0de6b7fd8c7d41aa07b906c8a39e5bbb333d78 5d6f21483a6c66358ec69dab98c3b02b9628f307 -c48daa049953155db32587d3a5de77be8f430fff 490b96e71645f301773cb33110b5bc0689527917 -71da20a52b5d57b3cae10617b71697d707d0de6b 02181e3ccf9755038a4fbafa3e68a4f6d4b0b7b9 -e4f7f77edafb3449003e80472bd84ea28df98d18 a04e6935672b1b730b2b43621b39eecc6d5e7fa7 -a5d883fada7e3613a624d4c7fc6c9ecae3439c7d 2edbca0d3d6a45e8bf6a3701389814f24ac9e794 -69b30dea55dc2ac925aa9ad74bd1183f228f0470 9f2f00fa73d556ab6e60e2cd7f498ea61cd5669d -9dc563be7176a00e6a49dc8b2b2b020b75346791 2ead645bd665a54774bb7832989fb4d535d9126a -172f26f7a2e2f25e18314c89175f662eaf90a060 0738e75fe76bcc2c2c3cd96e2a019f9ec2536b44 -8dd278d219a33e29a96e8ec913332cdc60a4f142 22d9e251f689c6368bf1eacc982bdeae36c0afc1 -11b552e783eaf407a0ddb92d96aa082546d054c7 68e0f1e9388bcc525b68747a60c0682fb85a2e3c -a8ddf839bf0a918db6a6b4d5d1e3a28ff8af152a ac6fbe021a87b95e6c4107c8b1b20d5e0ee51a7f -84f9ccfa5c632ba091a4396f06b07135e950f8a0 b66b0e60c61b7e5e9a5255b612fec8011876f636 -49d40ccea5628e5c67737b1157a99598890bc34b 1fac4e442add450a41b5405b11e57348e99ac4c0 -cbce43fc64a68a8cfe6ccba5c396bc73f2625b0a 5409a49e6d487ee941228dda02fbe2b6759e3c7a -b146e843eb3ad2da31e81e2940e120c3bf8300c1 6453e417d43998c2307e8de5b8212ae09b743dd5 -bf6b9b2e87b8bb89251011fd01d0e7c337cab09e ae08f0f7aad060905a5a9ffb011593670ad908ef -d0183507723d8de8d1205d0e5ed949bba86b3555 aed58e33a2476eb1bd8f2f604b0a62ba46586bf3 -9752002519747abdc2deba0b04c66e1e5a69e466 425c2c6ce87aa823ccdc64375e6abb0a1ecf5f75 -bc8852335e95563680578afdae4815de24272771 2bc3c1282b9b5f3d182069397a4cd31446fe874b -be31bf5e93cc555e040b5ea1c37edd5722e1bed7 ce717254c05f5abc5ad8af3dbd56e0986a6caaa8 -71f583cef396643b1295c7d5e4ef250e8a828477 32168b39655c072bf15c0605562bea86af95d60a -0d5c5cf6442b255f955bb98f5dfebd982247b6d0 3c7ffc1ecc22c0b62a22c8b1a4efe41d424c8aaa -a79422aea077c79c22ec5faf5fd79aa0ed3280ad 978fb4c8a3013b0e383d4895b657cf8d70d6c77f -657d6b70f210fac788111482b58bb598258ada45 1d09b355ef1c7c4d89f5218943aa721f3ed5d0e0 -e474277c2a09f4b1a6656345e22c9bf83a3322bc eb6358c8885277c8dd4e6fd44293c50e510b02ca -b816ff4404d9ff4f6a1c640decfcd8083602a475 1686f35d0216423c6de0cb92451ac27a46feedef -39a214aed8cd93fc90506dd0e49008f3e9e45214 ac047718f6ffd96bead55aafbf647acbbddcafa6 -e6668c65ea3cd27f15e0fcb3249fa676f4d17d88 c5a5f50cc76e67d46cdf78568fca1155532039cb -0ab431b1d5fe66e12ff3f9bfac65607147979a75 b90b3f57a4bada7ba7409f4732e9982e57bcdcdc -326fbab04d1c63169f5b2a02e6320edc711b4048 675b8f506c55e2a1c8b46e83b8823796915e0d6e -502c885de86fc90537d7bde8b4d3651f1d146bbf beff092ddf315106edbaefa05b1e125e09f12c88 -40b2f48edc089f457879397ad4a4e0b34a2004a8 ddb8acf75ddbc863c1cdcbd44085353cdd9ed5c3 -baf5db2634a36da7dedaa996af118aa7b7225f04 2c1e5d4aa249fc879c8908e17fb793b3cc4de08e -1d322d59f6169659e59b8481b76dbdb80affd944 0c8c9423b1b393bbb325e9f94e0c8c966d78dea4 -3737a580b944bd0e56d731f5a66ebd92c0b389bd b50e8106c063a126e31fd1dee14292787d174468 -b466df7e183cbda6b3cd1d08bfc1fe1f788ac33f 8969025436e94c76d469007e86770b59adac08ba -eed19dea879cc596fe2249ad70e81f112a54fb3d 253c60791f64f40c446d033f95bf1d124b19e97b -1495d272ebcbc86440e91ddea4070c616b38647f ab48f1003250f9caf6c87111fc122a2368976a10 -01f37fc880557b60de4664cf6f35b94e4476f8eb 92a3a578035372beb8f0a8e3386879793af8eb92 -d3eca9d5ba4ee1a58d93f3887c541a87641856c0 23413e0fc2330662e31cfd047b1ec2ef623eaaf4 -00e4b486137751fdff8626ab4d02bd5145f134b6 b3c8060de5748769e97a5e6671dab30a9e92d6ca -fe9f93059e30bc25c5d4ad7cc7c458d5c7524e6a 4a27d08d041627640b953af089e5a57aed0008ea -aa41b8b872999d81e6ac358f217fbda1f7cba294 9375c609f157079d5b61ed92d941d4eef99bdfca -fa64e98c5657144b6c0902acda9a39056a3a1d2f 69cc03ded5ce713896a323dc5ffe5bbc8822169d -538f19bbe6b6507642a808b3e91a07487d35094d 2c7bf6ff36932478f00eb25ad40631204d34835b -5f2cadc076c3f3d6e12220b9f6c75deb5f487613 563eaca76416244da4fa00361c6ab38d42e045b9 -01b14a587c5c15f3802b7ac8503e73578fbad2d1 3a97f0999b6a981b9ddd07cb3d7cb1b256570047 -4ac56dc282ded8bce8b51ab242180f06640c7b06 63b8494381572867c1cd0cfc0fb8025f6fb0ae0e -4de46dfcaf314ac7198aad1d74cc1f428e68309f 5a696ff8bee1a7bb9ccca0d899df4a58369e5adc -63c1ac32670c6016065994c30a43982b61b205c3 fa4c124ab2a8bab34b29f82e3e50063e28778b59 -6f149337733c8c32ab68841668a254f9228bd2bf 10609d3b0e5396f614ce80807183dc56eb27a47a -f28edd71f53c53c3f4d1e106129b796f4b658350 66ceddeccf371c46b8ee3c304322debdfafcb7bc -8d894767158238db1682a47e435943fec6fcbc14 a411fe71938282526e26eeef8824fff8837bcac6 -2a4ac908dac6c7c98636482c17146ada05f2bbe1 8a74a886c0e6f5a7ee5e49ad09f651ab4e7252e8 -563f6ea8d714f14a72bd1bb5c96dea99163974d1 8249d5e1a1f1b24aaec75b05a381ae7d23ece9ff -95a88a713dd598fef7ea6d2e0b6e4e0e0ac05333 8ead83f7c7d180c8cfaea8479093ba8c7f73e428 -2a8ed5cab1e9be93348f4a8dc673ce5707ef9654 a229c395a63970381fdc2221ab470a409911ffdd -771d5fface723e703180ba7f40a3ed434011165a 11c205748cf6bf9be648656e81f55a1c41ec34a2 -0d10bdc011c36e90eb6dc621f7970e13c036549a 6d89eb37ad69d3459dbab83766188c44b81d653f -de42d4f56fd6f46c07054a505651269846c57f68 a345cdb1ba12c81a3179535e8270598cd43c2e8f -908859213043b82e0d3df4e240abf012a0d00f21 8a4e9a6f21fc6b3b9b79e350dfe41f45cfd90def -1dbfdc0ae7d6ffcd8ed0c861dd1f338d36dde7f9 5ca0130f68ad3670095456447891098229441e02 -98abdafc9104781b804971348c1b944758d271ee dc9ed8d51dcdc67465fba95d1300c3d1dbf1110e -4801576dcb33bc0198ee62e9e111c4debf57ddcb 28395e0d201d1b2d8757e10adedfb8f589d83d84 -f73975fac6d81c40e0e38937dd934dfdcd0e7ff9 fc8bff0f619e662ceac6e0c02a9280e67eef735e -92595d8648a0d13b8e5f37d5daab7efbb8b8701b 86cdda3efd0fbf5dc66425c6bd702addf4afb82e -582c7f2f1ac080b5ddf30a82e1ef2d8162ba3e54 36f37f4e0fdf3313bed9da816166be69b6c0e3b4 -9d94e0063ce7a769c246771adf7b9985a01918d4 38e7c2a8899e19755a46d1c17ea8577e775401ac -36bee14512cdfaa580d62578ee4636caf99bc00e a783bfb7274e2dc6490ae3b23330cad231fe6359 -a8f7c98919f7e87f2d31b41f8326a5549fc60502 a4604a9274e1589ba0064e8f85a9ee5467329a34 -662ebd9f349d0e42f9dd31636babf029cc1db123 a43d52a1ff512b192c65bccf398fcabb99475607 -64e1e725a30bdd6050d5c9eb6405a1955bea008a 7e525f77d58eb39e65bce62c8a522651c9a52c7e -37e7c315e1167d8a709f01dc507519247ff7f03b c1be47445a57e64787660d90ca03d15ef9bc0eb3 -87784de0be4ec4fc7acf233f2c293f885557e34a 2b8e4745f870fa93aaa3a31ed7565ace3d08941e -0ee6ea63728029abf3f770726c776240e44dd4fb b00e55eee3b3ec0a7255128d995a627b1c9723d3 -5e602f6f6b7615e986ab4efd125c2174392b2ff1 c0360fa735edce45dc3fde565010db48a3172653 -f384b3b56642b84231e443b12c2d87d9df0394bd 0eb617accf8bd872acd09522070b388cf8cf3819 -489f3e26b0459385443fff45016e50cbe71746d6 acffbee57b1284e36e4b0589671d73c40ad71936 -047cda863a279b55ea187112069d56557d8be270 11e63a1bc1492ba9c15fc2a2649a6feded357588 -ba068d445ff97edfc2d893721168f8afe3d9364e 2257c1d325b5a454a1bcef496149f734f55535b6 -15e6a66ead6f48b11a14431d8561094de682d9c9 01ea89e18c721371e114df133d153236850cdd90 -d1d5fa089bf90ea80b09c21ccd1a30f324137712 90a08d82e86c55932c5376002f1bac2e25a8a4ac -22fc1b210834e3ac3390512ae8dd488a2b44128d 90d1104a83020640376a9c8de7fa78459650cb6c -0b816aa9495b9b63d06f629fdadb1fc2ff4ff484 6f94c07fa0106da1cb7eef3bf0071cf69e42e540 -697419e8de97df5c9c52dc31cac9105b17e41ed5 a7899ca715ec65c73653feef428ad14eca9ddc3c -a3a8fc4f45b904da3861c69140acd7fe96d9abfa 57b9c51eb51d52f0c9ac08f6ae7d6f9361445a8c -5e98846b8767608c277b48f6daf71129a4fec46c 162307bc33e51f5b4a6996442f91b2b19b132e1c -bfc7a0274d80c3ebbc6c9ba8795f6ee710bb8c41 3daa543436f8d3c813a94b894c9c65b0db97aaa3 -06ec13328c32f0acd4370f31910b48718d040c74 726ed76a521527586ae9b6b9f2b5a7f0792980fc -6a301802987245c4bb7941d6368835d6a9b53c8d e1fe5f42d4b267b6f9d1b4eb58e31bc391fbf1b8 -9591839378245710475313e78b0b532f817f21d6 7e95c0709c6a1ebc4492a5b68fdaca8d02ff3d8c -de0d801f0352be6d9ece827acbfbd114b272ad87 730b81fe8d2f43aa12d76cd7a86542df25f2e845 -d480d1ca5086b79fdfbb30b76bb3e31595d2cb45 275a0219ff28dede17c177bda43d07f0897200e3 -f10b766178adfce73259ea657724a891bd730e60 6dc7e8002dd93cadff99c9f8c77b8f1e529efbba -581f69bdd45d594adaffdcef5e6f6ed4228f403a c61a169e529733422b15ffa62d40e7d3ee25a96a -afeb36cb5ed317665bcbe5dea16e46a7caeb5bcb c7666e6caa30461b17c9905e9f77e944489a8bb2 -2f4bdb3fce715210af0cc96abd290f8318981181 da3039fb41f881132ae696a805dac8848fc61191 -d7d1bfc658e7c22338a3a98fb07a88436cd4cb75 515037ec4a19186a6ea6a4a27735bdcf519b66db -86673a4cfa2a238556d30036c4f1ddbb66b953cf 12b7e4b206d32550739a9c2cdffedaa9e3719c89 -03726ad59c43c0f27c1b1281cfe2a31eb4f6318e fb9fa5a7b33978f63bf3230c11532eebde723a45 -e9d985c714f1cf86c0a1478b4bc7532204ac2dda 727460315fa7f02d8a7344e9c9ef9b8381044044 -929c4e2575893d411242b0cd7142f97c6080ed4c a45a21baafe43ea3ee46a2a82752fd6327ab8c7f -05aa173f0fefb8c8a5d24a3bba10a2b1a54cc7b6 4f5b33d3f0b09a71654121a543a9e80a8b2be499 -24b7cbbc5d050b1359acc2d076f543104229e368 e41352864105698aefb532f09c9cf54079bdb3ce -35c2b4b666ff2a4a4663f0423e4a265cf4bcb6a6 92e5f9ee0d5ca92d06e70b6479275ef67ae35798 -c0982fbdb31cd297024351629e0edcfee6459b04 951e3c112d1b9b59aaa1c91743b122381612c111 -9c36e94baa508f0b36863ed27627453811ef11dd 58d4e721ca1a3a8fed57eab537723394e6ffd99d -ef03b7002cc91e699f456e0113d9ebf37d724fc4 aca54f079736a6c7031e23cfe0bf01f5c7686a6d -363776a11d69be9c77d82e359192de1a52441f7d 07c660a1dbaeb80dfa1c432f33e0f947324711f4 -6d35713d7f3ba3f62bc4fafcd0ac3d7d29262794 5b8b193b4b2f2caf4606faf40a5bc6f7761555d7 -f9c7bab77aa1961c643f3d1cdca34a02be32e6b6 e5b93ba1edc3570ee38d9930a6f0165bf29c54f2 -7d2c8a35632a722764a607120dc56e8b626a4672 fa799033e5979529685b62e2bbe3e73fed72da15 -5697165cb8cc6616a53711ab113fc406cddfec22 70bb18baaf8f280a39625469986b44fe609b6526 -2d19dcfd0246d907f9a689eea10628383617faa8 6f9895fccf2d17d75a9bc06e5333d2d380ba98b2 -6f1ea2f1a56ac227fb94979518959a55fd8848fd fba9523790a6c2203a1a59c589c944e3347cbd41 -0b40512d80ccb15cf024c23dfe2975c0847b107a 996ede2b7863da16aa5457ff073cd2d812431e18 -4500672ba1bdcc681826ee85229007c079839b05 cc6871043bcf0ff00f02e3fbc44b6f5f4b3fa755 -3aaf9d41406077afbf9a08355b251b3c2e316bed 59b4accb9e57ecaf45ae9841cc1266a5849f2441 -12e2c5cd538814a25456ce7289d22660231f77dd 1b011eda781ccd4facb8be2656e5e0b23787d0a4 -4116eb61f443cefdd6664cb42a9a089adf793d37 bf0570dc8589702ad34e1e1befca28bd566cd9a3 -906af18883617f8a15164701df75bcc763880efc f9e72ead346112ff4c04543f734889f99f5bc7ae -53ab5821b43c023d144c3f6ca7ddc2e749cac9a5 cf1d5b3b312193192344370e0a275fb31e28fe39 -a42693b02cac79c806fdd99856aa2024751544b2 91dd30c408ddf10e1cf1c28d7168544d799f0da5 -fdb546de6e9f7e128b7d8edc6b8b29e091f37b70 ee5a408502f877a828fef232069e3061f451ecac -450a7cdeb8462fc4c97c7d35bc4cea9f8a8bc8b7 17a81511a9d798381b4dfeca0aa68f064e876d45 -89e0b39c7f68a32e54d0b3fa9900bb32c752279e a5224edd5c0a55113b7685c404e8c18ee2f38d0c -19f8f2ab1ec33ab8217645fbd50b5dfe79a4bf6b 3aa4d8ce6977f48239486058620f41105fe10199 -101f9597e5e9ab7a8f12ebf8f2527f39eb17c5b5 a6b3b0604f9a15de6c36cc9b719fb6d883310f45 -ebf2845ab244e6002978accfe9bf024bc22d9765 2029e823bd1324f8ab81b5bbd74a5fd289a420e7 -495e3575b617638fd4fd36e3c7445b181f6d72b8 84b1feafa34c100a796b5793e3e9d57cddd2c7fa -e1644d4b1a15699f153be72aa908b17748d8f70f 0d0888e9fd7d557dc4f31ddd6c229fa76f7cacdf -00ad3d033f7a0e635ff4f204111a0647a1380b1f 7d6f1b95b6c5b40d0e152b4753946ab7301c2344 -d2438a817abd76333e354a16534c6e362637fc45 ea7a924bd886b501fcea01a60eeb966384524c87 -a56b37d61dc5eee080cb49c218db16c3787f51e1 7d72ec1914f82e808eae3c6c0bbb2e0daa99a446 -95aaad2b61402b4ba4a1c09dcdec7fa913ae554a 63ca4e49fecc893a1ce0a957e3548b4b275ec8d2 -395b9fa3b0ee02cd8eba47fe4487d55343620798 e14b7bceaa1c2f219ec28b96cd09f7d625c0fdc5 -72fe7ecfaf5776c1013b21c8bf4465f32c63b8de 3fd7053d6f5c45d55b73ee4dd6d3b285ac259148 -e3a93cb534994f63733bed340b383e52d519b9de 3b48fb08e88e393d54d8b61787fd8617878a9cbb -c96301f286ef6b7046f882b217f18a956de92f7c 85c6ae9248db321fce8fab1bee7d958fb84dda78 -44e1036de6f9b86d9594f8a9917fd7cb98f539b2 45296c7d3cee29a9345c33f2959e0128b1dc276f -392116bdc5a8cb8f25ea36207dbbf3b94108d58a edf06776c9fc12411ef40e559bba952de5101f0f -10c49aa344c1c3740f874452fb6ad8523cc5f257 70221d439219ea6354d12ace2a25197f5a06581d -ce34c8dbe3dc08c9bb8355d759fd36a69cdbd8be ca30b67c31d7ef02e02fe85ed16ce5d266c32d52 -76b71994b368498bc55cc785db539079b8c1e83f 96796feda0d2c3bde27f6ef3dd564068cadbb0de -8174f2ec719c7914aa842c29620bdd32015fc8aa 2324656b2f3a71fdb822597c402e49e89816e149 -6c40ea099b756ba001ae45ba6da29af09350c360 635053d2ad321afa71ded942ff01705cc1bb17f4 -f031ccf26c04aced2616f4290697dba2d1cdbf44 90116b0a1baf7da7feda1e53f72fe051f2e244fc -324145405f3194f425f50dac0858a85ba7bce425 31de3cfe129ec9065371aee9482388155f326be6 -e74d7649224fe60cc5b7de242ad7b73cd2806977 7f1e388596f084b966c99048d7d2fc5a76eed870 -563789793ae50b00d0ca819ccc19907b16372f02 37d5cf0e490ca995a5d904c25cd2eebd76129dfd -3e595e5c45d99df8426e41032736e34daa9715fc 51135b586c9dce3280ce6db47821832813e45efe -6062dda86a7cdf539130c277a5b45d8488968d62 a1703eb795ae7c8050cf34cddda36815e9714a1e -0a24b6c54f03550e1ba0349c0387c804e2ab5b66 1ca0182f45f8747987cf8ab616b226450baf135b -56e91462967dd46912124505c3a6520e3cffff37 1c082715d1b4a997754a737fe6f2cb854cd8b3e1 -a7a840545e9db9218bcadaa9a8b2bf542694638d d4dbd0e6b923cc8c6fb2737e4f08386e23bb478e -1bc38f6ad9a412cc70f69f0ede2edb1d606da4b0 7082daf9ecd5b9947d48435a5173f5792882179a -3d4c3af299884ab03b511018594f403407c99678 c7a0be416ec4ee5dab2770f324c12feb2acf5282 -54073b499233a6f2753939efbb6d8ca3bf5ef73f 6b15469a128092a1575edc27f3bab2149f05c2c9 -67c58a948f79addd1cb596a257aeadee29dded14 170a8bfe8d4be2d25181d6f36c8cb83087ad8675 -f85fbb479f861b49c67b66f567030ea4d13588e7 a02f840503abd38fbc9741f6d238d366194a23c3 -0c9d301cc4f5253ab566c97fc8a1f4f19985d1af ea45989aeb9e0de45941c89322462ad36ab4b74d -be78715f315d4583e29af4f3bea01875c0bb0669 9046a5069796c9f65bbb5aca60a407d07599610f -7ba3123c9635888c77f534cde4d2775406ea9b75 5c6c84eba050fbae7d318aa81e52b77a47875e82 -a443fcf52c21ee95e7a85bdf3a10c99e5daea385 7564c70ce7df5d135d4857c6f3b3dbef8af74560 -aa6c90b9245fc77bc1d0d1f2b3f760ebdbf0c6c9 087509a2820e05a517528a72150553d7deadf871 -a6d8c079fcd57de6317d7ac0b157c9eba624ed60 27dcc0b9d8f7db92b0a71d1a5bd0a96222a9ce15 -b720fc0a156a556fdb95fe9e5a35d132ff82a86f 3f19401391798e922448ee968a43346d69e9def6 -db4b79543ab44bc41db83d0c17121c4940c0a054 6c32223a1ad7d8e76fa3a24b75d28efb3d11705a -b361654b0abf9ed6b35b78ad984c05ec805e2a4e 675f082d67479d14997a1035608c45625767f8ce -ebc56e1894cead2d46106f9dca6c13d89156c0bd 34294edc494ead1590eaad2154f5edf07c02ec55 -1e159b3f30135bbd32d4bb89464c483f0a7354eb 1ad2ce9ce0797eca1257b987c33e43b42a7b15d1 -547edf67f99bdfb9f054616960969c5f736f017c a587331bbc8b85fbfb278d40796a2395407409e0 -3e6e82d8de5a12797874ec21ec15b066e5228def 39299b453db87f580b37b7552479aaf8d2630eab -db4523e5ce9dcd81be932eb1b0170a6f2591c4b9 0035a9a6bbf2a280922b0dfa0e2d3ba308767ea2 -2e696fddfd9f3bf39dab69e8f5c55cfaf9440994 47e61d1daa479e77bd13ae7790d86df4b1576e47 -2735191281d71195f4f47480027de9bf822d7e8b a02de9a5236fbea9009fb6123abadc38b15a6c9b -a5c98d4a349a0871c9e120b9f606b7428ad36466 532f6658a01a73674424b3b1716773957862914a -baeafe47baf64cb2aad287649caf3ce2da387b67 d8de9b2623f2d17363e6015c45c167e2dec3d3b7 -0e63362057f3ea99e24b6f04917d839198aea829 64101b79d0f66af3d14e13c529d6c67c60923611 -6fadf8ca2c314b24cfd991c488f10325c99f6769 925e168bb609e9f6e7c45e51464055aa0400a246 -39593e06e5d7f81721ac4212d9d06ba4d18019fb d7b8f46792b9da3ea4a3ed8207928b0d77747033 -8cb6d262ca80b291ad8ff79e5a850a01ff4d77b6 7b215ddc4026d8113a87aada3231b0d8f3b87461 -be9f5625c7d705ea098cf7db8a83e0503ffa4ab0 157fca632841b55c9d87de8ddc0eed459568d370 -dd24513a963267f232d5382b8756a2a1fc34d53b e061389bce1f1cc46e7844e46df9261693a936c1 -088807b308ada0072d9779fe59e48da475b8e736 4d2573d1a5355a4ff14a5955298bcd7357928358 -82a64a8ac2ea564b25f4d6a825ebd0f291e884d9 8d960520968b50f2384ff122d2102f7ba82d246c -8ab43ec776abdf3d4fd2247c08873d733934a64e 84df23975341a320e522a5744f315d061915a786 -61b1ccab92ab43ba6f81883d9d531869b243995e 79c3ff31093d9a4fc7326f4f5ab13f215dad8839 -06b28bd76d97d6f080ce1c550388d7e65fb51d80 61fd6e95f2311b6536e2b4290e75dbca0c65c24e -652517f7335291f31c23b2dc6bc5114b908e3482 6635c06aad96abcc315608d4b6ad6d4d86d00ca3 -d29f8a264d00c3f2878a3ff14d806431179d17d6 aeaac602453148b8554aa64365b032c96659f721 -223eb6196356d067e7ac726801b1ca677508f14f 653a68b8c23fc40995457b204e1b37b6276a6b45 -de6b5a2391c0d52f60b947cfcd4224b88555e757 ea6476bf53b18250c57e0ee8b5f58c18e0489a0d -2d45a9a0746b1489c7d344d74e0cffdc93363ed0 494f9053a05f59d6ea5a50898eb54c7c25e18032 -a1cfb1f8a8ed6e799814fce2dace6826b91265eb e9f623cc4a5a8f88f3ed862013f3266933d5d905 -ddbf1b511b5a2fa763b43f611f34289a18e12f4f b109d178ff69391af00e45421de35f21630afbba -1678dae51ae0b1865612559ac431cf50dbb250f2 392917dc309e815d23451f0e9d0367fdceb53810 -442cddec78e37a95e372de7d91be6c7c058017fa 2b10eb4c7fa584a98827b4fbbc6bf3b351635569 -2a8bbd6a73d0ead2b11986f7b7d5c7dec277e07e a5d7f66ed6b2637dc1e174e38271b09111ca4f82 -19d934fb4333b4ab6dbbed54e43d616e4e735bc2 af7cb6b89dd51423119a310e8f8feae63c80abbc -8a1363a6da1b02e56e6606db2efc98981292728c c7559f627eba0fdb8aaf55971ca183ddd637789c -503eaa1c8bf787db9b9ce1d0ccccddcd289c6232 1ce2e5f49a088e49e388b10e70b80721c32e6e86 -3f8400c274fcee86eea0673e109db37586474bba a3d9e51dd8dbdc8acfdc4c55c96513ec6cefcbf4 -1847576897942a57e71b4a62f25b4b2b629a9697 588080da122361f5867acbb7bff97a57791eaf9c -75315d9f8a05c9cb08ebae39f19ec5dad88e7df8 86a0f82836839d70c1fa8b5ca3179899e58adabc -c9076289e7a1059a4fb345e22c8fa34cda8418a7 ed6422ddd40b695ef5a62e67f294ad6a2845e475 -095f22c5f3a111032295fe93adcb22132612cf5d 337da9c6c241d26790b5fe22b84a61a47d6c5822 -e2ddff15132ee8f1ac98d5faa494066f028b58e8 1478ce4170ea4492e478459387082d24131c5400 -ad4b0275d3746ced7098146082639c9fd4a1cee4 c46308c43ef9d62948a61972967c401e3eb84f8d -989df185778768de04d9eb5018daaa7e6c4eccd3 b3e59fad7d9b2161a44e54461730251e468c887f -bdbda87d3145892120e09c294604e219cf5332f7 d12bae7556763d25379b8795b7e16f5f215d2d89 -6504c879dcd90121437121faef15ee1c6d0ef591 ebbb9be75a0bf5de29792712bc045471695ac4d6 -9461b384f41408c64301454324fba4264ec66ca1 09b5b155e9bd5947c6b45df8e98e6302615926a9 -c252754c757fef24fdbb98d4337ec216fb964840 9387d33a05e10a2b1bbf34f35c711c16ecf1aa5d -f721de7696bd6c722193a4a63301cf367618b57d cbb62e500fd64b9dba68173e362253b61c8f283c -38113bf679e6ac0d65e8f53a3a13963aa5b5fb83 d3e85e61e78f227f374766650906488676815044 -90e5caa98ee65cd3efa6270181d1ae365b3697f4 89805589036a218924cd17b535e1232940e51366 -397e04d7ddbe586b638226fa9479777372302235 8f97abd8e3ce6dcdf3c0a6b2a919c5f7083ebef5 -c50729d2229c4f689740c9500df6e9704891d966 06f809e4bcb3998eb8131fc7c3ecd2e85911ba83 -7e733cf4af018f97fecd5c462df90dc262c33609 772c1eb4e49b177e0d0c60ec656f72d47b4576f2 -90d8eac1baac7d3aafb737a90640cbcc48e35c8c b4b9d37eb1cadef668d36753acc48a9fe9850bc2 -74d15c0a5ee9f8479d9c29db8b1474b47858105b 88340dc22cece8db5119d31fcfc7e661c87d68ed -2cf4a737b78846131b0cc92256f9c1faa1320595 4d839bfa92aaa6d462591469fd0103696c1d83ab -5a3bfd12c620d249dc922249bfc7b9f18cdaef2f 3bf07fb0fd83b8f7429fcfe65d8a41463af5a92f -e8d37c871f86e3afa684785a0cdb60792f7748c9 347f5bc64c5c7c36e925f76b71e253287770a097 -5d99ac3d674727cf9035997ae61a736581de0f3e d59a49693baaf0a63b02bddc0edb693ad7f1b76e -e6bd11c50d22b4c6a0d61e40a1efc425270931db 584bb9a2c78bd1be756467ed2f46714de77b54ae -18262383768226687cfed9c531fa14aa8adee6f2 78031521e86ec7a31c257b8f9abee4f5a704b6bf -f241e651956563a46f24d627c0db78ebe090e131 0e75f91af1783f8ac6e472e8522a576e9908226e -038977c98fa7460ecc25911552142db0fb1be8f6 33e24c9cd3897d768e8610dd8cf1c99b1dbe41b3 -1ab8ca0dc77e7b4006cb8f54f657ddcfeb5f5602 9294b77a1b2120bdac425f0f5c9d19bbc61109ba -ac6a5bdfb21445d17e49c9077e35c72eedb7ce1e 8f46bce7a7caf980705d77c2d6f8537e2fff72a5 -d200a817f7f51a2835c081c44caa0c8c00bcdad8 d685668d6249f06e7237f7e7657805eefcad010f -5c1bc316dee17a7d44185bbc88d3ae68375896c1 87d714a281ab09ef6b8f97fd32d215fbdba3c2b5 -16cc332e213f3677fd00a26ffa023e7172a0d201 c4fae5809d09f0416786462649b47fdfb8ba1cf8 -66a2d4f024e09deec446241ccf708e2a74e53140 0798cdd4ede3127a0a420c16f356db0bc7a1d8b6 -5dad6c41d79e9ef7d89baf24837cac832e73629b cb5d6b4890fc5e1ae769d46f6b76e1a8f165acfa -45234a3d2fcb06395d24d9c752fa5272c4c70c2e c7b508fdbc8fba27326e1ec6dc3edd6210992e1e -d694aa1bfce91975e4d2efc4b06417d9a24333de ff2376f9ab21f8a2ebccaa2fa0c7679b6e83fc3f -53a676dd11d646b9cce226b87054a107cf752bcb 04207cc8a0f4b9e7b8edb46e764129a260f68d80 -8c3dd8ea3e96c0a1e1378fd87ca7f892e96942de 18e689fd79b8890b5d36f4f4764be742752e5acc -27a7ea86b689d216d0236b01458fc63265ec1e40 ecaed8a6fe2c11dae80901d35c7887851aac4932 -799b92e4ff98c97e318a88df1c59777a1f935561 a5a37770d3e48676b96ebff125ef44259a894aba -bbee64d1fdaec0c69f5393a862eb6223048b2bfd ea97ccb23aabab53a6cb021fb689de09aa61d1e2 -b616b7d6e674a8fb264af25882b04ca84d5bfec2 45d63df917833e05181c10f2d6dd26366aeb0733 -f38ea6018f24246a0b2836c47c563d148234d0ac 3536c7bfd9080f3e38ebabb6523561954897d772 -d1dd11eee96d0317fce7102ed11e3e8711975ad2 0890bbbc97810c1a14a380c69b5a8f8d2e92be28 -5c16f975a34024c411da4aef6654046b46f1866c c9d8596918b64d2d2b9bd2d18f1df0f116f0169c -619526017110219ed1982fb8697e353a380fe742 132293a14c3c7bfb96724cc9c16f0975da02ae98 -71fc56750c87eb109603e3256bb40bc259d82291 52f3afcdeaf7fbf8b060766e54818c4132e66866 -9b944fdbb87845bac7cce496d1a90dbfecbfa8d2 88b72afe8346cc0845e55d2cec621a2ec177e81f -96f5b3dd0bb0321e05e3bb028c70b3b93a0bc8c8 8693149d4349b3abe2f31a1f7be8530c49ceb75d -e25820d9c01f2478bf4a4cb38102f4b1a2897536 42ee6be60c581f4387f04f6e9b717364ebbf97ea -64c7674cce6c9e18e3f2cee221a27b50d5674a7e b104356619ed118ad903f7d6c2c72959dfdf65a3 -783127ce42e63d35673ca82a5c07d2df5449303b c7cbff830ffdcb130655dd7db501214680400eb8 -fb70c1f2a5db0e82fda9eed995df414c86e86133 1ebec7dcf8914a4e89d38b1a33150d2bf49d8dd1 -12ed3995183bbca7939bd4c16cb311a01bbae5e9 12bf7f2a717c6cdda2c1241929c301a3bd43d2a2 -035a65c319d430dd6880ac75f4d0ea0e60a137da 0e8848208b4f0a8a3bb3b81e237cad5856a195de -8bb28a85237fe46556fc0314d7435f93c36a5c0d 3f4a2b834432f47d9b3f011530f71939087dbb7c -00e0f22d74564890f6f70b4046ca48529c9fa585 a7edf6c67f66c545c83de0b2b3e52152a3711d54 -e6512e86cafff69bfd931037194c4d6dc3621f27 a24b7da31bdfc667129e4a611a7776047739b83f -ee70340215836ac767d56af4ca63de67d099cd4e ebef83177d9f4ba0304bcb5fb5672467d605f559 -051085f37cfb676de388f337a54c600b250b5ba9 81ceea015ff058e8bf251544d48e7c93de2a8c23 -476196753540225cae261eaa82b8c787fb948c87 514e511e92db7a185f975648783d37f42556b211 -65fc5fff8a2de2f1fd818795b962a7851c306932 43af7289cb800539706ff08fc267c6aa4a712c47 -1a0b71c5941e69c7ce464217076d3391fd317fa7 e70a6811c4c1569aa0467d0c04fd37f059ec26aa -360bb424ed58f0271ebd00fd2619a504b0792f4a 1be647d393b3d3941dcc8923062648b2e0ff3952 -0b7f854c9fae492ef5ce6d4b0b63cef0d497ff20 f6ec27a3fa7711259c239f6410ad4a8edc8f5fac -1cc2567a5fb58a305d3443aeae04a09ec84bf2a0 830cb35457ef3bbdd9495ea5478d2f86b2b7dd90 -dfccddfa90924156e6df69e805e3b6c0dd4f3e24 478c8354f4878e8b75413f3273afc63a2d66252f -a8acacaa11726d4392797eed1b5dbbe5213f9071 04e843685f1af1c804b5ba48fc8619a05c4d2e6e -0e242ec2da61b838796d94f3595f3a1272c457d3 6316295eead755b43a4bb74cc63904ed155c24fc -29ebac9a1b350ba57d323ff7c0c99abbd15acbb8 39b7d64544360a74487661ac6ab2144342f716f6 -fd9516f34b52b7c6b3f8f37269951b5e34a12aca c2f1937ebf78ab9904509977830269435c02f6a0 -145be78482550a39e34b19b654068924a89218d3 6c05a3d05dfff714b1c7892fa08dc65f50e27206 -34c6aa10ee91ba845140e9f41cf1f36f76cc3595 9403cd10cc39445f4029dacdcee1188e41575316 -b849a162507be402f2305d72dda78c11fb47b997 d07f811af869d939270c49c85269c4cd8d22739d -5ff5e49748e5c59494c7203e471ec48ae0a2a0d9 2e3aa8deeb4b3cfe36bbd0dbe0f5db0f40eb2cc4 -844d282b8ccd31fee4ce511b9111c774c04fd591 9636ddb5387e440b05d00f455128c681755c810e -6db6973cccdc14ecce7b3a0023e39f30e1be151a cef8e4eca469975d72b8dd4268ef7e2c94bdd4f1 -387767c66801cb8353fc6905c47171648949700b cdfd46f2df36bb5872cb7185ad07b7eed5a765d6 -81d381dcce94fd9778ea4b16551d59c60c4633b4 cf119da5b5036391b6cf822630e9cfe3b416f562 -2c99219090922c2281da5ac46d94a921895832d5 c3428e9f7f9cd84f958aea914f15032f040ff4fc -652b8f18663ccbde504286d0b471f2d7f1ebd63b 1c87862868f74efbd5d1d1f902bde14ff4d1451b -a4ee54d095310b3c1964c02b774c2f001cd2310d 58c849761664ce9e802bb2406581f7d44c7beb93 -9e823075f1eb2536548567e986cd8061666cc223 4ccef4f7d2ee050abcd1779efe580b07d2ad86b5 -683d023010dac4315b30b3724bf4749ec937bf88 91a79dfa0d0fd701b271f08024495e8299b1a922 -b2548d53cddddcc475b835f0b61f4d0b90ec26ce 0090a1b008caf9ab46c8d8ef79031e7df9c692ef -3319571f102adcd993bb979e2d11f0a33280b3d4 df5a9977a2f37e1954f66ebb7550c1cfe71cf844 -c572a71ebd2eeda187316e3730f8fbab56a6bc51 87b8e511d87aa081b830572d8771ad8ad4e1d1ac -8ab70df08454f15c0ed0d5d4eebd21c6e23ae6c6 e82a67c1961bff391c2ca5065c108f9ccbe04c66 -591fea35d37ad1c69920d04ce9c65b5c8f033dc3 cf79cd9b200f2aa2eaa0f4ce7bc6c54430bbd1b0 -cffd2051ee0ded06b6c6bbab276f1e5439c2701c 2dbf0d20bf10a929cc24e3c76885a9fc85718be2 -f22750d418fc301fa291a60f4fdd7ffc2091eb83 5a59737bb6b37e9be4313850af097ca6f71f64bb -099c66aea5dd371580e1e4116341f375bec78b5d d415036a4ff495990089b1a1a57b318601196ffd -7fc872b5afa2316adf32d8458b370cd09457552a 86a3c0731ec387727462ae56fe99694503e9fa54 -cffc8bd17eb3f8621bffec2fc2e97fe5641203f8 e240d8ea58ef6c350e0377c28f7ceb0455577bb4 -754543d90f4a6bc39171fe048abc961e11ea0fa6 6e94548f63fbd4b66ccc3a1afc3c5fed6e5bfe75 -7936dc4c9478959534321de6d6e1836e1c8c3114 5d10db31384e1a31a9ed6c68230c54001ac4d30c -72bafae54dbe01bb6961c046c18d15e6a3709646 3a406df190b0a2ca9eaa6f60d56018a239116f9b -23fb8c381fb0ec7e48ee0706f1acf1782213ec22 020b6041d7cc034b06a3a703ed4270ba9765c5eb -435776741dcaf2a0591bfc634d0103590ad3ae95 cc6fb3ea3765d54e716c02dd133a6b3570e517fc -26765995c5ec220821ce96646a551a39759a1040 0acc448865c52e2678b90831b6d6ac74837affca -877945b4f2b7d157a7e8cdcd2aa19a4af5ec0123 b46fe42e0d5317678832d4d48595dbfc80d59c0a -952d203782cc626e6bed3e142cb5b9d03278b4a4 beb656782ac69ca0912b0b4dfa3b52a2e7a58a3d -b591134849aa49938f41d6ceeb3f5e8a3dea6948 155f4ddb1a94e6c11ba19c9b88d2142ca5ef1bfc -0d76c1c94a57b4f11049710af6bc7a8028596099 751ef470dfc9f462bc962083f191ac8835012d3e -dd2a7b818699a6302c5960a6ffaee88b9ef9d58e 9eeab960b43ad9ee4d37147857d4f84654eb853c -981ad68ac7789ed4e26d074f2a6e2447084409be 59e81b125b2296c6591352eaad18a325b2370c5b -40ea84fcbcb8d2a88a86b0a12531011a88a5e81a e9a3495991f38adffd81eb81f1cc7b7f77cccd08 -06f9a50da263e70574645b695ab6502c19e01ff0 f031d26629af815eee850dfe7c9bac2586a70ff3 -b6f2011b514510cc520e5acfff403312c6d86c01 bdbf10a6596c8d163c55920b37cf39a8e1e96a28 -cb5ae491836947365b51548025de4ef3f52bff86 d2d9892cf7bf5b01bd11005d677b0e79217a5ccd -30f797c57b71cf0b97dcbfb7081c0386b34584ba 722d7432b04fcd66502b9193c0b819a240426f1d -01ac83dffcd8e994cd9c726003d5759861e80ff7 1f21cff151146100db41fa377030c1317d467eb4 -2ec71e8f3207e0d1577289a00436e830b90a90d6 8b3a50d3ef0b6f514b80277fc9a069ec75671562 -51f480010d0ea20340dfae81ea701746b6402878 75cbb572488830c7b74391c9a23cc36095e3f428 -1a0e39aa1bcea4d85ea8d5cf217d1267975e54a2 ad7ec62c9102ae8de885b9fb03d780ff4ae61804 -9def0fb09283661cdf0630923fcf2e3eca00a8d9 d8b9f4a06004b635005885c0d29f1979ede4bc9a -8ba7c95df58951f874894507feede75311944ae6 69a878dea83b9492de08555eb88bf918b8031521 -6d5aa4b9ecf724511fd7cbb5e789ef0c6b98d127 8ea4d97cce394ab4578f84d0f762a2da8dfc7b37 -673bce0f68b9c24e71d6a83f6dfe07d966d44aa9 f7301f687ca62039eadbce143901b9bc7df74bac -68a4512ab766a5ca3786e1c0cc42e0411ab0455e 41b56efb67f8294384245b1e3b5f288fcabc83dd -e853d524c6ef0f1f985c037885a7382fa091ad43 4ddab85d4ee4ad42c6f8b238a8103c97d8128f39 -61775bb70f3de6aace1131e1ecd08d1474ec0dbd 66674878ed14abb054c2ae9701c36c99dce03630 -cb1823420fc257cc09f8a8f7f11106def900f336 bfd3f421521b849991134adc6495a8bb15dddee5 -e96eb30e4b3ba634b11b561c4ebbe05efd865441 646dcabb6961d982ed0669c14b2104d3a58e87aa -90e8032c3a1055c09848fcaf20e5ae1de297bf4c 93499842aafb02646c4d091529af39e130af0ef9 -2bdf21712f75c7cd0d23d6203a8f876b3cd4793a e8823479ba69b0d6ab1c974dc8218e3804e3a369 -8c42de9cb54212c8088917bd59abe7f53588ca44 f64741150181edc4b9b102ee8486be19c374afda -c6145a1eb10bd51d3dc0c98c561ecaa334661764 0a7aa5a78f84239358f8df59142cef7fad6395d4 -1e16f67bba160d3f9ebbbe4104397d1ada96e958 83b5f18e82b1bfc90905527aeaf8dda13035bc9f -d8e609f6db3de4fd0341d4ae5ad4e9518a9444d7 69263cc53cadc4965b884e2410bec4d6224cae7a -e272ebfc853a7f930c4e5321b4451952b3a34acc c237ce82de68b97578b950b80f037dae30475e2b -4fe08e96e9c987edd8b16f4c144adb887d07cdb8 179418940f22a9543821f50eaf54ab6032a46d98 -d69c18c75411f62bb9dfc6302f78bbbccfd7ae15 6f5050325732736f618d1b8f90a69f933c6f36c9 -e9cf2d43e7a01d91bd79e92236fd1ab6786964b5 619e56016fe7ef8af2b10d7a68b86d03c0a7c06f -84a530aaa2f28d2d04e6439519751120e55037e9 8b2f1b684ae6f2f0858d808cab4069ce0363c830 -63f0c048df555bc378c635addf29dd3a659d22f0 90dd838212defc4d3b51095484b0635c46abeb25 -dbee09ffd217f0b5d3d8985c12e73cb0fbaad33c 041f3b0ab9ca46711356157d306faefb08013ec6 -20bc9e7ce719db1c55004a266ebaa93271772794 3303ed8f1724885f9fc85822a8129ffa729268a7 -74bf9d0f0cc39a40049648e6a99df6208944fbbe 6195c0f5dc4c668b5194b67b55503257af24ac8d -101416b7cf2a0a513573d19a75928835958318ae 97b86acc7dc02576ecddeb50eeb6a450fd705576 -0529b00200cc80b43de4346e9c87a9a2a7c1b228 7ebb38ece14eafcd18687994986368204d085f07 -9b7bb61aee7162f2c76ad98a5b6e7276734d2f78 9c8e1c9c85ce505438c3e9acfc8e30bae924a22d -cc4ffbbc6ce4478c8f7b137fc187bad2acc5e1db 023e526edd668b1af0b545a33ea9071328b5ec11 -28ae4585afdd08a31b22cd4e11110d6b238e853d 105ec50ac76fbec4d3f7e2b7895cd6c39c814c78 -2a6384d34386653bdf657f71617e4545a6de8224 c1925521fcc33353259b23cf4b12b2420e8f9711 -a042a88d9781fa55925ee95c5929aaaca0c13ab4 3f8b6a0235e036b03166a728f6e8c28e677ec658 -b876d484c2928abc7a298950ab73b07634fdd0fa f91c3c9e2041a744756d6f83e94a0ada92401f29 -d49219b06dd520ef3f880388e4333c6ba1dd6a43 94f16a4eca916aab3313ca4e0da91af359b99cf8 -831731cf8fd592cf0307430347582e10c0b0c052 2f962915a06fca645c347e37bb118e8c872f1dd1 -f435a434e28a70b0e0251848925d84c97ef2641c 522603211a58e8ca412f2653fe4b35459b971181 -f42405c1eba2143850ef61612790e9b3d1795eba 31c6f2d1869810ba06ee13288e9e19ab16622675 -f2cda03f6af94a7463a531e047890941b167ede6 35bc2ac10344ffc9536e8bc0763e2c4795828cfb -8c2b63ec2ec098c76fcd1efe35e9b42f779e4b9e a3739892e71358a36ee852c676ae473c0020e6ce -a220f2e98d7cef6edbe47705eceea3384c3abd38 ed2e88151476904d8bd0648ca40a4c8a4f7cc1e8 -4ccdf20033aa74506030a0fb8ba305905ac4802c 83679ecbfdb9975bd983ae0d20029278ffca5a89 -df716a3b57cecb601aa45a0ac7867cf95e89e252 a014e674587168959b2b13cfc2684de211221d5d -1bdc528fc1891d6e81bb8f0510c8e3863d4414e8 da1b717000b41b658bd884424f4316942a0adfbf -57d2187464d062b43dd19ac80ed4fcecd5419e18 c3721abd1b5470a49ae5aa03f8d1420a9dd9ff6a -f53f321b6db8586204156946e811c078e8ea75f1 22cdc053c7033bd21437353ec5f3b593cb8f991a -55f7d3bb87e73b9a0fa88391093f0095a67d7628 4422eef3a8a61f8edc3b444a1960b341e179ff5d -39077584821f9a2f0ddb09d25a25a3c763c94d97 3f8845c963b1261203ad4afc70c601a7453b9dcd -2ca840f9f3b94f0eaee74165b8ac50481be9ecdb f636512f1f33aa242e473a7d14673ee463c64d4e -faf719f7e151d109a1325be57ef6e94b2aa972fd c3e39d040e3c5cf218991a4bda20579b73d77c07 -a5cabfbdfb530cf6dc500bd0044188458a7cf979 c8b5cce3e3dd430b31e6b81184c8352aad1c1251 -3f2c715499bd46082c04e3984f511edd38beddbe c1237ccc678983f3ee0e7438624132d204deec62 -527c2d771b868ad7133e8a8486c850020405c693 93e88726da5fbf5f3c708ef636589970d1b94754 -a8a0694c4dcc87e5abff0a7e24a489dd115b5f14 f6ad96042f3f95e41a396ecf7a8b61709c3e5189 -7971928c0eefbb4dfe9dfeaecc4ac4620d8dea22 fa309a95c774ecf8c0adce804fa968c38299a92e -a8192cfe9ede4bb14fe007f109d86cb7ccaab050 8988a0bd52d08c9c959229a06e8eda998a1b5a68 -8060832cac58cb3cf89d8e5ebbd902bdb0d06e9a bf13b98feb5d2127f6cd4159a3e9262c00040e42 -134bafb91cb25356a10332f98347215d4cf32d66 be7fa7d209c4e051e690366cab038380f7a90373 -f499b6baaed1f8761154bfafc5c136190db0ce40 1fd7213243ad27dbed3ba0483de6dd9dff49541c -7582aa605bc32da2d917c4d488adfe4d1a565be2 2d680cc599024d29eec7983e85f2da218111811e -ca93da2c3507a521b5da7ba896cbeb3a5470325b f4f9e166aadd83126af1407c4a1ba40430447cb4 -8a5ad14eb96416c14f9976c07284c2f85d11998f ff4ad92fd4a123ecf82257a2140309c03b231bdd -8ba389b0c521ade89aea1a5fb934e86b29ad72dd 6fbb84fd4e4b4a152f3893d746d8e58897764fba -db6fecb2c7fab9ddc51e085aa66c2617c72b4d34 8ff0b77bda35695556ec0dd69b8e1bcc03a02fea -da06a5e6b81ced2c0062ece37de7b9ae3bae8ed5 2079cf118654b5fefbda86b22543a58825dd94ed -ef797671dfe7d0ce9d94920e0c84eba816d85535 ec3810c4fefbccc9bba8ac0d5244714862df663c -18389460b8ce3e1a47835007caeb09e20a97b29d 8ad7214f8e2c2e460d62997a857adeaaf1256c96 -6a9762e8696efd624910340bced1bc0a2d28ada5 aff2a8ae4a4f845dff7edba12ac56153ec090b23 -38f9eb40ca0ab9b47d9a2ec146d1d78b6cde779c 7c6921df4ea328fe7cae0f2ee0cbb307c1613026 -41c245ca9f616a92cf5f63b71a851ad107fb8e23 3d00ea85e9d0951ff41b0061cafdbf0a31da6e2e -9f045e017b71908ad283685595eea3be9080422e f0490a934478b63bef9ad00cba88dcb4977b5eee -3d9d7893c2f7e302e20a2cab3e57f1ef7980e76f 78c9bd33c76303345ff7f93661d957ee9f81edc1 -f4e58dfafd6eb931a50455b9aeac6cdc11be4d2d a20cd610135d9d7b4e1330d7837bccdd312c5d74 -e441fba2413f135f173db8f0d25c29381b0924ad 984bc03a3053a7ad0b8657495ac40cd7244d9994 -677ee10c0e6f0145ce17eb38c67d09f3307d68d3 29ebd529bdb98f15a9e584a410ab755f474b371e -9b9e2c0de51567d0a1a580ea576c7bdbbf2b60b3 b07cfd139f9484e1ae4ccebd25108ff6b1bdefc1 -648481ab042b5aa740a9fed07e4a0d50ee419b81 1b39a9e9c23268036f622de4e4cff4f729359147 -dbf32387d736ef124d32f54badd30360c19d7609 88beb896ee0d42059a65c31215e223ef5f8aa74e -568e1a52594dc6640c2721fa7d246be027fdc788 6b6395450a0e2b0215fc86bbbfc23d04dac85d2f -56163c91998a880942ded9c8ec2fc401d6877827 c564b1f6f18a04fe868f9e391f6b34ed1a91a1f2 -edc0a5783d180ad3b869369bed4d31ffb63703c1 06c6b8b0353fb314385818490c38cd6cb2dd7402 -e9be190c3550e6ef909c9fee189324384b4d6aa6 2884985cb00abb7c7c4fe1dc7da4eaf45bb4470a -0a425fd5e4c52dc3311a8d95edd1bd31e5278fd4 0762fb63244534291be0a162fcf7e9a013bcebb8 -df22c1384989abb0277cf77c39e1e3bec88d2d90 477be83e06dab41dece5957882c07893eb417b2a -1e44948dfb2b58dbdf872c436a316c5a11c5bf31 b7038f907b53e8f1a49eff446e3cc30071248437 -c1e26c7582dc8e64cc0315591559003bc3833843 f421dd559c6d0cb9d0c11168458e8009a1f2617f -aa960f15b5f9514a40dc76f1431a41b2ac0dcbb2 28e4a47a717d084a37de5f3bcc83da9c2322225a -b188104470bdf29b4667915aa53bffa91d02640f f97b2b3208c8898896b0a79ed086b8e99874e127 -7a2028898d4b5926ad659c40158ff6f6ea4f6c6c bd7dae9da36ceae8f9c524d2e47e7546f261b1c3 -6fb97e84e740d85593341b4ada1116f2fb78f2b9 ce30c269a727e08941c362f3cb411d5d68770c3a -948d32f17576ff45fa8b98896be342fee2b7c78a 58bbc559f8ad56dc4b7d852d4c794f450eece3c2 -9a3cf3be2add953176ce48cb9297d83c059e0f1d ae6d32afd24e2e6d7d27b2271ba4e7f06b09c032 -3ed9aa57d076d3e75f22cf4c58c5cd7f049812e8 5659ccb54f8cfe29524d75ba6f98ceefc237f668 -43531283f95b58a52df4e956bcf79c73ce3c4dbf a2248bbde981ec15eb7fd5c6baf842659b5344b0 -875fe9958cd1eab3bfd04fbf6e7cdf98e4b93c95 9203a9cb7c187567003b29df0e1746ec2b7cf67d -3065be5fc6ec0c2dae75301b61a6879fc90ffc76 9fbe9505ea6269eaa74bd1dd15fdb0ebce6352dd -20da6b16f0bbf2fd38fd3628db9d6181a9663cad 7122ae2100d59643da34faab6a3a03c6572f077d -a083f42cc2d2bc6617eaa0f3efa87b7aa902e19d 1409d1cb14a60d6ce1c9ac61c984ce41bc6dec73 -a5d583f8ad40c6e86332738741510c1aee10c5b7 52551fb86d5014ece909864e0f4ee1b4da2dc0cf -bac5d9e255ea89defda2a4a98c7fcbdad5254f37 e0b12415d7cd05db5d504500a3b6c16e1a7f61ed -ff85446dd5a83eac7d4233844ac0b165256c3874 80714fec0a7a6c0bfc314c85cad4acbaba9cfd16 -dc38c42a2f930870c05c0f128c7d77cdbba061d3 8a62ed491e18537961b8e9f4b97a6cb907badad4 -06282f2f19abe9a1adb10ea67ff0dd6340691a8a e3d63fc7b452df24ebbcb2a0ccc8d115db370b16 -930d8e4e053c42dd2cc07d963dbc0f52be38d104 a48b8486bff7af5348e011df67bef11e706b50ff -fdf5a0fed80618b515d00a5294a27e0383b08cc4 373c41fbe55326d919f4342e55c78a5d147f6cce -433fd00c24f19bd660c68f0b9fa4cfdaba4e50c1 90ec4f5b1002a264e2bdc69735fba5a621bca9af -ea6ca0774b022f69a2b0467ce17b5281f5ca0889 fd2996bfd962fb9971f58c68dc9ea98a8149f001 -1d908dbb0a86638a8599e3806909de3fcd60d74d c28641177eab5bac1e104a2c6d7370b047517b24 -f2755e1dfdf58f5ea20786310854e45ee0a2c419 5432711cb7a7fc0b226ad82348226c5e3358c863 -70354b3604d03cf3b240c445d271f2fe64c982dc 0000000000000000000000000000000000000000 -4063ff2cb5e9eeb2d00a4e28ccdddeee78287e3b 92571fab303cc32fa05ee3386b4c63295931cc1e -80a8aa28cde1c0d5b70c90cb6c0baa9cc88d270a 91999b120f2f50cc2dcb670dc511c7e15068a79a -65550c433aa75e3c0d0ab87aa85968dba30584ea ade654da7eaacfeb86fdda113b19f0278dbdddec -e40119642e8911f60945a03226d667a2404b355c 2cc9d4be6abedb7309694100c7ebd0561079a816 -ff2f7a315029d0b3ebda4c27018fcc8057bcbd9b a307c8ca4e567505852a766a59612c82d88aaf68 -ffc5ac089f78411457f54c6790e69d8312c7cd33 411c1f3e9e74f59f3538db8c7db9efab3fe22966 -88ba8c136a10ad4809e0650e87774057134b2b0b 7ac6b014ac7a4e2726fec3e83975b39472e4c182 -4eec0b9b8f59751e952163330f7b8c8324cac064 7d85959bdb178e73744b35b7b497c13fb723f0ae -cab40bd785024a1409c5101e31645c6581a7aa3e cb67754cfcee78b4bd11fa85d7293ea270c428f4 -b60b35a67e3d6b12c6cf15fb8022d06a27911e36 aa9054cff8ff37b3a71bea907c0b51fe401b39bd -fb924ed336f28c44493e21a2502acff0b3d9dbb7 85735a573989f01bac9b6fe2768749bc5b6fc660 -76f874817cd69bf3101637637114247e2f692815 9868278fb4455e3fb0911c3d40340e10868615cb -73ca7de98fee9b5f082f416d688bbb1fd353ba0d f16c0245f58d6f4ef0005275f4c2776c70c8363d -2356f54838d712b81f14c7cc676fa03245d3002a 488419afc80c37f1311d91e2300a3fdf2b2d0555 -2a59604fc4af2644a4bcbca46aaca96c2e32c316 23c761c7be8ecf181dd6d4bde47f08f54e89afd5 -55830989f8ca8c66b7905a977173e50d0b9ffe9e ed5ce4959c6d460dee8a37459949a29c8a7cb4c3 -b12e260f80c394543cf48f601e36ef1ac1894553 efa0bdbd2f96a89840400010c788bdd53105b0b0 -cc984c54ac05a15505e9b7dc550190fa2fcb9144 1e50d5990a4e46b8ce8b3c0468a809d5910a312c -633cd931f753f02054851c2db7f0f7163a98c32e 33d34bbfa43644d8979f11a0fa21779d29047a9f -5be3771194a596dc1ac86b205c68d9cd54b1ede6 8056fd6284f0d2c9984f1f19e5690dc6cfb9b1e8 -1991d69560f976366244cecbe8867267b25e10c7 93f120a7c3dea8f7624e144fe014e4825a07bf37 -276eba7e8e0caf6512a8fe16e7d34e5fe7dc2456 071ff6051e34c67079892f6b44f2cce601cfb56f -c9a2a93a001b35ac1e58aeb75398f60b9b83b9a6 d904a86eeb54953caef02a6238ff9284d5d3ac88 -55ee543a4fe7a2d6ce46226901549f327b6ccda9 51205a3e07eeecb21e9db3041264cd692dbed6d8 -36bfdc0afdd8932376334bb1f0bf024d62e644fa bcf449e94effae13b6b5a0e07d7911bf717e9d40 -ba0ca394550578038b32482e3c4c5196f2cbfb58 d9820919d2b984e8bf79d5fc8e810ff843dc84e3 -4b4a9b8bfc154a4aeddc7e5707e46eb83fa00d46 9f15bbf18e04687e650424ed76d80b5d285e6b0b -3d6253a39b8f26772d3299a414f99a461a026962 32769cc41d31a45386abcc230f21e7b168c603eb -9f331e99a746f9d1d70463ce397ad0a9ab825400 be392ab9b968d7a7880d4ffbf1a1df7775610797 -7de2a7088e8becd3555511960e2c4562518423bf 7058d2f7d15d151ecc74efb2724609520a658e11 -dd6a22625873272c3c92a104f505d2653303694d 54ae1543e99a420450178617f81b2c56b6f38e73 -3b2c81a33cdfb4e2f89a951692fd5adfbd7b6045 c31a1e9333b8875a654b5ecdcdbff2c6a67e2d3e -2503a048e5ccbd11529050a8267eb8e865ea24bd cd27bddd41b7021aa42186baa17879c98d60bc59 -b27118d3100e09bce80e193a4a409458359625b6 f84b6b20bea450ef54e596418313ff5d76428f73 -44b8baf593721067977f33dde8d639f7a5b9b818 a19861c678d8868700c1a0aa8ecf8c526adbd007 -0abeada2004807c4fac713e322b7d820b4628f8f 7b6c82986ac00fadee844ac8112ff167178930c2 -7a69b2265bbb2b28991fa1c46bffbcacc82db474 7daaf9ba1dfd292ec1951cedf992821d60fb564a -08026271d68cc5d4333268e692869f080d808b38 11264cfc18e2c548358d59cb6d21ebada75cc04c -f7c957ea13f4a63578aa5e21891225bbcc0a601f aa0a97f4722bc6ec09571a687c89f333f5de9fab -25700cd2ee622d4fecbc60b0e38e065becf4e34a 7dd41d076d97659c67e809dc7f60fbd5ff6b2cf2 -5bb211d48bac81014bc892249da8b564c13c1fbb 38e89c6462126d3a45ff2e06a115f62ba664184a -8c668bebefced0b7192e2865deee6cc0cdd62b4c ad547fd7736e4085e79fae3cb134f2104ffdc047 -e50e4d99e649cec9a4ba838ae398741949dd3ce0 7322bd773094cd457b8a3fed3b054f54041fd0d1 -dc12f9527434635b0f0d0c27b91851e36702f59f 0ff716cda5001f430d80e7b202ec2c94009984d9 -2c6646fe468b2f7725c4a351798badd573c6e551 3dd1e6008c175ca87930cffa8d5212a409dc8166 -763747242273be7e95cde03e21d21e57a79f8b49 6b22eaf4576221e65a275c679af0c85cc88217ec -e709b26803d5e2afe833f63bf99f770ef39e3a94 3bad79bcc19cb716bc7ab737399a8f3920a3a875 -9dc8e962928a54a73ab98ff02594feb9a76563e4 7c906b3612ef224aa5bc3b0f5da26c07d3eb7164 -664021f5bd10b66346ef0dd866b6e17eacfce7e8 86dd7ed7eb86f9e3a774ffb5330a1230396d025b -1e84722865eb9152e9f96143a17bda6cbc847aeb 204946652521c1478572487ed4c5576793a1847e -a34d6fad7cf527a86cf43d604d820526fa7886fe 2897fce2d8c8b79abd5b3c4f8a061fa82f6e1434 -a61de67e992cd2be734f517f6bca7797c9a33aa1 24bb35a4c5a87e068b5f9ec1cb5b8474233cb12a -02a107a3ed07d289788605f9c1620f35ba94aa8c e61cea5a23f1904c42ce87474c95bdd3d6db2bf5 -510988196e95dafbe2525142cd6343040a9de66c 1c182530cb9592d182b27e498b9e28ad4692aeab -ce5740f4a9bfdc33b727777cf51b909904dbc996 fb3d603378c86db3ff9c70197b58692e8197286a -11d24baf703d82117dd2370a8e0758c38f5ad54f edc91053607a58b3c28a23e835c96aa4efd67ac4 -10d8727d0a8ba639e73237543aa33b8be3faf80a 38a90a645e8d0345dbd6bdbecf77fec475bd7cd8 -7fd54637300c44b208f06012f2acc7354f75762e a3b27e9a15a0d3692abfa797f0ffa7969736c915 -dcf444f207eda44addcac8be583bebfc1c66c866 a9c939177491271569ae026961819c0443aa285e -0be63613a1977897325c60341265ae8f0ea7ac4b 627ca102367e819beb27071b6d17eaf7bf548f67 -4005dfd0f993ded0e97c52989546a300c77f1000 4d532cc84e30305f2f39ebf05b5712a8c242e8a0 -43bff6117910b5ba33edf2498fb63d83105b76c7 8017f8cdc876335894cae3be9f396bf69f63b07b -146bf2065c484718a3141157a2d65374a3aac9be b09bc070f8c8fc6f2f23133ea16acf1e0993704f -19311adacd9b0c89aca46a61279eba220ef742b2 90fe613d1005b4d2d1ca8b8f8cdb559575949fcf -6100cd7abf2fefb3f29bcb5249679361d7a7341f 220f34f71d8617e3f60857e8fe8f0f03ecbfcb07 -78797e3a889845eb62d5fb909748d47f656d79fa 11011a989d9ad446a5711d2b1ccd6551933286ff -856d9cef13ff6c6187e5df1e8cfca2228082ec81 f868257cb509b95b53634fbd4089e58e1853465d -ab5b38dc5957001a58d68bbb3e9ecfb140ada300 eacbda3f14116404b59690d15017e24ec04ee165 -9d1438ae20f07bcd1a895bbe0ba17fd9c31e4f23 4b2258bc3096ab74ab82badc28f09be778d3d9a4 -db705581ca7683d34d56f55b9625a630e1a822dc 8d2f9affe3e391f7c40944250bffb8fe7396a7d6 -6d1b76305f3ef995aa3bf5b84db0528a5cc4d262 b3b96239074728d7ff9580208c39256e7b3f41cb -fec5b00e1ada260b8599dfd054881d803cbc53c6 86930e357c954465326d87564c2a23458ec4840d -74299d453e9c547c8b022506b3c8b773794fd06d b5ac9f0215bd7f2718ea19a478874969c0c977b4 -b8d9d4e3c2ac48abc6d5414995b1a3b575093981 c1b46344145c316b16993ca24bcbb1765c8604ed -5c845346428c9368c5bddaa9992f9f1822923eb1 fc14bb1a2922eebf95d334e73ec4062c468b53be -40cc9f219127cf3096123bfbbd03731dd09026a7 632206564c20d2eae2984bd43d905307c60ef7c2 -b0ff15ae59e61fd2713c6799c05e4971c6815552 382422ae33d49add3f7084571527bcc4bae1215a -e8618262ebad9d2f3dd67f1ee784391c67eee003 d1d8dfa9b73026c9e259cb36373fbd427c58959f -5d5cacdd654179d66e8d09c7aaeaab0e4badc0b3 0f547a3449a745fdb30b41630d47cd8ac397a58c -714674de6a7c4656b813acdff40a34433b70d53d 9344bf2ef90a100a5ebcba275d59746396f210b7 -bc5162b311af4af8a0dacf2f70234b5021546c46 3ebce2c468ef985cd96e0cab7fd47e85dc2692da -6a544384c30ee6d9230cbfec655eed6b4eab6ff4 556e62b7252fee69a7497649f6d8b4c535e22ffa -e81b5e250c28970cd53c563daffecee5ed7d8d40 b1811061c7f02e0b83f35d4e3ecfa74c0fd123a7 -229475af3c3ec21b81c2bbad3febccdaa69a40db a2f30cd83a526ce6fbd6fe2cf7f3d6c2b7e2ef91 -a5731191ff4cdc6312a291b182c2fa5dd76895fa 3e6e13a2b368be43baca0506e80daa8957dd98d8 -2d9717ba54b0a587b898bc5fd3dc1f3a67502f94 05fad328024c08ed53fd9178d43e732a5b6c1ab9 -bde163681e3be64873453660c86552144f2d6fda a5c98c0a5f9ebb5b02cf75e8a17947187988d54a -a7a0f97b7659a1b551aa4b465376abb0c0a6492e 0af45ae66377f9e73c5d78713e849b34b9a23dcd -98d9bd4b3d4d244cc6c14dd0c4f598e815bd9f8e 448f6d87d8f1b8fee205786d6dc19400ccc75755 -d046bca778222531da3afd3309813cd0f71a3383 ea9bccd95a9e38d421fe6efc50a98afd08a6b7ba -f3c30529291db71fe865558ef63d571938b6c061 5fd1e5398f32e4bfaa436877c2cb0d4729aa3e57 -c2f9aa58b06192bd71fe16ae49a4aba3f1dd0c5d a5833abc9d6e4a732f0ae615493637120afec982 -0a0220e7a79972805ddf6318b1024b2f105b2395 f010b2dca377b6fc44bb0b19386055e3441a6eff -d82a562c268235e37817e72502813a058ecd4c4f 0a4f9e43f30e4f7af4e97d2d5e673ff50b396513 -b8ff2ed253abab8a8a6f72fe0917acc35f60322a f2ccfb98c8d228466633e9e7eb16252a9092a29f -df41f4ceb08b43997cc9de842424c58b8dc55c82 1473937bc41abc9b823f0feac502afa6c95666c6 -cc6e5cda57e677127fd626bd7c130651bc389208 2e6d305fd3dfdaaccf7ef1931a9f47168ffe40ae -45d7866f227d71e7353ba4935e6dee55a32fb2fc 1026388ede211133326ecba542955883dcccd7bc -0fba69615fc01222e6db083f3672b9c02aefa3e6 30c4c41b03318a987c90966384d833ff16116484 -c23e80ceda9d35624e410ae26308afa76bb4eca0 7f6f5bcfc96aaa576518be50acfbf35d2507cfd8 -751cf02f2b8c27a0eccf31b012d0b1d9df37457a 412e53bf8161d114403d7c23b19e448bf6dc66b7 -d9854919cfb84a0e2bae5a7fce361885335a69cf 183af30464e84efbf65e4d6f90c6ecf115f73dcb -9603d626daaa1e6aa999793fd242299fa6c39cb0 7c736667ae048388e748dcadf2713113f1cbbe73 -e328ca65eee52abaa8ef378bce9859081304e367 a635cb98f8425e5898761891fff53f90d4e46df1 -591dba1c2b6477387f52418d9a9fccd883a8291a 6393a4ba653e82579223d0311eb0d81875ccea30 -a85a25bd4ebf35b2459990204aa0186957406974 f75545023d5587ced3c23d6d356874227da0dd31 -2d657ccf286a897d7c75a6438eeffc47c9df4093 505836f4bd9b17ced710a20bf7888902564840a4 -5448a8b7b6eb09e44d108dda4711d7e5f09f261a a154d81ae6849511780a68fdfee5ff48521643d0 -30a2090c5f4ea7be268e3e546fea495335ec355b 07af378cb2bd19599dd0ada2ecce407afcad7e69 -9c0ceccd133bd22046f00c3c7790ceacb0d2547c ed1ae1a2cae3515f2ba3d23004f7f37c83dffc1f -e30d3e66d6660771e34e66eadede9b00ff1810ed af0a68f9ca4cbac0575740f9b46dfd4f68067415 -69d75bb85630acfa30e1876b8a8892de2e919099 0d6416d1f916f871eeee6ffd8ed872d89a212999 -b2fd4a833b8b46bf5b330da0e39ee6f53ae1b888 984d126f02eb67558d2864af278dbc3b8b9d0a68 -802adac0a24d308ad7f2263b7a7726511ef4f273 55e153161c0e53c531012305ecba91d7f54586a7 -1c4f29377bb2220b4314b856f0b47cd990599cb2 c7e9e7efd0af9ce29a1fcd405ea3486d000eb994 -9178d6e1ba3e31a390e86813727e0d787653d292 181ed9aa17cf4300558e886149c8bd385b95228e -7cc91ba9cb1fa289d32de8313790fa127e3c8703 f241344a5b3b75079d2c50bd11f434916d661a55 -2fba7574c9ceb16c9e7e65d85aa6392c5d87e888 220d0dc3e390dee14be31cbbd881080061e46bdd -a2b57a192a777e7e0571812712785edfef25fbf1 ed1f65a3b46e85de94d0d6d55b1a3a62d1593a8a -84ea8857ff30fcd5762e2712a115d130e9ab1c18 a197b5243eb08e71fae4f792ce38bb06e4151a39 -880a910c15829e02ee0ba1a2f6cd866a05469163 7b29601068061170cb535b0ab978de86f4c782b8 -e7ccce7c203a0cc8851f1f1860d0daface3ea0a3 63c35f400602f60468f5b6a880ce0f2774a5162b -b1bd8e40362d5d766d2bfce8da1d34f60f1ce942 5832a7ab1ff74e34abd125d7f605148b1805a3b3 -fe59a6f179b5166215247701410dc42ff9a8c25f 86ccb4635e64f53bfc5b7160270a0179576ebe69 diff --git a/docs/tex-works.md b/docs/tex-works.md deleted file mode 100644 index fc450281..00000000 --- a/docs/tex-works.md +++ /dev/null @@ -1,33 +0,0 @@ -# Work with TeX - -Loser-Homework 用 TeX 格式编写了部分文档。 - -学会与 TeX 共事是很重要的技能,TeX 文档是 Loser-Homework 的重要组成部分,学会使用 TeX 并参与贡献能够为建设卢瑟帝国做出伟大的贡献。 - -## Standards - -Loser-Homework 的 TeX 采用 LaTeX 变体,ctex 宏包提供中文排版支持。 - -使用 xelatex 编译器前端是最标准的做法,但理论上也可以使用 pdflatex 等前端编译文档。 - -文档使用了一些额外的宏包,这些包在 TeXLive 中的名称存储在 `/.github/tl_packages` 中。 - -Loser-Homework 建议使用 latexmk 自动化构建流程。 - -此外,要编译整个 Loser-Homework 的文档,可以很方便地使用 CMake 来完成。 - -## CMake & TeX - -Loser-Homework 的 CMake 首要为 CI 服务,其次也为贡献者和用户提供便利。 - -为了提供对 TeX 的 CI,Loser-Homework 采用 CMake 以方便地编译 TeX 文档并导出结果。 - -对 TeX 提供支持的 CMake 文件使用 [FindLatexmk](https://github.com/kprussing/FindLatexmk)。 - -要启用 Loser-Homework 的 CMake 对 TeX 的支持,请在 configure 时添加 `-DBUILD_DOCS=true` 命令行参数。 - -CMake 会要求 Latexmk 和 XeTeX。请确保它们能被 CMake 找到。 - -## Getting started - -见 [#270](https://github.com/Mq-b/Loser-HomeWork/discussions/270)。 diff --git a/image/Visual Studio.svg b/image/Visual Studio.svg deleted file mode 100644 index 4e7377f9..00000000 --- a/image/Visual Studio.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/image/gh-add-file.webp b/image/gh-add-file.webp deleted file mode 100644 index 8f1f3984..00000000 Binary files a/image/gh-add-file.webp and /dev/null differ diff --git a/image/pr/01.png b/image/pr/01.png deleted file mode 100644 index e8aac7eb..00000000 Binary files a/image/pr/01.png and /dev/null differ diff --git a/image/pr/02.png b/image/pr/02.png deleted file mode 100644 index 7fa9b025..00000000 Binary files a/image/pr/02.png and /dev/null differ diff --git a/image/pr/03.png b/image/pr/03.png deleted file mode 100644 index 5364eabf..00000000 Binary files a/image/pr/03.png and /dev/null differ diff --git a/image/pr/04.png b/image/pr/04.png deleted file mode 100644 index b003f880..00000000 Binary files a/image/pr/04.png and /dev/null differ diff --git a/image/pr/05.png b/image/pr/05.png deleted file mode 100644 index 22883a45..00000000 Binary files a/image/pr/05.png and /dev/null differ diff --git a/image/pr/06.png b/image/pr/06.png deleted file mode 100644 index 1dbfd7fa..00000000 Binary files a/image/pr/06.png and /dev/null differ diff --git a/image/pr/07.png b/image/pr/07.png deleted file mode 100644 index 5aff5017..00000000 Binary files a/image/pr/07.png and /dev/null differ diff --git a/image/pr/08.png b/image/pr/08.png deleted file mode 100644 index d6c1602e..00000000 Binary files a/image/pr/08.png and /dev/null differ diff --git a/image/pr/09.png b/image/pr/09.png deleted file mode 100644 index 5d3461f0..00000000 Binary files a/image/pr/09.png and /dev/null differ diff --git a/image/pr/10.png b/image/pr/10.png deleted file mode 100644 index 9272dfe4..00000000 Binary files a/image/pr/10.png and /dev/null differ diff --git a/image/pr/11.png b/image/pr/11.png deleted file mode 100644 index a192e1b9..00000000 Binary files a/image/pr/11.png and /dev/null differ diff --git a/image/pr/12.png b/image/pr/12.png deleted file mode 100644 index 484b5331..00000000 Binary files a/image/pr/12.png and /dev/null differ diff --git a/image/pr/13.png b/image/pr/13.png deleted file mode 100644 index dfa5ce0d..00000000 Binary files a/image/pr/13.png and /dev/null differ diff --git a/image/pr/14.png b/image/pr/14.png deleted file mode 100644 index cc07913e..00000000 Binary files a/image/pr/14.png and /dev/null differ diff --git a/image/pr/15.png b/image/pr/15.png deleted file mode 100644 index dfd50432..00000000 Binary files a/image/pr/15.png and /dev/null differ diff --git a/image/pr/16.png b/image/pr/16.png deleted file mode 100644 index 9936f960..00000000 Binary files a/image/pr/16.png and /dev/null differ diff --git a/image/pr/17.png b/image/pr/17.png deleted file mode 100644 index 5c2cbcf9..00000000 Binary files a/image/pr/17.png and /dev/null differ diff --git a/image/pr/18.png b/image/pr/18.png deleted file mode 100644 index 8ae5d75f..00000000 Binary files a/image/pr/18.png and /dev/null differ diff --git a/image/pr/19.png b/image/pr/19.png deleted file mode 100644 index 774c187e..00000000 Binary files a/image/pr/19.png and /dev/null differ diff --git a/image/pr/20.png b/image/pr/20.png deleted file mode 100644 index ad0ca56d..00000000 Binary files a/image/pr/20.png and /dev/null differ diff --git a/image/pr/21.png b/image/pr/21.png deleted file mode 100644 index 90abad95..00000000 Binary files a/image/pr/21.png and /dev/null differ diff --git a/image/pr/22.png b/image/pr/22.png deleted file mode 100644 index bba1e6e3..00000000 Binary files a/image/pr/22.png and /dev/null differ diff --git a/image/pr/23.png b/image/pr/23.png deleted file mode 100644 index 6f9c4bb3..00000000 Binary files a/image/pr/23.png and /dev/null differ diff --git a/image/vscode.svg b/image/vscode.svg deleted file mode 100644 index aa38d84a..00000000 --- a/image/vscode.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..f58df3c4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1623 @@ +{ + "name": "Loser-HomeWork", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "markdown-it-footnote": "^4.0.0" + }, + "devDependencies": { + "vitepress": "^1.0.2" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.23.2.tgz", + "integrity": "sha512-PvRQdCmtiU22dw9ZcTJkrVKgNBVAxKgD0/cfiqyxhA5+PHzA2WDt6jOmZ9QASkeM2BpyzClJb/Wr1yt2/t78Kw==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.23.2" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.23.2.tgz", + "integrity": "sha512-OUK/6mqr6CQWxzl/QY0/mwhlGvS6fMtvEPyn/7AHUx96NjqDA4X4+Ju7aXFQKh+m3jW9VPB0B9xvEQgyAnRPNw==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.23.2.tgz", + "integrity": "sha512-rfbi/SnhEa3MmlqQvgYz/9NNJ156NkU6xFxjbxBtLWnHbpj+qnlMoKd+amoiacHRITpajg6zYbLM9dnaD3Bczw==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.23.2" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.23.2.tgz", + "integrity": "sha512-VbrOCLIN/5I7iIdskSoSw3uOUPF516k4SjDD4Qz3BFwa3of7D9A0lzBMAvQEJJEPHWdVraBJlGgdJq/ttmquJQ==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/transporter": "4.23.2" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.23.2.tgz", + "integrity": "sha512-lLj7irsAztGhMoEx/SwKd1cwLY6Daf1Q5f2AOsZacpppSvuFvuBrmkzT7pap1OD/OePjLKxicJS8wNA0+zKtuw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.23.2.tgz", + "integrity": "sha512-Q2K1FRJBern8kIfZ0EqPvUr3V29ICxCm/q42zInV+VJRjldAD9oTsMGwqUQ26GFMdFYmqkEfCbY4VGAiQhh22g==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.23.2.tgz", + "integrity": "sha512-vwPsgnCGhUcHhhQG5IM27z8q7dWrN9itjdvgA6uKf2e9r7vB+WXt4OocK0CeoYQt3OGEAExryzsB8DWqdMK5wg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.23.2.tgz", + "integrity": "sha512-CxSB29OVGSE7l/iyoHvamMonzq7Ev8lnk/OkzleODZ1iBcCs3JC/XgTIKzN/4RSTrJ9QybsnlrN/bYCGufo7qw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/transporter": "4.23.2" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.23.2.tgz", + "integrity": "sha512-jGM49Q7626cXZ7qRAWXn0jDlzvoA1FvN4rKTi1g0hxKsTTSReyYk0i1ADWjChDPl3Q+nSDhJuosM2bBUAay7xw==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.23.2.tgz", + "integrity": "sha512-oo+lnxxEmlhTBTFZ3fGz1O8PJ+G+8FiAoMY2Qo3Q4w23xocQev6KqDTA1JQAGPDxAewNA2VBwWOsVXeXFjrI/Q==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.23.2" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.23.2.tgz", + "integrity": "sha512-Q75CjnzRCDzgIlgWfPnkLtrfF4t82JCirhalXkSSwe/c1GH5pWh4xUyDOR3KTMo+YxxX3zTlrL/FjHmUJEWEcg==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.23.2.tgz", + "integrity": "sha512-TO9wLlp8+rvW9LnIfyHsu8mNAMYrqNdQ0oLF6eTWFxXfxG3k8F/Bh7nFYGk2rFAYty4Fw4XUtrv/YjeNDtM5og==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.23.2" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.23.2.tgz", + "integrity": "sha512-3EfpBS0Hri0lGDB5H/BocLt7Vkop0bTTLVUBB844HH6tVycwShmsV6bDR7yXbQvFP1uNpgePRD3cdBCjeHmk6Q==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.23.2.tgz", + "integrity": "sha512-SVzgkZM/malo+2SB0NWDXpnT7nO5IZwuDTaaH6SjLeOHcya1o56LSWXk+3F3rNLz2GVH+I/rpYKiqmHhSOjerw==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.23.2" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.23.2.tgz", + "integrity": "sha512-GY3aGKBy+8AK4vZh8sfkatDciDVKad5rTY2S10Aefyjh7e7UGBP4zigf42qVXwU8VOPwi7l/L7OACGMOFcjB0Q==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/requester-common": "4.23.2" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.6.0.tgz", + "integrity": "sha512-QujhqINEElrkIfKwyyyTfbsfMAYCkylInLYMRqHy7PHc8xTBQCow73tlo/Kc7oIwBrCLf0P3YhjlOeV4v8hevQ==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.6.0", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.0", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", + "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", + "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", + "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", + "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", + "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", + "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", + "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", + "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", + "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", + "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", + "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", + "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", + "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", + "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", + "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.2.3.tgz", + "integrity": "sha512-SM+aiQVaEK2P53dEcsvhq9+LJPr0rzwezHbMQhHaSrPN4OlOB4vp1qTdhVEKfMg6atdq8s9ZotWW/CSCzWftwg==", + "dev": true + }, + "node_modules/@shikijs/transformers": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.2.3.tgz", + "integrity": "sha512-7m63LXtBW9feqH4+dafLe92oXm/vs05e6qaN1w5/Byozaf+RCqzOj3/b2/wu7OzTgLe3O9PzIrO3FebkGJK26g==", + "dev": true, + "dependencies": { + "shiki": "1.2.3" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/linkify-it": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.5.tgz", + "integrity": "sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==", + "dev": true + }, + "node_modules/@types/markdown-it": { + "version": "13.0.7", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-13.0.7.tgz", + "integrity": "sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==", + "dev": true, + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.5.tgz", + "integrity": "sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.0.25.tgz", + "integrity": "sha512-fL6DlRp4MSXCLYcqYvKU7QhQZWE3Hfu7X8pC25BS74coJi7uJeSWs4tmrITcwFihNmC9S5GPiffkMdckkeWjzg==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.0.25" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.0.25.tgz", + "integrity": "sha512-wbLkSnOTsKHPb1mB9koFHUoSAF8Dp6Ii/ocR2+DeXFY4oKqIjCeJb/4Lihk4rgqEhCy1WwxLfTgNDo83VvDYkQ==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.0.25", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.0.25.tgz", + "integrity": "sha512-5+XYhcHSXuJSguYnNwL6/e6VTmXwCfryWQOkffh9ZU2zMByybqqqBrMWqvBkqTmMFCjPdzulo66xXbVbwLaElQ==", + "dev": true, + "dependencies": { + "rfdc": "^1.3.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "dev": true, + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "dev": true, + "dependencies": { + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", + "dev": true, + "dependencies": { + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.23.2.tgz", + "integrity": "sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.23.2", + "@algolia/cache-common": "4.23.2", + "@algolia/cache-in-memory": "4.23.2", + "@algolia/client-account": "4.23.2", + "@algolia/client-analytics": "4.23.2", + "@algolia/client-common": "4.23.2", + "@algolia/client-personalization": "4.23.2", + "@algolia/client-search": "4.23.2", + "@algolia/logger-common": "4.23.2", + "@algolia/logger-console": "4.23.2", + "@algolia/recommend": "4.23.2", + "@algolia/requester-browser-xhr": "4.23.2", + "@algolia/requester-common": "4.23.2", + "@algolia/requester-node-http": "4.23.2", + "@algolia/transporter": "4.23.2" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "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/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/markdown-it-footnote": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-4.0.0.tgz", + "integrity": "sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==" + }, + "node_modules/minisearch": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.3.0.tgz", + "integrity": "sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==", + "dev": true + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.20.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.20.1.tgz", + "integrity": "sha512-JIFjgFg9B2qnOoGiYMVBtrcFxHqn+dNXbq76bVmcaHYJFYR4lW67AOcXgAYQQTDYXDOg/kTZrKPNCdRgJ2UJmw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", + "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.2", + "@rollup/rollup-android-arm64": "4.13.2", + "@rollup/rollup-darwin-arm64": "4.13.2", + "@rollup/rollup-darwin-x64": "4.13.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", + "@rollup/rollup-linux-arm64-gnu": "4.13.2", + "@rollup/rollup-linux-arm64-musl": "4.13.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", + "@rollup/rollup-linux-riscv64-gnu": "4.13.2", + "@rollup/rollup-linux-s390x-gnu": "4.13.2", + "@rollup/rollup-linux-x64-gnu": "4.13.2", + "@rollup/rollup-linux-x64-musl": "4.13.2", + "@rollup/rollup-win32-arm64-msvc": "4.13.2", + "@rollup/rollup-win32-ia32-msvc": "4.13.2", + "@rollup/rollup-win32-x64-msvc": "4.13.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "dev": true, + "peer": true + }, + "node_modules/shiki": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.2.3.tgz", + "integrity": "sha512-+v7lO5cJMeV2N2ySK4l+51YX3wTh5I49SLjAOs1ch1DbUfeEytU1Ac9KaZPoZJCVBGycDZ09OBQN5nbcPFc5FQ==", + "dev": true, + "dependencies": { + "@shikijs/core": "1.2.3" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/vite": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz", + "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.2.tgz", + "integrity": "sha512-bEj9yTEdWyewJFOhEREZF+mXuAgOq27etuJZT6DZSp+J3XpQstXMJc5piSVwhZBtuj8OfA0iXy+jdP1c71KMYQ==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.6.0", + "@docsearch/js": "^3.6.0", + "@shikijs/core": "^1.2.0", + "@shikijs/transformers": "^1.2.0", + "@types/markdown-it": "^13.0.7", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/devtools-api": "^7.0.16", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", + "focus-trap": "^7.5.4", + "mark.js": "8.11.1", + "minisearch": "^6.3.0", + "shiki": "^1.2.0", + "vite": "^5.2.2", + "vue": "^3.4.21" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..323e7cff --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "scripts": { + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.0.2" + }, + "dependencies": { + "markdown-it-footnote": "^4.0.0" + } +} diff --git a/public/cpp.svg b/public/cpp.svg new file mode 100644 index 00000000..a177a90e --- /dev/null +++ b/public/cpp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 8a5a0593..00000000 --- a/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -python-slugify>=7.0.0 -marko>=2.0.0 -jinja2>=3.1.0 diff --git "a/src/C++CoreGuidelines/\347\254\2542\347\253\240-\347\220\206\345\277\265.md" "b/src/C++CoreGuidelines/\347\254\2542\347\253\240-\347\220\206\345\277\265.md" index a268c1f0..7c7f5f86 100644 --- "a/src/C++CoreGuidelines/\347\254\2542\347\253\240-\347\220\206\345\277\265.md" +++ "b/src/C++CoreGuidelines/\347\254\2542\347\253\240-\347\220\206\345\277\265.md" @@ -12,20 +12,7 @@ 理念性规则概览: -- [理念](#理念) - + [P.1 在代码中直接表达思想](#p1-在代码中直接表达思想) - + [P.2 用 ISO 标准写代码](#p2-用-iso-标准写代码) - + [P.3 表达意图](#p3-表达意图) - + [P.4 理想情况下,程序应该是静态类型安全的](#p4-理想情况下程序应该是静态类型安全的) - + [P.5 编译期检查优先于运行期检查](#p5-编译期检查优先于运行期检查) - + [P.6 不能在编译期检查的事项应该在运行期检查](#p6-不能在编译期检查的事项应该在运行期检查) - + [P.7 尽早识别运行期错误](#p7-尽早识别运行期错误) - + [P.8 不要泄露任何资源](#p8-不要泄露任何资源) - + [P.9 不要浪费时间和空间](#p9-不要浪费时间和空间) - + [P.10 不可变数据优先于可变数据](#p10-不可变数据优先于可变数据) - + [P.11 封装杂乱的构建,不要让它在代码中散布开](#p11-封装杂乱的构建不要让它在代码中散布开) - + [P.12 适当使用辅助工具](#p12-适当使用辅助工具) - + [P.13 适当使用支持库](#p13-适当使用支持库) +[[toc]] 理念性规则强调一般性,因此,无法进行检查。不过,理念性规则为下面的具体规则提供了理论依据。一共有 13 条理念性规则。 diff --git "a/src/C++CoreGuidelines/\347\254\2543\347\253\240-\346\216\245\345\217\243.md" "b/src/C++CoreGuidelines/\347\254\2543\347\253\240-\346\216\245\345\217\243.md" index 99bce915..2a337b08 100644 --- "a/src/C++CoreGuidelines/\347\254\2543\347\253\240-\346\216\245\345\217\243.md" +++ "b/src/C++CoreGuidelines/\347\254\2543\347\253\240-\346\216\245\345\217\243.md" @@ -5,14 +5,7 @@ 接口性规则概览: -- [接口](#接口) - + [I.2 避免非 const 的全局变量](#i2-避免非-const-的全局变量) - + [3.1 非 const 全局变量的弊端](#31-非-const-全局变量的弊端) - + [I.3 避免单例](#i3-避免单例) - + [3.2 运用依赖注入化解](#32-运用依赖注入化解) - + [3.3 构建良好的接口](#33-构建良好的接口) - + [I.13 不要用单个指针来传递数组](#i13-不要用单个指针来传递数组) - + [I.27 为了库 ABI 的文档,考虑使用 PImpl](#i27-为了库-abi-的文档考虑使用-pimpl) +[[toc]] 接口是服务的提供者和使用者之间的契约。根据 C++ Core Guidelines,接口”可能是代码辅助中最重要的一个方面”。“接口”这一部分大约有 20 条规则。 diff --git "a/src/C++CoreGuidelines/\347\254\2544\347\253\240-\345\207\275\346\225\260.md" "b/src/C++CoreGuidelines/\347\254\2544\347\253\240-\345\207\275\346\225\260.md" index ee774942..93b5e42b 100644 --- "a/src/C++CoreGuidelines/\347\254\2544\347\253\240-\345\207\275\346\225\260.md" +++ "b/src/C++CoreGuidelines/\347\254\2544\347\253\240-\345\207\275\346\225\260.md" @@ -2,38 +2,7 @@ 函数性规则概览: -- [函数](#函数) - + [4.1 函数定义](#41-函数定义) - - [好名字](#好名字) - - [F.4 如果函数有可能需要在编译期求值,就把它声明为 constexpr](#f4-如果函数有可能需要在编译期求值就把它声明为-constexpr) - - [F.6 如果你的函数必定不抛出异常,就把它声明为 noexcept](#f6-如果你的函数必定不抛出异常就把它声明为-noexcept) - - [F.8 优先使用纯函数](#f8-优先使用纯函数) - + [4.2 参数传递:入与出](#42-参数传递入与出) - - [F.15 优先采用简单而约定俗成的信息传递方式](#f15-优先采用简单而约定俗成的信息传递方式) - - [F.16 对于 "入"参,拷贝开销低的类型按值传递,其他类型则以 const 引用来传递](#f16-对于-入参拷贝开销低的类型按值传递其他类型则以-const-引用来传递) - - [F.19 对于“转发”参数,要用 Tp\&\& 来传递,并且只 std::forward 该参数](#f19-对于转发参数要用-tp-来传递并且只-stdforward-该参数) - - [F.17 对于“入-出”参数,使用非 const 的引用来传递](#f17-对于入-出参数使用非-const-的引用来传递) - - [F.20 对于“出”的输出值,优先使用返回值而非输出参数](#f20-对于出的输出值优先使用返回值而非输出参数) - - [F.21 要返回多个“出”值,优先考虑返回结构体或者多元组](#f21-要返回多个出值优先考虑返回结构体或者多元组) - + [4.3 参数传递:所有权语义](#43-参数传递所有权语义) - - [谁是所有者?](#谁是所有者) - + [4.4 值返回语义](#44-值返回语义) - - [F.42 返回 T\* (仅仅)用于表示位置](#f42-返回-t-仅仅用于表示位置) - - [F.44 当不希望发生拷贝,也不需要表达“没有返回对象”时,应返回 T\&](#f44-当不希望发生拷贝也不需要表达没有返回对象时应返回-t) - + [局部对象的引用](#局部对象的引用) - - [F.45 不要返回 T\&\&](#f45-不要返回-t) - - [F.48 不要返回 std::move(本地变量)](#f48-不要返回-stdmove本地变量) - + [T\&\&](#t) - + [std::move(本地变量)](#stdmove本地变量) - - [F.46 main() 的返回类型是 int](#f46-main-的返回类型是-int) - + [4.5 其他函数](#45-其他函数) - - [Lambda 表达式](#lambda-表达式) - - [F.50 当函数不适用时(需要捕获局部变量,或者编写一个局部函数),请使用 Lambda 表达式](#f50-当函数不适用时需要捕获局部变量或者编写一个局部函数请使用-lambda-表达式) - - [F.52 在局部使用(包括要传递给算法)的 Lambda 表达式中,优先通过引用来捕获](#f52-在局部使用包括要传递给算法的-lambda-表达式中优先通过引用来捕获) - - [F.53 在非局部使用(包括要被返回、存储在堆上或要传给其他线程)的 Lambda 表达式中,避免通过引用来捕获](#f53-在非局部使用包括要被返回存储在堆上或要传给其他线程的-lambda-表达式中避免通过引用来捕获) - - [F.51 在有选择的情况下,优先采用默认参数而非重载](#f51-在有选择的情况下优先采用默认参数而非重载) - - [F.55 不要使用 va\_arg 参数](#f55-不要使用-va_arg-参数) - + [4.6 相关规则](#46-相关规则) +[[toc]] ## 4.1 函数定义 @@ -218,7 +187,7 @@ int main(){ > 原书这里是要你看[汇编](https://godbolt.org/z/qjzxxv5oe)的,,唉,其实无所谓,看看吧。友情提示,别开优化,这么点代码,开优化,啥 call 都没有。 > 下面是使用 gcc13.2 生成的 Intel 风格的汇编代码。 -![汇编](../image/C++CoreGuidelines/4.1.png) +![汇编](/image/C++CoreGuidelines/4.1.png) (1)所对应汇编指令就是 26行。(2)所对应的汇编指令就是 31~34 行。 @@ -467,7 +436,7 @@ X create(int && __t10, double && __t11, char && __t12) 对于好奇的读者 [C++ Insights](https://cppinsights.io/) 可以展示这个过程。 -转发与变参模板的结合是 C++ 中典型的创建模式。下面是 [std::make_unique](https://zh.cppreference.com/w/cpp/memory/unique_ptr/make_unique) 的一种可能实现。 +转发与变参模板的结合是 C++ 中典型的创建模式。下面是 [std::make_unique<T>](https://zh.cppreference.com/w/cpp/memory/unique_ptr/make_unique) 的一种可能实现。 ```cpp template diff --git "a/src/C++CoreGuidelines/\347\254\2545\347\253\240-\347\261\273\345\222\214\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204.md" "b/src/C++CoreGuidelines/\347\254\2545\347\253\240-\347\261\273\345\222\214\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204.md" index b380f2fd..d30c0e70 100644 --- "a/src/C++CoreGuidelines/\347\254\2545\347\253\240-\347\261\273\345\222\214\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204.md" +++ "b/src/C++CoreGuidelines/\347\254\2545\347\253\240-\347\261\273\345\222\214\347\261\273\345\261\202\346\254\241\347\273\223\346\236\204.md" @@ -2,45 +2,7 @@ 类和类的层次结构规则概览: -- [类和类的层次结构](#类和类的层次结构) - + [5.1 概要规则](#51-概要规则) - - [C.1 把相关的数据组织到结构(struct 或 class)中](#c1-把相关的数据组织到结构struct-或-class中) - - [C.2 当类具有不变式时使用 class;如果数据成员可以独立变化,则使用 struct](#c2-当类具有不变式时使用-class如果数据成员可以独立变化则使用-struct) - - [C.3 在类中体现出接口和实现之间的区别](#c3-在类中体现出接口和实现之间的区别) - - [C.4 仅当函数需要直接访问类的内部表示时,才把它变成成员](#c4-仅当函数需要直接访问类的内部表示时才把它变成成员) - - [C.5 将辅助函数与它们支持的类放在同一个命名空间中](#c5-将辅助函数与它们支持的类放在同一个命名空间中) - - [C.7 不要在一条语句里定义类或枚举的同时声明该类型的变量](#c7-不要在一条语句里定义类或枚举的同时声明该类型的变量) - - [C.8 如果有任何非公开成员,就使用 class 而不是 struct](#c8-如果有任何非公开成员就使用-class-而不是-struct) - - [C.9 尽量减少成员的暴露](#c9-尽量减少成员的暴露) - + [5.2 具体类型](#52-具体类型) - - [C.10 优先使用具体类型而不是类层次结构](#c10-优先使用具体类型而不是类层次结构) - - [C.11 让具体类型规范化](#c11-让具体类型规范化) - + [5.3 构造函数、赋值运算符和析构函数](#53-构造函数赋值运算符和析构函数) - - [预置操作](#预置操作) - - [C.20 如果能避免定义默认操作,那么就这么做](#c20-如果能避免定义默认操作那么就这么做) - - [C.21 如果定义或 =delete 了任何默认操作,就对所有默认操作进行定义或 =delete](#c21-如果定义或-delete-了任何默认操作就对所有默认操作进行定义或-delete) - + [特殊成员函数之间的依赖关系](#特殊成员函数之间的依赖关系) - - [C.22 让默认操作保持一致](#c22-让默认操作保持一致) - + [示例,不好](#示例不好) - + [强制实施](#强制实施) - + [C.dtor: 析构函数](#cdtor-析构函数) - - [构造函数通用](#构造函数通用) - - [C.41 构造函数应当创建完全初始化的对象](#c41-构造函数应当创建完全初始化的对象) - - [C.42 如果构造函数无法构造出有效对象,则应该抛出异常](#c42-如果构造函数无法构造出有效对象则应该抛出异常) - - [默认构造函数](#默认构造函数) - - [C.43 确保可拷贝的(值类型)类有默认构造函数](#c43-确保可拷贝的值类型类有默认构造函数) - - [C.45 不要定义仅初始化数据成员的默认构造函数,而应使用默认成员初始化器](#c45-不要定义仅初始化数据成员的默认构造函数而应使用默认成员初始化器) - - [C.46 默认情况下,把单参数的构造函数声明为 explicit](#c46-默认情况下把单参数的构造函数声明为-explicit) - - [C.47 按成员声明的顺序定义和初始化成员变量](#c47-按成员声明的顺序定义和初始化成员变量) - - [C.48 在使用常量来初始化时,优先选择默认成员初始化器,而不是构造函数的成员初始化](#c48-在使用常量来初始化时优先选择默认成员初始化器而不是构造函数的成员初始化) - - [C.49 在构造函数里优先使用初始化而不是赋值](#c49-在构造函数里优先使用初始化而不是赋值) - - [C.51 使用委托构造函数来表示类的所有构造函数的共同动作](#c51-使用委托构造函数来表示类的所有构造函数的共同动作) - - [C.52 使用继承构造函数将构造函数导入不需要进一步显式初始化的派生类中](#c52-使用继承构造函数将构造函数导入不需要进一步显式初始化的派生类中) - - [拷贝和移动](#拷贝和移动) - + [赋值](#赋值) - - [自赋值](#自赋值) - - [语义](#语义) - + [C.67 多态类应当抑制公开的拷贝/移动操作](#c67-多态类应当抑制公开的拷贝移动操作) +[[toc]] 类是一种用户定义类型,程序员可以为其指定表示方法、操作和接口。类的层次结构被用来组织相关的结构。 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index 47cf9008..00000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ -cmake_minimum_required(VERSION 3.17) - -option(BUILD_DOCS "Build TeX docs" OFF) -option(BUILD_PROG "Build programs" ON) - -if(BUILD_PROG) - add_subdirectory(群友提交) -endif() - -if(BUILD_DOCS) - add_subdirectory(PDF版题目与答案) -endif() \ No newline at end of file diff --git a/src/ModernC++template/cpp-template.md b/src/ModernC++template/cpp-template.md deleted file mode 100644 index e5031704..00000000 --- a/src/ModernC++template/cpp-template.md +++ /dev/null @@ -1,31 +0,0 @@ -## 概念 - -模板,是 C++ 程序中的一个实体。 - -C++11 别名模板和 C++20 概念均为模板,C++ 通常使用模板来实现泛型,模板大致可以分为三类: - -- 函数模板 -- 类模板 -- 变量模板(C++14) - -顾名思义,比如函数模板被**实例化**后,就是一个普通的函数,你也可以当成普通函数使用。 - -函数模板不是函数、类模板不是类、变量模板不是变量。 - -函数模板 f,它实例化的 `f()` 与 `f()` 不是一个函数,根据同一个模板实例化的实体,彼此之前并无什么直接关系。 - -C++ 的模板是静态的,它不同于其他语言,C++ 的模板在编译期根据调用者传入的参数等,进行模板实例化,将它变成一个个函数、类、变量。 - -### 特化 - -- 类模板和变量模板支持偏特化与全特化(声明/定义); -- 函数模板只支持全特化; -- 别名模板与概念不支持特化。 - -那么,什么是特化呢?偏特化和全特化呢? - -- 特化,C++ 为了处理模板实例后不同类型得到不同的代码而产生的一个语法,极大的增强了扩展性 -- 偏特化 -- 全特化 - -## 建议学习现代C++模板教程:[视频](https://b23.tv/Ppq4Bsw)、[教案](https://github.com/Mq-b/Modern-Cpp-templates-tutorial) diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/CMakeLists.txt" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/CMakeLists.txt" deleted file mode 100644 index eb5667f8..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/CMakeLists.txt" +++ /dev/null @@ -1,9 +0,0 @@ -cmake_minimum_required(VERSION 3.17) - -project(LHWLatex) - -message(CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}) -find_package(Latexmk REQUIRED) -set(Latexmk_FLAGS ${Latexmk_FLAGS} -shell-escape -synctex=1) -add_latex_document(现代C++题目.tex ALL ENGINE XELATEX) -add_latex_document(现代C++题目(答案与解析).tex ALL ENGINE XELATEX) diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/README.md" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/README.md" deleted file mode 100644 index 1f681176..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/README.md" +++ /dev/null @@ -1,2 +0,0 @@ -下图简单的介绍了我们 `LaTex` 编写的基本架构引用关系。 -![图片](image/现代C++题目LaTex目录示意图.drawio.svg) diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/image/06_atomic.png" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/image/06_atomic.png" deleted file mode 100644 index ccd62bfb..00000000 Binary files "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/image/06_atomic.png" and /dev/null differ diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/image/\347\216\260\344\273\243C++\351\242\230\347\233\256LaTex\347\233\256\345\275\225\347\244\272\346\204\217\345\233\276.drawio.svg" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/image/\347\216\260\344\273\243C++\351\242\230\347\233\256LaTex\347\233\256\345\275\225\347\244\272\346\204\217\345\233\276.drawio.svg" deleted file mode 100644 index 48aa97f1..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/image/\347\216\260\344\273\243C++\351\242\230\347\233\256LaTex\347\233\256\345\275\225\347\244\272\346\204\217\345\233\276.drawio.svg" +++ /dev/null @@ -1,4 +0,0 @@ - - - -PDF版题目与答案teximage
现代C++题目(答案与解析).tex
现代C++题目(答案与解析).tex
现代C++题目.tex
现代C++题目.tex
question01...13.tex
utility.tex
question01...13.tex...
questionAndAnswer01-13.tex
questionAndAnswer01-13.tex
依赖
依赖
依赖
依赖
依赖
依赖
Text is not SVG - cannot display
\ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question01.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question01.tex" deleted file mode 100644 index 2c8f483c..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question01.tex" +++ /dev/null @@ -1,27 +0,0 @@ -日期:2023/7/21 出题人:mq白\\ - -给出以下代码,在不修改已给出代码的前提下使它满足\textbf{运行结果}。 - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - int main(){ - std::vector v{1, 2, 3}; - std::function f {[](const int& i) {std::cout << i << ' '; } }; - auto f2 = [](int& i) {i *= i; }; - v | f2 | f; - } -\end{minted} - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - 1 4 9 -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: \hardscore{2} \\ - \textbf{提示}:\mintinline{c++}{T& operator|(T& v, const T& f) }。 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question02.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question02.tex" deleted file mode 100644 index e99727f2..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question02.tex" +++ /dev/null @@ -1,39 +0,0 @@ -日期:2023/7/22 出题人:mq白\\ - -给出以下代码,在不修改已给出代码的前提下使它满足\textbf{运行结果}。 -6 为输入,决定 \textbf{$\pi$} 的小数点后的位数,可自行输入更大或更小数字。 - - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - int main(){ - std::cout << "乐 :{} *\n"_f(5); - std::cout << "乐 :{0} {0} *\n"_f(5); - std::cout << "乐 :{:b} *\n"_f(0b01010101); - std::cout << "{:*<10}"_f("卢瑟"); - std::cout << '\n'; - int n{}; - std::cin >> n; - std::cout << "π:{:.{}f}\n"_f(std::numbers::pi_v, n); - } -\end{minted} - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - 乐 :5 *\\ - 乐 :5 5 *\\ - 乐 :1010101 *\\ - 卢瑟******\\ - 6\\ - π:3.141593 -\end{tcolorbox} - - -\begin{itemize} - \item \textbf{难度}: \hardscore{2} \\ - \textbf{提示}:C++11 用户定义字面量、C++20 format 库。 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question03.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question03.tex" deleted file mode 100644 index dd519921..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question03.tex" +++ /dev/null @@ -1,47 +0,0 @@ -日期:2023/7/24 出题人:mq白\\ - -实现一个 print,如果你做了上一个作业,我相信这很简单。 要求调用形式为: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - print(格式字符串, 任意类型和个数的符合格式字符串要求的参数) -\end{minted} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - struct Frac { - int a, b; - }; -\end{minted} - -给出自定义类型Frace,要求支持以下: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - Frac f{ 1,10 }; - print("{}", f);// 结果为1/10 -\end{minted} - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - 1/10 -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: \hardscore{3} \\ - \textbf{提示}:std::formatter。 -\end{itemize} - -禁止面向结果编程,使用宏等等方式,本题主要考察和学习 format 库,记得测试至少三个不同编译器。 diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question04.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question04.tex" deleted file mode 100644 index bacd56e4..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question04.tex" +++ /dev/null @@ -1,53 +0,0 @@ -日期:2023/7/25 出题人:\href{ https://b23.tv/FM0evat}{Maxy}\\ - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - #include - class ComponentBase{ - protected: - static inline std::size_t component_type_count = 0; - }; - template - class Component : public ComponentBase{ - public: - //todo... - //使用任意方式更改当前模板类,使得对于任意类型X,若其继承自Component - - //则X::component_type_id()会得到一个独一无二的size_t类型的id(对于不同的X类型返回的值应不同) - //要求:不能使用std::type_info(禁用typeid关键字),所有id从0开始连续。 - }; - class A : public Component - {}; - class B : public Component - {}; - class C : public Component - {}; - int main() - { - std::cout << A::component_type_id() << std::endl; - std::cout << B::component_type_id() << std::endl; - std::cout << B::component_type_id() << std::endl; - std::cout << A::component_type_id() << std::endl; - std::cout << A::component_type_id() << std::endl; - std::cout << C::component_type_id() << std::endl; - } -\end{minted} - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - 0\\ - 1\\ - 1\\ - 0\\ - 0\\ - 2 -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: \hardscore{1} \\ - \textbf{提示}:初始化。 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question05.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question05.tex" deleted file mode 100644 index d0782ed3..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question05.tex" +++ /dev/null @@ -1,86 +0,0 @@ -日期:2023/7/29 出题人:\href{https://github.com/dynilath}{Da'Inihlus}\\ - -要求实现 \textbf{scope\_guard} 类型(即支持传入任意可调用类型 , 析构的时候同时调用 )。 - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - #include - #include - - #include - #include - #include - - struct X { - X() { puts("X()"); } - X(const X&) { puts("X(const X&)"); } - X(X&&) noexcept { puts("X(X&&)"); } - ~X() { puts("~X()"); } - }; - - int main() { - { - // scope_guard的作用之一,是让各种C风格指针接口作为局部变量时也能得到RAII支持 - // 这也是本题的基础要求 - FILE * fp = nullptr; - try{ - fp = fopen("test.txt","a"); - auto guard = scope_guard([&] { - fclose(fp); - fp = nullptr; - }); - - throw std::runtime_error{"Test"}; - } catch(std::exception & e){ - puts(e.what()); - } - assert(fp == nullptr); - } - puts("----------"); - { - // 附加要求1,支持函数对象调用 - struct Test { - void operator()(X* x) { - delete x; - } - } t; - auto x = new X{}; - auto guard = scope_guard(t, x); - } - puts("----------"); - { - // 附加要求2,支持成员函数和std::ref - auto x = new X{}; - { - struct Test { - void f(X*& px) { - delete px; - px = nullptr; - } - } t; - auto guard = scope_guard{&Test::f, &t, std::ref(x)}; - } - assert(x == nullptr); - } - } -\end{minted} - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - Test \\ - ---------- \\ - X() \\ - ~X() \\ - ---------- \\ - X() \\ - ~X() -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: \hardscore{4} \\ - \textbf{提示}:C++11 形参包,成员指针,完美转发,std::tuple,std::apply,C++17 类推导指引,std::invoke,std::function -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question06.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question06.tex" deleted file mode 100644 index 046c54c0..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question06.tex" +++ /dev/null @@ -1,28 +0,0 @@ -日期:2023/8/2 出题人:mq白 - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - #include - #include - int main() { - std::atomic n = 6; - std::cout << n << '\n'; - } -\end{minted} - -详细解释,为什么以上代码在 C++17 后可以通过编译, C++17 前不行? - -\begin{figure}[H] - \caption{不同编译器的 C++17 与 C++14 对比} - \centering - \includegraphics[width = 1.0\textwidth]{image/06_atomic.png} -\end{figure} - -\begin{itemize} - \item \textbf{难度}: \hardscore{3} \\ - \textbf{提示}:复制消除。 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question07.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question07.tex" deleted file mode 100644 index 04d9d44d..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question07.tex" +++ /dev/null @@ -1,39 +0,0 @@ -日期:2023/8/6 出题人:mq白\\ - -给出代码: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - struct MyException :std::exception { - const char* data{}; - MyException(const char* s) :data(s) { puts("MyException()"); } - ~MyException() { puts("~MyException()"); } - const char* what()const noexcept { return data; } - }; - void f2() { - throw new MyException("new Exception异常...."); - } - int main(){ - f2(); - } -\end{minted} - -灵感来源自 Java 人写 C++。 - -在 main 函数中自行修改代码,接取 f2() 函数抛出的异常(try catch)。 - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - MyException()\\ - new Exception异常....\\ - ~MyException() -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: \hardscore{1} \\ - \textbf{提示}:std::exception,try catch -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question08.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question08.tex" deleted file mode 100644 index cbe4ecfb..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question08.tex" +++ /dev/null @@ -1,35 +0,0 @@ -日期:2023/8/12 出题人:mq白\\ - -给出代码: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - template - struct array { - Ty* begin() { return arr; }; - Ty* end() { return arr + size; }; - Ty arr[size]; - }; - int main() { - ::array arr{1, 2, 3, 4, 5}; - for (const auto& i : arr) { - std::cout << i << ' '; - } - } -\end{minted} - -要求自定义推导指引,不更改已给出代码,使得代码成功编译并满足运行结果。 - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - 1 2 3 4 5 -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: \hardscore{3} \\ - \textbf{提示}:参考 std::array 实现,C++17类模板推导指引 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question09.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question09.tex" deleted file mode 100644 index 29016587..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question09.tex" +++ /dev/null @@ -1,46 +0,0 @@ -日期:2023/8/15 出题人:mq白 - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - #include - - template - struct X { - void f()const { std::cout << "X\n"; } - }; - - void f() { std::cout << "全局\n"; } - - template - struct Y : X { - void t()const { - this->f(); - } - void t2()const { - f(); - } - }; - - int main() { - Yy; - y.t(); - y.t2(); - } -\end{minted} - -给出以上代码,要求解释其运行结果。 - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - X\\ - 全局 -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: \hardscore{3} \\ - \textbf{提示}:名字查找。本问题堪称经典,在某著名 template 书籍也有提过(虽然它完全没有讲清楚)。 并且从浅薄的角度来说,本题也可以让你向其他人证明加 this 访问类成员,和不加,是有很多区别的。 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question10.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question10.tex" deleted file mode 100644 index 0451a2ff..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question10.tex" +++ /dev/null @@ -1,41 +0,0 @@ -日期:2023/8/18 出题人:mq白\\ - -题目的要求非常简单,在很多其他语言里也经常提供这种东西(一般是反射)。 但是显而易见 C++ 没有反射。 - -我们给出代码: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - int main() { - struct X { std::string s{ " " }; }x; - struct Y { double a{}, b{}, c{}, d{}; }y; - std::cout << size() << '\n'; - std::cout << size() << '\n'; - - auto print = [](const auto& member) { - std::cout << member << ' '; - }; - for_each_member(x, print); - for_each_member(y, print); - } -\end{minted} - -要求自行实现 for\_each\_member 以及 size 模板函数。 要求支持任意自定义类类型(聚合体)的数据成员遍历(聚合体中存储数组这种情况不需要处理)。 这需要打表,那么我们的要求是支持聚合体拥有 0 到 4 个数据成员的遍历。 - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - 1 - - 4 - - ~~0 0 0 0 -\end{tcolorbox} - -\begin{itemize} -\item \textbf{难度}: \hardscore{4} \\ - \textbf{提示}:\href{https://akrzemi1.wordpress.com/2020/10/01/reflection-for-aggregates/}{学习},boost::pfr。 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question11.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question11.tex" deleted file mode 100644 index 3d665825..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question11.tex" +++ /dev/null @@ -1,27 +0,0 @@ -日期:2023/8/20 出题人:\href{https://github.com/rsp4jack}{jacky}\\ - -思考:以下代码为什么在 C++20 以下的版本中无法成功编译,而在 C++20 及以后却可以? - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - #include - - struct Pos { - int x; - int y; - }; - - int main(){ - std::vector vec; - vec.emplace_back(1, 5); - } -\end{minted} - -\begin{itemize} -\item \textbf{难度}: \hardscore{2} \\ - \textbf{提示}:new,聚合初始化。 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question12.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question12.tex" deleted file mode 100644 index 781f6414..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question12.tex" +++ /dev/null @@ -1,85 +0,0 @@ -日期:2023/8/28 出题人:\href{https://github.com/rsp4jack}{jacky}\\ - -请实现函数 make\_vector(...),使以下代码编译通过(C++20): - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - #include - #include - - inline void dbg(const char* msg) - { - std::puts(msg); - std::fflush(stdout); - } - - struct X { - X() noexcept - { - dbg("X()"); - }; - - ~X() noexcept - { - dbg("~X()"); - }; - - X(const X&) - { - dbg("X(const X&)"); - } - - X(X&&) noexcept - { - dbg("X(X&&)"); - } - }; - - void test() - { - static_assert(requires { - { - make_vector(std::vector{1, 2, 3}) - } -> std::same_as>>; - { - make_vector(1, 2, 3) - } -> std::same_as>; - make_vector(1, 2, 3).size() == 3; - }); - X x1; - X x2; - auto vec = make_vector(x1, std::move(x2)); - } - - int main() - { - test(); - dbg("test end"); - } -\end{minted} - -\begin{tcolorbox}[title = {要求运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - X() \\ - X() \\ - X(const X\&) \\ - X(X\&\&) \\ - X(const X\&) \\ - X(const X\&) \\ - ~X() \\ - ~X() \\ - ~X() \\ - ~X() \\ - ~X() \\ - ~X() \\ - test end -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: \hardscore{3} \\ - \textbf{提示}:重载决议 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question13.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question13.tex" deleted file mode 100644 index b02889ab..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question13.tex" +++ /dev/null @@ -1,67 +0,0 @@ -日期:2023/9/6 出题人:mq白\\ - -我们会给出三段使用到了 \mintinline{c++}{return std::move(expr)} 代码。 - -解释说明这些代码是否有问题,问题在哪,或者没问题,那么为什么要这样使用。 - -\begin{itemize} - \item [1.] - 全局函数,返回局部对象,使用 std::move。 - \begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - #include - - struct X{//后续代码不再重复X类 - X() { puts("X()"); } - X(const X&) { puts("X(const X&)"); } - X(X&&)noexcept { puts("X(X&&)"); } - ~X() { puts("~X()"); } - }; - - X f(){ - X x; - return std::move(x); - } - - int main(){ - X x = f(); - } - \end{minted} - \item [2.] - 全局函数,返回局部的引用,使用 std::move。 - \begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - X&& f(){ - X x; - return std::move(x); - } - \end{minted} - \item [3.] - 类中成员函数,返回数据成员,使用 std::move。 - \begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - struct Test { - X x; - X f() { - return std::move(x); - } - }; - \end{minted} -\end{itemize} - -\begin{itemize} - \item \textbf{难度}: \hardscore{3} \\ - \textbf{提示}:return 重载决议。 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question14.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question14.tex" deleted file mode 100644 index bceba374..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question14.tex" +++ /dev/null @@ -1,48 +0,0 @@ -日期:2023/12/5 出题人:mq白\\ - -给出以下代码,不得修改,要求不得以 - -\begin{itemize} - \item \mintinline{c++}{ss::a} - - \item \mintinline{c++}{using namespace ss} - - \item \mintinline{c++}{namespace x = ss, x::a} - - \item \mintinline{c++}{using ss::a} - - \item 直接在 ss 命名空间中通过声明引用或指针指向 a ,然后再去修改 a -\end{itemize} - -这些方式去修改命名空间 \textbf{ss} 中的对象 \textbf{a},并且满足运行结果。\\ - -需要真的修改了 a,而不是别的东西,诸如更改入口函数等。\\ - -\textbf{不要求你的做法完全符合标准}。 - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - #include - - namespace ss { - int a = 0; - } - - int main() { - // todo.. - std::cout << ss::a << '\n'; - } -\end{minted} - -\begin{tcolorbox}[title = {运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - 100 -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: \hardscore{4} -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question15.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question15.tex" deleted file mode 100644 index 855135b4..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question15.tex" +++ /dev/null @@ -1,97 +0,0 @@ -日期:2024/1/7 出题人:\href{https://github.com/Matrix-A}{Matrix-A}(\href{https://github.com/Mq-b/Loser-HomeWork/issues/159}{\#159})\\ - -\begin{enumerate} - \item 使用\textbf{表达式模板}补全下面的代码,实现表达式计算; - \item 指出\textbf{表达式模板}和 STL Ranges 库中哪些\textbf{视图}类似,并指出它们的异同和优缺点。 -\end{enumerate} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - #include - #include - #include - #include - #include - - // 为std::vector增加一个自定义的赋值函数 - template - requires std::disjunction_v, std::is_floating_point> - class vector : public std::vector { - public: - using std::vector::vector; - using std::vector::size; - using std::vector::operator[]; - template - vector& operator=(const E& e) - { - const auto count = std::min(size(), e.size()); - this->resize(count); - for (std::size_t idx { 0 }; idx < count; ++idx) { - this->operator[](idx) = e[idx]; - } - return *this; - } - }; - - /* - // 实现表达式模板类及相关函数 - template<...> - struct vector_expr { - - }; - - // operator+ - // operator- - // operator* - // operator/ - */ - - int main() - { - auto print = [](const auto& v) { - std::ranges::copy(v, std::ostream_iterator> { std::cout, ", " }); - std::cout << std::endl; - }; - const vector a { 1.2764, 1.3536, 1.2806, 1.9124, 1.8871, 1.7455 }; - const vector b { 2.1258, 2.9679, 2.7635, 2.3796, 2.4820, 2.4195 }; - const vector c { 3.9064, 3.7327, 3.4760, 3.5705, 3.8394, 3.8993 }; - const vector d { 4.7337, 4.5371, 4.5517, 4.2110, 4.6760, 4.3139 }; - const vector e { 5.2126, 5.1452, 5.8678, 5.1879, 5.8816, 5.6282 }; - - { - vector result(6); - for (std::size_t idx = 0; idx < 6; idx++) { - result[idx] = a[idx] - b[idx] * c[idx] / d[idx] + e[idx]; - } - print(result); - } - { - vector result(6); - result = a - b * c / d + e; // 使用表达式模板计算 - print(result); - } - return 0; - } -\end{minted} - -\begin{tcolorbox}[title = {运行结果}, - fonttitle = \bfseries, fontupper = \sffamily, fontlower = \itshape] - 4.73472, 4.05709, 5.038, 5.08264, 5.73076, 5.18673,\\ - 4.73472, 4.05709, 5.038, 5.08264, 5.73076, 5.18673, -\end{tcolorbox} - -\begin{itemize} - \item \textbf{难度}: 待定 -\end{itemize} - -学习链接: -\begin{itemize} - \item \href{https://en.wikipedia.org/wiki/Expression_templates}{Wikipedia - Expression templates} - \item \href{https://gieseanw.wordpress.com/2019/10/20/we-dont-need-no-stinking-expression-templates/}{我们不需要臭名昭著的表达式模板(英文)} - \item \href{https://blog.csdn.net/magisu/article/details/12964911}{C++语言的表达式模板:表达式模板的入门性介绍} - \item \href{https://zh.cppreference.com/w/cpp/numeric/valarray}{std::valarray} 在一些 STL 实现中使用了表达式模板 -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question16.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question16.tex" deleted file mode 100644 index 9b8dfc9b..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/question16.tex" +++ /dev/null @@ -1,78 +0,0 @@ -日期:2024/2/6 出题人:mq白\\ - -函数模板不是函数,所以如果要传递,必须实例化,指明模板参数,比如以下代码无法通过编译: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - template< class T > - const T& min(const T& a, const T& b) { - return a < b ? a : b; - } - - template - auto foo(F f,Args&&...args) { - return f(std::forward(args)...); - } - - int main() { - const auto result = foo(::min, 2, 3); - std::cout << result << '\n'; - } -\end{minted} - -除非我们把里面的 \mintinline{c++}{::min} 换成 \mintinline{c++}{::min}。这显然很麻烦,而且很多时候依然会有问题,比如这个函数模板有多个类型模板参数,又或者它有多个重载: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - template< class T > - const T& min(const T& a, const T& b) { - return a < b ? a : b; - } - template< class T > - T min(std::initializer_list ilist) { - return std::min(ilist, std::less<>{}); - } - - template - auto foo(F f, Args&&...args) { - return f(std::forward(args)...); - } - - int main() { - const auto result = foo(::min, 2, 3); - std::cout << result << '\n'; - } -\end{minted} - -重载决议根本没有任何办法处理。因此,\href{https://en.cppreference.com/w/cpp/utility/functional#Transparent_function_objects}{通透函数对象(Transparent function objects)} 应运而生。\\ - -我们要解决以上问题,实现 \mintinline{c++}{BY_NAME} 宏,从函数模板名创造通透函数对象,使以下代码能够成功编译: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - template - auto foo(F f, Args&&...args) { - return f(std::forward(args)...); - } - - int main() { - const auto result = foo(BY_NAME(std::min), 2, 3); - std::cout << result << '\n'; - } -\end{minted} - -\begin{itemize} - \item \textbf{难度}: \hardscore{2} -\end{itemize} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer01.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer01.tex" deleted file mode 100644 index d5ef8259..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer01.tex" +++ /dev/null @@ -1,93 +0,0 @@ -\input{tex/question01.tex} - -\subsection{答案} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - template - requires std::regular_invocable//可加可不加,不会就不加 - std::vector& operator|(std::vector& v1, F f) { - for (auto& i : v1) { - f(i); - } - return v1; - } -\end{minted} - -\textbf{不使用模板:} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - std::vector& operator|(std::vector& v1, const std::function& f) { - for (auto& i : v1) { - f(i); - } - return v1; - } -\end{minted} - -\textbf{不使用范围 for,使用 C++20 简写函数模板:} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - std::vector& operator|(auto& v1, const auto& f) { - std::ranges::for_each(v1, f); - return v1; - } -\end{minted} - -\textbf{各种其他答案的范式无非就是这些改来改去了,没必要再写。} - -\subsection{解析} - -很明显我们需要重载管道运算符 $|$,根据我们的调用形式 v $|$ f2 $|$ f, -这种\textbf{链式}的调用,以及根据给出运行结果,我们可以知道,重载函数应当返回 v 的引用,并且 v 会被修改。 - -v $|$ f2 调用 \mintinline{c++}{operator |},operator $|$ 中使用 f2 遍历了 v 中的每一个元素,然后返回 v 的引用,再 $|$ f。 - -形式和原理很简单,那么接下来就是实现;最简单的方式无非就是写一个模板 - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - template - T& operator|(T& v1, F f) { - for (auto& i : v1) { - f(i); - } - return v1; - } -\end{minted} - -当然了,这个模板还不够好,我们知道了第一个参数会是 vector,模板完全可以再准确一点: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - template - std::vector& operator|(std::vector& v1, F f) -\end{minted} - -考虑到 std::function 的复制开销也不小,第二个模板形参也可以加 const\&。 - -\href{https://zh.cppreference.com/w/cpp/language/range-for}{范围 for},以及 \href{https://zh.cppreference.com/w/cpp/language/requires}{requires} 不再介绍。 - -\clearpage \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer02.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer02.tex" deleted file mode 100644 index 24592cd6..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer02.tex" +++ /dev/null @@ -1,100 +0,0 @@ -\input{tex/question02.tex} - -\subsection{答案} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - constexpr auto operator""_f(const char* fmt, size_t) { - return [=](T&&... Args) { - return std::vformat(fmt, std::make_format_args(std::forward(Args)...)); - }; - } -\end{minted} - -\subsection{解析} - -% 用户定义字面量所调用的函数被称为字面量运算符 注意用词。 - -我们需要使用到 C++11 用户定义字面量,\mintinline{c++}{""_f} 正是用户自定义字面量,但\textbf{字面量运算符}(用户定义字面量所调用的函数被称为字面量运算符)的形参列表有一些限制, -我们需要的是 \mintinline[breaklines]{c++}{(const char *,std::size_t)} 这样的形参列表,恰好这是允许的; -字面量运算符的返回类型,我们需要自定义,这个类型需要在内部重载 \mintinline{c++}{()} 运算符,以满足上述字面量像函数一样调用的要求。 - -我们一步一步来: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - void operator""_test(const char* str, std::size_t){ - std::cout << str << '\n'; - } - - "luse"_test; //调用了字面量运算符,打印 luse - - std::size_t operator""_test(const char* , std::size_t len){ - return len; - } - - std::size_t len = "luse"_test; //调用了字面量运算符,返回 luse 的长度 4 -\end{minted} - -上面这段代码的两个使用示例展示了我们用户定义字面量的基本使用,尤其注意第二段,返回值。如果要做到像 \mintinline{c++}{"xxx"_f(xxx)} 这样调用,就得在返回类型上做点手脚。 - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - struct X{ - std::size_t operator()(std::size_t n)const{ - return n; - } - }; - - X operator""_test(const char* , std::size_t){ - return {}; - } - - std::cout<<"无意义"_test(1); //打印 1 -\end{minted} - -以上这段简单的代码很好的完成了我们需要的调用形式,那么是时候完成题目要求的功能了。最简单的方式是直接使用 C++20 format 库进行格式化。 - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - namespace impl { - struct Helper { - const std::string_view s; - Helper(const char* s, std::size_t len): s(s, len) {} - template - std::string operator()(Args&&... args) const { - return std::vformat(s, std::make_format_args(std::forward(args)...)); - } - }; - } // namespace impl - impl::Helper operator""_f(const char* s, std::size_t len) noexcept { - return {s, len}; - } -\end{minted} - -\mintinline{c++}{operator""_f} 本身非常简单,只是用来把传入的参数(格式字符串)和长度,构造 mpl::Helper 对象再返回。Helper 类型使用了一个 string\_veiw 作为数据成员,存储了格式字符串,以供后面格式化使用。 - -重点只在于 \textbf{operator$()$}。 它是一个变参模板,用来接取我们传入的任意类型和个数的参数,然后返回格式化后的字符串。 - -这里用到的是 std::vformat 进行格式化,它的第一个参数是格式字符串,也就是我们要按照什么样的规则去格式化;第二个参数是要格式化的参数,但是我们没有办法直接进行形参包展开,它第二个参数的类型实际上是 std::format\_args。 我们必须使用 std::make\_format\_args 函数传入我们的参数,它会返回 std::format\_args 类型,其实也就是相当于转换一下,合理。 - -\textbf{不过显然标准答案不是这样的,还能简化,直接让 \mintinline{c++}{""_f} 返回一个 lambda 表达式即可。} - -\clearpage \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer03.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer03.tex" deleted file mode 100644 index 0f2b4d89..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer03.tex" +++ /dev/null @@ -1,57 +0,0 @@ -\input{tex/question03.tex} - -\subsection{标准答案} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - template<> - struct std::formatter:std::formatter{ - auto format(const auto& frac, auto& ctx)const{//const修饰是必须的 - return std::format_to(ctx.out(), "{}/{}", frac.a, frac.b); - } - }; - void print(std::string_view fmt,auto&&...args){ - std::cout << std::vformat(fmt, std::make_format_args(std::forward(args)...)); - } -\end{minted} - -\subsection{解析} - -实现一个 print 很简单,我们只要按第二题的思路来就行了,一个格式化字符串,用 std::string\_view 做第一个形参,另外需要接受任意参数和个数的参数,使用形参包即可。 - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - void print(std::string_view fmt,auto&&...args){ - std::cout << std::vformat(fmt, std::make_format_args(std::forward(args)...)); - } -\end{minted} - -由于使用了 C++20 简写函数模板,此处的完美转发就只能使用 decltype,显得有点诡异,其实很合理 - -展开的形式无非就是: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - std::forward(args1), - std::forward(arsg2), - std::forward(args3),... -\end{minted} - -这两个格式化函数没必要再介绍,和第第二题的作用一样,很简单的调库。 - -\clearpage \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer04.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer04.tex" deleted file mode 100644 index bc579b51..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer04.tex" +++ /dev/null @@ -1,66 +0,0 @@ -\input{tex/question04} - -\subsection{标准答案} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - template - class Component : public ComponentBase{ - public: - static std::size_t component_type_id(){ - static std::size_t ID = component_type_count++; - return ID; - } - }; -\end{minted} - -\subsection{解析} - -我们需要实现 Component 的静态成员函数 component\_type\_id。这是从给出代码得知的: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - class A : public Component - {}; - A::component_type_id() -\end{minted} - -C++ 的模板不是具体类型,实例化之后才是(即函数模板不是函数,类模板不是类),类模板的静态成员或静态成员函数也不属于模板,而是属于实例化后的具体类型我们可以用一段代码来展示结论: - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - #include - - template - struct Test{ - inline static int n = 10; - }; - - int main(){ - Test::n = 1; - std::cout << Test::n << '\n';//10 - std::cout << Test::n << '\n';//1 - } -\end{minted} - -这段代码很轻易的就展示了静态数据成员属于模板实例化后的具体类型。 \mintinline{c++}{Test::n} 和 \mintinline{c++}{Test::n} 不是相同的 n -,并且 \mintinline{c++}{Test} 和 \mintinline{c++}{Test} 也不是一种类型(静态成员函数同理)。 - -所以我们的解法利用的是:不同的类型实例化 Component 类模板,也是不同的静态成员函数,静态成员函数里面的静态局部变量也都是唯一的,并且在第一次调用的时候才会初始化,后面就不会。 - -\clearpage \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer05.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer05.tex" deleted file mode 100644 index 3d1e5e1f..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/questionAndAnswer05.tex" +++ /dev/null @@ -1,55 +0,0 @@ -\input{tex/question05.tex} - -\subsection{标准答案} - -\textbf{使用 std::function 并擦除类型} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - struct scope_guard { - std::functionf; - template requires std::invocable...> - scope_guard(Func&& func, Args&&...args) :f{ [func = std::forward(func), ...args = std::forward(args)]() mutable { - std::invoke(std::forward>(func), std::unwrap_reference_t(std::forward(args))...); - } }{} - ~scope_guard() { f(); } - scope_guard(const scope_guard&) = delete; - scope_guard& operator=(const scope_guard&) = delete; - }; -\end{minted} - -\textbf{使用 std::tuple+std::apply} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm, - breaklines]{c++} - template - requires requires(F f, Args...args) { std::invoke(f, args...); } - struct scope_guard { - F f; - std::tuplevalues; - - template - scope_guard(Fn&& func, Ts&&...args) :f{ std::forward(func) }, values{ std::forward(args)... } {} - ~scope_guard() { - std::apply(f, values); - } - scope_guard(const scope_guard&) = delete; - }; - - template//推导指引非常重要 - scope_guard(F&&, Args&&...) -> scope_guard, std::decay_t...>; -\end{minted} - -\subsection{解析} - -\clearpage \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/utility.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/utility.tex" deleted file mode 100644 index d229e06d..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/tex/utility.tex" +++ /dev/null @@ -1,14 +0,0 @@ - -\newcommand{\hardscore}[1]{ - \newcount\starcount - \starcount=0 - \loop - \ifnum\starcount<5 - \ifnum\starcount<#1 - \ding{72} - \else - \ding{73} - \fi - \advance\starcount by 1 - \repeat -} \ No newline at end of file diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/\347\216\260\344\273\243C++\351\242\230\347\233\256.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/\347\216\260\344\273\243C++\351\242\230\347\233\256.tex" deleted file mode 100644 index 3b97ec47..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/\347\216\260\344\273\243C++\351\242\230\347\233\256.tex" +++ /dev/null @@ -1,90 +0,0 @@ -\documentclass[11pt,fancyhdr]{ctexart} -\usepackage{graphicx} -\usepackage{float} -\usepackage{geometry} -\usepackage{xcolor} -\usepackage{fancyhdr} -\usepackage{minted} -\usepackage{tcolorbox} -\usepackage{pifont} -\usepackage[colorlinks,linkcolor=blue,bookmarksnumbered=true]{hyperref} -\usepackage{bookmark} -\renewcommand{\headrulewidth}{0.2pt} -\renewcommand{\headwidth}{\textwidth} -\renewcommand{\footrulewidth}{0pt} -\geometry{left=2cm,right=2cm,top=3cm,bottom=2cm} -\pagestyle{fancy} -\lhead{\author} -\chead{\date} -\rhead{op} -\lfoot{} -\cfoot{\thepage} -\rfoot{} -\title{现代C++题目} - - -\author{\href{https://github.com/Mq-b/Loser-HomeWork}{卢瑟帝国}\\} - -\date{\today} - -\input{tex/utility.tex} - -\begin{document} -\maketitle - -\tableofcontents -\newpage - -暂时只有 16 道题目,并无特别难度,有疑问可看\href{https://www.bilibili.com/video/BV1Zj411r7eP/}{视频教程}或答案解析。 - -% 后面写只需要按照下面这两行的形式就行了,一个 section 标题,一个 input 题目 - -\section{实现管道运算符} -\input{tex/question01.tex} - -\section{实现自定义字面量 \_f} -\input{tex/question02.tex} -\section{实现 print 以及特化 std::formatter} - -\input{tex/question03.tex} - -\section{给定类模板修改,让其对每一个不同类型实例化有不同 ID} -\input{tex/question04.tex} - -\section{实现 scope\_guard 类型} -\input{tex/question05.tex} - -\section{解释 std::atomic 初始化} -\input{tex/question06.tex} - -\section{throw new MyException} -\input{tex/question07.tex} - -\section{定义 array 推导指引} -\input{tex/question08.tex} - -\section{名字查找的问题} -\input{tex/question09.tex} - -\section{遍历任意聚合类数据成员} -\input{tex/question10.tex} - -\section{emplace\_back() 的问题} -\input{tex/question11.tex} - -\section{实现make\_vector()} -\input{tex/question12.tex} - -\section{关于 return std::move(expr)} -\input{tex/question13.tex} - -\section{以特殊方法修改命名空间中声明的对象} -\input{tex/question14.tex} - -\section{表达式模板} -\input{tex/question15.tex} - -\section{制造传递函数模板的宏} -\input{tex/question16.tex} - -\end{document} diff --git "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/\347\216\260\344\273\243C++\351\242\230\347\233\256\357\274\210\347\255\224\346\241\210\344\270\216\350\247\243\346\236\220\357\274\211.tex" "b/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/\347\216\260\344\273\243C++\351\242\230\347\233\256\357\274\210\347\255\224\346\241\210\344\270\216\350\247\243\346\236\220\357\274\211.tex" deleted file mode 100644 index c728caf1..00000000 --- "a/src/PDF\347\211\210\351\242\230\347\233\256\344\270\216\347\255\224\346\241\210/\347\216\260\344\273\243C++\351\242\230\347\233\256\357\274\210\347\255\224\346\241\210\344\270\216\350\247\243\346\236\220\357\274\211.tex" +++ /dev/null @@ -1,76 +0,0 @@ -\documentclass[11pt,fancyhdr]{ctexart} -\usepackage{graphicx} -\usepackage{float} -\usepackage{geometry} -\usepackage{xcolor} -\usepackage{fancyhdr} -\usepackage{minted} -\usepackage{tcolorbox} -\usepackage{pifont} -\usepackage[colorlinks,linkcolor=blue,bookmarksnumbered=true]{hyperref} -\usepackage{bookmark} -\renewcommand{\headrulewidth}{0.2pt} -\renewcommand{\headwidth}{\textwidth} -\renewcommand{\footrulewidth}{0pt} -\geometry{left=2cm,right=2cm,top=3cm,bottom=2cm} -\pagestyle{fancy} -\lhead{\author} -\chead{\date} -\rhead{op} -\lfoot{} -\cfoot{\thepage} -\rfoot{} -\title{现代C++题目(答案与解析)} - - -\author{\href{https://github.com/Mq-b/Loser-HomeWork}{卢瑟帝国}\\} - -\date{\today} - -\input{tex/utility.tex} - -\begin{document} -\maketitle - -\tableofcontents -\newpage - -暂时只有 13 道题目,并无特别难度,有疑问可看\href{https://www.bilibili.com/video/BV1Zj411r7eP/}{视频教程}或答案解析。 - -% 后面写只需要按照下面这两行的形式就行了,一个 section 标题,一个 input 题目 - - -\section{实现管道运算符} -\input{tex/questionAndAnswer01.tex} - -\newpage - -\section{实现自定义字面量 \_f} -\input{tex/questionAndAnswer02.tex} - -\section{实现 print 以及特化 std::formatter} -\input{tex/questionAndAnswer03.tex} - -\section{给定类模板修改,让其对每一个不同类型实例化有不同 ID} -\input{tex/questionAndAnswer04.tex} - -\section{实现 scope\_guard 类型} -\input{tex/questionAndAnswer05.tex} - -\section{解释 std::atomic 初始化} - -\section{throw new MyException} - -\section{定义 array 推导指引} - -\section{名字查找的问题} - -\section{遍历任意聚合类数据成员} - -\section{emplace\_back() 的问题} - -\section{实现make\_vector()} - -\section{关于 return std::move(expr)} - -\end{document} diff --git a/src/README.md b/src/README.md deleted file mode 100644 index 85f5698c..00000000 --- a/src/README.md +++ /dev/null @@ -1,3 +0,0 @@ -  本文件夹存放仓库的主要知识内容。 - -  可以查看 [SUMMARY.md](/SUMMARY.md) 文件,即目录,选择正确阅读。 diff --git "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/resource/luse.png" "b/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/resource/luse.png" deleted file mode 100644 index bcb0f43d..00000000 Binary files "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/resource/luse.png" and /dev/null differ diff --git "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/test.tex" "b/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/test.tex" deleted file mode 100644 index 451c1568..00000000 --- "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/test.tex" +++ /dev/null @@ -1,80 +0,0 @@ -\documentclass{ctexart} -\usepackage{graphicx} -\usepackage{float} -\usepackage{geometry} -\usepackage{xcolor} -\usepackage{fancyhdr} -\usepackage{minted} -\begin{document} - -\begin{minted}{c} -int main() { - printf("hello, world"); -return 0; -} -\end{minted} - -\mint{c++}|C++20coroutine_test.cpp| -\begin{minted}[mathescape, % 中括号中的内容用于控制代码显示的格式,可以依照喜好修改 - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - - #include - #include - - struct promise { - struct promise_type; - - struct iterator { - std::coroutine_handle& h; - int& operator*() { - return h.promise().n; - } - iterator operator++() { - if (!h.done())h.resume(); - return *this; - } - bool operator!=(const iterator&)const { - return !h.done(); - } - }; - struct promise_type { - int n; - promise get_return_object() { - return { std::coroutine_handle::from_promise(*this) }; - } - std::suspend_never initial_suspend() noexcept { return {}; }//注意返回类型 需要确保协程第一次进去被执行了 - std::suspend_always final_suspend() noexcept { return {}; } - std::suspend_always yield_value(int r) { n = r; return {}; }//co_yield()需要 - void return_void() { } - void unhandled_exception() {} - }; - iterator begin() { return { _h }; } - iterator end() { return { _h }; } - std::coroutine_handle_h; - }; - - promise iota(int value) { - std::cout << "iota\n"; - while (value) { - co_yield value; - --value; - } - } - - int main() { - for (int x : iota(10)) {//范围for会执行operator!= * ++ 改变协程状态写到++中,*普通的返回值就好 - std::cout << x << '\n'; - } - } - -\end{minted} - -行内代码\mintinline{python}{import numpy as np} - -\end{document} - -% pdflatex -shell-escape test.tex \ No newline at end of file diff --git "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/1.tex" "b/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/1.tex" deleted file mode 100644 index fabb3051..00000000 --- "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/1.tex" +++ /dev/null @@ -1,20 +0,0 @@ -{\heiti事实上在阅读宪法之前,请先明确自己的身份,是“\textit{\textbf{卢瑟}}”,否则则不需要遵守。 -不管什么职位,都是 \textbf{卢瑟}。} -\subsection{你好 卢瑟王} -\paragraph{卢瑟王}是卢瑟帝国的王者,可以统御普通卢瑟。 -\subsection{底层卢瑟你好} -\paragraph{国王}在卢瑟帝国有统治权。\textbf{mq白}是国王,管理一切, 是卢瑟帝国中心。 -\subsection{你好 卢瑟管理者} -\paragraph{卢瑟管理者}是专门管理卢瑟的,地位和卢瑟王一样。 - -\subsection{你好 赞助商} -\paragraph{赞助商}是卢瑟帝国唯一的资金来源,非常重要,用于供养国王和帝国日常发展。\\ -{\color{white}-} - -\begin{figure}[H] - \caption{简单等级示意图} - \centering - \includegraphics[width = .7\textwidth]{resource/luse.png} -\end{figure} - -\input{tex/loser_empire.tex} \ No newline at end of file diff --git "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/2.tex" "b/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/2.tex" deleted file mode 100644 index 5bc446f3..00000000 --- "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/2.tex" +++ /dev/null @@ -1,27 +0,0 @@ -这应该是一个很好的问题,也是大家都会思考的问题。 - -关于如何做好一名 \textbf{卢瑟},我认为有以下 \textbf{3}点。 - -\subsection{技能} - -卢瑟至少应该掌握以下基本技能: - -\begin{enumerate} - - \item 熟练使用 \href{https://zh.cppreference.com/w/cpp}{cppreference} 文档。 - \item 熟练使用现代 C++。 - \item 学习过操作系统,计算机网络 等基本课程。 - \item 能够使用 Linux 和 windows 系统 api 进行编程。 - \item 学习过至少 4 门语言。 - \item 使用了解过常见的 GUI 框架(如 Qt,WinForms,mfc,wpf)。 - \item git 的基本使用。 -\end{enumerate} - -\subsection{互助} - -人人为我,我为人人,在有时间的时候热情的回答和思考其他卢瑟的问题。 - -\subsection{包容} - -包容卢瑟们的怪癖,人无完人。 - diff --git "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/3.tex" "b/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/3.tex" deleted file mode 100644 index b194fc54..00000000 --- "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/3.tex" +++ /dev/null @@ -1,8 +0,0 @@ -\begin{enumerate} - - \item 独立完成 \href{https://github.com/Mq-b/Loser-HomeWork}{Loser\_Homewok} 全部 13 道题目。 - \item 为 \href{https://github.com/Mq-b/Loser-HomeWork}{Loser\_Homewok} 做贡献(提 pr 或 Issues)。 - \item 有足够的利用价值。 -\end{enumerate} - -\textbf{如果能在必要时帮助国王,那么以上一切条件都不需要}。 \ No newline at end of file diff --git "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/loser_empire.tex" "b/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/loser_empire.tex" deleted file mode 100644 index 5e9cac59..00000000 --- "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/tex/loser_empire.tex" +++ /dev/null @@ -1,13 +0,0 @@ -\begin{center} - \begin{tabular}{|l|c|r|} - \hline - & \textbf{卢瑟帝国国王} & \\ - \hline - 卢瑟王 & 赞助商 & 卢瑟管理者 \\ - \hline - mq家族 & 史官 & 底层卢瑟 \\ - \hline - & 新子民 & \\ - \hline - \end{tabular} -\end{center} \ No newline at end of file diff --git "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225.tex" "b/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225.tex" deleted file mode 100644 index 6f9cc51c..00000000 --- "a/src/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225/\345\215\242\347\221\237\345\270\235\345\233\275\345\256\252\346\263\225.tex" +++ /dev/null @@ -1,41 +0,0 @@ -\documentclass[11pt,a4paper]{ctexart} -\usepackage{graphicx} -\usepackage{float} -\usepackage{geometry} -\usepackage{xcolor} -\usepackage{fancyhdr} -\usepackage{minted} -\usepackage{listings} -\usepackage[colorlinks,linkcolor=blue]{hyperref} -\geometry{left=2cm,right=2cm,top=3cm,bottom=2cm} -\pagestyle{fancy} -\lhead{\author} -\chead{\date} -\rhead{1 你好卢瑟} -\lfoot{} -\cfoot{\thepage} -\rfoot{} -\renewcommand{\headrulewidth}{0.2pt} -\renewcommand{\headwidth}{\textwidth} -\renewcommand{\footrulewidth}{0pt} - -\title{卢瑟帝国宪法 } -\author{mq白} -\date{\today} - -\begin{document} -\maketitle - -\section{你好 卢瑟} - -\input{tex/1.tex} - -\section{如何做一名卢瑟?} - -\input{tex/2.tex} - -\section{如何成为一名高级卢瑟?} - -\input{tex/3.tex} - -\end{document} \ No newline at end of file diff --git "a/src/\345\215\242\347\221\237\346\227\245\347\273\217/\345\220\214\346\255\245\343\200\201\345\274\202\346\255\245\343\200\201\351\230\273\345\241\236.md" "b/src/\345\215\242\347\221\237\346\227\245\347\273\217/\345\220\214\346\255\245\343\200\201\345\274\202\346\255\245\343\200\201\351\230\273\345\241\236.md" index 3cc21aa0..41f51903 100644 --- "a/src/\345\215\242\347\221\237\346\227\245\347\273\217/\345\220\214\346\255\245\343\200\201\345\274\202\346\255\245\343\200\201\351\230\273\345\241\236.md" +++ "b/src/\345\215\242\347\221\237\346\227\245\347\273\217/\345\220\214\346\255\245\343\200\201\345\274\202\346\255\245\343\200\201\351\230\273\345\241\236.md" @@ -1,4 +1,4 @@ -## 非同步阻塞,同步阻塞,异步阻塞,异步非阻塞 +# 非同步阻塞,同步阻塞,异步阻塞,异步非阻塞   请求发数据并等待数据发完:**同步阻塞**。 diff --git "a/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256.tex" "b/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256.tex" deleted file mode 100644 index 3f65f188..00000000 --- "a/src/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256/\345\237\272\347\241\200\346\200\247C++\351\242\230\347\233\256.tex" +++ /dev/null @@ -1,162 +0,0 @@ -\documentclass[11pt,fancyhdr]{ctexart} -\usepackage{graphicx} -\usepackage{float} -\usepackage{geometry} -\usepackage{xcolor} -\usepackage{fancyhdr} -\usepackage{minted} -\usepackage[colorlinks,linkcolor=blue]{hyperref} -\renewcommand{\headrulewidth}{0.2pt} -\renewcommand{\headwidth}{\textwidth} -\renewcommand{\footrulewidth}{0pt} -\geometry{left=2cm,right=2cm,top=3cm,bottom=2cm} -\pagestyle{fancy} -\lhead{\author} -\chead{\date} -\rhead{卢瑟帝国万岁} -\lfoot{} -\cfoot{\thepage} -\rfoot{} -\title{基础性C++题目} - -\author -{ - \href{https://github.com/Mq-b}{mq白}\\ - \href{https://github.com/dynilath}{Da'Inihlus} -} - -\date{\today} - -\begin{document} -\maketitle - -都是基础知识,并没有特意为难。 - -\section{题目} - -\subsection{结构体拷贝} -给出以下代码,其行为是? - - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - - #include - - struct foo{ - char a[16]; - }; - - int main(){ - foo a {"Hello, World!"}; - auto b = a; - a.a[0] = '\0'; - std::cout << b.a; - } -\end{minted} - -\begin{itemize} - \item [A] - 无法编译/未定义行为 - \item [B] - 可编译,保证无输出 - \item [C] - 可编译,保证输出"Hello, World!" - \item [D] - 可编译,输出为实现定义 -\end{itemize} - -\subsection{C++四种类型转换} - -以下代码应当使用的转换是? - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - - #include - - struct foo{ - char a[16]; - }; - - struct Base { int x; }; - struct Derived : Base { int y; } - - int get_xy(Base * param){ - auto pd = ????_cast(param); - return pd->x * pd->y; - } -\end{minted} - -\begin{itemize} - \item [A] - static\_cast - \item [B] - dynamic\_cast - \item [C] - 以上全部 - \item [D] - 不允许转换 -\end{itemize} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - void erased_call(void (* pfn)(void), const char * param){ - auto typed_pfn = ????_cast(pfn); - typed_pfn(param); - } -\end{minted} - -\begin{itemize} - \item [A] - static\_cast - \item [B] - dynamic\_cast - \item [C] - 以上全部 - \item [D] - 不允许转换 -\end{itemize} - -\begin{minted}[mathescape, - linenos, - numbersep=5pt, - gobble=2, - frame=lines, - framesep=2mm]{c++} - - template - void foo(T&& i){ - // some implemetion code - } - - void speciallized_foo(int param){ - auto spfoo = ????_cast(foo); - spfoo(param); - } -\end{minted} - -\begin{itemize} - \item [A] - static\_cast - \item [B] - dynamic\_cast - \item [C] - 以上全部 - \item [D] - 不允许转换 -\end{itemize} - -\end{document} diff --git "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/expand_details.js" "b/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/expand_details.js" deleted file mode 100644 index 06037587..00000000 --- "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/expand_details.js" +++ /dev/null @@ -1,13 +0,0 @@ -{ - window, PagedConfig = window.PagedConfig || {}; - window.PagedConfig.before = window.PagedConfig.before || function () { }; - let originalBefore = window.PagedConfig.before; - window.PagedConfig.before = () => { - // See https://github.com/pagedjs/pagedjs/issues/45 - originalBefore.apply(this); - - $('details').each(function () { - $(this).attr('open', true); - }); - } -} diff --git "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/generate.py" "b/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/generate.py" deleted file mode 100644 index a571c569..00000000 --- "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/generate.py" +++ /dev/null @@ -1,122 +0,0 @@ -import os -import sys -from subprocess import PIPE, Popen -from typing import cast - -from jinja2 import Environment, FileSystemLoader, select_autoescape -from marko.block import BlockElement, Document, Heading, LinkRefDef -from marko.inline import CodeSpan -from marko.md_renderer import MarkdownRenderer -from marko.parser import Parser as MarkdownParser - -srcdir = os.getcwd() -resdir = os.path.dirname(sys.argv[0]) - -jinjaenv = Environment( - loader=FileSystemLoader(os.path.join(resdir, "templates")), - autoescape=select_autoescape(), -) - -SRC = "README.md" - - -def log(*args, **kwargs): - print(*args, **kwargs, file=sys.stderr) - - -log(f"CWD: {srcdir}") - -with open(SRC, "r") as f: - document = MarkdownParser().parse(f.read()) - -mdrender = MarkdownRenderer() - -log(f"Loaded document {os.path.abspath(SRC)}") -log(f"Got {len(document.children)} children of document root") - -sectionstag: list[list[BlockElement]] = [] -sectionshtml: list[str] = [] - - -def mit2html(markdown: str): - popen = Popen( - ["node", os.path.join(resdir, "mit2html", "mit2html.mjs")], - stdin=PIPE, - stdout=PIPE, - ) - html = popen.communicate(input=markdown.encode("utf-8"), timeout=30.0) - if html[1]: - log(html[1].decode("utf-8")) - if popen.returncode != 0: - log(f"mit2html failed with code {popen.returncode}") - if html[0]: - log(html[0].decode("utf-8")) - return "!!! ERROR !!!" - if html[0]: - return html[0].decode("utf-8") - return "!!! EMPTY !!!" - - -sectionid = -1 -inregion = False -sectiontag = [] - -for idx, child in enumerate(document.children): - # log(f"Procesing child {idx} [{type(child).__name__}:{child.line_number}]: ", end="") - if isinstance(child, Heading) and child.level == 2: - # log() - if inregion: - log(f"<<<<<<< {sectionid}") - sectionstag.append(sectiontag) - sectiontag = [] - inregion = False - if isinstance(child.children[0], CodeSpan): - sectionid += 1 - log(f">>>>>>> {sectionid}") - inregion = True - log( - f"{'§'*child.level} {''.join([mdrender.render(element) for element in child.children])}" - ) - if inregion: - # log(f'append {sectionid}') - sectiontag.append(child) - else: - # log('skipped') - pass - -if inregion: - log(f"<<<<<<< {sectionid}") - sectionstag.append(sectiontag) - sectiontag = [] - -lrds: list[LinkRefDef] = [ - element for element in document.children if isinstance(element, LinkRefDef) -] - -log(f"Found {len(sectionstag)} sections") -for sectiontag in sectionstag: - for tag in sectiontag: - if ( - isinstance(tag, Heading) - and isinstance(tag.children[0], CodeSpan) - and tag.level == 2 - ): - cast(list, tag.children).pop(0) - sectiontag.extend(lrds) - pseudo_doc = Document() - pseudo_doc.link_ref_defs = document.link_ref_defs - pseudo_doc.children = sectiontag - - mdrender.root_node = None - sectionmd = mdrender.render(pseudo_doc) - sectionhtml = mit2html(sectionmd) - - sectionshtml.append(sectionhtml) - -template = jinjaenv.get_template("template.html") -with open("generated.html", "w") as f: - _ = f.write( - template.render( - sections=sectionshtml, relresdir=os.path.relpath(resdir, srcdir) - ) - ) diff --git "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/mit2html/mit2html.mjs" "b/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/mit2html/mit2html.mjs" deleted file mode 100644 index 657dd771..00000000 --- "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/mit2html/mit2html.mjs" +++ /dev/null @@ -1,42 +0,0 @@ -import markdownit from 'markdown-it' -import { execSync } from 'child_process'; -import fs from 'fs'; -import tmp from 'tmp'; -import mdkatex from 'markdown-it-katexx' - -const markdown = markdownit({ - html: true, - breaks: true, - linkify: true, - typographer: true, - highlight: function (str, lang) { - const highlightCode = (str, lang) => { - const tempFile = tmp.fileSync(lang ? { postfix: `.${lang}` } : {}); - fs.writeFileSync(tempFile.name, str); - - try { - const output = execSync(`tree-sitter highlight -H ${tempFile.name}`).toString(); - return output; - } catch (error) { - console.error('Error highlighting code:', error); - return ''; - } finally { - tempFile.removeCallback(); - } - }; - - return highlightCode(str, lang).replace(/\n$/g, ''); - //return ''; - } -}); - -markdown.use(mdkatex); - -async function read(stream) { - const chunks = []; - for await (const chunk of stream) chunks.push(chunk); - return Buffer.concat(chunks).toString('utf8'); -} - -const md = await read(process.stdin) -console.log(markdown.render(md)) diff --git "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/mit2html/package-lock.json" "b/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/mit2html/package-lock.json" deleted file mode 100644 index c5478a13..00000000 --- "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/mit2html/package-lock.json" +++ /dev/null @@ -1,409 +0,0 @@ -{ - "name": "mit2html", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "mit2html", - "version": "1.0.0", - "license": "GPL-3.0-or-later", - "dependencies": { - "markdown-it": "^14.0.0", - "markdown-it-container": "^4.0.0", - "markdown-it-emoji": "^3.0.0", - "markdown-it-katexx": "^3.2.0", - "markdown-it-multimd-table": "^4.2.3", - "tmp": "^0.2.1" - } - }, - "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==" - }, - "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==" - }, - "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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "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==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "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/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "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==" - }, - "node_modules/katex": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz", - "integrity": "sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==", - "dependencies": { - "commander": "^2.19.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "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==", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/markdown-it": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz", - "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", - "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.0.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/markdown-it-container": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-4.0.0.tgz", - "integrity": "sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==" - }, - "node_modules/markdown-it-emoji": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", - "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==" - }, - "node_modules/markdown-it-katexx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/markdown-it-katexx/-/markdown-it-katexx-3.2.0.tgz", - "integrity": "sha512-fR6ZHNnQa4SzAIj8jxrEAtp3olE3bnBFlcEUk460fbCAqap0ycuS3QrQ38pK+/fHmjJZD1gmSnlkM1QfkAYCZA==", - "dependencies": { - "katex": "^0.12.0" - } - }, - "node_modules/markdown-it-multimd-table": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/markdown-it-multimd-table/-/markdown-it-multimd-table-4.2.3.tgz", - "integrity": "sha512-KepCr2OMJqm7IT6sOIbuqHGe+NERhgy66XMrc5lo6dHW7oaPzMDtYwR1EGwK16/blb6mCSg4jqityOe0o/H7HA==" - }, - "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==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "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==", - "dependencies": { - "wrappy": "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/uc.micro": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.0.0.tgz", - "integrity": "sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==" - }, - "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==" - } - }, - "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==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "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" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "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==" - }, - "katex": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz", - "integrity": "sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==", - "requires": { - "commander": "^2.19.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==", - "requires": { - "uc.micro": "^2.0.0" - } - }, - "markdown-it": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.0.0.tgz", - "integrity": "sha512-seFjF0FIcPt4P9U39Bq1JYblX0KZCjDLFFQPHpL5AzHpqPEKtosxmdq/LTVZnjfH7tjt9BxStm+wXcDBNuYmzw==", - "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.0.0" - } - }, - "markdown-it-container": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-4.0.0.tgz", - "integrity": "sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==" - }, - "markdown-it-emoji": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-3.0.0.tgz", - "integrity": "sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==" - }, - "markdown-it-katexx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/markdown-it-katexx/-/markdown-it-katexx-3.2.0.tgz", - "integrity": "sha512-fR6ZHNnQa4SzAIj8jxrEAtp3olE3bnBFlcEUk460fbCAqap0ycuS3QrQ38pK+/fHmjJZD1gmSnlkM1QfkAYCZA==", - "requires": { - "katex": "^0.12.0" - } - }, - "markdown-it-multimd-table": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/markdown-it-multimd-table/-/markdown-it-multimd-table-4.2.3.tgz", - "integrity": "sha512-KepCr2OMJqm7IT6sOIbuqHGe+NERhgy66XMrc5lo6dHW7oaPzMDtYwR1EGwK16/blb6mCSg4jqityOe0o/H7HA==" - }, - "mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "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==" - }, - "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==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "requires": { - "rimraf": "^3.0.0" - } - }, - "uc.micro": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.0.0.tgz", - "integrity": "sha512-DffL94LsNOccVn4hyfRe5rdKa273swqeA5DJpMOeFmEn1wCDc7nAbbB0gXlgBCL7TNzeTv6G7XVWzan7iJtfig==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - } - } -} diff --git "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/mit2html/package.json" "b/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/mit2html/package.json" deleted file mode 100644 index 133b7b23..00000000 --- "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/mit2html/package.json" +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "mit2html", - "version": "1.0.0", - "description": "", - "main": "mit2html.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "rsp4jack", - "license": "GPL-3.0-or-later", - "dependencies": { - "markdown-it": "^14.0.0", - "markdown-it-container": "^4.0.0", - "markdown-it-emoji": "^3.0.0", - "markdown-it-katexx": "^3.2.0", - "markdown-it-multimd-table": "^4.2.3", - "tmp": "^0.2.1" - } -} diff --git "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/pagedgen/cli.js" "b/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/pagedgen/cli.js" deleted file mode 100644 index 9d4cfdbf..00000000 --- "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/pagedgen/cli.js" +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/env node -import { program } from "commander"; -import ora from "ora"; -import path from "path"; -import fs from "fs"; -import replaceExt from "replace-ext"; - -import Printer from "./printer.js"; - -// import pkg from "../package.json" assert { type: "json" }; - -function commaSeparatedList(value) { - return value.split(","); -} - -program -// .version(pkg.version) - .arguments("[inputPath]") - .option("-i, --inputs [inputs]", "Inputs") - .option("-o, --output [output]", "Output") - .option("-d, --debug", "Debug") - .option("-l, --landscape", "Landscape printing", false) - .option("-s, --page-size [size]", "Print to Page Size [size]") - .option("-w, --width [size]", "Print to Page Width [width] in MM") - .option("-h --height [size]", "Print to Page Height [weight] in MM") - .option("--forceTransparentBackground", "Print with transparent background") - .option("-t, --timeout [ms]", "Set a max timeout of [ms]") - .option("-x, --html", "output html file") - .option("-b, --blockLocal", "Disallow access to filesystem for local files") - .option("-r, --blockRemote", "Disallow requests to remote servers") - .option("--allowedPath [allowedPaths]", "Only allow access to given filesystem paths, repeatable.", collect, []) - .option("--allowedDomain [allowedDomains]", "Only allow access to given remote domains, repeatable", collect, []) - .option("--outline-tags [tags]", "Specifies that an outline should be " + - "generated for the resulting PDF document. [tags] specifies which " + - "HTML tags should be considered for that outline. " + - "\"h1,h2\" will trigger an outline with \"h1\" tags as root elements " + - "and \"h2\" elements as their childs.") - .option("--additional-script - - - - - - - - - - - - - - - -
- -
- -
- - - diff --git "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/unwrap_details.js" "b/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/unwrap_details.js" deleted file mode 100644 index 5bf7cab3..00000000 --- "a/src/\347\216\260\344\273\243C++\351\242\230\347\233\256/unwrap_details.js" +++ /dev/null @@ -1,14 +0,0 @@ -{ - window, PagedConfig = window.PagedConfig || {}; - window.PagedConfig.before = window.PagedConfig.before || function () { }; - let originalBefore = window.PagedConfig.before; - window.PagedConfig.before = () => { - originalBefore.apply(this); - - $('details').each(function () { - $(this).wrapInner('
'); - $(this).children().unwrap(); - }).remove(); - $('summary').remove(); - } -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/CMakeLists.txt" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/CMakeLists.txt" deleted file mode 100644 index 533d86a8..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/CMakeLists.txt" +++ /dev/null @@ -1,55 +0,0 @@ -cmake_minimum_required(VERSION 3.17) -project(check_loser_homework) -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} - ${CMAKE_CURRENT_SOURCE_DIR}/cmake) -include(CheckLoserHomeWork) - -set(CMAKE_CXX_STANDARD 26) - -if (MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /permissive-") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /permissive-") - add_compile_options("$<$:/utf-8>") - add_compile_options("$<$:/utf-8>") - add_compile_options("$<$:/EHsc>") - - string(REGEX REPLACE "\/bin\/Host(x|X)(64|86)\/x(64|86)\/cl\.exe" "" MSVC_ROOT "${CMAKE_CXX_COMPILER}") - # std.ixx - configure_file("${MSVC_ROOT}/modules/std.ixx" "${PROJECT_BINARY_DIR}/std.ixx" COPYONLY) - # std.compat.ixx - configure_file("${MSVC_ROOT}/modules/std.compat.ixx" "${PROJECT_BINARY_DIR}/std.compat.ixx" COPYONLY) - - add_library(std) - target_sources(std - PUBLIC - FILE_SET cxx_modules TYPE CXX_MODULES BASE_DIRS ${PROJECT_BINARY_DIR} - FILES ${PROJECT_BINARY_DIR}/std.ixx ${PROJECT_BINARY_DIR}/std.compat.ixx - ) -endif () - -set(homework_dir ${CMAKE_CURRENT_SOURCE_DIR}) -handle_homework(${homework_dir} targets_list run_targets_list) - -if (MSVC) - foreach (target ${targets_list}) - get_target_property(use_modules ${target} use_modules) - if(use_modules) - target_compile_options(${target} PRIVATE "/experimental:module") - set_target_properties(${target} PROPERTIES CXX_SCAN_FOR_MODULES ON) - target_link_libraries(${target} - PRIVATE - std - ) - endif(use_modules) - endforeach () -endif () - -add_custom_target(build_loser_homework) -if(targets_list) - add_dependencies(build_loser_homework ${targets_list}) -endif () - -add_custom_target(run_loser_homework) -if(run_targets_list) - add_dependencies(run_loser_homework ${run_targets_list}) -endif () diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/script/RunHomework.ps1" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/script/RunHomework.ps1" deleted file mode 100644 index 2052f24c..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/script/RunHomework.ps1" +++ /dev/null @@ -1,40 +0,0 @@ -[CmdletBinding()] -param ( - [Parameter(Mandatory=$true)] - [string]$Execution, - [Parameter(Mandatory=$true)] - [string]$OutputName, - [string]$ExecInput, - [Parameter(Mandatory=$true)] - [string]$CorrectExecOutput -) - -$OutputFile = "$OutputName.txt" -if (Test-Path $ExecInput) { -Start-Process -FilePath $Execution -Wait -RedirectStandardOutput $OutputFile -RedirectStandardInput $ExecInput -} else { -Start-Process -FilePath $Execution -Wait -RedirectStandardOutput $OutputFile -} - -if (-not (Test-Path -Path $OutputFile -PathType leaf)) { - Write-Output "output file not found" - exit 1 -} - -try { - $comparison = Compare-Object -ReferenceObject (Get-Content $CorrectExecOutput) -DifferenceObject (Get-Content $OutputFile) - if ($comparison.Count -eq 0) { - Write-Output "check result: same" - } else { - Write-Output "check result: diff" - Write-Host "Current Output:" - Get-Content -Path $OutputFile - Write-Host "Correct Output:" - Get-Content -Path $CorrectExecOutput - exit 1 - } -} -catch { - Write-Output "Error: $_" - exit 1 -} \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/script/run_homework.sh" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/script/run_homework.sh" deleted file mode 100644 index 8415065b..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/script/run_homework.sh" +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash - -function show_help_info { - echo "Usage: $0 [options] - -Options: - -e, --execution execution Run target execution (mandatory) - -o, --output-name output Output file name for run (mandatory) - -c, --correct-output Correct output for run (mandatory) - -i, --input Input for run - -h, --help Show this help info" -} - -function fail { - printf '%s\n' "$1" >&2 - exit "${2-1}" -} - -function get_opt_and_optarg { - local optional=false - - if [[ $1 == @optional ]]; then - optional=true - shift - fi - - OPT=$1 OPTARG= OPTSHIFT=0 - - if [[ $1 == -[!-]?* ]]; then - OPT=${1:0:2} OPTARG=${1:2} - elif [[ $1 == --*=* ]]; then - OPT=${1%%=*} OPTARG=${1#*=} - elif [[ ${2+.} && (${optional} == false || $2 != -?*) ]]; then - OPTARG=$2 OPTSHIFT=1 - elif [[ ${optional} == true ]]; then - return 1 - else - fail "No argument specified for '$1'." - fi - - return 0 -} - -function main { - local execution=() output_name=() input=() correct_output=() - - if [[ $# -eq 0 ]]; then - show_help_info - return 2 - fi - - while [[ $# -gt 0 ]]; do - case $1 in - -h|--help) - show_help_info - return 2 - ;; - -e|--execution) - get_opt_and_optarg "${@:1:2}" - execution=${OPTARG} - shift "${OPTSHIFT}" - ;; - -o|--output-name) - get_opt_and_optarg "${@:1:2}" - output_name=${OPTARG} - shift "${OPTSHIFT}" - ;; - -i|--input) - get_opt_and_optarg "${@:1:2}" - input=${OPTARG} - shift "${OPTSHIFT}" - ;; - -c|--correct-output) - get_opt_and_optarg "${@:1:2}" - correct_output=${OPTARG} - shift "${OPTSHIFT}" - ;; - -?*) - fail "Invalid option: $1" - ;; - esac - - shift - done - - if [ -z "$execution" ] || [ -z "$output_name" ] || [ -z "$correct_output" ]; then - show_help_info - return 2 - fi - - output_file="$output_name.txt" - if [ -f "$input" ]; then - $execution < "$input" > "$output_file" - else - $execution > "$output_file" - fi - - comparison=$(diff -q --strip-trailing-cr "$correct_output" "$output_file") - if [ "$comparison" == "" ]; then - echo "check result: same" - else - echo "check result: diff" - echo "Current Output:" - cat "$output_file" && echo "" - echo "Correct Output:" - cat "$correct_output" && echo "" - exit 1 - fi -} - -main "$@" \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/CPU\347\234\274\351\207\214\347\232\204\346\214\207\351\222\210.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/CPU\347\234\274\351\207\214\347\232\204\346\214\207\351\222\210.cpp" deleted file mode 100644 index 149f0d69..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/CPU\347\234\274\351\207\214\347\232\204\346\214\207\351\222\210.cpp" +++ /dev/null @@ -1,25 +0,0 @@ -//!msvc -/********************************************************************* - * Auther : yongheng - * Date : 2023/8/14 23:00 -*********************************************************************/ - -#include -#include -#include - -__attribute((constructor)) int func () { - std::cout << "1 4 9 " << std::endl; - exit(0); -} - -auto operator | (auto vec1,auto vec2) { - return vec1; -} - -int main(){ - std::vector v{1, 2, 3}; - std::function f {[](const int& i) {std::cout << i << ' '; } }; - auto f2 = [](int& i) {i *= i; }; - v | f2 | f; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/README.md" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/README.md" deleted file mode 100644 index 31e1a84e..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/README.md" +++ /dev/null @@ -1 +0,0 @@ -## 在此处提交文件 diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/Seedking.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/Seedking.cpp" deleted file mode 100644 index 973621eb..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/Seedking.cpp" +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include - -template -std::vector& operator|(std::vector &input, const F& func) { - for (auto& i : input) { - func(i); - } - return input; -} - -int main(){ - std::vector v{1, 2, 3}; - std::function f {[](const int& i) {std::cout << i << ' '; } }; - auto f2 = [](int& i) {i *= i; }; - v | f2 | f; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/SocialMean.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/SocialMean.cpp" deleted file mode 100644 index 25e7b69c..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/SocialMean.cpp" +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include -#include -#include - -std::vector& operator|(std::vector& v, - const std::function& f) { - std::for_each(std::begin(v), std::end(v), f); - return v; -} - -int main() { - std::vector v{1, 2, 3}; - std::function f{[](const int& i) { std::cout << i << ' '; }}; - auto f2 = [](int& i) { i *= i; }; - v | f2 | f; -} \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/TPPPP.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/TPPPP.cpp" deleted file mode 100644 index 5181fa17..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/TPPPP.cpp" +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include - -std::vector &operator|(std::vector &v, auto f) -{ - for (auto &i : v) - f(i); - return v; -} - -int main() -{ - std::vector v{1, 2, 3}; - std::function f{[](const int &i) - { std::cout << i << ' '; }}; - auto f2 = [](int &i) - { i *= i; }; - v | f2 | f; - return 0; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/Wgtteol.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/Wgtteol.cpp" deleted file mode 100644 index 5835aa57..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/Wgtteol.cpp" +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include -#include - -std::vector& operator| (std::vector& v, const auto& func) -{ - for (auto& val : v) - { - func(val); - } - return v; -} - -int main() -{ - std::vector v{1, 2, 3}; - std::function f{[](const int& i) { std::cout << i << ' '; }}; - auto f2 = [](int& i) { i *= i; }; - v | f2 | f; -} \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/andyli.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/andyli.cpp" deleted file mode 100644 index 98638e89..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/andyli.cpp" +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include -#include -#include - -template -auto operator|(R&& r, F&& f) { - for (auto&& x: r) - f(x); - return r; -} -int main() { - std::vector v{1, 2, 3}; - std::function f{[](const int& i) { std::cout << i << ' '; }}; - auto f2 = [](int& i) { i *= i; }; - v | f2 | f; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/fywc.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/fywc.cpp" deleted file mode 100644 index df82e7bf..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/fywc.cpp" +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include -#include -#include - - -std::vector& operator | (std::vector &v, const auto& f) -{ - for (auto& i: v) { - f(i); - } - return v; -} - -int main() { - std::vector v{1, 2, 3}; - std::function f{[](const int& i) { std::cout << i << ' '; }}; - auto f2 = [](int& i) { i *= i; }; - v | f2 | f; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/happyd0g.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/happyd0g.cpp" deleted file mode 100644 index 6feb5652..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/happyd0g.cpp" +++ /dev/null @@ -1,20 +0,0 @@ -//!all -#include -#include -#include -#include - -auto operator | (auto&& T t, auto&& F f) { - for(auto& item : T) { - f(item); - } - return t; -} - - -int main() { - std::vector v{1, 2, 3}; - std::function f{[](const int& i) { std::cout << i << ' '; }}; - auto f2 = [](int& i) { i *= i; }; - v | f2 | f; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/jacky.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/jacky.cpp" deleted file mode 100644 index a836cddf..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/jacky.cpp" +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include -#include - -template -auto&& operator|(Object&& obj, Operator opt) { - for(auto&& elon : std::forward(obj)){ - opt(std::forward(elon)); - } - return std::forward(obj); -} - -int main() { - std::vector v{1, 2, 3}; - std::function f{[](const int& i) { std::cout << i << ' '; }}; - auto f2 = [](int& i) { i *= i; }; - v | f2 | f; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/joe.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/joe.cpp" deleted file mode 100644 index 6419de00..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/joe.cpp" +++ /dev/null @@ -1,20 +0,0 @@ -#include -#include -#include - -std::vector& operator|(std::vector& v, auto&& func) -{ - for (int& x : v) - { - func(x); - } - return v; -} - -int main() -{ - std::vector v{1, 2, 3}; - std::function f{[](const int& i) { std::cout << i << ' '; }}; - auto f2 = [](int& i) { i *= i; }; - v | f2 | f; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/kkksc03.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/kkksc03.cpp" deleted file mode 100644 index 2e603b83..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/kkksc03.cpp" +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include -#include -#include -#include - -template -auto operator|(Range&& r, Function&& f) { - std::ranges::for_each(r, f); - return r; -} -int main() { - std::vector v{1, 2, 3}; - std::function f{[](const int& i) { std::cout << i << ' '; }}; - auto f2 = [](int& i) { i *= i; }; - v | f2 | f; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/loser_linker.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/loser_linker.cpp" deleted file mode 100644 index a0d8a17e..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/loser_linker.cpp" +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include -#include -#include - -template F> -std::vector& operator|(std::vector& vs, F const & f) { - std::ranges::for_each(vs, f); - - return vs; -} - -int main() { - std::vector v{1, 2, 3}; - - std::function f { [](int const & i) { std::cout << i << ' '; } }; - auto f2 = [](int& i) { i *= i; }; - - v | f2 | f; -} \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/love.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/love.cpp" deleted file mode 100644 index c8281ffb..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/love.cpp" +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include - -template -auto operator | (T v1, Func f) -{ - for (auto & i:v1) { f (i);} - return v1; -} - -int main() -{ - std::vector v { 1, 2, 3}; - std::function f { [](const int &i) { std::cout << i << ' '; } }; - auto f2 = [](int &i) { i *= i; }; - v | f2 | f; -} diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/mq\345\215\242\347\221\237.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/mq\345\215\242\347\221\237.cpp" deleted file mode 100644 index 9fa02235..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/mq\345\215\242\347\221\237.cpp" +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include -#include - -auto&& operator|(auto&& left, auto&& right) -{ - for (auto&& var : left) - right(var); - return left; -} - -int main() { - std::vector v{ 1, 2, 3 }; - std::function f{ [](const int& i) { std::cout << i << ' '; } }; - auto f2 = [](int& i) {i *= i; }; - v | f2 | f; -} \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/mq\346\227\245.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/mq\346\227\245.cpp" deleted file mode 100644 index d085e8a2..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/mq\346\227\245.cpp" +++ /dev/null @@ -1,21 +0,0 @@ -#include -#include -#include -#include -template -T& operator |(T&& v,const IT& f) -{ - for(auto&& x:v) - { - f(x); - } - return v; -} - -int main() -{ - std::vector v{1, 2, 3}; - std::function f{[](const int &i){ std::cout << i << ' '; }}; - auto f2 = [](int &i){ i *= i; }; - v | f2 | f; -} \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/mq\346\235\276\351\274\240.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/mq\346\235\276\351\274\240.cpp" deleted file mode 100644 index b99e2714..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/mq\346\235\276\351\274\240.cpp" +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include - -auto operator | (std::vector&& v,std::function f){ - for(auto&i:v){ - f(i); - } - return v; -} -auto operator | (std::vector& v,std::function f){ - for(auto&i:v){ - f(i); - } - return v; -} -int main(){ - std::vector v{1, 2, 3}; - std::function f {[](const int& i) {std::cout << i << '\n'; } }; - auto f2 = [](int& i) {i *= i; }; - v | f2 | f; -} \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/rhubarb1999.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/rhubarb1999.cpp" deleted file mode 100644 index a4d2ac41..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/rhubarb1999.cpp" +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include -#include - -template -std::vector &operator|(std::vector &v, F f) -{ - for (auto &i : v) - { - f(i); - } - return v; -} -int main() -{ - std::vector v{1, 2, 3}; - std::function f{[](const int &i) - { std::cout << i << ' '; }}; - auto f2 = [](int &i) - { i *= i; }; - v | f2 | f; -} \ No newline at end of file diff --git "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/zymelaii.cpp" "b/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/zymelaii.cpp" deleted file mode 100644 index c41c8d1b..00000000 --- "a/src/\347\276\244\345\217\213\346\217\220\344\272\244/\347\254\25401\351\242\230/zymelaii.cpp" +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include -#include - -namespace detail { - -template -struct element_type { - template - static constexpr auto check(int) -> typename G::value_type; - - template - static constexpr void check(...); - - using type = decltype(check(0)); -}; - -template -struct value_type_substituter; - -template