pax_global_header00006660000000000000000000000064150715017670014523gustar00rootroot0000000000000052 comment=f463f52648441c66182dcf9658aae77b9ed9fa17 ahocorasick_rs-1.0.3/000077500000000000000000000000001507150176700145165ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.dir-locals.el000066400000000000000000000000561507150176700171500ustar00rootroot00000000000000((python-mode . ((eval . (blacken-mode 1))))) ahocorasick_rs-1.0.3/.flake8000066400000000000000000000000701507150176700156660ustar00rootroot00000000000000[flake8] max-line-length = 88 extend-ignore = E203, W503ahocorasick_rs-1.0.3/.github/000077500000000000000000000000001507150176700160565ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.github/dependabot.yml000066400000000000000000000012201507150176700207010ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "cargo" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "daily" - package-ecosystem: "github-actions" directory: "/" schedule: # Check for updates to GitHub Actions every week interval: "weekly" ahocorasick_rs-1.0.3/.github/workflows/000077500000000000000000000000001507150176700201135ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.github/workflows/main.yml000066400000000000000000000057741507150176700215770ustar00rootroot00000000000000--- name: CI on: push: branches: ["main"] tags: - "*" pull_request: branches: ["main"] env: # Give nice tracebacks on segfaults. PYTHONFAULTHANDLER: "true" MATURIN_VERSION: "1.9.6" jobs: tests: name: "${{ matrix.os }}: Python ${{ matrix.python-version }}" strategy: matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"] os: ["ubuntu-latest", "macos-13", "windows-latest", "ubuntu-24.04-arm"] env: MATURIN_EXTRA: "" runs-on: "${{ matrix.os }}" steps: - uses: "actions/checkout@v5" with: # We need tags to get the correct code version: fetch-depth: 0 - uses: "actions/setup-python@v6" with: python-version: "${{ matrix.python-version }}" - uses: "dtolnay/rust-toolchain@stable" - name: "Compile" run: | pip install -r requirements-dev.txt pip install . - name: "Tests" run: | flake8 pysrc tests mypy --strict pysrc tests black --check pysrc tests pytest tests - name: "Enable universal2 on Python >= 3.9 on macOS" if: ${{ startsWith(matrix.os, 'macos') }} run: | rustup target add aarch64-apple-darwin echo "MATURIN_EXTRA=--target=universal2-apple-darwin" >> $GITHUB_ENV - name: "Wheels" uses: messense/maturin-action@v1 with: maturin-version: "${{ env.MATURIN_VERSION }}" command: build manylinux: auto args: --release --out target/wheels/ -i python${{ matrix.python-version }} ${{ env.MATURIN_EXTRA }} - name: "sdist" if: ${{ matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13' }} # MUST MATCH BELOW run: | pip install maturin==${{ env.MATURIN_VERSION }} maturin sdist - name: Archive production artifacts uses: actions/upload-artifact@v4 with: name: "Wheels-${{ matrix.python-version}}-${{ matrix.os }}" path: target/wheels/*.whl - name: Archive production artifacts 2 if: ${{ matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13' }} # MUST MATCH ABOVE uses: actions/upload-artifact@v4 with: name: "Wheels-tarball" path: target/wheels/ahocorasick*.tar.gz publish: needs: ['tests'] environment: 'release' runs-on: ubuntu-latest permissions: # IMPORTANT: this permission is mandatory for trusted publishing id-token: write steps: - uses: actions/download-artifact@v5 with: pattern: Wheels* merge-multiple: true path: dist/ - run: | # Remove badly named wheels: rm dist/*-linux_*.whl # Show what's left: ls -R dist/ - name: Publish package distributions to PyPI (if tagged) uses: pypa/gh-action-pypi-publish@release/v1 if: startsWith(github.ref, 'refs/tags/') with: packages_dir: dist/ ahocorasick_rs-1.0.3/.gitignore000066400000000000000000000004001507150176700165000ustar00rootroot00000000000000# Generated by Cargo # will have compiled files and executables /target/ # These are backup files generated by rustfmt **/*.rs.bk # Virtual environment: /venv/ # Python bytecode files: *.pyc *.pyd # Generated by Pytest /.pytest_cache/ # Emacs junk: *~ahocorasick_rs-1.0.3/.hypothesis/000077500000000000000000000000001507150176700167735ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/000077500000000000000000000000001507150176700206115ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/098667f9ae029f55/000077500000000000000000000000001507150176700227145ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/098667f9ae029f55/b9fc09fff40c6832000066400000000000000000000000141507150176700251420ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/0a3a13c375cbef58/000077500000000000000000000000001507150176700231005ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/0a3a13c375cbef58/5d0ee50bbc9e81ca000066400000000000000000000000151507150176700254500ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/103600e47f6e6c10/000077500000000000000000000000001507150176700226555ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/103600e47f6e6c10/7ef3a58363360a70000066400000000000000000000000151507150176700246530ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/1d47f825b95ef0c4/000077500000000000000000000000001507150176700230375ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/1d47f825b95ef0c4/106f0f267bad0256000066400000000000000000000000221507150176700251010ustar00rootroot00000000000000���ahocorasick_rs-1.0.3/.hypothesis/examples/1d525299ac17004b/000077500000000000000000000000001507150176700226575ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/1d525299ac17004b/2f5427605d3e198d000066400000000000000000000000111507150176700246600ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/1d525299ac17004b/9a3c1667a531b1ac000066400000000000000000000000061507150176700250020ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/1d525299ac17004b/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700255410ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/2568bb2bb8962727/000077500000000000000000000000001507150176700227005ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/2568bb2bb8962727/b9fc09fff40c6832000066400000000000000000000000141507150176700251260ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/2813a5e94c6b3fc8/000077500000000000000000000000001507150176700230355ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/2813a5e94c6b3fc8/35ad336a2a6fdfd2000066400000000000000000000000151507150176700253240ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/2be72fd93c3bfc88/000077500000000000000000000000001507150176700232015ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/2be72fd93c3bfc88/b9fc09fff40c6832000066400000000000000000000000141507150176700254270ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/2c39b0652528389a/000077500000000000000000000000001507150176700226145ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/2c39b0652528389a/20a2763cdf3874b1000066400000000000000000000000071507150176700246660ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/30c35e01a9722884/000077500000000000000000000000001507150176700226055ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/30c35e01a9722884/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700254670ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/3bb842c8650c896a/000077500000000000000000000000001507150176700227565ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/3bb842c8650c896a/b7cf276e1892438c000066400000000000000000000000071507150176700250510ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/474f3ad49262d3ec/000077500000000000000000000000001507150176700230335ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/474f3ad49262d3ec/2f5427605d3e198d000066400000000000000000000000111507150176700250340ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/4b6d35316b9dfb2c/000077500000000000000000000000001507150176700231065ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/4b6d35316b9dfb2c/3192aedc13e9fb94000066400000000000000000000000061507150176700253270ustar00rootroot00000000000000>ahocorasick_rs-1.0.3/.hypothesis/examples/4b6d35316b9dfb2c/69dca6a561a1acfd000066400000000000000000000000111507150176700254520ustar00rootroot00000000000000çahocorasick_rs-1.0.3/.hypothesis/examples/4b6d35316b9dfb2c/85c0272697d6fd5e000066400000000000000000000000131507150176700252010ustar00rootroot00000000000000IÏahocorasick_rs-1.0.3/.hypothesis/examples/4b6d35316b9dfb2c/b1d05b1a4f5d57d8000066400000000000000000000000651507150176700253240ustar00rootroot00000000000000„ëwŽ ­'Ì '’ò-y1ahocorasick_rs-1.0.3/.hypothesis/examples/4b6d35316b9dfb2c/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700257700ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/4d7f7d596155940a/000077500000000000000000000000001507150176700227055ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/4d7f7d596155940a/9a3c1667a531b1ac000066400000000000000000000000061507150176700250300ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/4e607744a84e246b/000077500000000000000000000000001507150176700226755ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/4e607744a84e246b/2f5427605d3e198d000066400000000000000000000000111507150176700246760ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/531cc7355cff42c2/000077500000000000000000000000001507150176700230255ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/531cc7355cff42c2/9a3c1667a531b1ac000066400000000000000000000000061507150176700251500ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/532a94be90c9efd0/000077500000000000000000000000001507150176700231135ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/532a94be90c9efd0/b8231a7f06bee7f9000066400000000000000000000000151507150176700253370ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/532a94be90c9efd0/de2f4e902ceb702d000066400000000000000000000000211507150176700254020ustar00rootroot00000000000000ÊúÊúahocorasick_rs-1.0.3/.hypothesis/examples/532a94be90c9efd0/ffd3c03363776c1f000066400000000000000000000000151507150176700252540ustar00rootroot00000000000000ÊúÊúahocorasick_rs-1.0.3/.hypothesis/examples/55c0f1b47133aa5d/000077500000000000000000000000001507150176700230135ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/55c0f1b47133aa5d/20a2763cdf3874b1000066400000000000000000000000071507150176700250650ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/55c0f1b47133aa5d/576822a319690cfa000066400000000000000000000000171507150176700250200ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/5841fbe83c75a177/000077500000000000000000000000001507150176700227615ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/5841fbe83c75a177/085f80daee6d089f000066400000000000000000000000111507150176700252060ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/5841fbe83c75a177/96784e8d40b82570000066400000000000000000000000111507150176700247120ustar00rootroot00000000000000  ahocorasick_rs-1.0.3/.hypothesis/examples/5841fbe83c75a177/975b2cb9b044b541000066400000000000000000000000131507150176700250320ustar00rootroot00000000000000  ahocorasick_rs-1.0.3/.hypothesis/examples/6007eaac0644fd1b/000077500000000000000000000000001507150176700230725ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/6007eaac0644fd1b/7ef3a58363360a70000066400000000000000000000000151507150176700250700ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/610f0d49a7f18187/000077500000000000000000000000001507150176700226755ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/610f0d49a7f18187/015ec5d979c41511000066400000000000000000000000211507150176700246670ustar00rootroot00000000000000~—~ahocorasick_rs-1.0.3/.hypothesis/examples/610f0d49a7f18187/085f80daee6d089f000066400000000000000000000000111507150176700251220ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/610f0d49a7f18187/93fd353b208e5ead000066400000000000000000000000111507150176700251100ustar00rootroot00000000000000——ahocorasick_rs-1.0.3/.hypothesis/examples/65c7e04feb03f2b7/000077500000000000000000000000001507150176700231075ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/65c7e04feb03f2b7/9a3c1667a531b1ac000066400000000000000000000000061507150176700252320ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/65c7e04feb03f2b7/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700257710ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/685581859d09127c/000077500000000000000000000000001507150176700225515ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/685581859d09127c/b9fc09fff40c6832000066400000000000000000000000141507150176700247770ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/71164d28d9652154/000077500000000000000000000000001507150176700225355ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/71164d28d9652154/9a3c1667a531b1ac000066400000000000000000000000061507150176700246600ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/8198d84e326634dc/000077500000000000000000000000001507150176700227065ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/8198d84e326634dc/576822a319690cfa000066400000000000000000000000171507150176700247130ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/000077500000000000000000000000001507150176700231135ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/03dbd1ea1be639b7000066400000000000000000000000271507150176700254030ustar00rootroot00000000000000´kHHÎahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/1fd86b90f6bbea95000066400000000000000000000000761507150176700254300ustar00rootroot00000000000000´kHyK_ìž>Hθ¼àßahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/257652cbe85ac09a000066400000000000000000000001211507150176700252470ustar00rootroot00000000000000´kHyK_ìž>Hθ¼àß�¾ø6å�ahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/27b9d366cd0f55da000066400000000000000000000000241507150176700253340ustar00rootroot00000000000000´HHÎahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/2c81b700510fb88e000066400000000000000000000000571507150176700251710ustar00rootroot00000000000000´kHyK_ìž>Hθahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/3e88606e87e29819000066400000000000000000000001071507150176700250650ustar00rootroot00000000000000´kHyK_ìž>Hθ¼àß�¾ø6ahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/42cc1e1b7ee552b3000066400000000000000000000000171507150176700253220ustar00rootroot00000000000000Îahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/4dbdf3ffa933d826000066400000000000000000000000241507150176700254200ustar00rootroot00000000000000HHδahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/5ffd6c3d14f086fd000066400000000000000000000000171507150176700254230ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/706826b5897c8f21000066400000000000000000000002171507150176700250550ustar00rootroot00000000000000´kHyK_ìž>Hθ¼àßÈðGV㎦Ðö�¾ ø6å�ahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/804d8ecdedfea816000066400000000000000000000001141507150176700255010ustar00rootroot00000000000000´kHyK_ìž>Hθ¼àß�¾ø6åahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/93f9de22a832f630000066400000000000000000000000421507150176700251760ustar00rootroot00000000000000´kHyK_HÎahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/9af922df7ed31887000066400000000000000000000010311507150176700252720ustar00rootroot00000000000000jÔ5ÝÎNÁ®Ù ];àzTØñ9š]€†Ømú/Æi‹ ãÔ‚cØ›wÛüHËû�“É "Ýñ‚ÄSwÈŽ´ÓÂ. ÎL ¼ø!z»ÅuÿÂáÙ�ZC½gÅÒbmÎ�R  Õbuþ>æ_,–ù�! ô4�„ Âd=.<Dc\çE´?Tiahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/a72db87782dbdd7c000066400000000000000000000000641507150176700254250ustar00rootroot00000000000000´kHyK_ìž>Hθahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/aa9286fee73e0130000066400000000000000000000000351507150176700252510ustar00rootroot00000000000000´kHyHÎahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/b105d4471d0d7757000066400000000000000000000000301507150176700251040ustar00rootroot00000000000000´kHHÎahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/c8e87fefbd74d073000066400000000000000000000000511507150176700254300ustar00rootroot00000000000000´kHyK_ìž>HÎahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/e154e84c6030c3e3000066400000000000000000000000711507150176700251650ustar00rootroot00000000000000´kHyK_ìž>Hθ¼àahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/f3250b332e873f95000066400000000000000000000011651507150176700251250ustar00rootroot00000000000000•‡ÿÈ> í}¨º¾YÔÚqß2 ´²Ýç™wË£S Ìö8º$j×a”z�o[ŽÐ‹Kþ-­ ^ã1¸€B#;Ax+R|¢¾|âc¿¾Ã ôn<ß’ ™Ã«ªU¶&~5rùÞ5‡1å BíH{êP7þzìB¾ÈW�0ÆC×eOOV0ÂÄ1ûûÎD{ ×-ç)C•ÓÉ7Qysj< jÁJahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/fa791b5038e8176b000066400000000000000000000000241507150176700252000ustar00rootroot00000000000000δahocorasick_rs-1.0.3/.hypothesis/examples/8b486cb1c1c9d7c3/fc8970907eab2821000066400000000000000000000000241507150176700251770ustar00rootroot00000000000000H´HÎahocorasick_rs-1.0.3/.hypothesis/examples/8c20b63c7c3ee2a0/000077500000000000000000000000001507150176700230755ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/8c20b63c7c3ee2a0/2f5427605d3e198d000066400000000000000000000000111507150176700250760ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/8c20b63c7c3ee2a0/9a3c1667a531b1ac000066400000000000000000000000061507150176700252200ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/8c20b63c7c3ee2a0/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700257570ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/926adf2f773b1de7/000077500000000000000000000000001507150176700231205ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/926adf2f773b1de7/9a3c1667a531b1ac000066400000000000000000000000061507150176700252430ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/95fbd6c8090ecb40/000077500000000000000000000000001507150176700231125ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/95fbd6c8090ecb40/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700257740ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/95fbd6c8090ecb40/dc11c3cd8814f97f000066400000000000000000000000301507150176700253340ustar00rootroot00000000000000‡?Ãahocorasick_rs-1.0.3/.hypothesis/examples/988fff622301a798/000077500000000000000000000000001507150176700227125ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/988fff622301a798/86b12aeace201491000066400000000000000000000000071507150176700250340ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/a9e8fc16f19e74e6/000077500000000000000000000000001507150176700231325ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/a9e8fc16f19e74e6/7ef3a58363360a70000066400000000000000000000000151507150176700251300ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/aa9db1092bd86c43/000077500000000000000000000000001507150176700231035ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/aa9db1092bd86c43/b7cf276e1892438c000066400000000000000000000000071507150176700251760ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/b37a28bfb88d7d9a/000077500000000000000000000000001507150176700232025ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/b37a28bfb88d7d9a/0d491ebeb6bcc34b000066400000000000000000000000221507150176700255450ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/b37a28bfb88d7d9a/7abd2938b62a02d9000066400000000000000000000000061507150176700253360ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/000077500000000000000000000000001507150176700231555ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/0177d68629a250d2000066400000000000000000000001721507150176700250770ustar00rootroot00000000000000u#kÔâ`TX(L)efyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/01b54b15d9a07068000066400000000000000000000001721507150176700251460ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/03956bbc3766c954000066400000000000000000000001721507150176700251700ustar00rootroot00000000000000(ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/067eba0845c322e4000066400000000000000000000001721507150176700252300ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS” lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/07d30c4eb84ebd4e000066400000000000000000000001721507150176700254530ustar00rootroot00000000000000kÔu#â`TXf(L)exyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/07f796be4f588af3000066400000000000000000000006131507150176700253420ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX}ÿvyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/0c43396e134ee9fb000066400000000000000000000001721507150176700253230ustar00rootroot00000000000000(L)eu#ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/0d29ef12eefcf809000066400000000000000000000006751507150176700254760ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TXFF-)n/7LQ}vyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/0d4e798748e5cc8e000066400000000000000000000001721507150176700253440ustar00rootroot00000000000000(L)eu#kÔ lfyahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/0e9ec5dff9307e96000066400000000000000000000001721507150176700254210ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS”l 28HQZâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/0f1f15f5b8ede345000066400000000000000000000005311507150176700254000ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX@\3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/0fb431a3c544ce84000066400000000000000000000003261507150176700253100ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l I12QZH8â`TXa¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/126987fc98ea6e11000066400000000000000000000010411507150176700252510ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)e&B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/16bc7c33ee123306000066400000000000000000000001721507150176700252240ustar00rootroot00000000000000(L)eu#kÔahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/1896ddab0028d900000066400000000000000000000001721507150176700252310ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/1a888029a24ea0f0000066400000000000000000000001721507150176700252270ustar00rootroot00000000000000(L)eu#kÔ lfahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/1cd994246de2482e000066400000000000000000000001721507150176700252470ustar00rootroot00000000000000u#kÔâ`TX(L)e lfyYS”[\â`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/21187f3d9d4b4e29000066400000000000000000000002161507150176700252450ustar00rootroot00000000000000kÔu#â`TXf(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/2560057989e08e69000066400000000000000000000002271507150176700250440ustar00rootroot00000000000000kÔu#â`TXfQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/25f44600c94a1487000066400000000000000000000001721507150176700250770ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/268ad355294bc47b000066400000000000000000000001721507150176700252420ustar00rootroot00000000000000(L)eu#kÔahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/271adeb1379d1cae000066400000000000000000000003071507150176700254470ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)ex"Fy&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/27e801a6bd73ddbe000066400000000000000000000010601507150176700254510ustar00rootroot00000000000000kÔu#â`TXâ`TXewc)t=sylZ&tN¢LæxQ(L)e&B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/28c2c60b60d80c44000066400000000000000000000001721507150176700252260ustar00rootroot00000000000000(Lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/28e06a4cfa0bb44c000066400000000000000000000001721507150176700254420ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/2976ddfed56ce9e7000066400000000000000000000001721507150176700255060ustar00rootroot00000000000000(L)eu#kÔahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/2a5a1e5c2bd5cc58000066400000000000000000000001721507150176700254460ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS”l 8Qâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/2a6aa56b7749c0d6000066400000000000000000000001721507150176700253170ustar00rootroot00000000000000(L)eu#kÔ lfyYS”[\ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/2c10a3d4638d385a000066400000000000000000000001721507150176700252270ustar00rootroot00000000000000(L)eu#kÔ lfyYahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/2d136aae1b5d8d24000066400000000000000000000007331507150176700253670ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/2d682aea966ca604000066400000000000000000000001721507150176700253170ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/2e7e15be1985078b000066400000000000000000000001721507150176700252470ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/2f4b5fc09b1f86f1000066400000000000000000000002351507150176700254020ustar00rootroot00000000000000kÔu#â`TXLæxQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/374834a15b44218b000066400000000000000000000001721507150176700250720ustar00rootroot00000000000000(L)eu#kÔahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/3b2cea508b34bb08000066400000000000000000000001721507150176700253610ustar00rootroot00000000000000(L)eu#kÔ lfahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/3baeb1956c34aee1000066400000000000000000000001721507150176700254470ustar00rootroot00000000000000kÔu#â`TXf(L)exyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/3d962243d92efbc7000066400000000000000000000003601507150176700253250ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{n|•ŽzH2QZH8â`TXa¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/3e1c0348fea72710000066400000000000000000000001721507150176700252270ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/3fd6662bdecdecbd000066400000000000000000000007521507150176700257040ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/41ab07b2a9d8d1a9000066400000000000000000000003461507150176700253720ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{•ŽzH2QZH8â`TXa¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/4542993ba8a02a20000066400000000000000000000001721507150176700251440ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/470433663ef83e68000066400000000000000000000001721507150176700251140ustar00rootroot00000000000000(L)ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/4785ef3b5b58e6d4000066400000000000000000000001721507150176700253360ustar00rootroot00000000000000(L)eu#kÔ lfyYS”[\ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/48680677320d7b9b000066400000000000000000000001721507150176700251120ustar00rootroot00000000000000kÔu#â`TXf(L)exyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/4ac080ba2b048217000066400000000000000000000001721507150176700252140ustar00rootroot00000000000000(L)eu#kÔahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/4bdd0438fab1df21000066400000000000000000000010461507150176700254440ustar00rootroot00000000000000kÔu#â`TXâ`TtsN¢LæxQ(L)e&B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/4c61092412ba4d5b000066400000000000000000000001721507150176700252210ustar00rootroot00000000000000(L)eu#kÔ lfahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/4caf1bf13e1504e1000066400000000000000000000003041507150176700253540ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)ex"Fy&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/4f10c2d25be0bc0c000066400000000000000000000002051507150176700254260ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/4fc27f897bceb19c000066400000000000000000000001721507150176700254740ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS”l 2QZ8Hâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/51c9f3fcb0d77288000066400000000000000000000001721507150176700253310ustar00rootroot00000000000000(Lâ`TX)eu#kÔ lfyYS”[\â`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/51d7e5b9f440f4f6000066400000000000000000000001721507150176700253310ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/521bf0e2ee71802e000066400000000000000000000002241507150176700253050ustar00rootroot00000000000000kÔu#â`TXfQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/5239d95f02961f1b000066400000000000000000000001721507150176700251650ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS” lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/538db829019c1051000066400000000000000000000001721507150176700250740ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/54435ff5939808d9000066400000000000000000000002621507150176700251270ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/57b4bacffae16f6f000066400000000000000000000006441507150176700256260ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TXn/7LQ}vyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/581d9e7092b8c9da000066400000000000000000000001721507150176700253340ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/59e9601b2c922401000066400000000000000000000001721507150176700250730ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/5ad8d6d44d35f205000066400000000000000000000003121507150176700253140ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHx"Fy&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/5d6b54898a78a1d6000066400000000000000000000001721507150176700252560ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS”l Q8â`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/5e9c889823c2e910000066400000000000000000000010531507150176700251760ustar00rootroot00000000000000kÔu#â`TXâ`TXtsN¢LæxQ(L)e&B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/5ec2c561a8c2a412000066400000000000000000000003151507150176700253020ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/5ed6e8d4756470ca000066400000000000000000000007261507150176700253360ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+MÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/5f9bfd09f4bf3673000066400000000000000000000003231507150176700254130ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l I12QZH8â`TXa¤ß&ofžahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/5ff95820f96a4d6d000066400000000000000000000001721507150176700253400ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/605ca0d32893cff8000066400000000000000000000001721507150176700253220ustar00rootroot00000000000000(L)eu#kÔ lfahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/620333c499bc9d6e000066400000000000000000000010271507150176700252460ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)e&B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/6320669a19915f50000066400000000000000000000001721507150176700250240ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/660047d21cc6f890000066400000000000000000000001721507150176700251600ustar00rootroot00000000000000(L)eu#kÔahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/6606243ed2c80689000066400000000000000000000001721507150176700251070ustar00rootroot00000000000000(L)eahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/66f4ce7db75db47f000066400000000000000000000001721507150176700254750ustar00rootroot00000000000000kÔu#â`TXf(L)exyY[\S” lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/678d9fb8df5a7269000066400000000000000000000001721507150176700253510ustar00rootroot00000000000000(LT)eu#kÔ lfyYS”[\Tahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/679708e753d6877b000066400000000000000000000007021507150176700251310ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�R6F-)n/7LQ}vyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/68b30bd01e5e5aa8000066400000000000000000000001721507150176700253670ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/68e610d479fbdbfc000066400000000000000000000010341507150176700254660ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)e&B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/6d1053ab5d4129d6000066400000000000000000000001721507150176700252300ustar00rootroot00000000000000(L)ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/6d5e90fd55876d97000066400000000000000000000001721507150176700252710ustar00rootroot00000000000000(L)eu#kÔ lfyYS”[\ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/6e07df3db5202d6c000066400000000000000000000001721507150176700253720ustar00rootroot00000000000000(L)eu#kÔ lfyYSahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/6e196a47766630ec000066400000000000000000000003531507150176700251730ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{2QZH8â`TXa¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/6ecbcfcb2efd29e2000066400000000000000000000001721507150176700257000ustar00rootroot00000000000000(LTX)eu#kÔ lfyYS”[\TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/6f4ea5bdd2d604de000066400000000000000000000001721507150176700255350ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS”l â`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/6fee491d447fe9b0000066400000000000000000000001721507150176700254140ustar00rootroot00000000000000(L)eu#kÔ lfahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/72175f656a0469e2000066400000000000000000000007761507150176700251210ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)en|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/725a5e30d9ea7b64000066400000000000000000000003651507150176700253250ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TXa¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/7b531d1cae24e0dc000066400000000000000000000007211507150176700254410ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/850b0322e69396dc000066400000000000000000000001721507150176700251620ustar00rootroot00000000000000(L)eu#kahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/870fa29ca2a8f953000066400000000000000000000001721507150176700253260ustar00rootroot00000000000000u#kÔâ`TX(L)e lfyYS”[\â`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/8769d0cf091611e5000066400000000000000000000011301507150176700251610ustar00rootroot00000000000000kÔu#â`TXâ`TXewc)t=së|ÿy&lÌZŒ&%tøOS}ÿ`|ÿG~w-+w`¸1³h AN¢Læuø:/Qp¨Lhx�?©uå~y&0;B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwL`Mahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/8804ca608696ce31000066400000000000000000000001721507150176700251660ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/881fbabdd360106b000066400000000000000000000001721507150176700253650ustar00rootroot00000000000000(Lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/8af6fa92e1a1912e000066400000000000000000000002431507150176700253760ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/8bb131dc5894f8a3000066400000000000000000000003321507150176700253210ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbI12QZH8â`TXa¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/8cbeec41ecf89527000066400000000000000000000002461507150176700254750ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/8d4e1df5e61952e2000066400000000000000000000001721507150176700253270ustar00rootroot00000000000000kÔu#â`TXf(L)exy[\YS” lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/9089c8ef8a4e98ff000066400000000000000000000001721507150176700254360ustar00rootroot00000000000000(L)eu#kÔahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/926546b3b5de2c9b000066400000000000000000000007571507150176700253350ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`mjA}M'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/939779434b2ae9d8000066400000000000000000000006511507150176700252070ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX)/7LQ}ÿvyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/99097d190cdc3e48000066400000000000000000000002401507150176700252510ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/9be3d8eefa7a37ec000066400000000000000000000001721507150176700256310ustar00rootroot00000000000000(L)eahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/9d0a5f5cb4e75099000066400000000000000000000001721507150176700253310ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/9fd12954ded96707000066400000000000000000000001721507150176700252610ustar00rootroot00000000000000(L)eu#kÔ lfyYS”[\ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a18a179058246fbb000066400000000000000000000001721507150176700252360ustar00rootroot00000000000000(L`TX)eu#kÔ lfyYS”[\`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a1bf9818a7592102000066400000000000000000000001721507150176700251560ustar00rootroot00000000000000(L)eu#kÔ lfahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a3e44152a46aced5000066400000000000000000000001721507150176700253650ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS” lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a452ca624d1fc774000066400000000000000000000010651507150176700253150ustar00rootroot00000000000000kÔu#â`TXâ`TXewc)t=së|ÿy&lÌZŒ&%tøOS AN¢Læuø:/Qp¨Lhx�?©uå~y&0;B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a4b962e0c4f0a600000066400000000000000000000001721507150176700253000ustar00rootroot00000000000000ukÔ#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a4bdbb6aac168ab8000066400000000000000000000010771507150176700256100ustar00rootroot00000000000000kÔu#â`TXâ`TXewc)t=së|ÿy&lÌZŒ&%tøOS}ÿ`|ÿ AN¢Læuø:/Qp¨Lhx�?©uå~y&0;B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a4d79e5e3802c38b000066400000000000000000000002321507150176700253210ustar00rootroot00000000000000kÔu#â`TXfQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a6c14f5a15524471000066400000000000000000000001721507150176700251470ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS”l 2Q8â`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a755ae73560ca719000066400000000000000000000001721507150176700252410ustar00rootroot00000000000000(ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a7bc368368f22d47000066400000000000000000000001721507150176700252470ustar00rootroot00000000000000(ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/a924656fb567e3d7000066400000000000000000000001721507150176700252550ustar00rootroot00000000000000kÔu#â`TXf(L)exyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/ad7d16bae7a7be71000066400000000000000000000001721507150176700255340ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS”l 2QZH8â`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/ad93b10a76e3ead3000066400000000000000000000007071507150176700254520ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©n/7LQ}vyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/ae5329e36edc1ae9000066400000000000000000000002731507150176700254640ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/af89c8326ac1fed4000066400000000000000000000001721507150176700254650ustar00rootroot00000000000000(L)eu#kÔ lfyYS”ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b02d427a8370b9cf000066400000000000000000000011041507150176700253070ustar00rootroot00000000000000kÔu#â`TXâ`TXewc)t=së|ÿy&lÌZŒ&%tøOS}ÿ`|ÿG~ AN¢Læuø:/Qp¨Lhx�?©uå~y&0;B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b09960152935659e000066400000000000000000000001721507150176700250330ustar00rootroot00000000000000(L)eu#kÔ lfyYS”[\ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b107e531390eb560000066400000000000000000000007711507150176700251520ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)en|ÿ hbHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b3171ac2a936e6a6000066400000000000000000000002651507150176700253130ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b473a6eeb47088bb000066400000000000000000000010221507150176700253740ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)e&B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b4efec1fcdf271b3000066400000000000000000000006561507150176700256220ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TXF-)n/7LQ}vyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b5a17efd4c485034000066400000000000000000000001721507150176700253150ustar00rootroot00000000000000(L)eu#kÔ lfyYS”[ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b767c67b421b0e02000066400000000000000000000001721507150176700252270ustar00rootroot00000000000000(L)eu#kÔ ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b888cd5581985a53000066400000000000000000000002571507150176700252060ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l I2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/b8915593a4b16210000066400000000000000000000001721507150176700250720ustar00rootroot00000000000000kÔu#â`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/bcd4ea91f64f45e0000066400000000000000000000003361507150176700254620ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³I+1{2QZH8â`TXa¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/beece8b45ba9555b000066400000000000000000000001721507150176700255430ustar00rootroot00000000000000kÔu#â`TXf(L)exy\[YS”l â`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/c37960c6fef8b6ef000066400000000000000000000003421507150176700254770ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{•ŽzH2QZH8â`TXa¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/c5c76b425d103b77000066400000000000000000000001721507150176700252340ustar00rootroot00000000000000(Lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/c64cf532c8e02656000066400000000000000000000011111507150176700252340ustar00rootroot00000000000000kÔu#â`TXâ`TXewc)t=së|ÿy&lÌZŒ&%tøOS}ÿ`|ÿG~w-+ AN¢Læuø:/Qp¨Lhx�?©uå~y&0;B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/c92c21eb8541cb06000066400000000000000000000002511507150176700253050ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/cb02ea91510ac757000066400000000000000000000011161507150176700253020ustar00rootroot00000000000000kÔu#â`TXâ`TXewc)t=së|ÿy&lÌZŒ&%tøOS}ÿ`|ÿG~w-+w`¸h AN¢Læuø:/Qp¨Lhx�?©uå~y&0;B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/cb74a005c514304f000066400000000000000000000001721507150176700252170ustar00rootroot00000000000000(L)eu#kÔ lfahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/cd37ad8a4cf0164c000066400000000000000000000002101507150176700254420ustar00rootroot00000000000000kÔu#â`TXf(L)exyHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/ce1c5627ff6c8f83000066400000000000000000000001721507150176700254150ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/ce8eccdc1b344d06000066400000000000000000000002131507150176700255250ustar00rootroot00000000000000kÔu#â`TXf(L)exy&¶Hî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/cec33827aae33bc1000066400000000000000000000006701507150176700254470ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TXF-)n/7LQ}vyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/d2245c685dbee343000066400000000000000000000002701507150176700253170ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/d435fcfe465c80da000066400000000000000000000001721507150176700254620ustar00rootroot00000000000000(L)euahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/d59014abaaaa8ed3000066400000000000000000000001721507150176700255210ustar00rootroot00000000000000(ahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/d5e39c9c3b9aa005000066400000000000000000000002761507150176700254020ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)ex"y&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/d6f919ffd84d5632000066400000000000000000000001721507150176700253420ustar00rootroot00000000000000(Lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/d7437f7de19b0b3d000066400000000000000000000011231507150176700254000ustar00rootroot00000000000000kÔu#â`TXâ`TXewc)t=së|ÿy&lÌZŒ&%tøOS}ÿ`|ÿG~w-+w`¸1³h AN¢Læuø:/Qp¨Lhx�?©uå~y&0;B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/d9b416acb2a36aa3000066400000000000000000000001721507150176700254400ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/dbfa8cd63ba0fdc6000066400000000000000000000003201507150176700256650ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l I12QZH8â`TXa¤ß&oahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/de9c5016bcdc84ed000066400000000000000000000001721507150176700255410ustar00rootroot00000000000000(L)eu#kÔahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/e21a67e79e81afe6000066400000000000000000000007401507150176700254130ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%MÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/e332a967d1f276dc000066400000000000000000000001721507150176700253240ustar00rootroot00000000000000u#kÔâ`TX(Lf)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/e3a96d1527f32a1e000066400000000000000000000001721507150176700253140ustar00rootroot00000000000000(L)eu#kÔ lfyahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/e64baeb9755e0709000066400000000000000000000001721507150176700253270ustar00rootroot00000000000000(L)eu#kÔ lahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/e6ecdfb0d0ae2cf6000066400000000000000000000001721507150176700256710ustar00rootroot00000000000000(L)eu#kÔ lfyahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/e6fc8186155e436b000066400000000000000000000007141507150176700252530ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/e8b83b118dc800e3000066400000000000000000000001721507150176700253140ustar00rootroot00000000000000kÔu#â`TXf(L)exyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/eab4e27dbc73e7c1000066400000000000000000000002211507150176700255270ustar00rootroot00000000000000kÔu#â`TXfQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/ecd283b516d3cf08000066400000000000000000000010101507150176700253660ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)e&B9Òn|Rçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f09fcff4c3c79f30000066400000000000000000000007641507150176700255000ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f145e87fdd592b5c000066400000000000000000000001721507150176700254130ustar00rootroot00000000000000u#kÔâ`TXf(L)eyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f267d9b2de7f1710000066400000000000000000000002541507150176700253250ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)exy&¶GHî\[YS”l 2QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f336797b45042c1c000066400000000000000000000010031507150176700251520ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)e&n|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f37165b75c8ca194000066400000000000000000000010721507150176700252460ustar00rootroot00000000000000kÔu#â`TXâ`TXewc)t=së|ÿy&lÌZŒ&%tøOS}ÿ` AN¢Læuø:/Qp¨Lhx�?©uå~y&0;B9Ò5{s&Yº õZŽnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f553c54830aac3ed000066400000000000000000000001721507150176700253720ustar00rootroot00000000000000kÔu#â`TXf(L)exyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f705f931f7d14b0b000066400000000000000000000010151507150176700253130ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)e&B9Ò5Y ZnÒ|ÿRçá Qh:b�wHkx8ø8e¢Fay„&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`zþb`IHVmj’Aª}ÿM'Â2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f74b1b2ffedee15a000066400000000000000000000001721507150176700256150ustar00rootroot00000000000000(L)eu#kÔahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f800d5caee861aa9000066400000000000000000000007451507150176700254640ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TX Ø$ºF�@áNR 6&ø$ÆB-©q.ÖnA±G/¦7aLÞÚQ}ÿvyhNAµ4]rí;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎ6Ÿ\B‰TºLJÌ+SQ%`MÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/f97c452d4cc31d08000066400000000000000000000003011507150176700253130ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)ex"Fy&¶GHî\[YS”l I12QZH8â`TXa¤ßahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/fbf0933bb2b77aef000066400000000000000000000001721507150176700255360ustar00rootroot00000000000000u#kÔâ`TX(L)efyYS”[\ lâ`TXahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/fc7e3489eb8ca192000066400000000000000000000006631507150176700254200ustar00rootroot00000000000000kÔu#â`TXN¢LæxQ(L)eHxx"Fy&¶GHî\[YS”l SîbC³whuI+1{=‡gŸ?nù|ÿ•ŽzH2QZH8â`TXn/7LQ}ÿvyhNAµr;œDz) ®4 Í|ÿ[ÀÜ3Ž3àbÎTJMÂ2ÞZA.$îpUµN=\D0viouLv£a¤ß&ofžwLahocorasick_rs-1.0.3/.hypothesis/examples/bd21ccfc302af764/fd26cb5683641e9e000066400000000000000000000001721507150176700253320ustar00rootroot00000000000000(L)eu#kÔ lfyYS”[\ahocorasick_rs-1.0.3/.hypothesis/examples/bfe2da22a2bb6466/000077500000000000000000000000001507150176700231555ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/bfe2da22a2bb6466/3d12246dfa6c2702000066400000000000000000000000131507150176700252160ustar00rootroot00000000000000O5ahocorasick_rs-1.0.3/.hypothesis/examples/bfe2da22a2bb6466/bb557a3de7bf606a000066400000000000000000000000611507150176700254520ustar00rootroot00000000000000SÌíœ  †n!~ahocorasick_rs-1.0.3/.hypothesis/examples/bfe2da22a2bb6466/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700260370ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/c03e3c35c14770de/000077500000000000000000000000001507150176700230205ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/c03e3c35c14770de/b9fc09fff40c6832000066400000000000000000000000141507150176700252460ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/c0f5d5372d68b6e6/000077500000000000000000000000001507150176700230405ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/c0f5d5372d68b6e6/9a3c1667a531b1ac000066400000000000000000000000061507150176700251630ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/c1d126aa4d876ecb/000077500000000000000000000000001507150176700231625ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/c1d126aa4d876ecb/20a2763cdf3874b1000066400000000000000000000000071507150176700252340ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/c653ccb42395525a/000077500000000000000000000000001507150176700227455ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/c653ccb42395525a/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700256270ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/cc12e50281195de6/000077500000000000000000000000001507150176700227445ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/cc12e50281195de6/b9fc09fff40c6832000066400000000000000000000000141507150176700251720ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/d0aa49544247f05b/000077500000000000000000000000001507150176700227425ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/d0aa49544247f05b/b9fc09fff40c6832000066400000000000000000000000141507150176700251700ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/d3e4ddc78ed009ef/000077500000000000000000000000001507150176700232575ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/d3e4ddc78ed009ef/b4ab46136f8a7c2c000066400000000000000000000001721507150176700254740ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/d3e4ddc78ed009ef/b9fc09fff40c6832000066400000000000000000000000141507150176700255050ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/d467e571ca193666/000077500000000000000000000000001507150176700227025ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/d467e571ca193666/9c37882aff0161aa000066400000000000000000000000211507150176700250340ustar00rootroot00000000000000qsahocorasick_rs-1.0.3/.hypothesis/examples/d467e571ca193666/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700255640ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/e1a1a0e21536142e/000077500000000000000000000000001507150176700227235ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/e1a1a0e21536142e/b9fc09fff40c6832000066400000000000000000000000141507150176700251510ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/e953ba62a83b57b1/000077500000000000000000000000001507150176700230265ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/e953ba62a83b57b1/b4ab46136f8a7c2c000066400000000000000000000001721507150176700252430ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/ea046fba42e7e6df/000077500000000000000000000000001507150176700232505ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/ea046fba42e7e6df/5d0ee50bbc9e81ca000066400000000000000000000000151507150176700256200ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/ea046fba42e7e6df/9a3c1667a531b1ac000066400000000000000000000000061507150176700253730ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/ea046fba42e7e6df/cd6bd1dcfebeffe9000066400000000000000000000000031507150176700261320ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/f110168263c9473c/000077500000000000000000000000001507150176700226075ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/examples/f110168263c9473c/0d491ebeb6bcc34b000066400000000000000000000000221507150176700251520ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/unicode_data/000077500000000000000000000000001507150176700214125ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/unicode_data/13.0.0/000077500000000000000000000000001507150176700221315ustar00rootroot00000000000000ahocorasick_rs-1.0.3/.hypothesis/unicode_data/13.0.0/charmap.json.gz000066400000000000000000000507741507150176700250730ustar00rootroot00000000000000‹ÿtmp_samqxw5M]ÉÎļq|Ãgĵ›g_#€oþá“A¼pòþa×ÂÏQ=£¡4EöR]ýË/¿þíŸý›_ýòË÷›_�ö§»×züæWm�?ý©¤_ÿö/øºÅ¸ŸÆÀkì:dòøµgI{BŠU?¿[Hù•t·%õ÷ÈÚ–´ÛÊßüª¶%eÿî î6(�YÒÐw™%�NéÔwãõìÕãÜnª¡¼:äųOövåj$�€$mH:rô’†¾[uekóÊð¦t½)}ú K‰gظ–»•t ñ¾ìVg¸[I Ò’”�tdG/]½Ô‹Ý7GÖm¤) ¿›únâ Sײpä’p¾­>W–:òàw|O{|%ÅgiCâ] <éГŽz%kK ã%t-1ñ»©ïjΨ-¥�3l�aãÈ­#7Πщßñ-ì‰+Ë�½d«ßÝ-%<Ûä[uÛê%uÏ÷,uϲfºÚRª÷¨¶’’΀y/Cß%ŽL�/q†£3à=:¥;'AâN«+»[I’¾ÃÛq&Ïpðæ=¿ƒ'vt�gט8z~÷ìè:FäÝJ�†$©ñyðVy.8�pwÇWw÷n¥zsîvH HA©ãÈ®ïj^ºÓúGi໩^6~Ç+_âÈÔwuk éNܵ’é|m`]�Ò¬kÑLtÛ‰½´…#×–t ©Ï�>9²F‹º2­…£å,‰Ïotœ½ëìÿ¶ëßvœ½ëìwÂ(iuI ‰çë5vkK)ЧÎwqI9)%ÎpôÝY�ø�î#¸Òà2F͵•TG®pcàʆ®lྠݗqê w iÖ¼T[Iu-³Iê�øNߟï’t?ç®k™œǬYchN«f†¡™v¬©YJHìsÕ v·’F]ËâÛ8þƒt’ÛH¼/ ÷zñ k£OÝÝ…»»t?7~·¹®Üå¶®%tÏ÷,8ÓÞ6 ±Ïèõ»ÐHŽzÿjK #+¸:�¨¹ànÕK½Gµ•„^R½üŽ«ÓÀœu·CR�!ÿÃÁ³=ºÎS«á8Yçà;ÎÉó«ù¬¶”êIO½có[øŽ£gB˪­¤{'æà¼tÛ ×2wý‡ÚJÚ�‚R�ÈÚJ HüëÃݲ—Àµ„®÷ìnÙg$¾K}wðÝÑwç@â?ÊŸµ•´!ñ|YϨ¶”pÕ©«N\uêª1cÞí¦TóË<<ßUî�_š³®Zp¯eIÓ¹mBµܥüþné:ηt†uê:k+©Ž<úÝ©1¸ÎÒw5Û,Í´ëÔ¬-tÙ¯z©­¤YÇçÆ•m]ÙUzI|ßwмùvlÌu[sÝn�ßq|î^«ÚUØ f�»å‘£žÃÝRšõ6Ö–Ò¬k™\µ7Þþ»’$~·p�K×¹ê­*ežRý÷»åµì/wËïvi¿[ºÍÞ5 ß-�¼ãæJ=ïØÝvJ5®·ÆË´uöÔ=ËIÿ!ë=Ú§Ùn¨{¦Qpí½Î»E/wJ(¢ñÿE/Mün7¥Ò¥îïQŒÒ*c°Ï ÇYŒš—®„k h÷19ήRS}nêŠqjµ¸[žkøÝÒrújÌß­¤V¶’ÆÄ�B ÑF¸-ŽäuÞ6!ÑâúêN¤Öâûõ’øÿ²Õ3ª-¥Ò‰jK©f¾»¥µƒû’ZS³¤Ðïê©Ô–Ò�Ä»{•.Ø‚\ÕîCÙ°÷ø»1VI´^®*vJâ“Α° ùlsâÊ4sÁ [<Ãéuç�lÆÓëìGOå¾24[_’ëv£‘…X* Éõ¡¡¼>¿8ßþ~ù÷«^‡ö,滳)ËÞÜ<¿4õÚ�¹*Ý�Àùwè|»”4’ÌUͺ÷A}ø½fÚ»Ãë_À�¬F2<ÕHè/†û›ìoª¿äÿ?î,ú¾R©ocÿB/•þ6a¹[5<_µ\£¡½ºBý«Fëë©…d/­wý[g¹;èoiüÕ ŒE·ùxxÑHÆù–ÆãÝ)U�=pZ´S2îG5”gàxydî¿—þ_;IY¼YÊf5:?3Õè÷pÆ ±L�_×ùW9«Ñõ®‰þ5_Ü�ßh$ÊçÉ<þèøÝП|,wjÂ�µu=‘øÿÒôjgQÖïÊÐmøüÖøþøú °ok|µ3 KGÙ_Í—ûéd»—Q�4¡^ó×~ZÚ†áWÍ�<)ëÿï�é©ï'ž÷ÓÝî:EkÒ¯²k$•ìû¿a”í­ùoßå²Ö�»ƒû³µ^ܨq;|ý‰ñú´®«µáÿ¥îç†kã6ÔLj§úÍ�·ßšOn£û}U%¨tÒ•îÆkhþº;PTcùøue}çÉß·ñ÷ešT³%CE®†2ÖÃú{–¡î†æ³Ò<ƒ ¨åÁïi¹Þ¼¯wé÷‰ñwÍk¬UViÌT㪱Œñ}›§ÓR©¥µV;ƒ²Žo¸¿ÕHî<¾ûø%¥¸Y^”Sr¹'n£çy•8~¯û›Ï3µž_}ÿÿêlêà~Yk»zö‡ãç§þ'žÇmôæÆïg<½ß/zìk׳|ý ã%m)$ Ô« h<&ß×|6@Â\Hyòvò~§5ÿ<˜?�Ö�»3A蚯úøA¦¨v&e�ë=Òì÷™¸ÿÇãõÌ yé~\íýi½Ýg×úwG4ëÓmô{è·Ñó9Ù7#Û�¤¬þ઼M<ËÿOëéµq0þ«‘Œñ|4þâû>?Zoãkõ>£‘\úêmøþÜ�Íï·¾ïü½æ«Ú9”�äz^h,oÊ[¶×‡þƧþF½ÿÕÛfèOó[YiüþèûùAž?w§ázï4b9(§ä‰ë™³Y>”ÝßÂõÌÕ-'eÿ~óx¾ßµÃó…Ï<ÞÿòÿOÿ_¬�·9êóq5Í2ú×zX;¸þ½ô|àŽB#yáÿ‡ïæßÛlË06Û³nÜ©†ý]K²ü¡q5õ:_Óûpwðÿ¯>$¿÷ïG­oa{éîÔ|Ͷn›õ>VÓ%Ã0nzÿïî‡íŸhÜEÈ×{:ú?œ_ïΤ<Ÿ¼)ëzÍwù{jçPvý¾ßµÃþè‹Î÷¡û}èÐ?ÃѰè ãí6–1^n#A«÷1l_”ç€ýßN7A÷xî�]öÜÝÁøíšî®¿Éxž¶â¾W8>}½‰ñqŸ�ë»�äÄÿóýègSÖóï ¢‘�£Á­!/íÊGrͧh$ÊÃß×ú¶�îÎæ÷ÛÇoö¿õ=Ö74–7eùU¨Fý#(cú|“ým�‡»ƒë•~×¾™pÌÈ£s¯ßÛ;y_«²ÐX†ë&5>×WŽ�Ù/q®óUCù”>Wamù;àæ®åFÞ ËnÃõëtØWÇ‘®»SóÇmR¾�(ûè*M?Þ�Š(w­gµƒãO×ïO­O×ZW,zÀʼnFr�g4’'¿çûywj¼Ôò¦ø5ÖÓ3¤Ïžk�ÕõNy“îN½¿·áûs—™Z?nÃõñîÔüwùjîNýŸ)}÷ª5€Ûò í¸zEo«5²ö&œŸ´¾»—7Åwì×øÎà1š j®‡f_@+¯œ3 w/è~±¿ö’ ð¹üÐhß´ä'ö²\{Ÿ¤ýå@ùäH9þ$äZIù‚¢AÕÚ»sÝGg¹çEµº?íêìgûŸÞ——ý¼+ }þdðWòlboé“wÌÔ'Óçš ×ÖgäųÉkÖÛÙú]¾ð¿Ú<ò_]}›Ÿ,ÿÓ¶è2ó;\{tjõtÏÓÚíOi§Í÷Iè“÷«ŽÿeïRíáéT;üIMhuöÑ®Ç>(ìm:éÞ¯€@»ß'ègú�ë ®5´ÛŸÀ™XÐ õ³:Ü£Õ¾O‚¿î§ó®îO>Ô¾õ¼®U¬»zía3Ýφ"ÁÖŸ`Ô¡}Ÿ}¢ÿ¾á~@Ûß'SŸøìDØ õ'|‚[V öº>yýtõÓß¹†Î5^Ïcë“ý>I}âÁ÷íûD=Ï×Ï }ïþÓµÞ¯–®p½+\êg½~–®g½ëYºžõ®gëzöëy}2Þ'ºcûõúïö — EŸ¼û“ºž|ד:&ß1Gý÷ƒÈ[¢§³û|Ÿ¤>ñ¿ØƒçÚïYlÝ{Òk�wãh-(¸ zyÛîà ¥žù˜¶?ñ}¾Êlò�Ìh©_ùŸ^…�nìþpz“g¿Éû„ÿ=–¯0ßÁðZp÷¶ŽÙö�/¾)ñÞeºLJqŸö™ï�­èÚãøÉpÏ|¦î9“ÿºÎÝ;œŸóøéÍóçݱ»þm~¢uðîñ==Íÿë*3ü•´ºÚã¨;Íg?šÇΛÇNçHpäçîM¾ÝG˜†Úã5W«O4Zl�×Co=½{kð“µÞ'‡ŸxÌnªõÙƒsøq,¦öø+G_ €Ã_½gqbé“wC$Õú�®R§k¾{˜Ÿ¯Z¬÷+ˆ0¸­4Óqó Å›ÛUZ1ÆÂÈ̲²0Zn«cîjÌç™ò–*‚û|­-Û¨æ &çÃP1)?-°“ŸX“lù•©{Ò¶Áµ¤ra1ÀŽãsôØsç¡/ÿôå (‹{èîU_˜-ÑÁøét«ƒï_ÿɰÕÏÐ7¿û+¾9\ZyWê�cØ12±€XðÒv¡° 4ž�=áðÊÒ°;áìj?„²Èޏ¶ú­ðZ€k ­UjQÞ ÀÂ* 8¡à`oB¶Ø&\`mB®¸&l€jBŸ|&ìYí F¨™cŒq¿~{„# L(/@¾¸P—0]„{qð.£» le4à[Bh %DVí{S/îèÂfp%¼ÕKh+€­„§€J)¦¸_×IMhÅŸÇ8J(ª N€I U¿ Ð*!«ê…S¸*¢„H�I8&€“ŒbˆI¨¥Úž©~+äX�¥Á±4ZãX5–Ç@ÄCX6Í„„ @‘„DI8$ÀžŒW@I$’¸pï' i3ˆD!óD*©î¹p@€}Â'�$a€ÊúLÀu8N}öðÔÒz8V>«pH_€xxmŸÔ1ååâµräÿ©1yt®“‡ë  pBÂ�ŸŠ—6 âšPqå%¢¯HÒ‚´$¼FöáHY¸ìÛ�kJƒ ó*5´gàðjÖ<[‡w£Ë·ûºI£¢½û�DÖØÿÔá“éö T$ ½ ûœFö7ÑÛ$‰¾'õB¯—2sh[7ãtà­°¯¢ÁlöA—n«Ñ>iöA³•·º Ýš½aôÙ?´ Dz8$Â�Œ2"ÈȘ"BŠ$`d|áGFœ¤^èI²)ÑK>$õBP”1QôÐ¥½VôGÙE¿—½^ô^Ùã…^Ž}dô¢ûèý‘D‘½Eô Ù/Dï’}BÐÕ?õ0V·þ�1ø¼,ô*اbWO—‡H6mC{hqÚ¶í„[ÙK”ô#ÉGC¿ŽÎNŠ=^ôw=?þƒ}_´7lm`Ô Ù^x-Hê…>2{Èè…°ÕD R£®Óª±5I{jÙD¿‘z�½!]ºuÚYËö?­Ûþô;<¯=¶ÞiÍK¢áØþ¦õ- ½Ä³Ži-]FKYz±}GÏš=­ý¡Ðh?kš–³­dÚȶciÅJ¢�i[�ö£mΠ]h�6¡ì¿{ÐÖà€4$ÑV\’�e¦Ñ õ»IÿôÑÈÇ�Ñ:4Z�®­$ô"¿# OMÚ60c͘3æÐŒ ðSö©:Д§p§¼ɳGØ”4b“ÎÑ¡t8B…€�â½PCøã€šZß |hE BÈöÛHBäÖó !Ž�ÃÐ zÛ‰ñŸ}Ћ¢{ÁÃ}Ô BABjðñ!|ümÑ‹¢ÖQϯ¶’¤!iAZ’RH:�ÔKC/Š3pè¸!`|¡ü†@~C(¿!à•!|":zéêáVå>ܽtõÒÑKW/½tõ‚;C½4C½ ô2Ô ÌÊ»-zQô. Åæű×*�SÊ)¸-zQ”Þ«ÚRBÈÙ½@€:Ÿ „_CÑHä·†ò[ƒ¡VGZc£—­^ Eá«­$ô¢1ˆ\µÚR ô¢èo,¡^½#¬G¨ÀBQG ÞCQ‡3F>E(Ÿ"‡©­$ô¢± ¨fÈÏt[ô¢± ˜[m%¡�]@:C›@4,”•qÛIÑPŒÝÔØE¾°‘S·=�Ô Ænjì2ˆ�»€Œ†#Ú‰±›»‰±«¸[ 8” €–þDf1vSc°-£¶™€ñ²†%õ‰1˜ƒ‰1˜ƒ‰1˜ƒ‰1(äf à wGØ´¶’ЋÆ`b ¦Æ 2Cx¥üº¶”0Sc�¡iG¦ü å(²{k+ ½h &Æ B·E/ƒ‰1¨lÆÛ¢�AÄXÑo˜!["`L„¬‰@dm%¡—|9Ù �+>Ž^4¥ Ù¡Pú‹¤£�ÁÄT¶u ã&”qsÛiHZ�–¤€’$õ‚1¨HúmÑ‹ÆàÁ<ƒˆ¼…ân·E/ƒcðh ®r4ÆàÑ<ƒŠŸÝ½hþDôº¶’ЋæO@LCˆ‚@T;”ˆá†"qÊÛ²µèoMÙG (å—OÀ4RžX‚óÛúÝFfIHJô"[¾û”ç>±2{˜È˜JYRÙ�‘¢Ø`¦‘ÊÝL€ŽR6P¶ I¹,¯˜ˆ¤¬�; à ôSÝg—E  V §•pؤ¢…¦´„„3¤¶Ì%Á]ZÄW&œ )/H"ù#åûH@eSŒD¦x*S<ó«­í¿N#ÏY&›á¶EHSk(^ÖCñf Š �eöç¸ü™�¶iX�wþäñùìJš ¶‹ £aËhÐ4ç/CÔ–(!ޫܣÎ�¯�e¤Æ#Àÿ‡Æ–­L[÷ר_s�ý5÷ר_sÌr™¶Ú'Íöi»}ÒpŸ¶Ü'M÷iÛ}ÒxŸ¶Þ'Í÷iû}Ò€ŸãÙÞ2¾Ý�øi+~ÒŒŸ¶ã™åÒæ³äeÊ?[^Æü³æeÎ?{^ý³èeÒÛ¦Ÿ4ê§­úI³~®ç�{Àý-ö·Ü³|¦‘1“ãӱǻÃþ옯Ӿ�IçÀ´w`Ò=0í˜tL{&]Ó>‚I'ÁŒç¿�Ãýq†V›P˜•åÅ,®ï³Ü)¿ïƒ²ú#  -ßÏÅû¹^Öï—˜8î°ÛðgËX;ƒò°¼(¿ãƒrX>”åGx�eöî/Ø_¸¿`áþ‚ý…ûKö—î�YRÎêðA¢±ÌþÒý%ûK÷wØß˲:ì︿ÃþœŸ¼û;îï°?e)‘BcšC£våayQV›Y_»?9(‡åCÙýö?Üÿ`ÿÃýö7Üß`Ãý ö7ÜßdÓýMö7ÝßdÎ*Û“ýM÷7Ùßt‹ý9+-xÿÃ÷?xÿÃ÷ŸYYÝyÕ=xÿÃ÷?xÿÃ÷?xÿÃ÷ŸY\ݹ×=y¿Ó÷;y¿Ó÷ª>Ëú½®ê>Ë쯹¿Æþšûk쯹¿ÆþJƇÒ"f•ug•õäóO?ÿäóO?ÿäóO?ÿäów!ÉAÐXf~þÉçŸ~þÉçŸ~þÉçŸ~þÉçŸ~þÉçŸ~þÉçŸ~þÉçŸ~þÉçŸ~þ0(ÐXfËý-ö·ÜßbÎrLÎGéù(9¥ç£ä|$Ôð$é Ë›ò¶Ìþ=Ÿ0!¿;#¿'ç“ô|’œOÒóIr<; °gÅÑXæùÍ`�¯yÞñŒz¼Ž×ãñz8^�Çëáx=¯çÓïuý‡ãõx¼Ž×ãñz8^�Çëáx=¯‡ãõx¼Ž×ãñz8Ï‹dr¼�·Ãñv<ÞÇÛïxöïñv8ÞÎ|Y«ìÏãíp|�/h,3Ëu™!Y¢ÕÈ;'’EvI«u›í(+bœ#ósV'â®ÎršÌ"ª W2²öæãùB,ý6ÊšÚ›YjšO+ÝŒYeÎâIfE功(wg-ŸJG-Ô²±0EtEŒjz…>`‰B¶?̬p¬í![‡²E{>![>BöE=·ß÷âŸ"_{8Vâ+¿Ïë‰�h/"A\Òç8ËÝ#êëFW}}‘ú<ØL¨©ö¡_q•Jcdë'd«cLsÖÕý,b²¾‡Lü„LüÖCÈ.&cëá|—®p¿ÿ¾•ø¶Q‡w�gßöë;ù+±³`oê_sènÄà +ü‹xø\zì¿ð?]г¬ŠDðó7~6óp”Å‚œñ8”{™ØKæÚ(ÓyoÂ%YBŒO Œ& Fà ®-ÑWP ƒoL*®‰ø×:ø×È}õ�aê—Ø—�ÒRB�ZM;]Vѵ)'€!SèŽxGwž8ÓÄÉ ‚$BYñQ«Ýýn!AÍ^4°õ…"Áä�Eì—B¥TÊP^m" ‘ŠB$"©ˆÁ]TÁ1më¦Àôf@ íe|^KÚr~—»‚&/j2ÌrÄjLÉŽK)he$³†ñäC< ç¾,Iïžká@cÝ‘ºœu�͹t{-êÞñֺ͵k{íÂÜX�çÖ�sëËðoÌð·|ÑÚ76±.Ûh8ÍÑ8cŸú:ß@FjMÑÍssã\­ e`yÐ(c{0ƒ{8ãsiw¤þÞ©ƒŒŽæŒ`¦b¼µÃïýFh«}ˆoEùúc¦üÝ?ÄL ã'ÆB¯SÿI«†²ò+‘Í(d2RÉÚ^Гf|6x¢šì‰s¢m²¯5â?�þ„êÝYh!éS9�¨\ÂSMÉq •»Å N§&Vºfç´5xg›¤~IJyÀ ©œ¥ŽwʉlZ]¹J©†d¼*ŽÔ„_ün·ð«8 …Z|T»°¯Ð]FŸ:r’cÐŒƒàj8‰!œÄ@ÊúÛÛ@¼|G0åFÚð2�aLJú®fÅ1xÏHC3Œþ„þX[ác;²SÌ�€ÈvábÁ—'?䀛ñ®l¼Ÿ˜†|í.¶! áˆpE8ànòµ8£¼þ dv yf˜¥4´ÄÄ+åS·$À_…!ŒÍúïØÐ;6O¾ë©8ÿ6ô*aqƒàZ£kÉ1hmaœ5x§X@lu¯AK0di ˜—CŸ`»¡±;q™MVð»Me“ré�BPM,˜S¸¨ $Ôjût·Òa@BÔ­Ñиµ¯�Ùnþ(7[ײ“’¡Èlé%×¹…1Ý0 5óÝ–°Wá^'€¯òmÎ`>!¬©Ó~,˜qSÜ+F_m%uHÂÃBIK>ÍIóÔÖ((¦} T¿léB¹1»ÎúoIû_À,áð+RXMüNöïBLué| gXâ}½-8ÿ„«=5’—ìø3|ií_˜¥–r&Lð»TÑ"FônËZ¼K8ÿı�Qpõ÷OÚ|©s�³÷î ké\�6éµ…¹ßÝoÍðú­7|OØS,"ùùŽ9…@´Í‚óåÀP‹á&Œ¸„0^¶îî†Ëd˲ÞP·У>ê»@Š#�”þî�@@ü°Hº³çŸ7w© „à „°Â<˜ÁBñ§ i„9# ÷„#ió“4)’mÛ³À´È¶©ÛHf¼�ùÝhÝlçÆn¦Æ†# x5 JùYÙ)§ùÛ>ò·mËI°å4ö’ýM£�ÒF§­!¦š_m,úÒÖA|?ÖUs¿”Òi  _>Þ¢5æÿÛùúË, ¥¾¹ÆÈè1¿“�‹¯m{¶ûh�yöÃË{µ¬§vd�ÙZ›=yœ³/{Ö§³õ<óœúö·m½1£àyŠéÏÇœ*Ï¢ùÒA®Æ2<…æDžäK˜Î·/vUZw²6™__´p:¾1CAØÖâ ÃñÝ|r0•¦Ù„'—újÔÒi§™�'ïïm†¬¿�ûyWnóÉ‘üÕycÒS7Í߯L�¡œÃÂàMBñÞz€þ” ZÄrü^vÚX)~¹e~9fc˜ßŽ‘•±½¾ Ñ�eÿ~�…k˜gv:W�­ß�|u~Áÿ/OÒ$ßôPÄv‡Öògë™ß/¿ù{ß_À²æ�…ôµ•mg¾;ZÛö”r!éó%ÿ¿W¦Áñ>íI�b­�ò �Š]´v)‹Ðbtóz7RÛÄo¾¸n>:@QÑX_]?â›#ÑpŸùëÈW§Ù|ަïÓüu\ºùïàšÊ·ªxv/b;œO‘•"¶KòÙ5óÛáúí¾K/ùíš×–±ÉG÷™Ÿ®“�N« � å­xÞ‹Ao…ú›“|tñøê&eóÑñ÷Š WÞ4�7_Ü_œÖݵx=Ê ©òÓ‰/pqÁ[ëX>’}ü9䛿ŸÃ÷йA2Ýin]ò©mEúk‡ß›Ÿn±óñÝoÈÿ¦ñµ“|nŠ4ÑŽW$¤ˆÝÀ×6ÌÐKïRÙ± Ø-Z7ó·áúB‘ã"r#ß›¼Qwg’Ï-ÌïvÈßö™Ï�ßÏiül{«?¬Ç;Âük˜ŠæM2Þ×âsÛæw“¬ßCm߯à±~¯ÈÓ&kWµI¶[�¼©Pßј¯­“¯Í|kPƒŒš*â6dï´Çÿ†û‘Ý|h�|qâšß,§r�ßl¼hÚħ¾øØô=ùÊÒïKNòÍ™�2©ê¥ùsä_ÿcòygšÏ Y±Åêgÿ÷ÈÞ,¢4ò£i< {ÐHÆÿ9B¾qøË”uµ%(¢gwËà[<Ûüfðvn3ŸÜ<¯#ïÅÝ9ä?Óó=à‡BcùP>æGC\à3(˜ÑHøïŠ–Éï%�Á]�x¼ùŠ>¨êh$Ãi~Õùf>5ò«Y»…Â^Mš/í#_Úg™ß kùa~/þ4sY ù ó·aþ¾�¯H­âC3¿Y“ìï›øÐÌo6ɇf¾1ôÕ˜?m‘ÿlYsßä;óÿ›¼þéë‡Ë¯¿ÉW¾?™¡ÃG0÷güö}ò-¤ä—äk3¶ö#¸ö3º¶}äûÄ¿ÖÀÇÎÍ*â3ò› éYD'�‡ŽgºÁÕ[Ó|g�|gæ3CB›ŽDb¾¹³¥ùÏÞlgvó•I^–“üd–¾�Î}8\©§ˆÊÈg&$lG‚ɸÞnþ¬ÎñXÞbó“áx�¿Îñ×ß9æ4â/Ãxêâ×½;xþÕH&¿X7¿øŸï¿®µc}B#™ß{|Ñ^(¾³nþ3Êî?hàÉÃYDgâ7{Ù ä+Óøî|»lê`”;š4¾ÆG¾0ñW1ÓIt?îΠlŽ÷Íï5^ùí,Bò�éyÑ…F|coSHž(§âˆFýÃUQðèézX =—¯ët¸�ýÄŵɦïÑß±×µˆÀÈ&þ­A¾®«5˜¬Þ×c~ê"ö_—ùÀ¨�¢¡ ý4]Nº$£÷µs°«)ŒŸhQQ©·2Òd\´[?‰Q—>1ˆ‘¶hº K…vœëÂ’Üa8ìÒëöõ�_?Ós9Á­‘„d: Ê£)$Ê¢£»¿„6¦×­öˆe -¡�÷‰)†Ö# }ò(t>Qè|�Bç…Î#ŸYŸI‡~hˆDÎÓNN¤:]ýô×ÏйÆ;×PÏãÑ Ñ�G4D¼3Þ¹¦Î5_ÏSýÌGò3E4ß?]úÕzW¸t…ëõ³ÔÏz׳t=ë]Ï2�Ñ»¥®ýèŒô,Ö£�ZJ\ñþ{ˆ)ÞŠlêÑã앺ž|Çs^?ǤC?4Dü_û=�M:¬ýÆÏʤCãÑé˜å¤;¦Ç�Ë. 2š„-ëmËzD.É€¢Â†EàRÇ} ŸÎ]`ð6}KS ºè[¶Ã®ÿ‹°+q�‡QëG½&,�0 #�éÄUß­ÒPŽA™ †ÌTx8A˜”zƒåãRÆÝ�Ê çO_ÍÿšQyá¼óˆG*‡\WA7DüÔ-‹K­!¢§i¨—¦�j q±<èP)MÁ3DàT¨ µÈTŠ 1µ©p¢m ¶!Ö¦P"m ´!ÎÆ}Ô s q4 CÕ0…Í5S˜ Q2…Å#Sà Q0³ËRy.D²ÈB‹ûˆi)ˆ…ÖV@ ñ,†¥£ú¾BôJå²P-Kå±P‹û¨¢¥ âM 7!¥¢Uˆf-·B¥+•¯Bõ*î#ʤÒU'î#Þäp¢M 6!Ö¤àbKܯß*X…X• =!¤P ¢O*ÖĺQ]%¥PQJ%¤PAJ¡%Ô�b(©~« b> çmÄ›Tbª~»U` ‘'•‰Bµ'Œ/R˜‰Q&’9Ry(T‡b ¨î­ŠH!Ò¥\¢J”BD¢GÜGìˆ÷ï¨\�pTr ÀÛ-JnDëdŽCùw n)VrzO8ùhr·ª�Ûp¦ÊU G©ÜšpbÊÅ ÜcpŽÉõÇÝ^(ò Ê•ê_@DÀXåú\€y°8=V¼E@UÀTšd~»TbQ "Õo~L^ yÀt�D«fB\I�$D•¸�˜¯™¦¶Jˆ.qެßÊ5GµÜª€ð(P‡æµÊ‡è÷‰šÜ/' ßYÀ�>Z¬Põ)XUû¤)eFšÔgkXñ·ˆ<ñ™‚½PÐà,çgä4IõD\Ge TH£@MÌÅ÷ÅDoG™ˆ átWp+‘®z¼†Cà±Uï¯ô (Ò(V½¿¢4„c@d†`2�!Ѐ½PÔ…Xþä¦^õþJs?žÂUH›�+)J�Ndñ¹C-Eáªç.W7ÝÒ 0H[€B®P "�É~€7U¡Hb@|På(ЇÏ�¤¿\Õ\- ²S«Õ~�ó ^ÿ©k 5°¯ˆQbîÅq 4’h]Áéªà$I†¥ß¿Ö¨l@ 7¹OéMú _J“+åª%´ºiiUH"™‹Î½×Tw�1‘e�þÕÔmªö$})ˆÍô¤�H·ÝÀ ;Û ´!œ^G«ÃE„Elë‚¶…Û˜×æ42f‘9i‹9[N‘b†”’˜�äô"f9¹Rw)Ændõ(Iès¿P##�,2Îè°!£ˆ.úĘ¡$F`d|Q½0šé´Bf¦z�ÆiJK¢õšÃžŒzÚFhúÑ“ôXAצ&(ÛdÄ_€,Â`CŸ |6€™ðeŠ 0–Dp± zы­–·nØq™¯$ôb’TŽÖöi‰Ù£öª¤ò•uC2âþ({�µJÔ¡ZFjM¸KkT£¸Úâ?˜ –Pr€IkªX‚¦m±‰Âס]â`]ˆ‹u·ºÃ¼ŒúJB/&‰%TüÄŠ¼×D½$îµ-LKØÖmöbÜØac­š•ä¨&B%1ª$Ò¤:ÜLBTõBÛÎ6>F«4ñ¦ºd¦%µ³ƒÖ„ŸÛþ£õgÛïˆdÔ„¢¤5 ()@%‘ 4MÑIÊNI ëÔh…zÞ¤Ÿ7(èMzƒŠÞ¤£7(éMZº²ŠåÚm€o4Á7X›Âx Q¼¦ ^ƒ¸‰:±�;±‰<±�=±)\ÐÍk"P¼-áìÛIˆÌ9qÊ3FöfÔ[š Ô‘Ïýð˜-9Ôàßt¹zK\À‹j+ eåXG)ÒÌ ˆÞW©êبé°UÒ…«C…«o‹^TÞè‹H)Rª­ÈU>�«|’:¤.iBš’P@.þ€‡ßlæÎÁhSعIߦBÑ8ZŽ€£…`ÔGm%¡•XT­¶’ЋÊÐÛ(gaTv¥*3ÄP/¨û!I0ëAðÓü4T.X‘Ã)�x€Âg�htØvÕVz‘#”ùvëôU[IèE#$à‘ ð@‘ðP9Vc Añ±úP¨þ¶èEŽ[¹Iƒ^d;‘5.äS ¤‘ÔVzQ9—`µ‡P/¨í Í€ >ö ¤[„`Á(…@mP[(Ä(_ò_h{Cp‚€/3TL/PÞ´¶’ЋÆn`ì v€Æ…< h\m%Á챋2ºµ•”�Ô Ænj좲Wm%¡�]D�CeÖƒ>ùÔØEÑõPÑõÛ¢�]y»5vQÛÈ¡WF^Cå@�£ÚŠ\}j &Æ`j ¢"[m%¡O�AVCI�ÁÄtÒ#G©1˜ƒ©1È*:Dѵ¹ zÑLŒÁÔDt4| @§C AV •‘¯a WQ/ƒ.Òš=J¶ äZ†R-o‹^4M�µ07BöF K)”¦0?BöG¢JA ä0…’˜¹—¡´¸@R\(m¹OšîÓ¶;¨¥ÑXfËý±˜ô4MÐäøœŸ“ãsÚúgø±Íý| r*¸?º\¥M:¦½“n€i?À¤#`Ú0é ˜Ï“ãyz¯‡Üî�ïôg€õZšËµ4VkiË´C‹ãy}Ï"!øW`Ô?Ë“ò´¼)¿ß,ÒîßàtòXí°?Ó ,Ò ,Ó ,Ò ,Ó €Â�iQØ_º?‚™åY¬ö—î/Ù_º?¦ŠÊËX|(ìï¸?‚¡—ii–iFDc™ý9 àªé„¸ÉŒ84–'e“¯“Š}?2vÒ±ïn05c*»R|(츦Ö:uµ#w�eö7ÜÁÛ ÷M°·pµÃþ¦ûc±n�k‡ýM÷7Ùßt‹ý­Ï4*ƒûþïøþï¿Á¿�ù)Ýů{ðþ‡ïðþ‡ïðþ,Ü™ÃÒÓ÷;y¿Ó÷; VO�w‚‹{:q ;Ë쯹¿Æþšûk쯹¿ÆþõIÆ}Ò‘ŸdìÇàåμšž~þÉçŸ~þ©˜�Ÿòù§Ÿòù§Ÿòù§Ÿòù§Ÿòù§Ÿòù§Ÿòù§Ÿòù§Ÿòù§Ÿòù§Ÿòù§Ÿ2•;M‹‘¤ÅHÓb$] ² &3%Ñ8Õ›ýy>JÎG¹� iPLÓ”!šGÔHÓ”ž?’ó‡™:3™zzþ`ñôžùRËy}¿I 4 P’(íÃIŽÏ<ïxþ�ÏÃñy<>Ççñø<ŸÇãóp|�ÏÃñy<>Ççñø<ŸÇãóp|�ÏÃñy<>Ççñø<ŸÇãïpü�¯Ãñu<¾Î� ËÇïþ9¾ŽÇ×áø:_‡ãéx<ާcZžCZžc*€Cššc08âì·QqjÖÖÚÛÅ�7Ü0Åv"ð0å´ç ¥Š£¼wÈù)Ux„|:9ñ UŠ“ùèI¨ä�3úñÉ~üT†ðìwLˆøÄºÄ9*:xâýŠ,n缇'u.Ó_¤â/“|ôß~Ç�°ûûâ§X (Uò}¢â|ßù)û÷©ìߣKé*ûgºô�1 *û÷~5D»b¿ûÇOѯ¼OD4ò >‘²�îü“_Ú@\°°ŸaäÓ7T>p>*y*´ÝðY°ðWëQ¡,Ÿ°À ßAÔ"6iÔD1Œ©ÿ>QðbªàÅ„c*F:QÓþn�cÁwéÄgTÒ ×˜Íg0²pY[!œ×2l9m�Š‚’.Pºt«pém‘¨«„«ùV¢ Øà ݲ?7X@·hL63/Dé¹A¡±§Ó|�»�Dƒß‰àe#-y‹}ƒÞ| ¿Ao¾å;ß ÚòsïÃJõJô:¬¿—Ëг ½$äT„S,3,àg>€ÒXý<8’JŸ3S! ”G�íé²à@ÕË/‹øw4Cèቕ�*ºêm»œ6Ñçk#—`˜œ™ ¦ŒíCáT#‘�S\Í´”ɘHÔkF+5&2v'B&&?˜(9#¦i(‘e’ù Óø,~¿œ( ¼Ò°í9Hé9lkRbSbRHSHRHSHøfªy2i¶e‚‰0NbÞ¬'Ê0qg¾”w8Ó?ù>*#ÿÇ帠WóäEY×Ûªý_òØ&²ÿÈdÿ92ò‘¯þ3a}ÃÄU�e&¾|ºž†*�h”Ó˜(£çA C¸M° %ÎPw’³v˜Hãapžà+ S}aa_XeØL&ÚH7f³9†ÙÈ…ÞŽÿÊPUãDœÃD=ïË�²S¹šOÚbb�"ÙÐ4š©˜øÒ�øî…Ê�ùœ3˜£Ä&:u—­è `:Ñ#h;†mÇ Åf˜b3h †mÁÊXA"ŠŸW!Í)§Y>&²(†‰[C÷·2@AÒ´^‡…Ýñ¡ÊS�‡w:*õÜ'üSÅý&С³Ù‡N&f{é`¶�¬Ýö&“ùÑt’aÞåN²uÜ”K^ɧߒ�oÁ¯µlù`Ñß"îÝðLmi˜^©» Ùy dmæÖ-]é.VôL’`“5Žž�s[ˆÅM‡ 2oÄÍ hæFÂÄV¬rÜ؊4nŒÈ=]ðšSôQÚl«´Ù^k?º²%¨ °¶ü%(¬-ÖFi¬­ul£ŒÕÖi£ÕÁé†â¹Ee¾Ád¾åaßð5>rø÷qjþ†=jë4h.Hû‡M}œÏœônM™åÖƒ¡Æ[«f¶yZç¥Ê»œª Òö¨ò¶%!«Úº0T1É `„CÈß@qÆÖ7�ÄŠ÷ü{!ïI ¸òžóî5¿íá$|„ÕC4¾†�Кs[•S¦©ß%èS¿KÔ@ÉgŠi[.ɲYRÄ4§-ë6™iªé\Å©:�/¶FÊôm¢¥M_þ6¥ùf¬d›‚>èkÛÓ_#’ìIºÄÐX>”M¬DûösIÀo‘‚|™øˆíË]% ç#J$J²ýN óa¢ ”þ.{~Ùžç÷¦Ù%åì0éì˜SÄIÇö|§=ïïIä‚˃%?†c̓%<†c˃%;†cɃ%5†Kj Æn‡c·ƒ±ÍáØæ ßÞØïûC{ÿ31‰ª„Y-¤�DH¦ nüÞÄU€]Vc¢¥MY×?ÁaŽÆ²ˆŒÒþú<—b�FD? úX*9UùÎ ÂQVÇÞxÞhD|ƒ aˇY 6$®‘ÇÕ›ƒÄ*&JùHœ"¢—$GžóP7¡OÕLˇòñ,¶Hœ¢þ)æå›,F“FbÍPûØcw°Ø£‘œœÂ>Ïh$Ñ_Ž2Þ5•�O±Ø»Ãß •W &ô‡ˆXæžï˜¨ã#ñÇgÿ-Õ„ý#˜?Ï©X²Âñ“ÚY”Ÿ?¤Ñ2,“Øä˜ØäÈŸ"E'ñI7ñÉ FXªr¤4úSìù8��H„Ä#ÛþØÓŸ°.ñ-ú_–‰B�ÿV�ÎG¨µ ãË1BY8¿�@éÏþ‚�€äψä¸å±LG§Q¦«ý}Æ’~“~.ñ×À[Ͱ¿ä£¿ÄD#x>·™’ý)*òÆ“piß`ªH8W¤)�þ­_U «±?¥ÑŸÒ,OÊþž‹Úðõ’¸Å%¢‚X¤p ¨` ¨p‰§r´ý+ËþÉ&*9$69ö¿�§QYbåHô§xU4·7û;èöíÏïÛHìÑ4:øLËl¢‘)b’41I#1‰ý/$6é&6éôŸ˜X§wúOTÂ7¸þ•?¦Û?C"i��õn$z'Ýv\íeù‡8>ºË.²„J8®Œå‡K¢K¢„c÷ÁRx} �ÂÄ‚AbÁ°}V;$.ÑxaX)W*ÇϤÿgY>”�¥�jˆCóe1šúƒ>‹4ÒÀ7�°$ü5·ž¿¨‘8¤™&~Aæó?©dh^‰:�#û�ÿhÈ£äXµ ”Ÿ—ÇvTlü¼"â‡]ÕÚ3%Xç1®³óe¨Ö¹dª`×V¯«ZEкüCýááºj½=ÞŽ&ÞŽöX:?DûŠt3¦kÜö˜vÚ+jÀò྿ØÓ¯\|(^;œIWNæ…Ù3Õ—˜N–½rÅ ®Ì®¥\RfQÔ<¦ßÿý�¢,#Ñà#2-?H#늈ś¸&ä_È´+îÒ‘lºÐ¾IŠÁ‚ê@T ü.�Sz^y–yàQà»AÕm¨Põ(t¨<ÁXLÙß*�Áä|Ó1—J7TÄŠ5j\ö`bz™ÍÕüP,ŽmÂl¹uä¤r›N�ìh"†ßA.»c*82Á™X¬s9Öê�ÅÓ¾g,*¹�£K7­.S„’PÒtÍ ü¨õPŒªT^1yŠÀÓq#–›ØÒƒ'ô„Ût ’Àm©tǵ-; Eˆ—4éR¥Œ*V£ÎñÈC‚¼ãòšŠã4ë"H“žAB¨ÏQ¼�~üÏ…ž?¦T|ö{3‰1\0>ˆéc´ƒ×p©Àª Ä8€ »vêE]ÿ7HP.�V…Å9¯Î—½F?¹2®IHu›0¡ò´Ç×^暢¬Vlf®ÞÖyŸ[™Ÿ~¿îSÞÂb„˸ƒ‰©ÚéÒ5¿ÿ+ÞÒ…Ü‘¥l‘D|=…9MTòË•o¦Ñ´²ï/ÅW2•tj„b—Õ¦Ñ�ÔÒå;)žIÑMÓM&é&�h‚Cc �d÷ŽY8ýúHTË ï»®Qs ¦JùTAÐÅÔ‘�á’Xäíº[yñ¦+SxÀžB�“¡k³=°ì#âPP`* ~´¾o5ßíTAðrqOdi¦ü6‰üÊÔ=M¼°©0Á.”*œx� y”?pàÓ9ŽM|�©óÍ…o‹ž.�¬-Z"¾I¢ôJ”¡S¸™Ê¸uÑY÷Õ ×êòôMÞÒi*´½‚Ô¥*ZWƒ²Ð{wT—ËɆ†U¤GD³ICݱI�)_Æf¥ûíö›uÛ· °—iÑÍdy“zSÔ±ùuQoSobfRDÿî,MÀ¦ÚÄDžÊ�/*ÍFjMSi.V>µiŽ�ïMµš¤–Íéþ1ÓT£ó/ö'êéªN†ëKSœw0”�]œ˜¢Â45&#ÞÒ¸Šs� ó£Á™vØ"k¤Ž´E4~¸(jMyœùº©õ5PS×a±¼�¸!è�)Æ8�U }oã쇣ª§Ç,a×dBÄÙÎÕ¾VYPÿxlcß&çU{e­û“xŸ�)ëáò6üÀÕ>Þ°.Þ°nœ`(¾Ø5»ü;ñkP=™«„_¥r×±‚|d—U#™>„åÂX 1Z4î_zhj5„–æ &\(ßbaéXbªØ@¹l¡\Èà•Og f>˜&½%3{Ò™=ª_—.8ÌpaKs0ý»;ÿ»Ñ˜?`*õ_~ÙàN5¢-nâô÷» è$k�•ý]n�AoÈ»3Œô2"ÀñSƒG£CBQ‰ƒù÷ÿ…XƒòÆ·_BÛ'ðm)|["£=‡gcsTbOq¡%°L)�þùH¯òøHPøûÌ]ø¡jS5–e³bý´W¤v‚rXfÇ\ˆÈXù̹ö‘2ã3gƵÖÐ_7ÏI'щY&>ÒL|æ™øH4ñ™iâ#ÕÄ+øÑxHPUÛû”qQ;�r·<)OË›ò¶Ìþ†û›ìoº¿Éþ¦û›ìoº¿Éþ¦û›ìO±ò^G4–eÝÖÛú\p«% …§K2& …§ß›d¡ðt¡ðäšù˜û‘¡õdpXÿù¨µ;hÛwƒæÝ0bwpZO“kªmÖÓ$eÿžfÝx¨4uâQ»·kèT†D±o“ýç=¥–U‰#}<éÌ…²«zYsZ¦—õya“ý¥û;ªìáþX îs18ÒW/ÓW/T=Bc™tíí}Ÿ”ÓÅA 3˜zÁK…F2硞qI§>Ý;B[Õxžù õGøV®*^¢Ô;Äe=õÆ$�›i–“Æ ‘Í"¯ÚHwÓ,“ '�Ï7/s¼9ªBPº¾ÿ’~‹jpº††UG¼â&ôN¼Ð©÷9J£Ê[ˆŒÇùwÁü»°%XöÜvy‹yÏcïáªá|P¥Tþ�®–Ú8âÔœŸ�À¥-P†mÄ2É«V4id¿ª¨)c˜5€i•a$¼ êëq¿ž”ò0Šy3/ç]$™+Ç j—‘ÞÝz­ ¬µÆët¬µ]P?>7Îy‹dIÇY#�©YLÉaºtÇ�5oš7¤ 6ù§>á-ð-ŒKŒFEÿ�6Â�àêÂYuD!»¼3 »]QÁ»¥ ÕÁŠÚʼnÚ70êûñM’pRì�u+‡î%cC\H)ŒF•^•ˆá(P¬înµ2§­\¦�¼‘¡L¦Dpm‰@Ú‹#qbíŸcûH¡lal°–¥¬-ÐãQÿ^ˆL/E¦WÖ0¹[EìkšXÊ»Ùp¥oGvàÈÜ"X߈ãnÓå#r»ãA:ìž¶U“• ÂÖ•éþdÕ7–”¾y¶¡&7ûuáWù™èT©3¡+ÂL]!VÇ·TjÝ'‹ª—„÷)åÉN8²S~ìÛbn[êec¶ÍÝ6ÔgàHÏ\‹+åjONʯÌ*‰Å/±²‹é6º1Z8—%çÑXcå\tÞ\#ª0¯ÔŒ?«d|í� ì ¯Ôœ‹ìý%ím{™KÉ\nÍlI¸¡­Ý–t§¹¢“¹Ôi^*¬‘_¬Tj ñ4Z.„Âøìµ¥\È壿ð=[KšB³æphqXf]1ñõ•c ×#ïH©�š…-¾YÝ…]:5›nͦS³qüváÕ­Fž.ÐpUórõ¨©Ø"¼Ã…i�ø„Æ…iø}>ï Χ\à*´2XxeØSÖé)S|›ñÝ-x¹I½%¯ð!8–±N¢Ñ|Í)ÅÇ·©Xlk›U—o£9õZŽˆ»G"�Q�âχTã ‘�I!öggcZH7ž¿Óï+?ò9K~ßåø4ñøöûœZ�ãÑ, ñ½xóG<þ–v|êëŒ÷çGn*|ñüÈ,¡x%ë‡W–‰¯ŸÎVYô3/ÇgØiz+ð:u¡. ò%¹Â\=Œ�¾B “ñÏíø&aEûVXŒW¾øãfüQñFâã»yÔîy�'�‡§_[–OîãwÓ…€ÿýŸI¿úÑv õM¨® ôã}!9É;š–ãbˆ�߆švÕN–�~\(¬ã=^!o!®»=Vð~«\û�¾ÿOúPŽñ«Š]iNÇŒ.¿è‘�ù‘A�,f],]+žµ@Ï‹VÛ/gñDuµT!ÕýuŠÿú¾@>‡!ŸCÂç�ò9  <ý>59Îgl®æ‘^Φ3¦R¦û(IS�YSiSÅ óÙ�Æ>‡�>‡Ï>ú Ò>°¸|æµüHlùÉ©�¤l¶U¸ù>Y(µÓ)Ûæ‡‹ï3ÏýGšûO%­ÊyÐèCh–eû,@‚ÿ©dkí°¿áþûîo²¿éþ&ûsE dB¡±Ìþ„t#2�åIyÚç�ô9X“a@9ÍŠ“L˜N³â$YqÒ¬8IVœ´¦•d•ÉŸ’Œ›šÈ‹ì*°ë’Œ ™Ù”d‘Ýl‘�t‘Ý|‘¬ç�Æ>þ¾=_ ß^ÜXacÿfT.‡ZÐh¼ÒWz—hãJgäëúh“.©öq%þ¼òv‰Æ2½¬Ê�\L‘\ŸWj‚g×g|rh,ó÷^©³è›Kª5d’-—ÔZ,©U�5ƒ¤f MÈ4^ɹÒÇóI,ÊÖ èƒ©ç¤?ÐËL<7mC˜†²=1-‰1ýš"ûR9ÀÛëÎvdvw‡º]U1®mD¿‹T—½¶b  É] 6`i–×2°+˜C”å¶VÖ©Õuke]Z×ñ½¢VdÿËÁ-¡Hk‡åïœ5´™‚¹=¶ymlŸo?åí÷ï¿é¥¯ðmþZJt'‘ZãÌ$Ö([¶rej_¸.¬êÆæ‚ZT˜ÚZÝ´ÖÕJ©u(!Zh@܈ †üÐ ‡uÊc�ˆh¤îPóžÊcMàÚ�!L`SRW|5±òå<¬Æd!U³ÞOts ¹<äË)�C.ÙÉ|QE¿&™Õ8›qøé|â5X8ÑúÞB¤�ŸdðÉê9Åa¨ø_P!ø×^E‰s/ìºþþ�ž10ŸÊ™¸r Ò�è÷¨Á-Œª¿{vædÜì›AÖÕ”í»aoyÊ6s( {ZñŽx+UU‚�¹œŽ�×t˜²ƒ¾ T½œ�R c› ?ºÛ!)!q…‡ù—²þn;!ñZ` ¦,Á:…ƒ¾-zYêÿhë�©6•¥�‡õßGî‘÷`Š;ÊÖ:„R)b~�Irt¾³Q=eoñÀ×ë~¤ó] ®|¶¨?~«îc öÍ“äâë>~RQU-°ôÕË÷ýõŠxë.ÙÑ>[üÙÏ>³‹}ôÅÚW=Yºpºtàµ;Ë´ » Os�è¯(-J—6]ƒê°…:X t¼Ò�´ø–-Rb–=&ÅÁ1ÄÅa9 ¾W'é[â*£Aí1äð­Ç¢:@OCº{Œe~Û5�¾�!�‡#ÑÙã�=X�ÉØpy4qz¸.‘ê/ßvù-âÎLå‚×PqTpÀ…ó‘®(�Ôq×!»à1ù¡0Cs•'¤š7!# “ÚªV$!:�?Ô•?ÔQÆ¡«Žá ]Ü›ã[àÏØ®aÃ"6Ê0;,Es”¹…ì,ñn ~µQúN£!õM{\ΤÂwò…‚«uȺIä˜x0àžòO�& s&¡žÜ݆¤ƒ¢+ªº¹PyínÍÅFª¶¥: (òÑT}b² ½Jæ"kFvÜÞ„Á?«šFñ+IÈ5gÁ‰LÚ©ÌxÅD˜H®Ne´%ü¤©ÌõD ;…JIxÒSÚmÁšâM䟘1ëÝL�.}Õþ0D¥‚&ÚmâZz4J0–æ+§@9p¶ %kãˆÀ«5ä¾ï&¿ïƒÕ\Î�n•j<�¦ê¸¬ÿÃá °âM¸t{›â®‘’®öÝŒÎW”@5 }9d›:†C hvûÞ9î#ÖVj_o„ƒ6×#g,æN—q±~ù·ŸÀ4ªízꬾ€E–//Šª�^;Ån™j£¼(T�Œ1æÿ-ׇ^‡‹ê±�Aš�%J¶Ú!ÀÐoº «À±Ÿý¹¾3Ý�¦â¯� ã8ç¹á‚n8¹Á6ÜŒÃåXO>œöTþ,ÖËä‹|HÙvLÙwÕ'·•ÝA–Óó½1ûM8‰Wð$MŽð€ëä’=¯èËaŒ¸Ú€OAÙ¿p»^�wLW‰”±Ûƒ»/}bØ<É Ú1Œ£ ¶7î¯.)çÛ÷ðK�xóÿlaÕÚ }’PºTHs=ƒoÊà›º5æò'Ge<Þ{&‚²›{ƒŸ¸üfP“¹m¾_±œc¼â,Ñ©6Å£] ý¯0ñl1‡ñìËfkðÞv¿cHTw[_³J†ºzyM ÄÓÆq‰�ü4A„ßøÔ’v8ÿ£& ',dl•$ñÿJMy^ “£Ò$Ÿç¦£{x>ƒï42«<¬?iü§§Y­<"Î;&ШNJ�ðîÂ|º�2GÅVŽÉ¨k�×óܹgòYœW$óø|ì¬ë‚ÞÖ‰\Üк ËÀÞÖxgëìa§Ø¡—¯Zÿ*„w ÏÍGOçÄzŸè¿)çèŽÕ¤ýG®pÃÚúóÿñçÊCáþH—5ê Q]ªânKd,ïžJjJ�Ž¥ ®Diïì6T¥¦£\æŸþ“¼Ùíãahocorasick_rs-1.0.3/.hypothesis/unicode_data/13.0.0/codec-utf-8.json.gz000066400000000000000000000000741507150176700254620ustar00rootroot00000000000000‹ÿtmp60y5q63x‹Ž6ÐQ055²4�ÕQˆ65761ÑQ0444âØX~Z/¨ahocorasick_rs-1.0.3/CHANGELOG.md000066400000000000000000000065001507150176700163300ustar00rootroot00000000000000# Changelog ## 1.0 * Added support for Python 3.14 and free-threaded Python. * In order to support free-threaded Python, move the burden of thread safety onto users. Specifically: you must not mutate byte arrays and the like that are passed to `BytesAhoCorasick` APIs while those APIs are running. * Dropped support for Python 3.9. ## 0.22.2 * Update Rust dependencies. ## 0.22.1 * Added support for Python 3.13. * Dropped support for Python 3.8. ## 0.22.0 * The GIL is released when using a `bytes` haystack with `BytesAhoCorasick`. Thanks to Isaac Garzón. ## 0.21.0 * Added support for searching `bytes`, `bytearray`, `memoryview`, and similar objects using the `BytesAhoCorasick` class. Thanks to Isaac Garzón. ## 0.20.0 * Added support for Python 3.12. ## 0.19.0 * If an empty string is passed in as a pattern, `AhoCorasick()` will now raise a `ValueError`. Previously using empty patterns could result in garbage results or exceptions when matching. * Upgraded to `aho-corasick` v1.1.1. ## 0.18.0 * Upgraded to `aho-corasick` v1.1.0, which can run faster on ARM machines like newer Macs. ## 0.17.0 * Upgraded to `aho-corasick` v1.0.5, fixing performance regression in construction of `AhoCorasick` objects. ## 0.16.0 * Upgraded to `aho-corasick` v1.0.4, leading to massive reduction in memory usage during construction. ## 0.15.0 * `AhoCorasick()` can now accept an iterable of strings, instead of just a list of strings. This means you can, for example, lazily create patterns in a generator to save memory; the underlying implementation will still use the bulk of the memory, however. * The default implementation (which used to be DFA) will now be chosen heuristically based on the inputs; this may result in a slow-down in some cases. To get the old behavior, you can do `AhoCorasick(..., implementation=Implementation.DFA)`. * Upgraded to `aho-corasick` v1.0.3, which will result in lower memory usage in some cases. * Dropped support for Python 3.7, which is now end of life. * Dropped support for macOS 10.5, which is now end of life. ## 0.14.0 * Upgraded to `aho-corasick` v1.0. * Exposed the choice between DFA, non-contiguous NFA, and contiguous NFA implementations. * `ahocorasick.MatchKind` enum replaces the module-level `MATCHKIND_*` constants. (The old `MATCHKIND_*` constants are deprecated, but will continue to work so long as you were using constants rather than strings.) * Add type signatures. ## 0.13.0 * Use less memory when constructing an instance. * Added an option (``store_patterns``) to control whether patterns are cached on the object. The new behavior is to use a heuristic by default to decide whether to cache the strings. ## 0.12.3 * Added support for Python 3.11. ## 0.12.2 * Added wheels for ARM Macs, and Linux on ARM. * Started distributing a source tarball for platforms lacking wheels. ## 0.12.1 * Dropped support for Python 3.6 (it is no longer maintained); users of Python 3.6 can still use older releases. * Improved performance a little. ## 0.12.0 * Added support for Python 3.10. ## 0.11.0 * Faster performance, thanks to `PyO3` v0.14. ## 0.10.0 * Fixed bug where `find_matches_as_indexes()` didn't give correct offsets for non-ASCII strings ([#12](https://github.com/G-Research/ahocorasick_rs/issues/12)). Thanks to @necrosovereign for reporting and @BurntSushi for suggesting fix. ahocorasick_rs-1.0.3/CODE_OF_CONDUCT.md000066400000000000000000000121431507150176700173160ustar00rootroot00000000000000# Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at c.rindi@gr-oss.io. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. ahocorasick_rs-1.0.3/CONTRIBUTING.md000066400000000000000000000016251507150176700167530ustar00rootroot00000000000000# Contributing to `ahocorasick_rs` Thank you for considering contributing! Note that by contributing your code, you are agreeing to license it under the Apache License 2.0 (see [`LICENSE`](LICENSE)). ## Setting up a development environment First, download and install [Just](https://github.com/casey/just) Then, setup a virtualenv, install dev dependencies, and compile the code: ```bash just setup source venv/bin/activateo # or Windoes equivalent just build-dev ``` ## Running tests and benchmarks To run tests: ```shell-session $ just test ``` To run benchmarks: ```shell-session $ just prep-benchmark # on Linux Intel, disables turbobost $ just benchmark ``` ## Doing a release 1. Update version in `Cargo.toml` 2. Submit a PR 3. Merge to `main` 4. Tag in GitHub with new version number 5. Download Wheels.zip artifact from GitHub Actions 6. Upload by running `maturin upload unzipped-files/*.whl` ahocorasick_rs-1.0.3/Cargo.lock000066400000000000000000000117631507150176700164330ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 4 [[package]] name = "aho-corasick" version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] [[package]] name = "ahocorasick_rs" version = "1.0.3" dependencies = [ "aho-corasick", "itertools", "pyo3", ] [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indoc" version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" [[package]] name = "itertools" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ "either", ] [[package]] name = "libc" version = "0.2.176" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" [[package]] name = "memchr" version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memoffset" version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "portable-atomic" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "proc-macro2" version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "pyo3" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ba0117f4212101ee6544044dae45abe1083d30ce7b29c4b5cbdfa2354e07383" dependencies = [ "indoc", "libc", "memoffset", "once_cell", "portable-atomic", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", "unindent", ] [[package]] name = "pyo3-build-config" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fc6ddaf24947d12a9aa31ac65431fb1b851b8f4365426e182901eabfb87df5f" dependencies = [ "target-lexicon", ] [[package]] name = "pyo3-ffi" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "025474d3928738efb38ac36d4744a74a400c901c7596199e20e45d98eb194105" dependencies = [ "libc", "pyo3-build-config", ] [[package]] name = "pyo3-macros" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e64eb489f22fe1c95911b77c44cc41e7c19f3082fc81cce90f657cdc42ffded" dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", "syn", ] [[package]] name = "pyo3-macros-backend" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "100246c0ecf400b475341b8455a9213344569af29a3c841d29270e53102e0fcf" dependencies = [ "heck", "proc-macro2", "pyo3-build-config", "quote", "syn", ] [[package]] name = "quote" version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] name = "syn" version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "target-lexicon" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "unicode-ident" version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unindent" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" ahocorasick_rs-1.0.3/Cargo.toml000066400000000000000000000014151507150176700164470ustar00rootroot00000000000000[package] name = "ahocorasick_rs" version = "1.0.3" edition = "2024" authors = ["G-Research ", "Itamar Turner-Trauring "] description = "Search a string for multiple substrings at once" readme = "README.md" license = "Apache 2.0" homepage = "https://github.com/G-Research/ahocorasick_rs" repository = "https://github.com/G-Research/ahocorasick_rs" resolver = "2" [lib] name = "ahocorasick_rs" crate-type = ["cdylib"] [dependencies] aho-corasick = "1" itertools = "0.14.0" pyo3 = { version = "0.26", features = ["py-clone"] } [features] # The extension-module song and dance is explained here: # https://pyo3.rs/v0.14.1/faq.html extension-module = ["pyo3/extension-module"] default = ["extension-module"] [profile.release] lto = "fat" ahocorasick_rs-1.0.3/LICENSE000066400000000000000000000261351507150176700155320ustar00rootroot00000000000000 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. ahocorasick_rs-1.0.3/README.md000066400000000000000000000217241507150176700160030ustar00rootroot00000000000000# ahocorasick_rs: Quickly search for multiple substrings at once `ahocorasick_rs` allows you to search for multiple substrings ("patterns") in a given string ("haystack") using variations of the [Aho-Corasick algorithm](https://en.wikipedia.org/wiki/Aho%E2%80%93Corasick_algorithm). In particular, it's implemented as a wrapper of the Rust [`aho-corasick`](https://docs.rs/aho-corasick/) library, and provides a faster alternative to the [`pyahocorasick`](https://pyahocorasick.readthedocs.io/) library. Found any problems or have any questions? [File an issue on the GitHub project](https://github.com/G-Research/ahocorasick_rs). * [Quickstart](#quickstart) * [Choosing the matching algorithm](#matching) * [Additional configuration: speed and memory usage tradeoffs](#configuration2) * [Implementation details](#implementation) * [Benchmarks](#benchmarks) ## Quickstart The `ahocorasick_rs` library allows you to search for multiple strings ("patterns") within a haystack, or alternatively search multiple bytes. For example, let's install the library: ```shell-session $ pip install ahocorasick-rs ``` ### Searching strings We can construct a `AhoCorasick` object: ```python >>> import ahocorasick_rs >>> patterns = ["hello", "world", "fish"] >>> haystack = "this is my first hello world. hello!" >>> ac = ahocorasick_rs.AhoCorasick(patterns) ``` You can construct a `AhoCorasick` object from any iterable (including generators), not just lists: ```python >>> ac = ahocorasick_rs.AhoCorasick((p.lower() for p in patterns)) ``` `AhoCorasick.find_matches_as_indexes()` returns a list of tuples, each tuple being: 1. The index of the found pattern inside the list of patterns. 2. The start index of the pattern inside the haystack. 3. The end index of the pattern inside the haystack. ```python >>> ac.find_matches_as_indexes(haystack) [(0, 17, 22), (1, 23, 28), (0, 30, 35)] >>> patterns[0], patterns[1], patterns[0] ('hello', 'world', 'hello') >>> haystack[17:22], haystack[23:28], haystack[30:35] ('hello', 'world', 'hello') ``` `find_matches_as_strings()` returns a list of found patterns: ```python >>> ac.find_matches_as_strings(haystack) ['hello', 'world', 'hello'] ``` ### Searching `bytes` and other similar objects You can also search `bytes`, `bytearray`, `memoryview`, and other objects supporting the Python buffer API. > **IMPORTANT:** If you are searching mutable buffer, you **must not mutate it in another thread** while `find_matches_as_indexes()` is running. > Similarly, the patterns cannot be mutated while the `BytesAhoCorasick` object is being constructed. ```python >>> patterns = [b"hello", b"world"] >>> ac = ahocorasick_rs.BytesAhoCorasick(patterns) >>> haystack = b"hello world" >>> ac.find_matches_as_indexes(b"hello world") [(0, 0, 5), (1, 6, 11)] >>> patterns[0], patterns[1] (b'hello', b'world') >>> haystack[0:5], haystack[6:11] (b'hello', b'world') ``` The `find_matches_as_strings()` API is not supported by `BytesAhoCorasick`. ## Choosing the matching algorithm ### Match kind There are three ways you can configure matching in cases where multiple patterns overlap, supported by both `AhoCorasick` and `BytesAhoCorasick` objects. For a more in-depth explanation, see the [underlying Rust library's documentation of matching](https://docs.rs/aho-corasick/latest/aho_corasick/enum.MatchKind.html). Assume we have this starting point: ```python >>> from ahocorasick_rs import AhoCorasick, MatchKind ``` #### `Standard` (the default) This returns the pattern that matches first, semantically-speaking. This is the default matching pattern. ```python >>> ac AhoCorasick(["disco", "disc", "discontent"]) >>> ac.find_matches_as_strings("discontent") ['disc'] >>> ac = AhoCorasick(["b", "abcd"]) >>> ac.find_matches_as_strings("abcdef") ['b'] ``` In this case `disc` will match before `disco` or `discontent`. Similarly, `b` will match before `abcd` because it ends earlier in the haystack than `abcd` does: ```python >>> ac = AhoCorasick(["b", "abcd"]) >>> ac.find_matches_as_strings("abcdef") ['b'] ``` #### `LeftmostFirst` This returns the leftmost-in-the-haystack matching pattern that appears first in _the list of given patterns_. That means the order of patterns makes a difference: ```python >>> ac = AhoCorasick(["disco", "disc"], matchkind=MatchKind.LeftmostFirst) >>> ac.find_matches_as_strings("discontent") ['disco'] >>> ac = AhoCorasick(["disc", "disco"], matchkind=MatchKind.LeftmostFirst) ['disc'] ``` Here we see `abcd` matched first, because it starts before `b`: ```python >>> ac = AhoCorasick(["b", "abcd"], matchkind=MatchKind.LeftmostFirst) >>> ac.find_matches_as_strings("abcdef") ['abcd'] ``` ##### `LeftmostLongest` This returns the leftmost-in-the-haystack matching pattern that is longest: ```python >>> ac = AhoCorasick(["disco", "disc", "discontent"], matchkind=MatchKind.LeftmostLongest) >>> ac.find_matches_as_strings("discontent") ['discontent'] ``` ### Overlapping matches You can get all overlapping matches, instead of just one of them, but only if you stick to the default matchkind, `MatchKind.Standard`. Again, this is supported by both `AhoCorasick` and `BytesAhoCorasick`. ```python >>> from ahocorasick_rs import AhoCorasick >>> patterns = ["winter", "onte", "disco", "discontent"] >>> ac = AhoCorasick(patterns) >>> ac.find_matches_as_strings("discontent", overlapping=True) ['disco', 'onte', 'discontent'] ``` ## Additional configuration: speed and memory usage tradeoffs ### Algorithm implementations: trading construction speed, memory, and performance (`AhoCorasick` and `BytesAhoCorasick`) You can choose the type of underlying automaton to use, with different performance tradeoffs. The short version: if you want maximum matching speed, and you don't have too many patterns, try the `Implementation.DFA` implementation and see if it helps. The underlying Rust library supports [four choices](https://docs.rs/aho-corasick/latest/aho_corasick/struct.AhoCorasickBuilder.html#method.kind), which are exposed as follows: * `None` uses a heuristic to choose the "best" Aho-Corasick implementation for the given patterns, balancing construction time, memory usage, and matching speed. This is the default. * `Implementation.NoncontiguousNFA`: A noncontiguous NFA is the fastest to be built, has moderate memory usage and is typically the slowest to execute a search. * `Implementation.ContiguousNFA`: A contiguous NFA is a little slower to build than a noncontiguous NFA, has excellent memory usage and is typically a little slower than a DFA for a search. * `Implementation.DFA`: A DFA is very slow to build, uses exorbitant amounts of memory, but will typically execute searches the fastest. ```python >>> from ahocorasick_rs import AhoCorasick, Implementation >>> ac = AhoCorasick(["disco", "disc"], implementation=Implementation.DFA) ``` ### Trading memory for speed (`AhoCorasick` only) If you use ``find_matches_as_strings()``, there are two ways strings can be constructed: from the haystack, or by caching the patterns on the object. The former takes more work, the latter uses more memory if the patterns would otherwise have been garbage-collected. You can control the behavior by using the `store_patterns` keyword argument to `AhoCorasick()`. * ``AhoCorasick(..., store_patterns=None)``: The default. Use a heuristic (currently, whether the total of pattern string lengths is less than 4096 characters) to decide whether to store patterns or not. * ``AhoCorasick(..., store_patterns=True)``: Keep references to the patterns, potentially speeding up ``find_matches_as_strings()`` at the cost of using more memory. If this uses large amounts of memory this might actually slow things down due to pressure on the CPU memory cache, and/or the performance benefit might be overwhelmed by the algorithm's search time. * ``AhoCorasick(..., store_patterns=False)``: Don't keep references to the patterns, saving some memory but potentially slowing down ``find_matches_as_strings()``, especially when there are only a small number of patterns and you are searching a small haystack. ## Implementation details * Matching on strings releases the GIL, to enable concurrency. Matching on bytes does not currently release the GIL for memory-safety reasons, unless the haystack type is `bytes`. * Not all features from the underlying library are exposed; if you would like additional features, please [file an issue](https://github.com/g-research/ahocorasick_rs/issues/new) or submit a PR. ## Benchmarks As with any benchmark, real-world results will differ based on your particular situation. If performance is important to your application, measure the alternatives yourself! That being said, I've seen `ahocorasick_rs` run 1.5× to 7× as fast as `pyahocorasick`, depending on the options used. You can run the included benchmarks, if you want, to see some comparative results locally. Clone the repository, then: ``` pip install pytest-benchmark ahocorasick_rs pyahocorasick pytest benchmarks/ ``` ahocorasick_rs-1.0.3/RELEASE.md000066400000000000000000000002151507150176700161160ustar00rootroot00000000000000# Release process 1. Update version in `Cargo.toml`. 2. `cargo check` to update `Cargo.lock`. 3. Commit and push. 4. Tag release in GitHub. ahocorasick_rs-1.0.3/benchmarks/000077500000000000000000000000001507150176700166335ustar00rootroot00000000000000ahocorasick_rs-1.0.3/benchmarks/__init__.py000066400000000000000000000000001507150176700207320ustar00rootroot00000000000000ahocorasick_rs-1.0.3/benchmarks/names.txt000066400000000000000000001035011507150176700204770ustar00rootroot00000000000000Olivia Emma Ava Sophia Isabella Charlotte Amelia Mia Harper Evelyn Abigail Emily Ella Elizabeth Camila Luna Sofia Avery Mila Aria Scarlett Penelope Layla Chloe Victoria Madison Eleanor Grace Nora Riley Zoey Hannah Hazel Lily Ellie Violet Lillian Zoe Stella Aurora Natalie Emilia Everly Leah Aubrey Willow Addison Lucy Audrey Bella Nova Brooklyn Paisley Savannah Claire Skylar Isla Genesis Naomi Elena Caroline Eliana Anna Maya Valentina Ruby Kennedy Ivy Ariana Aaliyah Cora Madelyn Alice Kinsley Hailey Gabriella Allison Gianna Serenity Samantha Sarah Autumn Quinn Eva Piper Sophie Sadie Delilah Josephine Nevaeh Adeline Arya Emery Lydia Clara Vivian Madeline Peyton Julia Rylee Brielle Reagan Natalia Jade Athena Maria Leilani Everleigh Liliana Melanie Mackenzie Hadley Raelynn Kaylee Rose Arianna Isabelle Melody Eliza Lyla Katherine Aubree Adalynn Kylie Faith Mary Margaret Ximena Iris Alexandra Jasmine Charlie Amaya Taylor Isabel Ashley Khloe Ryleigh Alexa Amara Valeria Andrea Parker Norah Eden Elliana Brianna Emersyn Valerie Anastasia Eloise Emerson Cecilia Remi Josie Alina Reese Bailey Lucia Adalyn Molly Ayla Sara Daisy London Jordyn Esther Genevieve Harmony Annabelle Alyssa Ariel Aliyah Londyn Juliana Morgan Summer Juliette Trinity Callie Sienna Blakely Alaia Kayla Teagan Alaina Brynlee Finley Catalina Sloane Rachel Lilly Ember Kimberly Juniper Sydney Arabella Gemma Jocelyn Freya June Lauren Amy Presley Georgia Journee Elise Rosalie Ada Laila Brooke Diana Olive River Payton Ariella Daniela Raegan Alayna Gracie Mya Blake Noelle Ana Leila Paige Lila Nicole Rowan Hope Ruth Alana Selena Marley Kamila Alexis Mckenzie Zara Millie Magnolia Kali Kehlani Catherine Maeve Adelyn Sawyer Elsie Lola Jayla Adriana Journey Vera Aspen Joanna Alivia Angela Dakota Camille Nyla Tessa Brooklynn Malia Makayla Rebecca Fiona Mariana Lena Julianna Vanessa Juliet Camilla Kendall Harley Cali Evangeline Mariah Jane Zuri Elaina Sage Amira Adaline Lia Charlee Delaney Lilah Miriam Angelina Mckenna Aniyah Phoebe Michelle Thea Hayden Maggie Lucille Amiyah Annie Alexandria Myla Vivienne Kiara Alani Margot Adelaide Briella Brynn Saylor Destiny Amari Evelynn Haven Phoenix Izabella Kaia Lilliana Harlow Alessandra Madilyn Nina Logan Adelynn Amina Kate Fatima Samara Winter Giselle Evie Arielle Jessica Talia Leia Gabriela Gracelyn Lexi Laura Makenzie Melissa Royalty Rylie Raelyn Gabrielle Paris Daleyza Joy Maisie Oakley Ariyah Kailani Alayah Stephanie Amora Willa Gracelynn Elle Keira Tatum Veronica Milani Felicity Paislee Allie Nylah Ariah Cassidy Lyric Madeleine Miracle Gwendolyn Octavia Dahlia Heidi Celeste Remington Makenna Everlee Scarlet Esmeralda Maci Lainey Jacqueline Kira Lana Brinley Demi Ophelia Lennon Reign Bristol Sabrina Alaya Jennifer Kenzie Angel Luciana Anaya Hallie Ryan Camryn Kinley Daniella Lilith Blair Amanda Collins Jordan Maliyah Rosemary Cataleya Kaylani Gia Alison Leighton Nadia Sutton Carolina Skye Alicia Regina Viviana Yaretzi Heaven Serena Raven Emely Carmen Wren Helen Charleigh Danielle Daphne Esme Nayeli Maddison Sarai Dylan Frances Elisa Mabel Skyler Jenna Emelia Kaitlyn Miranda Marlee Matilda Selah Jolene Wynter Hattie Bianca Haley Lorelei Mira Braelynn Annalise Madelynn Katie Palmer Aylin Elliott Kyla Rory Avianna Liana Shiloh Kalani Jada Kelsey Elianna Jimena Kora Kamryn Ainsley Averie Kensley Helena Holly Emory Macie Amber Zariah Erin Eve Kathryn Renata Kayleigh Emmy Celine Francesca Fernanda April Shelby Poppy Colette Meadow Nia Sierra Cheyenne Edith Oaklynn Kennedi Abby Danna Jazlyn Alessia Mikayla Alondra Addilyn Leona Mckinley Carter Maren Sylvia Alejandra Ariya Astrid Adrianna Charli Imani Maryam Christina Stevie Maia Adelina Dream Aisha Alanna Itzel Azalea Katelyn Kylee Leslie Madilynn Myra Virginia Remy Hanna Aleah Jaliyah Antonella Aviana Cameron Chelsea Cecelia Alia Mae Cadence Emberly Charley Janelle Mallory Kaliyah Elaine Gloria Jayleen Lorelai Malaysia Bethany Briana Beatrice Dorothy Rosie Jemma Noa Carly Mariam Anne Karina Emmalyn Ivory Ivanna Jamie Kara Aitana Jayda Justice Meredith Briar Skyla Khaleesi Dayana Julieta Katalina Kendra Oaklyn Ashlyn Armani Jazmin Kyra Angelica Zahra Dallas Johanna Elliot Macy Monroe Kimber Henley Ari Karsyn Lyanna Lilian Amalia Nola Dior Aleena Megan Michaela Amirah Cassandra Melany Legacy Reyna Alma Emmie Melina Siena Priscilla Ashlynn Savanna Sloan Tiana Aubrie Coraline Reina Allyson Kaydence Sasha Julie Alexia Irene Marilyn Greta Braelyn Emerie Lylah Nalani Monica Aileen Lauryn Anahi Aurelia Kassidy Rayna Romina Lillie Marie Rosa Saige Bonnie Kelly Xiomara Annabella Avah Lacey Anya Liberty Karen Mercy Zelda Baylee Chaya Kenna Roselyn Liv Mara Ensley Malani Malaya Hadassah Lyra Adley Galilea Jaylah Karla Nala Opal Aliza Milena Ailani Louisa Mina Kairi Clementine Louise Maleah Janiyah Marina Anika Julissa Bailee Hayley Jessie Laney Eileen Faye Kynlee Tiffany Lara Angie Joelle Rhea Calliope Jazmine Amani Haylee Aliana Leyla Jolie Kinslee Ryann Simone Milan Lennox Treasure Alora Ellis Rebekah Mikaela Lina Harmoni Yareli Giuliana Lea Harlee Elyse Frida Blaire Aya Laurel Meghan Pearl Zaylee Alena Holland Bria Rayne Bridget Zariyah Kori Frankie Clarissa Brylee Davina Rivka Cynthia Zaria Madalyn Paula Salem Amelie Madisyn Vienna Haisley Ainhoa Journi Karter Oaklee Livia Miley Adele Amaia Yara Averi Emmeline Kyleigh Princess Penny Sariyah Amayah Crystal Keyla Lilyana Linda Aniya Marianna Alaiya Noemi Chanel Estella Isabela Jillian Kallie Ellianna Elsa Itzayana Zora Estelle Chana Raina Royal Sunny Estrella Martha Ellen Kailey Maxine Clare Teresa Annika Kamilah Azariah Della Addyson Kai Lilianna Tinsley Yaritza Navy Winnie Andi Kamiyah Waverly Sky Amaris Ramona Saoirse Hana Judith Halle Laylah Novalee Jaycee Zaniyah Alianna Paulina Jayde Thalia Giovanna Gwen Iliana Elora Ezra Kaylie Braylee Mavis Ellison Margo Mylah Paisleigh Analia August Brittany Kaisley Belen Promise Amiya Dalary Veda Alisson Keilani Oakleigh Guadalupe Leanna Rosalyn Selene Theodora Kamari Anais Elodie Celia Dani Hunter Indie Kenia Nellie Belle Kataleya Lexie Miah Rylan Sylvie Valery Addilynn Dulce Marissa Meilani Natasha Jaylee Kimora Raquel Scarlette Aliya Nataly Whitney Corinne Denver Nathalie Kiera Milana Vada Violeta Luz Addisyn Casey Deborah Tori Zainab Erika Jenesis Avalynn Nancy Emmalynn Hadlee Heavenly Aubrielle Elisabeth Salma Adalee Landry Malayah Novah Egypt Ayleen Blessing Elina Joyce Myah Zoie Christine Jaelynn Persephone Chandler Emmaline Paloma Harleigh Noor Paola India Madalynn Rosalee Florence Maliah Flora Luella Patricia Whitley Carolyn Kathleen Keily Kiana Tenley Alyson Barbara Dana Yasmin Bexley Micah Tatiana Arden Aubriella Lindsey Emani Hailee Lisa Sevyn Fallon Magdalena Tinley Halo Lailah Arlette Ansley Esperanza Cleo Aila Emerald Jaelyn Karlee Kaya Ingrid Jewel Emilee Giana Paityn Zola Amoura Renee Ann Berkley Harriet Queen Sariah Beatrix Sandra Alannah Austyn Freyja Kaylin Samira Taliyah Hadleigh Kaiya Robin Luisa Zendaya Ariadne Dixie Naya Adrienne Rilynn Nyomi Seraphina Artemis Kadence Leena Libby Marcella Marisol Tara Aspyn Loretta Azaria Bellamy Cara Carla Etta Majesty Honesty Jaylene Joselyn Lillianna Violette Aadhya Cherish Arely Ayva Emilie Yamileth Ila Kailyn Karlie Marleigh Micaela Nori Saanvi Abril Scout Dalia Lizbeth Evalyn Iyla Kaelyn Kenley Khalani Angelique Claudia Kassandra Kaylynn Erica Marlowe Sarahi Spencer Susan Everley Layne Carina Raya Aminah Brynleigh Jana Jazlynn Desiree Loyalty Marceline Perla Brenda Mollie Patience Ayah Melani Viola Elia Jovie Jurnee Robyn Chevelle Khari Naila Neveah Rhylee Rosalina Nailah Raylee Alisha Cordelia Emiliana Aliah Antonia Leilany Dara Kenya Annalee Lianna Danica Janessa Joslyn Layan Eleanora Lenora Wendy Amia Birdie Lilia Aislinn Zoya Darcy Mattie Monserrat Vayda Annabel Arleth Farrah Noah Zhavia Jaida Kamora Sonia Kaleah Nuri Celina Evalynn Maisy Zayla Agnes Billie Elissa Maddie Soraya Alyvia Annette Aryanna Audrina Giavanna Moriah Nathalia Aranza Kristina Avalyn Khadija Meera Akira Clover Ivana Kamilla Raylynn Araceli Breanna Melania Rowyn Rylynn Sailor Soleil Carsyn Caylee Kailee Amarah Jordynn Sapphire Alisa Ciara Devyn Lakelyn Miya Selina Tegan Marjorie Shea Stormi Zion Baylor Ireland Laylani Maylee Milah Ayana Kahlani Nathaly Rae Shay Caitlyn Cassie Jaylin Londynn Noel Roxanne Sharon Hensley Mireya Ellery Tabitha Amya Anniston Blayke Jenny Riya Aarna Aiyana Bryleigh Kinzley Mercedes Roselynn Shayla Xena Adela Asha Elayna Jayden Maelynn Ocean Vivianna Vivien Wrenley Aarya Andie Elouise Montserrat Vida Winifred Emberlynn Indigo Maryjane Anita Campbell Janae Jaylynn Karma Leela Adilene Courtney Dalilah Diamond Guinevere Kamille Keren Roslyn Addie Ailyn Amethyst Marian Mariyah Zia Bayleigh Kaira Quincy Rayleigh Rhiannon Rubi Tallulah Jessa Maelyn Dania Drew Nayla Rosalind Samiyah Aida Annelise Ayanna Charity Kyndall Rowen Aimee Brynley Dina Lincoln Theresa Carlee Coral Emberlee Jasmin Katelynn Ida Keziah Kinsleigh Lorena Silvia Amal Cristina Malka Margaux Alaysia Amyra Cambria Khalia Rosalia Susanna Ally Capri Journei Kaycee Taytum Elin Mazikeen Murphy Sidney Adilynn Alaiyah Brenna Kylah Mazie Anabella Evelina Jaylani Kristen Lilyanna Maleni Marigold Saniyah Adira Carmella Elowyn Lesly Mika Addalyn Araya Cindy Colbie Petra Valencia Ziva Addalynn Elowen Finnley Julianne Kacey Kensington Liah Maisyn Prisha Alita Eliyanah Kalina Litzy Ripley Tilly Angeline Asia Brayleigh Kalia Rebeca Rita Beverly Annaleigh Elliette Jazzlyn Madyson Dailyn Gwyneth Katerina Leilah Memphis Amiah Anyla Carlie Carson Emi Jubilee Nyra Serafina Skylah Aleia Ariela Aryana Belinda Isha Karleigh Ryder Darla Eleni Kynslee Zahara Althea Anabelle Audriana Calista Diya Heather Karmen Marlie Zella Zhuri Amberly Aryah Ashtyn Denise Elinor Goldie Inaaya Maizie Rosalynn Tala Austin Betty Geneva Kalea Macey Nadine Raleigh Ashanti Cecily Imogen Ruthie Sally Stormy Tia Yalitza Alba Grecia Journie Lorraine Sherlyn Stacy Tess Ariadna Brynnlee Ira Jersey Marlene America Bryanna Inaya Marin Yuna Anayah Aubri Elara Isadora Janiya Kasey Shanaya Yuliana Zaya Aadya Jael Taya Ameera Emmalee Krystal Leylani Temperance Yasmine Yusra Empress Klara Mariella Natalee Alissa Arie Emmarie Kaleigh Skylynn Yarely Zaira Aleyna Amilia Ayvah Briley Karis Maite Taryn Tyler Alex Ayesha Bentley Carmela Chiara Dariana Ema Giada Gisselle Kelsie Annistyn Bryn Delia Gitty Preslee Aura Essence Georgina Letty Makena Regan Sia Cielo Geraldine Haddie Laikyn Nelly Sana Shannon Shirley Sofie Ivey Jazelle Pamela Tamia Arwen Jamila Judy Pepper Rain Reya Rori Siya True Charlize Larissa Lindsay Brinlee Daenerys Danika Emry Katrina Kyrie Natalya Renesmee Sahara Sol Symphony Tania Aanya Blythe Caitlin Janie Kari Laken Marcela Abbigail Janice Juana Kamiya Katarina Kayleen Lailani Martina Saniya Teigan Asiya Audra Bernadette Emme Janyla Marion Mayra Zarah Ananya Dayanna Esmae Faigy Jalayah Lizeth Addelyn Ashton Beatriz Evangelina Kaci Kaila Lettie Shoshana Alara Azul Elly Emberlyn Gaia Harlie Lucie Starr Delta Ela Giulia Jude Kenzley Rhyan Sanaa Toni Amariah Annabeth Carleigh Edie Eunice Irie Jaclyn Sanai Heidy Lillyanna May Mckayla Merritt Nya Safa Zinnia Avalon Baila Haleigh Jaleah Joan Jocelynn Joey Kya Maura Reece Violetta Ziya Zyla Carley Devorah Eisley Georgiana Harlem Harlyn Jolee Paulette Yesenia Annaliese Aracely Hollyn Izabelle Khadijah Kynleigh Liza Mariela Priya Vivianne Alessa Bree Damaris Graciela Italy Jazmyn Kaelynn Kenzi Lottie Rochel Star Aubrianna Christiana Inara Korra Lidia Milania Saphira Ali Avril Gentry Hollis Jhene Keila Nahla Naima Rihanna Wilhelmina Yamilet Anylah Arlet Jacquelyn Love Miyah Sahana Winona Aleyah Arizona Deanna Gianni Irina Jianna Jovi Linnea Lori Lucinda Nila Noelani Pyper Santana Suri Zaina Adaleigh Hartley Kelani Lakelynn Maple Millicent Noelia Tamara Emrie Estela Ester Huntleigh Karely Kayden Novaleigh Salome Taelynn Adina Ayra Darlene Janet Kailynn Kinlee Marlow Nyah Raine Reem Romy Yvette Anaiah Aries Brighton Cori Destinee Estefania Tianna Abrielle Adalie Angely Arlene Armoni Delanie Elana Elyana Farah Jamiyah Kaley Lois Montana Samiya Shreya Sybil Atarah Kyah Leticia Lucero Aleigha Amaria Amiracle Blakelee Blakelyn Doris Elani Gina Gracyn Ines Karoline Nicolette Rosemarie Samaira Yuri Akshara Alaiah Bennett Cattleya Elisha Kyler Layna Odessa Presleigh Lula Malak Marlo Yazmin Cambrie Emmi Kingsley Maliya Nell Niyah Sterling Tru Yael Adalina Anneliese Clarke Indy Isabell Julietta Karolina Kenzlee Lavender Maritza Nariah Odette Rian Sarina Story Vaeda Zaynab Alya Ashly Blanca Daria Denisse Jakayla Jaylen Lakyn Lillith Mari Moira Theia Tillie Verity Xyla Camden Carol Claira Daylin Donna Emeri Havana Hudson Jaslyn Katia Lela Lillyana Maryn Yvonne Anaisha Calla Glory Harmonie Jiya Kacie Kaidence Kamdyn Kiley Liz Lynlee Raeleigh Ridley Shyla Venus Xochitl Charlene Dalila Rosaleigh Scottie Danae Fatimah Hawa Jannah Kaitlynn Kynzlee Margarita Rio Roxana Skylee Yaretzy Zadie Zelie Amor Analise Blessyn Iman Jupiter Nariyah Prudence Valkyrie Bowie Cienna Evalina Kynnedi Lanie Maddox Neriah Noella Ramsey Tahlia Unique Areli Aylah Emelyn Fern Johana Kaliah Kamya Kenleigh Kourtney Laniyah Laya Leanne Lilyann Milagros Mona Adah Beckett Estefany Ever Gwenyth Honor Jaina Jaya Kaylen Leigha Melodie Navya Pippa Safiya Bellarose Cheyanne Indiana Iva Izzabella Jalani Karissa Kinleigh Naveah Navi Rilee Aislynn Anjali Constance Cooper Juno Leni Malky Milly Naia Rivky Storm Yoselin Adalia Adilyn Amila Avalee Emmerson Karly Kyndal Laine Marli Mileena Nechama Ryley Taelyn Taliah Alanis Audree Avani Dora Kaylyn Makiyah Miller Misha Mylee Dominique Finleigh Kodi Liya Lux Mayah Mckinlee Riverlyn Tina Bridgette Eleanore Joanne Kinzlee Peighton Perry Sama Samia Shaylee Sonya Anissa Jacey Jacklyn Kailany Lane Laynie Liyana Maryann Zaniya Alanah Arayah Berkeley Brisa Caleigh Channing Hailie Iyanna Izabel Janiah Jream Karley Karli Kenslee Yaneli Aiyanna Ameerah Caliyah Emmersyn Irelynn Jahzara Jailyn Kianna Lynn Rania Aiza Alayla Aminata Aoife Arabelle Audrianna Braylynn Camellia Colleen Eila Ivanka Loren Malina Mariajose Melia Melinda Mindy Pia Priscila Shae Vanellope Zayda Analeah Aribella Dayleen Emalyn Emoni Evolet Haidyn Heiress Isa Josephina Luana Maribel Onyx Zayleigh Alyna Britney Cameran Chava Dawsyn Echo Hafsa Jaqueline Karmyn Kavya Kendyl Luca Lyrica Wyatt Ahana Amarie Betsy Cosette Haylie Mackenna Maylin Nirvana Xitlali Abbie Carrie Caydence Delylah Eris Hellen Janylah Jules Kaelani Khali Lluvia Maven Nahomi Philomena Shania Amaira Aviva Ayat Ayda Devin Harlynn Isobel Janelly Jannat Jean Katy Khelani Lacie Mahogany Mayla Ollie Sequoia Sheila Stormie Tiara Zamira Zamora Ziyah Aiyla Avyanna Blakelynn Chasity Darby Eiza Ellarose Ellia Emberleigh Fabiola Gisele Grayson Hermione Hosanna Kendal Lovely Maizy Marielle Raizy Sedona Zena Afton Cambree Charleston Citlali Deja Francis Haniya Jenevieve Kenlee Magdalene Oriana Rosalinda Sumaya Abriella Aniston Annmarie Asma Avaya Berklee Caia Carli Danni Divine Everlie Halima Kalliope Laia Larkin Malena Malika Precious Primrose Triniti Adelia Alyanna Anisa Avaleigh Dawn Emarie Landyn Lotus Nour Shayna Solana Winry Yana Yasmeen Aleen Anabia Asiyah Aubreigh Camdyn Eliora Finlee Haizley Isela Jalaya Jaylyn Joie Merida Ria Samarah Selma Stori Taylin Zayna Adleigh Adrian Aeris Ailany Alyse Andromeda Aubriana Bryce Carissa Coco Desire Eowyn Josey Justyce Kiyah Miabella Niya Rebel Sidra Asher Auri Catarina Dafne Dianna Eliette Elysia Emori Eryn Greer Harmonee Lua Marwa Minerva Paxton Terra Aditi Aliyana Ani Annamarie Bracha Brie Dawson Debora Eternity Hennessy Ilana Ileana Joana Ruhi Taniyah Yolanda Abbey Adara Amyah Ania Annalia Atlas Azlynn Brea Desirae Hayleigh Kinsey Lani Legaci Leora Louella Maeva Mayte Mayzie Paizlee Reilly Serene Taylee Zemira Acelynn Aleyda Analiyah Ariyanna Arrow Atley Hayven Hollie Iyana Jaci Jiselle Kaniyah Kiyomi Klynn Laci Laina Leen Levi Maddilyn Mishka Rachael Rosabella Samaya Sonja Susana Aalayah Adrielle Aira Annalynn Avni Berenice Charly Cianna Coralie Edna Issabella Ivette Kamaria Mariel Nyasia Agatha Alyana Aylani Ellington Elyza Jayne Joi Kiari Kyrah Laiken Linden Maelee Marguerite Marianne Mirabelle Ofelia Renley Rocio Sahasra Shaindy Tanya Vania Ahlani Ahuva Anvi Aulani Aziyah Brigid Delani Ellisyn Emree Evelin Fatoumata Henrietta Iqra Juanita Kyara Laynee Lexa Maiya Marla Mildred Paizley Raelee Saira Sandy Sora Swara Teegan Wednesday Yulissa Adore Ameena Eimy Elliotte Esmee Everett Janna Kambree Kelsi Khaliyah Lucianna Sanaya Stephany Zailey Zari Zofia Aaradhya Adalynne Adella Amerie Amorah Annemarie Arlo Atlee Blakeley Coralee Isra Jesslyn Jia Josefina Kalayah Kit Marbella Mason Nava Reva Skarlett Stacey Timber Toby Liam Noah Oliver William Elijah James Benjamin Lucas Mason Ethan Alexander Henry Jacob Michael Daniel Logan Jackson Sebastian Jack Aiden Owen Samuel Matthew Joseph Levi Mateo David John Wyatt Carter Julian Luke Grayson Isaac Jayden Theodore Gabriel Anthony Dylan Leo Lincoln Jaxon Asher Christopher Josiah Andrew Thomas Joshua Ezra Hudson Charles Caleb Isaiah Ryan Nathan Adrian Christian Maverick Colton Elias Aaron Eli Landon Jonathan Nolan Hunter Cameron Connor Santiago Jeremiah Ezekiel Angel Roman Easton Miles Robert Jameson Nicholas Greyson Cooper Ian Carson Axel Jaxson Dominic Leonardo Luca Austin Jordan Adam Xavier Jose Jace Everett Declan Evan Kayden Parker Wesley Kai Brayden Bryson Weston Jason Emmett Sawyer Silas Bennett Brooks Micah Damian Harrison Waylon Ayden Vincent Ryder Kingston Rowan George Luis Chase Cole Nathaniel Zachary Ashton Braxton Gavin Tyler Diego Bentley Amir Beau Gael Carlos Ryker Jasper Max Juan Ivan Brandon Jonah Giovanni Kaiden Myles Calvin Lorenzo Maxwell Jayce Kevin Legend Tristan Jesus Jude Zion Justin Maddox Abel King Camden Elliott Malachi Milo Emmanuel Karter Rhett Alex August River Xander Antonio Brody Finn Elliot Dean Emiliano Eric Miguel Arthur Matteo Graham Alan Nicolas Blake Thiago Adriel Victor Joel Timothy Hayden Judah Abraham Edward Messiah Zayden Theo Tucker Grant Richard Alejandro Steven Jesse Dawson Bryce Avery Oscar Patrick Archer Barrett Leon Colt Charlie Peter Kaleb Lukas Beckett Jeremy Preston Enzo Luka Andres Marcus Felix Mark Ace Brantley Atlas Remington Maximus Matias Walker Kyrie Griffin Kenneth Israel Javier Kyler Jax Amari Zane Emilio Knox Adonis Aidan Kaden Paul Omar Brian Louis Caden Maximiliano Holden Paxton Nash Bradley Bryan Simon Phoenix Lane Josue Colin Rafael Kyle Riley Jorge Beckham Cayden Jaden Emerson Ronan Karson Arlo Tobias Brady Clayton Francisco Zander Erick Walter Daxton Cash Martin Damien Dallas Cody Chance Jensen Finley Jett Corbin Kash Reid Kameron Andre Gunner Jake Hayes Manuel Prince Bodhi Cohen Sean Khalil Hendrix Derek Cristian Cruz Kairo Dante Atticus Killian Stephen Orion Malakai Ali Eduardo Fernando Anderson Angelo Spencer Gideon Mario Titus Travis Rylan Kayson Ricardo Tanner Malcolm Raymond Odin Cesar Lennox Joaquin Kane Wade Muhammad Iker Jaylen Crew Zayn Hector Ellis Leonel Cairo Garrett Romeo Dakota Edwin Warren Julius Major Donovan Caiden Tyson Nico Sergio Nasir Rory Devin Jaiden Jared Kason Malik Jeffrey Ismael Elian Marshall Lawson Desmond Winston Nehemiah Ari Conner Jay Kade Andy Johnny Jayceon Marco Seth Ibrahim Raiden Collin Edgar Erik Troy Clark Jaxton Johnathan Gregory Russell Royce Fabian Ezequiel Noel Pablo Cade Pedro Sullivan Trevor Reed Quinn Frank Harvey Princeton Zayne Matthias Conor Sterling Dax Grady Cyrus Gage Leland Solomon Emanuel Niko Ruben Kasen Mathias Kashton Franklin Remy Shane Kendrick Shawn Otto Armani Keegan Finnegan Memphis Bowen Dominick Kolton Jamison Allen Philip Tate Peyton Jase Oakley Rhys Kyson Adan Esteban Dalton Gianni Callum Sage Alexis Milan Moises Jonas Uriel Colson Marcos Zaiden Hank Damon Hugo Ronin Royal Kamden Dexter Luciano Alonzo Augustus Kamari Eden Roberto Baker Bruce Kian Albert Frederick Mohamed Abram Omari Porter Enrique Alijah Francis Leonidas Zachariah Landen Wilder Apollo Santino Tatum Pierce Forrest Corey Derrick Isaias Kaison Kieran Arjun Gunnar Rocco Emmitt Abdiel Braylen Maximilian Skyler Phillip Benson Cannon Deacon Dorian Asa Moses Ayaan Jayson Raul Briggs Armando Nikolai Cassius Drew Rodrigo Raphael Danny Conrad Moshe Zyaire Julio Casey Ronald Scott Callan Roland Saul Jalen Brycen Ryland Lawrence Davis Rowen Zain Ermias Jaime Duke Stetson Alec Yusuf Case Trenton Callen Ariel Jasiah Soren Dennis Donald Keith Izaiah Lewis Kylan Kobe Makai Rayan Ford Zaire Landyn Roy Bo Chris Jamari Ares Mohammad Darius Drake Tripp Marcelo Samson Dustin Layton Gerardo Johan Kaysen Keaton Reece Chandler Lucca Mack Baylor Kannon Marvin Huxley Nixon Tony Cason Mauricio Quentin Edison Quincy Ahmed Finnley Justice Taylor Gustavo Brock Ahmad Kyree Arturo Nikolas Boston Sincere Alessandro Braylon Colby Leonard Ridge Trey Aden Leandro Sam Uriah Ty Sylas Axton Issac Fletcher Julien Wells Alden Vihaan Jamir Valentino Shepherd Keanu Hezekiah Lionel Kohen Zaid Alberto Neil Denver Aarav Brendan Dillon Koda Sutton Kingsley Sonny Alfredo Wilson Harry Jaziel Salvador Cullen Hamza Dariel Rex Zeke Mohammed Nelson Boone Ricky Santana Cayson Lance Raylan Lucian Eliel Alvin Jagger Braden Curtis Mathew Jimmy Kareem Archie Amos Quinton Yosef Bodie Jerry Langston Axl Stanley Clay Douglas Layne Titan Tomas Houston Darren Lachlan Kase Korbin Leighton Joziah Samir Watson Colten Roger Shiloh Tommy Mitchell Azariah Noe Talon Deandre Lochlan Joe Carmelo Otis Randy Byron Chaim Lennon Devon Nathanael Bruno Aryan Flynn Vicente Brixton Kyro Brennan Casen Kenzo Orlando Castiel Rayden Ben Grey Jedidiah Tadeo Morgan Augustine Mekhi Abdullah Ramon Saint Emery Maurice Jefferson Maximo Koa Ray Jamie Eddie Guillermo Onyx Thaddeus Wayne Hassan Alonso Dash Elisha Jaxxon Rohan Carl Kelvin Jon Larry Reese Aldo Marcel Melvin Yousef Aron Kace Vincenzo Kellan Miller Jakob Reign Kellen Kristopher Ernesto Briar Gary Trace Joey Clyde Enoch Jaxx Crosby Magnus Fisher Jadiel Bronson Eugene Lee Brecken Atreus Madden Khari Caspian Ishaan Kristian Westley Hugh Kamryn Musa Rey Thatcher Alfred Emory Kye Reyansh Yahir Cain Mordechai Zayd Demetrius Harley Felipe Louie Branson Graysen Allan Kole Harold Alvaro Harlan Amias Brett Khalid Misael Westin Zechariah Aydin Kaiser Lian Bryant Junior Legacy Ulises Bellamy Brayan Kody Ledger Eliseo Gordon London Rocky Valentin Terry Damari Trent Bentlee Canaan Gatlin Kiaan Franco Eithan Idris Krew Yehuda Marlon Rodney Creed Salvatore Stefan Tristen Adrien Jamal Judson Camilo Kenny Nova Robin Rudy Van Bjorn Brodie Mac Jacoby Sekani Vivaan Blaine Ira Ameer Dominik Alaric Dane Jeremias Kyng Reginald Bobby Kabir Jairo Alexzander Benicio Vance Wallace Zavier Billy Callahan Dakari Gerald Turner Bear Jabari Cory Fox Harlem Jakari Jeffery Maxton Ronnie Yisroel Zakai Bridger Remi Arian Blaze Forest Genesis Jerome Reuben Wesson Anders Banks Calum Dayton Kylen Dangelo Emir Malakhi Salem Blaise Tru Boden Kolten Kylo Aries Henrik Kalel Landry Marcellus Zahir Lyle Dario Rene Terrance Xzavier Alfonso Darian Kylian Maison Foster Keenan Yahya Heath Javion Jericho Aziel Darwin Marquis Mylo Ambrose Anakin Jordy Juelz Toby Yael Azrael Brentley Tristian Bode Jovanni Santos Alistair Braydon Kamdyn Marc Mayson Niklaus Simeon Colter Davion Leroy Ayan Dilan Ephraim Anson Merrick Wes Will Jaxen Maxim Howard Jad Jesiah Ignacio Zyon Ahmir Jair Mustafa Jermaine Yadiel Aayan Dhruv Seven Stone Rome Achilles Dimitri Nickolas Cedric Damir Isai Kacen Mikael Skylar Willie Cayde Craig Lev Davian Mccoy Yasir Duncan Eason Leif Osiris Ulysses Ralph Rashad Cristiano Draven Harris Immanuel Zamir Harper Shepard Shmuel Coen Greysen Kolt Pharaoh Decker Dwayne Eliezer Frankie Kendall Rogelio Seamus Avi Torin Gus Meir Everest Reagan Adler Agustin Bishop Jessie Kaisen Ramiro Rio Karim Karsyn Brayson Justus Kyzer Lamar Lyric Shaun Zackary Emmet Ernest Gannon Marley Shlomo Terrell Hakeem Zev Vaughn Cillian Giancarlo Boaz Laith Semaj Benton Karsen Maddux Murphy Noble Terrence Ander Montgomery Ocean Pierre Abner Brent Hollis Yitzchok Coleman Ean Kooper Eliam Konnor Raheem Benedict Camdyn Korbyn Markus Slade Azael Evander Ezrah Randall Brysen Keagan Mike Payton Deshawn Sidney Viaan Zakari Adiel Elmer Elon Gilbert Rolando Yoel Zeus Chad Garrison Jenson Shimon Anton Gibson Kaine Gianluca Giovani Guy Coleson Deangelo Dominique Javon Jones Jovani Micheal Nazir Syncere Andreas Imran Macklin Rylen Westyn Zephaniah Jet Ryatt Amar Bastian Bronx Clarence Elvis Jaxtyn Jonathon Lucien Malaki Tzvi Darrell Kaius Kamron Kenan Menachem Aarush Camron Cashton Joan Amare Bernardo Cal Carsen Channing Deklan Denzel Kentrell Palmer Deon Jai Jakai Krish Aydan Jayvion Avraham Quintin Yair Aspen Benny Edmund Eliot Granger Kyren Gadiel Knowledge Kolson Norman Steve Taj Tyrone Arrow Azriel Casper Dion Ever Lenox Ozzy Veer Beck Bowie Cedar Daylen Wiley Yaakov Benaiah Isiah Kaidyn Riggs Todd Emil Gray Kalvin Kenji Mariano Aurelio Danilo Makhi Matheo Rodolfo Tahj Zephyr Cartier Clifford Khai Kolby Kruz Kymani Bilal Eamon Lyam Viktor Cristopher Jaylon Jethro Link Truman Brenton Gino Jaylin Youssef Zayan Gentry Jordyn Khaza Loki Carlo Finnian Kaycen Milton Smith True Bernard Darien Jahmir Koen Ollie Stephan Aubrey Cortez Elio Khamari Laine Rayyan Ruger Waylen Wolfgang Aleksander Beaux Gilberto Pierson Ryden Aksel Ash Axle Barry Osman Tyree Destin Hasan Lucius Vladimir Chevy Efrain Eleazar Giannis Jean Nikko Teagan Arham Campbell Camryn Cormac Freddy Karl Ishmael Antoine Atharv Josias Ramsey Reynaldo Yaseen Zavian Brantlee Caysen Dior Jahseh Lazarus Nick Tayden Tylan Yuvaan Baron Linkin Marcello Shivansh Akeem Ansel Caius Corbyn Derick Konner Presley Rico Coby Kaeden Kennedy Tiago Aryeh Nikola Roderick Teo Aston Darryl Dov Jael Jarrett Keon Leeland German Kilian Kyrin Riaan Ross Wylder Alton Brenden Cassian Crue Jamarion Kartier Kysen Malikai Ozias Roan Truett Ayman Davon Demarcus Denim Henri Malek Oskar Osvaldo Renzo Zack Arden Armaan Atreyu Gian Jakobe Jakobi Perry Rishi Alessio Amarion Canon Jamar Jaydon Kanan Luther Cian Coy Damion Darnell Glenn Kain Niam Zen Jasiel Jiraiya Tyrell Deegan Elyas Syed Carver Clinton Dovid Kallen Kenton Oren Adolfo Avyaan Geovanni Kyron Thorin Yasin Azai Denis Gionni Gonzalo Hans Huck Ilan Jiovanni Kodi Kross Neo Rami Rian Sami Zaylen Braxtyn Edson Jahir Johnathon Journey Keelan Kenai Kent Klayton Kyan Mikah Mikel Quinten Ammar Fredrick Irving Jacobi Levon Shea Sire Aaryan Bailey Cristobal Demari Jacari Jordi Mickey Tariq Teddy Aven Braylin Brexton Dale Isa Brice Izayah Jaycob Keller Mattias Neal Octavio Rogan Rowdy Auden Haven Monte Urijah Arnold Avion Elvin Gerard Kassius Vince Xaiden Zakariya Zayvion Aditya Aidyn Camren Dev Eliyahu Ismail Jessiah Kylin Massimo Alek Canyon Clint Devonte Fynn Laken Lyndon Monroe Phineas Sevyn Yeshua Abdulrahman Amauri Asaiah Braeden Braiden Elan Jadon Vernon Aizen Carmine Ilyas Ivaan Jovan Massiah Umar Brendon Cru Donte Humberto Jarvis Montana Myron Ramses Sheldon Siddharth Sir Yerik Anas Eiden Ewan Jariel Jhett Kaizer Linus Lux Ranger Sunny Abdul Austen Eitan Izan Kaleo Kamren Nestor Olin Shaya Zakaria Ziggy Cornelius Damarion Daxon Giovanny Haiden Jaleel Kelly Nigel Viraj Zyair Barron Brighton Eros Faris Huxton Kyngston Loyal Rhodes Wren Yakov Ashtyn Dezmond Francesco Jaxsen Khaled Lenny Marquise Orson Yariel Ayansh Benito Dashiell Davin Eddy Fidel Kadence Kashmir Kyran Rishaan Broderick Clifton Dereck Ender Ervin Honor Josh Kael Kamarion Korben Leopold Noam Perseus Rudra Rylee Dan Freddie Kelton Lucio Nehemias Sammy Steele Sultan Warner Advik Aram Finnick Kiyan Lloyd Maksim Ren Taylen Aamir Carsyn Hadi Irvin Linden Stellan Tevin Truth Valor Arman Axell Draco Elam Maxon Raleigh Salman Amin Emrys Isaak Saif Shai West Armon Boyd Braxten Bryer Cam Chace Johnpaul Jules Kurt Lester Trevon Zeppelin Cadence Cecil Earl Gryffin Kip Kit Maxx Mikhail Neymar Ved Aedan Asahd Ayven Brigham Brooklyn Fred Gerson Hagen Morris Rivers Thor Tristin Xavion Zavion Antony Eren Jaidyn Natanael Vito Zymir Alder Alister Avyan Bryar Fitzgerald Gauge Gio Jaxston Kainoa Kiran Masen Micaiah Obadiah Raylen Wilmer Braven Deion Hiram Jacobo Jaxyn Keoni Kyaire Maddix Maverik Sky Aaden Chester Hussain Jahlil Jrue Klay Lazaro Reyan Wylie Yehoshua Brandt Corban Deonte Edrick Jayse Johann Kainen Karam Khristian Kreed Lathan Makari Yousuf Yuvan Ansh Antwan Aris Avrohom Booker Jelani Jeriah Judd Kadyn Kasey Kasyn Kylar Lonnie Sulaiman Syrus Virgil Witten Amado Arley Arvin Britton Hampton Kahlil Kanon Khyree Lex Mars Mauro Mavrick Shaurya Tyrese Zamari Demir Don Kayne Masiah Merritt Sebastien Shaan Yuri Zyan Abbas Braulio Croix Diesel Drayden Efren Giuseppe Holt Hoyt Ivar Jamil Jovanny Markel Shalom Stryker Tom Triston Wolf Charley Davi Grayden Leander Leyton Oakland Oaklee Shamar Shia Yunus Angus Asiah Constantine Fredy Jaeden Koby Simcha Theodor Tiberius Abdirahman Calder Graycen Hendrick Hussein Indiana Isael Ishan Jennings Khylan Korey Kris Savion Zaine Chosen Fischer Jaceon Lake Lamont Mahdi Marko Oden Rigoberto Ronaldo Aeson Brogan Cove Donnie Emmit Hazen Hernan Jorden Kaizen Kyden Neel Osiel Rush Yohan Zyion Abdulaziz Adnan Branch Dandre Ellison Gene Hashim Jaquan Jionni Josef Kalen Keylor Naim Noa Omer Ozzie Pranav Riker Sabastian Zaidyn Abe Addison Amen Domenic Edric Eyad Hamilton Izaac Jasir Nolen Sai Scout Tamir Tyce Akiva Arin Caelum Dashawn Elton Estevan Mahir Marcelino Sloan Tobin Tytus Wendell Ajay Caine Daxtyn Dwight Hansel Ignatius Iverson Jamel Jaron Kingstyn Maddex Malcom Riot Roscoe Samarth Tegan Terence Xavi Yash Yazan Ahaan Arnav Azaiah Benji Damoni Demarion Devan Floyd Jayven Karmelo Marlo Marshawn Nate Orin Ridley Woodrow Zacari Abdullahi Agastya Austyn Bodi Branden Cordell Daylan Divine Domingo Edmond Eidan Giorgio Kaedyn Kage Kirk Leviathan Lexington Marcell Maximillian Nakoa Rihaan Stephon Taysom Xavian Yousif Zabdiel Aurelius Brennen Flint Glen Gracen Hyrum Kasper Konrad Manolo Marlin Nile Paris Riyan Sylvester Tenzin Trae Treyvon Willem Avett Ayub Azlan Breck Chayce Copeland Daryl Deshaun Everette Gavriel Hawkins Issa Kanaan Krue Mohamad Muhammed Samar Selim Shay Shayan Slater Summit Treyson Westen Aharon Alexandro Amaziah Andrei Cy Eldon Esai Herman Javian Jawad Jaydan Jayvon Karsten Kayleb Kingsten Lemuel Ransom Reilly Taha Townes Wynn Yasiel Yisrael Advaith Alexandre Amadeus Amani Avian Basil Champion Damani Egypt Heriberto Holland Jeronimo Johnnie Kacey Lucah Marquez Mendel Mordecai Patricio Rafe Reef Tremaine Zachery Alias Archibald Arion Demetri Dewayne Duane Ely Esdras Jahari Kawhi Knight Marion Nassir Reggie Andrey Armoni Ayce Burke Caison Charleston Chaz Crawford Federico Fenix Filip Finnigan Giovonni Jahsiah Jasai Jed Kaeson Kasai Klaus Lars Matheus Mayer Om Romello Said Shannon Trystan Valen Ames Athan Azaan Camari Carlton Darell Deven Izrael Jaxsyn Jaziah Markell Niall Paulo Quest Riggins Ryu Tylen Akram Alpha Arie Arlen Artist Bradyn Broly Caelan Chancellor Cristofer Cypress Haziel Hendrik Jacques Jaxin Kashtyn Mckinley Miguelangel Naftali Obed Octavius Orrin Oziel Penn Revan Rockwell Ulices Ahmari Aziah Bently Blayne Cai Dave Henley Itzae Jahziel Mahmoud Majesty Marek Maxson Suleiman Theron Abelardo Blair Dontae Eliott Emile Fulton Iman Jordon Keshawn Keyon Kolbe Nikhil Nikita Ori Pax Rayaan Rickey Tre Xavien Abhiram Ahad Aj Clive Colston Darrius Devante Dhruva Everhett Ezio Haze Jairus Jamarcus Jaycion Jaylan Jaysen Joseluis Jru Kipton Kobi Lenin Nahum Niles Rhyder Shiv Sol Xayden Yechiel Yonatan Zuriel Aariz Aayden Allister Armin Daemon Fitz Graeme Hawk Kekoa Lukah Mikhael Mykel Nivaan Quadir Quill Raylon Shakur Aayush Akai Alastair Asad Bauer Brentlee Conway Deklyn Dempsey Devyn Heston Iver Jacen Kemari Koah Larkin Meyer Omarion Patton Riyaan Rye Stuart Unknown Valentine Wayde Xion Zach Aiyden Alakai Aren Aslan Atharva Aylan Ayson Bennet Cree Devansh Fabio Gavyn Ike Isidro Javen Jaycen Johannes Kamal Laurence Lyon Malachai Mamadou Mattis Morrison Ronen Saylor Thompson Tyrus Uziel Zacharias Zackery Aahil Amiri Anay Charbel Ciaran Daksh Eastyn Fritz Harlen Jakoby Jayvian Kaydence Keandre Leviticus Lyan Mace Maceo Makaio Mathis Montrell Saleh Syre Takoda Zaden Abdallah Adriano Aleister Artem Augustin Bayron Beauden Carsten Conley Daquan Daylon Emeric Isreal Johnson Juanpablo Kaito Kamran Keion Masyn Oaklen Octavian Storm Tyshawn Waylan Yandel Yuvraj Aveer Brant Deniz Enoc Everardo Gareth Job Juancarlos Kory Marius Neev Nyle Oshea Pearson Ragnar Saad Sahil Shulem Taron Tavion Trayvon Triton Tymir Zade Aarin Abir Adin Adonai Alston Aramis Bruin Bryden Cael Daylin Elyjah Emric Ezriel Gregorio Huntley Izaak Jareth Jeremih Khyler Kylon Locke Luc Raymundo Richie Salomon Skye Tim Uzziah Viraaj Yasser Aariv Aceson Ammon Ayaansh Brewer Deontae Eoin Haris Jabril Jade Kam Kendrix Loren Mazi Naeem Olivier Ravi Reyaan Shlok Syaire Tyrion Usher Vedansh Yassin Zacchaeus Zayaan Abiel Affan Ahron Anish Antoni Anuel Atom Ayoub Azari Aziz Cassidy Cristhian Darin Domenico Harland Henderson Indy Jaiceon Jakhi Jamere Javari Joah Kainan Kallum Karon Khyrie Kolter Levy Mael Mazen Monty Othniel Rhyatt Safwan Ted Zaedyn Armias Beckam Braelyn Caesar Chayse Dixon Essa Geoffrey Geovanny Hiro Indigo Jahleel Jan Jaxten Jibreel Joao Kal Kavin Khaleel Navy Price Quinlan Rakan Roen Salim Santi Santiel Slate Vander Virat Von Younis Yusef Zaydan Baxter Brayton Cruze Darion Eder Farhan Graydon Herbert Jackie Jadyn Jaheim Jamaal Jeff Kendell Kevon Kion Kollin Makhai Marwan Muhammadali Nicolai Nolyn Radley Reyes Ronny Saleem Selvin Sirius Sven Talen Tarik Tye Whitaker Ziyon Arius Bane Brennon Clarke Colsen Dejuan Demarco Hershy Jaire Jalil Jidenna Jovany Kayvon Kenyon Koltyn Lael Layden Luan Merlin Mikail Murray Natan Nirvaan Omega Prynce Rumi Santhiago Stiles Stratton Tahir Vikram Zekiel Zyler Alexavier Amere Anwar Asaad Ashad Binyomin Courtney Decklan Eesa Erwin Faisal Genaro Kaisyn Kato Ken Lavon Layth Lipa Lisandro Masai Mecca Qasim Raziel Rustin Tyron Wali Wisdom Yaqub Zyir Abhinav Abubakr Akari Akash Amay Ashwin Braedyn Calix Colden Coltyn Cross Darsh Dillan Elder Emari Emry Evaan Evin Evren Gabe Izhaan Jayveon Jersey Jimmie Kaydon Kellin Konstantinos Kota Leslie Marty Naveen Osmar Priest Ramir Rick Rylin Talan Tuff Winter Zac Aero Alain Aman Arya Bryston Calen Clement Conan Cosmo Egan Eloy Galen Haroon Hero Ibraheem Ilias Jahaziel Kaladin Kamil Keilan Kolsen Kruze Maleek Michelangelo Mika Olen Rayne Rayshawn Salah Saxon Sylus Taylin Thayer Trevion Tristyn Willis Zidane Aceyn Ameir Amenadiel Ashten Ayush Boris Carmello Collins Dawsyn Deanthony Deen Fateh Finlee Geronimo Guadalupe Kailer Kwame ahocorasick_rs-1.0.3/benchmarks/test_comparison.py000066400000000000000000000113251507150176700224200ustar00rootroot00000000000000""" Benchmarks comparing ahocorasick_rs to other libraries. We don't just use the same string each time, because pyo3 wants UTF-8, and Python's UTF-8 conversion API caches the conversion, so repeatedly using the same haystack would understate ahocorasick_rs's overhead. """ import os import pytest import ahocorasick # pyahocorasick import ahocorasick_rs # our module # ~5000 popular first names, filtered down to ~4200: with open(os.path.join(os.path.dirname(__file__), "names.txt")) as f: PATTERNS_LONG = [line.strip().lower() for line in f if len(line.strip()) > 4] # 90% no matches, 10% with 1 match, about 600 characters def make_haystacks_long(): line = "No one who had ever seen {} in her infancy would have supposed her born to be an heroine. Her situation in life, the character of her father and mother, her own person and disposition, were all equally against her. Her father was a clergyman, without being neglected, or poor, and a very respectable man, though his name was whatevs—and he had never been handsome. He had a considerable independence besides two good livings—and he was not in the least addicted to locking up his daughters. Her mother was a woman of useful plain sense, with a good temper, and, what is more remarkable, with a good constitution {}.".lower() result = [] for i in range(100000): if i % 90 == 0: name = PATTERNS_LONG[i % len(PATTERNS_LONG)] else: name = "notaperson" result.append(line.format(name, i)) return result HAYSTACKS_LONG = make_haystacks_long() PATTERNS_SHORT = [ "abc", "hello", "world", "aardvark", "fish", "what", "arbitrarymonkey", "birds", "host7", "host76", ] HAYSTACKS_SHORT = [ "arbitrarymonkey says hello to fish host76, 0.123 my friend, but why??? {}".format( i ) for i in range(10_000) ] def make_pyahocorasick_automaton(patterns): automaton = ahocorasick.Automaton() for key in patterns: automaton.add_word(key, key) automaton.make_automaton() return automaton parameterize_datasets = pytest.mark.parametrize( "test_data", [(PATTERNS_SHORT, HAYSTACKS_SHORT), (PATTERNS_LONG, HAYSTACKS_LONG)], ids=["short", "long"], ) @parameterize_datasets def test_pyahocorasick_overlapping(benchmark, test_data): """pyahocorasick overlapping matches.""" patterns, haystacks = test_data automaton = make_pyahocorasick_automaton(patterns) def run(): for haystack in haystacks: x = list(automaton.iter(haystack)) return x print(benchmark(run)) @parameterize_datasets def test_pyahocorasick_longest_match(benchmark, test_data): """pyahocorasick longest matches.""" patterns, haystacks = test_data automaton = make_pyahocorasick_automaton(patterns) def run(): for haystack in haystacks: x = list(automaton.iter_long(haystack)) return x print(benchmark(run)) @parameterize_datasets def test_ahocorasick_rs_standard(benchmark, test_data): """ahocorasick_rs standard matching algorithm.""" patterns, haystacks = test_data ac = ahocorasick_rs.AhoCorasick(patterns) def run(): for haystack in haystacks: x = ac.find_matches_as_strings(haystack) return x print(benchmark(run)) @parameterize_datasets def test_ahocorasick_rs_standard_indexes(benchmark, test_data): """ahocorasick_rs standard matching algorithm, returning indexes.""" patterns, haystacks = test_data ac = ahocorasick_rs.AhoCorasick(patterns) def run(): for haystack in haystacks: x = ac.find_matches_as_indexes(haystack) return x print(benchmark(run)) @parameterize_datasets def test_ahocorasick_rs_overlapping(benchmark, test_data): """ahocorasick_rs overlapping matches.""" patterns, haystacks = test_data ac = ahocorasick_rs.AhoCorasick(patterns) def run(): for haystack in haystacks: x = ac.find_matches_as_strings(haystack, overlapping=True) return x print(benchmark(run)) @parameterize_datasets def test_ahocorasick_rs_longest_match(benchmark, test_data): """ahocorasick_rs longest matches.""" patterns, haystacks = test_data ac = ahocorasick_rs.AhoCorasick( patterns, matchkind=ahocorasick_rs.MatchKind.LeftmostLongest ) def run(): for haystack in haystacks: x = ac.find_matches_as_strings(haystack) return x print(benchmark(run)) @parameterize_datasets def test_overhead(benchmark, test_data): """Just run a function that does everything other than call API.""" _, haystacks = test_data def run(): for haystack in haystacks: _ = haystack print(benchmark(run)) ahocorasick_rs-1.0.3/justfile000066400000000000000000000014311507150176700162650ustar00rootroot00000000000000# Local Variables: # mode: makefile # End: # vim: set ft=make : # # To use this file, install Just as per https://github.com/casey/just You can # then run commands as you would with Makefile, e.g. `just venv`. # Create the virtualenv. venv: python3 -m venv venv # Compile extension and install into the venv. build-dev: pip install . install-dev-dependencies: pip install -r requirements-dev.txt setup: venv install-dev-dependencies lint: flake8 pysrc tests/ black --check pysrc tests/ mypy --strict pysrc tests test: pytest tests/ # Prepare for benchmarking; will only work on Linux: prep-benchmark: pip install pyahocorasick # Disable turbo-boost for more consistent results. echo "1" | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo benchmark: pytest benchmarks/ ahocorasick_rs-1.0.3/pyproject.toml000066400000000000000000000010251507150176700174300ustar00rootroot00000000000000[build-system] requires = ["maturin>=1.0,<2.0"] build-backend = "maturin" [project] name = "ahocorasick_rs" requires-python = ">=3.10" description = "Search for multiple substrings at the same time, and quickly too" dependencies = [ # Technically not necessary to run, only needed for type checking... "typing_extensions >= 4.6.0 ; python_version < '3.12'" ] readme = { file = "README.md", content-type = "text/markdown" } dynamic = ["version", "license", "home_page", "project_url"] [tool.maturin] python-source = "pysrc/"ahocorasick_rs-1.0.3/pysrc/000077500000000000000000000000001507150176700156565ustar00rootroot00000000000000ahocorasick_rs-1.0.3/pysrc/ahocorasick_rs/000077500000000000000000000000001507150176700206505ustar00rootroot00000000000000ahocorasick_rs-1.0.3/pysrc/ahocorasick_rs/__init__.py000066400000000000000000000007771507150176700227740ustar00rootroot00000000000000# Expose the Rust code: from .ahocorasick_rs import ( AhoCorasick, BytesAhoCorasick, MatchKind, Implementation, ) # Backwards compatibility: MATCHKIND_STANDARD = MatchKind.Standard MATCHKIND_LEFTMOST_FIRST = MatchKind.LeftmostFirst MATCHKIND_LEFTMOST_LONGEST = MatchKind.LeftmostLongest __all__ = [ "AhoCorasick", "BytesAhoCorasick", "MatchKind", "Implementation", # Deprecated: "MATCHKIND_STANDARD", "MATCHKIND_LEFTMOST_FIRST", "MATCHKIND_LEFTMOST_LONGEST", ] ahocorasick_rs-1.0.3/pysrc/ahocorasick_rs/ahocorasick_rs.pyi000066400000000000000000000023741507150176700243730ustar00rootroot00000000000000from __future__ import annotations from typing import Optional, Iterable import sys if sys.version_info >= (3, 12): from collections.abc import Buffer else: from typing_extensions import Buffer class Implementation: NoncontiguousNFA: Implementation ContiguousNFA: Implementation DFA: Implementation class MatchKind: Standard: MatchKind LeftmostFirst: MatchKind LeftmostLongest: MatchKind class AhoCorasick: def __init__( self, patterns: Iterable[str], matchkind: MatchKind = MatchKind.Standard, store_patterns: Optional[bool] = None, implementation: Optional[Implementation] = None, ) -> None: ... def find_matches_as_indexes( self, haystack: str, overlapping: bool = False ) -> list[tuple[int, int, int]]: ... def find_matches_as_strings( self, haystack: str, overlapping: bool = False ) -> list[str]: ... class BytesAhoCorasick: def __init__( self, patterns: Iterable[Buffer], matchkind: MatchKind = MatchKind.Standard, implementation: Optional[Implementation] = None, ) -> None: ... def find_matches_as_indexes( self, haystack: Buffer, overlapping: bool = False ) -> list[tuple[int, int, int]]: ... ahocorasick_rs-1.0.3/pysrc/ahocorasick_rs/py.typed000066400000000000000000000000001507150176700223350ustar00rootroot00000000000000ahocorasick_rs-1.0.3/requirements-dev.txt000066400000000000000000000000751507150176700205600ustar00rootroot00000000000000pytest pytest-benchmark flake8 black maturin hypothesis mypy ahocorasick_rs-1.0.3/rust-toolchain.toml000066400000000000000000000000771507150176700203720ustar00rootroot00000000000000[toolchain] channel = "1.90" components = ["rustfmt", "clippy"]ahocorasick_rs-1.0.3/src/000077500000000000000000000000001507150176700153055ustar00rootroot00000000000000ahocorasick_rs-1.0.3/src/lib.rs000066400000000000000000000374551507150176700164370ustar00rootroot00000000000000use std::cell::Cell; use aho_corasick::{ AhoCorasick, AhoCorasickBuilder, AhoCorasickKind, Match, MatchError, MatchKind, }; use itertools::Itertools; use pyo3::{ buffer::{PyBuffer, ReadOnlyCell}, exceptions::{PyTypeError, PyValueError}, prelude::*, types::{PyList, PyString}, }; /// Search for multiple pattern strings against a single haystack string. /// /// Takes four arguments: /// /// * ``patterns``: A list of strings, the patterns to match against. Empty /// patterns are not supported and will result in a ``ValueError`` exception /// being raised. /// * ``matchkind``: Defaults to ``"MATCHKING_STANDARD"``. /// * ``store_patterns``: If ``True``, keep a reference to the patterns, which /// will speed up ``find_matches_as_strings()`` but will use more memory. If /// ``False``, patterns will not be stored. By default uses a heuristic where /// a short list of small strings (up to 4KB) results in ``True``, and /// anything else results in ``False``. /// * ``implementation``: The underlying type of automaton to use for Aho-Corasick. #[pyclass(name = "AhoCorasick")] struct PyAhoCorasick { ac_impl: AhoCorasick, patterns: Option>>, } /// Convert a MatchError to something meaningful to Python users #[cold] fn match_error_to_pyerror(e: MatchError) -> PyErr { PyValueError::new_err(e.to_string()) } /// Return matches for a given haystack. fn get_matches<'a>( ac_impl: &'a AhoCorasick, haystack: &'a [u8], overlapping: bool, ) -> PyResult + 'a> { let mut overlapping_it = None; let mut non_overlapping_it = None; if overlapping { overlapping_it = Some( ac_impl .try_find_overlapping_iter(haystack) .map_err(match_error_to_pyerror)?, ); } else { non_overlapping_it = Some( ac_impl .try_find_iter(haystack) .map_err(match_error_to_pyerror)?, ); } Ok(overlapping_it .into_iter() .flatten() .chain(non_overlapping_it.into_iter().flatten())) } impl PyAhoCorasick { /// Create mapping from byte index to Unicode code point (character) index /// in the haystack. fn get_byte_to_code_point(&self, haystack: &str) -> Vec { // Map UTF-8 byte index to Unicode code point index; the latter is what // Python users expect. let mut byte_to_code_point = vec![usize::MAX; haystack.len() + 1]; let mut max_codepoint = 0; for (codepoint_off, (byte_off, _)) in haystack.char_indices().enumerate() { byte_to_code_point[byte_off] = codepoint_off; max_codepoint = codepoint_off; } // End index is exclusive (e.g. 0:3 is first 3 characters), so handle // the case where pattern is at end of string. if !haystack.is_empty() { byte_to_code_point[haystack.len()] = max_codepoint + 1; } byte_to_code_point } } /// Python equivalent of MatchKind. #[derive(Clone, Copy, Debug, PartialEq)] #[pyclass(eq, name = "MatchKind")] enum PyMatchKind { Standard, LeftmostFirst, LeftmostLongest, } impl From for MatchKind { fn from(value: PyMatchKind) -> Self { match value { PyMatchKind::Standard => Self::Standard, PyMatchKind::LeftmostFirst => Self::LeftmostFirst, PyMatchKind::LeftmostLongest => Self::LeftmostLongest, } } } /// Python equivalent of AhoCorasickKind. #[derive(Clone, Copy, Debug, PartialEq)] #[allow(clippy::upper_case_acronyms)] #[pyclass(eq)] enum Implementation { NoncontiguousNFA, ContiguousNFA, DFA, } impl From for AhoCorasickKind { fn from(value: Implementation) -> Self { match value { Implementation::NoncontiguousNFA => Self::NoncontiguousNFA, Implementation::ContiguousNFA => Self::ContiguousNFA, Implementation::DFA => Self::DFA, } } } /// Methods for PyAhoCorasick. #[pymethods] impl PyAhoCorasick { /// __new__() implementation. #[new] #[pyo3(signature = (patterns, matchkind = PyMatchKind::Standard, store_patterns = None, implementation = None))] fn new( py: Python, patterns: Bound<'_, PyAny>, matchkind: PyMatchKind, store_patterns: Option, implementation: Option, ) -> PyResult { // If set, this means we had an error while parsing the strings from the patterns iterable. let patterns_error: Cell> = Cell::new(None); // Convert the `patterns` iterable into an Iterator over Py: let mut patterns_iter = patterns.try_iter()?.map_while(|pat| { pat.and_then(|i| { i.downcast_into::() .map_err(PyErr::from) .map(|i| i.unbind()) }) .map_or_else( |e| { patterns_error.set(Some(e)); None }, Some::>, ) }); // If store_patterns is None (the default), use a heuristic to decide // whether to store patterns. let mut patterns: Vec> = vec![]; let store_patterns = store_patterns.unwrap_or_else(|| { let mut total = 0; let mut store_patterns = true; for s in patterns_iter.by_ref() { // Highly unlikely that strings will fail to return length, so just expect(). total += s.bind(py).len().expect("String doesn't have length?"); patterns.push(s); if total > 4096 { store_patterns = false; break; } } store_patterns }); if store_patterns { for s in patterns_iter.by_ref() { patterns.push(s); } } let ac_impl = AhoCorasickBuilder::new() .kind(implementation.map(|i| i.into())) .match_kind(matchkind.into()) .build( patterns .clone() .into_iter() .chain(patterns_iter) .chunks(10 * 1024) .into_iter() .flat_map(|chunk| { // Release the GIL in case some other thread wants to do work: py.detach(|| ()); chunk.map(|s| s.extract::(py).ok()) }) .map_while(|s| { s.and_then(|s| { if s.is_empty() { patterns_error.set(Some(PyValueError::new_err( "You passed in an empty string as a pattern", ))); None } else { Some(s) } }) }), ) // TODO make sure this error is meaningful to Python users .map_err(|e| PyValueError::new_err(e.to_string()))?; if let Some(err) = patterns_error.take() { return Err(err); } let patterns = if store_patterns { Some(patterns) } else { None }; Ok(Self { ac_impl, patterns }) } /// Return matches as tuple of (index_into_patterns, /// start_index_in_haystack, end_index_in_haystack). If ``overlapping`` is /// ``False`` (the default), don't include overlapping results. #[pyo3(signature = (haystack, overlapping = false))] fn find_matches_as_indexes( self_: PyRef, haystack: &str, overlapping: bool, ) -> PyResult> { let byte_to_code_point = self_.get_byte_to_code_point(haystack); let py = self_.py(); let matches = get_matches(&self_.ac_impl, haystack.as_bytes(), overlapping)?; py.detach(|| { Ok(matches .map(|m| { ( m.pattern().as_u64(), byte_to_code_point[m.start()], byte_to_code_point[m.end()], ) }) .collect()) }) } /// Return matches as list of patterns (i.e. strings). If ``overlapping`` is /// ``False`` (the default), don't include overlapping results. #[pyo3(signature = (haystack, overlapping = false))] fn find_matches_as_strings<'py>( self_: PyRef<'py, Self>, haystack: &'py str, overlapping: bool, ) -> PyResult> { let py = self_.py(); let matches = get_matches(&self_.ac_impl, haystack.as_bytes(), overlapping)?; let matches = py.detach(|| matches.collect::>().into_iter()); match self_.patterns { Some(ref patterns) => { PyList::new(py, matches.map(|m| patterns[m.pattern()].clone_ref(py))) } _ => PyList::new( py, matches.map(|m| PyString::new(py, &haystack[m.start()..m.end()])), ), } } } /// A wrapper around PyBuffer that can be passed directly to AhoCorasickBuilder. struct PyBufferBytes<'py> { py: Python<'py>, buffer: PyBuffer, } impl<'py> TryFrom> for PyBufferBytes<'py> { type Error = PyErr; // Get a PyBufferBytes from a Python object fn try_from(obj: Bound<'py, PyAny>) -> PyResult { let buffer = PyBuffer::::get(&obj)?; if buffer.dimensions() > 1 { return Err(PyTypeError::new_err( "Only one-dimensional sequences are supported", )); } // Make sure we can get a slice from the buffer let py = obj.py(); let _ = buffer .as_slice(py) .ok_or_else(|| PyTypeError::new_err("Must be a contiguous sequence of bytes"))?; Ok(PyBufferBytes { py, buffer }) } } impl<'a> AsRef<[u8]> for PyBufferBytes<'a> { fn as_ref(&self) -> &[u8] { // This already succeeded when we created PyBufferBytes, so just expect() let slice = self .buffer .as_slice(self.py) .expect("Failed to get a slice from a valid buffer?"); const _: () = assert!( std::mem::size_of::>() == std::mem::size_of::(), "ReadOnlyCell has a different size than u8" ); // Safety: the slice is &[ReadOnlyCell] which has the same memory // representation as &[u8] due to it being a #[repr(transparent)] newtype // around the standard library UnsafeCell, which the documentation // claims has the same representation as the underlying type. // // However, holding this reference while Python code is executing might // result in the buffer getting mutated from under us, which is a violation // of the &[u8] invariants (and having the .readonly() flag set on the // PyBuffer unfortunately doesn't actually guarantee immutability). // // Because &[u8] is `Ungil`, we can't prevent a release of the GIL while // this reference is being held (though even if it wasn't `Ungil`, we // wouldn't be able to prevent calling back into Python while holding // this reference, which might also result in a mutation). // // In addition, in a free-threaded world there is no GIL at all to // prevent mutation. // // Following the lead of `pyo3-numpy`, we deal with this by documenting // to the user that the buffer cannot be mutated while it is passed to // our API. See also https://github.com/PyO3/pyo3/issues/2824 unsafe { std::mem::transmute(slice) } } } /// Search for multiple pattern bytes against a single bytes haystack. In /// addition to ``bytes``, you can use other objects that support the Python /// buffer API, like ``memoryview`` and ``bytearray``. /// /// Takes three arguments: /// /// * ``patterns``: A list of bytes, the patterns to match against. Empty /// patterns are not supported and will result in a ``ValueError`` exception /// being raised. No references are kept to the patterns once construction is /// finished. /// * ``matchkind``: Defaults to ``"MATCHKING_STANDARD"``. /// * ``implementation``: The underlying type of automaton to use for Aho-Corasick. /// /// IMPORTANT: If you are passing in patterns that are mutable buffers, you MUST /// NOT mutate then in another thread while constructing this object. Doing so /// will result in undefined behavior. Once the ``BytesAhoCorasick`` object is /// constructed, however, they can be mutated since no references will be kept /// to them. #[pyclass(name = "BytesAhoCorasick")] struct PyBytesAhoCorasick { ac_impl: AhoCorasick, } /// Methods for PyBytesAhoCorasick. #[pymethods] impl PyBytesAhoCorasick { /// __new__() implementation. #[new] #[pyo3(signature = (patterns, matchkind = PyMatchKind::Standard, implementation = None))] fn new( _py: Python, patterns: Bound<'_, PyAny>, matchkind: PyMatchKind, implementation: Option, ) -> PyResult { // If set, this means we had an error while parsing byte buffers from `patterns` let patterns_error: Cell> = Cell::new(None); // Convert the `patterns` iterable into an Iterator over PyBufferBytes let patterns_iter = patterns .try_iter()? .map_while(|pat| match pat.and_then(PyBufferBytes::try_from) { Ok(pat) => { if pat.as_ref().is_empty() { patterns_error.set(Some(PyValueError::new_err( "You passed in an empty pattern", ))); None } else { Some(pat) } } Err(e) => { patterns_error.set(Some(e)); None } }); let ac_impl = AhoCorasickBuilder::new() .kind(implementation.map(|i| i.into())) .match_kind(matchkind.into()) .build(patterns_iter) // TODO make sure this error is meaningful to Python users .map_err(|e| PyValueError::new_err(e.to_string()))?; if let Some(err) = patterns_error.take() { return Err(err); } Ok(Self { ac_impl }) } /// Return matches as tuple of (index_into_patterns, /// start_index_in_haystack, end_index_in_haystack). If ``overlapping`` is /// ``False`` (the default), don't include overlapping results. /// /// IMPORTANT: If you are passing in a mutable buffer, you MUST NOT mutate /// it in another thread while this API is running. Doing so will result in /// undefined behavior. #[pyo3(signature = (haystack, overlapping = false))] fn find_matches_as_indexes( self_: PyRef, haystack: Bound<'_, PyAny>, overlapping: bool, ) -> PyResult> { let py = haystack.py(); let haystack_buffer = PyBufferBytes::try_from(haystack)?; let matches = get_matches(&self_.ac_impl, haystack_buffer.as_ref(), overlapping)? .map(|m| (m.pattern().as_u64(), m.start(), m.end())); py.detach(|| Ok(matches.collect())) } } /// The main Python module. #[pymodule(gil_used = false)] fn ahocorasick_rs(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; Ok(()) } ahocorasick_rs-1.0.3/tests/000077500000000000000000000000001507150176700156605ustar00rootroot00000000000000ahocorasick_rs-1.0.3/tests/__init__.py000066400000000000000000000000001507150176700177570ustar00rootroot00000000000000ahocorasick_rs-1.0.3/tests/test_ac.py000066400000000000000000000225401507150176700176570ustar00rootroot00000000000000"""Tests for ahocorasick_rs.""" from __future__ import annotations from typing import Optional import pytest from hypothesis import strategies as st from hypothesis import given from ahocorasick_rs import ( AhoCorasick, MATCHKIND_STANDARD, MATCHKIND_LEFTMOST_FIRST, MATCHKIND_LEFTMOST_LONGEST, MatchKind, Implementation, ) @pytest.mark.parametrize("store_patterns", [True, False, None]) @pytest.mark.parametrize( "implementation", [ None, Implementation.NoncontiguousNFA, Implementation.ContiguousNFA, Implementation.DFA, ], ) def test_basic_matching( store_patterns: Optional[bool], implementation: Optional[Implementation] ) -> None: """ find_matches_as_indexes() and find_matches_as_strings() return matching patterns in the given string. """ haystack = "hello, world, hello again" patterns = ["hello", "world"] if store_patterns is None: ac = AhoCorasick(patterns) else: ac = AhoCorasick( patterns, store_patterns=store_patterns, implementation=implementation ) expected = ["hello", "world", "hello"] # find_matches_as_indexes() index_matches = ac.find_matches_as_indexes(haystack) assert [patterns[i] for (i, _, _) in index_matches] == expected assert [haystack[s:e] for (_, s, e) in index_matches] == expected # find_matches_as_strings() assert ac.find_matches_as_strings(haystack) == expected @pytest.mark.parametrize("store_patterns", [True, False, None]) def test_iterator_of_patterns(store_patterns: Optional[bool]) -> None: """ It's possible to construct ``AhoCorasick()`` with an iterator. """ haystack = "hello, world, hello again" patterns = iter(["hello", "world"]) if store_patterns is None: ac = AhoCorasick(patterns) else: ac = AhoCorasick(patterns, store_patterns=store_patterns) expected = ["hello", "world", "hello"] assert ac.find_matches_as_strings(haystack) == expected def test_bad_iterators() -> None: """ When constructed with a bad iterator, the underlying Python error is raised. """ with pytest.raises(TypeError): AhoCorasick(None) # type: ignore with pytest.raises(TypeError): AhoCorasick(["x", 12]) # type: ignore @given( st.lists(st.text(min_size=3), min_size=1, max_size=30_000), st.sampled_from([True, False, None]), ) def test_construction_extensive( patterns: list[str], store_patterns: Optional[bool] ) -> None: """ Exercise the construction code paths, ensuring we end up using all patterns. """ patterns = [f"{p}_{i}_" for (i, p) in enumerate(patterns)] ac = AhoCorasick(patterns, store_patterns=store_patterns) for p in patterns: assert ac.find_matches_as_strings(p) == [p] @pytest.mark.parametrize("store_patterns", [True, False, None]) @pytest.mark.parametrize( "implementation", [ None, Implementation.NoncontiguousNFA, Implementation.ContiguousNFA, Implementation.DFA, ], ) def test_unicode( store_patterns: Optional[bool], implementation: Optional[Implementation] ) -> None: """ Non-ASCII unicode patterns still give correct results for find_matches_as_indexes() and find_matches_as_strings(). """ haystack = "hello, world ☃fishá l🤦l" patterns = ["d ☃f", "há", "l🤦l"] if store_patterns is None: ac = AhoCorasick(patterns) else: ac = AhoCorasick( patterns, store_patterns=store_patterns, implementation=implementation ) index_matches = ac.find_matches_as_indexes(haystack) expected = ["d ☃f", "há", "l🤦l"] assert [patterns[i] for (i, _, _) in index_matches] == expected assert [haystack[s:e] for (_, s, e) in index_matches] == expected assert ac.find_matches_as_strings(haystack) == expected @given(st.text(), st.text(min_size=1), st.text(), st.sampled_from([True, False, None])) def test_unicode_extensive( prefix: str, pattern: str, suffix: str, store_patterns: Optional[bool] ) -> None: """ Non-ASCII unicode patterns still give correct results for find_matches_as_indexes(), with property-testing. """ haystack = prefix + pattern + suffix if store_patterns is None: ac = AhoCorasick([pattern]) else: ac = AhoCorasick([pattern], store_patterns=store_patterns) index_matches = ac.find_matches_as_indexes(haystack) expected = {pattern} assert {i for (i, _, _) in index_matches} == {0} # Occasionally might get an overlap between haystack and preffix/suffix... assert {haystack[s:e] for (_, s, e) in index_matches} == expected assert set(ac.find_matches_as_strings(haystack)) == expected @pytest.mark.parametrize("bad_patterns", [[""], ["", "xx"], ["xx", ""]]) @pytest.mark.parametrize("store_patterns", [True, False]) def test_empty_patterns_are_not_legal( bad_patterns: list[str], store_patterns: bool ) -> None: """ Passing in an empty pattern suggests a bug in user code, and the outputs are bad when you do have that, so raise an error. """ with pytest.raises(ValueError) as e: AhoCorasick(bad_patterns, store_patterns=store_patterns) assert "You passed in an empty string as a pattern" in str(e.value) @given(st.text(min_size=1), st.text(), st.sampled_from([True, False, None])) def test_unicode_totally_random( pattern: str, haystack: str, store_patterns: Optional[bool] ) -> None: """ Catch more edge cases of patterns and haystacks. """ if store_patterns is None: ac = AhoCorasick([pattern]) else: ac = AhoCorasick([pattern], store_patterns=store_patterns) index_matches = ac.find_matches_as_indexes(haystack) string_matches = ac.find_matches_as_strings(haystack) expected_index = haystack.find(pattern) if expected_index == -1: assert index_matches == [] assert string_matches == [] else: assert index_matches[0][1] == expected_index assert [haystack[s:e] for (_, s, e) in index_matches][0] == pattern assert string_matches[0] == pattern def test_matchkind() -> None: """ Different matchkinds give different results. The default, MATCHKIND_STANDARD finds overlapping matches. MATCHKIND_LEFTMOST_FIRST finds the leftmost match if there are overlapping matches, choosing the earlier provided pattern. MATCHKIND_LEFTMOST_LONGEST finds the leftmost match if there are overlapping matches, picking the longest one if there are multiple ones. """ haystack = "This is the winter of my discontent" patterns = ["content", "disco", "disc", "discontent", "winter"] def get_strings(ac: AhoCorasick) -> list[str]: return ac.find_matches_as_strings(haystack) # Default is MATCHKIND_STANDARD: assert get_strings(AhoCorasick(patterns)) == [ "winter", "disc", ] # Explicit MATCHKIND_STANDARD: assert get_strings(AhoCorasick(patterns, matchkind=MATCHKIND_STANDARD)) == [ "winter", "disc", ] assert get_strings(AhoCorasick(patterns, matchkind=MatchKind.Standard)) == [ "winter", "disc", ] # MATCHKIND_LEFTMOST_FIRST: assert get_strings(AhoCorasick(patterns, matchkind=MATCHKIND_LEFTMOST_FIRST)) == [ "winter", "disco", ] assert get_strings(AhoCorasick(patterns, matchkind=MatchKind.LeftmostFirst)) == [ "winter", "disco", ] # MATCHKIND_LEFTMOST_LONGEST: assert get_strings(AhoCorasick(patterns, matchkind=MATCHKIND_LEFTMOST_LONGEST)) == [ "winter", "discontent", ] assert get_strings(AhoCorasick(patterns, matchkind=MatchKind.LeftmostLongest)) == [ "winter", "discontent", ] def test_overlapping() -> None: """ It's possible to get overlapping matches, but only with MATCHKIND_STANDARD. """ haystack = "This is the winter of my discontent" patterns = ["content", "disco", "disc", "discontent", "winter"] def get_strings(ac: AhoCorasick) -> list[str]: assert ac.find_matches_as_strings(haystack) == ac.find_matches_as_strings( haystack, overlapping=False ) assert ac.find_matches_as_indexes(haystack) == ac.find_matches_as_indexes( haystack, overlapping=False ) result = ac.find_matches_as_strings(haystack, overlapping=True) result_indexes = ac.find_matches_as_indexes(haystack, overlapping=True) assert [patterns[i] for (i, _, _) in result_indexes] == result assert [haystack[s:e] for (_, s, e) in result_indexes] == result return result def assert_no_overlapping(ac: AhoCorasick) -> None: with pytest.raises(ValueError): ac.find_matches_as_strings(haystack, overlapping=True) with pytest.raises(ValueError): ac.find_matches_as_indexes(haystack, overlapping=True) # Default is MatchKind.Standard: expected = [ "winter", "disc", "disco", "discontent", "content", ] assert get_strings(AhoCorasick(patterns)) == expected # Explicit MATCHKIND_STANDARD: assert get_strings(AhoCorasick(patterns, matchkind=MatchKind.Standard)) == expected # Other matchkinds don't support overlapping. assert_no_overlapping(AhoCorasick(patterns, matchkind=MatchKind.LeftmostFirst)) assert_no_overlapping(AhoCorasick(patterns, matchkind=MatchKind.LeftmostLongest)) ahocorasick_rs-1.0.3/tests/test_ac_bytes.py000066400000000000000000000217641507150176700210740ustar00rootroot00000000000000"""Tests for ahocorasick_rs's bytes support.""" from __future__ import annotations from typing import Optional import pytest from hypothesis import strategies as st from hypothesis import given from ahocorasick_rs import ( BytesAhoCorasick, MATCHKIND_STANDARD, MATCHKIND_LEFTMOST_FIRST, MATCHKIND_LEFTMOST_LONGEST, MatchKind, Implementation, ) @pytest.mark.parametrize( "implementation", [ None, Implementation.NoncontiguousNFA, Implementation.ContiguousNFA, Implementation.DFA, ], ) def test_basic_matching(implementation: Optional[Implementation]) -> None: """ find_matches_as_indexes() returns matching patterns in the given byte string. """ haystack = b"hello, world, hello again" patterns = [b"hello", b"world"] ac = BytesAhoCorasick(patterns, implementation=implementation) expected = [b"hello", b"world", b"hello"] # find_matches_as_indexes() index_matches = ac.find_matches_as_indexes(haystack) assert [patterns[i] for (i, _, _) in index_matches] == expected assert [haystack[s:e] for (_, s, e) in index_matches] == expected @pytest.mark.parametrize( "implementation", [ None, Implementation.NoncontiguousNFA, Implementation.ContiguousNFA, Implementation.DFA, ], ) def test_different_byte_objects_matching( implementation: Optional[Implementation], ) -> None: """ find_matches_as_indexes() returns matching patterns in the given byte string. """ haystack = b"hello, world, hello again" patterns = [memoryview(b"hello"), bytearray(b"world")] ac = BytesAhoCorasick(patterns, implementation=implementation) # type: ignore expected = [b"hello", b"world", b"hello"] # find_matches_as_indexes() index_matches = ac.find_matches_as_indexes(haystack) assert [patterns[i] for (i, _, _) in index_matches] == expected assert [haystack[s:e] for (_, s, e) in index_matches] == expected @pytest.mark.parametrize( "implementation", [ None, Implementation.NoncontiguousNFA, Implementation.ContiguousNFA, Implementation.DFA, ], ) @pytest.mark.parametrize("haystack_type", [bytes, bytearray, memoryview]) def test_different_byte_haystacks_matching( implementation: Optional[Implementation], haystack_type: type[bytes | bytearray | memoryview], ) -> None: """ find_matches_as_indexes() returns matching patterns in the given byte string. """ haystack = haystack_type(b"hello, world, hello again") patterns = [b"hello", b"world"] ac = BytesAhoCorasick(patterns, implementation=implementation) expected = [b"hello", b"world", b"hello"] # find_matches_as_indexes() index_matches = ac.find_matches_as_indexes(haystack) assert [patterns[i] for (i, _, _) in index_matches] == expected assert [haystack[s:e] for (_, s, e) in index_matches] == expected def test_iterator_of_patterns() -> None: """ It's possible to construct ``BytesAhoCorasick()`` with an iterator. """ haystack = b"hello, world, hello again" patterns = [b"hello", b"world"] ac = BytesAhoCorasick(iter(patterns)) expected = [b"hello", b"world", b"hello"] index_matches = ac.find_matches_as_indexes(haystack) assert [patterns[i] for (i, _, _) in index_matches] == expected assert [haystack[s:e] for (_, s, e) in index_matches] == expected def test_bad_iterators() -> None: """ When constructed with a bad iterator, the underlying Python error is raised. """ with pytest.raises(TypeError): BytesAhoCorasick(None) # type: ignore with pytest.raises(TypeError): BytesAhoCorasick([b"x", 12]) # type: ignore[list-item] # str doesn't implement the buffer API and can't be converted to bytes with pytest.raises(TypeError): BytesAhoCorasick([b"x", "y"]) # type: ignore[list-item] @given( st.lists(st.binary(min_size=3), min_size=1, max_size=30_000), ) def test_construction_extensive(patterns: list[bytes]) -> None: """ Exercise the construction code paths, ensuring we end up using all patterns. """ patterns = [b"%b_%i_" % (p, i) for (i, p) in enumerate(patterns)] ac = BytesAhoCorasick(patterns) for haystack in patterns: assert [ haystack[s:e] for (_, s, e) in ac.find_matches_as_indexes(haystack) ] == [haystack] @given(st.binary(), st.binary(min_size=1), st.binary()) def test_random_bytes_extensive(prefix: bytes, pattern: bytes, suffix: bytes) -> None: """ Random bytes patterns still give correct results for find_matches_as_indexes(), with property-testing. """ haystack = prefix + pattern + suffix ac = BytesAhoCorasick([pattern]) index_matches = ac.find_matches_as_indexes(haystack) assert {i for (i, _, _) in index_matches} == {0} # Occasionally might get overlap between haystack and prefix/suffix... assert {haystack[s:e] for (_, s, e) in index_matches} == {pattern} @pytest.mark.parametrize("bad_patterns", [[b""], [b"", b"xx"], [b"xx", b""]]) def test_empty_patterns_are_not_legal(bad_patterns: list[bytes]) -> None: """ Passing in an empty pattern suggests a bug in user code, and the outputs are bad when you do have that, so raise an error. """ with pytest.raises(ValueError) as e: BytesAhoCorasick(bad_patterns) assert "You passed in an empty pattern" in str(e.value) @given(st.binary(min_size=1), st.binary()) def test_bytes_totally_random(pattern: bytes, haystack: bytes) -> None: """ Catch more edge cases of patterns and haystacks. """ ac = BytesAhoCorasick([pattern]) index_matches = ac.find_matches_as_indexes(haystack) expected_index = haystack.find(pattern) if expected_index == -1: assert index_matches == [] else: assert index_matches[0][1] == expected_index assert [haystack[s:e] for (_, s, e) in index_matches][0] == pattern def test_matchkind() -> None: """ Different matchkinds give different results. The default, MATCHKIND_STANDARD finds overlapping matches. MATCHKIND_LEFTMOST_FIRST finds the leftmost match if there are overlapping matches, choosing the earlier provided pattern. MATCHKIND_LEFTMOST_LONGEST finds the leftmost match if there are overlapping matches, picking the longest one if there are multiple ones. """ haystack = b"This is the winter of my discontent" patterns = [b"content", b"disco", b"disc", b"discontent", b"winter"] def get_strings(ac: BytesAhoCorasick) -> list[bytes]: return [haystack[s:e] for (_, s, e) in ac.find_matches_as_indexes(haystack)] # Default is MATCHKIND_STANDARD: assert get_strings(BytesAhoCorasick(patterns)) == [ b"winter", b"disc", ] # Explicit MATCHKIND_STANDARD: assert get_strings(BytesAhoCorasick(patterns, matchkind=MATCHKIND_STANDARD)) == [ b"winter", b"disc", ] assert get_strings(BytesAhoCorasick(patterns, matchkind=MatchKind.Standard)) == [ b"winter", b"disc", ] # MATCHKIND_LEFTMOST_FIRST: assert get_strings( BytesAhoCorasick(patterns, matchkind=MATCHKIND_LEFTMOST_FIRST) ) == [ b"winter", b"disco", ] assert get_strings( BytesAhoCorasick(patterns, matchkind=MatchKind.LeftmostFirst) ) == [ b"winter", b"disco", ] # MATCHKIND_LEFTMOST_LONGEST: assert get_strings( BytesAhoCorasick(patterns, matchkind=MATCHKIND_LEFTMOST_LONGEST) ) == [ b"winter", b"discontent", ] assert get_strings( BytesAhoCorasick(patterns, matchkind=MatchKind.LeftmostLongest) ) == [ b"winter", b"discontent", ] def test_overlapping() -> None: """ It's possible to get overlapping matches, but only with MATCHKIND_STANDARD. """ haystack = b"This is the winter of my discontent" patterns = [b"content", b"disco", b"disc", b"discontent", b"winter"] def get_strings(ac: BytesAhoCorasick) -> list[bytes]: assert ac.find_matches_as_indexes(haystack) == ac.find_matches_as_indexes( haystack, overlapping=False ) return [ haystack[s:e] for (_, s, e) in ac.find_matches_as_indexes(haystack, overlapping=True) ] def assert_no_overlapping(ac: BytesAhoCorasick) -> None: with pytest.raises(ValueError): ac.find_matches_as_indexes(haystack, overlapping=True) # Default is MatchKind.Standard: expected = [ b"winter", b"disc", b"disco", b"discontent", b"content", ] assert get_strings(BytesAhoCorasick(patterns)) == expected # Explicit MATCHKIND_STANDARD: assert ( get_strings(BytesAhoCorasick(patterns, matchkind=MatchKind.Standard)) == expected ) # Other matchkinds don't support overlapping. assert_no_overlapping(BytesAhoCorasick(patterns, matchkind=MatchKind.LeftmostFirst)) assert_no_overlapping( BytesAhoCorasick(patterns, matchkind=MatchKind.LeftmostLongest) )