pax_global_header00006660000000000000000000000064152604666040014523gustar00rootroot0000000000000052 comment=af1428253467068d4dce1921781b42a31e837ccb ceccomp-4.3.1/000077500000000000000000000000001526046660400131415ustar00rootroot00000000000000ceccomp-4.3.1/.clang-format000066400000000000000000000000631526046660400155130ustar00rootroot00000000000000BasedOnStyle: GNU IfMacros: [EBPF_IF, EBPF_IF_PID] ceccomp-4.3.1/.clangd000066400000000000000000000001451526046660400143720ustar00rootroot00000000000000If: PathMatch: .*\.(h|c) CompileFlags: Add: [-xc] CompileFlags: Add: [-isystem, include/ebpf] ceccomp-4.3.1/.gitattributes000066400000000000000000000000701526046660400160310ustar00rootroot00000000000000# Treat all .h files as C files *.h linguist-language=C ceccomp-4.3.1/.github/000077500000000000000000000000001526046660400145015ustar00rootroot00000000000000ceccomp-4.3.1/.github/workflows/000077500000000000000000000000001526046660400165365ustar00rootroot00000000000000ceccomp-4.3.1/.github/workflows/build.yml000066400000000000000000000043131526046660400203610ustar00rootroot00000000000000name: CI builds on: push: env: TERM: xterm-256color jobs: build: name: ${{ matrix.name }} runs-on: ${{ matrix.runs-on }} strategy: fail-fast: false matrix: include: - name: ubuntu-24.04 CI (clang) runs-on: ubuntu-24.04 deps: asciidoctor gettext libbpf-dev libelf-dev libseccomp-dev pkgconf python3-pytest zlib1g-dev llvm linux-tools-common linux-tools-azure extra-env: BPF_CC=clang CC=clang need-bpftool-workaround: true - name: ubuntu-26.04-arm CI (bpf-gcc) runs-on: ubuntu-26.04-arm deps: bpftool gcc-bpf libbpf-dev libseccomp-dev pkgconf python3-pytest extra-env: BPF_CC=bpf-gcc need-bpftool-workaround: false steps: - name: Checkout uses: actions/checkout@v5 with: fetch-depth: 0 fetch-tags: true - name: Install dependencies run: | sudo apt update sudo apt install -y ${{ matrix.deps }} - name: Install bpftool workaround if: matrix.need-bpftool-workaround shell: bash run: | set -euo pipefail KREL="$(uname -r)" if ! /usr/sbin/bpftool -V >/dev/null 2>&1; then if ! find /usr/lib -type f -name bpftool -perm -111 2>/dev/null | grep -q .; then sudo apt install -y --no-install-recommends linux-tools-generic fi FALLBACK="$(find /usr/lib -type f -name bpftool -perm -111 2>/dev/null | sort -V | tail -n 1)" [[ -n "$FALLBACK" ]] || { echo "No bpftool payload found"; exit 1; } sudo mkdir -p "/usr/lib/linux-tools/${KREL}" sudo ln -sf "$FALLBACK" "/usr/lib/linux-tools/${KREL}/bpftool" fi - name: Configure run: ${{ matrix.extra-env }} CFLAGS=-pedantic ./configure --devmode --prefix=/usr --destdir=build/inst - name: Make run: | make -j$(nproc) make test -j$(nproc) - name: Test run: sudo pytest -v --color yes - name: Install run: | make install ./build/ceccomp version - name: List files size run: (cd build/inst && tree -C --du -h .) ceccomp-4.3.1/.github/workflows/clang-format.yml000066400000000000000000000016161526046660400216370ustar00rootroot00000000000000name: clang-format on: push: env: TERM: xterm-256color jobs: format-check: name: Check code formatting runs-on: ubuntu-26.04 steps: - name: Checkout uses: actions/checkout@v5 - name: Run clang-format run: | fail=0 # Same find logic as the Makefile: C_SRCS, INC_SRCS and EBPF_SRCS. files=() files+=( $(find src -name '*.c') ) files+=( $(find include \( -name lib -o -name ebpf \) -prune -o -name "*.h" -print) ) files+=( $(find ebpf -name '*.bpf.c') ) for file in "${files[@]}"; do diff -u --color=always "$file" <(clang-format-22 "$file") || fail=$((fail + 1)) done if [[ $fail -eq 0 ]]; then echo "🎉 Congrats! All files are formatted." else echo "â�Œ $fail files are not formatted!" fi exit "$fail" ceccomp-4.3.1/.github/workflows/new-release.yml000066400000000000000000000017751526046660400215020ustar00rootroot00000000000000name: New Release on: workflow_dispatch: jobs: build: runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout uses: actions/checkout@v5 - name: Find the latest tag run: | git fetch --tags LATEST_TAG=$(git describe --tags $(git rev-list --tags --max-count=1)) echo "The latest tag is:" $LATEST_TAG echo "LATEST_TAG=$LATEST_TAG" >> $GITHUB_ENV - name: Generate Changelog run: | echo "# What changed" > ${{ github.workspace }}-CHANGELOG.md python3 scripts/release-changelog.py $LATEST_TAG >> ${{ github.workspace }}-CHANGELOG.md - name: Preview Changelog run: cat ${{ github.workspace }}-CHANGELOG.md - name: Release uses: softprops/action-gh-release@v3 with: body_path: ${{ github.workspace }}-CHANGELOG.md repository: ceccomp/ceccomp tag_name: ${{ env.LATEST_TAG }} token: ${{ secrets.GITHUB_TOKEN }} ceccomp-4.3.1/.gitignore000066400000000000000000000004551526046660400151350ustar00rootroot00000000000000build/ __pycache__ compile_commands.json a.out Test result* *.gdb_history *.cache/ CeccompBuild/ diff_result /Makefile po/*.po~ SOURCES.txt include/config.h py-temp/dist/ py-temp/build/ py-temp/ceccomp.egg-info/ py-temp/wheelhouse py-temp/ceccomp/ceccomp include/ebpf test_prog /text gdb_scripts *.mo ceccomp-4.3.1/CHANGELOG.md000066400000000000000000000251341526046660400147570ustar00rootroot00000000000000# CHANGELOG Items marked with :star: is the major change why we release a new version. ## 4.3.1 * :package: **GPG key is renewed!** If you are a packager, please update the gpg keys * :star: Fix `ring_buffer__new` callback signature on *armhf* * :star: Fix `configure` with `clang` and big-endian targets ## 4.3 * :star: New subcommand `capture` to manipulate seccomp with eBPF :link: [#24] * :star: Add new asm format **c-macro** to port *TEXT* easily :link: [#39] * :star: Add support for *sh* since libseccomp 2.6 * :star: Prints seccomp flags when tracing and applies stricter check on return value * :star: `$A / $X` (`$X == 0`) should return `KILL` instead of continuing * :star: Use `seccomp_arch_native` instead of `uname -m` to improve robustness * :star: Add tracee pid in output comment when tracing process * :star: Automatically disable components that are not available during configuration * :star: Fix group-stop trap handling during `trace` * Only run `make test` when `test` need to be compiled * New flag `-e` for `disasm` to treat input as eBPF bytes * Fix `trace` compilation compatibility with Linux 5.15 headers * Fix unit tests compatibility with python 3.13 * `version` now displays dependency versions * Add GitHub CI to automatically test code [#39]: https://github.com/ceccomp/ceccomp/issues/39 [#24]: https://github.com/ceccomp/ceccomp/issues/24 ## 4.2.2 * :star: Keep `CC` as string in `configure` :link: [#37] * :star: Fix flaky seize test with `eventfd` :link: [#38] * Flush stdout in `configure` immediately [#37]: https://github.com/ceccomp/ceccomp/issues/37 [#38]: https://github.com/ceccomp/ceccomp/issues/38 ## 4.2.1 * Fix test error on different architectures ## 4.2 * **BREAKING** :star: Default installation path is set to `/usr/local` like normal programs * :star: Fix seccomp argument comparison in trace since v2.8 * :star: Allow `zig cc` and other compilers that has multiple arguments in `configure` * :star: Reject `ceccomp trace/probe/emu` without positional arguments * :star: Clear value of register A and X when start emulation * :star: Fix in-place return object modification which impacts probe emulations * :star: Lexical scanner now scan a whole word and treat pattern like "ifx" as identifier * Packager is set to `NAME` from `/etc/os-release` if prefix is `/usr` and packager is not set * Print reason when failed to load in trace * Fix potential buffer overflow via TOCTOU :link: [#31] * Add some info in `configure` about devmode :heart: [@k4lizen] :link: [!33] * `dump` is now an alias of `trace` :heart: [@k4lizen] :link: [!35] * Make objects depend on `Makefile` to apply new rules after configure :link: [#34] * Reject invalid architecture name * Add support for 32-bit arm, armv7l and armv8l [#31]: https://github.com/ceccomp/ceccomp/issues/31 [@k4lizen]: https://github.com/k4lizen [!33]: https://github.com/ceccomp/ceccomp/pulls/33 [!35]: https://github.com/ceccomp/ceccomp/pulls/35 [#34]: https://github.com/ceccomp/ceccomp/issues/34 ## 4.1 * :star: Fix asm handle STX incorrectly * :star: Fix big endian machine tracing failure :link: [#29] * :star: Fix emulate not accessing `$mem[idx]` * :star: Fix disasm render using rval status to track lval mem status * :star: Fix BPF instruction limit to 4096 :link: [#30] * :star: Fix asm allow negative JA * :star: Fix emulate `A /= X, X = 0` crash * :star: Fix disasm symbol tracking only works on 256 lines * :star: Fix disasm not decoding NOTIFY * Fix leaked fd when using trace with specified output file * Allocate global filters lazily * Fix too loose cli number parsing * Add more hints when unexpectedly disasming * Skip `check_prog` if disasming filters from kernel * Correct disasm leftover calculation * Increase timeout in test for slow vm * Add missing `$` in emu comment for `return $A` Special credit for codex, which helps us hunt lots of bugs. [#29]: https://github.com/ceccomp/ceccomp/issues/29 [#30]: https://github.com/ceccomp/ceccomp/issues/30 ## 4.0 * **BREAKING** :star: :fire: **We aggressively refactored our code and the asm grammar is a bit different from v3. Please refer to documentation for new grammar.** :fire: * :star: Add seize subfunction in trace pid :link: [#23] * :star: Remove `-mno-omit-leaf-frame-pointer` flag if not supported by cc * :star: Fix asm and disasm endianness problems :link: [#22] * :star: Handle '>=' '>' '<=' '<' correctly :link: [#25] * :star: Find python by `env` for compatibility in `configure` :heart: [@tesuji] :link: [!19] * :star: Migrate to pytest for testing * :star: Migrate to po4a for documentation translation * Print messages in dynamic tests * Add `-q` for trace to suppress `[INFO]` output * Reject text that are error ones for kernel :link: [#17] * Print info when trace found failed seccomp syscall * Support `-` to refer to stdin or stdout * Allow returning numbers or `$A` * Fixed a typo in README :heart: [@k4lizen] :link: [!28] [#22]: https://github.com/ceccomp/ceccomp/issues/22 [#25]: https://github.com/ceccomp/ceccomp/issues/25 [#23]: https://github.com/ceccomp/ceccomp/issues/23 [#17]: https://github.com/ceccomp/ceccomp/issues/17 [@tesuji]: https://github.com/tesuji [!19]: https://github.com/ceccomp/ceccomp/pulls/19 [@k4lizen]: https://github.com/k4lizen [!28]: https://github.com/ceccomp/ceccomp/pulls/28 ## 3.5 * **BREAKING** :star: Now `trace` and `probe` no more accepts `-a`; arch is automatically retrieved via ptrace * :star: Add `i686` arch support * :star: Handle unknown system arch * Fix 32-bit ceccomp `strtol` error * Generalize test script to for different archs * `trace` now follows tracee's arch instead of system's * Fix Makefile implicit rules ## 3.4 * :star: Fix cross arch trace problems :link: [#16] * :star: Add support for NO_COLOR env check :link: [#15] * :star: Fix heap oob write if `goto` exceeds bpf range * :star: Correctly kill children processes when recved signals * :star: Fix potential invalid `%s` access in `ALU` and `ST_STX` * Fix ambiguous `idx` in `ST_STX` * Fix color display in emu * Use `git describe --long` to have unified name pattern in `configure` devmode * Add more tests to check ceccomp behaviour [#15]: https://github.com/ceccomp/ceccomp/issues/15 [#16]: https://github.com/ceccomp/ceccomp/issues/16 ## 3.3 * :star: Add `--enable-static` in `configure` to build statically * Portable release in pip, for x86_64, i386, aarch64, armhf, riscv64 * Fix not-null-terminated argp option array * Fix copyright as GPLv3 or later ## 3.2 * **BREAKING** :star: Enhance arch/syscall prediction :link: [#12] * :star: Add support for Debian build system :link: [#13] * :star: Improve syntax highlighting * Hide unused bpf operation in emu :link: [#14] * Fix `CECCOMP_USAGE` warning as it's a function call * Add a dark-mode css for html doc * Sort source object for reproducible build [#13]: https://github.com/ceccomp/ceccomp/issues/13 [#12]: https://github.com/ceccomp/ceccomp/issues/12 [#14]: https://github.com/ceccomp/ceccomp/issues/14 ## 3.1 * **BREAKING** :star: Add support for multiple process tracing :link: [#3] * :star: Cover all cases of trace pid errors :link: [#11] * :star: Add support for internationalization/localization :link: [#1] * :star: Fix `ld` error when compiling on Kali Linux * Fix potential misuse of `Info` in trace * Improve log system and related color management * Fix output file may not be opened correctly * Add a GitHub action to issue new release easily [#3]: https://github.com/ceccomp/ceccomp/issues/3 [#11]: https://github.com/ceccomp/ceccomp/issues/11 [#1]: https://github.com/ceccomp/ceccomp/issues/1 ## 3.0 * **BREAKING** Remove `-o FILE` for `trace` pid mode * :star: Add doc system powered by *asciidoc* :link: [#2] * :star: Add signal forwarding to `trace` in expected way :link: [#5] * :star: Add subcommand description :link: [#7] * :star: Add color option, can be set to always, auto, never :link: [#10] * :star: Add Python-version configure script :link: [#9] * Warn invalid seccomp filter instead of refuse directly :link: [#4] * Raise errors on corrupted TEXT in `emu` * Suppress printing function if not debugging * Set `$?` to 1 when failed to parse args * Limit truncating file on `-o` flag by checking subcommand * Update color in `return $A` BPF OP for better visual effect * Implement assigning `len(struct seccomp_data)` to `A` or `X` * Implement uninstall operation and verbose control in Makefile [#2]: https://github.com/ceccomp/ceccomp/issues/2 [#5]: https://github.com/ceccomp/ceccomp/issues/5 [#7]: https://github.com/ceccomp/ceccomp/issues/7 [#10]: https://github.com/ceccomp/ceccomp/issues/10 [#4]: https://github.com/ceccomp/ceccomp/issues/4 [#9]: https://github.com/ceccomp/ceccomp/issues/9 ## 2.9 * :star: Fix Makefile compatibility among shells :link: [#6] * Add git-hook to remind dev to update version string * Update color in `return` BPF OP for better visual effect [#6]: https://github.com/ceccomp/ceccomp/issues/6 ## 2.8 * :star: Improve compatibility among compilers * :star: Add Kbuild-like build prompt with progress * Improve logging implementation ## 2.7 * :star: Fix `trace` and `probe` foreground interaction issue * Refactor method to terminate children ## 2.6 * :star: Fix Makefile link order (should be put in the end of line) * Suppress compiler warning by `// fall through` * Applying more checks on `asm` ## 2.5 * :star: Add parentheses for `TRAP` as it has `ret_data`, but *libseccomp* hasn't implement it :link: [seccomp/libseccomp#466] * Add check script * Fix uninitialized memory access [seccomp/libseccomp#466]: https://github.com/seccomp/libseccomp/issues/466 ## 2.4 * :star: Port kernel filter check * Add some logging functions ## 2.3 * Fix `asm` lacking `ALU_NEG` operation * Fix `asm` hanging if ## 2.2 * Fix `emu` emulates wrong ALU operations * Better help message ## 2.1 * Remove `CXX` in Makefile, now it's purely in C * Fix Makefile typo ## 2.0 * :star: Turn to `argp` to parse arguments * :star: Add `-o` mode to output filters * :star: Use C to implement `parsefilter` ## 1.5 * :star: New probe mode to test common syscalls instantly * Adapt completion script to latest code base ## 1.4 * Fix lacking `\n` in trace ## 1.3 * `trace` now accept pid to grab filters * Zsh completion script is capable of completing pid ## 1.2 * :star: Ready for PKGBUILD to build package * Fix zsh completion script ## 1.1 * First release version * Add basic zsh completion script ceccomp-4.3.1/CONTRIBUTING.md000066400000000000000000000024271526046660400153770ustar00rootroot00000000000000# Contribute to ceccomp ## Found a bug Raise an issue directly, write your expected behavior and what was wrong in ceccomp. Attach a minimum reproducible input and your version information (ceccomp and libseccomp). We may close your issue if the bug is not reproducible. ## Want a new feature Raise an issue to tell us what you want. You may write your expected output. Please wait patiently as we may not have spare time to implement it and may close it. We are glad to see your Pull Request :smile:. ## New pull request If you are able to fix some bugs or import some new features, you could open a new pull request. As for new feature, it's recommend to open an issue first to confirm your feature is reasonable. NOTE, don't write code with AI completely, we may close it directly. Run `clang-format` to format your code. The config is under repo root and should be recognized by `clang-format` automatically. Once your pull request is merged, you know that your code is licensed under GPL v3 or later. ## Rebuild objects after modifying headers There is no convenient way to maintain a dependency file to reveal which C file depends on which headers, so if you update header file, please manually rebuild related objects, or simply run `make -B` to rebuild all to apply changes in header. ceccomp-4.3.1/LICENSE000066400000000000000000001045151526046660400141540ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ceccomp-4.3.1/Makefile.in000066400000000000000000000233431526046660400152130ustar00rootroot00000000000000ifneq ($(words $(MAKECMDGOALS)),1) # if no argument was given to make... .DEFAULT_GOAL = all %: # define a last resort default rule @$(MAKE) $@ --no-print-directory -rRf $(firstword $(MAKEFILE_LIST)) # recursive make call, else ifndef ECHO T := $(shell $(MAKE) $(MAKECMDGOALS) --no-print-directory \ -nrRf $(firstword $(MAKEFILE_LIST)) \ ECHO="COUNTTHIS" | grep -c "COUNTTHIS") L := $(shell echo -n $T | wc -m) ifeq ($(NO_COLOR),) GREEN := $(shell printf '\033[32m') RESET := $(shell printf '\033[0m') endif ECHO_NOPROG = printf " $(1)\t$(2)\n" ECHO = printf " %-12s[%$Ld/%$Ld]\t$(2)\n" \ $(1) \ $(shell SHELL=$(SHELL) flock $(LOCK) -c 'read n < $(MARK); echo $$n; echo $$((n+1)) > $(MARK)') \ $T endif # end for progress block, but not for else in line 5 V := {{VERBOSE}} ifeq ($V,1) Q := ECHO := ECHO_NOPROG := else Q := @ endif VERSION := {{VERSION}} TAG_TIME := {{TAG_TIME}} ARCH := $(shell uname -m) TARGET := ceccomp test SRC_DIR := src INC_DIR := include TEST_DIR := test BUILD_DIR := build BUILD_UTIL := $(BUILD_DIR)/utils BUILD_LEXICAL := $(BUILD_DIR)/lexical BUILD_RESOLVER := $(BUILD_DIR)/resolver BUILD_DECODER := $(BUILD_DIR)/decoder LOCK := $(BUILD_DIR)/lock MARK := $(BUILD_DIR)/progress C_SRCS := $(shell find $(SRC_DIR) -name '*.c' | LC_ALL=C sort) INC_SRCS := $(shell find $(INC_DIR) -name '*.h' | LC_ALL=C sort) TEST_SRCS := $(TEST_DIR)/unit_test.c OBJS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(C_SRCS)) TEST_OBJS := $(patsubst $(TEST_DIR)/%.c,$(BUILD_DIR)/%.o,$(TEST_SRCS)) {{DOC_IF}} DOC_DIR := docs IMG_DIR := images SRC_IMG_DIR := $(DOC_DIR)/$(IMG_DIR) BUILD_IMG_DIR := $(BUILD_DIR)/$(IMG_DIR) IMG_SRCS := $(shell find $(SRC_IMG_DIR) -name "*.webp") {{DOC_ENDIF}} CC := {{CC}} {{EBPF_IF}} BPF_CC := {{BPF_CC}} BPFTOOL := {{BPFTOOL}} BPF_FLAGS := -O2 -g -I$(INC_DIR) -isystem $(INC_DIR)/ebpf -D__TARGET_ARCH_{{BPF_ARCH}} {{BPF_EXTRA_FLAG}} {{EBPF_ENDIF}} LOCALE_DIR := {{LOCALEDIR}} CFLAGS := -fpie -fstack-protector -Wall -Wextra {{SYS_INC_DIR}} {{EXTRA_CFLAGS}} LDFLAGS := -z now -z noexecstack -fpie -fstack-protector -Wall -Wextra {{SYS_LIB_DIR}} {{LIBSECCOMP_FLAG}} {{LIBARGP_FLAG}} {{LIBBPF_FLAG}} {{EXTRA_LDFLAGS}} DEBUG := {{DEBUG_LEVEL}} ifdef DEBUG ifeq ($(DEBUG),1) CFLAGS += -g -O2 -fno-omit-frame-pointer {{ARCH_PRESERVE_FP}} LDFLAGS += -g -O2 else ifeq ($(DEBUG),2) CFLAGS += -g3 -O0 -DDEBUG # O0 preserve fp by default LDFLAGS += -g3 -O0 endif else CFLAGS += -O2 LDFLAGS += -O2 -s endif STATIC := {{IS_STATIC}} ifeq ($(STATIC), 1) CFLAGS += -static LDFLAGS += -static endif ifdef EXPORT CFLAGS += -DEXPORT endif all: ceccomp {{DOC_IF}}doc{{DOC_ENDIF}} {{I18N_IF}}mo{{I18N_ENDIF}} {{I18N_IF}} ##### INTERNATIONALIZATION PART ##### I18N_DIR := po PO_ZHCN := $(I18N_DIR)/zh_CN.po MO_ZHCN := $(patsubst $(I18N_DIR)/%.po,$(BUILD_DIR)/%.mo,$(PO_ZHCN)) update-po: $Q$(MAKE) -C $(I18N_DIR) --no-print-directory Q=$Q $(MO_ZHCN): $(PO_ZHCN) | $(BUILD_DIR) $(MARK) $Q$(call ECHO,MSGFMT,$@) $Qmsgfmt -o $@ $< mo: $(MO_ZHCN) $Q$(call ECHO_NOPROG,$(GREEN)BUILT,mo$(RESET)) .PHONY: update-po mo {{I18N_ENDIF}} ##### DOCUMENTATION PART ##### {{DOC_IF}} MAN_OBJ := $(BUILD_DIR)/ceccomp.1 MAN_CHN := $(BUILD_DIR)/cn/ceccomp.1 HTML_OBJ := $(BUILD_DIR)/ceccomp.html HTML_CHN := $(BUILD_DIR)/ceccomp-cn.html ASCIIDOC := {{ASCIIDOC}} doc: doc_html doc_man doc_man: $(MAN_OBJ) $(MAN_CHN) $Q$(call ECHO_NOPROG,$(GREEN)BUILT,man doc$(RESET)) doc_html: $(HTML_OBJ) $(HTML_CHN) $Q$(call ECHO_NOPROG,$(GREEN)BUILT,html doc$(RESET)) $(MAN_OBJ): $(DOC_DIR)/ceccomp.adoc Makefile | $(BUILD_DIR) $(MARK) $Q$(call ECHO,ADOC,$@) $Q$(ASCIIDOC) -b manpage $< -a VERSION=$(VERSION) -a ARCH=$(ARCH) -a TAG_TIME=$(TAG_TIME) -o $@ $(MAN_CHN): $(DOC_DIR)/ceccomp.zh_CN.adoc Makefile | $(BUILD_DIR) $(MARK) $Q$(call ECHO,ADOC,$@) $Q$(ASCIIDOC) -b manpage $< -a VERSION=$(VERSION) -a ARCH=$(ARCH) -a TAG_TIME=$(TAG_TIME) -o $@ $(HTML_OBJ): $(DOC_DIR)/ceccomp.adoc Makefile | $(BUILD_DIR) $(MARK) $Q$(call ECHO,ADOC,$@) $Q$(ASCIIDOC) -b html5 $< -a VERSION=$(VERSION) -a ARCH=$(ARCH) -a TAG_TIME=$(TAG_TIME) -o $@ $(HTML_CHN): $(DOC_DIR)/ceccomp.zh_CN.adoc Makefile | $(BUILD_DIR) $(MARK) $Q$(call ECHO,ADOC,$@) $Q$(ASCIIDOC) -b html5 $< -a VERSION=$(VERSION) -a ARCH=$(ARCH) -a TAG_TIME=$(TAG_TIME) -o $@ .PHONY: doc doc_man doc_html {{DOC_ENDIF}} ##### INSTALL CECCOMP ##### DESTDIR := {{DESTDIR}} PREFIX := {{PREFIX}} BIN_DIR := {{BINDIR}} ZSH_FPATH := {{ZSH_FPATH}} ZSH_SRC := completions install: bin_install zsh_cmp_install {{DOC_IF}}doc_install{{DOC_ENDIF}} {{I18N_IF}}mo_install{{I18N_ENDIF}} bin_install: ceccomp $(BUILD_DIR)/ceccomp $Q$(call ECHO_NOPROG,INSTALL,$< $(BIN_DIR)) $Qinstall -Dt $(DESTDIR)$(BIN_DIR) $(BUILD_DIR)/ceccomp zsh_cmp_install: $(ZSH_SRC)/_ceccomp $Q$(call ECHO_NOPROG,INSTALL,$< $(ZSH_FPATH)) $Qinstall -Dm 0644 -t $(DESTDIR)$(ZSH_FPATH) $< .PHONY: bin_install zsh_cmp_install install {{DOC_IF}} MAN_DIR := {{MANDIR}} MAN_DST := $(MAN_DIR)/man1 MAN_CHN_DST := $(MAN_DIR)/zh_CN/man1 DOC_INSTALL_DIR := {{DOCDIR}} HTML_DST := $(DOC_INSTALL_DIR)/html doc_install: doc doc_man_install doc_html_install {{I18N_IF}}doc_man_cn_install{{I18N_ENDIF}} doc_images_install $Q$(call ECHO_NOPROG,INSTALL,README.md $(DOC_INSTALL_DIR)) $Qinstall -Dm 0644 -t $(DESTDIR)$(DOC_INSTALL_DIR) README.md doc_man_install: $(MAN_OBJ) $Q$(call ECHO_NOPROG,INSTALL,$< $(MAN_DST)) $Qinstall -Dm 0644 -t $(DESTDIR)$(MAN_DST) $< doc_man_cn_install: $(MAN_CHN) $Q$(call ECHO_NOPROG,INSTALL,$< $(MAN_CHN_DST)) $Qinstall -Dm 0644 -t $(DESTDIR)$(MAN_CHN_DST) $< doc_html_install: $(HTML_OBJ) $(HTML_CHN) $Q$(call ECHO_NOPROG,INSTALL,$< $(HTML_DST)) $Qinstall -Dm 0644 -t $(DESTDIR)$(HTML_DST) $^ doc_images_install: $(IMG_SRCS) $Q$(call ECHO_NOPROG,INSTALL,images $(HTML_DST)) $Qinstall -Dm 0644 -t $(DESTDIR)$(HTML_DST)/images $^ .PHONY: doc_man_install doc_html_install doc_man_cn_install doc_images_install doc_install {{DOC_ENDIF}} {{I18N_IF}} mo_install: $(MO_ZHCN) $Q$(call ECHO_NOPROG,INSTALL,$< $(LOCALE_DIR)) $Qinstall -Dm 0644 $< $(patsubst $(BUILD_DIR)/%.mo,$(DESTDIR)$(LOCALE_DIR)/%/LC_MESSAGES/ceccomp.mo,$<) .PHONY: mo_install {{I18N_ENDIF}} UNINSTALL = test -f $(1) && rm -f $(1) || : UNINSTALL_RECURSIVE = test -d $(1) && rm -rf $(1) || : uninstall: $Q$(call ECHO_NOPROG,UNINSTALL,$(BIN_DIR)/ceccomp) $Q$(call UNINSTALL,$(DESTDIR)$(BIN_DIR)/ceccomp) $Q$(call ECHO_NOPROG,UNINSTALL,$(ZSH_FPATH)/_ceccomp) $Q$(call UNINSTALL,$(DESTDIR)$(ZSH_FPATH)/_ceccomp) {{DOC_IF}} $Q$(call ECHO_NOPROG,UNINSTALL,$(MAN_DIR)/man1/ceccomp.1) $Q$(call UNINSTALL,$(DESTDIR)$(MAN_DIR)/man1/ceccomp.1) $Q$(call ECHO_NOPROG,UNINSTALL,$(MAN_DIR)/zh_CN/man1/ceccomp.1) $Q$(call UNINSTALL,$(DESTDIR)$(MAN_DIR)/zh_CN/man1/ceccomp.1) $Q$(call ECHO_NOPROG,UNINSTALL,$(DOC_INSTALL_DIR)) $Q$(call UNINSTALL_RECURSIVE,$(DESTDIR)$(DOC_INSTALL_DIR)/../ceccomp) # in case DOC_INSTALL_DIR is not set... {{DOC_ENDIF}} .PHONY: uninstall {{EBPF_IF}} ##### EBPF PART ##### EBPF_DIR := ebpf EBPF_INC_DIR := $(INC_DIR)/$(EBPF_DIR) EBPF_SRCS := $(shell find $(EBPF_DIR) -name '*.c' | LC_ALL=C sort) EBPF_OBJS := $(patsubst $(EBPF_DIR)/%.c,$(BUILD_DIR)/%.o,$(EBPF_SRCS)) EBPF_SKELS := $(patsubst $(EBPF_DIR)/%.bpf.c,$(EBPF_INC_DIR)/%.skel.h,$(EBPF_SRCS)) .SECONDARY: $(EBPF_OBJS) {{VMLINUX_IF}} VMLINUX_HEADER := $(EBPF_INC_DIR)/vmlinux.h VMLINUX_FILE := {{VMLINUX_FILE}} $(VMLINUX_HEADER): | $(EBPF_INC_DIR) $(MARK) $Q$(call ECHO,BPFTOOL,$@) $Q$(BPFTOOL) btf dump file $(VMLINUX_FILE) format c > $@ \ 2>$(BUILD_DIR)/bpftool.log; ret=$$?; \ grep -vF 'skipping /sys/kernel/btf/vmlinux' $(BUILD_DIR)/bpftool.log >&2; \ exit $$ret {{VMLINUX_ENDIF}} $(BUILD_DIR)/%.bpf.o: $(EBPF_DIR)/%.bpf.c Makefile | {{VMLINUX_IF}}$(VMLINUX_HEADER){{VMLINUX_ENDIF}} $(BUILD_DIR) $(MARK) $Q$(call ECHO,BPF_CC,$@) $Q$(BPF_CC) $(BPF_FLAGS) $< -c -o $@ {{LLVM_STRIP_IF}} $Qllvm-strip -g $@ {{LLVM_STRIP_ENDIF}} $(EBPF_INC_DIR)/%.skel.h: $(BUILD_DIR)/%.bpf.o | $(EBPF_INC_DIR) $(MARK) $Q$(call ECHO,BPFTOOL,$@) $Q$(BPFTOOL) gen skeleton $< > $@ $(EBPF_INC_DIR): $Q$(call ECHO_NOPROG,MKDIR,$@) $Qmkdir -p $@ {{EBPF_ENDIF}} CAPTURE_SRC := $(SRC_DIR)/capture.c CAPTURE_OBJ := $(BUILD_DIR)/capture.o ##### C OBJECTS ##### CONFIG_HEADER := $(INC_DIR)/config.h $(CONFIG_HEADER): Makefile | $(MARK) $Q$(call ECHO,SED,$@) $Qsed -e 's/@@VERSION@@/$(VERSION)/;' \ -e 's/@@TAG_TIME@@/$(TAG_TIME)/;' \ -e 's^@@BUILDER@@^{{BUILDER}}^;' \ -e 's^@@EBPF_ON@@^{{EBPF_ON}}^;' \ -e '{{LOCALE_SED}}' \ $(CONFIG_HEADER).in > $(CONFIG_HEADER) ceccomp: $(BUILD_DIR)/ceccomp $Q$(call ECHO_NOPROG,$(GREEN)BUILT,$@$(RESET)) $(BUILD_DIR)/ceccomp: $(OBJS) $(CECCOMP_MAIN) | $(BUILD_DIR) $(MARK) $Q$(call ECHO,LD,$@) $Q$(CC) $^ -o $@ $(LDFLAGS) test: $(BUILD_DIR)/test $Q$(call ECHO_NOPROG,$(GREEN)BUILT,$@$(RESET)) $(BUILD_DIR)/test: $(TEST_OBJS) | $(BUILD_DIR) $(MARK) $Q$(call ECHO,LD,$@) $Q$(CC) $^ -o $@ $(LDFLAGS) $(CAPTURE_OBJ): $(CAPTURE_SRC) $(CONFIG_HEADER) {{EBPF_IF}}$(EBPF_SKELS){{EBPF_ENDIF}} Makefile | $(BUILD_DIR) $(MARK) $Q$(call ECHO,CC,$@) $Q$(CC) -I$(INC_DIR) $(CFLAGS) -Wno-overlength-strings $< -c -o $@ $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(CONFIG_HEADER) Makefile | $(BUILD_DIR) $(MARK) $Q$(call ECHO,CC,$@) $Q$(CC) -I$(INC_DIR) $(CFLAGS) $< -c -o $@ $(BUILD_DIR)/%.o: $(TEST_DIR)/%.c Makefile | $(BUILD_DIR) $(MARK) $Q$(call ECHO,CC,$@) $Q$(CC) -I$(INC_DIR) $(CFLAGS) $< -c -o $@ $(BUILD_DIR): $Q$(call ECHO_NOPROG,MKDIR,$(BUILD_DIR)) $Qmkdir -p $(BUILD_DIR) $(BUILD_UTIL) $(BUILD_LEXICAL) $(BUILD_RESOLVER) $(BUILD_TEST) $(BUILD_IMG_DIR) $(BUILD_DECODER) FORCE: $(MARK): FORCE | $(BUILD_DIR) $Qecho 1 > $(MARK) .PHONY: clean all ceccomp test clean: $Q$(call ECHO_NOPROG,RM,$(BUILD_DIR)) $Qrm -rf $(BUILD_DIR) $Q$(call ECHO_NOPROG,RM,$(CONFIG_HEADER)) $Qrm -f $(CONFIG_HEADER) {{EBPF_IF}} $Q$(call ECHO_NOPROG,RM,$(EBPF_INC_DIR)) $Qrm -rf $(EBPF_INC_DIR) {{EBPF_ENDIF}} endif ceccomp-4.3.1/README.md000066400000000000000000000124631526046660400144260ustar00rootroot00000000000000# Ceccomp ceccomp icon → Read this in [简体中文](README.zh_CN.md) â†� C reimplementation of `seccomp-tools` with advanced features. We basically pronounce ceccomp in "C-comp" (/siË�ˈkÉ’mp/) or "seccomp" (/ˈsÉ›k.kÉ’mp/). ## Features - :gear: Robust assembler and disassembler - :blue_book: Complete documentation - :1234: Various architecture support powered by libseccomp - :globe_with_meridians: Multi-language support - :feather: Minimum build dependencies for core binary - :paintbrush: Enhanced syntax highlighting - :100: Informational error messages - :shell: Powerful Zshell completion - :no_entry_sign: Pure C without LLM-generated garbage - :bee: Advanced function powered by eBPF ## Doc & Screenshots [English Version](docs/ceccomp.adoc) | [中文文档](docs/ceccomp.zh_CN.adoc) ## Install > [!IMPORTANT] > This software requires features from Linux, so kernels other than Linux are not supported. - Arch Linux users: ceccomp is available in official extra repo now: [![Arch](https://repology.org/badge/version-for-repo/arch/ceccomp.svg?header=Arch%20Linux%20extra)](https://repology.org/project/ceccomp/versions) [![Manjaro Stable](https://repology.org/badge/version-for-repo/manjaro_stable/ceccomp.svg?header=Manjaro%20Stable)](https://repology.org/project/ceccomp/versions) - Debian, Ubuntu or Kali users: ceccomp is available with `apt` now if you are using distros below: [![Debian testing](https://repology.org/badge/version-for-repo/debian_14/ceccomp.svg?header=Debian%20testing)](https://repology.org/project/ceccomp/versions) [![Debian unstable](https://repology.org/badge/version-for-repo/debian_unstable/ceccomp.svg?header=Debian%20unstable)](https://repology.org/project/ceccomp/versions) [![Ubuntu 26.04](https://repology.org/badge/version-for-repo/ubuntu_26_04/ceccomp.svg?header=Ubuntu%2026.04)](https://repology.org/project/ceccomp/versions) [![Ubuntu 26.10](https://repology.org/badge/version-for-repo/ubuntu_26_10/ceccomp.svg?header=Ubuntu%2026.10)](https://repology.org/project/ceccomp/versions) [![Kali Linux](https://repology.org/badge/version-for-repo/kali_rolling/ceccomp.svg?header=Kali%20Linux)](https://repology.org/project/ceccomp/versions) - NixOS users: @tesuji helps us submit a PR at NixOS, but it's blocked as currently... If you like our software, please :+1: in NixOS/nixpkgs#462592 to help ceccomp into nixpkgs! - Other Linux distros: Sorry, you may need to install ceccomp manually. Please follow instructions below. # Build - Stable installation: Clone the whole repo, then run `./configure`. Dependencies will be detected automatically, please keep an eye on the output since components are automatically disabled if not available. For documentation generation, you need `asciidoctor`. For multi-language support, you need `gettext` package. For eBPF support, you need `libbpf`, `bpftool` and a bpf C compiler, `clang` with `llvm` package or `gcc-bpf>=15`. You could use `--without-doc`, `--without-i18n` and `--without-ebpf` to disable them explicitly. Please run `./configure --help` for more details. ```sh git clone https://github.com/ceccomp/ceccomp.git cd Ceccomp ./configure ./configure # run this again if Makefile is not generated make make install # install at /usr/local/bin ``` - Testing installation: Clone the whole repo, and then run `./configure --devmode`. ```sh git clone https://github.com/ceccomp/ceccomp.git cd Ceccomp ./configure --devmode make ``` > [!NOTE] > To build this project or enable some features, the lowest denpendency version > baselines are: > * Linux >= 5.3, libseccomp >= 2.5.0 (functions excluding capture) > * Linux >= 5.11, libbpf >= 0.6.0 (global capture, only x86_64 guaranteed) > * Linux >= 6.2, libbpf >= 0.6.0 (capture pid) ## Run Test Run configure and make, then invoke `pytest test` from repo root. Trace pid case will be skipped if no CAP_SYS_ADMIN. If you find some checks failed, please submit an issue to report your case. To run the test, you need 2 extra packages: `pkgconf` (required by `pkg-config`) and `python-pytest` (required by `pytest`). ## CheatSheet image ## Credits - [libseccomp](https://github.com/seccomp/libseccomp): The library to support syscall lookups - [libbpf](https://docs.kernel.org/bpf/libbpf/libbpf_overview.html): The library to support eBPF functions - [seccomp-tools](https://github.com/david942j/seccomp-tools): The tool in Ruby inspires us to write ceccomp - [Bootswatch](https://bootswatch.com/slate/): Provides awesome css for html doc under MIT - [Linux kernel](https://github.com/torvalds/linux): Port some bpf checks - [Verstable](https://github.com/JacksonAllan/Verstable): High-performance hash table implementation in C - [a5hash](https://github.com/avaneev/a5hash): High-performance hash implementation for short strings in C Any Issue or PR are welcome! :heart: Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details. ## License Copyright (C) 2025-present, ceccomp contributors, distributed under GNU General Public License v3.0 or Later ceccomp-4.3.1/README.zh_CN.md000066400000000000000000000124351526046660400154250ustar00rootroot00000000000000# Ceccomp ceccomp icon → 用 [English](README.md) 阅读文档 â†� 具有高级功能的对于 `seccomp-tools` çš„ C 语言é‡�新实现。我们基本上把 ceccomp 读作 “C-compâ€� (/siË�ˈkÉ’mp/) 或者 “seccompâ€� (/ˈsÉ›k.kÉ’mp/)。 ## 功能 - :gear: å�¥å£®çš„æ±‡ç¼–器和å��汇编器 - :blue_book: 完善的文档 - :1234: ç”± libseccomp 驱动的多架构支æŒ� - :globe_with_meridians: 多语言支æŒ� - :feather: 构建核心二进制的ä¾�赖很少 - :paintbrush: 更好的语法高亮 - :100: 详实的错误信æ�¯ - :shell: 强大的 Zshell 补全脚本 - :no_entry_sign: 纯 C 编写,没有 LLM 垃圾 - :bee: ç”± eBPF 驱动的高级功能 ## 文档 & 截图 [English Version](docs/ceccomp.adoc) | [中文文档](docs/ceccomp.zh_CN.adoc) ## 安装 > [!IMPORTANT] > 本软件è¦�求一些 Linux 的特性,因此é�ž Linux 的内核ä¸�å�—支æŒ�。 - Arch Linux 用户: ceccomp 已在官方 extra 仓库å�¯ç”¨ï¼š [![Arch](https://repology.org/badge/version-for-repo/arch/ceccomp.svg?header=Arch%20Linux%20extra)](https://repology.org/project/ceccomp/versions) [![Manjaro Stable](https://repology.org/badge/version-for-repo/manjaro_stable/ceccomp.svg?header=Manjaro%20Stable)](https://repology.org/project/ceccomp/versions) - Debian, Ubuntu 或 Kali 用户: 如果您在使用如下å�‘行版,那么 ceccomp å�¯ä»¥ä½¿ç”¨ `apt` 获å�–: [![Debian testing](https://repology.org/badge/version-for-repo/debian_14/ceccomp.svg?header=Debian%20testing)](https://repology.org/project/ceccomp/versions) [![Debian unstable](https://repology.org/badge/version-for-repo/debian_unstable/ceccomp.svg?header=Debian%20unstable)](https://repology.org/project/ceccomp/versions) [![Ubuntu 26.04](https://repology.org/badge/version-for-repo/ubuntu_26_04/ceccomp.svg?header=Ubuntu%2026.04)](https://repology.org/project/ceccomp/versions) [![Ubuntu 26.10](https://repology.org/badge/version-for-repo/ubuntu_26_10/ceccomp.svg?header=Ubuntu%2026.10)](https://repology.org/project/ceccomp/versions) [![Kali Linux](https://repology.org/badge/version-for-repo/kali_rolling/ceccomp.svg?header=Kali%20Linux)](https://repology.org/project/ceccomp/versions) - NixOS 用户: @tesuji 帮我们在 NixOS æ��交了一个 PR,但是目å‰�进度å�œæ»žä¸�å‰�... 如果您喜欢我们的软件,请在 NixOS/nixpkgs#462592 :+1: æ�¥å¸®åŠ© ceccomp 进入 nixpkgsï¼� - å…¶ä»– Linux å�‘行版: 抱歉,您需è¦�手动安装 ceccomp。请按照以下说明æ“�作。 # 构建 - 稳定版安装: 克隆整个仓库,然å�Žè¿�行 `./configure`。ä¾�赖会被自动检测,请å°�心输出结果, 因为组件ä¸�å�¯ç”¨æ—¶ä¼šè¢«è‡ªåЍç¦�用。è¦�生æˆ�文档,您需è¦� `asciidoctor`,è¦�å�¯ç”¨å¤šè¯­è¨€æ”¯æŒ�, 您需è¦� `gettext` 软件包。è¦�å�¯ç”¨ eBPF 支æŒ�,您需è¦� `libbpf`, `bpftool` 以å�Šä¸€ä¸ª BPF C 编译器, 如 `clang` 加上 `llvm` 软件包或 `gcc-bpf>=15`。您å�¯ä»¥ä½¿ç”¨ `--without-doc`, `--without-i18n` å’Œ `--without-ebpf` 标志æ�¥æ˜¾å¼�ç¦�用它们。 请è¿�行 `./configure --help` 查看详情。 ```sh git clone https://github.com/ceccomp/ceccomp.git cd Ceccomp ./configure ./configure # 如果 Makefile 没有生æˆ�å°±å†�è¿�行一次 make make install # 安装在 /usr/local/bin ``` - 测试版安装: 克隆完整仓库,然å�Žè¿�行 `./configure --devmode`。 ```sh git clone https://github.com/ceccomp/ceccomp.git cd Ceccomp ./configure --devmode make ``` > [!NOTE] > è¦�想构建这个项目或å�¯ç”¨æŸ�些特性,最低的ä¾�赖版本基线是: > * Linux >= 5.3, libseccomp >= 2.5.0 (除了 capture 以外的功能) > * Linux >= 5.11, libbpf >= 0.6.0 (全局æ�•获,å�ªä¿�è¯� x86_64) > * Linux >= 6.2, libbpf >= 0.6.0 (æ�•获 PID) ## è¿�行测试 è¿�行 configure å�Ž make,然å�Žå†�项目根目录下è¿�行 `pytest test`。如果没有 CAP_SYS_ADMIN,追踪 pid 的测试案例会被跳过。如果您å�‘现一些测试失败了,请开一个 issue 并上报您的案例。 è¦�想è¿�行测试,您需è¦� 2 个é¢�外的软件包: `pkgconf` (被 `pkg-config` 需è¦�) å’Œ `python-pytest` (被 `pytest` 需è¦�)。 ## 速览表 image ## 致谢 - [libseccomp](https://github.com/seccomp/libseccomp): 用于支æŒ�系统调用查询的软件库 - [libbpf](https://docs.kernel.org/bpf/libbpf/libbpf_overview.html): 用æ�¥æ”¯æŒ� eBPF 功能的软件库 - [seccomp-tools](https://github.com/david942j/seccomp-tools): å�¯å�‘我们编写 ceccomp çš„ Ruby 工具 - [Bootswatch](https://bootswatch.com/slate/): æ��供了基于 MIT å��议的用于 html 文档的精美 CSS - [Linux kernel](https://github.com/torvalds/linux): ç§»æ¤�了一些 BPF 的检查 - [Verstable](https://github.com/JacksonAllan/Verstable): C 语言高性能哈希表实现 - [a5hash](https://github.com/avaneev/a5hash): C 语言高性能短字符串哈希实现 欢迎任何 issue 或 PRï¼� :heart: 详情请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 许å�¯è¯� Copyright (C) 2025-现在,ceccomp 贡献者,按 GNU General Public License v3.0 or Later 分å�‘ ceccomp-4.3.1/SECURITY.md000066400000000000000000000014451526046660400147360ustar00rootroot00000000000000# Security Policy ## Reporting a Vulnerability If you found a severe bug, for instance, hijack user's computer via a bpf filter, please send emails to both of us (ma2014119@outlook.com and dudududumaxver@outlook.com). If we don't reply to you in 3 days, you could find us via Discord (@rocketmadev and @dbgbgtf) in `pwndbg` server, please dm to us directly. If neither of us don't reply back in 2 weeks, just open an issue. When sending us your bug report, please confirm that the severe bug you found is reproducible and survive in latest version of ceccomp. Then write about how to trigger the bug (a PoC). We will contact you later. NOTE that if you are sending us AI-generated bug report without check or spams, we may refuse your request. Once we confirm your bug, we may help you issue a CVE. ceccomp-4.3.1/completions/000077500000000000000000000000001526046660400154755ustar00rootroot00000000000000ceccomp-4.3.1/completions/_ceccomp000066400000000000000000000130371526046660400171740ustar00rootroot00000000000000#compdef ceccomp # Zsh completion script for ceccomp local -a subcmd options expl arch_compstr output_compstr local state local archs=( 'x86_64' 'i386' 'x32' 'aarch64' 'arm' 'loongarch64' 'm68k' 'mips' 'mipsel' 'mips64' 'mipsel64' 'mips64n32' 'mipsel64n32' 'parisc' 'parisc64' 'ppc64' 'ppc64le' 'ppc' 's390x' 's390' 'riscv64' 'sh' 'sheb' 'sh4' ) arch_compstr=( '(-a --arch)'{-a,--arch}"[Target BPF architecture]:ARCH:($archs)" ) color_compstr=( '(-c --color)'{-c,--color}'[When to display in color]:WHEN:(always auto never)' ) output_compstr=( '(-o --output)'{-o,--output}'[Print to file to avoid mixing tracee output]:FILE:_files' ) local syscalls=( 'open' 'read' 'write' 'close' 'mmap' 'mprotect' 'execve' 'execveat' 'pread64' 'readv' 'writev' 'preadv' 'preadv2' 'openat' 'openat2' 'sendfile64' 'send' 'sendto' 'sendmsg' 'recv' 'recvfrom' 'recvmsg' 'io_uring_setup' 'io_uring_enter' 'io_uring_register' 'ptrace' ) if (( CURRENT == 2 )) { subcmd=( 'asm:Assemble bpf text to raw bytes' 'capture:Install eBPF prog to capture all seccomp filters or extract filters in a process' 'disasm:Disassemble raw bytes to bpf text' 'trace:Run program or trace pid, extract bpf filter and then print to text' 'emu:Emulate bpf program with given syscall and bpf text' 'probe:Trace the program for the first filter and emulate common syscalls' 'help:Display ceccomp help information' 'version:Display ceccomp version' ) _describe 'subcmd' subcmd return } elif (( CURRENT > 2 )) { case $words[2] { (asm) _arguments \ $arch_compstr \ $color_compstr \ '(-f --fmt)'{-f,--fmt}'[Output format of BPF]:FMT:(raw hexline hexfmt c-macro)' \ '2:BPF:_files' \ '*: :' ;; (disasm) _arguments \ $arch_compstr \ $color_compstr \ '2:RAW:_files' \ '*: :' ;; (trace) _arguments -C \ $color_compstr \ '(-p --pid)'{-p,--pid}'[Attach to which process to extract its filters]:PID:->getpid' \ '(-q --quiet)'{-q,--quiet}'[Print warning and error messages only]' \ '(-s --seize)'{-s,--seize}'[Follow pid to trace load-filter operation (pid mode)]' \ $output_compstr \ '*:arguments:_files' # complete non-kernel pids like kill if [[ $state == 'getpid' ]] { local line pids lines pids=() # extract command output line by line lines=("${(@f)$(ps --ppid 2 -p 2 -N -o pid=,tty=,user=,comm=)}") for line ($lines) { pids+=${line[(w)1]} # extract first word (pid) } _wanted nonk-pids expl 'non-kernel process ID' \ compadd -o nosort -ld lines -a pids } ;; (capture) _arguments -C \ $color_compstr \ '(-p --pid)'{-p,--pid}'[Which thread to extract filters from]:PID:->getpid' \ '*: :' # complete non-kernel pids like kill if [[ $state == 'getpid' ]] { local line pids lines pids=() # extract command output line by line lines=("${(@f)$(ps --ppid 2 -p 2 -N -o pid=,tty=,user=,comm=)}") for line ($lines) { pids+=${line[(w)1]} # extract first word (pid) } _wanted nonk-pids expl 'non-kernel process ID' \ compadd -o nosort -ld lines -a pids } ;; (probe) _arguments -C \ $color_compstr \ $output_compstr \ '(-q --quiet)'{-q,--quiet}'[Print warning and error messages only]' \ '*:arguments:_files' ;; (emu) _arguments -C \ $arch_compstr \ $color_compstr \ '(-q --quiet)'{-q,--quiet}'[Print return value only]' \ '2:BPF:_files' \ ':NR:->syscall_nr' \ ':ARGV0:->argv0' \ ':ARGV1:->argv1' \ ':ARGV2:->argv2' \ ':ARGV3:->argv3' \ ':ARGV4:->argv4' \ ':ARGV5:->argv5' \ ':IP:->ip' \ '*: :' case $state { (syscall_nr) _message -r 'Hint: syscall_nr or syscall_name (to name but a few)' _values SYSCALL $syscalls ;; (argv0) _message -r 'Hint: u64 for argv[0]' ;; (argv1) _message -r 'Hint: u64 for argv[1]' ;; (argv2) _message -r 'Hint: u64 for argv[2]' ;; (argv3) _message -r 'Hint: u64 for argv[3]' ;; (argv4) _message -r 'Hint: u64 for argv[4]' ;; (argv5) _message -r 'Hint: u64 for argv[5]' ;; (ip) _message -r 'Hint: u64 for instruction pointer' ;; } ;; (*) # help and version has no completion available return ;; } } ceccomp-4.3.1/configure000077500000000000000000001245011526046660400150530ustar00rootroot00000000000000#!/usr/bin/env python3 import argparse import datetime import os import platform import re import shutil import subprocess import sys import tempfile from collections.abc import Callable from dataclasses import dataclass from pathlib import Path # constants VERSION = '4.3.1' TAG_TIME = '2026-10-4' # color escape code definition if not os.getenv('NO_COLOR'): def TXT_RED(s): return f'\x1b[31m{s}\x1b[0m' def TXT_GREEN(s): return f'\x1b[32m{s}\x1b[0m' def TXT_YELLOW(s): return f'\x1b[33m{s}\x1b[0m' def TXT_BLUE(s): return f'\x1b[34m{s}\x1b[0m' def TXT_MAGENTA(s): return f'\x1b[35m{s}\x1b[0m' def TXT_CYAN(s): return f'\x1b[36m{s}\x1b[0m' def TXT_GRAY(s): return f'\x1b[90m{s}\x1b[0m' def TXT_BRIGHT_BLUE(s): return f'\x1b[94m{s}\x1b[0m' else: def TXT_RED(s): return s def TXT_GREEN(s): return s def TXT_YELLOW(s): return s def TXT_BLUE(s): return s def TXT_MAGENTA(s): return s def TXT_CYAN(s): return s def TXT_GRAY(s): return s def TXT_BRIGHT_BLUE(s): return s # error handling def info(*args, **kwargs): print(*args, **kwargs, flush=True) def warn(msg: any): print(TXT_YELLOW(f'[WARN] {msg}'), flush=True, file=sys.stderr) def error(msg: any): print(TXT_RED(f'[ERR!] {msg}'), file=sys.stderr) sys.exit(1) # build option parsing class GNUStyleHelpFormatter(argparse.RawDescriptionHelpFormatter): """Custom help formatter that forces --opt=VALUE style""" def _format_action_invocation(self, action): # only long options, no short option if not action.option_strings: return super()._format_action_invocation(action) return ', '.join(f'{opt}={action.metavar}' if action.metavar else opt for opt in action.option_strings) def parse_args() -> tuple[argparse.Namespace, list[str]]: epilog = '''Some influential environment variables: CC C compiler command CFLAGS Extra C compiler flags LDFLAGS Extra linker flags ASCIIDOC Asciidoc document compiler BPF_CC BPF compiler (specify clang or bpf-*-gcc) BPFTOOL BPF tool command BPF_CFLAGS Extra BPF C compiler flags Please report bug at https://github.com/ceccomp/ceccomp Copyright (C) 2025-present, distributed under GPLv3 or later ''' parser = argparse.ArgumentParser( prog='configure.py', description='Configure build flags for Ceccomp, written in Python', epilog=epilog, formatter_class=GNUStyleHelpFormatter, ) config_grp = parser.add_argument_group('Configure-time options (fixed once Makefile is generated)') config_grp.add_argument('--enable-verbose', action='store_true', help='Enable verbose output') config_grp.add_argument('--without-doc', action='store_true', help='Do not install documentation') config_grp.add_argument('--without-i18n', action='store_true', help='Do not generate locale mo files') config_grp.add_argument('--without-ebpf', action='store_true', help='Disable ebpf support') config_grp.add_argument('--devmode', action='store_true', help='Allow you to compile against any commit (only work in git mode)') config_grp.add_argument('--packager', type=str, metavar='BY', default=None, help='Who build the package (default: manual or OS name if setting prefix to /usr)') config_grp.add_argument('--disable-option-checking', action='store_true', help='Whether to throw an error when unknown options found') config_grp.add_argument('--build', type=str, metavar='TARGET', help='Which target to build against, optional. For instance, x86_64-linux-gnu') config_grp.add_argument('--includedir', type=str, metavar='DIR', help='Optional system include directory') config_grp.add_argument('--libdir', type=str, metavar='DIR', help='Optional system library directory') config_grp.add_argument('--vmlinuxdir', type=str, metavar='DIR', default='auto', help='The directory containing vmlinux or vmlinux.h for eBPF support. ' '"auto" (detect vmlinux.h or vmlinux automatically) and ' '"generated" (always generate vmlinux.h from vmlinux in default /sys path) ' 'are special values configure accepts.') # argp is dynamically tested make_grp = parser.add_argument_group('Make-time options (can be overridden by make cli) [make var]') make_grp.add_argument('--prefix', type=str, metavar='PREFIX', default='/usr/local', help='Installation prefix (default: /usr/local) [PREFIX]') make_grp.add_argument('--bindir', type=str, metavar='DIR', help='User executables directory (default: PREFIX/bin) [BIN_DIR]') make_grp.add_argument('--zshfpath', type=str, metavar='DIR', help='Zsh functions path (default: PREFIX/share/zsh/site-functions) [ZSH_FPATH]') make_grp.add_argument('--docdir', type=str, metavar='DIR', help='Documentation directory (default: PREFIX/share/doc/ceccomp) [DOC_DIR]') make_grp.add_argument('--mandir', type=str, metavar='DIR', help='Man pages directory (default: PREFIX/share/man) [MAN_DIR]') make_grp.add_argument('--localedir', type=str, metavar='DIR', help='Localization directory (default: PREFIX/share/locale) [LOCALE_DIR]') make_grp.add_argument('--destdir', type=str, metavar='DIR', help='Optional dir to install software, useful for package managers [DESTDIR]') make_grp.add_argument('--debug-level', type=int, metavar='LEVEL', default=1, help='Set debug symbol level (0: -O2 -s|1: -O2 -g, default|2: -O0 -g3 -DDEBUG) [DEBUG]') make_grp.add_argument('--version', type=str, metavar='VER', help=f'Set ceccomp version (default: {VERSION}) [VERSION]') make_grp.add_argument('--tag-time', type=str, metavar='TIME', help=f'Set the time of current tag. Use "CONFIG" for the time when running configure; or write in YYYY-mm-dd like default value {TAG_TIME} [TAG_TIME]') make_grp.add_argument('--enable-static', action='store_true', help='Enable static build [STATIC]') return parser.parse_known_args() is_gcc_bpf: bool @dataclass class BuildOptions: prefix: str bindir: str zshfpath: str docdir: str mandir: str localedir: str destdir: str debug_level: int version: str tag_time: str is_static: bool verbose: bool doc: bool i18n: bool devmode: bool builder: str | None check_option: bool target: str sys_includedir: str sys_libdir: str vmlinuxdir: str cc: list[str] | None asciidoc: str | None cflags: str ldflags: str bpf_cflags: str unknown_options: list[str] ebpf: bool bpf_cc: list[str] | None bpftool: str bpf_arch: str | None has_set_packager: bool = False is_official_package: bool = False git_install: bool = True def __post_init__(self): if self.bindir is None: self.bindir = os.path.join(self.prefix, 'bin') if self.zshfpath is None: self.zshfpath = os.path.join(self.prefix, 'share', 'zsh', 'site-functions') if self.docdir is None: self.docdir = os.path.join(self.prefix, 'share', 'doc', 'ceccomp') if self.mandir is None: self.mandir = os.path.join(self.prefix, 'share', 'man') if self.localedir is None: self.localedir = os.path.join(self.prefix, 'share', 'locale') def replace_prefix(dirent: str | None) -> str: return dirent.replace('${prefix}', self.prefix) if dirent else '' self.bindir = replace_prefix(self.bindir) self.zshfpath = replace_prefix(self.zshfpath) self.docdir = replace_prefix(self.docdir) self.mandir = replace_prefix(self.mandir) self.localedir = replace_prefix(self.localedir) self.destdir = replace_prefix(self.destdir) self.sys_includedir = replace_prefix(self.sys_includedir) self.sys_libdir = replace_prefix(self.sys_libdir) self.vmlinuxdir = replace_prefix(self.vmlinuxdir) if self.debug_level not in (0, 1, 2): error('debug_level option can only be 0, 1 or 2!') def check_cmd(env: str, *candidates: list[str]) -> str | list[str] | None: """enumerate available command in system""" var = getattr(self, env) if var is not None: if isinstance(var, str) and shutil.which(var) is None: error(f'{var} provided by environment {env.upper()} is not runnable!') elif isinstance(var, list) and shutil.which(var[0]) is None: error(f'{var[0]} provided by environment {env.upper()} is not runnable!') else: return var # no such environment variable for candidate in candidates: if shutil.which(candidate) is not None: return candidate return None self.cc = self.cc.strip().split() if self.cc else None if isinstance(self.cc, list) and len(self.cc) == 1: self.cc = self.cc[0] # the None value will be processed in check if self.target: self.cc = check_cmd('cc', f'{self.target}-cc', f'{self.target}-gcc', f'{self.target}-clang') if not self.cc: warn(f'No C compiler with prefix {self.target} found, append it in CC') self.cc = check_cmd('cc', 'clang', 'gcc', 'cc') # clang and zig cc adds target to back if not (isinstance(self.cc, str) and self.target in self.cc): if isinstance(self.cc, str): self.cc = [self.cc, '-target', self.target] elif isinstance(self.cc, list): # could be None self.cc.extend(['-target', self.target]) else: # cc may be passed from environ, so we shall not merge the logic self.cc = check_cmd('cc', 'cc', 'gcc', 'clang') if isinstance(self.cc, str): self.cc = [self.cc] self.asciidoc = check_cmd('asciidoc', 'asciidoctor') if self.cflags is None: self.cflags = '' if self.ldflags is None: self.ldflags = '' if self.bpf_cflags is None: self.bpf_cflags = '' if self.tag_time == 'CONFIG': self.tag_time = datetime.datetime.today().strftime('%Y-%m-%d') elif self.tag_time: try: datetime.datetime.strptime(self.tag_time, '%Y-%m-%d') except ValueError: error(f'Invalid tag-time {self.tag_time}, format is YYYY-mm-dd') # check the options if self.unknown_options: if self.check_option: error(f'Unrecognized options: {" ".join(self.unknown_options)}, please pass --help to see correct options!') else: for opt in self.unknown_options: info(TXT_GRAY(f'Ignoring unknown option {opt}')) warn(f'Discarding {len(self.unknown_options)} unknown options!') self.is_official_package = self.prefix == '/usr' self.has_set_packager = self.builder is not None try: if not self.has_set_packager: if self.is_official_package: self.builder = platform.freedesktop_os_release()['NAME'] else: self.builder = 'manual' except (OSError, KeyError): self.builder = 'manual' # ebpf section self.bpftool = check_cmd('bpftool', 'bpftool') self.bpf_cc = self.bpf_cc.strip().split() if self.bpf_cc else None bpf_cc = check_cmd('bpf_cc', 'clang', 'bpf-gcc') if isinstance(bpf_cc, str): bpf_cc = [bpf_cc] global is_gcc_bpf is_gcc_bpf = False if bpf_cc: if 'bpf' in bpf_cc[0]: bpf_cc.append('-mlittle-endian') is_gcc_bpf = True else: bpf_cc.append('-target') bpf_cc.append('bpf') self.bpf_cc = bpf_cc args, unknown = parse_args() buildopts = BuildOptions( prefix=args.prefix, bindir=args.bindir, zshfpath=args.zshfpath, docdir=args.docdir, mandir=args.mandir, localedir=args.localedir, destdir=args.destdir, debug_level=args.debug_level, version=args.version, tag_time=args.tag_time, is_static=args.enable_static, verbose=args.enable_verbose, doc=not args.without_doc, i18n=not args.without_i18n, devmode=args.devmode, builder=args.packager, check_option=not args.disable_option_checking, target=args.build, sys_includedir=args.includedir, sys_libdir=args.libdir, vmlinuxdir=args.vmlinuxdir, ebpf=not args.without_ebpf, bpf_cc=os.getenv('BPF_CC'), bpftool=os.getenv('BPFTOOL'), bpf_arch=None, cc=os.getenv('CC'), asciidoc=os.getenv('ASCIIDOC'), cflags=os.getenv('CFLAGS'), ldflags=os.getenv('LDFLAGS'), bpf_cflags=os.getenv('BPF_CFLAGS'), unknown_options=unknown, ) del args, unknown # gathering system information and check @dataclass class Makefile: s: str def inject(self, placeholder: str, filler: str | list[str] | bool) -> None: if isinstance(filler, str): self.s = self.s.replace(f'{{{{{placeholder}}}}}', filler) # {{PLACEHOLDER}} return if isinstance(filler, bool): # automatically loop from 0 to perform substitution keep = filler i = 0 while True: if self.s.find(f'{{{{{placeholder}_IF}}}}') == -1: break if keep: self.s = self.s.replace(f'{{{{{placeholder}_IF}}}}', '') # {{PLACEHOLDER_IF}} self.s = self.s.replace(f'{{{{{placeholder}_ENDIF}}}}', '') else: begin = self.s.find(f'{{{{{placeholder}_IF}}}}') end = self.s.find(f'{{{{{placeholder}_ENDIF}}}}') assert begin != -1 assert end != -1 end += len(f'{{{{{placeholder}_ENDIF}}}}') self.s = self.s[:begin] + self.s[end:] i += 1 return for i, e in enumerate(filler): self.s = self.s.replace(f'{{{{{placeholder}{i}}}}}', e) # {{PLACEHOLDER0}} class TaskManager: tasks: list[Callable[[Makefile], None]] makefile: Makefile def __init__(self, makefile_name: str) -> None: self.tasks = [] if not os.path.isfile(makefile_name): error(f'Reading Makefile {makefile_name}, but it\'s not a file!') try: with open(makefile_name) as file: self.makefile = Makefile(file.read()) except OSError as e: error(f'Can not open Makefile: {e}') def run_tasks(self): width = len(str(len(self.tasks))) total = len(self.tasks) for seq, handler in enumerate(self.tasks, start=1): # no need to flush as stdout will be flushed in handler info(f'[{seq:>{width}}/{total}] ', end='') handler(self.makefile) def add_task(self, handler: Callable[[Makefile], None]): self.tasks.append(handler) taskmgr = TaskManager('Makefile.in') def pcheck(txt: str): info(f'Checking {txt}... ', end='') def run_command(argv: list[str], stdin: str | None=None, push_sys_dir: bool=False) -> tuple[int, str, str]: """ Run command with given argv and input, return process return code, stdout and stderr Return -1, '', exception message if exception raised is known, or else return -2, '', message. """ try: argv[0] = shutil.which(argv[0]) if push_sys_dir: # using C compiler! if buildopts.sys_includedir: # in case some include/lib is not accessible for current compiler argv.append(f'-I{buildopts.sys_includedir}') if buildopts.sys_libdir: argv.append(f'-L{buildopts.sys_libdir}') if buildopts.is_static: argv.append('-static') proc = subprocess.run(argv, input=stdin, capture_output=True, text=True) except subprocess.SubprocessError as e: return -1, '', str(e) except UnicodeDecodeError as e: return -1, '', 'UnicodeDecodeError: program output contains non-utf-8 bytes' except Exception as e: return -2, '', str(e) else: return proc.returncode, proc.stdout, proc.stderr pkg_config = shutil.which('pkg-config') def probe_library_flags(lib: str) -> list[str]: """ Retrieve compiler link flag via pkg-config, or simply `-llib`. lib is library name without lib prefix like seccomp. """ if not pkg_config: return [f'-l{lib}'] argv = [pkg_config, '--libs', f'lib{lib}'] if buildopts.is_static: argv.append('--static') code, flags, _ = run_command(argv) if code: return [f'-l{lib}'] return flags.strip().split() def new_task(func: Callable) -> Callable: taskmgr.add_task(func) return func # color definition: # green: well-tested # cyan: should work # blue: not work and have to take fallback choice # magenta: unexpected or no fallback choice # bright blue: not work but silently disabled @new_task def check_platform(_: Makefile): pcheck('system platform') if sys.platform == 'linux': info(TXT_GREEN('linux')) elif sys.platform == 'android': info(TXT_CYAN('android')) else: info(TXT_MAGENTA(sys.platform)) error(f'Ceccomp only support Linux!') TIER_1_ARCH = [ # tested 'x86_64', 'i386', 'i686', 'riscv64', 'loongarch64', 'aarch64', 'ppc', 'ppc64le', 's390x', 'armv8l', 'armv7l', ] TIER_2_ARCH = [ # untested, but listed in libseccomp 'x32', 'parisc', 'parisc64', 'mips', 'm68k', 's390', 'ppc64', 'arm', 'sh', 'sh4', 'shel', ] @new_task def check_architecture(_: Makefile): pcheck('current architecture') bits = platform.architecture()[0] arch = platform.machine() mach = f'{bits}, {arch}' if arch in TIER_1_ARCH: info(TXT_GREEN(mach)) elif arch in TIER_2_ARCH: info(TXT_CYAN(mach)) else: info(TXT_BLUE(mach)) warn('Current architecture is not supported by libseccomp') @new_task def check_flock(makefile: Makefile): pcheck('if flock in system') if shutil.which('flock') is None: makefile.inject('VERBOSE', '1') info(TXT_BLUE('no')) warn('flock not found in system, Makefile verbose is set to true. You may need util-linux package') else: makefile.inject('VERBOSE', '1' if buildopts.verbose else '0') info(TXT_GREEN('yes')) @new_task def check_i18n(makefile: Makefile): pcheck('internationalization support') if not buildopts.i18n: makefile.inject('I18N', False) makefile.inject('LOCALEDIR', buildopts.localedir) makefile.inject('LOCALE_SED', 's|@@LOCALEDIR@@||') info(TXT_BLUE('excluded')) return if shutil.which('xgettext') is None: makefile.inject('I18N', False) makefile.inject('LOCALEDIR', buildopts.localedir) makefile.inject('LOCALE_SED', 's|@@LOCALEDIR@@||') info(TXT_BRIGHT_BLUE('no')) warn('xgettext and other tools not found, install gettext package to enable l10n!') return makefile.inject('I18N', True) makefile.inject('LOCALEDIR', buildopts.localedir) makefile.inject('LOCALE_SED', f's|@@LOCALEDIR@@|#define LOCALEDIR "{buildopts.localedir}"|') info(TXT_GREEN('yes')) @new_task def check_doc(makefile: Makefile): pcheck('documentation generator') if not buildopts.doc: makefile.inject('DOC', False) info(TXT_BLUE('excluded')) return if buildopts.asciidoc is None: makefile.inject('DOC', False) info(TXT_BRIGHT_BLUE('no')) warn('Asciidoc compiler not found, install asciidoctor package for man page!') return makefile.inject('DOC', True) makefile.inject('ASCIIDOC', buildopts.asciidoc) if 'asciidoctor' in buildopts.asciidoc: info(TXT_GREEN(buildopts.asciidoc)) else: info(TXT_CYAN(buildopts.asciidoc)) warn(f'Your asciidoc compiler {buildopts.asciidoc} is not tested and may fail to generate docs') standard_c = ''' #include void leaf(void) {} int main() { puts(""); leaf(); return 0; } ''' @new_task def check_cc(makefile: Makefile): pcheck('C compiler') if buildopts.cc is None: info(TXT_MAGENTA('no cc found')) error('C compiler command not found in system!') code, _, stderr = run_command([*buildopts.cc, '-x', 'c', '-', '-o', '/dev/null'], standard_c) if code: info(TXT_MAGENTA(' '.join(buildopts.cc))) if code == -1: error(f'C compiler is not working: {stderr}') if code == -2: error(f'Unexpected error: {stderr}') info(f'Compiler returned non-zero return code with message:\n{stderr}', end='') error(f'C compiler can not compile minimum C unit') # code == 0 makefile.inject('CC', ' '.join(buildopts.cc)) info(TXT_GREEN(' '.join(buildopts.cc))) linux_headers = ''' #include #include #include int main() { struct sock_fprog *addr = (struct sock_fprog *)mmap(NULL, 0x1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); *addr = (struct sock_fprog){ .len = 0, .filter = NULL }; return 0; } ''' @new_task def check_linux_headers(_: Makefile): pcheck('Linux-related headers') code, _, stderr = run_command([*buildopts.cc, '-x', 'c', '-', '-o', '/dev/null'], linux_headers, push_sys_dir=True) if code: info(TXT_MAGENTA('no')) if code == -1: error(f'C compiler is not working: {stderr}') if code == -2: error(f'Unexpected error: {stderr}') info(f'Compiler returned non-zero return code with message:\n{stderr}', end='') error(f'Can not compile Linux-related unit, you may install linux-headers package') info(TXT_GREEN('yes')) libseccomp = ''' #include #include int main() { printf("%d", seccomp_version()->major); return 0; } ''' @new_task def check_libseccomp(makefile: Makefile): pcheck('libseccomp') link_flags = probe_library_flags('seccomp') code, _, stderr = run_command([*buildopts.cc, '-x', 'c', '-', *link_flags, '-o', '/dev/null'], libseccomp, push_sys_dir=True) if code: info(TXT_MAGENTA('no')) if code == -1: error(f'C compiler is not working: {stderr}') if code == -2: error(f'Unexpected error: {stderr}') info(f'Compiler returned non-zero return code with message:\n{stderr}', end='') error(f'Can not compile libseccomp unit, you may install libseccomp package') info(TXT_GREEN('yes')) makefile.inject('LIBSECCOMP_FLAG', ' '.join(link_flags)) argp = ''' #include int main(int argc, char **argv) { return argp_parse(0, argc, argv, 0, 0, 0); } ''' @new_task def check_argp(makefile: Makefile): pcheck('argp parser') code, _, stderr = run_command([*buildopts.cc, '-x', 'c', '-', '-o', '/dev/null'], argp, push_sys_dir=True) if code: if code == -1: info(TXT_MAGENTA('no')) error(f'C compiler is not working: {stderr}') if code == -2: info(TXT_MAGENTA('no')) error(f'Unexpected error: {stderr}') # code > 0 # some system need external argp package, so we try to link argp_flags = probe_library_flags('argp') code, _, stderr = run_command([*buildopts.cc, '-x', 'c', '-', *argp_flags, '-o', '/dev/null'], argp, push_sys_dir=True) if code: info(TXT_MAGENTA('no')) if code == -1: info(TXT_MAGENTA('no')) error(f'C compiler is not working: {stderr}') if code == -2: info(TXT_MAGENTA('no')) error(f'Unexpected error: {stderr}') info(f'Compiler returned non-zero return code with message:\n{stderr}', end='') error(f'Can not compile argp unit, you may install argp package') # code == 0 and link argp makefile.inject('LIBARGP_FLAG', ' '.join(argp_flags)) info(TXT_CYAN('external')) return # code == 0 makefile.inject('LIBARGP_FLAG', '') info(TXT_GREEN('builtin')) @new_task def check_source(_: Makefile): pcheck('source code type') if os.path.isdir('.git'): buildopts.git_install = True info(TXT_GREEN('git install')) else: buildopts.git_install = False info(TXT_CYAN('tarball install')) @new_task def check_version(makefile: Makefile): pcheck('target version') if buildopts.git_install: if not buildopts.devmode: code, stdout, stderr = run_command(['git', 'describe', '--exact-match']) if code < 0: info(TXT_MAGENTA('git failed')) info(f'Git not accessible? {stderr}') error('Can not run git, you may install git package') elif code == 0: # we are at a tag, adopt it tag = stdout.strip() buildopts.version = tag if not tag.startswith('v') else tag[1:] code, stdout, _ = run_command(['git', 'log', '-1', '--format=format:%as', tag]) if code: info(TXT_MAGENTA('get tag time failed')) info(stderr, end='' if stderr[-1] == '\n' else '\n') error('Can not get tag-time for the latest tag') buildopts.tag_time = stdout.strip() else: # we are not at a tag, try to go to a tag code, stdout, _ = run_command(['git', 'rev-list', '--tags', '--max-count=1']) if code: info(TXT_MAGENTA('git failed')) info(stderr, end='' if stderr[-1] == '\n' else '\n') error('Can not determine the latest tag by git, to build from git, you need to pull the whole repo!') code, stdout, _ = run_command(['git', 'describe', '--tags', stdout.strip()]) if code: info(TXT_MAGENTA('git failed')) info(stderr, end='' if stderr[-1] == '\n' else '\n') error('Can not determine the latest tag by git') tag = stdout.strip() code, stdout, _ = run_command(['git', 'checkout', tag]) # checkout to that tag if code: info(TXT_MAGENTA('checkout failed')) info(stderr, end='' if stderr[-1] == '\n' else '\n') error('Could not checkout the latest tag. Do you need to `git stash` changes?') info(TXT_CYAN(tag)) warn('Checked out to new tag, please rerun me to build stable version of ceccomp! ' '(or use --devmode to build on an arbitrary commit)') sys.exit(0) else: # devmode is True code, stdout, stderr = run_command(['git', 'describe', '--long']) if code < 0: info(TXT_MAGENTA('git failed')) info(f'Git not accessible? {stderr}') error('Can not run git, you may install git package') elif code == 0: # current commit get correctly resolved (tag-rev-gcommit or tag) # --long mode display in TAG-COMMITS-gCOMMIT tag, revision, commit = stdout.strip().split('-') ver = tag if not tag.startswith('v') else tag[1:] buildopts.version = f'{ver}.r{revision}_{commit[1:]}' # skip g code, stdout, _ = run_command(['git', 'log', '-1', '--format=format:%as']) if code: info(TXT_MAGENTA('get tag time failed')) info(stderr, end='' if stderr[-1] == '\n' else '\n') error('Can not get tag-time for the latest tag') buildopts.tag_time = stdout.strip() else: # git failed to describe info(TXT_MAGENTA('describe failed')) info(stderr, end='' if stderr[-1] == '\n' else '\n') error('Can not determine the latest tag by git, to build from git, you need to pull the whole repo!') else: # tarball install if not buildopts.version: buildopts.version = VERSION if not buildopts.tag_time: buildopts.tag_time = TAG_TIME makefile.inject('VERSION', buildopts.version) makefile.inject('TAG_TIME', buildopts.tag_time) if buildopts.git_install and not buildopts.devmode: info(TXT_GREEN(buildopts.version)) elif buildopts.git_install and buildopts.devmode: info(TXT_BLUE(buildopts.version)) else: info(TXT_CYAN(buildopts.version)) @new_task def check_builder_name(makefile: Makefile): pcheck('builder name') if '^' in buildopts.builder: info(TXT_MAGENTA(buildopts.builder)) error(f"Found '^' in builder name {buildopts.builder}, which is not allowed.") if not buildopts.builder.strip(): info(TXT_MAGENTA('(empty)')) error(f'Empty builder name is not accepted.') makefile.inject('BUILDER', buildopts.builder) if buildopts.has_set_packager: info(TXT_CYAN(buildopts.builder)) elif buildopts.is_official_package and buildopts.builder != 'manual': info(TXT_GREEN(buildopts.builder)) else: info(TXT_BLUE(buildopts.builder)) @new_task def check_omit_leaf_frame_pointer_flag(makefile: Makefile): pcheck('if compiler support -mno-omit-leaf-frame-pointer') code, _, _ = run_command([*buildopts.cc, '-x', 'c', '-Werror', '-', '-mno-omit-leaf-frame-pointer', '-o', '/dev/null'], standard_c, push_sys_dir=True) if code: info(TXT_CYAN('no')) makefile.inject('ARCH_PRESERVE_FP', '') else: info(TXT_GREEN('yes')) makefile.inject('ARCH_PRESERVE_FP', '-mno-omit-leaf-frame-pointer') found_llvm_strip = False @new_task def check_ebpf_infra(_: Makefile): pcheck('eBPF support tools') if not buildopts.ebpf: info(TXT_BLUE('excluded')) return if not buildopts.bpftool: info(TXT_BRIGHT_BLUE('no')) warn('Can not find bpftool, you may install it to enable eBPF support') buildopts.ebpf = False return if not buildopts.bpf_cc: info(TXT_BRIGHT_BLUE('no')) warn('Can not find compiler for BPF, you may install clang to enable eBPF support') buildopts.ebpf = False return info(TXT_GREEN(f'yes, {buildopts.bpf_cc[0]}')) if shutil.which('llvm-strip'): global found_llvm_strip found_llvm_strip = True elif not is_gcc_bpf: warn('Can not find llvm-strip to strip bpf object, the final binary may be large') tmpdir = None vmlinux_h_flags = [] ebpf_source = ''' #include struct seccomp_filter *test(struct task_struct *task) { return task->seccomp.filter; } ''' @new_task def check_vmlinuxdir(makefile: Makefile): pcheck('vmlinux.h location') if not buildopts.ebpf: info(TXT_BLUE('skipped')) return def _test_bpfcc(vmlinux_h_dir: str, suppress_error: bool=False, tmp: tempfile.TemporaryDirectory | None=None) -> bool: # no return if error, or when suppress_error enabled, False is returned bpfcc_flags = [] if is_gcc_bpf: # bpf-gcc bpfcc_flags = ['-O2', '-std=gnu17'] code, _, stderr = run_command([*buildopts.bpf_cc, '-x', 'c', '-', '-o', '/dev/null', '-c', '-isystem', vmlinux_h_dir, *bpfcc_flags], ebpf_source) if code: if tmp: tmp.cleanup() if suppress_error: return False info(TXT_MAGENTA(f'broken {buildopts.bpf_cc[0]}')) if code == -1: error(f'BPF compiler is not working: {stderr}') if code == -2: error(f'Unexpected error: {stderr}') info(f'BPF Compiler returned non-zero return code with message:\n{stderr}', end='') error('Can not compile a minimum unit of eBPF object, you may disable eBPF support') return True def _test_vmlinux(vmlinux: Path) -> bool: # print error when returning False try: with vmlinux.open('rb') as _: pass except Exception as e: info(TXT_BRIGHT_BLUE('unsupported kernel/vmlinux')) warn(f'Failed to read {vmlinux} due to {e}') buildopts.ebpf = False return False code, vmlinux_h, stderr = run_command([buildopts.bpftool, 'btf', 'dump', 'file', str(vmlinux), 'format', 'c']) if code: info(TXT_BRIGHT_BLUE(f'broken {buildopts.bpftool}')) info(f'bpftool returned non-zero return code with message:\n{stderr}', end='') warn('Provided can not dump vmlinux to vmlinux.h, you may disable eBPF support') buildopts.ebpf = False return False try: global tmpdir tmpdir = tempfile.TemporaryDirectory() header_dir = tmpdir.name with open(f'{header_dir}/vmlinux.h', 'w') as file: file.write(vmlinux_h) _test_bpfcc(header_dir, tmp=tmpdir) # no return if error except Exception as e: info(TXT_BRIGHT_BLUE('/tmp not available')) warn(f'Failed to dump vmlinux.h due to {e}') buildopts.ebpf = False return False return True passed = False default_vmlinux = Path('/sys/kernel/btf/vmlinux') if buildopts.vmlinuxdir == 'auto': vmlinux_h_dir = None # detects several places def _pick_path(vmlinux_h: str) -> bool: candidate = Path(vmlinux_h) if candidate.exists() and candidate.is_file(): nonlocal vmlinux_h_dir vmlinux_h_dir = str(candidate.parent) return True return False if not ((buildopts.target and \ _pick_path(f'/usr/include/{buildopts.target}/linux/bpf/vmlinux.h')) or \ _pick_path('/usr/src/linux/vmlinux.h') or \ _pick_path('/usr/include/bpf/vmlinux.h')): # fedora case? ksrcdir = Path('/usr/src/kernels') if ksrcdir.exists() and ksrcdir.is_dir(): for kdir, _, _ in ksrcdir.iterdir(): if _pick_path(str(kdir / 'vmlinux.h')): break tried = None if vmlinux_h_dir and (tried := _test_bpfcc(vmlinux_h_dir, True)): info(TXT_GREEN(f'{vmlinux_h_dir}/vmlinux.h')) vmlinux_h_flags.extend(['-isystem', vmlinux_h_dir]) makefile.inject('VMLINUX', False) elif _test_vmlinux(default_vmlinux): info(TXT_GREEN(f'generated from {default_vmlinux} (default)')) makefile.inject('VMLINUX_FILE', str(default_vmlinux)) makefile.inject('VMLINUX', True) if tried is False: warn(f'Not picking {vmlinux_h_dir}/vmlinux.h as BPF_CC can not include it') # if vmlinux can not be processed, the whole ebpf part will be erased later elif buildopts.vmlinuxdir == 'generated' and _test_vmlinux(default_vmlinux): info(TXT_GREEN(f'generated from {default_vmlinux} (default)')) makefile.inject('VMLINUX_FILE', str(default_vmlinux)) makefile.inject('VMLINUX', True) else: # should be a directory containing vmlinux or vmlinux.h vmlinux_dir = Path(buildopts.vmlinuxdir) if (candidate := vmlinux_dir / 'vmlinux.h').exists() and candidate.is_file(): if _test_bpfcc(str(vmlinux_dir)): info(TXT_CYAN(str(candidate))) vmlinux_h_flags.extend(['-isystem', str(vmlinux_dir)]) makefile.inject('VMLINUX', False) else: error(f'BPF_CC can not include {candidate}') elif (candidate := vmlinux_dir / 'vmlinux').exists() and candidate.is_file(): if _test_vmlinux(candidate): info(TXT_CYAN(f'generated from {candidate}')) makefile.inject('VMLINUX_FILE', str(candidate)) makefile.inject('VMLINUX', True) else: error(f'{candidate} can not be processed correctly') else: error(f'Can not find available vmlinux or vmlinux.h in {vmlinux_dir}') libbpf = ''' #include #include int main(void) { puts(libbpf_version_string()); return 0; } ''' libbpf_ebpf = ''' #include #include unsigned test(void) { return bpf_get_prandom_u32(); } ''' @new_task def check_libbpf(makefile: Makefile): pcheck('libbpf') if not buildopts.ebpf: info(TXT_BLUE('skipped')) makefile.inject('LIBBPF_FLAG', '') return global tmpdir link_flags = probe_library_flags('bpf') code, _, stderr = run_command([*buildopts.cc, '-x', 'c', '-', *link_flags, '-o', '/dev/null'], libbpf, push_sys_dir=True) if code: info(TXT_MAGENTA('no')) if tmpdir: tmpdir.cleanup() if code == -1: error(f'C compiler is not working: {stderr}') if code == -2: error(f'Unexpected error: {stderr}') info(f'Compiler returned non-zero return code with message:\n{stderr}', end='') error('Can not compile a minimum unit of libbpf, you may install it or disable eBPF support') bpfcc_flags = vmlinux_h_flags.copy() if not bpfcc_flags: bpfcc_flags.extend(['-isystem', tmpdir.name]) if is_gcc_bpf: # bpf-gcc bpfcc_flags.extend(['-O2', '-std=gnu17', '-isystem', f'{sys.prefix}/local/include', '-isystem', f'{sys.prefix}/include']) code, _, stderr = run_command([*buildopts.bpf_cc, '-x', 'c', '-', '-o', '/dev/null', '-c', *bpfcc_flags], libbpf_ebpf, push_sys_dir=True) if tmpdir: tmpdir.cleanup() if code: info(TXT_MAGENTA(f'broken {buildopts.bpf_cc[0]}')) if code == -1: error(f'BPF compiler is not working: {stderr}') if code == -2: error(f'Unexpected error: {stderr}') info(f'BPF Compiler returned non-zero return code with message:\n{stderr}', end='') error('Can not compile a minimum unit of libbpf, you may install it or disable eBPF support') info(TXT_GREEN('yes')) makefile.inject('LIBBPF_FLAG', ' '.join(link_flags)) if is_gcc_bpf: code, stdout, _ = run_command([buildopts.bpf_cc[0], '-dumpversion']) if code or int(stdout.strip().split('.', 1)[0]) < 15: warn('Recommends gcc>=15 to compile bpf, gcc<15 may not work properly') @new_task def check_bpf_arch(makefile: Makefile): pcheck('eBPF architecture') if not buildopts.ebpf: info(TXT_BLUE('skipped')) makefile.inject('EBPF_ON', '0') makefile.inject('EBPF', False) return arch = platform.machine() le = True # little endian extra_flags = [] if buildopts.bpf_cflags: extra_flags.append(buildopts.bpf_cflags) extra_flags.extend(vmlinux_h_flags) if is_gcc_bpf: extra_flags.extend(['-isystem', f'{sys.prefix}/local/include', '-isystem', f'{sys.prefix}/include', '-std=gnu17']) if buildopts.target: arch = buildopts.target.split('-', 1)[0] if 'x86_64' in arch or re.match(r'i\d86', arch): buildopts.bpf_arch = 'x86' if 'x86_64' in arch: extra_flags.append('-D__x86_64__') elif arch.startswith('loongarch'): buildopts.bpf_arch = 'loongarch' elif arch.startswith('riscv'): buildopts.bpf_arch = 'riscv' elif arch.startswith('aarch64'): buildopts.bpf_arch = 'arm64' le = 'be' not in arch extra_flags.append('-D__aarch64__') elif arch.startswith('arm'): buildopts.bpf_arch = 'arm' le = 'eb' not in arch elif arch.startswith('s390'): buildopts.bpf_arch = 's390' le = False elif arch.startswith('mips'): buildopts.bpf_arch = 'mips' le = 'el' in arch elif arch.startswith(('ppc', 'powerpc')): buildopts.bpf_arch = 'powerpc' le = 'le' in arch else: info(TXT_BRIGHT_BLUE(arch)) warn(f'Specified architecture {arch} is not supported by eBPF') buildopts.ebpf = False makefile.inject('EBPF_ON', '0') makefile.inject('EBPF', False) return info(TXT_GREEN(f"{buildopts.bpf_arch}, {'little' if le else 'big'} endian")) makefile.inject('BPF_ARCH', buildopts.bpf_arch) makefile.inject('BPF_EXTRA_FLAG', ' '.join(extra_flags)) if is_gcc_bpf: if not le: buildopts.bpf_cc[-1] = '-mbig-endian' else: buildopts.bpf_cc[-1] = 'bpf' + ('el' if le else 'eb') makefile.inject('BPF_CC', ' '.join(buildopts.bpf_cc)) makefile.inject('BPFTOOL', buildopts.bpftool) makefile.inject('LLVM_STRIP', not is_gcc_bpf and found_llvm_strip) makefile.inject('EBPF_ON', '1') makefile.inject('EBPF', True) taskmgr.run_tasks() # vars not injected: EXTRA_CFLAGS EXTRA_LDFLAGS DEBUG_LEVEL PREFIX BINDIR ZSH_FPATH MANDIR DOCDIR DESTDIR SYS_INC_DIR SYS_LIB_DIR IS_STATIC taskmgr.makefile.inject('EXTRA_CFLAGS', buildopts.cflags) taskmgr.makefile.inject('EXTRA_LDFLAGS', buildopts.ldflags) taskmgr.makefile.inject('DEBUG_LEVEL', str(buildopts.debug_level)) taskmgr.makefile.inject('PREFIX', buildopts.prefix) taskmgr.makefile.inject('BINDIR', buildopts.bindir) taskmgr.makefile.inject('ZSH_FPATH', buildopts.zshfpath) taskmgr.makefile.inject('MANDIR', buildopts.mandir) taskmgr.makefile.inject('DOCDIR', buildopts.docdir) taskmgr.makefile.inject('DESTDIR', buildopts.destdir) taskmgr.makefile.inject('IS_STATIC', '1' if buildopts.is_static else '0') taskmgr.makefile.inject('SYS_INC_DIR', f'-I{buildopts.sys_includedir}' if buildopts.sys_includedir else '') taskmgr.makefile.inject('SYS_LIB_DIR', f'-L{buildopts.sys_libdir}' if buildopts.sys_libdir else '') assert taskmgr.makefile.s.find('{{') == -1 info('Writting back to Makefile... ', end='') try: with open('Makefile', 'w') as f: f.write(taskmgr.makefile.s) except Exception as e: info(TXT_RED('failed')) error(f'Unexpected error when write back: {e}') else: info(TXT_GREEN('ok')) ceccomp-4.3.1/docs/000077500000000000000000000000001526046660400140715ustar00rootroot00000000000000ceccomp-4.3.1/docs/.gitignore000066400000000000000000000000051526046660400160540ustar00rootroot00000000000000*.mo ceccomp-4.3.1/docs/Makefile000066400000000000000000000002001526046660400155210ustar00rootroot00000000000000# NOTE: Don't edit translated adoc directly! They are automatically generated. update: po4a po4a.cfg readme: po4a readme.cfg ceccomp-4.3.1/docs/boot-slate.css000066400000000000000000000162161526046660400166620ustar00rootroot00000000000000/* SPDX-License-Identifier: MIT */ /* Based on Slate from Bootswatch (https://bootswatch.com/slate/) */ /* This style sheet is distributed under MIT License */ /* document body (contains all content) */ body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.42857143; color: #c8c8c8; background-color: #272b30; margin-left: 10%; margin-right: 10%; } /* document header (contains title etc) */ #header { width: 100%; } #header>h1 { border-bottom: 1px solid #ddddd8; padding-bottom: 8px; } /* headings */ h1, h2, h3, h4, h5, h6 { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: inherit; } h1, h2, h3 { margin-top: 20px; margin-bottom: 10px; } h4, h5, h6 { margin-top: 10px; margin-bottom: 10px; } h1 { font-size: 4em; /* font-size: 36px; */ } h2 { font-size: 30px; } h3 { font-size: 24px; } h4 { font-size: 18px; } h5 { font-size: 14px; } h6 { font-size: 12px; } /* plain paragraph text */ .paragraph { /* font-family: sans-serif; */ margin: 0 0 10px; } p { /* font-family: sans-serif; */ margin: 0 0 10px; } /* blockquote text */ .quoteblock { font-style: italic; } blockquote { padding: 10px 20px; margin: 0 0 20px; font-size: 17.5px; border-left: 5px solid #7a8288; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #7a8288; border-left: 0; text-align: right; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ''; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } /* blockquote attribution text */ .attribution, .cite, blockquote footer, blockquote small, blockquote .small { display: block; line-height: 1.42857143; color: #7a8288; } .attribution:before, blockquote footer:before, blockquote small:before, blockquote .small:before { content: '\2014 \00A0'; } /* admonition blocks (NOTE, TIP, IMPORTANT, CAUTION, WARNING) */ .admonitionblock { margin: 0 0 16px; padding: 8px 10px; border-radius: 2px; } .admonitionblock.note { background-color: rgba(159, 195, 222, 0.15); } .admonitionblock.tip { background-color: rgba(169, 211, 177, 0.15); } .admonitionblock.important { background-color: rgba(205, 191, 226, 0.15); } .admonitionblock.caution { background-color: rgba(236, 201, 164, 0.15); } .admonitionblock.warning { background-color: rgba(232, 223, 174, 0.15); } .admonitionblock table { width: 100%; margin-bottom: 0; border-collapse: collapse; } .admonitionblock tbody > tr:nth-of-type(odd), .admonitionblock tbody > tr:hover { background-color: transparent; } .admonitionblock td { border-top: 0; } .admonitionblock td.icon { width: 1%; padding: 0; vertical-align: top; white-space: nowrap; } .admonitionblock td.icon .title { display: inline-block; padding: 2px 8px; font-weight: 600; border-radius: 4px; } .admonitionblock td.content { padding: 0 0 0 12px; } .admonitionblock td.content p { margin: 0 0 8px; padding: 0; } .admonitionblock td.content > :last-child, .admonitionblock td.content p:last-child, .admonitionblock td.content ul:last-child, .admonitionblock td.content ol:last-child { margin-bottom: 0; } .admonitionblock.note td.icon .title { background-color: #9fc3de; color: #24516f; } .admonitionblock.tip td.icon .title { background-color: #a9d3b1; color: #2d5c36; } .admonitionblock.important td.icon .title { background-color: #cdbfe2; color: #4f3f7d; } .admonitionblock.caution td.icon .title { background-color: #ecc9a4; color: #7d4a17; } .admonitionblock.warning td.icon .title { background-color: #e8dfae; color: #6f5f18; } /* unordered list */ ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } /* links */ a { color: #ffffff; text-decoration: none; } a:hover, a:focus { color: #ffffff; text-decoration: underline; } a:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } /* horizontal rules */ hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #1c1e22; } /* table */ table { background-color: transparent; width: 100%; max-width: 100%; margin-bottom: 21px; border-collapse: collapse; } table col[class*="col-"] { position: static; float: none; display: table-column; } table td[class*="col-"], table th[class*="col-"] { position: static; float: none; display: table-cell; } /* table caption */ caption { padding-top: 8px; padding-bottom: 8px; color: #7a8288; text-align: left; } /* table header row */ thead { border-bottom: 2px solid #1c1e22; } /* table header cell */ th { text-align: left; padding-left: 8px; } /* table footer */ tfoot { color: #807F81; border-top: 1px solid #1c1e22; } /* table cell */ td { border-top: 1px solid #1c1e22; } td p { margin: auto; padding: 8px; } /* table body */ tbody > tr:nth-of-type(odd) { background-color: #353a41; } tbody > tr:hover { background-color: #49515a; } /* inline code */ code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } code { padding: 2px 4px; font-size: 90%; color: #e3c7d2; background-color: #444951; border-radius: 4px; } kbd { padding: 2px 4px; font-size: 90%; color: #ffffff; background-color: #333333; border-radius: 3px; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; -webkit-box-shadow: none; box-shadow: none; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.42857143; word-break: break-all; word-wrap: break-word; color: #dcc1cc; background-color: #33373d; border: 1px solid #cccccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } /* image */ img { max-width: 100%; vertical-align: middle; } /* footer section */ #footer { margin-top: 22px; padding: 14px 16px; background-color: #3a3f44; } /* responsiveness fixes */ video { max-width: 100%; } /* table of Contents sidebar */ #toctitle { color: #272b30; } #toc ul { display: inline; list-style-type: none; margin: 0; padding: 0; overflow: hidden; } #toc li { display: block; } #toc a { background-color: #3a3f44; float: left; text-align: center; padding: 14px 16px; text-decoration: none; } #toc li a:hover { background-color: #272b2e; text-decoration: none; } #toc:after { content: " "; visibility: hidden; display: block; height: 0; clear: both; } @media all and (max-width: 600px) { table { width: 55vw!important; font-size: 3vw; } } ceccomp-4.3.1/docs/ceccomp.adoc000066400000000000000000000477561526046660400163550ustar00rootroot00000000000000= ceccomp(1) dbgbgtf ; RocketDev :doctype: manpage :docdatetime: {TAG_TIME} :manmanual: Ceccomp Manual :mansource: ceccomp {VERSION} :manversion: {VERSION} :imagesdir: images/ :stylesheet: boot-slate.css == NAME ceccomp - A tool to analyze seccomp filters == SYNOPSIS usage: ceccomp [FILE] [-q|--quiet] [-f|--format FMT] [-a|--arch ARCH] [-p|--pid PID] [-s|--seize] [-o|--output FILE] [-c|--color WHEN] ... == CONCEPT Kernel use BPF filters to limit syscall rules, applied via `seccomp` or `prctl` syscall. For example, down below is a simple filter to block `execve` syscall in hex format: 1: 20 00 00 00 00 00 00 00 $A = $syscall_nr 2: 15 00 00 01 3b 00 00 00 if ($A != execve) goto 4 3: 06 00 00 00 00 00 00 00 return KILL 4: 06 00 00 00 00 00 ff 7f return ALLOW The part presented in hex is what kernel received, and `ceccomp` take it to disassemble back to human readable text. For instance the *lineno* in the left and *statement* in the right. IMPORTANT: Later I'll use _TEXT_ in short for BPF human readable text, and use _RAW_ in short for BPF raw format, please keep that in mind. == DESCRIPTION `ceccomp` have 5 main functions, basically it's a C version of `seccomp-tools`, however, there are some breaking changes you need to know, which will be highlighted in each subcommand section. === asm - ASSEMBLE ceccomp asm [-c WHEN] [-a ARCH] [-f FMT] [TEXT] Assemble _TEXT_ to _RAW_. Use it to embed hand written filter rules into C code or to see the original code of some _TEXT_. -c, --color *WHEN*:: Determines when to display warnings and errors in color. If the value is _auto_, ceccomp will display color when the output target is a "tty". Can be _auto_, _never_ or _always_. The default value is _auto_. -a, --arch *ARCH*:: Set to any architecture libseccomp supports. Will be used to determine the actual syscall number behind the name (for example, on x86_64, you could write `"execve"` instead of `59` like the basic example above). Your system arch will be taken if not set via `uname`. The default value on your system is {ARCH}. -f, --format *FMT*:: Determines how `ceccomp` produces binary-format bpf code. Can be _hexfmt_, _hexline_, _raw_ or _c-macro_. You could find sample output in <> section. The default value is _hexline_. *TEXT*:: Take a optional filename to determine which file containing _TEXT_ will be assembled. Will read from _stdin_ if not set. `-` is treated as _stdin_. IMPORTANT: The assembly syntax was changed greatly since _version 4.0_, please checkout grammar reference below! Please check out <> section to see how to write a rule by hand. Some examples will be displayed in <> section. NOTE: Since _version 4.0_, endianness is considered. If target endianness *ARCH* is different from machine endianness, the filters will be reversed (CODE and K) before outputting. NOTE: Since _version 4.3_, a new *FMT* _c-macro_ is added to port seccomp rules to other architectures easily. |=== |Command|Difference |`seccomp-tools asm` |Use its own grammar to assemble, a bit script like; can assemble invalid _TEXT_ which will be rejected by kernel |`ceccomp asm` |You can just take `disasm` output to `asm`, no new grammar is needed to learn; take `stdin` as input by default |=== === disasm - DISASSEMBLE ceccomp disasm [-c WHEN] [-a ARCH] [-e] [RAW] Disassemble _RAW_ to _TEXT_. Use it to see what does a filter do if you could not access filter via `trace` and have to manually extract the filter out. -c, --color *WHEN*:: Argument description can be found in <> section. `disasm` may print more text in color including syntax highlighting for _TEXT_. -a, --arch *ARCH*:: Set to any architecture libseccomp supports. Will be used to determine how filtered syscall number in _RAW_ filter is translated to syscall name (for example, on x86_64, the number `0x3b` is translated to `execve` if is comparing syscall_nr, see the basic example above). The default value on your system is {ARCH}. -e, --ebpf:: Treat _RAW_ as eBPF insn bytes instead of cBPF filter bytes. This flag is designed to test whether eBPF-to-cBPF conversion is working or not. To use this function, please dump installed eBPF insns migrated from seccomp filters in a process via eBPF or a kernel module. Any input not generated by kernel may lead to undefined behavior. *RAW*:: A binary file with raw BPF codes. Takes _stdin_ as input if not set. Treat `-` as _stdin_. The file is arch-revelent, so it may not be portable on different archs. NOTE: Since _version 4.0_, endianness is considered. If target endianness *ARCH* is different from machine endianness, the filters will be reversed (CODE and K) before decoding. NOTE: ceccomp will try to resolve syscall number under an arch ONLY IF that at that line, arch can be determined. On foreign arch (not equal to the arch you set), the foreign arch will be prepended to syscall name. You may notice that in some cases, seccomp-tools is able to resolve the name while ceccomp is not, that may be intended as the arch is not determined. |=== |Command|Difference |`seccomp-tools disasm` |Disassembles in its format; never check if the filter is valid |`ceccomp disasm` |Disassembles in ceccomp format, and takes `stdin` as input by default; check arch strictly and always display foreign arch name |=== === emu - EMULATE ceccomp emu [-c WHEN] [-a ARCH] [-q] TEXT SYSCALL_NAME/SYSCALL_NR [ARGS[0] ARGS[1] ... ARGS[5] PC] Emulate what will happen if `syscall(SYSCALL_NR, ARGS[0], ARGS[1], ..., ARGS[5])` from `PC` is called following rules described in _TEXT_. Use it to see the result without actually running it in program or you don't want to examine the filter rule manually. This subcommand can be used to automatically examining a filter. -c, --color *WHEN*:: Argument description can be found in <> section. `emu` may print more text in color including syntax highlighting for _TEXT_ and skipped statements. *SYSCALL_NAME/SYSCALL_NR*:: If you set *SYSCALL_NAME* (like `execve`), it will be translated to *SYSCALL_NR* under *ARCH* first. Or else set *SYSCALL_NR* directly (like `59`). Then the nr will be tested against the bpf filter to see the result of that syscall. This argument is NOT optional. *ARGS[0-5]* and *PC*:: Register values when calling syscall. For example, on x86_64, these are equivalent to `rdi`, `rsi`, `rdx`, `r10`, `r8`, `r9` and `rip`. Their default value is 0. -a, --arch *ARCH*:: Argument description can be found in <> section. *TEXT*:: Take a filename to determine which file containing _TEXT_ rule will be tested. Note that filename CAN NOT be ignored as ceccomp can not determine if a positional argument is syscall or filename. Use `-` to refer to _stdin_. -q, --quiet:: Only print the eval result of the filter. For example, if last statement emulated is `return KILL`, then `KILL` is printed. |=== |Command|Difference |`seccomp-tools emu` |Take a _RAW_ as input |`ceccomp emu` |Take a _TEXT_ as input and take `stdin` as input by default; set *PC* is possible |=== === trace - TRACE FILTER IN RUNTIME ceccomp trace [-c WHEN] [-q] [-o FILE] PROGRAM [program-args] [-c WHEN] [-q] -p PID [-s] The first line captures filters *PROGRAM* loads in runtime by tracing it; the second line extract seccomp filters from *PID*, or trace *PID* to capture subsequent seccomp filters; once fetched filters, print them in _TEXT_. You can only choose one of the two formats above. Use this if running the program is the simplest way to fetch bpf filters or a program with seccomp filters installed is waiting for input. -c, --color *WHEN*:: Argument description can be found in <> section. `trace` may print more text in color including syntax highlighting for _TEXT_. -o, --output *FILE*:: May be useful when *PROGRAM* produces quite a lot output in _stderr_. `ceccomp` allow user to close _stdin_ and _stdout_ to limit *PROGRAM* input and output, so `ceccomp` use _stderr_ to print messages when running *PROGRAM*, set *FILE* if you want to see _TEXT_ in some other file. Treat `-` as _stdout_. *PROGRAM*:: Set to the program you want to run, and *program-args* are its arguments just like running shell command `exec PROGRAM program-args`. -p, --pid *PID*:: Set to the pid you want to inspect. *PID* is conflict with *PROGRAM*; you could either run a program dynamically or examine a pid in one command. Without `-s` flag, trace pid will try to extract seccomp filter in *PID* via `ptrace(PTRACE_SECCOMP_GET_FILTER)`, which may not be available in some systems. The pid here is actually process (thread) id, you can trace a thread or process. -s, --seize:: *ONLY AVAILABLE FOR TRACE PID MODE.* Set this flag will override trace pid behavior to attach to *PID* and keep tracing for seccomp filter loading like trace prog mode. _This flag was introduced in version 4.0._ -q, --quiet:: Set to suppress the extra *[INFO]* prints when detect process forking, exiting or seccomp filter loading. _This flag was introduced in version 4.0._ NOTE: To extract filters from *PID*, `CAP_SYS_ADMIN` is needed (without `-s` flag) and `CAP_SYS_PTRACE` may also be needed, the easiest way to acquire them is calling `ceccomp` with `sudo`. NOTE: Since _version 3.1_, multiple process tracing is introduced, and when tracee forking/resolving/exiting, an extra INFO message is printed. You can discard it by running command like `ceccomp trace -q PROG 2>/dev/null`. NOTE: Since _version 4.2_, `dump` sub command is added as an alias of `trace`, to keep compatibility with `seccomp-tools`. |=== |Command|Difference |`seccomp-tools dump` |Setting output format is possible; each filter can be output to a different file; killing *PROGRAM* once *LIMIT* times of filters loaded; wrapping *PROGRAM* in `sh -c` |`ceccomp trace` or `ceccomp dump` |All filters are output to a single file; never kill *PROGRAM*; *PROGRAM* is launched directly, so `./` is not needed; explicitly print when forking; able to attach to pid for dynamic seccomp filter capturing |=== === probe - TEST COMMON SYSCALLS INSTANTLY ceccomp probe [-c WHEN] [-o FILE] [-q] PROGRAM [program-args] Run *PROGRAM* with *program-args* to captures *FIRST* seccomp filter, and then kill all children. Use it when a quick check against a program is needed, and detect potential seccomp rule issues. All argument descriptions can be found in <> section. The output for this subcommand is the emulating result of common syscalls like `execve`, `open` and so on. If the filter itself is not capable of blocking syscalls, you could know that with a glance. Typical output for this subcommand is described below, more detailed example could be found in <> section. open -> ALLOW read -> ALLOW write -> ALLOW execve -> KILL execveat -> KILL mmap -> ALLOW mprotect -> ALLOW openat -> ALLOW sendfile -> ALLOW ptrace -> ERRNO(1) fork -> ALLOW NOTE: `seccomp-tools` don't have this subcommand. === capture - CAPTURE FILTERS WITH EBPF ceccomp capture [-c WHEN] [-p PID] Capture seccomp filters in global scope if *PID* not set. The eBPF program will trace `seccomp_check_filter` kernel function, reliably intercepting seccomp filters that the kernel will load, WITHOUT race conditions compared to <>. This function is named "global capture" below. Linux 5.15 is the lowest recommended kernel version to run this function on _x86_64_, other architecture may require higher kernel version to run this function. If *PID* is set, an eBPF program to extract installed seccomp filters in the corresponding process (actually thread) will be installed. Note that inside kernel, `pid` is referred thread id and `tgid` is referred to process id. The eBPF program directly pulls eBPF insns migrated from original seccomp filters out and converts them back to perform <>. This function does not require `CONFIG_CHECKPOINT_RESTORE` kernel config, and is functional even if `ceccomp` itself is under seccomp. This function is named "capture pid" below. Linux 6.2 is the lowest kernel version to run this function, as `bpf_task_from_pid` was introduced then. IMPORTANT: When the kernel migrates seccomp filters, the conversion from cBPF to eBPF is lossy because several distinct cBPF instructions can be mapped to the same eBPF instruction sequence. As a result, the output from "capture pid" may not be identical to the original seccomp filter, even though it is functionally equivalent. Currently, compat task detection is only supported on _x86_64_ and _aarch64_. With this feature, `ceccomp` can identify whether a task is native (64-bit task on 64-bit kernel) or "compatible" (32-bit task on 64-bit kernel), so that `ceccomp` can pass the correct architecture token to libseccomp to query syscall name in captured seccomp filters. Note that eBPF utilizes asynchronous ring buffer to send back data to user-mode process, so if lots of seccomp filters are loaded at the same time, the buffer may run out and you need to see detailed errors via `bpftool prog trace`. Since we can't send the errors back through full ring buffer, those overflowed filters are actually invisible to users without reading kernel messages. -c, --color *WHEN*:: Argument description can be found in <> section. -p, --pid *PID*:: Which *process* (thread) to extract seccomp filter insns from. TIP: All *PID* presented in either "global capture" or "capture pid" are *INITIAL NAMESPACE PID*, not PID in current namespace. It's recommended that only run `ceccomp capture` in initial namespace. NOTE: This module is optional, you can opt it out during configuration. This module require libbpf to work. NOTE: This subcommand was introduced in _version 4.3_. == TEXT GRAMMAR REFERENCE IMPORTANT: The grammar changed greatly since _version 4.0_ as we refactored lexer for better human readability. The wrapper now prefixed by `#` as it's a comment now. And _line_ is replaced by _label_, so now lexer depends on label declaration to decide where to jump, instead of lineno in _TEXT_ file. A valid _TEXT_ format is described in EBNF-like declaration here: https://github.com/ceccomp/ceccomp/issues/17#issuecomment-3610531705 . If you have no interest to know what EBNF is, please keep reading for examples. BPF ops which are not described below are banned by kernel. === Comment and Label `ceccomp disasm` displays a lot of things, but some of them are optional for asm. #Label CODE JT JF K #--------------------------------- L0001: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- Any text after `#` will be discarded by asm like some script languages. Empty lines are accepted. Label declaration is an identifier at the beginning of line and suffixed by `:` like `L0001`. An identifier is a string starts with alpha and contains with only alphanumeric characters and underscore `_`. Label is only necessary if it's the destination of `goto`, these redundant labels added by disasm are for readability. E.g. in `if ($A == 0) goto somewhere`, `somewhere` is a label and must be declared after the statement. Label declaration can take a line separately, or be put in front of statement. The `CODE`, `JT`, `JF` and `K` value generated by disasm will be discarded by asm, asm only parse the effective statement after `K`. CAUTION: There are some slight difference between `ceccomp disasm` and `seccomp-tools disasm`, down below is a general example. And some statements are different, so don't pipe seccomp-tools output to ceccomp blindly. line CODE JT JF K ================================= 0000: 0x06 0x00 0x00 0x7fff0000 return ALLOW === Assignment `A` can be set to seccomp attributes directly. But `X` can not be assigned with seccomp attributes directly due to kernel limit. $A = $arch $A = $syscall_nr To assign `A` with those 64-bit long fields, `low_` or `high_` prefix is needed. $A = $low_pc $A = $high_pc $A = $low_args[0] $A = $high_args[0] ... $A = $low_args[5] $A = $high_args[5] A special attribute is `sizeof(struct seccomp_data)`, that can be assigned to `A` or `X` directly. $A = $scmp_data_len $X = $scmp_data_len Temporary memory is 32-bit, to access them, you could use hex or dec as index. Both `A` and `X` is assignable. Assigning immediate values to `A` or `X` accepts any format of number if you imply the correct base by "0x" or "0b". $X = $mem[0] $A = $mem[0xf] $A = $mem[15] # both hex and dec index are OK $A = 0 $X = 0x3b $A = 0b1111 $A = 0333 You could also assign `X` to `A` or in the reverse order. Assign `X` or `A` to temporary memory is definitely okay. $A = $X $X = $A $mem[3] = $X $mem[0x4] = $A === Arithmetic Operations Various operations can be applied to `A`. $A += 30 $A -= 4 $A *= 9 $A /= 1 $A &= 7 $A >>= 6 The right value can be `X`. $A &= $X $A |= $X $A ^= $X $A <<= $X And there is a way to negativate `A`. $A = -$A === Jump Downwards If ... Unconditional jump: goto L3 Jump if: if ($A == execve) goto L3 if ($A != 1234) goto L4 if ($A & $X) goto L5 if !($A & 7) goto L6 if ($A <= $X) goto L7 If true jump to ... if false jump to...: if ($A > $X) goto L3, else goto L4 if ($A >= 4567) goto L5, else goto L6 ONLY in conditions, you CAN replace number with syscall name or arch name. In example above, `0x3b` is replaced by `execve`. All the syscall name will be resolved to syscall number under your selected arch. If you want to resolve a syscall name in foreign arch (not equal to your selected arch), please prepend a arch and dot. For example, your arch is x86_64, and you are writing _aarch64_ rules, then please write like: if ($A == aarch64.read) goto 5 Note that if you manually set arch to _aarch64_ with `-a aarch64`, you can omit `aarch64.` in statement. === Return Code Return value of register `A`: return $A Or return a immediate value, with extra field in `()`. Actions including `TRACE`, `TRAP` and `ERRNO` accept an extra field, without `()`, they are treated as `action(0)`. return 0x13371337 return KILL return KILL_PROCESS return TRAP(123) return ERRNO(0) return TRACE return TRACE(3) return LOG return NOTIFY === Short Example The following _TEXT_ is valid for asm, which blocks `execve` and `execveat` for amd64 syscalls: $A = $syscall_nr if ($A == execve) goto forbid if ($A == execveat) goto forbid return ALLOW forbid: return KILL == RESTRICTIONS Ceccomp asm put some restrictions on _TEXT_ for better performance. 1. `'\0'` must not be found in _TEXT_ since it's a text file. 2. A line must be shorter than 384 *bytes*. 3. A _TEXT_ file must have less than 16384 lines. 4. A _TEXT_ file must be smaller than 4 MiB. And for both asm and disasm, effective statements (that can be encoded or decoded into BPF) must be less or equal than 4096, this is enforced by kernel. A fun fact about ceccomp asm: any basic ANSI color in _TEXT_ file, e.g., `\x1b[31m`, will be discarded when processing. == EXAMPLES ifdef::backend-manpage[] Manpage can not display images, so please check out html version of this page to see examples. endif::[] ifndef::backend-manpage[] === asm example image::asm.webp[] === disasm example image::disasm.webp[] === emu example image::emu.webp[] === trace example Running program: image::trace.webp[] If set `-o FILE`: image::output_trick.webp[] Trace pid mode: image::trace_pid.webp[] Seize pid mode: image::trace_seize.webp[] Completion for pid mode is available under zsh: image::trace_completion.webp[] === probe example image::probe.webp[] === capture example Globally capture: image::capture.webp[] Capture filters in a process: image::capture_pid.webp[] endif::[] == REPO Visit https://github.com/ceccomp/ceccomp to find the code. Pull Requests and Issues are welcome! Copyright (C) 2025-present, distributed under GPLv3 or later. ceccomp-4.3.1/docs/ceccomp.zh_CN.adoc000066400000000000000000000505661526046660400173460ustar00rootroot00000000000000= ceccomp(1) dbgbgtf ; RocketDev :doctype: manpage :docdatetime: {TAG_TIME} :manmanual: Ceccomp Manual :mansource: ceccomp {VERSION} :manversion: {VERSION} :imagesdir: images/ :stylesheet: boot-slate.css == å��ç§° ceccomp - 一个分æž�安全计算 (seccomp) 过滤器的工具 == 大纲 usage: ceccomp [FILE] [-q|--quiet] [-f|--format FMT] [-a|--arch ARCH] [-p|--pid PID] [-s|--seize] [-o|--output FILE] [-c|--color WHEN] ... == 概念 内核使用BPF过滤器æ�¥é™�制系统调用规则,并使用 `seccomp` å’Œ `prctl` 两个系统调用æ�¥å®‰è£…过滤器。以下是一个以å��六进制表示的é™�制 `execve` 系统调用的简å�•过滤器: 1: 20 00 00 00 00 00 00 00 $A = $syscall_nr 2: 15 00 00 01 3b 00 00 00 if ($A != execve) goto 4 3: 06 00 00 00 00 00 00 00 return KILL 4: 06 00 00 00 00 00 ff 7f return ALLOW 以上å��六进制的部分就是内核收到的过滤器,而 `ceccomp` 负责把它拿æ�¥å��汇编为人类å�¯è¯»çš„æ–‡æœ¬ã€‚ 例如左侧的 *行å�·* å’Œå�³ä¾§çš„ *伪代ç �* 。 IMPORTANT: 之å�Žæˆ‘会使用 _TEXT_ 作为BPF过滤器人类å�¯è¯»æ–‡æœ¬ï¼ˆä¼ªä»£ç �)的缩写, 使用 _RAW_ 作为BPF过滤器原始格å¼�的缩写,请记ä½�这个约定。 == æ��è¿° `ceccomp` 有5个主è¦�的功能,它基本上是C版本的 `seccomp-tools` ,然而, 有一些ä¸�å�Œçš„地方你需è¦�知é�“,它们会在在æ¯�个å­�命令的章节中被注明。 === asm - 汇编 ceccomp asm [-c WHEN] [-a ARCH] [-f FMT] [TEXT] å°† _TEXT_ 汇编为 _RAW_ 。适用于将手写的过滤器规则嵌入到C代ç �中, 或希望观察一些 _TEXT_ 对应的原始字节ç �。 -c, --color *WHEN*:: 决定了 `ceccomp` 何时输出有颜色的文本。当设置为 _auto_ 时, `ceccomp` 会在输出目标是一个“ttyâ€�时打å�°é¢œè‰²ã€‚å�¯ä»¥æ˜¯ _auto_ ã€� _never_ 或者 _always_ 。 默认值是 _auto_ 。 -a, --arch *ARCH*:: å�¯ä»¥è®¾ç½®ä¸ºä»»ä½• libseccomp 支æŒ�的架构。它将被用于决定系统调用å��称对应的系统调用å�·ã€‚ 例如,在 x86_64 上,就åƒ�上é�¢çš„基本示例,你å�¯ä»¥å†™ `"execve"` 而ä¸�是数字 `59` 指代系统调用å�·ã€‚如果ä¸�设置这个å�‚数,则通过 `uname` æ��å�–当å‰�系统的架构。 你的系统上的默认值是 {ARCH} 。 -f, --format *FMT*:: 决定了 `ceccomp` 如何输出二进制格å¼�çš„ BPF 字节ç �。å�¯ä»¥æ˜¯ _hexfmt_ã€�_hexline_ã€�_raw_ 或者 _c-macro_。你å�¯ä»¥åœ¨ <> 节中找到示例输出。默认值是 _hexline_。 *TEXT*:: 一个å�¯é€‰çš„æ–‡ä»¶å��,其中存放了需è¦�被汇编的 _TEXT_ 。ä¸�设置则从 _标准输入_ 中读å�–。`-` 被视作 _标准输入_。 IMPORTANT: _4.0 版本_ 大幅修改了汇编的语法,请查阅下é�¢çš„语法å�‚考ï¼� 查看 <> 一节å�¯ä»¥æ‰¾åˆ°å¦‚何手写规则。一些示例会在 <> 一节中展示。 NOTE: 从 _4.0 版本_ 开始考虑端åº�。如果目标架构 *ARCH* 的端åº�与机器端åº�ä¸�å�Œï¼Œåˆ™ä¼šåœ¨è¾“出å‰�å��转过滤器(CODE å’Œ K)。 NOTE: 从 _4.3 版本_ 开始,新的 *FMT* _c-macro_ 被加入用以轻æ�¾å°† seccomp 规则移æ¤�到其他架构上。 |=== |命令|差别 |`seccomp-tools asm` |使用它自己的语法汇编,有点åƒ�脚本;å�¯ä»¥æ±‡ç¼–会被内核拒ç»�的错误 _TEXT_ |`ceccomp asm` |ä½ å�¯ä»¥ç›´æŽ¥æ‹¿ç�€ `disasm` 的输出æ�¥æ±‡ç¼–,ä¸�需è¦�学习新语法;默认使用 _标准输入_ 作为输入 |=== === disasm - å��汇编 ceccomp disasm [-c WHEN] [-a ARCH] [-e] [RAW] å��汇编 _RAW_ 为 _TEXT_ 。适用于当你无法使用 `trace` 看到过滤器时,必须手动æ��å�–过滤器, ç„¶å�Žæ£€æŸ¥å…¶å�«ä¹‰ã€‚ -c, --color *WHEN*:: å�‚æ•°æ��è¿°å�¯ä»¥åœ¨ <> 一节中找到。 `disasm` å�¯èƒ½ä¼šæ‰“å�°æ›´å¤šæœ‰é¢œè‰²çš„æ–‡æœ¬ï¼ŒåŒ…括针对 _TEXT_ 的语法高亮。 -a, --arch *ARCH*:: å�¯ä»¥è®¾ç½®ä¸ºä»»ä½• libseccomp 支æŒ�的架构。它将被用于决定 _RAW_ 中的系统调用å�·å¦‚何被翻译为系统调用å��。 例如,在 x86_64 上,在比较系统调用å�·æ—¶ï¼Œæ•°å­— `0x3b` 将被翻译为 `execve` ,å�¯ä»¥çœ‹ä¸Šé�¢çš„基本示例。 你的系统上的默认值是 {ARCH} 。 -e, --ebpf:: 认为 _RAW_ 是 eBPF 指令字节而é�ž cBPF 过滤器字节。这个标志被设计用于测试 eBPF 到 cBPF 的转æ�¢æ˜¯å�¦æ­£å¸¸å·¥ä½œã€‚è¦�使用这个功能,请使用 eBPF 或内核模å�—导出进程内安装的从 seccomp 过滤器转æ�¢è¿‡æ�¥çš„ eBPF 指令。任何ä¸�是由内核生æˆ�的输入都å�¯èƒ½äº§ç”Ÿæœªå®šä¹‰è¡Œä¸ºã€‚ *RAW*:: 包å�«åŽŸå§‹ BPF 代ç �的二进制文件。如果ä¸�设置则将 _标准输入_ 作为输入。`-` 被视作 _标准输入_。这个文件是与架构有关的,所以它在ä¸�å�Œæž¶æž„之间å�¯èƒ½ä¸�是通用的。 NOTE: 从 _4.0 版本_ 开始考虑端åº�。如果目标架构 *ARCH* 的端åº�与机器端åº�ä¸�å�Œï¼Œåˆ™ä¼šåœ¨è§£ç �å‰�å��转过滤器(CODE å’Œ K)。 NOTE: 当且仅当在æŸ�一行的架构å�¯ä»¥è¢«ç¡®å®šæ—¶ï¼Œceccomp æ‰�会å°�试用那个架构解æž�那个系统调用å�·ã€‚ 如果是外部架构(ä¸�等于你设置的架构),它会被附加到系统调用å��å‰�。你å�¯èƒ½ä¼šæ³¨æ„�到在一些情况下, seccomp-tools 能解æž�一些系统调用å��,而 ceccomp ä¸�能,这å�¯èƒ½æ˜¯å› ä¸ºæ­¤æ—¶æž¶æž„ä¸�能被确定。 |=== |命令|差别 |`seccomp-tools disasm` |用它自己的语法å��汇编;永远ä¸�会检查 _RAW_ 是å�¦å�ˆæ³• |`ceccomp disasm` |用 ceccomp 语法å��汇编,并且默认将 _标准输入_ 作为输入;严格检查架构, 并且永远打å�°å¤–部架构å�� |=== === emu - 模拟 ceccomp emu [-c WHEN] [-a ARCH] [-q] TEXT SYSCALL_NAME/SYSCALL_NR [ARGS[0] ARGS[1] ... ARGS[5] PC] 按照 _TEXT_ 中æ��述的规则,模拟从 `PC` 调用 `syscall(SYSCALL_NR, ARGS[0], ARGS[1], ..., ARGS[5])` 的结果。适用于在ä¸�实际è¿�行程åº�或ä¸�想手动检查规则时,查看触å�‘系统调用的结果。 这个å­�命令适å�ˆç”¨æ�¥è‡ªåŠ¨æ£€æµ‹ä¸€ä¸ªè¿‡æ»¤å™¨ã€‚ -c, --color *WHEN*:: å�‚æ•°æ��è¿°å�¯ä»¥åœ¨ <> 一节中找到。 `emu` å�¯èƒ½ä¼šæ‰“å�°æ›´å¤šæœ‰é¢œè‰²çš„æ–‡æœ¬ï¼ŒåŒ…括针对 _TEXT_ 的语法高亮以å�Šè·³è¿‡çš„伪代ç �。 *SYSCALL_NAME/SYSCALL_NR*:: 如果你设置了 *SYSCALL_NAME* (比如 `execve` ),那么它会基于 *ARCH* 先被翻译为对应的 *SYSCALL_NR* 。或者你å�¯ä»¥ç›´æŽ¥è®¾ç½® *SYSCALL_NR* (例如 `59` )。然å�Žä¼šæµ‹è¯•这个系统调用å�·ç»�过 BPF 过滤器处ç�†å�Žçš„输出并打å�°å‡ºæ�¥ã€‚这个å�‚数是必填的。 *ARGS[0-5]* å’Œ *PC*:: 当调用系统调用时对应寄存器的值。例如,在 x86_64 上,它们分别对应了 `rdi` ã€� `rsi` ã€� `rdx` ã€� `r10` ã€� `r8` ã€� `r9` å’Œ `rip` 。它们的默认值都是0。 -a, --arch *ARCH*:: å�‚æ•°æ��è¿°å�¯ä»¥åœ¨ <> 一节中找到。 *TEXT*:: 一个文件å��,其中存放了需è¦�被测试的 _TEXT_ 规则。注æ„�文件å�� ä¸�能 被忽略,因为 ceccomp 无法判断一个ä½�ç½®å�‚数是系统调用å�·è¿˜æ˜¯æ–‡ä»¶å��。使用 `-` å�¯ä»¥æŒ‡ä»£ _标准输入_。 -q, --quiet:: å�ªæ‰“å�°è¿‡æ»¤å™¨çš„æ¨¡æ‹Ÿç»“果。例如,最å�Žä¸€è¡Œæ¨¡æ‹Ÿçš„伪代ç �是 `return KILL`,那么将会打å�° `KILL`。 |=== |命令|差别 |`seccomp-tools emu` |用 _RAW_ 作为输入 |`ceccomp emu` |用 _TEXT_ 作为输入,并默认将 _标准输入_ 作为输入;å�¯ä»¥è®¾ç½® *PC* |=== === trace - è¿�行时æ�•获过滤器 ceccomp trace [-c WHEN] [-o FILE] PROGRAM [program-args] [-c WHEN] -p PID [-s] 使用第一行的命令å�¯ä»¥åˆ©ç”¨è°ƒè¯•在 *PROGRAM* è¿�行中加载过滤器时动æ€�æ�•获过滤器; 第二行的命令å�¯ä»¥ä»Ž *PID* 对应的进程中æ��å�–出 seccomp 过滤器,或通过调试 *PID* æ�•获å�Žç»­çš„ seccomp 过滤器;一旦æ�•获到了过滤器, 将会以 _TEXT_ 的格å¼�将它打å�°å‡ºæ�¥ã€‚ä½ å�¯ä»¥ä»Žä¸¤ä¸ªæ ¼å¼�中选择一个使用。 适用于è¿�行一个程åº�是æ�•获BPF过滤器最简å�•的方å¼�或者一个安装了 seccomp 过滤器的程åº�正在等待输入。 -c, --color *WHEN*:: å�‚æ•°æ��è¿°å�¯ä»¥åœ¨ <> 一节中找到。 `trace` å�¯èƒ½ä¼šæ‰“å�°æ›´å¤šæœ‰é¢œè‰²çš„æ–‡æœ¬ï¼ŒåŒ…括针对 _TEXT_ 的语法高亮。 -o, --output *FILE*:: 当 *PROGRAM* 会产生很多输出到 _标准错误_ æ—¶å�¯èƒ½å¾ˆæœ‰ç”¨ã€‚ `ceccomp` å…�许用户关闭 _标准输入_ å’Œ _标准输出_ æ�¥é™�制 *PROGRAM* 的输入和输出,所以 当è¿�行 *PROGRAM* æ—¶ `ceccomp` 使用 _标准错误_ æ�¥æ‰“å�°æ¶ˆæ�¯ã€‚如果你想在别的文件中看è§� _TEXT_ çš„è¯�请设置 *FILE* 。`-` 被视作 _标准输出_。 *PROGRAM*:: 设置为你想è¿�行的程åº�,并且 *program-args* 将作为它的å�‚数, å°±åƒ�è¿�行 shell 命令 `exec PROGRAM program-args` 。 -p, --pid *PID*:: 设置为你想检查的 pid。 *PID* å’Œ *PROGRAM* 相冲çª�;你å�ªèƒ½åœ¨ä¸€æ�¡å‘½ä»¤ä¸­åЍæ€�è¿�行一个程åº�,或者检查一个 pid。没有 `-s` 标志,trace pid 会å°�试使用 `ptrace(PTRACE_SECCOMP_GET_FILTER)` 从 *PID* 中æ��å�– seccomp 过滤器,这个æ“�作在一些系统上å�¯èƒ½ä¸�å�¯ç”¨ã€‚这里的 pid 其实是进程(线程)ID,你å�¯ä»¥è¿½è¸ªä¸€ä¸ªçº¿ç¨‹æˆ–进程。 -s, --seize:: *å�ªé€‚用于 TRACE PID 模å¼�。* 设置这个标志将会覆盖 trace pid 的行为为åƒ� trace prog 模å¼�一样把调试器挂到 *PID* 上并æŒ�续跟踪 seccomp 过滤器的加载。_这个标志引入于 4.0 版本。_ -q, --quiet:: 设置这个标志将会在检测到进程分å�‰ã€�退出或加载 seccomp 过滤器时抑制多余的 *[INFO]* 输出。 _这个标志引入于 4.0 版本。_ NOTE: è¦�想从 *PID* 中æ��å�–过滤器,你需è¦� `CAP_SYS_ADMIN` (没有 `-s` 标志),å�Œæ—¶è¿˜å�¯èƒ½éœ€è¦� `CAP_SYS_PTRACE` ,最简å�•的获å�–它们的方法是用 `sudo` è¿�行 `ceccomp` 。 NOTE: 从 _3.1 版本_ 开始引入了多进程支æŒ�,并且当被调试进程 fork/resolve/exit 时,将会打å�°ä¸€æ�¡é¢�外的 INFO ä¿¡æ�¯ã€‚ä½ å�¯ä»¥ä½¿ç”¨åƒ� `ceccomp trace -q PROG 2>/dev/null` 这样的命令丢弃它。 NOTE: 从 _4.2 版本_ 开始 `dump` å­�命令作为 `trace` 的别å��被加入,用以ä¿�æŒ�å’Œ `seccomp-tools` 的兼容性。 |=== |命令|差别 |`seccomp-tools dump` |å�¯ä»¥è®¾ç½®è¾“出格å¼�ï¼›æ¯�一个过滤器å�¯ä»¥è¾“出到ä¸�å�Œçš„æ–‡ä»¶ï¼›å½“ *PROGRAM* 加载了 *LIMIT* 个过滤器å�Žå°±æ�€æ­»ç¨‹åº�;将 *PROGRAM* 包装在 `sh -c` 中è¿�行 |`ceccomp trace` 或 `ceccomp dump` |所有过滤器被输出到å�Œä¸€ä¸ªæ–‡ä»¶ï¼›æ°¸è¿œä¸�会æ�€æ­» *PROGRAM* ï¼› *PROGRAM* 是直接被执行的, 所以ä¸�需è¦� `./` ;当 fork 时,显å¼�打å�°äº‹ä»¶ï¼›èƒ½å¤Ÿé™„加调试器到 pid 上动æ€�æ�•æ�‰ seccomp 过滤器 |=== === probe - 快速测试常è§�的系统调用 ceccomp probe [-c WHEN] [-o FILE] [-q] PROGRAM [program-args] 以 *program-args* 为å�‚æ•°è¿�行 *PROGRAM* æ�¥æ�•获 *第一个* seccomp 过滤器, ç„¶å�Žæ�€æ­»æ‰€æœ‰å­�进程。适用于快速测试一个程åº�的规则并检测潜在的 seccomp 规则问题。 所有å�‚æ•°æ��述都å�¯ä»¥åœ¨ <> 一节中找到。 这个å­�命令的输出是一系列常è§�的系统调用的模拟结果,例如 `execve` ã€� `open` 等。 如果过滤器本身并ä¸�能阻拦系统调用,那你一眼就能看出æ�¥ã€‚ 这个å­�命令的典型输出如下所示,更多完整的实例å�¯ä»¥åœ¨ <> 一节中找到。 open -> ALLOW read -> ALLOW write -> ALLOW execve -> KILL execveat -> KILL mmap -> ALLOW mprotect -> ALLOW openat -> ALLOW sendfile -> ALLOW ptrace -> ERRNO(1) fork -> ALLOW NOTE: `seccomp-tools` 没有等价的å­�命令。 === capture - 用 eBPF æ�•获过滤器 ceccomp capture [-c WHEN] [-p PID] 未设置 *PID* 时在全局范围内æ�•获 seccomp 过滤器。eBPF 程åº�将追踪 `seccomp_check_filter` 内核函数,å�¯é� åœ°æ‹¦æˆªå†…核将加载的 seccomp 过滤器,而相比 <> 没有æ�¡ä»¶ç«žäº‰çš„风险。这个功能在下方被称为“全局æ�•获â€�。在 _x86_64_ 上,Linux 5.15 是è¿�行该功能的最低推è��内核版本。 当设置了 *PID* 时,将安装用æ�¥ä»Žå¯¹åº”进程(其实是线程)中æ��å�–已安装过的 seccomp 过滤器的 eBPF 程åº�。注æ„�在内核中,`pid` 指线程 id,而 `tgid` 指进程 id。eBPF 程åº�会直接把由原始 seccomp 过滤器转æ�¢å�Žçš„ eBPF 指令抽å�–出æ�¥å¹¶è½¬æ�¢å›žåŽ»ï¼Œç”¨ä»¥æ‰§è¡Œ <>。这个功能ä¸�需è¦� `CONFIG_CHECKPOINT_RESTORE` 内核é…�置,甚至在 `ceccomp` 处在 seccomp 状æ€�æ—¶ä»�能工作。这个功能在下方被称为“æ�•获 PIDâ€�。Linux 6.2 是è¿�行该功能的最低内核版本,因为这时 `bpf_task_from_pid` 函数æ‰�被引入。 IMPORTANT: 当内核è¿�ç§» seccomp 过滤器时,由于一些ä¸�å�Œçš„ cBPF 指令会被映射到相å�Œçš„ eBPF 指令åº�列,因此从 cBPF 到 eBPF 的转æ�¢æ˜¯æœ‰æ�Ÿçš„。结果是“æ�•获 PIDâ€�的输出å�¯èƒ½å’ŒåŽŸå§‹çš„ seccomp 过滤器并ä¸�一致,尽管它们在功能上是等价的。 ç›®å‰�,compat task 检测å�ªæ”¯æŒ� _x86_64_ å’Œ _aarch64_。 这个功能å…�许 `ceccomp` 识别一个任务是原生的 (64 ä½�内核上的 64 ä½�任务),还是“兼容的â€� (64 ä½�内核上的 32 ä½�任务),由此 `ceccomp` æ‰�能把正确的架构标识传给 libseccomp æ�¥æŸ¥è¯¢æ�•获到的 seccomp 过滤器中的系统调用的å��字。 注æ„� eBPF 利用异步环形缓冲区æ�¥å�‘用户æ€�进程å�‘回数æ�®ï¼Œæ‰€ä»¥å¦‚æžœå�Œæ—¶åŠ è½½äº†å¥½å¤š seccomp 过滤器,缓冲区å�¯èƒ½ä¼šè€—尽并且您需è¦�è¿�行 `bpftool prog trace` æ�¥çœ‹åˆ°è¯¦ç»†é”™è¯¯ã€‚由于我们ä¸�能将错误通过满的缓冲区å�‘回æ�¥ï¼Œå› æ­¤é‚£äº›æº¢å‡ºçš„过滤器对没有阅读内核消æ�¯çš„用户æ�¥è¯´å®žé™…上是ä¸�å�¯è§�的。 -c, --color *WHEN*:: å�‚æ•°æ��è¿°å�¯ä»¥åœ¨ <> 一节中找到。 -p, --pid *PID*:: 从哪个 *进程* (线程) 中æ��å�– seccomp 过滤器指令。 TIP: 所有出现在“全局æ�•获â€�或“æ�•获 PIDâ€�中的 *PID* 是 *åˆ�始命å��空间 PID*,而ä¸�是当å‰�命å��空间中的 PID。推è��å�ªåœ¨åˆ�始命å��空间中è¿�行 `ceccomp capture`。 NOTE: 此模å�—是å�¯é€‰çš„,您å�¯ä»¥åœ¨é…�置阶段将其ç¦�用。此模å�—需è¦� libbpf æ‰�能工作。 NOTE: æ­¤å­�命令在 _4.3 版本_ 中被引入。 == TEXT 语法å�‚考 IMPORTANT: _4.0 版本_ æ��高了è¯�法分æž�器代ç �çš„å�¯è¯»æ€§ï¼Œä¼´éš�ç�€å¤§å¹…修改的语法。å‰�缀为 `#` 的行现在是注释了。å�Œæ—¶ _行å�·_ 被替æ�¢ä¸º _标签_,现在è¯�法分æž�器根æ�®æ ‡ç­¾å®šä¹‰æ�¥å†³å®šè·³è½¬åˆ°å“ªé‡Œï¼Œè€Œä¸�是根æ�® _TEXT_ 文件中的行å�·ã€‚ 这里有正确的 _TEXT_ æ ¼å¼�,以类 EBNF 语法æ��述:https://github.com/ceccomp/ceccomp/issues/17#issuecomment-3610531705 。 没兴趣了解 EBNF?请继续阅读以下的例å­�。 其余未æ��述到的BPFæ“�作都被内核ç¦�止了。 === 注释与标签 `ceccomp disasm` 展示了很多东西,但对于 asm æ�¥è¯´æœ‰äº›æ˜¯å�¯é€‰çš„。 #Label CODE JT JF K #--------------------------------- L0001: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- 任何在 `#` 之å�Žçš„æ–‡æœ¬å°†è¢« asm 丢弃,就åƒ�一些脚本语言一样。 å…�许空行。 标签声明是一个从行首开始并以 `:` 结尾的标识符,例如 `L0001`。标识符是一个以字æ¯�为首,中间å�ªåŒ…å�«å­—æ¯�ã€�数字和下划线 `_` 的字符串。标签å�ªåœ¨å®ƒæ˜¯ `goto` 的目标时æ‰�是必è¦�的,由 disasm 添加的多余的标签知识为了å�¯è¯»æ€§ã€‚例如在 `if ($A == 0) goto somewhere` 中,`somewhere` 是一个标签并且必须在这行伪代ç �å�Žå£°æ˜Žã€‚标签声明å�¯ä»¥å�•独å� æ�®ä¸€è¡Œï¼Œä¹Ÿå�¯ä»¥æ”¾ç½®åœ¨ä¼ªä»£ç �çš„å‰�é�¢ã€‚ ç”± disasm 生æˆ�çš„ `CODE`ã€�`JT`ã€�`JF` å’Œ `K` 值会被 asm 丢弃,asm 之解æž� `K` 之å�Žçš„æœ‰æ•ˆä¼ªä»£ç �。 CAUTION: `ceccomp disasm` å’Œ `seccomp-tools disasm` 的输出之间有很多细微的差别, 以下是一个典型的输出示例。å�Œæ—¶æœ‰äº›ä¼ªä»£ç �是ä¸�å�Œçš„,所以ä¸�è¦�盲目将 seccomp-tools 的输出管é�“ç»™ ceccomp。 line CODE JT JF K ================================= 0000: 0x06 0x00 0x00 0x7fff0000 return ALLOW === 赋值 `A` å�¯ä»¥ç›´æŽ¥èµ‹å€¼ä¸º seccomp 属性。由于内核é™�制, `X` ä¸�能直接赋值为 seccomp 属性。 $A = $arch $A = $syscall_nr è¦�ç»™ `A` 赋值为这些64ä½�长的字段,必须使用 `low_` 或者 `high_` çš„å‰�缀。 $A = $low_pc $A = $high_pc $A = $low_args[0] $A = $high_args[0] ... $A = $low_args[5] $A = $high_args[5] 一个特殊的属性是 `sizeof(struct seccomp_data)` ,它å�¯ä»¥ç›´æŽ¥èµ‹å€¼ç»™ `A` 或 `X` 。 $A = $scmp_data_len $X = $scmp_data_len 临时内存是32ä½�的,è¦�想访问它们,你å�¯ä»¥ä½¿ç”¨å��六进制或者å��进制的索引。 `A` å’Œ `X` 都是å�¯èµ‹å€¼çš„。给 `A` 或 `X` 赋值为立å�³æ•°æŽ¥å�—ä»»æ„�æ ¼å¼�的数字,å�ªè¦�你使用 "0x" 或者 "0b" ç­‰å‰�缀正确表达数字是几进制的。 $X = $mem[0] $A = $mem[0xf] $A = $mem[15] # both hex and dec index are OK $A = 0 $X = 0x3b $A = 0b1111 $A = 0333 你还å�¯ä»¥å°† `X` 赋值给 `A` 或者å��过æ�¥ã€‚å°† `X` 或 `A` 赋值给临时内存当然å�¯ä»¥ã€‚ $A = $X $X = $A $mem[3] = $X $mem[0x4] = $A === æ•°å­¦è¿�ç®— ä½ å�¯ä»¥ä»¥å¤šç§�æ–¹å¼�æ“�作 `A` 。 $A += 30 $A -= 4 $A *= 9 $A /= 1 $A &= 7 $A >>= 6 å�³å€¼ä¹Ÿå�¯ä»¥æ˜¯ `X` 。 $A &= $X $A |= $X $A ^= $X $A <<= $X 想è¦�对 `A` å�–å��å�¯ä»¥è¿™ä¹ˆå�šã€‚ $A = -$A === 当...æ—¶å�‘下跳转 æ— æ�¡ä»¶è·³è½¬ï¼š goto L3 当...跳转: if ($A == execve) goto L3 if ($A != 1234) goto L4 if ($A & $X) goto L5 if !($A & 7) goto L6 if ($A <= $X) goto L7 当æ�¡ä»¶ä¸ºçœŸæ—¶è·³è½¬åˆ°...,æ�¡ä»¶ä¸ºå�‡æ—¶è·³è½¬åˆ°...: if ($A > $X) goto L3, else goto L4 if ($A >= 4567) goto L5, else goto L6 *å�ªæœ‰* 在å�šæ�¡ä»¶åˆ¤æ–­æ—¶ï¼Œä½ æ‰�能将数字替æ�¢ä¸ºç³»ç»Ÿè°ƒç”¨å�·æˆ–æž¶æž„å��。在以上的例å­�中, `0x3b` 被 `execve` 替æ�¢ã€‚所有系统调用å��将会以你设置的架构解æž�为系统调用å�·ã€‚ 如果你希望解æž�外部架构(ä¸�等于你设置的架构)的系统调用å��, 请在å‰�é�¢é™„加架构å��和一个点。例如,你设置的架构是 x86_64,并且你正在写 _aarch64_ 架构的规则,请这样写: if ($A == aarch64.read) goto 5 注æ„�当你手动使用 `-a aarch64` 将架构设置为 _aarch64_ 时, ä½ å�¯ä»¥åœ¨ä¼ªä»£ç �中忽略 `aarch64.` 。 === 返回ç � 返回寄存器 `A` 的值: return $A 或者返回一个立å�³æ•°ï¼Œå¤šä½™çš„字段放在 `()` 里。 `TRACE` ã€� `TRAP` å’Œ `ERRNO` 接å�—一个é¢�外的字段,如果没有 `()` ,它们将被视为 `行为(0)` 。 return 0x13371337 return KILL return KILL_PROCESS return TRAP(123) return ERRNO(0) return TRACE return TRACE(3) return LOG return NOTIFY === 简短的例å­� 下é�¢çš„ _TEXT_ 对与 asm æ�¥è¯´æ˜¯æ­£ç¡®çš„,这段 _TEXT_ 阻止了 amd64 çš„ `execve` å’Œ `execveat` 系统调用: $A = $syscall_nr if ($A == execve) goto forbid if ($A == execveat) goto forbid return ALLOW forbid: return KILL == é™�制 为了更好的性能,Ceccomp asm 对 _TEXT_ 有一些é™�制。 1. 由于 _TEXT_ 是个文本文件,`'\0'` ä¸�能出现在 _TEXT_ 中。 2. 一行必须短于 384 *字节*。 3. 一个 _TEXT_ 文件必须短于 16384 行。 4. 一个 _TEXT_ 文件必须å°�于 4 MiB。 并且对于 asm å’Œ disasm æ�¥è¯´ï¼Œæœ‰æ•ˆçš„伪代ç �(能被编ç �或解ç �为 BPF 的)必须少于等于 4096 æ�¡ï¼Œè¿™æ˜¯å†…核规定的。 一个关于 ceccomp asm 有趣的知识:任何在 _TEXT_ 文件中基本的 ANSI 颜色,例如 `\x1b[31m`,会在处ç�†æ—¶è¢«ä¸¢å¼ƒã€‚ == ceccomp 示例 ifdef::backend-manpage[] 手册ä¸�能显示图片,因此如果想看示例请å�‚阅html版本。 endif::[] ifndef::backend-manpage[] === asm 示例 image::asm.webp[] === disasm 示例 image::disasm.webp[] === emu 示例 image::emu.webp[] === trace 示例 è¿�行程åº�: image::trace.webp[] 如果设置了 `-o FILE` : image::output_trick.webp[] PID 模å¼�: image::trace_pid.webp[] 跟踪 PID 模å¼�: image::trace_seize.webp[] zsh下PID模å¼�å�¯ä»¥ä½¿ç”¨è¡¥å…¨ï¼š image::trace_completion.webp[] === probe 示例 image::probe.webp[] === capture 示例 全局æ�•获: image::capture.webp[] æ�•获进程中的过滤器: image::capture_pid.webp[] endif::[] == 仓库 在 https://github.com/ceccomp/ceccomp å�¯ä»¥æ‰¾åˆ°æº�代ç �。 欢迎æ��交 Pull Requests å’Œ Issues ï¼� Copyright (C) 2025-现在,基于 GPLv3 或更新版本分å�‘。 ceccomp-4.3.1/docs/images/000077500000000000000000000000001526046660400153365ustar00rootroot00000000000000ceccomp-4.3.1/docs/images/asm.webp000066400000000000000000002743521526046660400170120ustar00rootroot00000000000000RIFFâxWEBPVP8 Öx�]�*IÊ>m4•G¤#"!%të(€ ‰inügùâȤt@¯Ï­Ý’ûÏ뾓U¯óÖü»yŸ×þPÜãä?Ôç?`×_×�mßé¿g}ÀLÿ›êù÷ú/ÜïhÜq?׿Â{fþ�ÿãÚ‡üŸ°ëÏÿopoÚßþþÌßñxþ ?³Çýêø ý¡ÿÿÿ?Üÿÿ¶'ðÿý\þü³ú_öOÖ?ëß±[~+úöìßá?Ãÿqý”öÇñO—~Áý¯üWøÿîü¿Ï}a|“ûç÷oÅŸQ^gûÏù?ïä?îÿpÿÿò_ñ­pþ¿þ'ý¯÷/ÞˆÅÿcýËþÅé/埴‡ý•ÿeýk÷{ìò?å¿Þ¶�ÿqýÛ÷ãÜßû¿ó¿Þ»àõ�õò¿Ä~ô|ú­óOóßÞ¿ÉÞÿ+îë?ç¿´ÿ•ÿµþ?ÿÿýo¡?/þ¹þsûøü_á?ÿÿæýþ5ü×üßöOñßùÉÿÿÙöÿøÏÙï(O·¨ÿ½þ3ó#ìùgößùÿá¿Û~Ç}$ÿ9ÿgüÇúÏÙßnŸ—ÿ›ÿ»þkýì÷ÿÿÿÿ¡Ë¿°Åÿ þŸÿ¿ùÿÿÿÿÈç<}©@á8Cʲi·ls ™Åm©—†. ŠŠaÁ{¡S¼¼·‘!û!î¿ka‘+vºõEÖ·FH”¯T£p_]„¦êîD½…¯�¿¸xQô­›¯ùÇyCãÌÕ$�� �HÁsIôÚ€½ òÄuÕ’º Üinpà30¤˜–ýÔÕÂg�óõ¯ÍZø�Päô¦jÞf=|r ë¼}ˆ~X¥ddKÖ¸ïW?EþÈwq4#Ý‹_|ð‚;ºO)DûÁÞê ¨>H!ˆ��s‹ý2„"ëZúÏúÔÑ\ç�­·}H’–=é¼>‘|s{°z¹‹„šÈ \$и®>âV8¤1íãVi&¾q15 ûÔäi8Ò˜›1ö#ÒÛÂC÷|Á%Åa”!�ëº „îm�]¿µ”§À�ÁÅT4™°þöV�# Ä—rìðnïÎ߯ÞÚrRÝè}XáËËòqÎk}Ô Óz­¤T£¾ÝÛÔJxñ¡·XÔé– Ú_ÚîkÍ·üѵ³g!³ÊaÚüD“Sÿe®ð�š¶Ðâ¼ôüáFÃÑì·ÛBܺÂ5˜©Çƒ.è—� ÿÊ‘®ãU9–Ybu2ÙD‰ùuX]þë(°—c[íi´3B⹋„šÇà.É4•±"25ª1<}ØïBÄZÑÁÓ‘hSÍgi¤T‘r×É%éµçojæf+ W}md6]Uq]u#8½Žç)>ÄUÃoüJ’ÄSdrñÚp:)ðì3²%H9èD¾q†Ú’ •1·ôŠÿ\„š4¸–qÄÀú\:kV[‡Ë~Ÿç’šÁÞ0½ 0X¹m^f– ?r¸'�m›† ôAKú ÞàIWWC ±‚…?ü–„ÅpúJ°Q½–³V 3\MûeüØ “acØ^:L?Óþ³ÏÎ�5hûï‹e’)~}A5X�tZ …y6`ØÅJ0ôã§Ä3B⹋„šYü¤:}È{)ˆ®Wj+�™H˜”l6ÛeÝ6¨¡9ÀÍš:#ÛͰ(œìåë[O‹‹ÿwÞ­¶T—”D£C×/p¼+â²[ù+¡_JE‚o/ôã£x̲å£72]“ÿIQ+¶*Oˆ%$qýÔÙutc@5ÖyçįJ„Œº|?Fó³Žì»9� $núÄ5ж¸# �·§,pœ9mr ñzRã´ëÝXç 2ýì° »Ÿ÷ΉÜ>ݪC ñ.‹žd=)J}œµ¸a\½µ°:vî–SØ4ŠÁÍ÷ND¡òÐ <šú«gë.³^é“y†gÄ3B⹈!+¹ƒ±ÿ’�ˆà¿ È?éÔ¼^Lg*&n°®´’ðªt&޵ç ö';ØM@³ƒÿq KÇ ÀSp’aTÞ,cÑÞȃ— ¸((µØ…ú:³6 ¬Ìª®¬Ÿ;n®ìÀÕ{”˜;ù£ÈÓ¦·ýúk„¤Ž.' ñv:»Élñ��ßÚ]§äeqgqÔ?YñÍÕ(æ6?p·‡:S„d°±"¾ß—V#ÇÀÞ|~b 2ù‘¯PÒsÐ *¦à…. tËÝA¾u�à�5HTÌÆž§yé†gÄ3B⹋\�ä‚•>ƒÛò†�„8é Ê…P§Z,¦õÕÆ&ú�‡× K_^›–ão(u*³M±ÎJÆÎájZU÷ÿÇÅ}m×v‘¶^ƒQ}L£â[!ž !_ä8[�_êÙBÉŠ ˆ^ÌT¼e#z¸£Ðn¬lIÊ‚ AG|Œ‡±IÄý*Wgœ1þ ÷2øpô)Ü1uÂüccŸýî“×]üŸŒév­Nõéï®óP§53¦{Lvö4pÕЛò˜?ú1.ܳZ‡BÊ»EÕU“æ†Ù@heêh\W 1p“Bâ¸ùŽq^úå£ÁݵØ#c+LÊ‚bøi?A#Æ%œB°ðo.šì0³ÒXƒÉûìÝñ ¿±‡{d„Iª*¡$&ß ”2ôL�Žš&’(ž)Pv®Ó¤A¯�ÕS00WêTÁ0‰æ—¼ÐŠó.‹«2ðû êÈÔv.XŸó@K‹œÃ¾0DîöF> zÀr5Óç^Ë‹_RZ"·GfüÔ¶Ï“q@ ’%ž‘�B=ñžŽåfŠÕ >!šÈ \$и®@bá Ò9|QI¢„O«¾ú3ÑO*ÃʯÚÆ§–©ïò·¶‚ƒY+yíAºËK·óò9S�ÚÆ‘pvµj�·Ýª4Ç®š÷ /æë�yqË1!–ëê˜÷ü”#ñú–%TÜ[ƒ„(†!8�Œ4–ƒ}‘3RÓe H¤K9$“3�héûz‡[¬ü ¤¹¥¤sV î`€Ñ–Y<Ø­¸é¥z\H-änŸÍ Šä.h\W (ÕÞºÅj_&[ÿ‰¯lÝéüÿGäc†íx�´¼Ñ x“Ø÷üŸOyR©vÃB6SÄv~õV¸ƒÙ[e‚LP'IÁB7p¢¾aâð{•Ë9$k h·s€õ)Ü^uËþè@`æ�ïúDy!ºÞ1LÍ)Ôð+Rÿ¡ø‡é‰ 2Ö¯ûnR0qÀÝ“ TœqS#}YÑ:Qú¹‹„šÈ \$и®@bJÇ1÷ 9n^(yZÒmB%6Q=ÕCÞüõKÚjæ'&X=H¿D~[�Ñ#ç."„¬Q«©f¥È|Í­‘�'"íü¯Louv¥óïŠ}’õ3¿bû™ß4e.ŒßtOÉôÆ2ŒTy=æ�Š­’ÛµÏcç0æµU(:W3½ªÖ¯Ž bñ¿è3jßÍ�[”õÏÜùÂ�•ýóéB “ˆ*PdBwž2 J�®bz¹‹„šÈ \$и®@b×S×A�¸Ö�‰­>ê< ç{ŸÆfêþâ‘ÿëyª‡~kçWŠÞ¨ÚË´D‡:ùjÛ¶á—LVô¾æzð#RPÔŸzÞN¢Û„F·p”u(nSÒ:.ÌC¼Yé\Qùo\ˆ¶úÏ‘j¡#ëtî]lðd«àêÈÆ½ýc•mk9xR*z|Ѷê!ß–x–ëû>!šÈ \$и®@bá&…ÃÓÚd<ùœécO¾½?¹½˜¬¥ª*¡?‚›¶m´"Éeó‡†0ŒªYZÝ1¾`×'|#§�w®~™¡Ǽ¢$mt,ØQºÌË?¹‚"�äœ¶× ax¹Ö]S\p´5ˆ¶ÐRê>ä$jÿ1øÐ®»›Vû&Q©o mˆ|A_Ë¡f6‰ÌÙÚ¶)ƒ¯$_…ômgÙTj)4.+�¸I¡q\€ÅÂM Šãï®fxÒÁ3fpL#KëeÿÃ'UÂÌ´‘võ`ü^áuK©½›e (:ÛøÖ|ºð`Ï+mÏ£÷ ÿA¿"2 3z}­ÓCeb“li£b“¯õ ’qœ˜×³‰K§ƒÕ¤·ÜŠû"mðósBG<jZUe—ÛA\Ö}4ò ”3ɹ}=Zán¾b-(Ghjðw3ÞŽ*µQÝg�‚TÙoL›ÈÜ3>!šÈ \$и®«_Ïxa‹wÿÀ/®L?v*NË)µb|ÿ =ú9‚êú%ÙÌ­zdÄ�Ë¡¥\Z`œn)?d©×{ãç I%ØjšÈÙï«)ÃLޏÿ-Ççh‹ÖÆéZÕ_Epq!7+OJ­Ì¡�_–ú…rºÊ¶Æ�í ôhVT^Žï€�:,Á 6æ2P“êõ‚ *„tÌVÎ=ÖöÕ¸Ÿn¯ò×�l@³�4¨hNÅù ÓˆP8-� ”`EÀXjB⹋„šÈ \$и®@b×ÿ°îeÒk¶c&’ù\úmcÅÖÖfÍ¡«û3À‚45¡9Ñ,ۻػØáàê¾b©ß¾ÞÝ~>SU¹à¼Ùta¡vÓwe0ÉÝïÈn´'IÃKÄ=ÆÜ©r·«Uæúf·LH¼±¦{nÀ"\!p�ðUx!nÇ!X‹Ço§ü`‹Euï_aðuËwóFÒPòí8·‘¸f|C4.+�¸I¡q\€ÅÁo•¾ë>�ÚÅk ],�çqIQÞ¸X,€¨Ðé…:>쥢��UYfíó3²_¸/LŽqfaŠ×'8µ•þ+ÜwÑ2.ÏþržÔx�ÎÛã"á³æ=ÖµþÝæ¸ÀY¦°A·›r'(ãx‰�Ö‘×…šVƒ;ŒMlMó[uÿ+'‰Y;k]–¥¡{2üa1^bá&…År 4.+�¸I¡qUƒ4í/‘Ƕìi�ÈžEMå�öö5NÅÐê¯ïÃò:gÇÙJcê¶iµ(í[Ž®ïiž™jïÐMÇ"STD#óUq�Ô#YŠ8dÁW%˜Kr=ö9 Veƒžv‹ß[Ëúx¦ßˆ¶œkÐ]”oó-BÉKL(e™²òf’œ„^™ò4°šôS1ÊgN2£$¦ë½›7úÌÛ9ÿˆ{S¸Ô’äÆ}Ó&ò7 ψf…År 4.+�¸H3üŸÜ¸ÿ´³ÿÓ·öìÑCÝbK› ½øc í’ºo©]Hûú‚™¬äÉ×�ʉÆfÃÙ4^šs�F(Ϭ¼Y�xD¥u©·H¤ ûlØÂõ�\s§Z£?–DÖq­õG‚g†%�"Û+[û2 ½Ä]4˜l•¤)KǾp£ÄQSØÛí�£�…ÍPë7ßN>Ïó°´¸N`Ö).!šÈ \$и®@bá&‚Ÿ5fN¤î½Ô`[œ# ]F ´«A ‰ôÁâR¬¤ü®Êkñ¿#1¶ùÍäžUr�fwê³Wè’ÛAC2 =^«s\c`Y_Z÷Å]iÁçÖ” œÒHŸÈÀ®N = ªð1áTÙÌ_·k±n/õo!Êã.5_Îp5Þx,È ²š­T�8³ÂJ.Sߎ#}¡ÛPfTþà”8Ò5—lut­jSÃû›zš¹{ÿS éê~„—Üòò‘çÔÏ}»ÌrÙ”ö–“·G©—ÿ¶D‚×Ïöå 8\ÊMXꪻôm¹cê¨9‹¬wÆkj©¬Þ“§ÿjñØ„�+ÄôÚ kI�f)Ä®[u:µÖ Ý5¯k¶˜Uì7‚}²—¯ÑKªIé0³nmôxÄ@<”iOLhR¿]ð6ztXÉ¡ÕÖ%‹}’5‰f¶ìªÇSÀCu=ëþßjç‘M¬­hÿa¾pÏ P¢W¿>Å=Cª}í¸¨0Á ±jÇ"Þ1ˆÍD£”�t.t (s2Ë`Z¼�¸úw¦$³ìþ„�†ÏƒJÀE³iД�Â3Ð…£,XÕRv{—!áét¬õß~dI›zºèqCž5~´…*”JÅa1‹tU¯ÃI’‹/¾Ä—ëXvÉÈ&þ¯É„ó€cAmͽøÇý~ØÛÜ8b®�Üå5½$Rõ¶²ýÃðÍh½–ï�›rLc@’‰'Á„1•˜kìÐ�µ•ë® %T R;I¶åZ¸ïÖúkÛ÷ûb[g{¢¥¾ÏÚÌÊé!® Ó—¤=í}þš²œ¯~Md<¤w—ƒÍ3…ÞŽK«ü¢‹Ìh íÕ¾¸èmþ_upcú6¼ÂW÷'ÅýòBj`‡¥³ ÷½ˆæ:ÒÎŽÎå�Šô6Z³¦íœ;É™©x8—ŒÉ¨ª½þ6Ñ-½¯Û±Ò×¥¼Œ¦.• ÉówªúúÉÜ…+]qïvµzTIx3Q)·{�|: s:Öæ9/4)¦\"ø&÷e¶æä„ƒ×¹P\üpñ[üƒ“ˆîzQ ndßÒ;�±4áÜÃ;øÃ¿[¦§‰??Ù·$RM~ƒŸ—Œ¨ÑçºêáÜúqþ«A>®@€ÉÚ�£ð•3¥x£á„mt$µü~!9³ŒÇç:âv%M„=Ó'T4séá×bC¾¬âúÆ™|Ö¶Dr±ƒœv€)ìºë¢xì[Ö°ŒÚA#³Г\g¾á=ßì|[Ñ»ï2r†3yl´mTGúeõï€%û®öd�gœH•“í)�[{qã^%V$âëŒ<ì~Qiøb”תÆÑË!J†6îƒx–L6 vûþkÃÔÂZ­uÑ<‡*{Õ.úqÆïjGh®œ„º¬o(‚ßФ$ìfË �ÚݩΫˆN¦€Žü¥Â3›-òñþ 3~Þ6 ß©­ß ?Ð'ß‚]0ž·Mxí©g¦ÅS™æ¾·ù‚4@IÒ+¶º®ü~�w ®FSAZÛ€]Õ²†9”.|�¬/”FVÑFëYÝÝܳõjøºFÃÇé:—þ7û¼M» ëˆíŒ›}— 8vÿXŸS<{ONHº“FJÜŸ48ŸÿQµÜøÞ2ÃEÌ�ü_÷[b¶êùÞ‰2ù饾Ï~S^¬í^TWS òq’${¦[OÉõbšñ6­xù˜\Êô”`ìç Ÿ×øƒýß+{dp5ÜDÆ_!þ-¯2鸭ºDgûBrÑaÀ`°ÈÿH¾!ZÒZ³¡ç:„^¤6â51@WÉÙÌÕnë}v.GV 릦ÇI9ýªw©�»�…ÀíxŸ@\…ÆÌC¨™-\pô{=þ§çZpõf[5 É<<[טCÀð�ZûI8-g~ƒÈ!_à7&Ò -Ö€¿³®ê×EÍq¿÷rÇYá[/:¯Ç‰Êù`K iô\/Ñë ý‡å º\Üj»ÕðúÚ™U‘Ø8¾QåÏÄJÑsÝf²Ôð;ÑyÍä3Ó©Ó¼9£€çÏÏnQ„ô "ÐìKZº“ÝLÜÄè›;1Œn? ë7øIܸ°þÌ2$T‰ýÞí1í« ˆž¤Yõ}$á™VÃý…¨�.Û�4†öo0-X^„\sV£hÞ…ß7nV\�ûôôÙ°¸·�€÷$Ü*)´Ï‡ïùåߢ€Qƒ¹ñ!ë›üÎßpæ±ã3ÒµBÚ�çä˜L ¡Éÿj±4©ÔÄ›ú2 P¨Và¤bi†’*Éð>óŸv*!6Ì!·?°µ€r#=qµtÃ^×èO ÛŠæŒú• ‰ 0rÏt•Ààâg�u!þî‰}oD^p– ›NDQ$VÊ^D?D7œ@ò&z,ãt�ŽŒU݇<““i—£m4‹·®ÑÀsÅhì*ñð"v\0l§m%ÏÚt:ÙRÐnò¢Ê„)¤è9vƆŒÝC‡¥S<{�Ûµ:=Æ´g—>}ŸŽMW:+«;æ<% Fžø]‚ &ìHÈG:#�KS§7é€8íôï›)è{£ñÄùõ2o(ÆêNg˧ðºè \:×—Ä3BÏê�`Š?yô,‡ùš7CðÚ@ù+”}p Ó‡¢î§rµBt�7vˆ?&Tàò³Ón1žn1‹­ŽÙï xÕúßUÇ/Ì÷jkYgÐ͵1îÿN¤Ó† ‹|D42Z+”Zׄ{T!"Õ ‚Ö7ÿ·ë,#I�€yÕÄ+¦îFW œe1K|þÕ‚[.�Í Šä.h\W 1p“BЪŸwÑûEn@SÆæòžâpu%D&ººpÓknÆîÐÀ³Ç•ÿO2ÐÀ`Ávœ¿{„ýõ2î™÷ÂMGœpz¯ãˆ-€Æ["V�†|‹HE†NˆŽÉ[‡~$�ü+,£{g�Ò¦iCÁÀXz¡ø&ÑOÞ�”shíFi“v%ú'÷Û¼›¬±eȪšw;ûã»ëó¸£Î•ma³î—8NÖkY´Ë´´ªoMÛ“+Íïë¾]F#üáÄê—ˆöëj¤,{†z¾ßÒJ”¥ «“æâsŒfò7 ψf…År 4.+ˆ†à#ª¡ê¨áÚ ûð.û÷H¦wÁQ‡üÉ0Ö, �EE†"âÂ$&R)�D›�‡�ËNÆÒ¼¶ eŠÕ¤ÏçÞ:ôh¦™’4˜+ÉÃ9;áúàZ d®¦7Êó“Å»½\xPqÝ- «!ê[’yíGd>šÄzü iplžh³81Rh\W 1p“B⹋„šÈ ZèË€§^_ô#ب¨þ/Íî÷ùï=tqöâV†Ããü @–3Èk˜ªíXwMg³´¸ÙEÇiHŠŸ; 42@Eûåßl�Ô¾Ñ/ªôY>kõof:ÎR×isG·Š†q–^ÉAä Í�Í Šä.h\W 1p“B⹋„šÄ¢UòìºâoÃÕ±~D~®Í� Ý0}~œôA–özÓÐt8À5�ß(ÙfI ¦p†;º-¬ámš�Ex�á`_û¦É°Ð´† Éâ§Sk×±þ†él�±vk9•e‡VXˆTîh%XÀYówÝÜýŸ3,ÕK“4.+�¸I¡q\€ÅÂM Šä.h\Wˆ*Ÿ¹²#É:޹íf`¤1Š¢´÷a£wR­]º[V'ûTÇÇA£N­Ûb»£Z#÷Â4ÏAW.¥»±* K–îx¶ç£ù7Œóz½ò|ï¥7±ÞxÏJ±@€¶«*ñßÙ*¶K? Öÿ÷‰HGE‹ÃÉXßð†8- u§}ß@Lsš†iqV>åØÝänŸÍ Šä.h\W 1p“B⹈LuQêšç›d‡ŸÂÏzNŽÄoï¤�`Eý ƤÅVÇ^›šn¸I¹2* ÿŸ¢›0úsb^éÞrÆÂê¿KoÐ='l:1²×tÇ&Vãr‘–¦t&–jŽñÃ3â¡q\€ÅÂM Šä.h\W 1o #{ÏH,È r‹û�øÕ5ÿ²÷?5re��w£D'»c𬲷‰-›¡V5©<ªý`V @d$1ƒF žŽ—I$:$ä$Å7ƒï~ÝHG&zн-ŒÜÑ� µÂ†ØîÌDЃ€JìÜ9@Ï}?¢~îŽÃ6 ~4 O´%êrf…År 4.+�¸I¡q\€ÅÂM ŠãïГ³gª´¬ –¡²¦ÒNe]ÁD*  ³¾ðia^ H %(ŠÖRºø±¶‰Òú š2S:iÍ  wzÈ)¢JÕ¡'žé~ îCó[ÉI ÆÅØô(’ æ…|”íÄ·´æKì'׳ß�ð�KÈð 1ÎŒ¨Îé¦>‹Èî›ç<+mšb`^ÕéM¯t£´w$ÞFá™ñ и®@bá&…År 4.+�U)Æß±UìézçÈ$ùL„,7eþËP�ÏÁSn{¯À³±z ´™Ò6ñ‹÷¸m>ùiSÆÃ²)ŒìW+½•yˆI¯œ3¨«7gzi‘ia©›u5òõZŒ5!l˜Ýœp;„d$ÁFßâ.°”'UH$Às.î»ðœÏˆf…År 4.+�¸I¡q\€ÅÂM+,92¿`Â)müBÔ†:<ÿïûÇüô¦8¹¢ë®}^š<½B»av7º¿ºÛêd?ܨЬÙ'¶À«óCA£�GѹZrY÷¢nº� c‰�?vk6fü8Ÿ›"\?â^åže%Ðå`q\€ÅÂM Šä.h\W 1p“B⹋‚Ü>¬:á1}Ôº—z•£u’VAÑ "b ¦â L:ËHŠÏv̱¤žœ$õ…úÏãþv,}ŽÄëÜ`hñ¦Å 5mÐj§�CgçoVrÅãÓ½´K>´–– ’ížSàô�Ã3â¡q\€ÅÂM Šä.h\W 1 Â#)‰&ðÙMEl{ä\(ŒåtdÐåÂ’*G¯ê¹×ñ=’ Ó*hIÊêI�dìS¦Ùmô¹mâ#‘ó›äñÒ_òŸ‚YG껳]+h±EîˆÒ ÝJ ;²ò‡€/‡êZßÁòŒØEŒ§ Oˆf…År 4.+�¸I¡q\€ÅÂMX�y¤c]XÅaÃür:jà”oä­ôp3qóý,= �’½ápÖ� ‡™€ãÉ?_}̇ËŠ_QÅlɱÌN Y2tïñi‘½—¼ïjgë|ŠqPøj@g¼Žùcµ<�ÿ½1›ÈÜ3>!šÈ \$и®@bá&…År¦[Q êý0A竌¿9}D™Ø>º‰ÀÓú»Â™s~N³jà{3h‚JE¤¢u³,»£ärƒq°ôV<…=ÿEñeÖÔ{¼…ö#3”2Œä o�åj2.›è{$†W[¹<”œ·…ÐsÚÅÃÀˆŸê‰¦´vì#€Œ4s  øQdœW 1p“B⹋„šÈ \$и®@b×^J)æ(ÂPg{Væ%¬ÖÓìpG›[5y"¼fa‹‹Æ}έ�ÜÉ "Aº¥Øîð¶-V?Ê•ƒC97°œg|ÓëDðj+æ Õ#ʶ³£Ï`zbÉ4±*²;ß¡pŠ¡v´Gw–0”G϶À6Ë= …’Þ LOg/Ÿ…Ëp¿“Îù1Ûk¹)Ó* œÏˆf…År 4.+�¸I¡q\€ÅÂAóvfÕÔž›HqÐ#S'�Õm½ *¡RnŠ]¼ø�PÔÆ•þ7ú½àX˜r:)â^–[õö}Ôg>÷)˜^Õ*œ§g2žNâR‰lNçXV&qûPP§†>g˜5j·|°NgÄ3B⹋„šÈ \$и®@bá"§ôoÌ}bš3½æÃr±k"KT§AÔ•!3N&!Ë—L×·>´MœX·©`­gù U_3°ù ŠâɰU%d¯µžKV¨ˆE\©¿…~ȬÇ;¹mø¤“N&bkX+ÜUÓ&ò7 ψf…År 4.+�¸I¡qW—Sqr³¥gŽ®âJ@Sy:+MŠÙCÆ‹ !Rá´³¶QØ 8Mc`(†º\ŠP¥‹n G—ï{.³¯w»’͈€˜ HÓÃNt„ƒ­gþÝ‚b\ßÈ“™€¢í~!v}{ Õ’ ›T!£zV¥Ú*bb- *Naauß?Í�Žþ^ëÉäÙ’5NZµ–2.�rÁQÕŽbÌjxÞ7JdÞFá™ñ и®@bá&…Å]?†>ªˆ}Ñv q‡¥ì‘l?ÿÚ|^xRùßÙíØ.‰“ˆwjÖá$l@�Jc‘äu×]u×{•r 4.+�¸I¡q\€ÅÂM ‡V[½-½ë&áö7ø'ì÷‘Yá7Û©A£+½ÌS:/.±Ä"á&…År©¼�Ã3â¡q\€ÅÂM Šä.h\W 1p�ýl±õ>›úg†÷d\ç]RV¬·>V ›¨£é5íš’·ì?¿â­hEBþß#dÿBc³¿˜þŸ#ïã{èò¥w™8Ô`Ô ß²?×MÏ| /µìR�`ž)¹yJe@õ %|Š2AiÇb°å»U,o‡N•F6P~*‹SkL à®bm=zÞ¯eêúÁg›M²À‰¨‹úAG×§¥Å¨p‹DÁTµÅù�)‚üÖfNk×´ "ÏÎý![3#®kù•H¡Ç7Ûå‘p£T9¯‘¸üÐIåøððÐé½E�Äõóx¬Ç>ðXV×Ì_ï œúÆL­Aú5úBÓ ]}Љ’©HuûH96åqt¹Ãuë燜þ÷Ý{ê ÔÆ ªw�(Ç[0P_¦WYÞLÈì£Íl­r`å“N2œëµ óõÅç†a¤T�þ|Ø/®¶QÄšàøl^V£�´ ÐËT�3މÇÎú¸=a×úð¯£|®ãpVe6˜,Ä{ƒ×híy„sFßÉ'ÎI>@BLäÔEãÅQ¬Nš©ï@ï,Í€ÊÑ««E ?A?ܵ¦¾<ø­ÇÇÍ™“Árlý_=”‰´L2UÁE§4t4#¤8,êùEÕiß67ž!"óÌq’ºùÙ/œ„®¡Îà.ÂRU�û¹�zHPáyvΔNûsAóÀ8#'R¬M¨4Û‚f zrëì!6Q­ëòÚ®\�Ðß쬺B�|öi0*¡¸LLÌœÚ{ÄÖ3p“Eûç,«é pÔÃN®NO¨-;�Ppöú©Bì·ÙtðÓ­1 €·9Ï0Ò)½µÌå«Ö##扊X}¿�e\- NÝ›'œ]&ØA”¶°Õ· rfX‰ æ¢ ||Ú,fÿ®”_–áîrH†^i+•ˆ3Z`Äm¾(€´z;�µ­WÒ†‹uȪ=Ï©Å[÷Ã"ãQÎ>…¿ËL§PK .Œ¦î´Ûº´VL§$†¹Ž ß"Ú«Ú9þP \œŒBuÌÕ;sA¦Í á ££Z‰Tqûpb¹oY¹oŒÕ ž›ÉæÓÉ#•4Mù¨ý JBÌÏz#éLºãyÀF [fWxı9h�H› 0K}A./vMðÜ0èzG!…r�eÖÁ^ÞQ–Àšà‘8¬¦�ƒ*Ôàkö ŒNÄ´QvžIå‘uÂÀÞØâØ€à$íËp¢©ûô¹$�g¹^ò¢Cÿg #ú<ßÈÓ-.*–ÓÊ]þé«B¬D· r4�~(²ü#»5§\™pµ]À®·hwTeÒ<:8¬zžMÝ$zo>•p?¿ñ›Ó•[m½�\D—=béŠ9ôÓniR,dsÓ¾l?�M™´$õ¶ÉaÙ··cŒN—öLû>Ñkš<@Ñh‘,Œ‹~€QMÂ0Ã(k§äáñ97ѦW·~c.ÇHú�¼í©¯Ê/3¾Ó·Ì|é�Ö]Ùš?ÁÍ›æ…'{ˆýÕøXaŠ*�$ˆX³•{:¤„c\wkËî¥dKÜ5ó ! öF›œO”1� ì|\{ˆ�çl”Í>!ý•ÿÉÜ\ëš§nh­‡3"…Ï…¡*Aʤś}p—“¿ÛE/DÔºíg8í —$,¬Lo’Ä)Ù$TLúÏDU=;¤ÇéAô×ägc)EêñR O!ÈK„†otÃe3ïúHÛìV>áT6’Ímÿ ºÐÓýÁè[WO9£tó/½�'”2“9‹ùiÇ¡›Kyøz!rvV¼ýù#!†›ÙX â�±ŒK¡†m9I"Cl­sG:_p 5åß½‘ŒönÑ‘ú1±—¦)^¬=KéÞb "=¤ ;J¡æÚÉ*fVê„�@OT½Å<¤Xjafð#`Z81“?oˆ>%$öA(¸ÉëÓ—ÐuÙin|�ý¾î`{åªÿ·r?v‡2n陎¬.\º_׎l”ê3>®¥éOÄ»iÍKŸò�¯ñOÙ²E\¾]v‘Ì|D¶Ÿfñ0ÙŽ÷yÏÏ¿K§z¹ñÐOœcCÈ"€F <º™x‚*ðÒ*(ݬšÔŒ×Þ«LŸ–(�Uxk½9Ì}þ8x@„1'Êì‡ó–›<ϦôÙg�/ÍSc Æ QF-û<¢fàƒœqX(‹¢˜¾Ê7Ö÷®V\s¹ªEƹìXQ8lËt“³Iq$ê9À¤S}Kc Bÿ"ÀI™uFÜ`·ZƒC;S8ï]OÁÖn¢³Å¥,¡áwt˜^bó�ÁàL*�H (Ÿèî ´3,má–‹ij-ܶ&y…üèê5›T˜b씺#d-mN`³Ë@UL0PiC|nV2” nPÍïZoed „1 ,¾�·a¬1 ª~£+>ˆGQI3Døùܵ·¶: H#¥â+iÏ}­$Z6|ðF°B¨¾°5J§—eûP1Ø%ŽçNOQ|€Ì�âIq�ç,å†Î¼ÂÓz¶ž¦hÌ<:ÿ“&"|Õ¡“æëTS©Ëû‹1[èkGðFX¡}»âxÝ\9RjÀ¦cZ>õ�o™;Ü š2¸ŽuÉín~ :ÒFEƒ"ô�7ÂC›ë‹ó8]çøóV,ü\]ÃZ.(öˆ'/³:f¨W\ª½òâUòˆØõåÝo÷ºšÍœhï•kÝk3‹N ?Xè*ÖN† Ǽî�Òê2ÛHRG�.ÁÉC; ÔSr�íÛ5òYPßv$?Ê«\'›õ†ž ØÒwü÷¼•+Ç)¹TÇ&[nÜkmÎe¥<\«7Žç5 ëÜ ;©mQÝý­5ìD ÌVHíH cc±# ”K1geCÓë†Þú‘œ O „šHŸ/¼¥À� LµÕJ®J208.UßàÞe¬âxôRHÙ#z úÄ©ž^ ‰æœG¾&&—þšË<“6Bº‘õ4<¸fÓ³™^Ûôt£‘T�„ùã�Œ|ßðú s2-¤” ã ž+ø.µh.¤‚øÇîåIΞqîTN˜ï^ì�ëëžhr×ÿp÷ùí¹]¢½0Ôó~¯«§Â«Z‘õ]Í�üÈè.”ø~X/%<ñð�¦÷´8ôA¡ó\ÕsCà9/™ú¾íM)ÓÊÖ¨3™ÕÙ$4BôTµ9¢Z Mrj K÷sYLçjY½nðºw¦%Ú¹·Q±u¼àâ>dJ,#ÒrŒf"oC¼t'�¸§Ã5úÓÏ‚_¯ä·ˆþ%™íX²³¤ôâ4GjhR=l Š1ê‹~‹ÑXž¸ûz2.^ºEzÒ ›õeÜÛ~B»{>°�AÑSÕ3IÐî«£žÝv"˜ÃzbÏþ ª*–¿[àPlXûóJGQ"2¢W._œÿ§«Jvx­üE<¬C�À?P›D–èøÏm·6Ûª:ïtSÛJÛR¤¡òRÍë§ë^ü“î;¬.Îÿ+Ê«†Í´„šE²zÙ…´,&´* ­í‘«Õ{RŒ£<ŽÙj!+(;¾"äªãŒ]…,Ù|3aPnú¯XrËµÄøÍi˜Ä$Ëz2ܶÙzHš—4¥(­k˜®öª]d�sÄ£ÌÍiLJ¤³8¯7Âþê±€e·Jæ™â¹ôÁZrºÔ;øÇ ™y_mÈS®Ì=ñ\V±ž1B¤ÙKNÊñ4=III@³1M«A~)¾PÇ4 zÂÖøðRs(–Ç0*ÀÔ3¯Dͺuõ}BLµ©—Ú0¢ó}Kjõj—Ù'›Q`éú׿$û…ëZ4úMÒB7‰= ¾Â|7¬¨¹ÇºéM¨‡ašÍH€‰K´Ÿ€}ÛvdÕǦ:�”ÞeÛÅÁ»Äé/—O—tz¡mÚå“óCB“¹� œwµ›w†!«q¾VXWañÇßõãM6˜N‚Û©ãEÙ±ë ©4�LS~4gë`ød•ë•I¿*ðS¶x·ÒûöX¬A)|im'wcx½fu˜Ágc—Ëfˆ¿!6¤cXiž×ÌÁvüeGóZÌ=+`ûâaQvé™c-Yüx¨àjë$Y“Ýâ1YÅÕ[}Âĉñk¤eÆ{ÄÐh´6ñÆk-*8 ÖCMªfÌÖí‘Ý“3^Í(œ£âD÷PŠaÊW :3 ¸“!a—7“AÑéÊÎû)^ �sÍ}H\ÖqLìð!Rh#^Œ�ÉXDº”ÍyT†Ÿì(¤@„LÙk¨õWb^5. X=.um�díÓÓÄê0Èaõ_Š{½$X°å)%Âb¾3d a"˜rŒ8ް Óf§»ŠÚMõàÚyÕÏWÀ¯ äS»þLfQË¡¼¢B¹f³m{–tq1adêvd•ŸRK4°Ö‚l‚þDGdÔJôQ"ëÌÜážß ¦µ)1Y:Jíùa1²5æëtD%YŸâ¨(òÑrq=?å…þòxgÁ}„-ÍrH(W#DKÒÁú!Š“àTäÖÚÇKÈ9äAAÎW¾MO ¡ëf…v]Èqþ«¦Y¯ ¥VɃ”bª6J;ñ¤PлS9±T#Úÿ ³“æ**–y%å~±²¥ÅÌË[VõL\$(Ú{Ñ(vÔß«•®Keît½9?7Ñi‹ØœÌ»[L­ÄU+¸¯pëè3ä#²ƒä'¬DL€°Üq=›DN .¥HæÚîµ œÊ‰}›>«X¼y°0et”“…$Ú Þ> ¥�¾HÈà2‘-ž¾\�Ÿ ÉDÆhŒì±Ö‡»¹Õ2ÆÔVšy‚l÷ÀÚr¹™§¬�ü ÝÉnß^dðñ“%Ï¢çÏ*LŽ_xºuÇß»MáØÿé2zä( oñw§h¹Ùö~ðÊó."€nžÈr!Vh@ #ôØ%þ§ne®]EXë„°ö–ÝŽ^!€SixšW�x‰7XR¾€òdr@ö þ´¥Nºœ·þM™«p±H˜9™À�Ó¸>J®Yù2¡Ï¾aâôðh†2öLJ´ðf1DoâüÚ õ’ôÐ2Ö•}†B"X,jb¤þiLÀ"38×V ÔˆHœž>Ì/òÒ¤V‚¨aà+^ Ç©ý øùO?†u [Àä·pJ±ê®µm$³†jŽûT¥8$ð‡ú"3£Æ�¥±üÒ‚1dãæ—« ˜ØPzq ®Õ’\>ðÖOjû~ó1hÐyñu‘U)Oj´’«Enµzé†\éõ-œ½Ž; âì³)fóvÎÇŠ%^¶Šû`9bs9ÄìÎcµ0‡¾e‡Ùª„‹§í¦Â÷�.¯Î ú�y¿ÓX”ÁÐÜ'¡ÍVxé™D<òZÒ^U%zúˆ¿Ëöú¤œå/¨>:} –ôÏT4¡ó”ükœ Ì+IQŽO›=¿µ[�ë„Øx3¤ÊÌÈù„ܧÊ9#§ƒx�M I’ɃM˜Ý´D ƒbjë »4ý,Ì ÿÛHôé$×Ù î—¡ª½Ý¹6�·TaDÛ<¼Çëà‡¨TbºV‚™íÿ#úÆòGÚ+£2=L,¹Ei{–Z \z~»]d#õLֲà 8Ê~�íUFøV$�ﳫð�îCòˆ=3ayz‘_wþý=”Ä~¾tYN2wÓEšr!ŽQôÂY‰â¡š8 ó®íÄÒšvà*sQÅÖdIç¹0xUc(�Ð.¾°<#p®–àûñî>… lµ±’pJ¹dŶ)�÷¿�U@@C\”:݃g"4<ÆâèaÁ £†t2¬a7Ì®¥Uøâ½È$‘—,riœð([Wo\á1– &›oÁwNh‹5UW6ømToài¨ü6À9y«Ù¡Èn±Ëm ¸RMA¯ ÖL!üÿ?(¢2 ˜‹î€w ì0-ݨÈi5ÚÃ@fHdqñåŽ Ð fz�W cg®õñq¥”Ë;4Âà³ í�ÞžV #ª€‚ˆê{ð4s°'grñÙÔüQ´gíÄi JOatã;¢ØâFÒw“ÇÎÉ]Õô�‘™Å*@ /ý=¹²ÞÅ$8ûK@‘w.Äÿïî÷„Š‹NÞ1tðÑ êšI±cSFÀû 2sÚ-»‚`’wNfª�¸�nŸ§ 2äbV2®Á•ýÅGÀ¼d¯ã¿Þ æe/¢o.ƒùÃ\#M“$ì2ÁÑÖׂz–:^µ6«ƒdd¹lB\ùçw­ ÌIE©„ëA’¿ÙÉZÿ$R¥r¬s4‹LL­ÄÇ+Sט4Açù1xIi[°—´á 'ï™^–œúïÒƒã³Òˈ£Ö¢ÛÐYF�µ¥c,E¼Üm““ÙyŠmFÍ÷£']ÖOô~Y=já3µÖûÌ‘¢xDL¨P/<‚>­Á¬ÎP«¿÷еÒñG¹Uþ�Á36*úD¼:ÊÊò-=#�º2Â30$0‹Ã ×ϼܤОs¾Ö‰oòüA:½{O•&õ•]{¿�â÷”Ç�\%�¢¢nèðæþûZŸxbÜ‹únbO%>ã]\´Y9c©¡ÎƵٮ@¹¯™%„±oÉôèw#î_r­�"%ÎG¤-ðí(ïV¡Æ˜ò¶Ó¹w \™ÖÝܦscó²²®¤›G¶Í¡Åá0¤8t kÅJOvNW Hz‚ñ*ó!< 7eÿ—c7~òŠ3çÚ„¿F—¶5¥¬T ((Û(a¡‘oîÅ`œ�×–$ŽáØ%„Ì%§Κ附õ©-îŽÀÚ¯SJ~l�Êß>L›Û¡»J ³— uôž¯Ý޵–¨ˆðL¥¼ki1¹‹»ÄLpëkýYüUîÉáFŽ6x¡åYf–,äQÿþ|wiZX�KÔ²g_º*b,蔬ßuHs­*0ðS?¶¤9áç&Ç%­5f°¶íY•+ øê–/Ç°è®øsÆ!'<ÛPSYóæNïX o¨1¼J§€—Â+ðϘN½Mº×aº­0]Ƭ²r0Á‰žXz 2\[ ™2³Ýˆ ;(„FE~ò<‚쟶Á†J~›=eÁz¹• ÷Û9A…óÙ䯠Õù‚æô„$tW{àÎW—Zá!™±Å·|·õ.› l`pÀˆ›ø— C©Á¯…Uûë¸/Øå*èÒÁ$ýªþåübê� ‡d`ÆÞ›Í›¯¿ZU§ÿØßì!ÏÚq áN�Ú­‡"×#žø¬}þ~ÆñéÎ%ÂÑÈŒV>}!Œ·¢uÆý …Óªó1 ¨èsQ 7µîЪ\Ë… 9!Zr¸*‹�œK½¨Í¦,Héã…§�é%«�²½ùfV: »§Æ[ópbäû¸ÊŸ÷6½t’œqt£ëxÖŠÓX�eËÐü•ª?\Ãoél$™*7a +à‡ Hš†&cá—t¨üðî çP�-øos¢�„ •ga�_™Ö9�tj™üÇða˜ Ø:…�;bgÁE«µiרÃL:èS/ÝŸøïæ[4ì—Ì.\0ùo‰á§ÅüqÒóÁÒ2sºŒnqN¯1‚3e{œ°LzØIšÀÿ5ÀZ¦'“¯hÚaÀ@…Våtðn×õjh Øçû¢gŒº:ª÷œ}Ä^¡“WA"z¬9=Þ`¢å‰Dþ_`¶Ï±#lÄŒ[w´DgÇ¿£ÊÄUr³jœ“0&wFæ©f¬ÿyi‚îRþ¤œ ¶S2kçØoв?ÀùÑ5áƒß¿<ŽpâˆÚ†Æç0ŒX�§û©ìÀRÕs8ɤ#ilµÖâ{†D ¦¦]uïC<Æ}bBn<µðú%ö­ E©Î%`¥eøO2BÊñ¢%0V¤-ùeøOÐËá'.bÕ?L�­‹çœðò—Èe�&k°UXƒäªÿAæÙ :Ýt�øÕ³õž6~•ákéÊ\º4ü1G¶c†ÂÈRØ E hœ^”ë‚H—5K5h6(õNr¶bËŽ±YÐb/DPã6V·‚ %h>ªWcN¼D oïëÊJß^}† ˆþøÑ]Dš§o¶YÐtß&x¾qC—[øSK°sFQw q˜o–jÃV1˲ ït'áå]ÂóY�~ÁsŒ'kËHŸ …µ:¶£èפ¤ôFàçU£ì…>ž¤ÀOÙ|ùÆ4숶ïNi&ž†ù)eñflß]á]�ŸÄ™-lÖ-ZžQ¸²¾ãGÚ4(¨ŒüÎVYO76Âvêèd>#RîH¢ÁáJ5Zju<¤Ž÷tÈ£MÁÒ[hìŒeü K‰ªßHUa-tÏr3õlHþ)!{Œ$FSV,Ì8ë 7Ý‘Žþ$@óP’”[¹pªZÄä1…£1ì�J‘2xV^œ*ÆÀhËë%š�^ÜCnoãÉi™±LwÉôZT�äF:‹Yâ ¬ÿI–º�"×üŽØ(œ9’ÔÙNö�°AøÒà¡p;¼B"žÁל鎣f�/´ÇÿíF‘àqyH–¬”‰i�ÒÍ�C}!³+æqh|DøÖƒ£ï�øäe!Lµ'Pÿˆ\(ÿÝÛKÃû‰Ní¥`Õ”•ÊïZ ¯·ÐUu=+‡Aãû2¤.F´:áZFÔ]š;I1z—9¾°Jݦ)½è÷pnxõvÀZ~”ÊšŒµxjÎå18•€ gÁNw®§ä ^×:Û𹋘­¸Y¸†k®~Í´Œoñƒœ’°(v9BêúÙšÍþYZáè&©ÚÉS|°‚Ù'1�ê)ƒg©<Íÿ0X×vK.²Ÿñiò^à;5\„}î¢ÚYž„i¨Æö¸Š½�ßZm°¼Š7*$7l‚öâ™1¯ˆÀùBÊS!,ZøÊ€¢è®ä*ô—%!�h=vפ¬WWžzšÅ79¹$Z4(J‹VÓKn ¡-²©øfhsRtw˜¨ªt�j¸Þë›ë�Ücì°ÁÅŸwƒ ^ �&aœ#2Ïj¦ú¹ä*;fî ‹Óaƒ(0c@ª÷Š'ŒsÏ«( _(þüväzÄ+€ —Ó¯{¹õTú™b„j;Áˆö¢š®øF±£²ï²\]]”ˆš/€ÝS¾+j¹ë(Cf©C¨%Ö§„.Ô•;³\€ÞDÊœãµ*MC€�"`ÃÀÛÓRoßIw mžvctYÌâÌ÷/¿#õ´sÄnïúIq­¨RÕhCÜ~›’›oc×ç¸bcðÌ"(´@T‚X`s»dÒê¬p .!ÇŒö›r.9„2Ñ ±¤Iî_‰Bª/`Ùhèˆç´4ªüÔ³+o>òaÐ܉°H›R2!s %â–†×wã&ai'¾3rê;Á-j‡Çnør‰娄ÉvêÞxy Ñb ã)> âm3¢#xX¦�}3Ÿ£]ÈÇgLÂc$à V[ÉVÓHãÖ-�ê�ÄI^º#쩟fÙ–ˆ.úúÂia¶•´›b'H Cf�Ç`ìå�ø�-o)²ÓB¨mõÛ“Ðw�€ãζ”°OˆH¡E²n�L Tö[ÒQ‰(þ Á4¿MÂê>8¥&3Ú~þ£ÔçºWEÞä•IÅÙ´û5êÁ3Ξ1Q;%÷Må$¸�yÁ a~X9@º4ÂÈL6G£ÍV<x‹Ž�ÚÞóÆÏ9ˆc Ž>U‹%Ç\¢¬NÂ䎣º£Ž 𕙏tæ 5öÇÊAó5Âê~Ø©rl¬ª) ÆÖòeÉru½K?£Suêûx>\6¶ÃOå#ß=ìIÛÈòµ;úøª§‘DL$^ã6Ö2‚¬°®iÂñaëëû\^VÛô°áU/“8;“I½^m€E×’¹=Tô¿«Þ̨I‰¦9µºb‚¯c#»õíöO® ·êòsB/�X ·s¥=Ǭ}2zO´€O¾ (\‰û@nùGgleQZ´Ñ†èq…£lýØb-ý²H(b^ëÊ6»¦¡hCÁWî¹·�¬ð2—Ó?KŸ~‹�®öÀôø©;}ˆ8õÕ9ûKI:Õ£é¼*, �¤´‚;´«@c?ÜV¢æ^žÚ´”cJùj{"PÀ co_[RRT¿,>õ¾t_^™˜£bò6Ì&̨@ËšÄÑõ»ÙHWÑeç’ƒ„kÑ^êb�ËO/ÕµQ¿óŒéØB¢ @¥§ý@FÑŸ0Ãv[Ý’Ûæ-ÞãÌŠ kX€ËP.`ÙËW�JÑ�Ó[RŒ¸·bñô 5ì>„Àu•P™’øö|šÜ�Ô#=\Ì0«ÀP Œ›GàÄá|Jï\C†>`º.ˆÀWwƣ΄a7%1`wzNɤnMAæµõ5yc Zª�T N¸‡„'“L�Îñ’Ƴ•ÃQGù‘³Â¥äźQ×UÓ¿||mjtjÅÖŒì%8á"Ø—jßsC›Gžƒ¾Iíyrð´Ä‰N» ÊÝ/! u;ôif_IÏ;ýuFtmó“ÐÄ ¼åd¤‚o¶AFIxvä�8e7¦´ë%Àš°Ë8<»ÓkÅÊWËîZrdÃÎøÝMU�ÞÁ°1îª «úÀŠe-iÍÃ'Ž]‘/ã¡m'—O4d~ŸNYt"zñ[V°@dî8T yõ Ëu �Ç3!7é6Ë‘$²t;šp„( �Øÿ(ÏI™¼¾…Uÿ“Ô uŸžˆ:úƒí4Ñ€–Ý“ ½20b÷Æ yêHà^Ó§·ÊX67ÖDiÚ˜æ}·K>“&äÓ\0ÊÃÃa3˜™Î§ä•­æár…€6_¥D3þ: íäK˜€é¸sqF/†q«–’U/‡ÍnaÉ|×=ÂUÊPÂ,ÚRD‘Ĉ¦{ï+àèÑ÷Î�úÐðô TƒàÑàšÄK#kÂvc#8åÒ<Êpn!Õœf8BÒG°Ýtâ ?ÌŒ]Å_9yèI.É�#ƒzÿ£Àlþ_¯*¾ò825¶Ð¹$&‘ñÇ É«jCW¯W/äVÈ „Ú7á2ˆ”±)¤YŸZ×:ÏΧ!Ö7XQZù’ e 'Ï¥Þn¢€ Xbþ¶v¼ÊÛÀà°zd^Ë‘Ûzõ9ˆXÄKÄ:³ŒÇZHöwÕ)‚? ¤¼ñò•x†ÃE¸"Ï0B-¯µG䘀ê÷Íõ8g¾4 ü¾*.òÏ©Å\üš½ŽìÀ±W†e3j÷y­º]oa?Tá)áÐqÃsHÒÚu(­#D,õ»¹çì¡]¢€ý¦d'(`k° ÃÞ¨� dTˆP…vEÊJ:+‘ð9×ê@=¨j�²×ÿW„në%¸rUn Q&±FëÐ#«ºB²ß×úçX\o*h6¡ü`’ñØ'¿+Ϲ˜=—mps<æU;*ö^ËyÑz¸KÏÀlëZ;NÕÉõ [é3õ�]k¾ZZá\Éí¶ åµÍ( ì@­ëÍ£°‡O³¢¾ ÉÐ]íÍKòX”¡u�ZN¹Rä–-¶b<ÇÆF¶1`´-ìù<,7~–ü6«b¤öÄêZét‰À¥’³9ÿ¼Ÿû\Øð¥öÔZ�7}áv‘À¯¸–äúÀP3Øöü<¤CÊw'��²FOPw>É@ØYn,ÕiI.ÖFiÓa´ �ñšÚç !Sâ"¿ß©]bðï’Ðvkf�ü“Y�F>©~Oæ8­6~”D¾²LíÈãMü±ó�|´bzy¼ŽZŠIƒ|TQÿ/‡Ó�¶À4G®ä?Œ{ÿ$`=?WÜׇЇ» …! C"©¤"îb9C†Ž—……¯¶Ç…´x(Þµ{©ú áfTÎrnÊ�\™´VH|É>@Wæ³ ëtH5“Ã9 K&¹¾vùMKe„ç˜-`ŠƒY7 !äH{Ü�:7?I4•òŠù_Ì�‘Ú ÐþE®¡Ù ÊP� ¨Ð+�yí,ü†æ.šd¥Jè’½¥j·+=Aëòlþ…�´Í6\èUAÈ-ÃGìB�ÇY=°¨€NV—a(_f‰‰ºÝÃHºoH«4AÌ!ª†kyÛ ì7:7�ã ˜ Ík!¤Ä9µ¬Éu­®(ÕŠ¾ã›ÚÅW¼Ä�ã�‹$`ù÷³¥t«†ùRY&8l×z†ÔT¨]Nrpé`·7=?È©Èb÷ªã5ó…Hâ;Æ]üªct wù^ºR‰j-Ø2ì"òÆMîïˆÝKD2ºˆÿæ9ð¤Ívº ›gÉÙFx©û«|ú§o{9îL ÌŒ8é ¶sœ�}úèµ»¾eÃ5ÓLó—UY;fçÊ–…ÁE¡’³ÎÑí±ÖN1=€uTŸ<öä-cò¨bŒ÷†lM>²êë´òéy[Wç§{Îâ@_¦PÙÅH¶~½´ßÐùë@âÑSPˆÌVO%h Ñ™ …1 ;å~?ˆÅ—Â×>˜U?LÖÇ35˜�p„ÇÍß�[áY0ÍØü6¢¤±(,Å„Þ8Æ`_ HslêJmh¸owzT\ •¨ÙÛ¦œ(ëZ4…ågø‹òÙ„X|çäçS~¬h9´0@ÁpyŽª¯†ÓI¦—ÑÙû´æØÎHø3ë}�󻯿§ýqsnÙ9ê¦ÇJ~)H(0Ûu¿ ø{’Œi¹Ö¼‘8çWòµ°âž¢X¯F/(Ñ MnÏ¢GÃR:r5¡#Š ‚N¾[A�bR%.rDê»âËѺ!ñÌéevmµ1¤°i\¿<]SaŸ€P >ËŒ'à]ù~ÍûÃß”| ñôY/˨mÒõD>#Ÿ”©ýÒ'ü»ŸM�N{÷–cû[·Z_&„t$¸}+wÍ‘@‡d0:‘µ!âi0bÁÞƒÖÜ4ÉŽ!ïr� ñ'¥ûÁŸ-¹Z¹�÷–¡h´bB u|ì-»'î†* RRÅΤF‡×h'µüŠÒóApß¿…z‘l¯søÄ2RÜ›h%ì-1ˆÈP¬+×p‹ 0Hhr�èGßò}œ¾ úÚCê4ú(�!Çä±ÑA�ä§sYÍ—Šë"å’zÙ~Û}—ÿóJü]à<`mÂ.TÔ¬Œ¾Xø´:Q¹=Q �S�àdõgvÀaz½i¸õ–Oæùª§Å$DC«v5™´ÉœžE‚˜)X6ùÚfEŸDù³²!^p{ ·Šu²&ЬÙ�þ‘1¹oPi~”Do5~ïÕ·Hó­kCÚÇ×pˆ„l¾pRl@#õ;ß?ÎÝñÒ»lCaº�û¤6Üj.ØÌ‹=†:P…oô£u@‹Dѵcq“Î\‹'L�íÔ JÜ�<ÎuÂ]~õ*ÖV¬&�ù=GîÃbÿ€¹D2¼X„˜%˜WQÂ�Ñ™%º9‹wŒ ‘Î dŸ6J¸ö$‹ÏÈ1r –C3îôT¦Öó;ÓZƒBè1 h#ºþÚHzÒ.k¡×Sh¥Â%?̶ ì—äìK}VòUKäM„y ¹VG¹GB{¢×«š�â}Õ”%Tå2YŒÝõH Ñ®ãƒc×ê÷Â&’Û Ëçù•›Ö-½´FÈ Ž8(vî„ Ã ô£ÿÛ%·³ºJ>žPàõ� ›%„Ê@Û0œÁ.…xd¢Óé¢1A”LûvÏj�µëa͵nƒºu"›üR>‹ÒËïi3ù‹ê6LoÂßþïˆI°+3ntfòè5Uý’TεÌ0£çÓô�fj&FÉìwz”¯ÃœÒÂf ³¸�leÙÂ~æ¾ÜŸ�EŸWŽù�‹³B_•«Ê!ª`Û€ÙpNµyè,<|(Nù·Ïôˆ}¦§¾[�õ†øw©¡â¡Wvw(*½LRFX¦à7qSSŸšê%ÌÉW>kÕÔ ¾xõÇÓ*Äù3þàÀBÐ$�y$°† yZ 1k4y�dR©áÔ”ðw)¡_›‹ÆzþD3çÏ¡rQ4ý½(zvÆL¼‰ÕJaùŽˆ2`ñð}WnºÙ:¡tq!ÓmXjC„¾ ¿yÔT~Î^Ÿ@”¸œíö¿;`ë™È;´Ï†ÍÅ™—þ¢…¦@ìh6ÖšüHž=ƒ‰®~źq© %ÖÁÑ x"’g&íêo®m´2&/ú P 3}W>£h=ÀuÒM”A8÷›;ûŸ¹ÕÊm˜taj߯K ½uœö=bQELÀ¢ÔEÚàe>YQÀg`šÌáØ¸Gá2àèD·a˜n_!窷mtWãñôâvR»ò-‹ƒM)ó�„ d&ÎÑõH›Ìš x-ˆÍ^¡Z¿¢ѳ<þ’à\³ Ô¼ÎUƒ±€àI.›ß�w¤»ág�-¹BsqU4;‚NWV‹±…+�N0.L–Ü!NˆÄ8o:Bgœ•�´Át�g—Ѐ+vYÎ\*±Ä‰‚:UÚŠIœˆCe˜hüq uZwñ¿XÛ…:f8›’()BÇW”ð—ÑB]O›8†Ñn;{H-~P~øéƒ°íˆ>�>æt$Ø7V¾y[ñ<³ÛJˆA å©¹…¤/XÚ9;N³FísLzuF~2Ý]Ñ)£êÈäC¤O$«VêŠåsÝê^ø®ÍÝȹ2Èñâ–ÃáÅÆM,£~Ë( ‘¹Zø“ké‰ö‹êÖ‡ù>¦3í®cD˜ʉý"-¼Çz®RoÈðIÃáâä‰5‚Ë›Ñõ¥‚�ãÀç¿p¬U(Tg :\Dû ä$q†2ÝSÙ™£áÀ¢Aðq/½¤W¶ZŸ±—ûC fƒÆi|³ ž2aÞ·J0•z[_†…Û°uëÑð&žr¹Ñ±kS †“y׬LµRžÈÏÎOvµµ³q@ O?Φ°>…¤žû?åLÎRÜï­™;ƒÿ×� KôŽ/¥ªOŒ­¢K ¿YÚkZ¤‚¼”ª¸ñÆ3NxÏó+U{Í"�¹ìtzä`I*?ÍÜB;1|ÉÎÜ[uŒ wªŠÞ»LŽhT<& s~™ ‡?Hy`)Çád0-Y«,‚§ü’pL€ä›ŠÕüÔ¸‘káÓ«ùÌ·>Býù0‰0»¬½îü¶Ž] ®§œ©3Â2+aÎÕØ·úŸžÂ= \XWª4À®rC¿áÆ\±)¹ÖÎ(0¦¼VÂãæôÉ_„á̇U-RL¥8½�%UÔßúÍ;®µd*ÿ||Ïg|5S)§†}p¼Í}>Øš7R‰õqßeSTñ²¥R–Áð8ùõ;ÅiÕÎÞºÀ±ƒöCgOª@b„�ëö2ÁVXÅ/™ÌzǺ Ÿ+¸� b*ót‚‡Ä ¼úxþ¬ìó~GäÊ—]ýîðËEz¿¿Þ'ßÕH2#ct&: ?óä�?l÷ú8 �Ê͆~[³±~óå6‚Šýßz9Ð!Þ”À+»ödÓÁ+mx^bCî"O†uÀS]f²w“(·ïÃ5»^ý*$MkqðŒñ’ã^Ç‚º4& m§l®¶–o… "³æy$4à˜_²(Öøo0tMQÙÀÿíMÐ1BŸ\ïîìù¹Tû þ`'é÷Në&oXÛ‰#p“ÄþÊ©€y‡RÒ¡ÎÉÃo‹3€µ¯B¼>¢{£¡õ¿Ç¨î—ì9ô€TWÚ‰K9Ú£ÐáZMçî„é«•á�2FÛa&{f‹’…©’주(¹Ó-õÒ“i†b¥l­¤ú2›Ö¹[õ¬“육c`ÅKßA4ש™™Eâzík‹‹�´T•©Ql�7û`9Ô®t8�J¥hwg.\Æ�˜,®1\‘«ÑH(j2"Q¹Ó’ž®¦J ¯^B·Òð´? Ó< h$…¤�'Fïšî lpßÖÏKîò˜u"™áC£2]A3 #áZžŠÍ±XŠ�×T[cJ›ç‹òcš 3/m’ÒÛgú éäæëµ6…&ž×ãy/Ö<ô›£�Bk>¹»ôœ˜¬§Ä$ÆÜó¦h£F“ô!€Fè |êQrz­FFý¶øx>>ê ×X¤ “ÍŽüWyoíõHù¬Ñù~�ƒ"ȵM\*§·˜â£+wüX†S»žg›¢“£9·m¶&K=Åáãte f@¬¥‰,’0 ü¥+âç0°f؇S‹a‘ð.ûûäíU2ǸäQ}šH\Ámƒú:ú› ®ÿR’½Ÿ|µÊÃäŒÄ5 +4ÅYéõ+óRä}¿¼iÔ¬‘rÔùÄ oÌho¢3yf�01õ&{:µó¬[«2�gY ˆ¯'AõŽÛ+ük‘qÕwßµ«í\jã7iÑR�ˆùØ œ¡�. šê6€tb#\Í�‘óœ�³,²qÈÿõªïØÝF7>ÂÅs.#Ïû�®ðîý2‰B%ûf΢4q_u¾v‡Þíõ®ä¾]Ñ”•^ýþqL%u\Ûgˆ£àÌšk+í»è^¹ëm9¬uWc¾ýã G°?O…É1ã¥'òUÕ‰N§“èn£ëÄÝÕ­«2ÌóÑvã•ñÃw\ªÜEGÝ£Õª]¢h² ^{=;ùµ3ЇµXg³À„EÐ7ßÀ!âd½«sÊó‹+a‹l �Œ�º™À‹¬±W{ìÌ“»] º!V”«Z×™ÒÚ.DK @»ôüSÎ\ŒW—KŸ‡B‹z ÜU‘É“uCõç;¤æ¶?λô%Ò+îÓù±r‘þQ–­¨ö,g¥”'D¢±"Ýñ-7QЭzc¤H®{üêˆÙoX�Â�0 wÛÀÁ‹x!#ƒ��¶O#z;°žh!�ñþÈhrñ!{ ÑœClçöÌ7M~tPÈPTLï¡�THà7ºygü:½ŸürÝüÖôúg)q܃€çÔLf>TwgÁ0Ð">„“÷Í„{…5dÖu…­“ ³K(~#ÏÕÊŒl°®·¤•CÙô™Vv1ø¢ÔUoC�¨dÐ ¨¡o+4kêõFù$qGV�‘¦Û 1õäóšÆn™oÌJæ\Fä9¤%U¬EE mKT :.ƒjßê”2N^”ß¡pÆ:“„QÀÐ�Áy©“¯¦À‘\}…u_^7�ôXÅà÷œ^R˜iÿ}9Ö‡PFᔤƒH�Böà6‹Dºf±dè§!”̶>"áÔ7:Áål;TðEë aeøº`»ÙæTÙ'¥·X–Xª\{QÔ íŒ#|mþ]ªP[²ó`.ëêÜË‘%ü Úùs~ÃÄŒ¿““pÜ8j V7|Ûd.¼RA•‡!»ÕØæ+5|Óeqç9Ý×¢¾NJWîdòæÉÍÒÂ-LJHp Û.~¡CQ©$9*<Ìõ×{,ßY4Ò6c¸Îkž‘zTÂP:4X�NµÒ'úv¸ÉöÐ_ÄÏ/Þ®-ý6!ñù•ïí¤kïŽî»gr—�³CýÞ7Ç™è�‰Ñ0à>¶ˆ'PÕóÝ”î›bŸ0Gµ„÷ßx9Raˆç¿Y©ßzD”‰!ãä¡ÒèZ_÷šýÎk¦ú#n.?‰(qV‹›j¼9×Á*êuýívGd3«CW Îd7øû|4 ‰|à À»¹Ù3ÿ ™ˆIì3׎xk}M!)4ïUƒÄÒæÆÔŸl™ýºíÕ¡ìZâçRýÈ3?.jÎfA¶¢1tg\Cèÿaçð)ÕœW)Mö7%ï%ÏÆ# LKñųüŒKxmþ؈å{"=U�Ôem ãë[XÈûØKNø ¿/Y¦Î#³žOM¯ŽÞ�eÙn#ùÉ4DužTØ,Ee ûKsj0H”ËÚï?`sk]ç©N8UašŠrèj oêsFÆuÎn­î*K®Ðš!T/?2»éRþÀ.ïÃË~S8 AÖˆSSÊ#I!3hVqm-”dTz3z¨+F|¡’XnLb¸<°2$c`óÚQPžç=VndÂçf—5%>ð ¨_<´–ó†É–w2¦àét�X]G×ç»DºÅy˪ÿkÌ|�¶rK;ãK_Üj{:Uã3=îÃY7™·—ïFHB\ºƒ|=j/ówÆ÷ÝT"\Bº%¯µ ®<ñ6ò Ŧ{°Í×Ù ‰~waC‘És5æëäLw™P•%È>½Ò¨ê!£3âŒ/Ó?kZÙv÷æË æï×ÓÞ.ô�'ØéŽbs Ö'ì"|V»ÕbÌ Z•†øbC¨…ã6j8•8s¤ Ï�{!”_§èm”رȗÈ]�'ž×ÚNDi-úTWë‰N H˜Ï/ÝØÈ²9ën5SÕ÷”U�Ò•ú?b7\-š.ß��ÔÅŒ°?ïÎßô ¢»KŒ ?lÞ”xRº-bþ¶‚´DB¥™ÇÿùìLJÆmˆh"ÅaÅS;ú{s¯üŠû=ýx‚S%4‘5M±r+ñô=º$¶¶°I 啇¤³ÕÒ ŸZØäöˆ¡˜5õÿª3M0o•¼üšo޲Nj­Ž�§™ä{�œý†Lâ.¬‡1NŠyÞ_k +\¢ìÄÄû&ˆ÷†"`Q€n‡)>Tw]¿0bмֈóUo"¢†F*àŽ¦_*ø.ùõÎÞˆ›Â÷¶SÚZCü¡·ûkói7<‡G ÷\Œû¥E}gI’W³÷ZzO�M³þJvÕ!K=c™½ô¸¸¾÷„:m� åq>þP�…•Z8#ÒhUK™²]8Y{^{¥ËãÁ)Ù@%Ä$€l�…� Ä 6ºýlr`Åβc;›8d£2Z3�ÚªVš²çY�-æ5úRMÜyÕ“†‚˜3„jðüK²„×i�o|Ó|4…É #ÖŒØ+¶· fѲ¬(›Ìü¤×j‘£cüþM} .\©g,sûƒJþ옕2$Òž�,.’Ù2›èT…ú´÷j4ÍF±8€,k{þz…˜ã K]­ý2¯ õI…ˆ)ÆØaeɇÜÃ\R%�Øt½÷�?�7mÀìÿšHªDzšùâ®ËTÕ�î@šû¢¸`±­æ^ðÇHˆ^R¥|ǵյ¾h–39syh†½¿‹o�b:½Nè‚S�iÝšî�ŸÎÞÞôU¹r/oÝ�·ÉòÄÅR,Øz"ˆ¼yºÍÂþ[¦Æ®„žÉ#•cuÔÅYí�fÑ|‚.t,Gñ`œsf¡ËÿƒcË„ÅË réý(ÕÆ4Ž�UN„ L6`ÆÛ?†_ªlà{ßš¦l�­¢EýX•˺hãïZ¿|zOÙOW·×á¿­XÄíàõ�ÓAþ¥sçqm7…õÏÏûð–µ¾ìzWl¿*­Ç:¼jÃp˜n›&ß!�kcQî3Y.áfèÈ‘�Gq2ÈÑÝ ïÔ(™·&žìŽr’@’yZQv\“ApÅ%fÿ¸ãÿl½bŠ@nµÛƒÕÉ{šSï|F©Úæõ@Ûù~o‡`ËG« Söša튃!gé»aðJ8×!1ïƒû×wÏ£�ûœ ähV³á¡¯�ËùbfÇìä¥î”ÎéûOƵZ™Ÿå£‚Û¶†Ši&<�7 $áfïò5üÛJÓ¬¸E¿zä‘ë,JSƒ%§šûÙKè÷þ‡˜s3Ëv ºKüŠ|ʼnƒŠ¾I&bW9Pí�¸e,Rü�92:äW ø�×±xÃú‡ÑÒi¨±*_píµGV“aÿ ¥À8=_Kzc Î^¹ZÎBüž¶¦o肇»dg}¸ÿÀÛhúïË•ئ£ŒÝØ�ž^3±Sê®èîsÉÆLåPއ³×ýïçѤq/jRfìï¨v‹ œh€Ï±®æ67uö̽ۢ”·ÔnRVáñÍ2gw© ÷AR–¦× ?cRh,]M� µ„e‡oÙ$ýSQ¸–ÑÍÃOJWʦåX˜‚¢jNýšÆ)I×h‘AÈ{ÝåG³xôòƒÉ&qÞ1H— ±œ½>£é©mÆ©P‘§×ëê�̸\*2ìZ‘ÇÁˆLé¨8߇Ák¼Ì„«‹Ào§bw�ÂÏÅä­Ö‘³ìðÉwFÉRÉ�;j‚ö­æó †Ø]ã²gž®¹o V{® Q.›] Ì×Lw\䌞›Íº9tQС½¢¶*gmhÚ©¡}£¨%=?EeGáåÚØÐKÊ;/?zÀ{(ÏV”ev¦•ñe$Ì1×m‘¦3ŸÉ„v6 °oÊÊùP§o�2}<æ˜<[ EÐe5�]!¬§Â¬í ]3ýhwï9ÙÞ¹&U­¾I-ÎaÊtQ^¼Ò «4[ª°»Î#r “LÕ=©iôQ9æ48ô+áTÃa#qܺB…䱯¼&¶‡ÆïN¶Î§*i)Ÿ¥âá&0£¯Ä;ÛR|³lå P3ØÑµÐ�¬AbÚ Q¡¹�W·Ö|¢(þ([$–¸Æû§�„¨ãÔ­XѺMÊ•?ÍÚ[�¡å”[E„ûª-AØ÷Õ‹›Ñ•9(�¿þô)„*K�öï.KkRÿéÊ®•+52e‡»¬~˜;¯­Hr$’¥UÁÖ=Õ#¤Oìý„ðH7¢œ†VŠ`ûº.ÞÓÑnÔ�Óït�A"“¶õ›JðÈ|³‚:­Q3^-ÝjzLJ’ê ÆÃ­”uQðOMÚl›gÈU§å»AŒ Ê%œ”ceReƒêl( m½@”¯Õ‚xE²+äB>ÐóÎW9 ^¦5¯?ƧÂî¢Ñé«Ñä•Wmji�O4…„×—D¤g ø0É"\nZoÛÚg:ÏnªÊãï¢ZÖ»ZË%çJÙ®‚±ìgY˜-…v°3ÞÚÙeaý¡¬&ЭGi(=í Œ?0¢ótCoÆQDGF?ŒZÊ4¶�ê~•�ÄFI”÷Yj<,Tزÿ‹§h±Ñi¿ü]‡Íî@sd/¹`ÕMcÚ!1¿[´õ}Sg•æ�qx£‚�dqÑvOßPµ­dKôG�éÃéž4�FðOü…7�…?9™èø´Ô^ʇ£r�.ðgþvØ¿ÒÂT…Ó¡ÁãUÿtænw³D¹œD�6'©Â'áe‰Ö6ŠÓ ?ÅL¦‰°Õ �ÿŸ$?…¤:~ôZÙ2egp°z­Uö¾†ÊD!kdAQÿïÚ€¯È¬Cé(Ö ²s’íÕœëgÂ}6ùàÑ8u°ÃÐÁÉìmsVl Êݰ]U -Š vµ"æ‹ÆäÙƒÂÏ-€È“")¸ú’'5;&Éh©æx˜_¥¢GF“{òBÁO1¼©[‚¨¸Šç!b ?ZöøË(s‡›]žë»0@ý?¡{Dë|½Ø•î >âêp(O ïu'ÚMƒíü°Â}¨Ä�c„PR|/ì!‰tÓ‰ï| �ªyÞH?ÌùkTl|l<éuëðyýŸÕ¾Hv‰ü æ!½JEÖÈYhwWé‹US…²LœPŠ“‹0ï2ºž~’E�¢J¼t¼û¿b|êcŒßÖésФ–ÞkødLÃfF›•áÆãIãâòW?ö”®bk«Ôj[tB /ó#ýsg)¬Œ@%»¦#šP–W_KJ½ÉXT ¯H¼(Þ @„Æeœ¤&nôm´*ÕDRµÑ;™åÇj·æGÊGÓðqù…vŸOù5gÇºÒ †ðÙkz[*ž��ôÄ�ž¢*?Ð áLh æýåÌW ì1$QvïËsÀe¨Á™§�˜ïVUQ•Š ±Áÿ\ê \†xÍÀ‡f7×–?§5µB\1OxÁÕMÓ>Ùmr3WDpj¹q âI½’"(&œ¾æ›+JWYÔnõ‰¿bÖÕEm �„“¡åw’gÁbMü8_±ê­ÒÄet\¶P7‹ x'péz4Ê:²ï�„çƒ9Û<¦\Eui5Š}¢™ 9Oàà«]E®W“ÚÆ{ ér¥ í®U.6¦€ê�k~̱ũלêo_ù¦ƒóåÆ?l¦…©X¼ßÒâ“V-š†¶’5£ ‘¿�õðw¹¹ïŸ¯,Ò­N=èfI.QÑ;)²Î……öî¶yÃ;ì tk=÷÷hnŸº%Ûl;†þð…5ˆÇ”‡âÑFþ !‘Ðí(Hò탲x0KàF726éËs™îó™t“ûŸ¼˜«í„JÀsÚƒs_«„>åxÖ§OÌPZâÙ %„"¡ß¦§£¿Nx²Ù©SL9L«“ž}œ�¡™ÍXˆEøÖz®Fö¸Œ“ߟ™ê˜¨Gèr’’ I)¢C¦ø=³Ð&6 _©ƒÓ”ÉÀùÇÇw}rœ}¾zôìY�×^ Þž|Äú�’qܘH§+ qÚÒS´I8æfR«1t$|©´Nðq€¦hˆàgÐ(™O‘îçÛs®zç¿ NëðR‹%…EΈó%&¢Ç•z ¦ÃM×=3ªší>ZLù¥{!‡ù”àÄ+IË âj_ìøI `K·  �4èÇ §�£%‰m¦ÿ5P=¸±PýDÌIÁŒÜF^1‡Ú #Îú\ 4k”YÐü S‘W_‘ò±¿\[š¯§ã�cé®_T�tH,½‡· 2[pï&Øt”åQíµ~i•¤šr²¤d©Ð,R|ôC}T"ߎz~ÿO`?Ulßp¬³Ì}Ímü'6C«Þò%x(‹©óÇA(›å®î¸}/‰ÉÓZÔ2ÞÏV±æñ±U�glâ˜ñç¾îxËËt¼¶Qþv„/BôwsDº@ðQÝßÁÃû€åΠ0ú˜cÜݱãúÁ®8±: Z4r«Ñ«0QÚ–Ÿð_›3TMÇ—-ž5k÷íGqd«ï3�DØ~mÍ™¼‹a¨;‹ôK›ñSª’GHÃYlˆöVP8 ^H2TF>�^P‡ëR«-.ÑýÇA-?WÛÎ-_m„FŠÊÕK}•£®4Œh¹BË•;üͨŒÃ%¿:¸§ãª·vÞð¡`{jËÓà2‘V*·U/'H¢à`º*#kûÑip¹„4ß#,'ƒûÛ�Ž}štüÃÂw÷óâÞæØo„Û9܈½[ÈI jàŸ(¼•¡˜”›Es1FTKòuDHÅF¹‹þqgL#ùµ/˜W÷1<`°"˜qìíM�öÍ(=âIpLJ@ÍñÏ®#ÙÛ8ÊáN½Œ¼ÿ:ˆFN�†éþ¶]+TKNXüÕOTœ>%tZzLÈÁ_nqL3“Ÿ&éV{„“©_H¥9dÊ¢I“dŠîfdOÒ”7›¯÷O“"T,iXT¤È0‚Xˆ8#´ÌÅ’¬ì�ÚüB”!ÕÆ "£™ƒ³ê\…Î[:]T27ü}3Í!sB^¨ÛŒÞÂ|¯ÙîR9‘?:B<âRÖ&Æýòæý*Äv‹}«Š±B$¼w; Xƶð¦ø¾lˆHÐ-ÁÐÍðÎ)°{ø&T”°ìœRKàï¢5}Y°Ññdù4¹ÜÙÚ6¨ª\Ú"*Ì\»ØÝ¢GÊç>(J(údó¨aCÂ*ŠÝiˆÅÞð¤}f8b±¦¥ùs¬W� xà øg|T6§ .[u#›¾Óöhg$WP�nªÅQwØXßRm� (`öˆzìØÆ¹|Öô EVt¾ý¿¦ÛØœðCUv*ëØ$Ï©Ö:�DÛ{ha¼hq±<¼ûfî~ëï—Ìq³£¡´ÀG4˶7§±Ï?§CD¥‹äÌÁ[±<4­Ô-œõN¦ç`fÔòÐ!c¿À/GÀ� ­ŸK$©ùp“!â§ÍçÝmÃ,Ye=©h3ôÙ2™¬ú±Þ“Ý8Ï`'å] º4ÒДZGl±±–Ïb‚K¿Ç84[®ÞqîÞ›\zAµŒÇ矰~mŒ ã÷Dô¤²SÄâü³Û›‰Œ>Î+›¢o½]öÓ¶D¤Gqš�ü,Q>ý–‡ÄùŽ.J‚1¼QL)É'Ò›¸9ÌÖœ€^Xzw­ ±ruUAáØ­<ô”‡šdDÔO œÑeqõ5ÃÆ}€ç^ØwÎëe[Hà ÌBB¶×ÀÉW9WX[¬ÆÉf:çì >n[އ>•Z@OLÿ€ŠÑé_+Kg;Ÿ±�—�lRRá;Zä6zTTüaŸmŠ˜¶Þå™ñ¦Æ¢ŒñøÔÍâ¶½n ƒ¶ �bÆeNh$±zÓ‰zs_�¯J.e]©êVSè 5à�åh¬›ô_mgÓ ­5˜ð*íøaûÕBp) œgoõ?òíÉrõ wQ2Õ½°×P ØV‘›ñV19¢§/‰^ýÑtvœÞÖ{AÒþ–ìÂO5]œqÄæcJ…pÚ/ŒÅy”ÕòêÔ™·.¬P‚üuÙgÎ\t>[0V1í (§ëc‘ö"o ©Ô%¥'ÿƒ»ÛH¨FwÈeÿ®qWý`É+n5ì{D#g¬ÝnÄäýmÄ@?ƒ;Û ‘ª¦ÚÎ&Bb¯/b�� àÄg�C‡ñ—’8yzâ¨o/Îg;9 8ýh FžìrÖÜOÒ–ç\à}Š%�áçwéiXsþ³¹ÇÓdØ$sŒË#†ÎÖ �˪çkÖ}ó¾n\á#bûû¦0SœÖX;Â�Z.8³Eð óÚíPy˜z»�µæ†]€oÞÊAË­T~Þüo™E€¯ª$ÿÎ"®™?Žs¥5p¾‡Ùã}{$>`É(Êæva_53ÀQTO¦5¨ “®0-8%.màªyrȽÞ<îJÆÔ–¢›š=y!sÑ‹>ªã{B¤©nbnˆõºÁ1ÑÛ |Kö`K‰™/PPªámälWÿuUˆ&{Ê~q5 º+uH=¥ù¸‹ZÅÊÜù›¬"i 8?eŽŽB Àö3ýÅÒ²‡ûg×¶n¥F„ܸ¥³£ö]�*(©GlPA¾úã?JëÓrd|絎û °§ZQî¨̤¸)w´wMAA¤Ð_•Ž�GÏÖ`ù/Î ÿT‚^%ˆ  ´Œø[Í�ó+J”ù`J/d…ªqkÙò12u{­Uµ¾¦-ˆn} éGOùK ³ùŠ9Þ0G ˜O´ ) yÚqj­-»Á­1y¦¤�ÿ>i %ÐŒp1Ž}WÀ8ð¹çÛ†î³ãvðébíXfŸôyfV äxø÷ÚÜ,Pѯ½w—Òo:¬zë)�¿ ¡žóš"€v¨™ÔBm¤¼•ñG*¨;þ?IéØÍåë~dþW´ÉUxC­ ]š\apoÐxÑSÈ­CXBä~àh^Œž¨îå––JVJÆÐ¯œ\õ²y3½ÝÞvBŒl¼Û%�¦Ë÷ˆƒ@t†»"~ÒYb‡L—N*ŠiêêüU÷YZJ�þ£ªùŒŠÒòb[/t¸×�D"Äñ=ædV=�YÚ2@Ð@Cy9ì¨UcÀ÷lªéÝõn«0!‘�“bJ=TÔ¶9w²oä䢈TÞu”ÓÛa òÊrvÁ t!“òÃFî‰�Rð®œÔ‹;Õ÷lV¸¼_Çè]¯:Y S\üp8QÄúI̪*Ñ¿>_ù¿oF1h>¬Ý¥ì^@¼&—£ê@üç#‰iXOÅF=©UëæzˆÙ:øö½ƒ�žR¸;ûòb‚Ë�W|öÀdEj‰!UŸ¶õèÏŽg4i„…9{'ߔĸ‰®â9TÝ91À!TÓ½h«ÇŒA¨o’îéu‘mpÝ7,@�¨.@ÈGc<ÉJ2»§ÕìþùFëÈ™øukP›3^‰N�ÿûå,ÿ/‰3”—<¨ÃÜhU’²Ý”¶¦ïËWý¹Ç±Æ"¡ü9�NuRÝ9W�{Éê_p›iaß ãˆã7³‰8zƒhG{Í€e q¶í95�wà-lÚ?¦Š¼¤l]ô2ïzqæ,ïßáââáÞÔãØ©_­ä”'!¹ueʺ¸cU¢žPâ€t(ÂÂ)„OôàõQ¶¿þ«SX»=׿WQ[üV%~°-Ýh]ùØÓ³U±c¸Vú–´âÿ^±Îd)錕¿LVgá´¥4hÁAøü¹%rk˜ZSc™Ê¾$ê—Ê„oÞO“\~ {i̪ Ï6ˆxQ€ãÇQÀ›qG�¾á!âBqòEÀ7œßü¦ÁÓz\ß «¿vÛãä\ãT¼7ÜòäíêµÍÁ®vV1‚7¶Š�͹™ â’þæ¬Ý– µ+ô[—'òó6›ZÞøG#˜Æ¥hjAõZÔçÉ* zÒž¾A³(Ï_²®ðûw0[‹Lã$`«AÇo¨D85Á0ª«¥) ­ä­ K®š…Ï7Ä åhŽF)LÀ±0ˆ0ö �°ïNvÎ s"/ãÔªy}>øA˜}ªV|D‚£µ¦‘AÃIpIÔg9ŸÑGL@}‰æš?›°Õ/ψUp¹.Š{“I´ ¼}l1‚Æ{¡/–W5ä¶ÊL—ó™ÏE%À¾O`ŠM7Åëj.,­Ý„6@®^;ênYiJìÔ5p²×6Z“..+P#«1Ø Wß9#¶Úþ¯ô>ò”’²Ý¶®‚O­®U\™Æ™k£.9√Æïï+9¤0øg­¥æÉA Ç¾ÎK˜ÑÀDTÝ^Ë ÝFµZªGª#2ieÚ“ºÙ¥8Xra± 6ÆèÁ… �(å¾`U‡3¸ÿ纺ז—/óùÌ‹ø…nIŽr•9 jåYÀN}Ý&PÛÍ«Y’QWvÊ¥û�Üž±Äìm5’²BoöMTèq\ØÔÚRçqPØ#—¾ŠU‘ A�žníÿ #%„a†•u¡äŽîœ`ÕZèi¼ém$J†>ÑØå?Œ2ÙÛ‡Ò� 5¼®%Ò,Üœ¹6ƒÍˆ>C�ãûùôA°Ê�¼jÂèÝ�<'K·ù?¢Ÿ�¤0rÇ—ÜEŸÛa¥ošb ˜‘Ë Çtæ²âÅÙl—˃¬Øùƨ/ù¢óñéš–Üä,(ídë†Þ68ÞiFdT¯%3�ûšCk<\¾Nt{ðÕýjÌŠò¾é9¥$¿²þOb‡å"�pBtù†Æß5j1éÌ_åŸÕ”˜gc�á9‹7W·Þ`�%XIì€àÑP˜Š:½‰ÉTgsç¾hµ¶^ Î �bÒTä@þ4€fä$EÇK¸89M* …´ëdYˆÃ¹w½µ¹�º>lr�é–S3>Õ¨´3_—V.²`Ó&Ômh ¿„îäåÉ´lAò)Ð�Ç×ò9lôdž—ºë{ÖWs"VÖÎék:¡J§ÐÞ©<_‘Û÷ß>ª,pœÒRP…~·^S2Odw`ðć±�;+³õ*é‡fp|%Â+*!4в‡2´�{¼’�ú·å@á�¾[� »Ê!`#pKEžÚçï Q| ‹jÍ6M„•Œ–òŸ?YäáëÀ·Ôˆ2áLûw ÈjJ2ε5p"Ü´Ok�né^æ—õ¥r£êò¹^;‘ž)�¶f°æ�XþÀŸ%EšÔ{ñÕ½V7ká3>ÑVX�€ú×"ÑDB*n Ó¦ùãƒo’[î‹¥÷gúrÜ2${ë œ»¡-õÒÉÝÊNIÖ᪠J;èA%*jŽ)9žD5Óîz– qÄäK}JÈÝ1„i4KvجÕÈg&á¯a\¬þnS@ñÂ#Z ™ÞÇ«ùNùVµßˆÌGŒâÀ78Å‘ƒ/ý.ìšøéÛ‹å@�0 ,”(‚ÇŸYóˆx�&O]È|Ð ï%vÜ49&%·�ߢ*ІuÎq’ØéVÑ/°ÈÝ<¥è÷ø"µ‚¼T±'ßâ¶j’Y(ãáAú¨;ÈûÐ’– jýbŸr”N¾Zñð‚ñ+Wd½”*vµÁíÅ‹}@«ì§°­6Kãj$nýðBº��}¾²[OöM ¶ä‹çå¡êÔ¶àÌGòÏ QNaŒK²œºf©K•¶©ÌfJ„¼ã ¨Ì0‰UÛ} O‰q9fåpÀ¯Þ)�ñsóc¸\�PDi¿Hÿ‰RSIÉI¹uh|ñ¿»ø¢MÕ DVV:å.EˆÃ? qKÁFMÆ{y+߯¢t.Ž^¼{ke …,é0±>Î`à¢;FB<õN¿èd;ÒÌügƒL¾¹ŽÈ–µ ¿$$æ©uû±ãÅ wÿ9v¿‹•ôÈ—{™æo†@w]Ô„™É’ôåxÜâÔn€Â�Ä©fcƒ1Ê �A_0Úù4j¥ �q`o½vnJÞ›5=Ç…Äq˜ï¶­5£Oü‰lrÄÇ— 'lèA0XN»ÛCóͨ@Ky7¢å�á(o·iÔÆ(�“|™ht}Ë3BaÅ—�˜´× hùŠè,Ø©€³œíg56öÃ@£ÜSú A%àÃS—§5ñæ�×­•¬¦X¸»¸5’’ì¥*t“±Â±Q:>d§½m Óˆ³h…`â1½ÿ/†&’YÁ¿w 7ªÊ§WŸ3éÜG3oyÁ—‚œÚ¹E¨f‹9ƒcä¥×â_‹ŒçIÛŽ 2(’ï¡�I˜={5×§ç­‘Œ/ß$Ëd¨ Û�kãc+Ÿ³0™íá[›NTÚI¼Y苸΀¼Í£¶bºeé„ì­­­”taÞ ’%OË¥ìB©JÂÿøÅ”ƒ/H±^‰Q [¶£w°¹�ʾPïQ~EÈV¿„D$ÿ¶Ž¼?.+Žj Ô“/༠êDc‚ðÿÆ“œ™)¯µý�°tî„ã3d¶t³zé´9w3ý™WÏ Zïg ÔgwN6Å)Q¼+&T*g«P†¹<CS…†W¶�[¶ #¢Õ²@x]ü!{FÐ[«"d¬%U–’ZŠûEªÌçå-²¯ºô#ÀY¶úMQì7î ér_Lô޽^•ÚS#$»'IŽ3R’8¥:p�0�€´‡#€­«oïͦT¸£½ÇV­%~ÕÝw¦à†¼Àæ ¶ˆFê…ÚWyÒFÁýkÇ¢þ-P™Iõf¬™ˆT¾Q-r1† ^r¥AŽùáYCWg€®‹Ä�JÓ(t´î¢¾ØÇrjæOl9´7Åý"Lžx¬ñ? iÒKµ‹:¡g—!Û=ÒUÇ­»t·L”fæÒͼȆ»!éÈ énøÇ=¨"Æ+)TM$Iî¿%›ýà˜–o&ÚÕ’‚b«´úëEVÿ™ð¨cB¤å‚Q¾waú®°æ¨r)9ï¬*Ó~2Jź%9eïtŽÄ_§£ƒ¯~§±Ŧãvïÿµº"J´,‡õûæô2EÄ»ù†ÁîÌåoç£î#­ÃUüø¹FÿOøO6ÿ;·f}GÝáPޝvû´`¹AV@Έsuÿmh õRÎÁø£Â�_<Q|:nTÂï³ö*Ô1hÄst®÷ÈR±9�ßiwØqï>r3¿wò(1{š]�•ûŠí‡©ækÝÌò=qV,…xH8àšÿ–\<0ó³\½ ÏEM-�`ìßߨÕ½EÙa1ˆ‡@5ü üUj…ˆÓZ«j&­\~5<0“GUŸXê@©-KF°SÓxÎOdÑ‘}¤{hŸz™¬›GöØØà²”‘—ï¦pF§]ÍÀŽª'âïú�ù”ay(jk.h S90$ïDûûJj ç–|�Îø6œ iT·…›ó¨¬ýW :äl*}›#Á¯”B\¾h×……¼Iÿ= NÁ@º$ÚmÒp1N=':a¡ü'ìj›2h´q¿fñƒ8H:·  §áÐrÅgÂUå€&ì1mϪ8èOüwJL³èPp ݇Շ[:0¤®Ã|² &Xe®fç]úÆF+ãûØ]�»šþ5´ù¨®d°v[›ÜZôåÓÕš(£…àä?œð“üXID¸@Ãoè›=RêA¤tÒ[Yf¢LG˜C{c:ñ!:™üï=±»Ø¢êúÉç‡�ÕoŒÜé™õP�ÈÃw%iôÂ*8¤.ó xZâ :Ž/â‡h³Iì|ƒÜ§›¿úýÛo–×¾bl Ÿ=ñla¥êï›ÔE†ŒÓÌ4TlSw–9¼&ÓØaïÊ \Ô9tµÌ�ø°ŸUáÞSƒÌ¤4åa¯|Gý,A«S&ÉBò òMI÷ŠžÊáM§Ë�ëqßL®ýðºiÞÔ Ú!QjmúÕ¶’½øa¹øø¾²µ)‹Ú0Ôÿ@GI®ïß]gm�å;Ï@–Ò­B �a8ƒ(šŽYGé�ÌÈu@¼RááPÞ£%þÎzâÚm“è)Œ›è+=&gWOv±mÈï_)Ûv›¢úü2ö÷kêÛË3ˆþu Ѧ¡œ8�,yÈðÔ´<ѽ1´uWG?°qýâž‘®j ª|5’Si>ƒó†¬�™«ÅØ­jÒ–ÐÍ€Ýu¾iafÞ3š7§«¶†ýì#Td(aÄ„6º Ý4ÜtaßÎïvVâh‹�ƒ`t>j#Bà�ëY !j;'Ô˜š.o†¢ùÒÖØØž�¡Ž^rw\?”jÖìæûSÖшJ²…Díú†=ù’x3¡­@½|(Læ ¨DÙ/¯€VØ(ŽŸiçR pø'XÙØSÿÖä–-ʨL�´3®èÉ<½$Š• �Ÿ‰Šv,)�+ì¹C¼ðV\–'O&›û]@|»Às' ÄIJúØ(,| ŽXdd¬ÌÈ�¼M ºz>øþ¨¼»T¡Åæ%<˜—_1‰\H:~¯æ—ˆEH±~µËpö)UéÎ˨V^H^�ÌOå1üšaïZ.ÔS¦É¿È•~”UàG‚ëg]kuù‚2ï9:;¬7“@fɯ±W˜_çT(\X¶^äNɱ¬{ž–YÍ‘øtâc$� œc�v0D–®]®AøîiLšÐÅgv×bŒö®¹eåv­Hwù,ÎÀù�en¿ÀŠÈÎ9\F¤ÿp"]�kÂíÂÆ(=ôLå— –Ñj£ýïc¬¶T¡ø|kKŽkÎxâŘõ¸uE¿X})ÃQÆ5¡”Ç�W£YÓ±�,úÆ·ÃÀC9<+{£I¿¿™î©…â7vÞR~73¤ô’Õ¯²oBS\¢ Âàæ-‹ 2¤ Ë]û Ö¬@B%8‰t ÇíWB¥|ÉYI#&¢ü§”ûÎüû;Xí,ûÝuÐ⡯…¥%Ú> ïÔºP€}¦£ý~  6EH¦á&ºåklý¦M¢›Ïý7¼Æ9)‚QƒùŸUþH·Òn ù«] ‰ ¨ɧ)˜=˜˜q¸f‰ÒÖVFõÝ/z2ÄÏ2£±úu…Ÿ9*,{€8Æ€/‘†Å^¤&™‘ž×‚"7D‘.,@Uˆ5¹é‘>]KØ@ž*f¯fœºÌ¹ÙqXç.‰6ѪºæÌš>Rµþ"ŽÓ<‹Lð ]ì¶ÃSŠì÷�Y2da `IçÉw–ï܈çñïË.ûD€ X_NÀMTà a ¿Ð…Á- ¥³´íù.±ýu¬òãoTt1€{³˜REÍj;jËécC¬¶ 7„�7Ö§ùëÖcø ¼@ð'’q ¤!ó–·ë†B¡y �¡%ˆþ,¢â6‰º(¬Õ`TØóü-‡Šc2&Í'‹ ¾X/­p¤MjrwihxéÚ†]¥�(_PDã1gÓ¾ ê�aéýô‡6q/žtçö?æK$&C}WУ&@5—£ ¥´Ž, d �XrSÇ–‰£»Þý÷Hy.2˜�±¹üÌè>jb ¡(­Ø·Â½xÙÓ(õúþãâCëøbÿbG¿ð;j3�©pÙ¢fŠˆ8á¾Z³]êDm©fíë4M+EœãlÈÒøe¤¯ñ/çùç<*FTLóu€l^Œ>#Ð�Å[ø¯ˆñj�d ÷úãÐbÝ„WèN;n° ÚN\ŸCÚv8Ï%/Q+ÑÔ%v±°Gw§�$Rr ™#%yqhLßz­©;R”#ŽG‹e0—ð€ÓêXkkAH§ÿ–�ÓN‚W$õPÊ,_Õ &hê“8ôL¬ŸùJèû%ç•¢„è?¸äæšêç¡©s0ã+S¶ô“Œ7&…d>LýÔe|¼’$P]_°•ŽûËÌïÐÇ—ÅÒ¿8¯MwÈ�Ï…ì<��Óå"üìå>[ù¢em´šc8MdMbæ^¸lsJƒldË2_D›?†é¯X”îW  úTw_ü8£–U™u¶V­éûET£UÜ;¹„@‹ÿze*¨Óòy E^rBÛùƒ‡ào­^(‰a ¡åÓ8[ú¸‚8Ýž±šO:ðê&/{í«Øö«,.”ë8T ¢3 ×–б&¶´*_2+DŸ¦†<ùéãs;•�Ê'c¦rÝgƒ9Ævw–/Ú�—Õá%Ί{1P¼šðl~ш<fpó¶ÚW s«J{µö笜wT™JïÌÅü€;ärd] 0ú1èùWih×k:Ÿ6ÜK¶?>!½¡®}ŽÙ"€Å*ÐUï ü[…h•Îñ Ú¦h²YW ”�]ù„É‹éQ tÌz5@$¯ˆ©C0ÚÁŒ±;ž#§{ΚdW–¯K!>ŽZ¬õ�uë<5?ììÇ|í]s­�©ªh­?wàO£C–§oØþlj£c)‹g›ÂË©â囨£B²Ý.Ÿ“^¡îÂeÀçd_ b�Y.ô fyúA†Ý6m¤®Ñ÷pð6T�̇³Õ´9œ(wi}PÓÅÊWò9îyYgõH¥¬l\ò:¨xl…ÓE…Õ/>ê-&w‹h¨E*[»¤ê“�oÌwÔkm�Y¿P(tÄ6+šÅ¢q_;,´L¤5³â%f¡ª»£X¨?XS^o¬v-a³Ü™_I8U 1-�ÂÙéÌ ÒÄT¬M ‹dh·üû¿ÓÈS§SoÁU$9°GÅr´>’bÈZÃ;(ý+|Õ*‡Îê vÑäÐïND'³R6¤ ö«’b³ï¿@³g"1¹×BIŠ¡Í›ö)™ìeVó_íAîGF’×bù|¤aƒìüPGÿVI±»ñCA ÑÆ7�cÈÉpŽ�0GD]è<~Í\áMxNšuëìêß^ÍÇñ'`j[zÒÄPÌEo;ý’§¬¥°»X‡Àá|½d}„6RÙ2Ã<Ÿf¶r”ô’¢4 ‘«NúYñ¸ÐvàYJPë-Á¸@+gB‚9(êÝ€C¤™^D.ûPØ¿€�ËýïXPØ—õÊŽ(γ¾6ñ«e~p7ÛW7,÷WõCö+E;¬ÍG·Ö•‹3×hˆõÞc¾¨:’èšz2ôˆ²ùÌZâ¹|@vô؆‘Èä)ÈKÕ‰mwÎ$P²œßðNMãt?舀 B0• °Ö_ñH¦sŸk¶±žZi8ýoÚo¯ġۃxä÷Òæò·«ý�Ubõr�$Äÿ]ÔpâAÆ¡÷ÈÚo£.&KÛ1½!°n'Á‚v1zÿ‹è“ˆ5‘ÞœÀ°x�EL~ˆö|„* €33š ¶�@µÄÐDè´qNÿ®6ɶ.6犧VÑKÞjÜ•ôÃ_À£ ¬™½‘WÉzZ•ìfëk©�û9’ï©iª)`R ;¬:Î/¬º%PòxÈk³j0§EˆÐ &›ÈF)ž­ÓÁ ÙøQñh_7üÔk„6!’ <à©ëãÐ,TÆmÖsÒ1ޱNYL}ÁtÛA¬BÚ²y�÷b3ÄÙy`Së*¼eøAÖý½QP³ÑÝ,Åeê+ãB|K‹4�òÛy]ø~Q^¦ hãôyv#ÂðæC|‰qV‚8Þ�í\²#Òñ°Ädž˜åuŠ_e�|‹G”lÂo8 E`äÑåš!0³_^P)Nó•Öó`g“Aw ?©)ï^Ý»„9·â=\>KªO1(!¢Âù¿æŸ³ÜÒñyÑ|&`‰eh. ª†®Ó™þ; ÖÿV¢§&zqü*‡¨:䉡Þ^�+#|ãC% \÷Xi_&@Ξñ?jðCà¥Îi˜m—õWe ƨ.ÅXÑàjl(ܘ¹HwàDѱÇaVŽv6”@r ÿÅhôÒ‹·×'ìÇãèë7ÂaNØ€+W J™ kNlú\kðÉ|NåœÛìÿ"Ï-‚x˜8óáƒ^{î9×Jô5‘á€uëµ]Ó)@ë÷Ä æ@ Ós>öq»Âípè©F7d¡0Ø~ýÖZ 7™v‹Ÿ®Û͘ÆÑ�l†r› ‡¡²º£Б� ž„7Cåwh~�·R:U%CÉvTlì°¥¦Ò†ÈÄR26eoÂá Ë7Aû×w± Í1è.g¥‘S€’k$�aQ^}'Ö–Õ‹7L™'ìø-0ʲE >Ö_év¶—„Ùì%¹u»¼‚Bzje‘K·Ã*Œ}‹=¤�¬�ÏŒyf>jˆ¨,—r/fvRbÆLÒ{Ç× Ú˹i$_Ù³ÉTµ'p‰¼@"?±�%)«²QÏ 2“ê#·Myz7‡bxp†gÿ’=xÞ‡òz' 3wÔõ´õ~öc´‚=…·ú®²¶zƒW5DNÒÀ\(«…m› r&p 7^óœ|‰$¡Ž“„ú�—¾(¦€âoËÿ ÑÍ °]&%ÔÎÄüt{�S¾ I©•òwöAá…æù�nƒÏts$>vß‚#�&õ³ßƒ‘Q£À ñÛ•1#r\Ž`iÀàòZî^{ [#siÙ™\|î wöj¬½„ò¯ ó2S:ËXO“PH,ƒ­¯ d¥´¿€ÂV–üûMNž)²„jËØ)G'l9qôTA~·ÚÕî¸ÿ¨‰Ã�”«¤X]Œ].ÞâÁsLÜëæ£ÀdªÆVTà�Çvw•‹ÅjŸºû�üà¶‚F_,6# #ŦGDv¡ã¯�à ¼÷‘%“ )`¬@€wût €xM]ÉUkÒ3zB‘ß�Ðå#JD\l³-t½é¨Xzpñ„XÎÜ÷/WuÐË®âŽëdެ·,ß[ŒF„‡u!"Ãu- ¶°hÁ¡þxýõ´[WÇ*„ T’‰kS½ê€ v¤X×>l޶1ó]¶„¶9/iòzÔ1‚\Hpe×’úí¦Í�Ü|O4ͧ˞ &dî3½n:Yç‘Ð;ã¿nEh)µù®9÷¯Ñ> O‘¬7�Ÿ‰†²58ˆAWŠÿüæãNÐÄú‡Ø~?É.¯wÑێʧe} {ÄúFNr£êY"å!™vÚܬƴÁXÚÐVÖ>CüUT¶]ʪµº9ú3XoäÕ!ûÂë“ÅtwÜ� ÌÛgæâÀ¢LÖ�åè÷|¶æ@`€"Y�~•�õ*wa±ó|øê;„±g³fiOÔ{|Ú£jXôÞÞ+â’ÄÏïÉ[QBÉBvµsè)öÑ5N©/;°fAÿwl,û ›«ÔTÞéPÛ¼Iì?!©h+úˆ97fI@¾nŽKβ‚@¸Va.¥Ð˜"FQÓ3e|ß¼ EnoŽ[ûó¯rò§Ð\Æ�W²Á¿óË™&?X?U0²9@¥Í·,)ù1éãÆY^'ÚfV5‚ —žÞ ¿8f�úh�|Àn,¾ª1ò�7Q�æÌ˜æ*¿Ž©jt}DÇ&JŽ:“µ&§Õ¯=|‰•-Õ xsìå#Ä™¢i´·p8]DØ).âþ/3)~#DµÎÒ¹ÑñøÛgë@Nk-Òê«©—Áiá=^Ùäö,W-¦]€OãCÖ´søÅXò¬2ŸéÊß�°ä¡dVP"Óú•ÿçù¤ªG% Ú«ÊÊÇ«î½Í(ù䓿 @(#ÇãÄnTײ?äÔñÐ�èû8HB~r)mº /­Ý=Òá5,Ž|¹ûBIrpsÔ¥Mи¤ æpžH÷�¢ýEÃ�¬ f¾—ßÿàÅ»vYDa»Ôg²ÝìÂba"³q">FZ枉ðq*Û�Ÿ÷i$$µP€žÿ®Û�>8ÅVD €Ý0˯q–þ80­³£z%§½ð~µh¥˜maLŠ–“Kpß{$H9êÿ�R’_£�¡ôÃ^˜x�‘c™Ç¸DŠû9r'å8‡$n C ”°X¡,0×Àø•”ÿDI¼=ÞÃM É7e³ÙR¤ì1þA¿óÜ“RŸct_Û*LY�ÀI@”ô8÷RÔxM“tDŽÀ Òšbÿï‹)Ƨ’ôo­'Ï‚úèÁôu#kæÜ� føÉ”‡²ÙÔ-Mìå/vœzÃ$é³xÇŸF!!?d¼&atµã®¦\ú=œ™ÃjÖÍD×Éø[Òèm¼W¾…εÓà€Ô®½gþÓ‹$JÓÔ·mÌçrÚÊé» c¦0‘Fm+ùfÎ}‘œ‘ Â9s„²ï–ùE�rUcV |*âÍÉ*R ˜E!�×¹Šƒ8aDÓ#@«éÚò¬I¶4rÀZcdª âR FãLÉ€rÓŠóºR»n‘Œ {ÀŸsñÂî·«¢ôoö+wÒ5ŒÝ„ª£¹¯švÙ]\×Ë~¯šj†Œ%Ú�tÇ$\cO?Ó¥VØþ/ÉT§à¶ô¦�†_¼ÿëØÚ­†LG6\Ƕ¾à‰l1 £a¯ü°–c¦1ŸLÂ[T~ùƤº>¨IÇ$çÏSË[ÎC.§�«üµÜgI ¬%”S(ïQ�ž¯UáðÍ4ݱ+Îö°Û~b¥ÜЀ-ÎÂ{AÉÑv|âž5 ï£ÃrOXI´¶x/.�;0Q#‰Û{P´µà9 àmxªî õ´&Õé H«•µ²k9'_ã`ó*Â_oBì¡(‡åÝ'ÜxX�>?¾EÑÔbx$4ú”†-¡ ’ä—ñèõ›�¼p\fá"sB�‚‘Âü~‘‚PðôG­¼]©]Y9ÛËcö†¢ü”ÛšæH�™à,Ô2Ï‘„uìÃa–Ù>'ô@ùø¡˜òªß­þÚ ÛñsÈ–#ý›ÚO)ó+yjMd÷¢�MtæíÁ{# UÄ^³:ÁuðZ� ½ÚÖ2m¨“2Ìv"ìÍÀ�h:f¡Ó~_¬-ý7�ªÂÌt%¨ïa­)ákùPk‰$‡‡f[� ˜~<ݳœˆ¥ûæ‰\˜î¸ñª6‡Ò8`jì¢ë}ß[è]ÚÈÊ3'Wš}æ=á -«¸Pð ôJYè/\\ûr7¯-j¬™$]Ü�á +Ъ3VÞºº�8ß82Þ–EBh*3]T(A­äê–@F¡û›ª¢‘Òy"=ýBç‚ú¦›A—:å{] 3TŒéOÑc\šÐÕ#ñ,srUR‹�Ã!�AÐ�`²+Ñ*âêßfšL8Ø=�çCÕ…ñ�jh^êF“Þa¹ÿ°m%¦ŸØbo�xèo®ÃŠç¨j:õ©öÕÓWå½ôþÏn˜½sÊjÛ¹·÷u­t2É%Ä8Â6ãvžv0¡Bcð4§mŽŒµ; *ë?'¥1ê$6�‹wþûMÛÚ¯‰Õöç7ÈM×Ï�LJL €D“* ¦÷¦ª‹ÒÎöþÛTe” \@/K;Ý“�©ósúõè{Ñ U?Þ+©Åª”ÿ‡èxxñ½ÜuûBð+„ÍMSÙ¸³ôV4©ï7sÛd×E~Å¡£2±?þzR{åŸn3T-ÜÆ9œ‘ qCtp‘ö¥Aw‚%MH<Ó,mþ•óƧÿX}QÓéU¸)Êú’Ñ…aéÖDHàb;žeªÀ¬IL¿Þ¾€Dð>;=Ä C¨š�MV¬Ñ–þ?Î�‹ÇVÉ¡6Ó’0‡Ô <Êþ­sJNMÜz¢‚“7± ” èo•/O´ÎF-A"q˜Ò¦vM¯QSD/u’æìã2I>R`¡›ÊSF6¬Ýß»s{?¸^èîc/“>»Ë-Çjdú\ÏÈ¡-åÅ R�Ù‚J |š¡0|­ÊÝd *²Í'ßÙ¦ ŽJÿòJ6ߤ67iPïð!ÛÿnU¬<÷Þ_ Ù°š½¼›­áUÙ®òbvÌ�:ØEµ„¶k¬tQ$7J  sî²Ó:ÕÌŠ›5óñ›jÞî$^¯’Îà4)=8LÓ�îÙ,D¸b¼Åé6˜ÐvV˼Ø}6¡¶É·gµèñoá XQ&¶öæf U¬:8ˆE—\$ß+zþ¸9µ¬Åù¾€)Ä´íF0½!*b¸-¦™W|p~Õr ØØd¶os»ÒÁŸSëf%!5™ƒõê‘EųyîîNf¨@šIOS€–Æ;.bÿ`üÒáf9ãîq÷%Òøt)–•3÷~xK¡qßvyÊ‚â÷ãë×Ü Ý%v3]“b†©|9iz¾ê«!ÿª[žÂ=nºb_ôÀdÒ30)ÙzØyâ̵6®Éåm ½x‹KÕòæ ¢ÚUyóI%S“ÿ.Ý¡ ½'WòîÉÑq°+y¹êsei�__[|YieˆYvÑú¼™^€ûÔw¦1?�E™ú2E×D¨ïäzfu’{"V!P›YwqãÝÇ»1ü{p¡¦X÷ófÇÿÛZx$<†3ÿ̼w+;yÚ|´t”à²� hÎÝr�rݰŸ,5B¢øáÈÛnŸþÑGÖ5t rtlrŸÅÂñe%|Sé.æ%‰Ö�+{ÃÚJgýtW1:DluSÍŸ.”—ñ Õn¾|Ú¹*5éæÎ¤uhC‘2¸Í#³ÏXó¡c3ºnxíD Pö[^§ö ûª—žQ×ášT­¯ê‰®‚‚¼{y:‚Ûx«ƒ¹QMÌÎ1ruF±>ýcÁbxZ×g>< ùZ¹×©[(äzØpÜ�Nʱh‘PJÂ/˜Šïæ6ºßçäø–LÝxV¬¢~Ì £Ñ�.bb'â~’zßáÂï°s#ïò³=O¾»…€ãìÃz‰ÆØU�fè5Öºq“r‚Ùtf‡Ó ‰-–g\ê6�gý•V°ìšhoñÌ¡1'´H™½k‘2{§”Éýý´%¯¥è\ŠHž&6¡ µyê~ƒaH·¿]uÄn®å„Š× M*ÄU"žõ Äyb˜‹up¿€;|ý8ÕŠN‚ŒCû�¤ã {)r¡ÄwÆRÊ0RSL,æœbý£� ‹H‚hlU»‡qÝ0SÀf¥àÞ_�«A¬êb½åËûDåk-¤x•j¾œ¸Î8¨Ø·¥†(5K'e2hrÐP =n!Ô´ŸÝ­ÑêªÅ~,ù/¢xôVÀŒ ÅĘ0šBVëðêÍuv ò4ɦ«æ,ÅÉ‚S3„Á’ÆÅ]i�/ß™Á.}ЧÇj¹û…ŠwÓƒ½”ÇÔ°«‡V—# g�ër·r-Ó|!ÿÊC(ÀG‚®]ŽS¢ézEÜU†�×È9Ô2éÊIˆ¿¾»Êå“zDoÅ:Ë¨ì® çòr„pȧ¢á['/`ýt«ðì�EêˆR4e!ªcuÒ!åà�ÖÖ’‹4Î]À¸ôê¥f¬kUáëý´k¾0ž§R£ ætꎭ7¯K ÜšÉlá²7>’/‘°f‡­ž³˜mA{;óÓE¥¬u)ÞàDÑP‹žëN,†þ:„çˆg|ê{os½‹ëqŠ_o,;ÇhmI …’¬j±=ôÚ0Ž�-QÀŸå9w,uâÜÌ<�8g�‘ð‹Æq(5Øgÿ.[BÔèpËùòȧ°Ç3]÷ñiµJ,îÁŠè¥qpžITOê‹bÞ…ªuÁ4¹ÍLÎЮÖܽñ)Ñ�X~o–¸µP”¶E³f¡ØŸJDI&œwØ´èÄõï¡ÃšÏÉp‚öˆz¶ÃæãMg+!±ZwËvß\ôì¥Hê/ÜŸË~ÝR2v\]öð M�±(ê¸äq“™UZ•Ô‡rå³qW&éž{=øNìä2s†uÄ™ì( )ºÄÝߺ1ml=éRýðXc|F}/±Ž1S€ ®“HBó�Ëk´O �Õ{{}_¸¨nßj´W‡Þ%ƒI›ÛN1·wç—«¦Èp"T§â‘qBƒ5âà`ÍÑ�’*¹a¬¹ÄµøŽ�Úsò.†IÌÂk; œ¾ZÖÆ"BýŒD„æ¼.âq­Aë>wЇڻçþôs2¦C’WHh¬ƒÂ‡8�eèt„‘öp£“2þ’û@+HÌÎúÿ£¯m@…Ð÷—O« ½ÁŠ6¿Ž�V{-«(�®Õ¡eí[ÈP¡ªw^1¬5Árë°™Hâ|àÓ fn:üE�n#UÃóhmεýç9}EõúRrm$:ÈPb¬týßሚùì¦5Íñ«q­Œ=ùà¶”ô3­ÚÞFñK½®Ôã“JçÀŸ’ÜfÇÜ'öÚšÞ½t­×Ý^V5CGãâ Âh7‡!óÅ”÷4ÿ$!�ÈZ-9Ú9mt­î=yŒ±ó %�å@­®àC¸påqêÏ”°ë€Ì{¦m€ z”6S@;ðO”Ó°,­9°‡äÃ>BJýR F;uЬU�ý@ Zí„4ÿä4†Z–Úç5 º 4¬“ÆcÁ¶³ŸF�®¼3ðìTNG.ß|48’m:t– Ÿ±½˜ªVûŒ€£'µ^YféY•AÞwñQ« øæY·Œ«–ЧÏCi~¬ir¦ŽÒ; ¶Ð7. #)ió~k-¾)©h$,už�Üèl+V‡�É™¢ä‡ŸºEüþ€{&÷l0ã>,‘F1f®Ì­dLˆñ¾Â"î´ó¡$Á3¢Õ«éöF9£~–½ÑºÙ}-·É›µi•–´Á5&9¿97q¾e—!ôÏMà‹&TW�s¬îc/ –¯™âõ�$W�›mÙö¡ôÇ Í¹Ï ó…QÂ:–ÕÄá¹L‚dˆziJ/‡©TK\µô‚S%í$e¾!õ^¦}ím#ן¢ :¬ 2® D"�0YèÓA<ñçF½¥Š 6 WÜ]>�wÅï<ÁÞÒ^—}×k;ï;.¡…h̰ NQâ&‰D±�z‚°Kþ¥Aÿmâe„†E.%my‡R #©;º‹ X2ñB늃PÒ&FÙ{dî†)Ð&‚Scƒ/e¼ÄŠ=².à²ë"¹� ÎŒRJ$›ÉÃ9÷çÂ8‡—„›ü›—ÿ9ë<ø&^´Åä“°2_£ž8’ÌKÅÕUyä�ŽùÑÍYÖãEïùÕ QP€m�•›Ö$7ä”^ÈÑGu8²4¤?Ì©{ 2zUÇjÆÒy³ dêü9·0Þ\%E:\�#ª]Cuª�f2��ÆâxŸÏ1Gjþ±x€�ûo æûÔnüe”ÒÀ"ôƒŒ•/EM¾¨hËJWk¯†¡žHÊ¥‘ùíFE�?ºÅŽœX|Ç\ƒVZûÍë3p-$6K ¤ªuÂ;´V7½ “‹xd¿G; ¡šr)Öôú±5-Ö&îO%’ª@z;ý¨¥q‰â¤èrm|-õ�†!5¬ �öº¦O=Š•&_2n�›¨,ìBö’V\ž›ã1Ÿ rèȉFDYRŠV9©?+j¼æ‹z‚;ý]ƒ=Ì%]°ÎfŠ¡ŽjþÒJË“³|f2i„H†÷bÖ:�V¥#yÃX©²=$¿ß–¦~ÊÑÊOêìî`ÁIÒæ‹@÷FJ1£¾8èØH°|º•È0Õ©¿ˆ7Œö8ø\®ÆmÞN;ÂaÏøÕ(ÚÅX+¶Ä´ËØÏÍÜßê¹—I'º†Þïgp¼*9uÜ-íºTÓ?s[Ȇ§ÛÑÞ–W£d•²é,{T‰¨KÌQ�óšNþÐV}>nùhúT@Ù€©Ñ‰VöÇg™ËƒyÍ$õ¬IQPŸE¦"$‹{×f)Q¤ª*¯š¾Hy4ÿ?³}äjkŒ N}Œ“.]G"²SÐáSÙã¢Y!à¾Káw¿Ûžûáu‘³î~ PØŸÈmÛ%õ,®7¸: „÷ezA‘w’fÝwÁs˜HŽ4žAd"ÃÒS˹æºI¡u†“ùµÐ/ÛÑ1MûOÄ8âX%À^}o~㪂XWO‹\6¤òrè»YÉnH¶“ …)&OÐ �_ bV|Ú£PKæµòJ‰"ÉnZ…�:àéìŠEÀ ´s ¢ãUÙ ®.Â$í¬˜ó^E/@‰Ú8{Êm†‚h ©ÀÙDzI] Ós°@9\ûÉ3Üó|àµèŸl vŠg ÿA»es2<³„í€_ŒL²ÑClýœüÃV-̵֓£á^® oþš(S\›“Ñ7+ÏÆ"¬ žŠô²É65UWG~:-"á�àÅÅ-ð¼Q¹ƒGü�Рt5n�ñ»| 1ôë3#�&d¥/©à²iW+Pb¯Ð+šÄ]L÷<¥Ê ŸÚû:a?®#—x¢5i<1²¤�Í¡xÕ�K¿$á�<ÐÛ$›0ø¯Ã“"Ýe ZiÒ&¨¶ÀžÏ©�d´óÙçý…°»Aº02Ùk§JÞçyEý¶'÷=~vfTkpölŸåÊ4£ É„Ü-͉Ä©'ý9· ÒÆLе¨tVýÌ„I  y[ǵìÉLÌà …=‰æeao}¸“Àé!�®#%F­¤Å%’@,ÎÓ�SŽ%"ÔDÕѰÊw —ÀË„¦½G(VAc;á±òà w¯ú®Tž°ø±wiýº úεèÛ÷~'ª@ÿã×5‹&à¶4úŒþˆ‚·.iÓòû u…°k°Wa3BÐ:Ó,ä÷&ÿŒ¯"©ò¹n‚´þÂã>FÆ‚§õ¡¯Ê·’Àú“Øþv³;;¤Š£„&Ix)2ÀÇð rã&ÓÂÄtB«6áòv@ÔPY ö¬ê7hZo.¤0"ºòÚéŠ�Ð},ôP\.;YûgG0j�•¥×™D›£ |ª¼Y�™Ð|Fæu¬¯[åÏ/ ÷xh›Ø_›Ñ¤Íý:¶P é$Ë@Dç~Ó Ý>lŒ=$†Dž±|ÂzÞ¾„6ò öïÕï.€A€îôˆ¸\‘f¶îvp„ u÷÷ëËê{>¦A’ÙxÒ�‚(æ4ŠPƒw RbhÊïõ> ¬• ÙÚwîäwǘ´WH²!ðÜY¸ªÊûü K´?×V~P5¤T¨Óbgx^Eˆ{ãêZû±!©vYµˆ‰ï[Š�TÄ·Ñuï$Î!Îl”¨¿©×ûN‘G–6愊tï­ S°þ)VšòÊf{ÚfÝC”å×\›ý“Pÿ ú$}¸Î\ñïzn|ÞƒÂöŸº}QŸÑVð1¾¾3 jœ �%Ί€ñ…ÆÛæÖ>¿}óØQâ”HhÏbYáŠN?¦AjôùïS…zl¿!{ô”MW{¯�ý¹‹VÇ?9Z||-/«eônT!—Hk!!°fNµ=ò. ÷cíˆ4Eq!‚ÑÞu–)À\YëÈ�+þ¶ï´µ qó:e�Qã¬m€Bao´eðª…óÉ qx(,\ð±Ók¾¸á“Œ�ßP^<¿È³Iúõ~ÿîf£%K5·p‹³„ S¦ ÅA¥kl˜š2 `™<.Ü1f×ÚF”È.áJLMczý{¯4­æ$<²ÑËH!Û’I– M»Àº:IónÏ¡öã/!šû8›4@óúýeì´´h©[/ÇtV}"ë¬89Æ÷Û‰=KC=¤åØ*Ú0Ü�Uà†OÃñVWf(\²wù¥=ÕYè’¦oŽªpîœ|ªzs¼–¥B_5ø´hØvÓ8šÑ8P=IàO_†0�ë$ˆoÎ?gdÿ}± ƒ:âk?Ð<‰£Í®rÑy7à'ÁrdW³¡Ñ¶ä릮~÷wËä„õ'OÛœÁTuÒ«ppB¶gP_¨3ËùPŸðþָΤRIõWÙË"ká"™J„§CSÏ$Î ŒÛÅè0*xi¬�“ç�WàóT˜÷gæzðU@CýÛQ³f5½&¶.næ Hj> Ô¹ö«æ. g�AÙ+’‚B[¹aÚ³™|Ýo&rýSlÂ5´b[¹Th‰wÓ¶#•êÁ/–757…ßÖþ•.F�ð ÷íììÍrb&ò¨ZˆB®éý_èQ®� ÌëY^»úª/]p3½z;€8' ÈãÇDè¦çßõýµ7fù ÷À¢M3žC5�>Óšë˜ë¨Y_Y†ðɨkÜGQƒÈÇùŽÅæÄà°‡Ò¥û+©0#÷‰;OÄ1¨[Z–ÝU 6ïŠâ0U‚»™&w”Íï9�14£ì51 kÔ±Ý@—†�Ra¥¿›uæ± R�)bX.]û¼UÑ®†š"&Ž2r„bpž¨ÌJþß‚¼æólÔžIu0ØCOX,�È¡V¹D½aeð†|NÍ©<�Ü ót¦Å¡Ñ¶äÝ`t\,†Îj›H0?MÓª|³÷?c§×{ZšÎ‘ýû=Á™ª0ªáH½|�„-v¸4X¬—«¿jPòúþ½·%)õ¨5í<í°f¨�ûL÷�%Ú!�ŽOž‚ã¡å´&%�/«WÊÕŽ*N g{±MžÄüE¼—þ�¿íšÂ…Û Ø�K¿$(~Û?L–¦q Œ�=»ËЦ°Iy‰0ÝqP@Ç?²èÝšv=Ög'—ú›;Ñèêá*áÀ“íåÂÏìî�[žI#¶þO’zÀŸä»‹JçgζI~„ѤÁ]¬,~r.ðƹäSBˆe •˜•·gÊ¢š¸gôFlg¹K–¬†ª;.õ�øÊfe’WÈ×X$—êUS&1ò–`ë[(´±-™p•¸‘Qý”[ÇŽ.Pð ³öÀ'6ÔH©ŠX�+IëðÏ¢H(YñÕ�øLÙUnQÖ«ƒ]õKDDLPFîÒ¬RñÅû©è¹®‹2R†|‹ƒ=ýCQa�¤[Z¸œ/d¡›=¿­;v”ßÙm¬Œµ�lÂ$ÔâܹQ b$¤éf�=ɲi~ê¬ô—¼�´N¡?´– ‰+'øáíäG—PÍ8TÉ}�l7÷ìR+´§0“ÀW>¯¶Ã¼ÒUJÇQ5ÁŸîAÒmðNî>ˆð´öQùH[Æ è×Fd�ˆ†ÛHŸ¥_5Ž#‘ñ!³Ã³«˜ty¿o·W/OP�=ôq%Àòá ÒÑÈ[>PH ÓW‡,5ZVC½8ÌÍ<Ðõ�˜AQ�¤Ö_¦�çU“'Š’ ”Rðá®öÜĬBW†[(­ôcR3Ä·¸AýÈéÃq+FìcpÑÒŽðVÞŠÔ¬6D�ëÀÄx˜®…zHÓ'’îƒ(çC{†o .´ÉÆŽ°ÐäÅÅ·?:— ±¾ÏìøõC¸ÝÄéËmÜ­l×à½IÖR¡5PK¡²Q|hòoÀG÷ðhÑdgpt^1¸Ù ä05ÃDdºÔ\�ê•2?vY”Â?=ÿ=eùMQ‚:ŽQO»Ûù’�·å\E¿°¶cŽ'•ºV•³vù} •-6DciS üˆñ½ïÛÃBà-íwã}÷¶í¹PÐùî²’h¤Ðœx^ºÅy:ÜÔ¥ÆÐ§ŸN$Ç ’p\sØ=øü ¡X}Oö|ÒÚN†ˆ®Ú> bï*ûq€tÁGl¨2°yŠ™.*1ùX'ÿ/v×HBŠ ) –1q†¥¼–¸úsŠw¿å"/ ܇K=ÊMü{7MøeìòÕf~([u¡Òk¯0fXD m Ž‘cyK¤ÄºB½©É}XGÕ¬@àu™yk×q®<š›€Ë_”c[JÒµíÞP˜Í°îcF�£«Íö4¥±#%ÅöÒæ N÷t$Rs˜åЈ 42‚×öÿl zü63`TvpüzXÒpýA+0<¦¢‡Kú¼GÖÎøì"‚Ä{5ƒ¸V)a¨hz¤§~ó<ºe%ûÖÕ=íèjïé¬ûºt¸¡ŸÅÕO:˜Ìs I²™ÎØ¢$f|øÎ¡�ƪû’)’åïœÕ&«õ!doöL[XÖÆÝèa@¤œ…ø¾óÌzöÍB}˜D4 A h‚[$ŒxÌ:­]·'.p¨* aXµ»ê´F.¯ÃÂ+gžÔTÒd H�*íôûô®Ž)ͪNrW Ž,‘-¯Ã¶qÀ¡Sÿ@"ÿgyÊ”¡oÌ,9dŸÍeUpk¤lÇÄŒ¶ sx[¯Na›�aO&_׊sp<§òƒw¶>bøªŽ¨Þñžþol�3«Yöµ:…Z+²FÜA²%ÏÆs�ÿø T�ŸŽØŽW«Ó“´ç+5á°ßõÿç¿nŠ2/¥z0ÎcRš ýí×x®¤21ÞW�¦F;Mý¹£e|c,Ã�SÚˆOÄé£èÍ:dÜ΀0^#ßõ¾&¬U¶ºË@”ôOG0©†¡¶Î.Zýϟ,'/Ž\Š�²¸êl?³R‡{¢hNnÀÍÀ°Ô3Š”—uAÛdÿÕoR¼ põÊ^}€+wkmva£˜V¹ÒdÕèÀè 9žI¤•…àŽA4¦œ³»ž›Ú™î¨+�6ê@®Eô‘Ãk™‘†0æxpˆš²ÀM¿…Bn׿Nžeiìy'ÕHœ‘F ‚Êþ0¼§±@t�æ±’j.˜0–Ŷ6h(4¾σIÙµ'�;|;F§ÄBÚz`�å[¯¹°í¢ñ�ÆÌQ×m¨F+YË \ñï�äóíVäv嬆¯O?ë†q19 ï$àølÐåIs¶é*�~OVN#â·-„Ð~’ˆÆÐáçÊz…=9˜K(ѱmñÄÈëã—™ëÂü I&|HM²x‡ŒñÁ¢.‡gþ]€*b…’²‹;%{qGSHö£ë{ïà)S�<�ˆåz±õ|õ?FЍè �>5U›ûÖÿc–ìe&ÞçvºÎÆñKæGAð4Nšz¬¬S:ÍÎïj‚n¾Bgwê|Ñ3 mÁd¤À@SÖq �G‹øì¾Z<‡¸<$Ë@º " Üž džükæŸé‘?P¼Üò{“üüïWh�¥«SÓ0?OãGïE¢ô5ÈžISrN.ÍO§6@׌í£EÞ”Ì®Š‡àm!ä6ÆéòÌ’ðèxÒ�T¯èwI+X„Éô‡ðÃnMe´ŒÝâq6h‚¹\5Ëp¯ö]¾Õ)–.�öbÛ¿À�|ýËzœy®f!«¸’_#]`’_˜®¢]©lDwQ™p P�Õ4VRNú´Ðk¦–VüVÓƒO¥+)Ú‰.i4gZ|‰‡È‡œyÒA߈kçËzñLô[=~&™ ‰‡UgïO&v ~§ë¨7¢÷0›ˆf9ÇR,1 VÔ°³m&%R‰]/'Gf)“€GMº%�8ŒW{&íþvѾð.J‚î�\Ê«þÌ%Ǥ>œI„w€|œ E*�mµê| –IÚëKÐ 'Ç—ÛªªÊ­ïTîÝÕV®WIhÌ!>©ô¿ÝùKkeòß"¨ä›¤ä‹j~ÎSfS„½5�åL%¼íˆå#þ9´˜ øÒ³î¿˜x±AL]­Úáo|žY Óø{¦sÅïñ Y–1Ü>"wOñoc ©Ýšì%n;—†IÍ…nÅ�N„2~Ùüô'DÌÒ-÷@&NÞJµé{Û f� ËhöPp¬ÍG}¤u�7Æ8®Y$;UØœ£ïƒNª¾�AƒK™>‘1ZS†ôCÀê=éËIn©Eèôupº½d*]À€¡êE- /²˜¢[—ÁÛq$¾FºÀ9$ÈÍ*rÑM¯W,ò~=6G�éúʤµir›Ì¢“@=ó®–%d‰m~³Ž Ÿú8 aŠp FìܬÍÓƒ¼Tæx¶Ë"Zã(DéËv»M âª8]&~5wmøw·šH |a‰ZRüO‘5°A\É©#åig�j²�æsmmµéRÉõ³ ér�`˜¹H+üB:·GZô�Z·âý†nþtšÕÃæÙ%)ö¬¼à×êSÄéÇy\"ÙdN÷:heê²±Lë7;½ª< W^¤9_:3T²’Ñ.ažLÂÛpY=¨bñ²Ð± ]êѬH7Öº,=åð$µ¢Üå+qU×àAgIbžY(ÉÛ3Ï+�@]RÈsmè’–oç„™/5Ì_~¹~½ö‘3ƒ“BྠG'Qaï[S�ªMݹ¹†–õ1®‘|ª�„ïbŽ‚IuÉØ|{<Øá œé²h‘�=Âú;J4¥…ì h~‰LY$¿=y‡dŽTR’OEëÏ”åÚ*Fn¼`¬û³_:°I1`×~â*r0wÃ# ÿ¸NS‘šÂÁt`Ö›3¬î´Ä¾ˆ‘+i@\þË*dµ ø¿Pßü«Ïœé^¼&åÎÿ÷.R Å~Õ_gؤ=âé‰�‚¶•b—ŠìïÄL]Á ÍF¡OJÆ&ôÓ}>W€�ÃÑkQŠioîhVV¶Žº W‡9$cÏN3×ÐnßþL<3)p�r„, Úç*ÊÝ‚;³th¦ž¯}^]2&‹:W!i¹¿+*ªë9 £O«§*» …¢Tz�|÷³O;ìúþEñ&Zèú¼pB˜Z/¢YUžêñoªË? ˆˆ~¥T¥n3Š=3Å߉ˆðl¯i3V.œù�=½’óÛC Á =06ò›�Õ5‡6µ �r›å’¥ÚÐà£Öûó=›�<#~¢Ð…àçÝ»»�BH¼å#†ÿF7Øwuk�§dqøý›Â`7Ï o,hôDÛ¦…ø&EzI0ÿ¸¼¯ÁâЈ‰«Dä),Åc Þ£ñ<³îUõë±ÃTd-ÂZ亱ª3®&-¾€$¶�=Å0¬~Š=÷h(FJã‹dwòSOt¯pŒ3ËtÙ±Ëß —6uÂÔô4)æPö�suÝ¡‘Ýfi`"^Möb;´ë—,‚Ví´o;á6G8ÆMÄ›³{g�ÐØ”õ†¨ŒbT ,èú�‹‚a–ÞÌ�;)¹Õ²>\áN•+~+*އ‚ÿáq�œ¢í(ƒ`~ÙËÎõEuDìOw ¤"W¬lå Kͽ#8hìXF¶xôð}£m¯ñbIºÃNr-CÇÞËâJýà,'�ÛeX æn2™°?×�mÏ\|ƒ.•ÖçÌ” ¶×WfÈ�&˘+Ïu<—xÀšC¨¥ DzoîeÇ�ì›e\À{éeÓJ â]žÖ&dK§o|Ñ—²fî>Ü4Â:EióY–&í=•¦Ì‰ÎõrÉl²y›øÍ²SwrÌŒ´*KJSêåÇMc5)¡Æ ðãDõ®ï™é9>c0ªÀM¸Sƒ2ŒpˆÕLÆÝáUšó({>»üæµD&½Û8 ùéC½^Á8üÒ˜!ÄHÅXÕ7’—Ó:MÊü-åýªzÑæ€]ò/‘�ÂMVÄ]*âß®™å¬éYN˜ý¯p€K©cbËÆ�"蜢Õ9Û„È|!²0ÿ îMú¨ö ÌBV>Ÿ›Bw,(`H“øì8Í‹Ò>öcÙt{M°2õ:!•ÉçåÎM£šM¼úoüÓgeñ%`û¸oEK¬j´6 ,I7Xö‘RÇn;±Ðª‘±ÉQŠ·Ya'x×=·Tûw dý˜Þä�“ۊ팒ö�hzÉíÏä¾ÔÎZ�ù/çѳRÞ�Ë›:^Mcˈ0Š£•òý±AHy™¼\3óƒ=¹66N®ÑrȪî4óþþþDCIó�#u:N«Â÷ˇJeÁl�+‡˜ÓͦµxzAå€2œ¼z¬©b·h°Û�ã¶PÕÎA&&Cà·Nxe“;6ƒÜ@qØT+Ÿ°:¶ö`D˜äwÁ¢8¸_4¾SlçŠûö]‘ÎÃ-Ê!”v/Ùï1’ðË*’öɹÕåVárWaJ¥t tÏÊÙ0¡â6¿Ë‚C¢ñ)i¥RÙ„ÇØ»D@iÌ˨‚¤<ûR3Ñ¿TØ[vÁ=ˆÛ· Ú�þ &—/¸Rïj¶N¸ÑwÒ¢N„ o[ÎÂr¯¶– ÷í£î\o±Èƒ‡ü¬Æ1B?Úò¹Ü;t*÷Þ – ¨Ï˜‹ŸÑ¾oO”!)s2¯ºÁ…@V•ìu¸¸Û•º)DÿZö^ÑŒ9°&×K½ò¸àäªôuz_�j%¹Cåô¹ý/� °3uÈñªÐØ€f­!»Lº‘Œ„ØEç¿}i¾} ªÎe!8þþlãÖÖ6d+—ØA-£ög÷}Ì �ò™á$lmâ“-5w¦ãËâÜíÑËÕežoÖKB¹Š1þ*Þ‹ÀB‰•'8báÚ¿OUd¥€Ó‹¡Ìp JÀéÄO‚Œ®–éWMNÊœsœÜbtIolÛ%7w1ÈjMàÒ°B¶N­¡qA»Wê�tàðáf}¶ ÛˆÔmmszÜY.‰Ï¦d ´3\FŵžÉ3TÁÎ7ÓFhq±Êö†ƒ&$™Š{_;_¸‚£¼•�'SåfíT ­©V÷ÕOî9¯`ÿÙú.êI¥•IÉ>ü‚¸$= �»;¦x'Oáš:kYÁ„öˆÚÑ]j¶n8y ‚5ë*¥²ó‹W6­±5L·¡W*o–gâÁVШù›ücØŽmT|3¶�}ôñäNïpàR”iCÔlvT·hÅF†p!öÀ3$@M�º4qÕÎ}¦µ€g/)z® F® “dub§“¡«GÍo¢áëµaÕ"ÊùµOEúýÄ©i/i guoÜÀ²%>mu¬øSiûl�!H˜‘7£å£r{�¢©Ášì~­£[ázp7½~uŒVóˆˆü=56uäÁâ/U¢|w¢öñøÖ–­Pi\Ö~ö=•"Ú?fwÜÀf¥.ÃCÿ8±âæµØÆº�= «ïZ|ŸÓdß®DhÐáóºýsY³³æ§¬…ŸÇ\Zí_¬}^>(çV€ÓV#_’œ™ßAš×ÈÙöÕÿX>ïz—’‰ ŸI4$ÝJ“ìF>isÝ<�|…‘¼0m?.É‘>aÁ÷Ã1=Î(ºÙ«ÌHgPŸô=^&çÛgN =›(NØI€_¹^LhC¡´Æ¥   áÊ0?WÚoñ]•Q��õñ€ÚÛŒ­V²"Hq/�Ÿ©1ò5˺϶QIYé#ªLâIúW^g; –�^@&ûç�ߦ:FðÁ´ýOêûCN‘¨¹n©áÓG‚ò!¢‹³x0™FA[ˆtlÅgOzM¢“… öŽäýö%fÙv¼êUEN¶îg‰zIÚĪ».D pk)ÖéÈy Fª2ß%ªƒ?­$–ëýZ/”×,fQEdÛA£`ÏŸÆSqWTŠÆÂw�ìe³¼ýWµê‹uÓïl]²zUhÁ(cRÒ+êí¸aBäÈw2”ç·GË�ò(’™³z‰›Û¢Ï‘Ê&Ê£iE®ÂÝÈ1a»ªòŒ;v/öcS¦¸QÄ�¤]¡·Yº°ðÊßdøö>UÈåÔT÷˜a÷`µ�eE^(/oÊ?|åé ¯þ1öÞ^eÉ·]:ŠrkÎÒ¦²…Fö„Ù4�Lj�>Œ­´Mþ*ä•/ÁÞJ5Œª²\&�VÛ3�Y–»&NÂïUÅÃ~VYôs|�>Ósö#êDìU;pª )o/C‰SF1ÅôŠ'å�î â–û³%fÿ+¸;6uÉÛñ Ht�Ä�­3ܳ~Ì2ü¸ÌÓ„ý®t zN—8_�®.z$¢°ÌôøøbWµ rnøä“¿€'™üÇVs|�× ‡�%ÇÍ^™¾×…§ëÝV-‰Ç/ï£ôRöômÙöwÕJ§4’tR„;í¿Ð'q‹ï»ÆòÃÏË�ý”È6ÆkÆ•6~˜4Œ Ço­é#ß|æèÈfó™Åuä–ø?D%´1�Šây´†¾~Mžö¹«Ÿ× (º$%{7/KmÖ]b'`u?Ï5—÷‚Tþ<^)°.çtã‰:¦6|eÓ©´è©ä‘pš2€ˆ INÜb™pó¥Z™jÅÚ¿‘' •›,ÕÑ—˜­©%Áñµ}ö$B½$£ÜÚÂ÷Ìôý_§Ë¥´Ô%&­šaÁ Ç|Ùö“¦Wÿ4Ô¡ß ‘Zðo)?'¢ö]ݰ¢Ä´!®’\8aþb`êbf�·²N‡°ê¿½aZW(<þô bEä  ­tïLÓãå·[9Á°× K ›öÇ�c'*φpDwÎþTy�Ûë4ãä `®�yí•pš‚Bê"Åär–�²àÌ3a.áÙ™&2ü¬Šâ͹øL¡¹C˱�f |ÄÁÔÄÍvè¬S½° öp¯^s_¸[ñAø—Àµ kÔuÏQçÉPOXG% á3½åd?Og¥híªñ¦=¬$€{Ì,ÙÉO› þáž5u]«àÍôŒ×¥ÀÚwíÕ•ø¥Â�FvíìÕìùQ¶ã­E$ü*$ÏJ´+,môºŽ³ö^gš‹÷qØÇê�* Å×ÐØ€¯¥rÕ KˆÎ9�;cTv°Æõ¢¶‚i,û*M†¶ýñ^lBD=þKFQáYxNí±»Pðó'ú*ßë¾CÁØ>ðó¡ËÞ #,‘Ó5Ýó=?Z°—>’RÐRÉ :A‚ˆÃ{´sζÁnú[c61—€?tâ�Ïô£—¤vüþ÷�Î�ÆÃˆÙ«I.朤}– w�—òpØ/»§1…ÄŽ—˜ÄçŠÔãõÓn=§`^.âŸ$$SÂÓÑÅ ó æ?¼3nlY>¼A$NÌ UåÃW�òÒoÉa”7QUÎ(°}½êE ÒÎe'¨†éŠ®¬�¡£½‡zj<¸› Í=C¹|à4–Öá“´$'YÜÕu�ö³ü�LÑJ;bY£|!°`ÿcÖ‹ é·$Â;Q°åCIÅ×…¿F@‘híó•í2­Øb¼Ê»¡{›È‹}u; `ÕÆwˆð†Áé)óîß�pý4ô:¡ª0;+r*¹îÒá¯õ^®”¨EÐí‚:Þ}ÇU¨ÃAsŽàü>ÁêqI¦rO«åšQNM§èR' l Dô]ÔÍÞ–.¦ÖĹPM“(¦‡xÑ +VÂP4^³;)–jxIÐÓ/5¾§Wöo¾’‹+ÏÍ#ßQÃÅÿdá1¹d|åi¥Â ò¬�%\õëìD}›NÙj½yàNWšÇSÉFU’ý¢‘�ýB 9LͼPÅ)qw¦¢¸Œ 3wEÝýÆdî[à$MÈA¯sÜt®·±—}ä4Œ:–‚Pôioz_§ne"×]DÐ'ÀÇ{±\”€'AÝM?åGY4ä_»zÆ*ÕG°û+�^ÑÊBdøµõ!]NYq´‡yMÔÒtÈ9À@Hè:‡P£(·7L‰‰°®ðü‹Tû²VG� r�p2#Ù°ê ²%; ¾]åf‡ÒÔ-ÆÉ#ª§ ²—DÅ�‡ó[\qç;ðkÇ:ŠŸJgoü§)ÿT@J“]óЦ¼¿ƒë]•þŸpk8gŒ‚˜¯B�,¢šÂ¸–ãŒàƉj¼ðýî}DPƒee•Þ7DO=¦oqE‹%×Ý¢¢ Îk˜§=�ø:OD°üéÛ/°Óg¢tÊÍìÂóÁ¨/3VŒÒKú)ñDñs¥¨û�UõµÁÈDsá®J¡hL'q^z>@Úa?…­ðFç²xá¤ôÞä?Ú„ÆlàJξņ²âØâW4mÿjîŠ"ÿ€|�\ㄨ ëÚ“Qz°38KŸ‹¬(¦+TjÔôÎ’©©¿3quŒ¯'¦•ÎÁ˜ôV¨f·ü;±î7¤ip„Ã=wŒüšG�]‹ö¨ÀïÜ¿ µ¶™YMÙ-HJì¯ôû?h©éÞ³~î·ˆœŒ–È\€Y¡±_Jå§Ø'Í9�ušÖ}d1Bˆö°)ôú¼!^ì‰qT+"ݶˆå*äÖëÉJº ôhÉIÀ×§Ú4Ø>ð­E¼ZÎ âôu´òÎiåóø›“8•{\‰§€²ë·Þ™�ÀO Pw5UÔV¹@9 ˜>.áÙœ!kf *ÂÈÀx<�-Ü´‘´^§wœ'=оóî:­Df¿C ²6 ¦j�¬2ø�mÙ§'’Ml&ò†>¾X;’”…E|ïŠ>®L¸<ýâ<“’@ÿÏÜQ'¹'à•ˆ¨žCB)øÒ¬š.@„~”ûÿm ¢UÂÆö*"(²x“¶€Z(‰C�"¾•ÊùhF/ÝÇtM)8ÓAhà‡ Ø©¤oýÏZ¨CšPO¸¶Ùk†î'ž'ú%Õ¸ôKxÚûÉ?UàÓÌ> PçÜ €Dœéj¾çUļ.±Ð ÷2Œ}„` ®‡óh€ùûG„6HOŸvøk’¨Z«z�¢uE‹ØLN€�H›S\TÛ;æçt�Åó–“ï6mY#5úM‘°M3TíeжR±ÖI¦KõEVÎ| u•ðÒw¶ê�ù^?Êû 0›ñtB(ó’�-G?ÝuÜ�ô¨×M»�ÀX)¯¹�P.—¼t†_]�Å¡{&e6‚ERNÚàèjÙÔü 8ñL‡ÆAM=ø³M 6XœºÄŽÑ¨ÎÂæ{Ž;µB„*µ�O6…‰åcê†+ÃÁ‡½4�F–Ì�äa o]åå3œ‰Yx|‡;'—y#fßÜÃ3"ù#3ðÅôÒ�,]�¬o§ÀîÙàÔtÖëÔl™†d6®Öø�z}}p°,ä«SßEGy9yC$�îÊRè>=gà\ÍìWÐmûdÉ�ÉÝù/¯9d¹ÛŸõÆÌ©ÖñªðuxÕ~³@¢Cºªän‹1´LzWÊ›ªÙ>ô?#?£AoïýÃ×~¸P]LƒD!.m…¬5'… –ê©ç6Ð¥ö»ç¡My~ÛÃ"‰ÓØmÕONõ›÷q3÷HªÐÏ5µê?ÞpcDµf2²´¨e0Çέ]±•(*£ÄËEúi—;•H°qAKø4ÖcåÅš}�$Nü£”›Ì7¢‰ Í‹aÿæ*"¿aÖOWòËÇ`Þb U¥ó‡C–ƒH”®%áuŒøs»ûë?R~ëm”ŠÚ6¼ƒs\4ÐûÐ`2_–…±&6¨é_fùâñ²½nI)@@@Ä€ /s Lã¿~D(ï´=ï_¡„ÙÓ5NÖš¶òDÏjÑ:Ú êŒê˜5�&ô¢!Úº#vô`Yˆ>5¿áÝ�q½$lË6’öß”]I{Û–¼ V½¢¢¤ƒ®qIr®!”l¬cá‡N�=Wáýnô5£Ë–à�SêeçÄý,Öò>(Ò}øÛñ¶3ʈòsù«Ò9l±n? ¨a×X²Í@2�QòÿV:Õ@÷ F±Íd×ÑJìÅ~¥xÅýᦳ(F!ÍE„Òeðå¿$ú÷[½�Ä4Ru ¢t Íj2Ý#Ìâ¹FÜ¡p0�ˆDï|�ÖÊʉÄ5BêúË5u5a*Z™šÒ ³Ô©?‡H¹ÔðCð²d܉ì›ñTÞkžû\jéÔlšÕ+•çî%º�Û?…œ54ð9õ«q]ŠÙáGÞ!ùØ¢MQ@Äã  ‚r[Ÿ–‹,¸nÕ¼ .?1Wè!z8Ðï€B†+ÃÁ‡½4�F–Ì�äa o_y=,�c“kìI( q˜‹HŠ'ÍœÏã3Wúágçzfú‰¦„€· ‚5Å_m ],‰�ä3NxÅ.Ó½ A[´žÊB$:AØJÖ»‚ú~JTÈzó'¯ÈÒñÁÃÙNßþaô)ûgNÃ¥dÉcCec!ë¶×3�3ù¸ºÆT¤‘Á6HOI.íüÛ…m�N°c/"…:Á8?ÓÁ¤;¸ü�\­&Ûi1ù.Ÿmi(3)øŸ_ýÅ\#¶52ðË_†ó®6»/j8ZÏÙl3¯l²6|&æòù04ä·N�È<ØeËñrÕ9÷cG1#v,)IhÒ8i¯ÐÈYfÎY¹ÚÅâ´ö Æ ›fQÈÔg¡þtåRh—�ʪ"¤½PaêŒj£2.dÐÔ¸æÏ;T¯¢Ä1\bÓþ7FeÆóì–;µxÒ¬�¬!èT†ò¤wÝ[z˜a�C×™8•x&F—ŽÊvø¤«o´+]âŽg¨ãø0NdEÀ ÊÞP®eÚWÒIß/¾éôŒÈ”�ÓÎõ›QÖÃEPHœ#€p 5RŽ ’[]Ûë,Ú>â~0œ“ˆÑqü¨ãR†ÎøQ©å äßÿðJ ˆ<ƣΚy¹NÄæö�FOOÓ&[ÊWÑ7GyÞ6aFµl~¨‰ :2ÁAjèý¸ß¬ O‚ÄhËGËŽ%qõ4ŠE’ú]W¾TwÀìÓ‡`™�ª'…ü†¢"u#�áÅ"žƒNBDÉÙûáâô¿)+ޝ(7ácMÖŒ…™RiìX\Ì”h˜ñk²^JÜ`ßzy˜îCÚ¥„&7ožÉõ6.HƒÿÕåúöð†¿²ù�ÎÉŽ(‘#ÄOôƒiîw5Õ˜‰ëˆ·‹\gPï]o°R)¾x½uƒXfSwK¼‰»þš‹Osö›B.A6zš,èhà7kù^‘àÕû –ö‹§$±ãàÔÔAœéÁøcšŰk»Þ/Þ8æÝ韇ʆìžÌ´ÑÇ·Û ÔÛK—ΰ#Lãçâ0 šM.äµ’ÿ® þÐõë縢�_÷_QdÌ(q)ù-4€X!~(Á:ÒóŒá>§’8%Ê„< @ä©|PÈýþ:ŒT”�ëpRúeðŠÄ—q\ÖQBÎEK" df-=í†hþýFX%äESž þÿ žGl­Šp ðÌíÍ©‰fØ�ÑK É[˜ìo;T9:+Á~ŸÏ#*�ó'÷ÝþZ¹Ùn¡XŸéÍpÁ|8õC«_ö-¼k B;ñ-ÐüÜ¢ÏB_u5?Ù¨¥­óàÿ4=Lk8êìÇ⣈xû[À[2Z&=�ȳ_t³��¹t¹Šà´ÞŒßSoî]Ðkñ–¾W«t7œ%'Æ®rAý´C&©-Ó­„õµ÷£K ÆrùG”²ß)Z6K¢[]öD¼-#  ·N Ã`q~—Œ32.h€”í±l0Õ§Ÿ§„U‰žûßà M½:84Ÿjˆìv^¥8.½[ʤl"Û÷à§H«‹äöÜɼu‚�J·!�QƒÎ “¦“•Ô§–éaB’:Ò@kzA3,ÿ pě҂™�ê¿ fõ¥¡ r+Ü éz�ä$5Á 2#peó 2¯óòwênü¾)ów¶ bΨ¾0dë.ކf½jsžìœŒõV0êî± 1A¾>]'¥Qˆj@Í ´jD¾a?¥ÑGÚqmµ;¿•óäTIò›ɱ2Ö YakÐE:~ óƒ=�ºñ>»Øä*ŠZ,wfuÒFw©Æ¾¿Ijj€Kòî12Æüï´:;ýìÅžõ"óã¬sÒ«Ÿ=m[ $†N¥eüsªûÓqQd $ØœÅÛLžUë’�¬Vºsî˜íÊKõàš¡2—†¨.“Î!Š®¡Q›Aï83eª„¥�úº´ý|éñ"Rø�Û]=¯Q‹Oã<ù<Ò9ú:Úkè磲g½Ú.Ùտ޵Bmkýõ²µ¬°L+AÓ®T7dõ ÜÖü=Ûÿ¼¡oª¥�Ç ÈlDbØ]­Òª\(?èW8ÚÓŽú©¥Å«‰�&HÚŠYS{Σ®àS—N›Mñû:¤8�Ø×:6¼Vö¥¬‡Þ· zòÅŒøu`�çË13UrƒIb·1Öž¢uyΊ{Òi ²ÚÖ7ÁB•ˆúlŸ6‹JÏ…HçK›‹\�{ }x®NËyƒ@€°œ‡Fão JíÎßî.‹Ôæ�öÑë¼ðõ›l"_É#ú~‚j7g©¥A<ß©ˆÈàºÙÚ#ùü>ÈƒŽž'Ѥˆ¸¡FM3%<šú¥ ª�QT.' ѦQ“ÝH:/jba’ÊXvä¾´…›O[Yä:EšQþ‡ éÃè9s ™ß…ÃÿĈšÆYÁ¡¶e( •G”œ&‡ÿ-�qLIì>6þf¢¸_Î~ˆ^~SdîÔ{gTaIÕÌÒˆ�uZ::[CÈ�0ÙÞé7�™2PPCÂRíÊBìH„’™B ÂRÄÓ*€ ò;3IÞ…ñî^WÊÈð½ùK.YË^�ÕÙZ8õI$?�¼QÍîÅÔ\¡D]&&Xz…qr™0¾ ò)<‚c§`Ý+S˜?,€ ÙV�²P¶èÞÙä„£]¨G÷w x¤ÒC ^K\n�ó½UŽ= àƒ°%V…@TVä`�²Ò"¢OÓŒê¤ûܧªÁèo°Ïí`¾Î|lé:Ž$íÐ81cQIö„�-›êZ™÷–<,YüÜPä}¬�íýo e#L7e[©÷ÿeÕ¸�ÍÐpÓZ÷´ò"B}s® “k±‘â´)[±>8?Èš½ KLVG&u+‹”ÉO`aж7­Í»/·û6aFµlÝß �(Y(Z§âÄòæÙyŶÌñ—Øt! :@[ÕH¥Ÿ�/EË•p)_ÝÐeñ Ÿ�ÆüÓ$¥ÝngÜ»'Ä�¡5×·ëG²ÇÍþ,f™3‹…:ÜÌ"׈÷�©�¯—:Ìè�D7ÃIxu´-~R¢ËifÍÑV@§SÛ– Xþ5wÞ‡Îj9þÙmؤ1ÑÛUýr½>8?Èš½^Xí&hÇ×—+º�ÀDôÎùÜ+°Ð/W6HS0ÉÞ¼ò7*‹qj$$ DIsž£c ² L�½q„¿ñæ@ÚÿÑèRób˜“Ø|÷]QK¤oýo—néRèXøég”08Þ‘'´uRí"� ÇKkJ¨¤l–>Tx{KøíðÐí”Çùfh¾ð¢,Œ0.oj;ÿŠ‚2¨r�VLá 7ù‹¹§Ãþ¸uIäã«Õ�ªÌ¡¬WÎÛý � Ñtù=_ú€ÁKF$ö$›V*h·(q-�vÏEÌxàÑÖq�ïû®»©Vå[×–,q^³ƒûÔḚ̈”�1¿¸† ù×Ê“ŠÝ†ºÕþ%b¤F%æÌY³Éð›ç rÛÜž³�²´ÃÂAó¡Ír‹_””®ÃáJ§W‹3‘Ö -L"݃܇`ª†; î˾#»?¡pÓ÷¬~×PŸÚÁeóæsØ5ˆ`Àà&­²ógU³î{@uGñQüw¸2?zEÓp½îÄéwVO–“¥J@-@~¸­ ð µ=AútgJá™_ÒEö«Ý�‡ÑC˜GÕ”Õ­@ç~ýX†"h©“{_ûÍ…¤Ä¡ ­1øHâŠYŽŒ]m!2š6„\2�€ƒÎ1Y-«¦‹«·Ä{e¢Æ�üûÝ3ªô-Ί;ø6½ó ƪÅAʵ+ÉjÛ�KÎöé Êæ›_óL ÜÒþ+ø9‚ãl'{`ßKs®Fé÷šn#0sæ�Ã×7Ob˜î“h‚×7y¡ÅÔ|µh)�ž]üÓ-+gg¾|¿Ô’ÚUwÓ‡) ˜×U½ybÉåß³eIúßËÛq²§H z©>‚ú. ¥·ŸsÌ£Ò=tèÕèMó†Ø72æ^ëáøæ�m«Â½cÀ:Ã5ø‹L(§ßcfûë ôó…kÂôZJWøZ'[ ‰£¨¥†k3¤§ýŽ(«.HÃà•Ø´grå` œñZOœ/žÈ–’‘^¨‹k]Í:«Ð¼ÀE�Ï£¿bØÅ+ÓÎ+åw×.ã ¢råX'Ê_ÊéŽ|eg©Cv^tÝ[¯uYË\(O bm‡9P $ª5J­šìʱ!­�_YýRõ‰)…8p.Ú�¦Zñ«²ç# �Í=ø¾ /�ϾW÷vrWtŒ £×ˆqÛtÃÐ0!‹Xß™á¸%gž*ügô¬6r*8Ð'ÜIó€qŠu‡Ëåo×Ñßi-p°™ölõ?,X·¡0ÈuR´�‰‹gµô}_œEàüQ‚W\PzK�•K8A×NCŠùð &Q˜Gëppò¾KÙ$7çU¾ ²ïЇ–™8ÎfNA¼Kzn6aFµl¯)\Ž$PüP=/ᛨ¹<=gei‡ÕÂ_T>¿iz•ö ÇçõˆûTÁh²îêÆ‹0ÿwtg²ýÁÚëüobÅ«X|‡âX•ý&d²L¾ÃŽÌ11@WªÏ?}¦®?SðÝ»<äÜT‡G9Aæwr}è«�FË„…´þê¢&RŒJŒ~¤¸-ù[Äiw}�¼ã"T›Ny·^¶˜Ç¿ Ý·ì)rùs¢éæÏeBxÑL‘àó�¾÷UÄ·¸‘Ë ÉjP{æ°/ú�¦[FÓDÒ,?Üp‘e�¶Údµo‰ Ë÷ŒŠªøÞIçÉÇ]¥b@M wŽ+&-IK^FŠê)›¢±4Pbq‡‘!«Fɼt>âOœŒS¨|>_+~¾–ç x^6Û½÷­ËÇ÷‰2{Þ[ôGg/ZW]@ªÈéF¯ªå<²!0pŠ,Õ,à}]9+äWÀSoàµÍ×é�»ÿ�+ä±m’C~u[àË+1Šjº�–ºk’ªæá�8c�’‡«¤cð.Ãæûh�Löì¨íéÏ�_÷!÷=©AE+iÁ„#-X%¦›qדR79](Ï]À¦ò²‹Ø“E_Vµñ¤Zx2ð�~`¸\Í*Þ¢æ'|K”“¬ï18QÙmP²~¾Ä~šÞq�,¹·ç« ùúÝŒ>Z)€.08î~ç29ÆwácMÌð˜×ˆÔÿ×äéF‡€\’Z¡ÑS®$Ñðø:-ƒº*b1ý9ÌÁeeÍ[_Yz•¹Y*.'ïFÂKè"zpð‰O­Ñ§CFc‡¸ØsZ}J5»�£4 D¶@G Ä=r�c‚Ù¿ÜÝvßâ\ÌÙZ—Àe¥QÌKÞ_CìMïå«#3–†VvΞ¡Ñmæ=¨°;#J‘ßÇJ€á¡Y-ì©Z-<<”˜'é*9êÿR‰?+IY <¢lŽŒ¾D²+Ràš¤…sT'Ì6KE¤¾z¬ÝLµ±äÃn-\1ÿPA2,ôÃ(¦«¨ùm®©oüœ»U¿òÇrt”½LËÞMšžÝ–O Q(aV;WŽ øfÄVå¼—ý{Çgw�$-dVÎHÞ/Ž'¹zýån$1¿0øMò¼î£ŽLÊÎ6ÊŸf¿L½#¾(  ~C‹�×áͤ‰¨±‹¶OÛòŸÏô7ço‚ë�C{¯- +7“»’@ô^±ýÉ©qÖgÓþ ˆKX]ÛÙ¤g8K˜tÐa¯=�lˆ“ú)‚ÉJÖ7K.-,õî 22Ljôì1 ;’+jç^lÉnIÔÙàŠ(’ÚWÄYj8öTÆ ö‹“ ‘ ÑÈ5åeD&ŸÅLUá0)ÞwÁ¶×„ŽD2S—Ýï®qò`Ÿù»£Ÿ²}o¨Åï¥H1� *% çøÀTç/è²ùlÅÿA¦fýJŠPOàGÍø"Ö×+ýD{··•bþ¤­•©Q� 8r®³a'ûÈ“7ZZ'rœeí’©Ø{œ§kò^ê �)ý1݄ܞ¢Ž¶±T²�•ØÍ½v¥íP~þqóªN1k¤f\’.‹+ø“7÷ØÍÒW¨`ç ¥›ÎáAÿòûKÄuZ&c”ÈòhÉÖ\KGkkâÊø^K9�rÁØ.®½â®~í�(‡žT;Lé]Œ;!Ä@¨Ä;{±,K}ê>T¿èÍs¹8?%ÞJ­H™ˆ:f¦Î-„S”äc5ô u|},îÌñ }¦]¾¯ÜÂ޶eEF܃º¨@¥¥‘Û®¸8š_ñ”fŒø®�ã·R5\Zv´x"â¯^2fô$ù[ŸäH¤VÞä¡ï}ÐÿÁö_¯ï²‡ŠC‰¾”j^–W²ŸýSÚÏgäSE$Áû5js4ù¦¦0»Š×,”pÕ`k3&q—X«æf˯sÌÍ�EC€½XÌÄÏ~^dPý#LþU!ý‚òÚ+JÿHWBḭ^±¥ªyßÓåóÝë³LÖï¥ðEJ0ß•ÞLüÖ÷Áó ׌+ú‡¢ðŒ%�ºp/áö¬ÝÌÑ< ì‚åÕóŸ�¹UÄrUyðCÝ¡Îm­-5fµîEb'÷»ÈÐ7?‹AþôÃ˜ë ·°Ýÿ½Œ¢ YŒ^©¬«Ì)È.ÜŸ’¼šFÆÜènJÝ^(V Äàj¹‰¶#[Xª-ÕmÜn ÄeÀ‰.yÀ@•m£ƒ@Dt'_Lë¿foÉaê;4q]âTó÷¾!~P™KþTTm´Ú%Ó«u#¦Ý¡Iq é+ÀÔÆáÓÁ�´UÊ…ÇÀ«Î*níLõô½‹OgóPêôé a3aé|ÃÉ5Yyš9Ö£¹+‡Ù~=žÞ:;Wu<'ýyŠ\[(ÕM¶€™°SÙÔ£Fz.1éÜËM.Æ–W�ãï;›–œøtb�1*Í£^ÝLmI˜| Ø„bu$WÑî²UeüÓ%á`¡©#Ô‰£— '»¨S”tVž¥SĵÍU>ï"/L `좑èc{6=Ó¸=ñL)ŒÂdÅ R�0HP¼Žý¹UF[C9†´×íÓÔÊìÿè<Ò€Âßèó°Óžl+YF„R îÞc,G©'A7SËpú‘|ášíbôLœ”¬šÆ�ï{àN¦ íÚfížXº?Œ�¥U’†gƴʱ÷öSûà?½f‚Às·^#\è¯pâÔ(˜œAåf^<^vWnæœñûUŽ&Õ†Föéb¿ 2´Ø™ ”Ãʃ_ªï\ˆ =Yá—ÜmJ�Ñ¥LQ½v3Ss=•#¤UG%›Ñ ZM{¨Gñe®À{ \­Å¡(ª¶…GÌßÕ:"ï=&è«ËXþQEè×ø.”—Ǥû'ìçå°²^ácƒâi¿ØR\:N¾³ À¶~­bÔÎUè#Ù*|÷âx�ñP…æ½]Ó�aÈ¢Q»¿l©øý¼Îþ°ê·‰d4Ñïp0MX²ï¬Àk—©5·:Sñã>—2!?¯}Ç/Êɯ-4%}Ãf÷›Cí±›ÆÌ®H w†U{S] ÝA+ÃYp!-üä¼ëiŸÔù…rJI) Ý2¨ew…†>ÈVn/ÆÎNqpÏÐ*¸_—+ö:Òâ1†?8‚ûàTEŽì®w|¤fqfÒíƒ]`a9¨ŠcUÝÕ#ãk½´Tn)„Îpè«nM�NU3ÜÞ¯’yEÛuûw/ýâ à ï´í›†JnÞ;uìɤ ²×ab|9gž·fYUâ %´uBOüŒü±…0‰~µhäe…dŸÍ ”_+g&[´tÐ}¨ 0(ü6šÔjŸ6Xé5fJ™j‰mů÷ÜkÁcãd× ohQêaÿ‡+N­Ì½0¦Bö6Xskpnw"XÎtå0$2Èá»y_ÆìjÌ2b\ã�y8ØX`vÏ㺶šï´-‘‘°aúeýa⯑ßÅ:¾™epU×&xÊæ#·„ÖܯüFe¸ƒ�ö!M§ ìbÁôf- £=†|©ô÷�@çcÛT’IzBÃÖh éátNwÄÝÚÚÈG¢kÑ�Öxl¨?íìldIóóðŲpð†Ï*º=†ls| [œlw‘{CÓQŸû­cX0ÅdµÈ|Ïh;²~êT—…ª“þ¸ú��ácJÀ¬øi·¸CðÀ§/ÔoO¾ç{²Û'¶ër¯*ñ¸%ðúrµ'§€tMCÁÎñi3)Œ°ï õ=|C 9—9¹b¢@H7M°³Ú{ß\3¬íbñ¾dE-eZØ©¢<“/ZÌMñ_+°ÔÆ)Ø—Ëe‡uÊñþÑ¿~ñ1‚Uf›ÔHÒîY&LFûk ‰¶I6OÞÀ̃K?>c®pÓU#�Ü‘PU´?–ª@–0­¬Èb¾0,¬Z—7[öɈü+ÀäÓûµ9Ý"Þ·OšÜ¥b lÑ(иn·u¡ù<ÛÚY#7 ¥dãäÂâ© º_DûÓ)£Ò?ÕÇ[9 Ïç…•e –]Úµ GEu(sFÂOÒoáLB\£ÔÇÀøw;Ÿ››Ú,o;v¼öî[T~”ZUõrØP–ÜÿöW"käõøÑÏ‹ôªîN`aÝ ­‹I÷4¢‹>�Ï'_Šj‰·Mýªmá2Hâdñ•0 dÕÛžõ4�…§Ýµ�šÝgYÓ¼?x�HIwji‚ä4�êªEê3åHG§¼z/;Ú×¹©ÇLf,h|¾0ì©ÇIȶª 5]sE„¦{ȧª“÷Li2'ûÔQªþÖ,\ª“w•½Xæ÷Ðu•-4›èãÿ,V)w€•�õgH±>Fµsg~Äœq¦àyíu;EÑlHZ}¯a�š|í«ÎpÂh:õEP ´§¼_„ÏŽ¢Â_ ŠzfTÇÛ¾ÀÔl¹•Œ�pÞV}"PyÄ@cJ¢q‡ "k¦ ¿-²À2à K®3þhJ�Â&!·š=òmQ ³¿Ñt@“»(óôà ¦ö‚RsºÌœâ¶ÌàÁ"S4‚2éWcós€{ªèëG�Ê€– [‚�ú¶fìH¿s‰N´nAååæ¿�qÜãÖʺÀEQÚ$ {s9BœÛt³'ÿ¿K5RùS�ÒBn#€ÞFFâ(?€/¨Â[à Á iðb5['52$·s#¹)`"�±�ˆñJªW&€cXë_>õ6Y9¨Ù3ð ÞóéÄ6ô�64M�øWy‘‘8»úIi züÀ�ùŒ‹_ÖÚÑyYt?tc=è%#û®Öv± U¢Ê” cÛM�›…ä‹ `<–49Ú¶>ºíèZ"Ÿù8#›oå’¦w˜@LÛOAÙèÃkÃglSBòy.îßÀSj6!#9({�ân½ÆáÊß2..G·gYÿïÅRÍSÔn�œjïÌy0Ÿ*ú*›Ëx…fùû¦n°u]QŒVåQq’#ü#~ßùÕ"°\ñ:ßÚi¦®w³?Eø23a,Óõ˜ÞÄÑS!S·9!iâ�Ïô ¶ª¼ ?C›ìûgµ]7þu�ýþq’¶d°tîBâúJuv¤ Åàj¾æÅe@I[ U{õ­El èNàh /™$œG‚³÷2å%±üΦ˜Nç{ïb¿{¼áô±“ avðoI¾D ÇÄÐ%¨òÚÙ—õ ¹"Pª@Úæxþ\t°Æ å_nÜÑv„FT±O(¨¸ÊÂGfÇiOÄh6ÉBÖü^ Ø]‹Ëü½@rrªƒ'³ê‚Ψ=ïéÅK–œ Ͻ­°`ó;ðÒ0³+ÃWÀúŽ{„6ôBþêI°%=”R&`Íó£å¥b;&ó+lIª^ ˜°¸¶îûsY–#²ç"[¶-ì’Éž]v%ûÀqÆÿAÖ¾v}¥Î‘s„ëI�Ü<äzï­gjŸù¸Q¾‚øo:*sÕ (m#°G²bká_ù��QjšÿH�\ýðJ.w‘–®ÿÄUŸ¢Yb —Ã?Hs8¤Ÿl¬rŽÂ‚ͱ eøùÀ´H7l�Ü yP=¼‰ìl“B1ÙëÙ™ŸÁÙl\SР‚ɇ0–ûç‘¡ã¿/,GT΂ždÊFS?iM`{.‡¿Þ·¬’[0I‘/}á=!.àÑX™Ù´zu Ç0tdãŤ'…‡èŸž:‡{ii€«ª¿p<¾ÓŽÊý�ô’OPà\}§ªÖFÜ2" è^2ç ‘y)õ–6CjèuªH5\âÜ'5Ùòù¿ZöÝÕÞ�¢‚Õ¼ ¬tçëÀ÷,Z5¯|åWŸÏ%ÚZeÒ/€¥»Öøº‘—+s.Ñ–q’ÁÝhà7©¶}tsi’_Þɘt²oÝ:0 t¯­~ðë™b±d5?s£8ˆ:­â`ô�¾Š“áÿö€Ù çw BY«�ÉÞô=0ï8‘õg¹£…€ë̆4†ŠYÝ5rö•I³h=|]�“';ýžÐ¶MŸœZ¨¥ü>¾O"ýü-¾bÖŽSâR^¬”e|7”âl�E 0%ÃYÒ·"ëÛ�\QÔÀ‚p0÷—ŸåiöÓˆ©‡H_øöÅÁ³ŠDkÿi7YúP5[?™¡?%Ï ÂÞ,b¸Ëão9øb“}Å{*9¯Y¨w&$傽ûî¡!±[)zÞ?ôºzdoÅFæ7ß§Å3îˆW59�ÇûšíPàCRv"«7/ã*�b&¹!Cx~’ÓÚ8äbI\ܯ¤¦3@ ÛEP¦|n¬&þ Êü(ÎÃciyGOÛ¹½û”&ÛÈÞQëÎ áÞ„%p;T­êž¸Á|¤´í¡¶Xv]Ä‘ì>ñô/YFÆU¯%³í6ãÓðP…¤ªîXø�$£¹Î H~š¯gÚÄê{9‰ÏU¨¨=vòóRð˲׿;bâŠCÏ�Ä^ §Aå9K�ߣ¼+vˆDÅÔx÷Y÷:‡/ÇÚÛÜÑf$³‚¢ÂžR «5}ÂáÃ'Â�~›„4ëŊהÚ²Û~:#+)Ó]ΓÃ`O¦®NE/˜š]!˜¦› ¡õG œlÔÇc5oÛº*÷ÕÀ±ß:¿:à¡)e@ÜÎÔ¼4á#Ei¤Ø-N»þ‘X9&Ýa³Å9ÞŒ ªš±Øë49ÂdN;n²1Ï­/GK:7‡Þ& �¶4ËÏ<É\º$z"ß ßI²¢ú ¥�eaM¥¯“'äyŒ7åVÀ..„“�Ÿ�´Es©Qá…¥�g�ÔHù‡ÌgˆâëâoÈ©Ëô±:·Dðª®'…�1 ›Z¸åŽ¥9{»Š“;>yª±^ˆb+‚Æý±†¼qåÔ½GsŒ$;þ o]Ã_’¾9ÝTÛ|ðîÿ¼jEàÔ¶¼,DŠÀ„íJÝO+¤©fŽB~ôƧËã(w´uÓª„£W/Al:Ђ£¦0A¯µÄEý¯Íæ{p®Üýýü‰<¿H^Tg+ž"Ǥщ±ã¶t!ªÐ[¡�’²©0£ùãí›\j’'èKëÉ¢8À-³›P­kŽÞD˜.e'©Á-mzL�l´°°toe6�Df1~µ"Ü~`éÐ’ï�¨ ëŒÎ#�qÐwã¥VüÀ ­ýá�Ƨ¬4dm ßvv¯à9«49‹qŽwå&b…C™³¹„^Y¾Îî_ä~¨D7Ò!‘0Ì(Ô5îíŒI͡ݤÂ%¬—.�Ü¿µŒæÓLAzuˆyžÎj˜œf•è»Ë„o¼\Êc?‰¥Û}Õ® Œ¾‚5cN_#GéÓw¼»©2æS*ù²L©†rš_ï‡LÃuü–âúWüà(Ç/NØ´Í‚MÇ.Q÷iT÷¶³êm‹ly´|}%p[ãzò*‡Å1×ƹP‡™|çHaS…§E= Œ}÷ÖBF´^Ê+O(ÂÏýfZ›S‚bMÅ4(±’ × S³#|o|ò¸Ö¸7‡šk‘¥¶Sl(,¥ßÞ‘ò²69P˜fÍ&ÂJJþk@Ù·q#½÷] ; %öL7x¹íÑ¢|Ö\gÏ'›4ý¨(=|!ìÙÕ…ÅÀ¬ÏX×J+ð>uÕO“(b’YM�ï xÕ´Kor-'â^ˣ撦d2FˆÇ4š 5™Ÿïíû<Õ9«½kÂey 䘬srŠ|ünÃÌL˜Rü©«ÿ0ZÝ+6`ZjæÃ8ZRaRS„Ö7Št¾ê'�”AôaÜ(u†uU––@y‚ê.�˜V—®"#)Zv«Rc ‘]›#´=®gÐþ+�º“xzq]OÅ·µ|]_¯ñ™øŽy¢ÓYeƒaà‡¨J˜”‚ÍæFS;jJ|C6 Æpl6³Û•`]Äo(Q”Ó×fDþè�Ö¼=ä ÝxGÓ$AñMPþ^~8º1ênÜœço,éºáŽ�ã×êô$Æø;Õ=Õù�½U�ü£1žfâf—;I‹Ï²PmÑlÛ/ÑÿÚ­«<ÅâCÞÉË!ÉöFÇ*9¤0=¨ë–Ð_rJ˜{ú•å�bKçP|/¼Z¬¹’]3t*z*w€Ë¨’b`Lh÷SM@ËÛi2rKŒóñƒþƒ9NtB Ybi†Á¬  f~]OmŒ y½#ñ¼¥ÞþBV(&C×äkR}�—…“&öjù¯,ƒ¦Èw… #Aoò~¹Eÿì” X0)Ôv;ä7s;££@üݥыQ‰cÂèâ¤=+üößÓÕ™wGP!ƒìùWÏ�¤�¢ª%è«KhLø�'ûã1 *ocºÅg2‡ôoCå�Ílål%è㇔{è!Áy…ÈGpÆ/è••÷ï mõÈ>áŽnõñ¿óë‚ÛOªÉ0áIW!.‘³ŒþU$ôh$“�\çÛ®lTSÕÌ΀Èm­ÿbìysì³’/·ju[ã“ .�Q#œW»=vdP?J;:&W¯4Ö[‡ñ8r½v_þίÿÛ0žZ �4F‡ØAAŠ» ü^ŒÐ!Ö)jxìÁE(­ÝB�×uál,WËftmr`©óç1¥yDe šwÇÒT&cåÕÅv×d< Ui;Gì©EmM›çõõ°Âz€¡I{TÍ\—0ão…r¸.G©CùúÖ¤û(Þor%@ý|„ÝòæÛíqa’*;þ[£ t‹_ÔHÆHŒñ;Ü.&@àM²²çO"Ч5œ}pâ«�ºå þmË;÷'#b–cÿtŸó+Ÿ÷s@”Þfú£„ßÕø„%wNþTMسL¹Z úéébØ0 Mz™ÒÞCé·UWˆâè Ҭ蕦$XÍs»¦êþœ†1P(Uî ê¶›n?:1ri‘Ë8?\c¯M�Æe=ÝS¡k"vãÊôŽ+®Ö¼€v Ë+WÎíS†e@òêé×Û´�ý_o·ð&d'›ŽÚLe³Ý»C v-«ZׯD »ÅЦ¸Ñ§"€¨ê•Õø¨RT�ƒ¾éùJÖx3Å£÷G‘Etš‰ª.TOCüaÔò£ù>^zÐG¾�¯¶�±VJVzýpÿã (3 ÒJ¹ÖËæºfçY£9Cß`4‡ã0¯µ®Øyf˜•oÎ\oÚÿ0q^7ÃËœ?¦BI\²òöÙöñ8êî\\N$W³âw”×t?"®´%ËlbÊkâ÷7O™|j´:ËJa8îš },O^–c¶ð\�›Ùc¥Sœ‡€§�Ä—}êJ® ‘jØiÏμÒù·Ú»íè'B¸§—6ŸŸÂ”k†”ÚAÒmì�é¹³ÐTiÇ_1�80 'Ü.ë‹^€c ü{¾=‘‘ðÿ�籆m´}¨mÖ, |ö‰¯"*Üy%_}«ÉhW<ßJý}±©ÊDÀ�@Æ1¼¬ç!™D¤kÏáþë'¹ý�¥Îƒ÷ÌÆ�eB4ðšsµÐ[¸ºÇÇðC=ÇN·Ë"vfIGª;Õøê˺~3 ûDìâÿÆ'ëµ��õN’;4ñ òçž{âàxýÁíí÷üð¦¯7ºv7tÉLV¤>1>³ ôÝZ"0õÚ¿²¨x8ÊC} $#×y<•€¬Ò¿,º9€`Æ;ztÁh'H’¸¦ðôTŠ/Ã‘Šµ•ž7ÌŒ84IÀŒ¸�¼þE÷º¿ÂÑ9 „z?N9¶ÑçXÍÎ1ÌSzŸE{\”8“ôx·‡ Ÿ±›’+ix™ì-4HÜ¿ÊXçîY2ܤw#w8uÆÙ®DA'ÄJ!øÂÿ«çòÙü¤xiª ÈŸ}By-[”î?óÏ›U_"©ów¨šÆ¦SN»é÷šUtñ¥?×›í0 æUà_ʎذ�¥o°*³u>‚º?%WKýÝÇH6–ÑÄR å Ò˜·×^½«DE¦”„YÏšàá:û”DèjÈ|>toª@’õ{JÚ±a4Þkdm¢ üR+H�—¿ópH½ŸI Ð¦'þ [9jäÍÂl¹ ÿ½^ýahüòL™ï!>½næ ê‰ËHWn:ļ$£‚¨�Vl`?ä9±Ày~Ô—nb,<%Âb¦X,ð¼8TýŒÜ‘[@3Jy‹Ì ö’uqÂtsh{œ›}MÝ+¶]x©Êû 4?…}”Ï~äöüRµO7Ú`ÍbÜO?ÙbÇMšß«ø�ë^Þ6ME³pósë:s°¿n²VüjýædÔJûEñ¯uU¥Õ²—À�ùØOøŽÎÖ ®ß+Æ ™ ÍOAä»›{MÊáÈï:f �&ôé¿rÕÚ™Fà¥Õ#ÒùÐ$mЉ`ë4·¸Úù>߀g”1 úÓî›Ðh ãõ°âáƒXß<] ^—=ñ ÛZµ»ÈÛˆ• Âá‚I,-ŸëX“lz÷!™VP¦ªLÊ‹—®Ìd’3°‘ÆÒ>e´è3Fcÿ·5gy^»s&¦Ë %î·å›aE)ŠÅ¬–-بξ+ŠäŒjò$@ȉò•+Ü•¡Õ 6ï|¶2orŸ£,÷ ÜíA+ùè×Xüä+ª“¾âðîOôi•Œ(ÿ‚¤uÝÕe#!BMÄ íYÖc[6‘Ó¸‹ñ>˜+z|ªfšÿí�a{ Aã­ÅË•ãQ&ZìŸä^h”ý ú &ºÛt9ÝöèÂϵ†$¨Â~ •^(<4(?ê±~Ÿ,lÓ—UвÓV™ß‚±F 0Ù–�Ì\x†gE¾åT…Ii•*ݯ§~‘IèˆmEL÷HÍRÉöNÙ9„â�øÿFvLâ¡BXeßQ˜”p±¸r¸ •Z Œ€N24—^´(!/­âœhÌ]óq쾄#'ÂAÔÖªÒìçYdLÆÎj8Öe—«¾Ðê‡(|.ƒAô³z\Üä]"›#Îí=aw�\©(.Hçr›<Õ%ßœÂ7ýec ?áð^‹õ$¨¢ ϳ:¸€Àà®nlá*FG£(ÎNİ)ñC#Ë�¿Õè”ÿÈÞuQ <ÎÇJW‰/l Ì4Òyí‘óª2?©Ä‹Dor{þóm�‘|éˆhM±è6¦j&òãæ„¥yÕDÔhmÙÆ(ÚZÂ7€ÆÐ£W©¡Öf-vñw¸éW ºùæ``nZ-.O¢ û$ 2u­øÃfúáÏÉÛîo(.öL�ÑaÂÖ¦/>Í  JØ ä?‡æÕZÚÙäYÞ?þL«R„ß±g‘{týµ½É0ºéTçu¨È¶À M²—á³m¼ èχ’óÒ6v u }:®:ˆÙ¢µ4xà'òYÈÄü']\kƒÙÏâsKÍVçxG×clj•ëÿnó<µ×X¡&àEZæ Ùä�¿€G Õ£YÕ…¥ë®øú°MÀ¶k 3ÚüÞŸ¥ñ°c/Þ;:h-ëÝĦ»ðš>4Î_P‡†*DRÀr¾C×ÄÍY?3ÅvÊÀш•…É‚ ÃÙ­¡€]uK>IIfÕž4Éf óàEÝö,3/a_€b�·¿W)hEÜÄçojèóLŒŽ57$²wE°Â¡]ËpGì¯1fr(så²~â•D3¶E¤«ù—TÛMø�-ES»ØI»í.Ú¤Dÿ¶‘há]ô̰=¦¬_Dãðy#†’{ ÁS?Žoyœš`²×œS]¬kþ ”ÿR?Þx0KëÜ/ªšAÎ1HÌyšL1göLØá(U/d‹°/|©påh�Œ_\ºA°ÄkpÁëÜO†\(ÿé (žt²T"/H®}jݺ UbTG­V5è1&�²‚¶ZYŸw ý ¡»ûǦwö5µ‚�—n—€NEk™÷<’}|ûÖžô•±,Ò¬*ŠDßv…½°Ò sl†ÚØ%'�w³&`õUÊÀ}Ò¾c!»x'Õm üžÀØCovpH¾AéQÌÄJq!"‘׸8¡Yãýöî°¡æ½�ÛÖÓr~®ÿ„ñl"�«·°Ú?G÷AŠ:Ûùt ©ëz%Þ?EÔ¿N+j)åúÒÄ-çø¿{[|¬™ê%ÓéǧòTufŽÍ§ rOvêµé€"eÎÓsvx/\%b¡àBèqƒPßb@pˆEµ²Óê!�ºœŠü£ )~ &"ólôð˜XäRj±¤`9¬b™�ÔãõE";N߆ Ÿ4&Q&}ã¹�=A‹B¨b(œ»¤Ù^;ÕPQ±JËáª+õ“+ì,ÁJÅ(ฦ–² ÌžÍS‚Æ¿ZYq’«áj:ǼóN[o¾þŽÖWb»p k—JëL°¹oug;‚Òéh“«ê¹�e'“±XÝpZ2Þ6&­÷Ûñd÷”,pÃþÇ úŒ¦‡ŒDvh³ÏfÁIl\bÕ.GéÙ-%³fåȹòFJØiifyA\”çù>Í�êWjäù+}ù�îÆu燧¿5ÑîN~qD £b_ üå¤Ú@C`ìŹúÃOå[T­u ÿ²ðM”J°¼;øØâÔø6ÑAé{÷P6Ï;™Î’L)Ô¹Ü:£”Ø›8ïŽÌýp=J €u�Ìè�hÊžîÐ[yã¸Ê¤°Éûò�0ne`1жŽó;Ùe¸öÏêæ¢(‡-.ûUVŽ%0¢y! ¢„IR5®ëÂðvßõ+Š5”#Œ†Ö(Jcë�]Ô±ùvóší«Jf¼Y¹þõGIÚxGÅ'#^?lZ–KzðW”x¹ÔƒAßv UÃ?dÊQ$³ ܬÅËõùƒÂ뾤﫚@òÿ¡Ø«ãõ…1:ç¸‡Ç¢Õ �åI7Xã �2»Mµˆn±-)£¤i7…H”ElüžákkE¶õpÀÞù\jú͉Y líI§vŒœ£_-e´ ÊÈ<ü‰¯nfÔéÍÜËf@s³e@Ïö�È/ᬣv@^½T•¶I^M̱¬{�‹n±”`ñGvh aoç¼[ŠáôY#z �/à…N@±FÞ©(ßþ4ç‰ 'ðW+Â�·÷\‡8΋¦é^÷÷ÔkÄ‘9³YÂôëƒJ&ýFx¤¸m°¶Ù*¶Ea¨�5R$¥ýdæ c74µFÒ¤µrË�œ[âð@ò¢šŽ6‰8•É(oDØ!öb¸Gû3‹üsÉf¿aõ&­Œ¶·t?˜Z,.E d¶]5Ûúïm9E²:ÿa“÷å`ÜÊxŒŒ(ö+K¾ÕLä¦Á " …×MÌ‚ðöýsùã<‚¶¨Zló…dqqi£Ic¿‡ºNµI£eÑb'›¥íléf(UûÈøÒ/™Ù§IO¥7hc‚É ],£*3¾¨ž´Œ?\6qŸ£àx·hX· ™Ï³×RZ™>éÂ&YIth[1º4ÁD>jàÔÊ$FMLýÎ�ò§Ýî—ÀÊšVQâ B¡P±Z¤pzLnîõž:ÁÈÖ·Ÿe£þâ´¤¿�~ž”€Yx+¥Ä{ÈUO^ZŽÎǾœ NýMr);ú´Šê?øÏ Ì5øU € gD2Òë–’¦pÌ\�Ö:ªšûÑ:Ù¯¥ §•hlÒV‘v ûíÀ-t>ï HÛ«~±¥…áf…µÙm'AFÕiqO~k¢3óH»¤‹ê‰ßy×\Q<éd¨D^‘]¹xŸ ­±;U3\ÇQ O´÷Íû�²Øš^â¿~ìTÎy�#õ§£«Ñͱv�¦1h×;xTˆbêš·ÿc„L¢#¾ô§ì°Ÿ^½,÷úÓ›¨1fÃî°m7oEwW¦áëŒå«D× èIö?ÞlÅèh4% œH Lj”�;¦-ÆxÏè|Â&=œ™FÇd~*>%TêuJÜæZSÐ ²èr̺ám"S¬N¢ÍbÍönÍJÛå°x^$õ&Ø÷›òCš¦Òr)ÔYs%õu1^"Uœ§2Ó¬5cÝ[\ÞÚϘ�ÊåV3äîa±Byú¬VÈ S¡”çBÃe«EÝB¼| ;1e!¥åd}Úl RÌSªý´`d¦8DÏDÏiYã$©¬Àù9±Àª?ŽÌšÑkΤø^¶‘ÅúšÞâùß¹žö„Xˆ¦«Å;ïïŽÃ/õ£§ÿò”í…³4ΤO Tÿú¯C£ÂÐ&ÿľ²o;Óeš2?ÆØíb;Ûoá·šat×õ´a¿îI@ |"ƒóÏÌSÖÉÐvÖs׬Öbg˜:sï¨ñÙѼþ­£…—¿Úÿ’=/­×Fh\IºÅ¼Vá+¢jzHe¤Û ©n6Çv A.vê:€ŸI…™…ó“G°2£FŽÒ ¯ßK�ׯ D9è^ãáôlÁI£7J.+¶Ÿ�a`zŠ(¹rÓ´dd åÚ)¸áòà?'žIõäFŒ¸A±$¹OA”d—¢@ùž‰ÇEDè¶W–מêÓ(rnŒe“kAfÊöÖ`UkýB;ènËΤ° &$˜Ð†ù>œ)ÐýPŠ£èøÚLÃvq’Q`oºx·‘FN¾¦�ŒŠZ–†ÿľ²o;Óeˆ?Vû$g½´·ÁP rݘ¤A ãËâ}5ÌÚ�lÑš²9M%Ï0ôthÂkð² ‚W„me±HÒ‚¡R•ßu tÜj_zOlU(»}Äÿ©’ç•A“ ݺV‰·Ín¥ÖĬ59"èqý E: Ð~p…¿|ðû-µja•&«hr/ºïÿ+ù¦¨cvÕZÐnöÄñg9•œÔùGLý㤢=é êRd›ÎÑñ¢é¥°2÷‰’ÎñZúj�§8Sïa„³Ó=š"(ŽÜÎöäæìßzÈ•ÐÍWŒýWAÆ ³«“`�Éü÷�ŽïíÕƒnddÎ¥¢±Áz É_;„3&Ôª_^�ïõå÷hkL»H*´¯!xósu'^=ö–*äÍj>q·Þy5»�íÏÿ¡3„Ÿ¶ÕG�j²šD“ŒCO¿–Ygʼn—Ùš¢j9_‰ Á{û±5Ú;—O÷”k13Ì9æw/éîßÅú¨ÁŽ3Gà”ËÈäÒàƒÚà0"Ÿj¼vpän+å^y¦íã¶û»«ª]“vG±ò�fÍ‘‹‹v¬.,î~óßñœÖ_•–NbYÚ†²?©Î2/#Sû/x…V{ngTU¦#ËÒn»eF]tuP¾�ï÷Ô²&¡ÊY§¨‘êM< @u’ܽÔ�ììÎ4¡�Íßkz©(q™ÇÓ¦â£sõ·É´¡Û}¸?ÂÞιÆh}•¶K¥äã†Ê,5xˆ'o“éšåzÀžh^NDx·]O=c/ƒj?-H&øÚý½X½ŸF‚ßÀ^�úÖbH%õºP!Â% *KB¹À‚kÏßPRDQ̉¢u¦’>¸¾>a±1óp­ ¸†üƒB‰´Øyø³¹ü$WçôI…t¹*UmââØ‹™Eü„õ½—¸`§'íö\;ê/�Œ�³‚¸x¯²Ûé<ö†¾6±Ù×|÷*pÆPr¸(`˜äÂucõÄ%ä‚SÊ! U‘‘\ôîZR°sPä1iÁO“×bí©>¥–º Ò™÷‡}ÑTþ [ä2–ÙO)C‹Ÿtv›-*ÅŒß8ÆFÔvð³!?÷ ®d•^ó�Š¾Ñ¯$©cóõ+ɯr™þA+/Í#kãâb‰3”t#L2 ±Å9±mºB8„в§±÷#NÂ"4"È =ÿJÝ$˜@3�búRµ„¹ãø„ÊU¦vkö—íº{òÞè=� š��ÚK4‘õ•k R°”OßÞ{5"ÿs[9^D5ja€¼ Hö0Ò‰òkkÑÊ4¢ðˆßbF(>QºÚ݃ÐJ’†³…ù¸h6' D/öƒÂÌÆËRÝ¢Íb=ئ[�ÀÌ«—Ó|+(Ùë ƒ�KÏßm�ú9¡Q€ì<Qʹ›k¯QQö�BÖ•òYAUm‘¤³Ç+OÓ2HVÏbj´u9¦ÀÚ™�\ouEÑÚKŒ‚ øZ&ÈÈ�¹OÄñðCöÍ�*.¸�¨óµ®}«½Äöxb ›O|�?Ö©GB¥„–C¢ÒCKL*XÒÖlßSk�†6 @‚B‘– ñTð‰Æm táE*ÙNö]PJ]ˆGpHª<*–'I¾e5[? öœò*ÑW�Œ Œ²ácÔ¦2¾Î³?Ç#U·Z¿m»&Y�j¿a»Ñ9È"„ŸTW/zç>ç�!I†Ô&äW2Ëe“³©0qØCÉ©ŸdÒç’Ú�c¦�#SåÔ?}¶?íû3l%W¹R •Ÿ‹ÅNƱ…Ocª÷Km§ p·FˆÈVQDã¼k>� £6/ëÎ �wÞ£–„Ø÷¼«!%#**âæn–ÉÅ&ЍN5ÍfýŸ±*ùˆ—ÿú”*å‡7{“ÕÐNAÇÛ²P…¬•:äê%OWÅ2N€ÄØÛºS§UXQéºÞ°ä‹ûÓÄWbŽfˆO6Âr�¤_t æê‹3�bü&† 1b˜ï¨x°%{<Ï´J]ˆ$à&Ô>Žð •­‹Žovgg¸Ö —o`C)¨_F@kWjŠü‡Z2ˆVº&’U w£!–|ú�{ÿ´Vª�êðgc*iG”mhž“ô·Ì5 êk!ôHÂÒóùXBªÑ'SHÏrÒ8ñ-ÔÀ�±-Å×¶¨‡øÄ´Ÿ;»�Èæ!%Øæþž«·N5E¡?͘b›>܉™Ìä{†wâš¡_¿J>!f²‹«Gže¼r·*€“ÐI"M2]f3IÛè#¤�X•¨ÙMi—ˆ(n¤Òç˜j–qðˆfl¡QºûüÓà«ßÊÖ}Öys·ú`˜ñ° ëЏ–7߬TùË]�¡«C�ÓûCHækÌŠ�’ÁÊ}D¯áÚx²•¯“$KšœÉHºú‡oàsENˆ¸¿S*Ø“óùâ˜Y_¾£;Ì�Ëö?8\qC7ÃÙ¡»ûCFä<ç%–~×W]GÞŒ’d[*öw(ÊÒRÆ é…^ )ï• �!‘ÑKói]Ð(›¿“¾„þ9ÒOT4 ¾˜òþx*˜¼Ïþ•Èr­¸}pºÊ[ª#ž ×ÍVv¡=¡—�5s ãwM@Oþ–72qŠíêaP9¬�‹NšŽñíháǵY±Õýbü›X3ö�Àê'ÚSîŸ5XñÜXHu–ŸDÊü°¨¤ïâ°o¶KìÓ´̨ðJ;Á]­ ŸWˆ®·KY‹Ô_ùN’ðÒyÖAê\ud;³äA�ý–Ö]†ÀòZûæ=~(ã Ç=ý#¶'©Í¢Œ�!w©PëŸPóÊ_ÛsAd?Æ&Ä:4üªOAÿ¹7¦ü‹�%™ºïåfô iÎÌ1@¯Ñn*þŽì~!”“³‰Ñ¥ëŽ;†Ódï³Ë�¨ÃÚ€˜v±O»«5^u �NML¾ÃÜk—hÏ“qŒÇеIQM6MAÁs*^È,)à°Ó_¾ .îQÁSGIÂPiì2têvòŸQ—©ëCÿ]:¸­6Q_Ö%œ*…†¬$·¦;{!>ÕÁ¬Ï€\{b“]›©Rœ¯Aí¬ÁÓQ3½îTÓ®Ãâ@ �ÆdÊÙÐÅÙçB¤˜ìî刟‚¹=;Òð0 a±0üYÌþÌÇÏd’dÓèê¯)4Lì–+áR�©¨\¡`Ì™ùxã ”æ “”ÙâÙÙö9%Š|ÑãgЈ÷ãIe$ÞzD¾ÞàwT½$x(/©Òè/ç8ÍÒ¶~á"çX<³ó4•Yp3I9IA ¹<¶ÆåTÔ—Ñz„¡S“nÔmå“�‰g²y~ø¾�­yN�0Ÿηڵ\Ï’iÉ Û®Ôjîf�o‹ë¸Þf¶ˆ=YG㬶ŸF‰c¹m× 95\8IßE”'¿Ês)ظñÐÔ—i¢Ò1¼É_Š…"]—˜=ý“Î܄ɽS cŠhó%ÆMY³�¾Ôãð•-øMxwNÿÓ{J-‘6ž· ܷꛑeªEy -ۮˌ³…�vªÏôÁ1ãc4̾ñ²°ãæ&½8hp\&þ.©VžÎž´=Ís^ÍÅg¤Ywì½…J¸Œ|kóæZÙÌÌDß‘`î"‰=*�^¨‚¯Ðøá;.dyåÐ?mÿÙ­� V}„µ/ZÏ¿ QU5IÂý¸y–˜(¡ �ÝάÌ8G×€²AN'B3éÌÚ| €?O­ÊœÏÔã¥û¨&b½qi-Ó4c/ d�\X¥z­OHÍxf“=²`—ÐÍIBVD=´¶Þ¨}ê\®ÌùÜã,Õ{æÖÜ‘Ï�±YŠÕ&7]l‹™D×ú÷pú±�ŠIú\bÐÑ”çæSñÔ $SÝTŽh"%Nùa �Db#ò³'üÏ;û §¤[>^'_2*|¯5ê·Þ‹ðh¨r ’`VZ¨ucØ„Ž!½ã^Ý4-%ëúDš]ûBÔLF«�!é[L‡¿ZDßÙUqõ"u;SžE;0u}ÑÓ~uq‡ZÏ.*1‰ƒ—˧¸Âº®ÚKwŒÐû±1 ÚPVçöG=Z¶�Y`3>Ìk~Ó«:…,dVV^!œv� X,AÚ ƒë½6“Œ”báãWÝ”º¯\צÚÆa!™Ü3b&kHúŒZû¤ƒê� -¿¶~oÓ  T^µú€þ‡"µÇ4½©Òù›êã”ɺ². x[œp`‹H¡¥JüÂWÅJ¦êFéîµ@1ð¿õ jžˆÃb…2fÀ‡,.NzL¢SQ oÈÌÓÊÚÈ�†ª~ÅŸ„D:Ë$$I+Y• }1D?@WÜÝA6áÚË:’Ž_Œý;ÆÑÇi`$|ˆµÂX}ìrîÅkÚJiÈÕ,²¢ì(º¥Å†á´€œ·Vèwm.ë�ÂÛ–QáR“é( ÙÜ�¾¿¯–�X€΢áb¶á�'6üÀBê *§Z7öguYVÈ ÿÍI’!6=ÀèÎ÷G¥.ùã½9YJûì¡ý® U¢õ½ÓJð!è}2—2×g™ÇƒŽ4šD�ªZÜõÆ1ñ[±Fá •¢TèR†`_e8Ý^�î!å�2_4–’#x¹ÇÕ_Ù¡!„%xõˆÀû%w®"òV…q¦bmÕs7Õ�e�us1 -ŒÐ‹�Ç+Æ‚LxaÕäê~'Á?-‚þüó#˜Pì;¾ª°Ëdºù…ÐE8‡íÚ¯bQÝ«X剛0ɧ\]+4ªf,rÖ\-ç—œ–y÷Zdñ04¿aô ¯_üÀÓ¥ïÀPG÷zbé‰kÕQâžÍƒ\k¹�æ‰ /GŠ—ì;Ð8´LV{càÕ\©2.½ �½8x݃ðwþM�°|@�àwk?EUÿÛŽRr¹j+Y ¯Ý›¹ rÿL•euÌ-D[{Ϫó c'%+Ͻ iSáuTùñŸ5õt·•Ø£4îÑ�$6Ää‚9ôžü¼6gЕS•B/«Kxð‘|vZs$’PìÜ2mÆ™›� Ô~=ö�6&7ü^K:#‚å½G ÞüÛê�vÏfk­˜oU‰É`;)u‡êŸ€×FiëÍZ'ÂåÈZ£(Œx¶ÊÅÓ\Ϩ ¯e—ÍØÝwi=” ž ÚÑ9^íj)ܽ =uÛ´÷º<á— ½^¥KwÌäëms­ê‚«‹Ú!œâ¶ïÄ:û“tI&º¦qYØ$·°šï´¹”õîiBºj�ú6ÏB†ù§ÉU½ÓÏšAå%XÓ-cWÕÀ�Zù>Ù^Ž0Ð QàmŒJ½ÚØ´F¾Ûî/#Xéüù!AŽ\°w¹ªgmT¤JOcȸ†ÌL˜ ¼,ûö³2à›T7KtHqlLú¢¸»–úõúi'‘¿l'ÎË�U$u›#l-3l¨a•°ËÕAÞ ùIl:n´nAq9““Kz‹Ý­#T#Â!1ºñ SÐúe.e®Ï85åshìð"Hœ6¼eüŽZžófî#MÚ|1òÔç+"ÒùÐMŠdÿ–Vö×ÝI¨LJÿL€€!Q=B�eÇŠsÁ®pÃH³‘2Z´ÍÞÞ¤ˆ¡5 "]9ô’&’%J¤œ´ñ)ì«7 !aU@£òe<ÕÁ&ã¸å×Éݦš0 ¦% XWÄv9QÙÃ…_}Ö�Žü ŽS= æŸ%LX%ÐLrÊg/‰)ÛŒ…ÖfÔhr¨yj÷L±ƒ Î écqág©�³*(ó ÓŒÜ^1&¶´ƒ^èl¦Ír±ã(ÔO–† …1Åx£‡ãGöÕÇZ`ÍçÁ#˜±»n}·/+Ž|ò?a¯œ•Ú$9™£öaºÖ…SΤ<æ ÿaQ¨e,•±m�b�LÅZ/[Ý4®Ã¿`+^ ÿ4rÙ‰ô6}Äÿb”D;…ÔÇyú|—âûÁgã„NµdAÚŽíqvÛóEÄ=²%—(FË'oÞlñ»-̿їÐ9hîÙNN!/dÒ¸”}!ÐÈ‹ô¿4w=¡ÿKÁpqIúMÿY™ Ê�¾a…á$¡ë¼ýû:¡É ê\�Ú+´Õ‹ß4~²ç–\¯]Ÿ¢¢G#-wì­ç<è]„²…¬¸gÌYR�vÊÒ*kÀßuǦ‹ñ­ëbì¤táê·ž&T¢)þ÷þžÉèPß4ù, Ø4Üè\öõƒdg}Ï�Þ˜�@ %ÄÅ÷¨l%¡ˆ!Lq_óÀ2üüs%¼ãáüäȨ]ÓöôÆ2áZò´oÚé˶”š —5:R‚†_Ä\f“zV<´ËšƒR‹q�üÕÎ&‘*Î#îмÕfŸøSáQ Ãyûä-‘¬ù¸‘ÿ¨WÃ~ÙZ¡MõÉü(_TµÔ)ìY‚ø`Ï!*?In’lF¼eÚ�¢€íW/rŸNÕmð;Â|Y‹7J½ÑeïSî°í’P ‡Ë½L˜F~9£¥GÔ[‹NëMøìªÃñ{ðŽ�˸êH×Ö&Q&h½—ËÉ ‰Ý5ÎUkùç[æÞ@Žä²8Ãí0€¬)i”r¤8~ðÑÅÁ¨¥zß…ÙÜþû6äÚN´˜°|(ýF:œÁ^“—Luìs›bÅÞg½iX÷},*NÓL•±ESФ|LýÁ¿å£Ž’Í-5R�få[N=$\T_:¹®ŸÄtçëŒñàÛh²6 * Îî.š!ðÝa¡˜Œó{,Û7Úñ"OН)—$6JÙ·ªù/zÌ'¢—Ò=ܘUOœç#y1RÌ£`uº”‘”oT°‰i¶t¹é‡<ù«Zœ×øYÃ×f‡}XNsÐmuAkûsÔ@Ÿ@Ñäf8òŠc w{/yxÉ Z«Ë–ßЦE×R…[|oòÃeb^¸&Aª£™s~ðÙ6 åÊà¾>ð/ ÔoƒFô'•i1`øQúŒ=ƒÖ‚ƒáa.xTxà*ÙÔ^£i/„8²´hÔ¿9i†Ê] dø~öÑöÀ/Ä£ÈûÊ5<^g9]˜?óYë/æø�ê‘Àœž7Á/÷³šoלjioåùÕ%_e°c‹oR´uÒµÂûËv›€][òY¸‡è�òBwÌ.ìî®^Ý¢zBïÂÏX¨Ì- ˆÐ��]úrhó'wÜìa¼(~qúÈÙu<–'Š ï£ë…f«êá4Á1o›æ¶j›ì†ÒTö¦oÒ@ëú.Dê åYæìÙÇ…?°ÓWĺÙPxÅûȽœPÐCJmawï8”ˆöÔÈíD¥¸+Nwul¯ÚSÞá@Éæ~#Ó!.UÄþ|Üh°E£öÍ}Qì [¦Èœ5ŒžÊÁ•Z!§Mÿ:à™ÒÔ-n¥7’v¼|+ÃÁ^…Æ .�êi€Ów DÆB Ò!ññO¾ê1Y¹ªHúÞžló%ã2¤5s|<ãRã˜>? ˜•üW®l3/Tž)®Õa-]…ëa„+ôSÀ#Ïc*‰“­À¡Âžcxò4êHwƒ½jþ4Åùê8-¼k1ÖŠ:®?êåúž¤D†,ôøX§‘ZÿƾN‹™B "/�s‰øN+ƒ·•+B |o»dFá2Ãæg5‘µ�q±ð<)£.åu5È=ÞÉ€S~·”n¥ÚBo›l>�„l'è…:ê�˜–ßù¦íÜ0ÌôÍôï¸*ÚØ4þxæ&dZ’™Ó‰æ%—nƒ7³6áÚ¤,¼Â$@»ŸÝ#°£ÜDb¤†nhTŠ*DÔñ(ÃE;^íf_Õü<VýyƦ–ÀÞèÃ�øD¤ %°ørÕ*àüÌ::rãT� /âmƒš(@ðQ¥ÂQ^š`5öšå{Óhùe�^—©’@ÏltûÉPØÉ¿Dýý—¨�Æc/ò3x†»�_Ûò˜9/zÒ2Q7`j'_ŒÜ‹ šq¤»ÁIU¿‡-Lºô:Z žóã‰P@»c‘SÝÀ‚PlF8¼[bƒn¥`Ýv ”Ê*Pi,g2£¯(?Å*¹oÅF·Qø ŠÂ*¿|4.8ë[`'q€eTƒtB¿:¢õŒ™´ÃŠ:ìûv¡Ûú¯u�Ñ)×µµOÚ;Áè:|ƒDgk2¿•äÓ5˜)�)0wù»Ë|nÛÌ”€`À.Ĥ²€…�¶›÷}ó«Rf¬¼ør_ñŒèÝ+âì6Dû'ŒGȉ•ñ—¾¯ˆ!ëŽx =Ü}Ôº¾}„V~®k�7¹¼!P#_ 8<ëÃkê•(}Oôàkò´Ö1a”üHßb{tÖ(å4à…{{á-p1B„I8Jj**¿ÀFíš�»+oêqÔÚ_¸x™WìÜÂh÷ÌRV6,l�†ÍDWÊÍ=òöáÆ`Jèô(ñË·P8#R¯.eШçO0§~ÀÀ=fÞ<õVZ,Iº�ä˜ ‹�ý>×ìýM#¸áÖÍe>ë·e’[ø}/þ®tÒ}$pjf¬dròã„u*GqîÊ4Ï›]¤ÞþØècÔ«…F—´Ÿ7[.†Kµd§äZF�-7€Ówñé›Ç¯V¹ù¤� å`·à¢Æ’})™ù²ý^1±]o‚ ž¤©B@”v#“�­©Ò±(âò*„t©CçÝÛ)õ¨*541A×|ÍFðx°¯æÖ ðj͹)Ž6-8�Ö‡(ÁÆÐ$ŸÅN| _‰*Öf�±…v»Þ;O4wM”h63YsΘ©äE¸[Ë/¿²V¥Á‘Óví33.fñû\$•‘B×]3¬=Ïž÷e�‚ì‚´šË/OáÄxrüÉ"Ëmèÿàç6FÏKjƒ}Âøx®2�z§Zh¡êoÒu`Hþ¥Ýyùý˜6䊤JòûS£8§kW!ΰ Žƒ vœ'hÀ=fÛZñ×K8`äD¼$U3mê1}·´ÁX*&š›ÈÖ넉�š¢Bß—J¯û«¾xh�.'x“ûþòªÁšS.¸àg7¥3ÿ¶ú\© ôëºWyN^Ò|ÔÃ8¯ÔžÌÞ³¾.Ú `1b1’ýks—;�‹ýI>´²õŸåîD¬ % œ½óÖžˆ‹As"aˆŽ»Aý@ËG���i–ÌxVUµ¿¬@2c¿¾ÅöÞÂd¤ž)㦈§à´M™7Éy_IOçŒÿ›^¦Ò�g—]”o¶l#Ï*ίþ f9áÁÓæí6*fùH#Þy Rò÷a(6ùcÕªmY0²ˆ›Ñ5rüôdï^rÂ}Yh{á½W¦Ñ>T:z çx‚›Lÿ�àrÉfìRi¥Á•¥µA�¾á]þuJN‹”æ,œåH@Qžðµ ÔE|¬ÓßP}õø²™éû­BºC´ÑÛñˆÔ…+ËšA§2 MëSä`ÂùÙWMær3TÑ™&!c—¹Š�®ðqAÖ1ÃÝ‘DóÀ·bVsÇØêLýs·W'~ ‚ÁdÔéÂ%§3ž_oü¥êm‰P; `Z7gIU}�q‡T|7¿êµöUÒr¢MÁü”oø)�8M¶QšVéjXÇ€dž² «µÊ¬æå%#(δøyôèýh ãýœb£χÚo¶Àk5%G'ÃÁIÑYˆ­r³wÁÿóŸ)úH7Æš˜:×#wý75¬i‚¾C<{ѧxožO†�°%Mâ.Å—3Y]à›oæJ!‡d¨±’ÍqΚxåýÛ–/ ˜™kQi©wº’v ÏÝZI¬Ö±Q‚²œŸÒÂ[²ú¡(uô·Â�tÁî>¬1[ØU£îãè•›”ÃA&æ(�¿°bg_¡½!–ê¶—­¦~�!ý[ˆ"ü¼�ŽäR`Ó‚×¾øÁû{¹K„}Dݦz¢“Éò«FDAŠ8Öݶ sMgèÍ#Nš$TMD`‚Lû·N6Åèp‘!K¡Qη(P1Ëó°Â{,˜ Á^ž_×±%o’€óyZ‚ßij©ê›ÓÃR{:s(HþP!2Ôâ�"ö†&…¸A« ²�¸—Eä~dœÎ[ ì÷)šíò�ðV9S\<°:û[بw¤W�A§zÌ"ácÒùƒ<Š%ìÝYáC.§w²ZcQº¹òTDÛ¦‚öõ#�}4¤sÕÞ”˜XÛš)ýó9Óâ%Qu«Ù¼ï,KÁ^ýQÞr÷äÈù'OY¶ît4ö]¤5¸ÀLiÍ+ªœžwf2VEþsxrbÙ7½�ŒÛnIuèJìê‰ÌD}76�ư&4ì;®²üd°Œê$ø®â0È+b̯gh»pÖ�l0˜¿ÊéøtÿžÃ†™G✠Ýä’«Ü pj·¦Zìý¦åfeôre“íüàÞöo+B­Y/gÙ-rÒÂ᪅»›ðWfª#P¼˜Uõ éßñ«iZ] ¨õDåzC½HøŠªü âö;*4Yg´Ú´àƒ¸ŠéõRæ?‡ÏÜ€ÃTÎ@¡‚;M²Kü�Ó�îÙŒÌžç Ø<–ÆÃ딕BôÀ0ù(ÿ^Ãdn±Ø(*#2N˜¨íø÷mS5”j#é;vC.i>¦&K$$[ˆŒƒL”�ûËìãÙ¢ÉMF÷d¬¬—g¼©«™cšéÙ‘‘²¸$™£ó*±�š anx¤MŽ»WÛ¹¡"Áþ‹dÿ‰¦(&!õ¶Ä’0Û;ÏÇÌSv¹—øÎR”ýƒ«EU «lÀØâ,YÆ�S&–-tyÌáMÇ.øþk0^œ•ëçå-8ÙÛQ´¸ÇæmWÈÜ”scϵÝשd @ýâé]SÔŽ%÷Ê�µBRÁVC ‹<)HB¥è,Z‚1ókN޽„¨`£0a[ù¨]—ýòõüŒN¿Ñ´ÖŽÑu�lhu¬Z3ò}!.)�Y^�£xÊ]üŠ’,z´ËYº|ãKš“ù ¤EÚ¾5Èäb )ŒmÎs´U¼ÎDyfceŸ$!‚$¡Ë­Òõ™ò@$²�Gþ¦7ýhP×pÎ8»i¹Fñjfà*Ù«ÉpðVô w¼“8‡+ñäùÉ>�¶B–œPÈ ÷ÉÀ4:þ!ñˆe1CÖ Å;-٦р¯»%ÌÍ ã–›ÅºÄLs‘md_¬íÈ­Ø-žµçþýŽ p˜–‰ÂB3ˆƒp#C¹¬´c"Ce-Œï57§8¥Ô5²ºYü.Û #|7ÇÁú0È“vP]Á¯ÏžÍþ–Ç6š&ë—*/zèÐWO‰­—õûzB –nÁÏ&¾ÌÕ…çï;òö ;à œW^wÎâ;qƒÌ1;G©,#äX—f/þ8B^Ÿ5 Ì9÷`*"Tçú¯ß?°¼%° Ñ€_ä…üß^Ê— í~žê׿ùwñjPo‹QÇ ¸Bn£ˆ-D*3·Æv7¾*SPjSØ} K$�<éÙÜ]�‹H�¥tš]‡T~ áqJÇ$ßǪ³ƒn”'i�.ìÖ• ÄK>Qzðå-ÚÞ‹  ßì,ݸܾ HÁ¿¬Ytù›Æ;ãMÿ¼qò‘h@¹ËçǤ)g@ƒC¯è¾jx'¸çz"è+øÓŸDûüð¨Œê´[Þ`x�Ž ¾œŽW“IÿªÙm¥x¡~ñC¸ŸÛô[8áòUï±ìZ¬”(~+Lâ6Ktïò‚á�îhxQ=}'ï˜ÐHªøeƒ0гw¤ý9$j¯�˜Ì­úôûˆ|mŒH’µÿ¯„È‘bÁ Þ~£*)5ªÓYÊä×Ùš¸3ª.âÏÃÿ™9“Ñ¡²@]“~„Œ%ßAccwä/çÙoÞÞÐep‚m8¥2NyÀÇ"ñ:Mjx'ªü3p?òÞý³U¨� áÂT�Fžù²«oüp„½FNañ¿ú¢r½!Þ¤|EU]Ç '˜æd§Jä]ÜA¾à‹â–›¦¸‚yVÝòtüÃX™­�IµøKëN†GÕ)X|3Í<ÜK§‚Cè—ç‹H.½eg 4!±Ÿ—æ[«~'=oàG$’ÅO¾‘U"ŸÕµ!_éVèXÇÞ¸°÷·Ç i¦å:š'÷¯aÌä.�*ïp™Œ¹ИŒø“2 Ì|#›“–²>ß̦ò–”Ù‚‡ž½wÕ^ߦ_ÑÞ1zoi òþ dhиÄàTk ;z¸Q…Ú®Ûôï‘òíî8S£äÝì²®‹“­ “o5ømÙ­zŽ%z×ö¼Iþ’Øz>vŽ¢ë…N"÷Õ–[hw ï�FZ]ßð?˜dØX—ÑhtKÖ¹xã^À8#'»ú綯wf…ôE/ËÎ'óxæ�?À¥è%ØxeƒÕ àk†¥€Ï[brAˆúK½�<¤%F”Ö÷"ŠTît‘�Ú|Mñ%œi2n“7NoÍêþ9E(½ýßÜJÓKгâºõ½}Ëa“Æj^…MÝ^¶þZ6™nC~p�±—S7�ó{ ‡2ŠJ­qF¤°ÜÄ¥Žor„ knCÖ!�b3®mxëç¬êKEz ª©ZåS<&²ùȪÍ%ƒG69³<ÿøŽ9è¤Ó!’¨÷wêË>Ÿú¡©”(yãÌ|ˆWTôø^š È-ƒ²�l õPìd�ËeV6�¯ó¤âº�ª8KÐ]«�Ùœ¸»‚gáq®¤#—Ž¡Z&…²rieAhÿ³’=¤àuåÓé+ΛÆ; "Ð{¶ZÿP#ù†M‡ðH£æ=ãº3"ç’8ª‘ÙyÉXÀa”o_ŒøÝõ…–‰¯¬E÷ìæX36àh�®ì”Î-ê]ß—¦45ëºtÑÍú{Áò­ €†¸DŸÌ[hs®æâߊ¥˜Ü96‘E¸òëdyQ6ŽäNкÖi0XÉ�Õ;®xˆÇ…¡Æ-¤Ä¸¡k1 ]² Þ陋 :¹4p†D�Cm´Æ?Õœ;gòéhÀàÄ0�´ÖsÁº•Ç-f*Åv£w¸´3ñÊßTÊk[r± �skÇ_=gRS ~ÝFP¢ÁCÒ Q ú‰êw©aü1&‡r°ùãº!øˆ<´?’…¯W¢‘7ŽÇyûÞ¤³Õ�lr!v7 ŠÒ0CÜ­Á`;„Ù° Ç(MËØ l8\gʇ—îÐÿÌG*/¾ý±C¡ánZ3›Õ õäKº$]Í 6ö%©É$'…•c9'é1‡ Ý,ÝÀÏVç›úó“Äj^Žb†Ó}âr´,è0à5qÌÓ�B-t?1ä¯ïxˆÛ/ í¤�i8ÅÊ(¶4÷ÞÞ�`½)”f–>� ·Á=pBã [�wÚÊ ,òù6H'DHä¯âz‡AÞ“oú‰V$J“Kß�RËÈae”Šú�·C¶¯°Õ†à.æê"_>àO-ÙUCF �| w® /hRÝv­«“Ƕ‡š:ߣ0Ë+#/½FàáLÓ(‘»pY3¶,°ØQNŠø,F}?êØ=�hTÉ¿mò©*µ�\‘c‹k�Š,Mú˜$…Ý4Udâ+>UÓƒ°)ãx9 $PüwÁºìܛDŽ^ÜTS؇m\k Æ`ÛLõÌÄ…<­üëtÅȽ TDŸváØ ‘$jº´%ÛÏ:HŒJñ§ÄÈ­s0¦çó”;‰8÷Ú"CVI á^Î(Ó{þQÍQœgo¾˜U)vêCxœ†í :ÐÝY‘vï–êË¿¥{;Þx;��ßêãñùøºyrÀÿçp-…ÀjdouEtG†E—à"¢™l¶$§tó™MÔ£>Íz,kx¦ 3Yžº¶-¶V$ÁÀÖl¦ôO‘iaY=¹;ö“NcÀ–NHoŒ4’�[¼ó-äÚÈXTÐ7‚¶33Ò®¿êÀHŃÇðÿ =úç­áx.K]d£Ü(Ø‘Ö&PÒ{ÁÙTJ—¨`ÓÔ÷= ˆK:µªi;ÖÐ9(é}Éß9A&�eà{ø8Ígaâµ<˜Ÿõm˜Š&:f�ï2?µÆù^ý2›ÃßÈÑTá×¥éÊ š£«I“Ÿ@ìm‰ž¡ìö¶v�^¼µb»r,Ec•5r�õ“Q¤>n·8ŸÌ@È]�– ÷à蘤ùÐ$ Ô† ‘¾‹©>¬ùÆü•ž°„«nL4B󢩃MÂjM:o·ŒP>a–7HÈ�CT‹õ–‹H×�!ÍZÁ˜ñ჻7¼pœùýòHœâ�šŠ’R*RÒQ¡•õ«\ët�éÈò~P"b¡ ®Œ¯[âã!·õ1QI¬�gcM™f´àò5ì@Œ‚†äÏžù�$ù#ÛSÂËÿ²å½`ëà¾Bs’HâàÖ.Àì¢/;‚‹ã£.ƒQ=żìx~7Ä舆®['WÓ=]èÔá12xU�o†™2F=ì@£µ‹Û‚KpösáçTáÎ¥êà…ဲCÐ.ÑâÙyS…Èö óÝPo�“’Éw9JJU¢$°!]Kö–$ŽÛÚ ”ŽƒNŒýEµ�ð™4éBha!aG *ÃÜ{˜ø¯°ú‚ÑxˆÿÂûŸãÅÐ4¦�ÆAÑ?XBU·)Î �’ ¸üNGÅ‚1 ª.¥ç¸'EöÈÊ* ,UE ¦ó Dàg˜È|1òr¿€*�Pš¢E…-{%€ú½bzڣˢ&�±´ÞŽ8a-íÌv7%Á!�Üìà÷AQCPî ì&9¹Àà ×8öV®Ö{ò‹Óøcœÿõî–úˆ¯‘3åLø,ÿÊë ÆgIHš“fÔJ¨ê(«qkxœ·�;1@à0�'—l%1.Õì¨8�Â?@¶Ióæ‹·5¥F£ÃRsš­G"_¶²QH¤„Oë_pcènEç�g¹Th�Z]iÉ‹c2´ÊAÊER˜$|Nûj‰æûRZ¨Å¡gäQ*ñeó¥-{v4ÌþM�“À?è—q©çz–#l;:·–…!yóª�ºŒ–¹ß¶×ô?X{zš®»«Om®ŒS‹™ï«{Ýô¡ÃhÔ’ÕjëË´˜ëÎIË-òÕPrü€àëOšTñPÁƒªÚŸ`6¯šý-Y0îŸ1>kíöfÒÜ¡�6Ê6é�pÁAç·Šª ¼ÞIY}¶ç�¢×¸ÁfO§{*¿ôXX|W~‰C½Ø©4àÂî¸ml±s°>ŠŠuJ5áT½,8Ú*rŒ¶Ï�̱۶ó¡é‹à`ƒ ”äÛd³4Q‚\ûbáY1Œ‚çè–ãÊÆGI3E�P�EU„ÀÜeu�ÅçN@ëGw¦œÊ[TB°ä$6o`›„áÕ9CÕ£$i€­¸!fÊžîØe¸Î¥”š búXÒ{ç9ë4I™ÍŠ„´ö'¥³"HDUü×ê6ŽYÝA#3½ÃÖÄgí1ÁàÝI65! t~õ°\ÔþÄûH‚A(Uä/šCj[>X%€€ND:}àÜcÀTß'Ejòï]pÝÛ}./à ºðŠÉ»Êi‡cô×\„w5}p�°I.b¿%½”KŠ_¿s ª-¿A.R¼…^û̪ œ‡t] «¯5#yÝöȘßܽt¿\A2ù“Ö³n¡¶�÷È*ÍŒn3„7¨Ô| ‰'[�rû3ÙŸx>C*a™ÕÐÂT:ÓE$ÐT�³÷)�dŒYCH7b…ïàN(J–Ú -vLe�Àï$ðS¥Ãr�Vx’UÆR8Xêêç(?Ç,Ó"¨<‚I!ym;°m” W Ào;v¿®dˆ�íx)[�Àʵ,Ô¸ŠAÓúý(œÄÕ+¾¸<ðA¤0ÁÈ‹¡}n7äÈÆŽ÷GáÁ´³£šÙN²dQUÏÉiôýt6ÃøùΆ| à?±³H2)û" ß”ÊX–,œk6%‘Ÿ-ÚhAõã&õÕK7/èþŸå²LË —6ËT–9™–¯*‰_ ÐÆá2™’ÒÜjÿÑ �¥&Æj˜ç Q§øy”áp×÷!e³:Nïe™Àß§ðBÂÁþÆ‹¶è,?�á ¸r�¾á'—9:Í�S|�¨¸zñêÆkK-ür™Œ߆b^èŸØ³� Q£œo^6–‚³Ýƒ_Â|÷Þñöù®‡jcjž×°QV8J²NPÈ·™¢1if/Ì2ºÀA¤ŽÆã6ÿ©îí‘{0èÈ”í.µÑç×íëÙ5Ǥô§ÏÈÄRÆ/±—@›@Ö Òe4HŽ’=_PRJ;FÑñ g¹® >Øß•Ðæãoæ£gó$ü S,m'.|·ÇBòÕ±€üñ°ÁëÇ�õ8ãX)Ò{kžŒØ�m°6ï¨Ì&©û^ê€Ð=¹;ŒâÎÜ›m£7;Ÿa&$¦Žñ�ƒþrÉB7yÃëD‡l�ÉÑP#å®Ü "¼WD嘬æQ–˜®+hVÔ‹³dN�_¦ù.nÿ”wåLY[|q©—U4jÿÓ¨·¦ Aæ¸â3G÷ònÃÓ<^‘ˆõ¾.‡+nˆÒÄÎgÈ� U…Ôe]jë—{ôÔÛ¡]ü¦pyÔ`Ë4ªSsf¾ï;⺞§ìš Í«l+‚0r‹Í5™Ø›ó“ |w§`°,¡–³já+pƒ„.ÕöK@Âúô+?h†iæQnëГ ¥¡ˆX^Áš1\Kµ!Àjm¿EW¢¬B›h,U†¬_ëûu±¬éÜ®vú\ó†dÈÖb•€³cŒÛþð™Nõ胰Š×ð„}Å&f‰�M] @u B´¢v¼õÔG�ð¼´dP&¦®ˆêgÎ ³º…·| ìž§¶[d+t1và~†¬Â{&¯ve’~þ vŸD5œ“~r`ÛŒIË…ŠÉõ¾ôØò )Âà& ¯îBËft�ߊٚ·x[¯“›xûÌvÙÝA®=f©û" × 9Ÿzt²}ÝÎA|ˆ¬ôÔuQ`ý56+Yýßü§#<§P¿ÑÛ˜îVÉ¥-K1ð‡™k'ʘ.–º¬v]baò’³89²>EË‘Qý¥€¦ràù+qÆ hS¿g'dV3¿ÅpC.Ïwjƒù£A°hm/�¥f÷IÜ,ë·´Ó¯–æ2½´—z9œ�§ð9 ß�é¬JïY"X+S]_žïKÂ&iTaFÓÅOÚkWD}ÐSh1‚NL‹û6sÐÂà“�W¦)@ƒöž0ƒØ~y‚Š<?_ú"&öC‰gÏQVŽŠJƒÖW0ÒÇöOš× bÉf�òEzuÿþü�±ÿÖÝÕaÛÈñ,œ©È�”üû¥\ÛÒì'3`ºÐì:{zéWS±Øä œ´šL&j+,t kÃÇïùÄkE“ÇG$�£-|Âþ“ͰýhÄð‰uWæ0öÛ—c~ÿ¼¥þœî“í€ÐhÎT4„wÖ“YÖM·/­Š)ÏÐhU¼¿ªJÇG=Å…ŸöSŒ(±`'áŸïIÞŽÚEéùÛS[½¿cxt—+>œ=Ü+]ñ‡ sw0ý“Qí9ÃÊ­ç3 N¿'ÝÝOÞB%�uj¨yÖ¨›E˜`-ZgJ ?I!áël&þ.¿¸éiж˜”×8œ Ÿ~°Êj“SùJþ‚q åYTêþ�Âÿ’SÀ:¦[1hÅW8‚½¡)�ŸéNr"nÖH¸”ŧj²»Ëxòçc1g™„î»p{ é 3逃@6wˆÑ9<òÑô™–,(3“Q¥Ëú )UnÝu•ŒÇ°ä 3wÚþ^– <ÖÚ °É‡³›DÃu“ÔúgÚ��Úïâø®+�bÍ©@lj*ñ²€°sozç8ã¢{Ý�q ™áy{7.­Ðͤ�xúMãüË¿óöÑõßÃL¬\0™àîo±º*ŠL”«ÍÒi|ÒÛ~bW1ÿá)JôÉ+Rí(­�ë·Ù7®b7µ·ÎŸÃN¹ßqÔ¥×쮟—lß×Ý�bØ¥óÙéù76M7·@^‚@AÂ^"¶öý ~Ne+Áîèo™Ó¬î�ÉŒÉSÂsD4ÞQmLs´¤Ð×Ê‚ ¸±»²JÜDµN s-—T-,¯°:7�0Èîæe s3‰K»Fqއn¦ùšðAõU-šn¾ªV hŒ‚'ÕósÄ”[­èFð»ˆ7¬x+KÃE“/Õ ËJ“ Ý* Ë’€«ñýý¯INû'Äß5—‘Ìj:’{‘·R§àR:—8G‚?ü4ÊÅà ¦J˜¾ðx¼í(®é�=ôŒ”.¢Â _Pn©D¶L–?j^ú\�ž†‹æŽ`ÍÞ ™Ú¹££4M“�·6dÈò(9)åÍ”OÍÄË Ëñ€ô¦§¢Yäø¦¥çéòÆÍ¯“¹Ì“™þ] –’0Ý É4këÑÑç4ý‡Ðó1RÌÊtVÐ¥nàþD¥ ´‚ûd? ±9•=™2ÀÇ£¹*ôÆ(8ÓŒó�¨Á4[¨F±.@¡ÕrÉQ®?$¿�*þø¦'ö,âl˜)1ͶÑ>%X�±ÿCQˆ¤fbxg'Õ>ô:§Âc„¬5‰p°.í]“W=å‚B‡�Ûì"¡à~¨£9éÊ®P¯¸!,¾üÒÙÓwÃL¬\0™äú¯v_Ð6þeÕ©yzÊŽAË>Ôê÷<<]òm»-÷]Éç ÎÈR�Ê–…ïê8í…éðQD_ˆæSF(`˜ïxû×ÎÈEÖòs7X„on|«„XT*­T%pÁ¨S\·¬JîÓF‡BVe'’—͈ù3ÞÁ™sѨ/Ÿ´Óæ‡9”SÉQ3 «"<ø7HÝj=,ã±pqå­{¥)¹…GúP mìœ.#ÚÊÀ©q¸q8lÎÂñ�ÁœfâÉ cò`&ø¦Î;y“/t$_rbÌ=¦Äáò¨Ò8 Ô¸ág»XUD;Š<!ë„z5 iW5Ϲ§oÖ‚%4#L¿a¶‹Èûë`*†Nz" Ž—]5ó‹ÍkSo? ¶ß"ù—ýN!>dfèô)†¿þñƒåEô'ýš\F/Ö܇�3ui¢çåÖù¥k8š0«~ˆr_~ŒÝ,Ñg ›ÃAÃ=ð>– WI@Áòa¬Yêf0ÞÀ“ÔÊwטê‚ú8D®¦á+.!SäÔ»–sONÇãý)þ”ð8³-ƒ{ ^¬ ÉíßQ–�Û =MhoO~uN„ä:6¾9ºÎ Ã1«_ÆaœiV_ëïf”€þS®xÜ[¹_C(M)âAwÆÄ©é`Šš—ËéôùäGœÛDû×~ÔÍzº/ÒO‰Ö¶ m$?¾$� JOþ–òëöîÇ.@4ñ=B2F)§WÍc_áâoSVâÒ œ2 M¬¤É@1(èpÿO ãéä�?7µ3h�¢’ôØ0ŽÁ§FY»)H½µ§:·§Ò?|wc†1Y¼×ì.²#L´z²«áï<@wkÈw³~Èä B^2D †œ‘,«ÛžzÄô˜fW›ÕUdï%sµ*‘î8öøŠ…Ò«ÐrJC‰éœ¨®2IŽ6W‹0…Hˆ/¶3yI µ±™„o�.ÔŽSôÊTw—âžðGi2�H 7Ð È•Y ´;†Ü(H„QžèèOf"½Ó©�5]ÀE24YteÇm�•¡!iÙVð S—ö‰9e™³iš "êù\êȰZ�EÏ!žâƧH¼âƒÎý½mzÀä¾$=Êo &åRç‰�rÙ2%ãìÈØ“¼ÔYpÅR+wœ™«qœxmÖWmÞÎdš¡\`’,½¸Åì¡Í8S�ÀU-À�´‘p5<–Ru³ø;ÙÒD¿ëÕŠ)›%´j<ß?—êå^y€�ï|›ƒñXZ\fàXL’Á»Ü�b=ýr®¾ÓjÈþ€TÓ“i^‚䘢 ::&ÁŠW%R9FȸüçâV´{¹+°ðta7Q@ôt¼²"t¹¤ÀnöÅ IÜÙN†5­–qª¸¥4´èø›7Ûõ>æIËMP’'�ÙÁõÖ¹?6ÂA+)~$¦°á­X*IÍÌ^>!ö�Ø5Ц="XÇŸ}EÆs½._K"¼à`œNiõƒiÛx¿P­z%mø¼ÌU~�‚6iˆˆ`põ0vß D%ÜF�59ÞF,ÇlACΓÌõ$Týå_ïÁ‘ï#›t¢HY5T` ÍØè)ÇMWª÷`x…ÂM…´Ëªå@ƒ=Ž4I ÷ÞÄ�ÝÓá¶m¾e�X¸‘6Iï ©ZÏl!3~¡2ú¹-H>j‡ 2÷�ÝÓ÷ô%ûCŸÝ&3›•ù }BÃÁ¯ææ70ùÆQç™IÜéyþwа�ùµD»>ˆlœ5çñè{_g±¡¢ÖΡ»�øe�)*r¦ †?ÿ[Hÿœ‘0Yzãñyn ñî'¥÷ã¡ð¨hYÎö!‹a"œ¥â¬©„áDðVâ ÁÛ¾¾?çM½B|8÷ìñ†%õ]ÍXâKÁ·7 ü÷`kØEÛtÕ‡Ó^LV×ý?m ._ÔK�‰7hVg”lIª€i“.…Ç`  b£Ö‰ÍM£„®lóÅe^.¡{ì*v¡~8ÞÁ4ç_Ø)Ç 1,_’ËAÿqÛ;=„ÉPTÚ�T·¤~Üz”Ë õ¶Ø+'£üw¦I›(\-Á¨§šVòƆ�s}x:3Ö%¸ïok]Ó2ãµæT­sZ�¾·TdS›g`f86FJ¼ö雬PR†÷Aq]�­fä�;¬´€'õ ~L˜axr©”d{ÝòÓrdÞmN�� ÁPè³�/Á×V”‘³ûÔ*»b`7åÿ Ž(õÝf\«í€ç�Íar…ë¦ÅUÏí”Ô5çÛê‹f5˜Ýù}FèY¦‡#¾‹ÏÛ’ÊÍ"2Û ®­}/øêÓ‘¡çù¶ ¼aD® âBh à(0räa�ké u󇱿![ÚÌ„„ƒåØÎ¾�”£u|“ÛÖ€ó®}øƒ¹¢à�^hÔ3Kÿ9¼vS‘U%:íóüí²!U/=ëxè"#{‘Þü¦ß[ÿ;`yåÍ<Ù@Æ ;4e: ¸9¦˜ht¾çr‹%Q ¸1ãÄ0¤Ñc�¯>$Ÿ­TóÌu^©=ÀŠ›ÆR^§ôêntðCî� b \Kk”Ú�ÄÁÓ<‹dwš¼¸yi€Ëóàzo0ƒ�¾Eˆ“1~îŸÌjmmô”ÊØ—x”ê#÷þvÝÄñ¤g“ÓZ Yã¶\¤ã¯èâo ?È´;` йÛ´T—îoìg †—hJ›‚¢mI{ã›H5,T]mVvmXÂx<�¹œV“Øm_íñÌ!ªqç½ÁôŠlzÒ¡SýÄ&�X4›¾ƒþ°Ü³ƒÔH*Í-œ‚IÈdØ•K#æR2XG0®åiºùÛôJkÿ(ê#7/ Qk##À£ª¸$pEîxuN»Í?JÜ)ãñ½!Íb8†\…a‘/ˆ{.¦ežt­dÈ”õcU•Ь$� „,7Öõ¨å•¸’º,Õ0C@ íY$}ªl¶g½ÇMC5(”½¾¦3tD�Ò.|ùF-ºòax`«õÓz�Gu(×}ŠQÁê û%¡Ø1S- Ô£zp Ä¡&¢æ‹·ã‹enL;åqÕcžíùÉ ïâÿžïÎÿùp�b–Ì­ªÈ #!Ž2ïÐŒèIa¦%û³–wÑ"Ð}Ú¡jãÜ=$�=ª½¶™Öv±¡œöt»p~ €ëÄ3úÒu¤§SŸÒUEä)o®›T;›äªðI¦ˆ?Á‡¿¢Y*7³›JI¿Å. 1s§Ÿjδ)*Ú,šòȘ¾ 6ÿ+xàp;�'´«kHÛrE¼ZÚdË Ð§´o¯O•N2øWÞ8~N±Iý`°äIÆ«± °±5ãw™¾mJ1ýÃ2êôˆ @ Žd@ � ‡bo¯×®â†ŽòcáuÝ1h{»u’ =óž�tp™T ]Izf€ …Ë#v‰ä(dÍ?Yb¦à‘YxGÈÇO"s+©¦1,äHQ´LB¥*o:å}?AÕ ­ à\ÀÄ8wæ÷ 9È2 tòƒ×f­9lªÈ]©¨\ñ'j)9Õ]µÍY¬\׿Å ™Û‚lôžœï·Œ˜�í„Ñ2LjpÁ55 |�jæÅ£»“e�'-DÀÔ·p,ùOb%÷jëÊ ¹fàG‹½U©²7“ÚÙØk´¥¶·ü„”„�{.ª0QYáXÆZxÖqˆr²¦@ãÜtu–FþíÈP'Áþ.$ÖÏ'©*)ðüMG†­µ`Àxöéí2¤w{ó¶ÜjÐ�ºÕd_(W8Úcò·r0îIõ¯$©U*þgceccomp-4.3.1/docs/images/capture.webp000066400000000000000000001345521526046660400176720ustar00rootroot00000000000000RIFFb¹WEBPVP8 V¹pZ�*çœ>m2•G¤"¢'&Ó»8à ‰enîË4·Ã^´ëåE¬¿ö_Êÿ¤l;û?ðþ�–?óßݼÒ÷)ÔÞNþqûŸ›¯î¿±¾á={ZÿêýGíç¸ëŸñý@Bÿ5û¿î[þcö‡ÜWô/ò_¶ï¾@?�uÿåìõþÇÿÿ¸O÷�óÿÿýÁ¿�ÿ~ÿ÷ìÝÿg÷·àŸú÷üÏÞ/ÿ!ß·ÿÿòÿøÿùíküÿçZÿI?§ÿvý‚þËèSôÏì_ÚÊÿ—þÙû;íOâ¿.ý›û�ì¿÷þßîþ®~^þoüOŽÏ>þýŸùïR?Ž}}û·ö�ðßï¾þõüQþûOùØH2ý«üGù�ñÿ÷?µü‚þEü£ûçöÏò_ñ¿¸z~ÿ«þýG{—þßý‡ùÏ`_Qþuþ“û§ú/ú¿å}¶ýƒüïø¿ñ_³_~aý§üß÷ò?û¿Íÿüþ/üóüÿ÷¿Þ_ðÿÿÿòý£þoö³Êòï¿l>¿špÿ�þýì§Ò_ôø?ʦý¥÷ ù�ùïü?é?Ú~Ë}„ÿ.þÇÿü'ú¯ÿåÿÿÿûxûR�Ü`€ R Tjl%÷å×X`âY*nÐOZßæ+GïéŸdHù@¶³�+ðÞÞ¾ë÷O®/ÞÆ»ZL·él²ÿÝ�þ‚Å9¬™K´‰&ÿkŠ»ZBj‡ÀÚSÀc÷Bê}wö4ÂD,7åR~:-³ZåDVˆpúZúDjŒÄtàÏqH_¡ÿ=؉D¢Q(”J%ˆÏAŠP­>Ú¿ÜS °ߌÈB½ÄÒõ½p˜¸¤�fGÅŽ™5ô¤ý³ˆ”ä’ž$ Jà4Š›ÍÆbqu“_)H_»ç˜ÚÞièÄ!{Ê+ÀñÑRv»ÏÐx‡h„-S¿Áí1˜¯×[Ù€úGÙ. .èõA¬'òjOÅu«-y€Ð$¶+ŽÁˆDu$¡€6l×ú0ͦ%U\3Cû+öS6ÙìQš¼Åž5Ò�öȹg¨ØÈ€Ux k±½,`ãwÔÝ ž�ÚL�Ûâôt76nC˜êvhdªRã‘vÄÛÞ‘Œ4jõ­óÂ�I+‘{”¢èœ6æO§c)t^V2Î ª¾V<‘õÓÜDfNÛÇÙøY—‘L7/9€19xK¥¸>ò>²yyH›­Çî0–BÞŠ“ÅN£‘vœ™^¶jIÒä#:Û�ÂÓ‹F8m] —êô|°!`©F]e�•òÞî#?ÙŽŠ‹t±¸7š s\r¦":›1ÉhÉ Ž}�¶¢‹áv |-Z ë[猠!¼Œá&8âEå|½­ã%CvéÐòÓQÁ‚lûw·ûSšl�°èÉãÛQ—ð»±Ëöhß<Oq&·þ¶¨+A Ðh4 ƒYOZßùsýÌÇ~–y0ÝOR¡˜@=„ëè6=j¤jb�~HÃJÔ¯Y_$³•à¼}¸ÙÞZ›˜Ç[­Ô!ÑAœÂg+û—Ú><5|F°t®‰b"ޟû­¯S« ¾Š[wPc8ÀÛ·äpfHðÿ—k³fÃ= 1­=÷`ݹÁ>Ý#r™ý±)8ª1÷�ügb‰’·!íùFP�H/ù àØÄÜe ÏçMåø¿9W¬Ï§Ïö ôŽÈ¡ië׋�Ðò ÕT%‡v¡ ÞCisq”æñ ÕÖÞ|—Yl)m뙟žržÇ›— –úÿv‚o"®Ž �¶Rï6B’Û5'{ŒZ¡Yum_“öÒho÷odþöÚ±»vr4Úy¹ÖLov‰>Œf¥9u=�ê–h_ÆF¸�M«¬Î?VÅÕYI„™Òÿ|Äê;å~z_Ù¤†ÅYUïù%8qp&ôêyC]®ì>fx}Çj·I\3Æ4¦¢MÿÝÏù"`M¶9:ÔÈ�ð�h—¬ÈcAqåÂmê$·"Êkÿ]÷sêhyáIˆ4üÒtƒKÐ’©dò0ǎݨ!ˆ3?p�¨Á àÅ—ë5÷;�Pü¬h¡xñ´]cÓ ǧ„<�Ox'ŸŒ(&ÙDÍ‚x<¢! Èˆ²*py£m_iJ•_ ÓÛ�Ža§fškk!H žÌMÆØÒû™¸ƒQ‚0|ÄMè>Ò±8TñÈ%{‚‡Oï>ññ²2wÑÕh•LL:öŸ,@éâQJ>ËvSõ(øÈFÒ€¹ê*œ"ϪCiÎÜ´�í‹)då†}øß[ éuHþ§=k|ñ³Õ§ÍI©5&¤Ô+A Î2ÆRuq!Õ¹ÆBrÙ>×)̵=ù BY]o˜SÔ³ÄS|xæÁ‰ëp]Á2 k‰?²ÝÂr�Üc|£ýÍ<�Üfœ›÷·Dõü#²îP4y>� —ࢲf/Êm%¼¸zËÿqiŽHb”ôvÁ€}ǰPb߇ðÉÉÿ"�ò,ÜeÜ>ù¿uõ‚iÖ£þ»B´6ƒ àþ ¶[Z ƒA Ðh4b�}äž°¬V-D�Dô½÷¬?rÏy^¤‡~É™t$~Qq“EL6ž_¿È·ßÿ7½£öt#sœ5Md'IQâX€ÿÕ y‚Š!0ZäÃ|3ŒýN¿ˆÜØw �¶‚%ýA,”<¾ëˆ@ûú³ôF‘|lÜz‹µ/êÛ•IG€€Ô º§í£&‡'%Û—Ô'(Rcö5*9{׳‡8†Íý(¬bÌ5ÈÆ=_ *1Ë1"V>Ú€•úV›P㘇0ÂD,¯2þëov¦££lFÉÙ³‰S†ƒA Ðh4 „¼‰Gèu’ƒ*÷•ÓÚLò=7Dôaïs“Ä^$yc†‘ͧ%­Æ!„ó|Ï.lÿûŽUM/ÈqžzSªb Ë“NS�Š‚&]âŽÔ3þº8ü¤y‡nñä›–-r¢K[>tÿó�†-ºÀ¥h·ÀGpXË£ƒ»3’€)¶,¯Y¨p¡ù£ÞLžÄ·@ˆ¼Ø´ÇÝ¥�\-ĵ‘``+×]®Ú‚Ó5§·ñÚa¶Mñt ÊÖn(WÖlÒ~[¥áé©ÇÅ ´|è%o¼+[šwt%Ï{ ó{ÿ/'0úËè\�º„&QЏ)¨$©´"`Ðh4 ƒA Î|ÝjÛcNâ+˜ßsç � §y,boÂáºz§!0ÒÎøR¸îø¶á eÌÇ:«zÆ0‰&EO´T&ùÄ£í¬ãÕôfõ:=d&ã@ż�`U@�ýyÖ³ÝûõÖ ûÁå ¤÷5­=‚,½s×è¡ç”êû�"¸á P±ê¸þiÌOQUT¥ê$B#ª(:•x ß,K„[î¶aWõµ,`·,RÜ<‘V·ä€S2_Œbçiñ§9îÄJ%‰DŸÐ¿ ˆRŠ{Q¦‡àã_öùU¼z²†�ë03‰mdùÔ&[#Mt«¶n8è �³EçX]‡�ÖTàj6¦áŤ°ŠÖ²üWŠ­êpd(O-ÒÖ›{+3jŠúéºh– ‚%YS f|ßWÓ ºKÂ2„ÛÂ5G=ö•Rœi+}2›zøÕ]p¦uLçkÀ¹Ÿ­ ã ¬x“¢u0Ml"ã$òZ ƒA Ðh3[Ë .‘íLL�W`å?¡I—;â9µRòH«ªjðµE¬–<§§óYFc§½s…e@ö£Íýìæ«nGZf|h{¸O-„AD7Û7ªV¿da Íè›üºæ }Î*h´|Fb×]áÓä�?î§sï#A‹IÁÑ¡B­”Ó Æ¨¾Ûª+ò¶²¢¦4,ü.ëܱá_xÉ+1µî=Ùüâ. ›é”ù\�PÙ¡ãg�—£‹“(¾¿­ƒA Ðh4 ƒÀüÛÏ €i9…¾#¸ŠÈ„wð+£¸X;Z³¡U§Aÿ_0l­í€V¾*`*¥.WO½þŒ©ÞÔ¹\�±J²r¦ØON^=l¥¸´%î“K‡�Ã4ú¤ÈÙ=€Ñ.혂¼xa‡)_’jÖïÑQ>Uý“Ù H�«aÝ/²ñýh4 e=k|ñ”Êe2™L   ;Ñ]¢Ûtžë½5êQP´ã&¡* :´?4ÖÚ³í/ù¼>쳡ݦl’ ©É‘9íZ°˜ÊÐhœÛ^—Š�ý£ÍÖˆ)‡‹ÝíÖOâò£'ŠÎ‹„Ué0¥ln—L†ü‚Ĩ÷Å26þ`#©cZ†ÈaJŒ¨(O;•çAµº8,®"Ϙ?ÂÙŸaHVYŸ¬ ÕJ$â†ÏÇ}jó݈”Jœ4 ƒA Ðh4ÖH(BSd{ű €¢“ÖÅ‹‘ÿ­*âO €äÆoÖ_�äežœ5%À¨ÍÕé]ò.g¬Á 7íš'üÕL?i@«ôiÏÇæô>1©«®6-Î 6c‹›¨Ò2Ù,Ÿ„Iþ�Ý:¹÷zC㢲Êï{;'VÛ½Rj»¯"2€E9±}ÐX÷â‰ÕÅêHýsH2Ã[2pŸGÃil·e®6U—Çl¹Tá3iÂrX œYÂ.¹&e;:±€r 3αíìêÓ®Ù ö�¼W&WæÁÏÿ72‘µ|('­ož˜¸wh'­ož2™Lš€^×è&~GC¯y%q 0Ž_JÌm€á%t­s‚Îë|¶hwI$ráyI ò&ú÷¦!D´-�†æ ‡††˜ån«ó ¶Ñº�˜(üxwN\ æ´ÝFÜØËåëRwŠ5šØD:ÇôÔØÅe4UZ'›íÕ!êÖ $5�y&½ô×Ú¨¨[•©‰D¢Q*pÐh4 ƒA ÐSÔÜïüâî.úäK¿[úìŽ1îýÎ {~Hý9Y�_ú(]Á÷€üX Šw~™ûOÞ,ÀzÐëÃWÚc_À¿†éðÛê4´Ì¿Oís@™òLÃ~›¿@ÔB±bj=Î<൪HíïoQÛ¥a �bdU/´ŠªåHÚÚLçÆë~Íͧ6®þ—ÌfîŠly”øÓœ÷b%§ ƒA Ðh4 ¦<õãYª€]g!À<~Uk>Žh‡S©âç)?,÷¢ê­,'u=,—”¼L_±w%ìoèv‚á²\´ÛÔ9q“ÎJ%öËdjñ[e—æÙ`¸^"b œÎ³ò»Vÿ©‘’}•>¤ô<„.iì¯U’eЃP|H ®¡È¶¢ãŠç't×fUª}ý˜+�Ö[ºƒPÓ§X\I+÷„G‡œñ”Êe2™L³íõ­óÆS)”,ÞðòúúŠ|ZKs4æ�…Ë^$Ë2¡P”•¶júPõZ%$)y+9n²ýNåýŠI[ó6ÖV£Â°UNã�ÊÑÊyKÌ((ú§¤‘SQ^)»Xx“äò¾Úú„¨ï¸ûP¾I?Òêe/—{õ‹ q`Dž[Oæ_ȯ–úˆ7ÍÒNf=îxÊe2™MÆÚ ë[猦S(”h°‚xÈTpLO·X,p5™seÉÀ|é˜yÄ&L*<

#í^äx ²¸pÀ$Ù| Ðê5WqÍÏÁW_Û²e20~}!Û°ìSÖá¡[*¨m!"Å4dw»þ‚jtâ íØ5Ý@·à¥¾j¦³•_|dÉ!4 'ñÔ º„•"¨ãÌÙ¶C@P�ÿquY ¦ÛW‹‰È_cqx¯Áøg-º‘ö N£ïäé©ôµ:lˆQAXã@­‰îü»à«Z „˜ƒô=a{$͹–‰é#Y¡ð­IiŸŸ,8Ý6Œ>,·�cŒ Šñ Û6ü’­ü³F/áÒdº°Š~…¯ªÉØrͱßÏ8ã�.-Äâ+W A|MCÏ6í)(žF-‚ÃÇ|ÞeQÂX'm´š²Ñ\~Þð‘„�Lì…­ñkéQÝ­Œó =h.%Ãù.¬67[¬= ôR Z�!-Ìõ &vw®t­±%,36¶ÏtúØ%dkͤӉ4€Ú^™ª¸·å¥ïME¨ÔuPŽDÐ3Ø&‰4TdK2÷�ZÛ}é /•ún€ÏµÛÇW’ÏbCãDk­IpWžCœ^=­8¦h ,^?|;3PU%Ûog`£Â€IñÏ·ÏtlýÿžÈLÈ}ußôzûéŸ(é ¾ÐÖác<3yÖìéöJÈ<Ü2 Em…Ë@^ê¹Ô`-�›�«¿3Åʳ£ á±S¼rè&íG¬–*¡‰U¬Ê¤�‰ÇhÀd÷MjÑìÓ×#W$9fSqS“Xž[' Q>†Uí®#ÑzEí´¡�û„˜  ò”k«c·¤@ïB/”y;º¼‡�²«$BÝ5:â•YñnÁÏÝo×IŸ�7n›„a2/)1¢Oç6¾žýñJ•Á—(€2|G&Š£‚VA‚øHïÛ¤J Sâ— gÇ�VTÎ나 a±Û†¼¨×µë°‰æSƒ¢%áóL=ùìw¥…ù®�ý°P&gÝùDÙ路MCb…HAÄÏÖCðõÍæËêÂ^ ™X\dþV©êiŽæ[E1r ktŠž®ïŸŸ²_O_µî¤£ÿ‹qBêÇ÷ ±;4ì8…�¥Ò‹NÄÒ"ë®�?ÜèT¶NÖYgÁ¤–ŸÑ©û’mäUŽõ�ëŸâD²·ð~¿Æ×d¦z4éôßfóÝâKMÿž±èÆÇ›ï@?8RÄ|Æ̛@­¾‚Ë“™µ,0üÝìJ?+£ê“´r×µh ÙŠ‚«öÀÓ×’nV2<†S‚·S—ÚýÔmÿò�2•à¸AD„.f Ã/³z5íÇË#œÞžu gÇÅáùR'`G°î’û�¯þS€uXxtóð¦pr°M$hA�Õ9A°þ¶íG ú|.°›Z5'‘àCÎËxXiÉÿøû®…ÄmÀÍ9?XƒGûÊ8uÏžFýÐŒé?°-Ôòzâöùq7¥ÀK^\ŸÃ˰ M³#;­Aù…º°0Ï�Ú—3ù ,Õ߆@VŠ 4¿‚E�·DîKQRj”áE86T/cs»­ST¨0±åä°¤›H±Èø\4(H«|ÙP*7›bÌb•<ˆˆGÕo'á,°( Db‚±Òá"±¶5N"5·5Å=�"”@Ö¹¿WYïͽžšèXWÓ– ûظZ1|Aa™åK=ôY÷Ÿ6oö´_æì$WÅÚohá75Eþ„rô0VšÊv¿Õ°a4}DÓŸ–J"ß3 ñœO‚)aéÌùÿ-GeD½o~�Ÿi• ƶ¨—Õç­µ@ïm7âÊ‘E¤�[î�÷iös>»m‰&�)ø*BªBm·R%øÌ™àÎ#`ª3uñCF Öa“°GG›S²îŒˆ™€0RÍz¢l“`ߘ\¥ˆó_¼Èú)\¢yÑòüßì-ƒ>ÊOØÅ–°xµÂŽf¶1¨ˆ^蘎Çjt%•×ͶôA]ð‰q!Dc¤ß¼o4±HÖù¤ Lº~Kþ)õ®†ñè¤�xˆ°¯ïÇt7aû<`,—5CtŒòC�ÐäÕ–Éâ1›/ JÈæŒl\’º\3¶ÊjªS/Sî?pÐFXµa‹Ÿˆû æ„ãY©±À±ºDõƘƒ$Hm0g2Ÿ¿–Æ%Ùª‘hú|›õœ+·>ÊÝÄ “³½‡b÷O·ê÷äáµ¾XËð‰±<·\ºˆì„GMݶ#’Ç�$ËÛ3Õ“@øÃñ°Žž´ÙDEœ�ý*®j‚uÄ>N±h»<Ù6h'œ'ØHzªÄï´•�ᘠ6ml²Ð@kOk`O%ûö'çÖIQ!Þ‰À7³Þñ6,1åå"´›ö±×|žXO­;C�Yɇ�ÚNðJ,ÞJå—0–@ “íPoËA/F:Mº(€?º&È€$ÃQW\€1(ypf¿¡K………Òc·jÖ[ñÒ¡‡½/f¹gœ×€¹cп2vÇd¯Ö³{%ZŽ•0Öóè)‚!0/ëQ4„íØŒ!ÌGæ!|’ïÁ<Ôº˜þ‹ã…ÎaõK{E£9]©Id–”Mÿ ‚¯Ák¾°Ø¼ T|™¾c�¹¥7€@7¬ñ¶2 dgÓÖ5ìcØâ·ÌÅ_�§7°¶ÊNŸ/‚¯¥Ö¯i'£ö-½ˆý§˜ÝMÔGT›ŽxuÇèš ÊXí÷¡º¨…ÊšãÓ}1BÈuy�¨¦Ò¯:y^³GF(•YA…Ü�ô‡yÐ;¢t–ÿíwi•EÆ'F-ƒkø©Eâ袂•²d”™mã¼D†¯ó‚k�ëîãµÐ \¿gûWÿr¹*¹àu6ݲ_ !x!–—Û˜…Û¡üM×sìÈ¿zö�ËÄ è‚ÿºÆ"+qÀ™%X§ð—r¨�zpÝ9Æ€<ðô|-Rü�ÌU¢X­Ÿµ3�Ð|ª¹JÈXg�*B€„7„oø´Â\µ‘žU|¬rT´Á¤Ôy…G»|BòLTš^zÙÐ}æ=^K?Îf“Ö¥Å4›'¦¥¸�n¾¬ï‹qFcħ¬7Ã12O⥦1;h©¢ïôè±­oŠ=À:Dôý¡ œ ÀåʧBµX‚)ó©nM_‹œ%(,2ÓÉê_æ(xl¥~6»Ø/` ¢áç4¥äÏ'ã��5e7 óŒKgLöâP[´U’š¾îè™TµŒãépöÏ!�Â;¼y:Ϙ|@÷ãíîÖû�Ä®é¶à»…ÄGºÄ–èw×}�ô>ö¼Ó[,|uˆ;päÉpguf|8¦gŒˆÜjfÇô¡UQmÜ3¢¢K™òèÀÙú¿ùTÕíü¤–&"ÎÕÞͬ�”iìç‹SÝ™2íÚ’S›}&]ø;:r‡îP‘}í]æI´(q²×07{n×ÒîZèiÜù#EKy€sóãN?5íòçA{÷H.ÓíŽÀ:v©ix37qüáÃ2ƒö£�8FùýÑ3’7Ž,ÂuЭöK“Ç¿Íx)܈%uªì#ç-EO7�Y¬ç~lº›—*%«xS»�)×nøôŽ%ŹÏBÓ“ÖÜGÖÕ£Dá.G²¿ËõÖyfÉiîòéŠÞŠñÈ3ˆA-(çâ~¨J!±DÚÜyu¡‹±;^”âb¬jĬÚ+ïãmTÜléB»wD�‘𛹷Õnˆ°0«¬­¦ù)±t8¾9·Ðâ4�Az»+c"ÎÛ�ú^ð*K"O\¯Ã®XYè…�•ŸÿéåC™¿‚äê Åͽ Ž?m·Ï…)u€A×ü¿o`Û¶”'´b¤Žýuÿf=ÖQ€Ër ìûc¯žR" ‹F³Ù‹“Wm—ɉ"À¦„�év$8\>mIK=Eùˬý…Æ‘ô]æÌ\ux‚Dì-Ú«} ðÜ$!Gå±ÊX€Î«{|ª^’Çk¬øÍ¡¯Ž1hŽ’ÿæéÙ0xòØËÌIq'!R‹õ.ñ¦L:#ÄÖ¯"QF|=ßca¥½¦ !HøœvþÐ/à—©(­cáöù${)%0¥™Š¦± Ê«ËùXÀ!9´j%ÁêXEâéËùZNâ¥É™uCº¤éƒ¯�5Yã§w5]%óyxŸ2{lG•ìç€^¾Þä&i¤‡ÅM½¸øûKŒüBâ–�ßÊÊúôÿw*Iù·^J�õuÄTñ¬~Åw–vÛ„' µA‹²j—¤0~ÐåØVrCþ†©,û(‰»"&¼wŒÇ‡?ÙË�…E¬Ûø€:„¥‹��@‚ 6 žµ›ÌÏfOZ`ãf€`ÝÛ2§=qM„ô«ú%"h†b±XÒD ÷UçFéh‡\ÈÅìh¥~†Ëž6U‘2MׇØàŽJÎÚ¸²Î�ŸE¶ÀÓe‹€ÚuLÞeìûdž|1ŒÓÑ™wFÜæKlŸFvl´ ‡(‰ñáÁÑÕÖA+dÑBc?¨…^7/#ß›Üú)–‡x™¹) Z~b s§IM;pQÛQ~þΉd1>̪!Ô¶£™ÖCš!º‹ˆPïïý�  4Œ_¸©Ø:ßÀ¡�¥ výg«€zIpÀ·DÒ÷Æ`�Nn„œw_œA¢Ú§¡F�lj¯ážÚGp×<†wfÛÁ;ÁV1˜m¹dfïèŽÿæ-SúÎ�ÖÑK¢Õ O^mxÜþ”‡éuÏÊn‰û°ËÙ*[~óâÈr‡øyäç×Ì‹ÌY³Ç(åà=·¥R`c�h ÿž3DÙò+4u(1|ïo&)äÞÆ²k}³þÔ ¾DQL;-ûN_ÈŠG �ÁjDÑáÚåt8N˜³2‰†‚™ä}1F3“ŽåýÙœÈZüÓÀ !qµ„9!``0m´f&ýHu�óÉz¨XC«p¦ýâFk­¼²X‹¬™ø�GhŸCâc̸Ìc�¥:`ÉÃpÅUâ{„€…YYd‘e½.ËÉN+›4-]Ÿàu`.4•5þ;µÎóþž0þ9©8÷í'ŽƒÎq!¡ÜØG ÷4Üê"ôÒMÓôÈÒ û×U¬s·F["ø˜‚€ŽÛÄD ,²)zFv�®XVëæÊz‡÷ßµt¦‚É,"X~UÚÛq6Oø'…½Ò<ææóã"AKO3‰Å„'{ ìeÁ ²X[˜úË,ÛÞ EF.S³ œmÈÀ³a¼‡0 Iô81šå¿¡;îÚ&N� šs~ÃZ-‘šŸS“Sö³ÆZ©~©B.Ú\ó{ˆœ™jÞGÍÂ7ØD¼û”) m0áhï"Ý7²¤ôHjÅÖÙŠ·D\>W6›]ËPü¾¯¨Až†æ*'äG¤Üêwjë–>JAB•îä-2`ö‰³�‡CÛAè›# :yßþ.S'ÝФiÁ$sÞÂáÍžX‡é.C9ª¥±kʘuáðÙ¨FŸö»A»ÿ®BVÆj^ÕÌ>€ÇÖ–y�n¾Ž/ëA}H"?rÎ\Èã4È�ùÝ÷t;C»$œÏÔ Ã=3šJŽÜ&ÆÅ„dUcLìr–Ý!ïNøqœæ H'\Ü/ŸÍíÎ.'lißÕ©®;,êˆ_ºóIL…Kijð±�£þjX%|�ØWØÍ%ÖX9©ºIsœkc« óòŒ é®0F‚ä¥bF×êIÉ…+ É'7u�ûV_…ÜÄU“’çÚ‰Jú~ ݪ�zbŒS…jX0N7­š¦¿Ì o­F@céC9ïçwüÎæ÷aÒŠ‘yŸÆ yàfE'‹®Î®8x69…áþ@“v"N¾ I8ç˜wPeC/˜mdÞ&ÎD�ò˜6��Íš&4Z¯1fº+£Å®~¼�Ô­“"¦N Œô›3eßæÔñí¦g5¢>£u3gÂTÓŽ>P�2{˜nÝ¡W…²º‚ÓÑöZ‚¶Â¾÷­�€¸a R㹚:ß3qó±™¼S•1æ»úÔ«ŸçÕz#)¶K°Ý«~-V†Lü £¼õ8”8! ¹�\·!÷Øâ±Cö-w�<›Îí+– 3R§ç ô’|Ùùí™ >}Àð.´š„ÏÑÄ2D=Eç‘ëN½”ò¦o…À.÷€i?!õÌlGÚVc4à8\VßÁ)ž”ðYõÈ÷Í7ÖoÕ˜‘Ä9Öžö4±â½2øulòÐânß)o‡÷uYä!È™I\ÖÚIºd0vŒ·úv´ø¢4àd~ÀJ¶6Ü3=‡4ÉË yñV€˜G²ûdN~×kf˜úbKG0˜ä0ÏÁ´é¯¸<ŒÌC¸pK_#]Ò¥Ië"»Í‘üó-5QV{©ñr’6Ô�?ÕYȤ!@ÇW‡~®W(!ôvÈ‚$–ä£N€ÂóópϬCy ×‰ÄD¢N´³56¬8å+;ï_à_}ò2iu袼Cóö`SѾ˯íÿÞ·aÌcZì,.HYˆ ë�m©B}ä)¶=[D¤�F‚ n^Þ…¥ ªV�ÑÍ9œîoÕˆUÛ�Á½ê6eØë”8Êœ±–­oz©ÏòïÛkLÂtg’cŸõOŠV–hàÎJQùëcD�)€¾É–V|�;škg�tÐ)ÜqÙ$Y[|‰3‘–OÊò1ÞÖKÒ¸«ß£_ˆ´MÅÏ+*¹(D?FVzl¨zÑ-e"D0'Â_©¼«7“öysΚµ-¯¼(úÝÝ_¦Þì*Ké@¢‰1DS† Y½±²gì²_çƒñ=Þ°ËUœŒ¥M†RpÂÀ‡*e’>3vy“¤‚#ŠzdìÛ±=WÈÜ�{Û¥aÝþßϰ 8/µÒˆ`â¼ÈP´ïŒd<‰;oó£.š—“;ÈðZ—:Ñg«º®ÀÕŽ%]"+r™gyX)(•JÝøÌ<4½Â~Ô‹YÙ Î@gÂÓŸ ühlpìG÷Èé”ÕE�yÓ}ÀáÝÊFÒk÷]ªÆ�jøc…á�>éÂM”º¶’/öm—òÞ�3fð3 r™\'�“GmHæx¥CyõÖ� ,ÍÇäšÚÖÐ7û*óØ~ÛÐt#Çg²g¹iäXH“õg`KçšbÞ7M_*V zl4S÷´…0g¦±#¿P¦¯UéÀŘûµDÄä%¸lÂ2Or·Á`MœȈÜÑ\K±S`×Ò+í*WNl䆦4ϧ–cbÌí˜ö8~3ö°δ�i}`õE<Ñá[ù/�„ôß1�îìý†ßLäàe¶KAÝ1øÅƒÕÌȘ# þ5×{Àt_Îä'ki8ôQ43ä´Ò+p j½Î^ØÍ\áO§À‘=ÝO"rœd@©='RG¸v’áÙTû“cOä‹óΩæS%ÿpxZbë—~>%4†`º94ò›ZÏM^+üÊr=ÉIø]÷A|7‡‚o”Fç�«-[w¹QÙÃ^­C.ƒJª¯l´ üq|Á³·|¤n+çº3÷ò¤ëé}¼RJ£6#f-ÊŒ¯ñVÓ¢íôY�*;-Ž‹Ž1µù[dË‚¼zÚÐÊððÚÇq™Â ÊoÞ*)n—ÙÈúG~âhöG'¸VP¡yOvÐÙ?„´–b>?’�š ‡ºÎeÃj ÐâÑÕ…o÷t·—Ýœ©N#'o‘¢C;…ªVš¨£gÞx— ­„ƒ�N ÷µ˜øqKø™}ðò${ª‡zŸã±ê°3“Iuò ƒX!‹:}¯p«S‹Du3/ºcÎä¥6f<ÿ2¥¯G¡ sEñP‡×’-Âë9t›Q9÷)åï%ÓËh1%dQ‹5z3ZWû›éqÄ P5ý¤d�Ï¹Ž˜*ÃqT’±•VyêŒ }dÌkg-Kèèv¿+&«"Ê”Ÿ/éäÐôM¤îãJjݳåÉê®_Ébt�Y@ Vî´ÝÃsð YñF‘rídB×R°˜èAù ÿoŽ­”þ‚Í`5 ¼SND .ü,Þ B2f+§Uu ël~2)ÊÕ`¾Z~7%6SõÄ<>!q.ø0ÊÈ©Òø §6¨T£O@y’E+µÄ/ü~÷¬M~?M‹øPØùÅZ›µÅ¢.?ævßið+ê€ÆdXŒsê“]5݃¾v�…”‘™ ͳø!{R¶ð3Êö@¶¡=O¥m Ó‹ê)î¸îßOVG�žeXžß/ðUvjx<=µ£VžˆaÀPŒ$„R0ÅPKW.’HmZ´Ø&®EŠäÝýršµ ¨²±Ûw�ýÿà /ï�Úˆ@ZÞÄc¡G "fòóü†@zaP]¹xw Ø“¤ klѪ䬊yä6]Ù•�FmõÚuþrÞp²Q#0jÇ£· cÅI*$§.‡ÖöÀ÷ˆU¯O\¨§Y mŽ¿ìÞ%d22Œ2qoé5ëÂ.€­³ÝM®kk�´ÎP+…íÃxýß7¥l�´Â%hŸHÞûøì�ëWÉkÜ#}a%¦µ 6ð:c!`‹€’,¹�4m8�ªzKsfÛѶ ½�]\÷$”Ø#‘9W/HgFŠ˜ÜåˆRÖŧÒòµ•³h΂�KÕ<‰Èêu]±yt Ù{Üq$à~"1ži©&Ý}þ’Û õ;GÁ?~ÖšØãF6•#ùRÒ'“mpþçú´ô;èÏ%ì+sÝ/˜ pX8Tx^�ȶXÜŸ…O rÁ`à‹ã](ŒëVv’TV •B"ßKê�¿Øsªo ®Æ‹iM’=ͤ‡Ù¾½XîÏ䔋i´´¥¸Ø J�‹lõ7©ùã½&Ò“èÇ ÿë2ØÙqiJIÞ«*Ü#¦�¬ΰ6.uÈî=S°äQÐ$¡¨…ù*Lìæ¥ÙÎQl#± w# ß@þ‹Ùl7=¨‡»í›Œ´©'Q‹)"X2²Î©)„έB½xÞ�k&ÒÑq—Ò¡"ØÐzU^R:3� û–8|Ûºº,a`§ZÈ(ù²ÅgƒW:d÷‹}é0Už´CåJ%ÁK'[&m,�QÆ,• XãA–²,X`ø¬ »ù¬Ê¤U22wæ_»GpI?Ñ«ižý�l…îˆÒó0:Æê®]†>½¨ž‰œæ�ßÅ´XÌÊêþîÕEÓ6Jý0ßÞ[ßW~4ý\cÙŽ‹UËÀ‚†NòáQ‰uG”¤ìZêÙ‡ÿŠSvÔÈ. § à~#Bp ã@™¡¨¹€qØýµÐ9/3÷hƒÛªFWï†GnÔX ÷ �vÞ•w¿$c›Õð�âH`šï¡Us†œC¯n,FñP™i-Ïë1´¯—íàŒ À|ÄJ±¾_YŸÑË”ëئ`ÛÌSäd½°CFô·±Í¼UÐ æ4ào$äŠfÍ‹^Ròûç,V uÉì Æ:*‡ÆµõY/3¦Äjf™vT�‚÷ü»úRQXô´‹¿Q¦›½*ó\1ç¯Y¹úÄÉÈ‘O³¿u ±à6hI°µDŽÆ€o»Å“š!´(À¤õ6�¨kdÈövÍ´j#¶P»]Xcl7¤â­u›{‚©]:­'R\n(ùCümî1ð| ]è$=¤´"8Äñ⪚gå'+Ú 6ˆ3¿þ]ý ÖÐÌÙH4#Gb@{!ìètt2Eµœµ�gÒûÚŸážò$°Xõ2ã`›î½AÒ;hqd¤k( c#2š�ùñ¬ ¹�ÿ8DÓ{¾úçšdÆÛ,ná4�"urç¿Ö ©QJsÊ´+Ù.ë³ £uow£Wç©H½Èáyù‘0ñœôÀ‹„=ø'“ál¨&Œ›S5;Þ4Î œ+!"hXºÿOºŽà�²ŸÕ}©x_khø>)bÙç›%g@C#¸ïÌ$&¡¥[á1×DsÔªf”Ý+qÑmªS–V©Ììº=*�òŒD‚ñ|ÆyпãæUG�< Zêƒë9Þó¯TÕ”Žò©eòEžô8¶À{Qî šŽwÑ­÷îÆ?m„禜WvDkSBÜ`ëR`*c®I2 h@wömƒ¥×0—¥¯„�TØÕð„+Ìf“T�¿bû›Ò•y‘ë8-*‚³éˆSÚX¼…kì7¶óz$øÛ�2BÃëó=Ê �}6€ž¡�¾¯Ê‹ž']êhaoߣœ¼¼F¾ÄePÀ“1Ê š5„¿ýŠ J/Ì \Ù»—UÁ`^›·GÒ¤”¥Ú¶Z¦›Ã�àô–Ë'¯Hš/Ëb±]U0´Ô•t~ð”z‹N´ ñ~tis²_þ]ý¹N¹.æ–Jm“¹Ñ¿Ø†ÉE´¡ÍUϽ¤ÿô{ΟT.½ìºý†“â#¡‡kÇQ<¢µpÔ7øÙfù^ð«n¼ ÄïgÐ!<ö „>eîQ§Ÿ×åNZ[eLîuM6��s¸.•‡gÇÒsVl|'pAÒ×¶àa¼}t&&r¥B†¡ØcΗP´[Êçã  å-ÝÑ{[Ï­Ib„ŽÞÜWk Úª2|< �°€:Jb`Ð7ú\"7Ð?®È€ ±UË÷ÁPs’*ËyZÿœjJ "¸ä;3I™ëBjÃFÚÓ—Ãý¡_µØJ–ñ�DΘ5Ûk0‘.ŽCGÉ7�FEe*¸†˜` F…\,•:uíÝ Äï¢r6Ž—Güö=ëç[C1miÌG/2DûáPÀî!`æåæè$¼Ò¯‡;ИŽx$6͈§z~йZ»¶JåY¶qHST¸Y ŽöIúNØÙXxã$ÝŒ%7»†Í¡ÇPh?ÕG˜JuÝá�º^Î…UjÙX*9¬˜S1”¿†Ñ;�»Þç¸`�ÆÚ¢,£)H[ãïÚ † Õ-œ Ô!J„pIÒ~æ«ÕEÓ–Ãk=½Ä…¡NX†¶JP��ÑAÈ@\´ÁlAw»T¹ÝÂô êë©2~Ø%8Ú?ˆéÀ©R i÷¹ãþn�R>:Ÿ©õ¦-^8Œ`R3‚ïÐà¯ÌÑΔw9&ÜŠ ŽðwD¼�ÏÛ].jRrÒq°_ø¦únÑ�9¿¡¿’È2�Ó ‰ÃAQn¨"s+Yað¾v DK‘޳ÁËåàw´uø »Âò×µ„cy("«à¼ôµ¥R½×‰Aw±ø±v¯^$©{oaà1–Z ÀT°¬*‹ “`¤Ø‚d(Öåô¦§g¬5 Í WÙœµ‹P«­¬¸ÉkqöÀXëV¦~-ÈŸþU ä¢Ï4%õj ªŒ?¬æÌ°Þ‰¥äLª¾Ûè.âiUy$þÉþŒ »ìmµˆ—hxÎýv:Õýccãµ;'¢çI˪ LéK³uˆ_Å#þ8l  cäÛýþ¥£9Ï`ÄÆRM’š“¸&3�ôJ(BbIá°§ôi£™Àäîè:#ª�Ië<ÃJøHV«¾–´å±¬€Ó7Ç¢E7@Ôp�Ííï×ÂŽÅà9ÀE¶VÏ-FZxxåç9ù”¨Âù_°„±ž ]2ÂgU�Ž¡1ðäôPIé—ñæhñÏW)•PûD‰Ó¿J³d´~€;=«™œ�|2éíäwÎ�(Âú\q­LϵÃý€i¹cÍÞÃi�ð¬Ù"üRƒÍ¬Ö!ëöd÷)s¨-$Ë…þsSŸÏÈßY”Îò2@‰+kzBTw 3¹Ê«¦(qÆÇœµæî¬x Ò¤%=9‘ë¿é˜VKð?ìÃ�ue©Ó‡ìÇeA—~B¼“à$ ímɺaims>h#e›JjÜw&qäð»Ùƒ·¶Ì‚ßiJÖì¦aõa)Z³å€b½hµ�ŽQq_Ù”yg>Š–+ª¾ó$2}½•°+,êʃ/�n·—"# ±%r7wò-yÏP�`7%ö^ëKúhá Î/5NÐùöm:ë4õnÜ‘3=Íg7Qrä¡o…hñ*ó¸š_V{ý»�;qHoÒi»-x �~öšˆ;š¥ôÆ6rÜ� pP8p žfÜ¢J_&5«<=­*s„Ç?‘TÌäÔ�ÛyË3þ&�"#b/�“ñWQ‚[2W'Q[nm|@ØÆ;ÜîÏáWÊEâ3À׿º 2Õ� ;^ôƒ©>½Šê°tzm`šW9®Œh}>ÑÐ?Êeoª±…Â]Atáu‘…¤ ©ïäbJ¾¡r—›eR°ä>+Ì> ]{u_(Q±M„„}W™ù§ó�˫ͼ¤KŸø…V׺8ÆXnIOS¬Ÿ$QZJ¾3ßÀ(g§;$^›Ì$súì`}µg©Økà /iÇk]lÞËF¡{‚oÆvýÞí']±>& 17¿ “R*;,¬Ü|aag,€ÙÂô„niï£Aá‹èèñÜý`•¨êIÿ«ô¯âNB¸ºÒÓúvaå¹5Ç � W;ä LÁ+ï?br!¦OÏqÿ™QýE‰°«ÅeñG˜„ô~GÂÄkÒaž *šI]é¶÷aªäÑ }®º¢tbìc0=UÓôdXF _-ËY þë½P ¤æ@ÚºF™¥›Ö:h­JK£öä8ð™ø‚}¶kmc#KñžÉ ÂÒ^Ñ!xÚ˜Kr!Ág_Ï/m‹mO}\"`÷¬ ðJÖŠ´•Ø0ºwR6š ÃGåb§�hÓÌÓˆ)Jß‹óD»wÛpärLj‡HOã,ëCç“d:j¢áñ�f3g«7¿jž«]M¢�Ф [„ʰÃ'xÌf¼"L1k:(3ó�™Ó*ì33µñ ïþM[š¡ÕD‚|~îlþs'¤þ˼®°§%ÞêÜ0� (?{;¨,$yhæÎ Šc qß×~ :>º?nC� ‘?ˆ'ÛXŸ)m~fÉÛ.»ÚÇF›©!ÖÚh9tÅ>€õgiöã#ès@™:>=„nøëiZzþ�„Îu]'½#y="ð6ºÝÞ‰þÊ�ê4Aéý¼½gù¬ð„W[‚ ˆTÔË¿X<l ·_ãÂu} eD]ñ¯e…Ò Œ&¡Kv ¡Eƒ'™9cø¾ ÑžYI§Ô®¾ýû|£S—C6ÇC€D•׿³^c»Á0Ö6J*Ç´ß]Tñ­úw®4â R…¯K(ÚÀø¬ M?Á÷_BPLÛä‹èöì¯Gs‰Ó^åã\ƒ¦ë¯l*OjÞÌB»§Ï¿T nŸZ÷2÷£{×YÄâ{�Ò MJ¥}ƒ… Õ¬ù0÷dŒv¿›û�d@?Ìe´¥Ï•€¯|:j…þ@Ï Á1Ç¡|¤€á[gý¦×?îŠ|ñrœWÔÊV•ºzG’k�ÌgE²Ý#-0Æì‚ÞyÜ*⊈¸ |É]·OåÍ7*z^VØÕ"¤¢-Æ…†Ø…ÜCÒô·“Uâ2¯x1Ú§~Ÿðõ!iÄ_ :â—%=Y¿ºCö„’%nçÏ1¡pâ*tŒo&ÔN¬§\ ¬-¸SÈ&¸Óžw›“%(¹Í;çãqvä*òül (D’^ÿ¨É³Ü9)ÉF¸U  Wfl̦ۤ@÷´ÒE¨Ã ïxÝåµg½Ô_€p2UÃÕ, òÿuÜeìùÕ}ò)Š‚<‘ŽøËýå¯Xºe !ÊkH7Îä|“6“`ˆ¾ƒèò_áž½�!BÁ—Ä� ’2õ a«¦GŽy)žì(áÍ/W�–3ÅøƒcM­óO…Ò§ð‚þÀ<½…üR#Ê/ C¹ë>èÞ$Žf.†ø'Ók•´v:6>ŸQµØºl4Æ{ìRt°Æ¾ÍˆÙÙ”0GÓðõ=Ë'(Ž™@ÏBÌ2œZo‚³![,ª”‹ªÛº$ã…—Yë{å�GB¶š‚y‘Cõ�§uì¢* 8^fw6ZyÐÝS™Ôhò 5ÝÀ¾>žübÓµ.ip&ß<¾ ÚlUR§ž�Ñ‹ôý³Fô�Y"åó©£e)ˆ ͲJHâÏ·Ö-uzjÚnçe%S×Þ (0Ìç±¾bGPË K&’vv /s32ˆÔœ¤ßäóº,•ž7Â÷pä©ô´j|·NB‘ --•KFF/�-ô‚ƒÞ¨=¸Ã¦èû¡€®×ša@Š'ä…=å‡þBjøô.cc%=÷]ß1ÙJ™Ô.4¥"ãZDtŠ$ô¥GYÉ·Ö| ± Æÿ°ÓHÜlÖÀoÙðIþ®aÞlVÙ¡ö§Øœ[7ª™�ÆÈ-#”­làßB©ò RóW�kò¿ãu<,T%&c–iýÊ,�CAvYè~…{Y÷6ºZQ{×Pzêõgîxszÿš°h¬OWtÊ¥ÌIËdñEÁ [̱Õ fu!ߺÂÛI¬Ê3¬� À¹YÚ¼ LÏ…• ènqÄz0ú”ÉÍGÇó™x„%£‹xØã~àÏb(T{¨T¼¬¢g¸›™5ç¦ ‰÷ %yŽmäq�µÀöoB§·¦E©Ù!K*ÍœÇÆ)pvJ+ ©ž£Ä�{DGQa#¯ÏÿŒM^îoG/&Œf#…ªúãF)wŽÛ÷}Û6rØÅ¢]N ÖΠdžšë`߀ÙÊU®²ï(Í/⑟bµ§y�¹¢¤Ç=%-Mkµ•Êz�Î6ìIþ"@�J‡¶7W¨h™Ù=¶øVÔOÄÄNùüæ�ñ]¸�ÉÀ3südL�ø¾®Pz‰�äRLõOj¶ÐÓ®Îã±ÍÔ°¸#ÙT:méÖ-rõ xl�÷¢!ºCívÖM»ìî à»öå;t£<ŠAé d¾»¨§Õ¹Î,Y™|Yæ¨Iè‚€¶ñOõ3žÐf#œ›O[`çöI©(;’¨Ô |‰‘ HÊÀIãkrK›z­å)¾ˆé«ã–íŽ"é’E`ïšHóò‡tç)Åßÿ�¦1S ™™' gl¤¤#ÂÆVšƒ/JÈÆÂØà‘è|`®´½¤ñE¼ŸØ6ß{YUŠÔA ¥œœG¶Ø‘âC;TL“¥î2é)«¶)„�ܨTÐtRl\dRmfwÙˆ†¥I´@ŠñYÚçùcƒ$õ»s8$�ü8ïÁ}¯Ç‰ç7þ‹è’ATðú®{/²$(Åä�gÅÙŸ*ôè¤~|œ\ì}D\<[ý*Šßrtÿð±qù ý—Z�„½®ãÛna¯™�Eš¾Ñì�“×lf9éä 1U�(öʸÞ3kæ–-ž-ˆ”Ñf�l³~Þˆ7�¿ñçÕg4¾ÐLW»æޝP3®¹˜cG¤íÈËæ;골}�nù%.‰¡OØ…�³¡WQ’IJçЦÀx­0Rê— … ÂC¸c‡XFT$’7äý\Ýë9ä”Jt¨¢ç]xì#�þðí73X?óDÉÔØ‰;;+g³î· G²& ï|-ù_ØêÖø9"—S`g¿1F©¯U_J]pWF SÔ×ïÛW½ÃŽeå_#6‘ôý˜ßtoj/îŽp¿ÔìÑ|&tj«;;¨ :')4Bq©äÊbÞa‡Ë�]Ú¼žbŽ@šéÎôë\€þ!]ör Ýr·–~"œ‡«}mÉÐðèH׳ ôè«à çäLh€.âtÓY g܈# ú›ïÀ¥ÊÏråÞε)¼5Õù¿"ÄàÈú6Æ£µÑ”½vQü¯ h³kâR³‚ ÕÍ9g¤y%ù $ñŸÔ™¤©z u�éÑÆ({ìFâp_ñ¨Y§�Ÿ'á�„>Ër¡ÿÃPEr½¯JÀ3»ù¶ÈœÁç¤�?:Y}fN)+ǽ%}ƒx".Å,é7è_ÊÓŽ©õFÑ‹ÇIÔ>�ëÎ-A¬ØÌšŒ¥Al3júno¸‡cÆwP�Æ*%ó_Tø«V2¶�|spn¹Ý™�øº˜=¨æºÙ¦…§m¶A E�xà·º©d]{–Û+PsBQÓ¨<}æë*Åù“:>ã·¨�ìJu”7äñ˜¦?„é©ÛèöÌÒéÄ¡(¤)_Ö# Öyº”�ýÜjãfËÇÖòí¤U( ˆ­cô Aê†ux3y¡×¶ºþ^ž‡Aݵ½?9‚èö4ô)D˜«<츊±Î2mɨ¢ÿ_¼Pp£RirzRh/N£)âx\ÈéÞWB Óñ§b˜¦ÔÜ�š h°¸Þ³°þˆ Ö[ô(þú`”%�ã[ÉS¯¬72ÙÜKÖÿÀ”hD½ÿÀ¬|Èü§î‰ö¹;ƒ[f[„7ªƒ "’–R@du›1’…ì·Ðò{{Ó3³ qþ"fv§¸š).\|pô•ßo¸¶5mJ¼êCíbß=°¡×VŽ84~‚ó Ì}ðòì…¶jÐ�ÕTm¾›©{©–¶aRø¶O$ȵGøR:�g15|LÆþ‰*lÝü­ßRek[ù"C¡ÏäÑ<—®¢²G–hL�þKf&rMæ`@íK!(äl�o=ËC(s÷М\*<–S§°�ût º’kL0žx¹C HöC•yxdãZ¤9ü±*zÙŽùÝAˆ”1£É+ü�~bðY6§«–e”HªÌâÖ—QCVšï|˜zÆÓýæ¶ð`-oôO¿ŠÂìÁ ƒÊCyÿù_Ül ·Á–Ч·3ºßÿ²�ö¶›Þ­�=À5v„wçÝU-ùÈܹw<&y°x½=ƒ ¬½Ô2E×o­sÉ3a#bú°”‚dÑ2u=(о ÿ!£TbÂèš ûlÓÒ¯?„›ª^ uY½s³ØéŒ¤y @šSB~Õj[J®ÛÐ*3&t©Zi·wC졌Ï�ž9/&Ϊ'íýÚ% "òj¿"¹ïl=rv*®HO'’q „òÅ@+ìÒá•ï�…QÝüB„Š�º‹Ìöé|döR"<õ7wÛ]´Ãèæ×É—Ê ¤Œâ5Ä+W‚ÞX1Á܈7ó€Í+9…”Ä:×+ÊK¤uÑyÞ„Õ^#!ÉËN.ï£:¹‘¹ºkıÛH�–³¬ÏͪHÕ± Ì)�N·Pï·¸‘ü-âF<´s�ººè Þµu� )󠞦ñÖçÂ>Ç÷I‹æöXøÑ²DTU8?ÊÀD$jI¥�iúne:3„Ý/ÉêWJí^B4ªrŸoœ“K×Ô5‚‹”ú¯oî7”JοfÊ)àèqör¼3VÆt�9ÿ5=}�Ö­ŒÝ{õhÒ»g„X"`ZˡЛ™°[ÿ^�|ϵN�==s8¶¸Lìšhؾát¶tŽdQX¬CšGgÚ) É1æ�F×EÔ¿”ÙMìloÕ£bò?_;WdGÑc•ÁƒEø‡€eRv¶:v£waíƒ+†öËÆ`Mœ7ĺtà“—ÜæÆìÐ”Ò \q¯AË¡d$8íÛ8è¤�½Ù{ºšþO3�Víµ>º§XQÂE„r ÖêÚ†¯“{Ajv÷Rf$”Rçì›$â 0íÜÞ�)‡@1q8ºÒ?A(ñ1NÙ#H掂‡"J�?@×’¹%|&k`YC2ÇffTa]ÆÇÌyt°|¶R`œµœÄýV]ÃÆ–«v�ßSÿ‹ãu/ûw»¥ž¤Yà¤UÁ6(& Ç”—W "I289-~î¿ÓÕJx»T«q7v/ ’”¨$mÖYúÁ"X—·'C&  Ù€Á‰È÷Xöa´ÅÎ̶©D/“ֱƚUäu$1à^â§Z30«»Tè8jû~7-ä©*�ñœ__ÈÄ�•ôIó²;Ã֗߆+ù—¶PÑÿyZïP?C_ij¤—ÿÒ ©þ*£ö*ÃxÜRîç8ò©S²òpY¾«·qR \1P®xð£�]•'‹ì5ʇkuÜõ95Ñ ýªVu؆"'��™ ‡ÇóëÖ6Ð9îi(Ô"øŽ¼*�›ä?ä43@òhñÏ«žvAÞÏ¡€œˆ¨a)û°a÷s4³VqYýàrÞ ¢ÞþëCªxéÀ²Ž†iéx"PØÞ8€êDï°0áÓíÔÙ²¸8Ñö|Ê� ÓúoúÈñ€­OýWýø-†óºB}+Ö*—­4]T?’ÂI~j/¿¸=ZZ±aÈúÕw,säÔv,Xoø¨”_a8~ÒÔõØÙ2•AÃCx‘·—ðk(ÅãñYÓ¿¢Ò­[�'n#%ý¥³^Ö†Õ(�p‡ {¢¶2%2¯lÙdË_NÎÂîý|ãPfHå;$l<ú-d¯ŒÃy– �£)qÊ€�ÐJú‘µZDÓ”’3˜°àK‚.Dˆ}km!”–ökFŽkï9K{ ´@~{ül»ùÅ3ƒF¯|äÈ�/û‹=À’%£©ä��>L¤?âWD³ò`h©äÜ"ïbijebÜ›Yª"a…J�Êí¥§c?_¹Œµ‡ñ%&;DüèÐ3Ž~œKÇ-˜Ä–v»=Æ£¤FÎô¨%åßþ Ñý¤Îú³�Y^·¥Ú]Ũow×=ÂrÔ­w–º­Èiô`QiDI!gKì"€JÇ�¤LrŠÕdè/V‹ú~H®õæ—j ��Ç]U‰>ÿ#Âp¥ZçÉf!|ãž0÷_tžþûÁñæŸÞ wg¶ö‰WÖì¶:µ~‡Öö€‡IBí÷p_ô{kb¼p :T*X/®�Õ;²~¹¦Ö’�ú›\{²K[÷ÏL­f��hN»æTl`§q2YèëWc×]ü(Mx`Æú8•ž±‹Ä+FHãº1-��Þw‹ç|îóí5mÙZ$¦�0�Æ(á)ÅŸñ/¬éù÷‰òŽ»âB®:ãfÈ~ußM¤½áw['ä…mJ°ÝX“oì p>|tûé®{‚ãðžÝïFôqÓÚ$Cªæ­¡ÖÛnšoéÕÓVVlü°7ÄÜÃëA¨åÓãdšù]8;NVŸÐú äíø¡kÅž�„ÊÆƒGãäOhlÌÙN‰Øü{=a°¡÷L™ˆ‡²²�!8î½Ãý{ߘ�)9Ç„•XPβçÃÿûï;x@Ÿ¼sA8ëˆî˜Ü}õ°Æ³\_¼q¬ålŠ,ˆD©IG@›5ÕT_îx>weJ Ú\V>X–TÑÎsma¦ÛÕë‚·(3JÍ%ÐA`÷ðªŒÅ ¢ãD»[Azê¯!ëƒsÿ ü$£¢°x‚ny?›®ë}I·ŸÄ‡Úc¹k‰?VKù#îšË·çQi›øc7cЙù¼3 š93Èb‡‘éG1s~•üµ®&Twµ!v‹·g¥Vrõ -ïoÊO ¾Þ>Ýj_Aü«–DQ�½BÁÁí$8^ì@´Çа©¶Zçádœ`ÿ šuTH<椓ì×2LGwR�¡ê˜,ZNÂU ÏKx9ÃÑÖ Sþ^¹ä&’ºMz:°ør-ËÒš푟ØlÙûMžÄªÊšzdEYȵÒÁûâÄÄz––VÚè#[«¬7'Ós¦mÖϳ4'iÊ;†V*v)”ìM¡Ã÷ö É­Õ‰f€Âc`1é@¤™p„pŠøí°'åås­ ò®[u àPlU†´zýýÆ*4¤¯2+]Q1nm‹Â…™bæíÄÒ"=�}@t¹Ÿ&£"´…&¤PI—m5žþ =«ªéóB�ç¯ËÇÄ ’Ó]ß ÂÍk^ì™ÜJ´ø¾ú¿Ùøt‹æöEóî–¢ø­,EŽÄ2xÍ\^׳e…¶ @ÃdÏ'ƒj®ÑnÊöÐÎmû—úÇ®“"/�þ¡ð?Ô(hlÌœŠÛÐj®“›J;û?2ìp  ,±&ø.’iÐ?uIùJ€+§°³s³¦¾/è'v5/‘Úâée>îdJùèƒù§3Wãð•WÒ§§íc~Z–Gî)×Ãf¦Sh?�:ÎU ø¶a Yäç_¢Ìl6y€°ð:ÇzÑ [î�i¬M¼fÅÿ@�)Çk”SQ�:#ýº[V{'H^¬oâ–³l*ýG&fËX/ûa>ÆA€á• n +™ÃS¹ÛˆW¾ üì^›@¡ '‚1ÂÇoÝϯàDqA0>»Z\V�-“Ú[à!�ÅX=䥳ÏÙ‡² p!°5 ^‚Œ¾.¤3¾€ }…¬W¤°5^�§nÞß-,LBÕHÍ|ˆ¸ÜÆNÆ/=÷ð]ÃéìŽ8yŒ`8�X ä—<¸Ú…¤À°†´0Òö2Áó w/Ñ×ÎD’šÊßÉ•e�í­Tóß½ODDd¥ €§‹ã[6«ÎJ{¯ÇjýBͼÀ„ÌJàrÓÔ $Ëix¼ŠOì(ûüä|ïÀp:‰,¸ òÈÙ;ÿvâ+¬õCÊpÿ·™Ï+9z¶P�eJ‘?r�Ù|+¦‡þZ£àBäÖŠ=œÜÏú¸—“ƒÎ¢Ô_PÍh¸;EüÌŽêÕî»�Ë÷vSƒî9v8Óáë“uŬ4c‡6ÌÔ ¨C­!à%:šËF©̓§Ž|ÒcPÝ|¾<þXëX¯vÉ¡S}¬µm,Ó™Ö1W0«}[¯À^õµÿ”½Ý"£‘H#9³¦—Kíä©3Ò ‡Ú*L1ÃçŽ6HJ‘«î^Ìd¶±+[籂 „µ5Š*ö»Z?\<öˆjØ4-7þNù÷§D¶⥲G3“yVtÜËL°�ŽNÙëDÎ�ÛKÚ¾Ô1ïaì´-ãýÁ²ÊʧNðIŒ7nC°HgÚ�aÀí ÉFÖhÏC�ªmµÝLrxK¸a¾Üôù]Þÿ¾€ÞýRÿ‡œ³Ž8ÚÁoé�ôMkÉ×±‚ÊœºH™›gáåÌ�¹#D…l°á¹Û¬b¿'cÑì‚“¥ñ3Hô"ìòŒ O·ÜUëìzh—¾$í¬$ƒ"€ÿZ{p�œ¶p騵ôøL«û3‚ƤÄ!ƒGAþg3¨j2£Š‚AJõ& Ê¿•ruñqÍŠ #%îVAf¯(}¨r�y c¥ª9.©,J6»Ç £H•swz‘»JýÚÌ;?+ÿ�|ÀC¸ð| Ÿ Oã‚$S¨VQ(êÝØþAû½™îÖ}àÙ·9»øöí¿´*Aáð·‚ ïk˜‚Èæy,MZÆ ÇÚèø·:x†f†ü¾ßHP[ÔÛ²P[üËŸÒ. Áú)á ›{¯ñpGcKË‚~m?'©B<]öÌ’rj¶’�w?|¬ï1WÒQÍ«H�ƒ‚XëêµÜË–6Éß Ê‡êCrÈ`u˜Öd3z«—y–Os{S™K¨o‹|hÒú'߆£›�§±´Õ™²�£sÌ6æáZÊ4…‹‡×säR –´~8;N±H¹æè-Ÿåf{ûÈmæíctp7aŒåæ(ñ‰/Z)!CaQF�þ÷šÎãËCU¸4ô„6yž^ÞÿäšeA++ r¼ÑŒ<ºeDùŒÃî#â°(ÕA ‰¥è'CyS¤ÜãOß"•“K��ãk©–ûq¤;žêUÿ •º»!ÔÕ’é=0zµëNWÐëq RSÆí@¿_•Cû®ÅÞS5ü[ÝÊv�µß§¡¯î¶ÖAý;¸3·ÌüI°Ò¿ûU£÷_·[ Ì^pW†ŒÂ%Ògæ_™É± æ%hËë.‘ÉìŠ!Óš~|Õ)(‰M¡Õ ª‡# ¸Ñ&4¿O.n¾W³eLAž‹¼rgk¯âx|ô35×$w«9ß”ÙÛàƒ ×>VaÕÏt>ˆñ\u̽GIoÚ®ÄÇ©CICÀׯ˜3Dl³’0°]íò©áÜëDmô+­ùeÖô]åÑ/Rã—cn�†¤šM<™ûÚÛðñO½îeWô(Æ/_÷'›°$MŠHÞå“mËh¡{²ÄáùefCØ–0=ÌV?UwrÅwl ãìï*„ü#+£Áù™Tâ¤òQN}¤kÛ8ƒ‘É?ЊO¯¨6q©ûtYâ/aÜ:ôxÙn{“Øiý9·"x‰ØRÝóvSÇõ2Š'®¬¹Š¤‰æÒ_{¨.?X˜AR§—J`JXcA ÿ1Växè‹¢kpÃŒË &Àé~Ý>ˆ¶ø!«tfm�¦H×2uvÖ•Þ8/ xSõ×j¦ä($F)LëQÖXØ«1«‚i¹j ^#ßLc뱚MMcˆ¢Í‰JÞ m‡Êÿ¼•ÝÑrßDü2|9,,a8ÎËIé0$Ê`äñíNG IÐÞ€˜ß¥b�o3¾lÊØ²¤3zäxvÊé¿/�n„¨‘™/„úˆæ,¢ 'y+Hv_eu¯´<Õ·#|ÕKìûbrv UéÕ%Kl¬3”>.ŒöMÝâaÿÀ?=~¹9"cül(l/SبºÝ:<=§‰õ h¥ 6_÷¬/f®¤B¶+ mùœØ¨ÙwþéÍcNúWTŠ( ¹¾4”>£Œ?уÿÆ™*Ñ›+žy‡Ž0°ø êí° §øîÒî/  jÚ�½TŒbWžâÀª§�ç�Ç”ÿT=Œ0è|�(ƒ•W, ¾c�©œ«ðëa5æ-R¿5Äô‘Ͻ³Nú¡»î¼³.ô“euÅá­ÜÊçpö˜Ú\NêÔev½ )2MåäÍ]9$d:¶CÞ6QÎC6ÕÆØ‹“K÷ìka±&-#ŒjGÁ�mzÀ•å„v'Í�©IÜ%#àô1ÍÛ’ß S§~o¯v/äq±È-úxÖ1Õ‘$ÂKcÞs¯p$LNž�Mþ&1Sùa„Ì0Žàž$â£*Û<,è@ÝŒ¸=¡é†Ç¤RøC"PÈÓÒÜf¼à}p¿ÿ!Õ¡·=«4ÿ""Ö l—K[{Wx?i‹H ßÕÔ�Ò£bl�›|æ…iºu ¦ :Oü¤[–…Þ63=a„@ÿÂeF\ô9¹µéó©c4&TàLê@“òŒÕ—�wÍÕ¤EB'ë&ž2um¶»°”#_8JÂþ4? BÞysÓq`O+@¨b|mV¯³&dH%ë/eºwÿFª’¾ÂÒÝ…ÒNNÊ©MN‡“é�Z[¼WÀaBa~Œi° p��Ÿ‡Cÿ³IM+Ðé5v1Î�Ú�¨ÃEÀ æjíN³óB.$œT•š 8µŒà ¿¶¬X)gæâ³ê, é{%.«Í8  ¶Ùuå`UЏìÛÄÍØ2=CW\•qàZ Àµ¸+@ÀÿÜ[Ôt—bó¯'iX’pL8ÅZí¼E›weئVc»âÍî|ºÖñ׆æjn÷¦3Œð‹üL«s÷F—¼ç¹ÖñQ�²Õ¶5좟_¸Çpþ”~Rñ¤ßƒt¹Ihû¼±jÅ%Ή›{EXNÂÊ�Çýc¿*Q% ²¹~“A#Û�s5$þ ÇoçXóéÀs5á©‘u¿|=ÕdE!ì»#øx�S�ý ÔF©»ºNù†oCx®èІYÄ%Nã^Ã*Å>šUŸà‡ÞÙòÊ€_WÊ)=ÿAˆƒò}1 °Šøâ= ìàë�¼Íw>5�ާ'W¬<¦ñ=’-_ £;§Ð³ê’bòF�k0dÄR:¯Ò6�㦡@…Äg'6QÏ/Ö s»A E£j©0OŰ]¢uK÷9ÊeHëûVº›85Ú´é³sš!&0YÖ¶û¤F¼IƒÆAÍÍ|Ñ8^8ù_W"?Î:Ǭ¶óW/§Œçleþœœ?0Aw/u×)ÿþDn+€“¥ÝïY*÷ƒŸN~êPu°¿™hç yL´:•bX6#º�‹,臙·Ýr>«úä>º*gî‹EÈ:7¢MôO·Ë £l˜#3¡š¸Içý³29dä¬ì©ê&«™66­ËDÇË7+Iñð·áŒb[YMŒ¦@þIiü«}©ó‚{ 3¯‰ñHk1 EB÷ =u§\Gþ�¢B¤÷߇>:Ñeõi�ºM†ÕTD!H±F °B¸ ºë<ŠWÔ“SqÔ¤C±¶Ü½AøðJp ñú.;æ{_!ï‰P|ÌÔ6‘Å=]wµ,$o�q¼wÜs*¾÷¹KFUð§®¾áÚ™Aò,kàLÆÊûá=�R7©É,�›k-ƒSõjL½©ci}£=süV&z7$enÒ›x1ÊÚ°. ºIRnO¿¶ÅxÈcBÕÇüe¬³ðŽãã“Ë\ÉrË}É‹K¸7½íÑÙUx5v˸™ÔÍ5ò},ù‘i”­?wíïg½IúmOðò‰ @R?Ð M2cy-wmºb ^gÿ7 ^´3eL²±X7oQ3ã©©¡ËïAU¯yŸÄþš0ç�¢ ÁžŸç«¥Í q­¼™…¢¯àâÁÎ'ñ;jÐf…UqØóÒr#}}ˆŽ/¦dPÛ Óçì'OEhWJƒèÃ2¡3¥ZÒ¬¾ï§îáX‹LÒ5@��…‰Lc5Œ×ªÚü¥©.â@ô' ëºÒëíÙ¬^ì�ŸIÃár•➣³gn· S\ïÔ%a-1bLf�ûélæ¢�>áýŽ—ö.µ<î–Î$àˆGG®•Í›“�\J'ïñ�åêivŸFqø÷8O9Â:H¥{›òqiÝ"téú‘;ù©º3j–˜v×îV‚Ó”ýÞU³•Šå1ÞRÎ dgUEŸˆd‚}Þà&Óî!È‚Á©/âûŠbL³½CÇŸ¨ dí1ŠÍ³iºŒlÕ$©TÌ•ï¶.è·ÑbŠ?²OSt\Ü+”eý—•&Ü„¢ºšüòg¯¼ªRwfz;�»¼eeÇæ ()qÙÚL:S5sJ¦×�¤É\6¸DÔTõ§À+iˆ<1 W5ƒnÚ�ʬ=QK ¼N=­ÉÑ*1ë$Æ î)&ý'Ò¯ç[œO[0MSèDŽÖ¶øïûv•Wß‘‹!åQæ�ò¿ù/ÞjÔù·q€ëùwiÕrZU&»Ç�êˆÿšwõ9ì18óŽÖ]Íž�Íê­ñÄÿÂ�r®™ˆ%r¼÷Rר”ɉêQårÉÈåã+²�¶±ä!Ô°ÃK%˜ëñWxRŸjæí^ÀËçD�´×14>o s¸÷˜/ÉPÆÁãeV®ûäÉv}xs;µ~åÉ¡ªg›·­@] ÖÀÄ}G" U<Ük÷1àyõÿH)ÛxŠôäàN2A¾°g=í6kýØ�ÀvG–§™ºâ%À*Êjè�.!¯i;ûøbòN*+Ë5Ó\Ç/­€Ëj8´Wûtm«½}†øk†óá{äóõ›Ý¨TŽ‘â»GÛ-jÒ½q‰—]åéæ„(“„di@�×­©²‡*Ú£Öz@û’cU“xCUºËÆwÖ©ÄãMJ�Ô3KM°Þ¨pú(ÿ* 犬Ó*¶õÊ,�é@2ëÚD/nX[�x]™äºßXK|-JŸ~U²/„¿4:ÞØÃ5_~§®ª>6]ÊGµø-Ü ½Àײ;ûœG…u†Ý¹¤Æ¤$Æ :Ö�«€&Þ™|ÂÈç?Ùè2J‰Ø*<8Iã¹»@ àðõ“˨ ¹cÝGÊ!ÿ?c\Ö…ïHøŒâ´È% Òœ†ïû¶‡4§SÒ z^�Ì­ G+å¾ÓÎ Á¶ ›ŽÕ¹ÔØúK×W+X�ã¾ã©wœu¶À/<å—Ž›:º|P8¾wÕÔÁ)åèjÄÐd|d…Õow¬,ÛÙüŠð„›ßÚ’;RÚu<=`ç†S{¨Ék�@‹»‘6À7:7c¼!«ªMÜYv´cÓ„»*Í—�~ìªmÒ¸Âßq�ƒŒÇÅ=ŽÎ¯WnÚ¡¼òÅâüß��ÌûêŽøo*ñ¾ZF4L¥˜O¨š 0ëz‘Ô²ôo^êP9¤¯�·ÉÆ–·°iÿtYç2w�‘™Ü¨l;IÅÀ ¿»kñ`ÈÖ=„=Ù™XWÉjbÔÿ¢¶k%Gp5AÎHµ”ƒ%Ö>aV}£ÛÃüJ]™ý¡»�·‰örc&#Гu”¼úr&؇OÑiïmtÓCÖ À6ª t I•k¹o©ï~‘P–uJRYúÉ«„úµ’•:à ¦äç˜GNiïd:óªÃó� ‡Áh{úRw’‡÷ëNÀÙîYHÛloC‚&6¦2¦,áP’Ò™5Õ�ÕBá�©Fçn²Þ‰ˆç¶¾Ö{qS5CÒºfõ2TkÝ·Žº½¦ù­iyÿ¯Kã,«³v;ˆm…뺑˜ÑгáFè0~MÌIC.rUñÚtuòU˜s½ïÅ~ªxÌaISîÃ˜ÍŸŽº[oåê©0úþÍSV{z’¯üH ‹î�Ù^¡´Ú;C^½¢Æc²×’ÐÅÉ>DþÝ÷>q Ž)dªba†<ÚêJHi·m|(º3ò•LÕÀ•Oo‘ºŒ¦ª¡7W̽¶jÑÚô‘5°qíó·þÑRýF}°�yKán ¡¯ÌEý�"ç“DÄȸ˜_ån­,“ߊAº½’Âèµ;ªç7…B?oÉ%oa™ùúB�¤f$Ëÿñ�Áí¿ÒÛT¬E ]Àß]&ìq¤s€@�á¯Ao±|v�ó¤ îè Ýf¨2£OxvnµP¤ñÍ<>§ÓõÿìÉÉ�À´Œüy>S*‡iÕÆ7aÄ *¤øÝö;ŸŒD9ЇXû_;¨úY„Ü6›“ÙQQÌ,B ]ýH¼]C`ƒô–ÆuËÆuýæIPq™Ù‚ÙÎ[§¤:rUÄ·MQª²é7BnèÚüï­;½R™N:.�Ž<|¶d2Äû††#‡>iFr¾çfö˜î)ê+ùsdþj&ˆqˆè“Ò‚°Yöª�Äù²yÙyĦ» ¾%P¬¾%½<Ê©ê„�“#õÖ$Ö&Ó¼Õ]«°&yú5…)a&Î’"òƃÙrH’ɡոzðeS�m8æW1­• ouµlº“?¥Îhƒò³:1ø¹ ¤^ÜOCq2æþ9Þš»Ѩ”ì ±K:þGAä\œ$¥äŠ|H�ˆž+˜m [_5ü|µÑÏ�½ðôzàG»€™û96ªÎ¸êv¼ ÷ÇæÛ è –×pÆw´&iüo3X±œd\Gñ %CÃÁ”N{«ð°X�/N#-�ÜãV2D¸Ìe4O ÂhRSîN˜­€wÔ^�Áž]Ák$Ó¡“·¾ÇÁ´iÈ_êΡ�†\¦üÐ ç£÷ãaJ?QÁ�d©¸iûŠ^дN]žÑ FþWI¼E6÷çz°c<>ôåÈñðiBÛ€¥(Ö(o@�žèð+ë™"T?wU!|Šl}t¼qx>aå3»=GºÐ{cÉ™%Ó-U,-Øp3UÕŸ€ rë{Â2þâÍRúGÜÓRÀˆ6êçâPaðâ âqÒåV‘ÚÌh^qhý¹ÌhÏü)´IGêî7ÁÈî°’„_ôNá+“µå¨ê+R ~-rºtÍ«Ãf*öcŸ•¼Mý�~d–– !3†‰|?þû­ö2…ÍWà„2ƒŸsÈö]ãxZÛ»‰òÝÁˆX†-JeR«¢³¦KÜð:ZJp8ŸçÌGtû�Hqþ]6=›ìÍO$0}‹è²üÙd*xàßù?Þá*‰$óìüb´ü5IËИü…ÿ¹¢?Ð>)Ce˜ŽõêttLÞ…Âù²‡y�µæKû‰úr::r8Ê Qh‚ýxPùê¹nc 㬃ï .þh%Ãdîf¡R-À?…ýÙ]±êWÖÇÖ&«@Œ~ßËbwÅú¸€´ Iî÷�á„t¼´ŸXJvÂR¯ï LS ! ¨tØ ,5/®ÉÂÐ�koÈØC�`P+Á„1Žü‘öΧ§/¢Fß-ûâÖÕãî� uŒç¼SêE‹ynö±ZìÈjTõ}ÿðÔ'/Aù!GÿC娂GZ^WX¬í´:5Û¬lƒösŽ škL¦4ˆ:èòö¢É.å—µIÈàfÐÎd!î]–<`�f ¸ÑJÂ9ޯƃ÷ixA_c'‡¯ÛÁMµ<ï‘’¦ ”¶Ò×õ�ÏóؘáLFÞcT ªI kt�cð¤'*‡ê`š$_;<¬[íM¬F³±t[u–ÝY‘YßõG�zT\�p‹±4ÅV6Ãüýõ‹�¡GuaòæZR8¦]ŽœÅï&oÇuxK?Îè Zð¸òEpÖž Z%@KÒÑž™ÜÆFP øW ¤¸­¨ Mžsƒïpé1Pá7S¯­çÚíètV“—c½¤Ù¡Çö%ìüjDÛê¤%Ÿ óïC_P6Ý­˜#¹.°¹� [  =»F3’wÐ÷ø�`©U·¦>“rxü…« Âiã—Í ­@šÏR¿áo˜í—ÝB4z²ò"‘K1ƒ¡æ© (Â[:â5f@<Õl¤¨BçVU¿æD6�ÃúÔ·™-Ïá8Ò×ùÉä€8…o\.ã÷0­'óX¡]APdf:‚6½iýUi¥·¡¼M9H#ã²—;k²*xXF8ßQ/ÐWxØRÅ‚†\ëO<¦·1�?8ˆ_Óì`YÉð“³)E^ã§9ï&›Ñ;¥L¦]ˆ ü6{ˆá«*`©ìT&À\fê#̻ɣ ½ xõœQö?صz…5-Œ5«#î]þ( Ü ²÷X$Z 4+ºPŸ?P„[ÊçÉ).¾˜©ÑçeKV?UVqÛ#‚²Ei¹ÏLoÍ "}€”ì}Šø Ã2£ „µ-Ÿ‰±ìÄ�ÄŸÞ ]Ü¡ê}¥Šwÿ‘’�\±z· Æý¼v®Ò[[{à"Þ?G/`Ô/ì†`¿p÷úÅØÂ¥™G\Øå`?d‡Éýå1+NúÍÙ‚œïëÙ9OþpOK{í?ѬyBœÁô[›ÕqqÆñ2‚’A&Šå',¡3zA侇·"ñý)”),½wûOðl¨Ÿ¬ÐíV”OP¿¯î 3yh&}ÚRÙTVíò×Nl‡Ûƒ ZX\ݽ€ç¼ß âDÔ4*Ä‚õ�€\Ì¥u -& xJl ·Qv[ûmñ¤bè6O~4·cýŸŸo�:\›í=ŒYèzÓÅk”dZ2ñçÓ'Ħämn�ïA ü8%Eq„âÄšvx¢bCdh™C0Bf|€¢£Œ_„3$v»:×êh/ûùÇ�{qœ£[mr‡Ã+6Ì€áÂÊ/­8¿»¾pÁ&՜즾 ý¸=žóFòNQl˜œÄÎ'«Ä!8‘/ØÓ—XèT€bó§lINõaœÓ 1A fƒ·š¥°_ä§cß�¦eŒ5¡³ìˆŪ˜ÅjtR8¾ûDeŒdÚW1y×»Zÿg[™òp`‰/E5…¸¨,hÂß"ªzõ³’ZlíÁÊý–ʘ„ –-¦¨íŠ·øh¦¯r ¤Ñ•â\¹xô©žZcš�~ÚÐuGfP<Àò p`¢W;ô/µl? P�Ôõ©t2óùöc¦§¼ŸóÞ�ŠóŽõãï±Í{½õpû‹ÍhôÇvÍö|Úãt†R÷øA#Û…DþÔNS:â%z=s;&ñ–L)N.ݺ© À ‡f�–N¢ ÒÍS3�O˜1\Ñoq/ ×*Þ\OôŽÄþ´C¬ô#%ºó%&u�zÊj^³8aw \¯H»VM,g-,ë«ó¯,NªñÝ´•Š�&'4pyYß„XlŒ¦®éd!ìÕI›”;\¾Œ‘y¨ÃB+¸Èu—{…Õ�M äS’?\kký ¸­÷ qY_�q¹[‡Æd(ˆ}­ oÖéòùæ§»v´‰w“Nþ¹9rð,ñCGK;NFi¾k\Q×ÈOB'¥±G­–«ò]GqDõày¼½B÷1m"xýzG?ú;4/A¼J?0,ì*8wÄÁ=¹d#Ÿ²ŽpEœ×$T6þ`w»û¯Õ zúêB¥œ²ájÇk µž´jØìM�áA´ ¡»°�2ºß^µðò%õ©,²Œ—›ßQ…ê†Ô¼µsðFÁ,‡uœJ´ß�¡Diù¤MŠ…s¦ý¤í ^�ñ5¢CÒõÇÚ‹ñ[}YˆNJz¸[vo�ÉŸ1çDZ{rD|†/Û¾ÆáŽ»9o—ÔS+s¬Y~¹ «�.óvŸh÷@£RÂ'¥ ñÐå'üºèEû�ËÆ<åì”þü=ó¢+À2¾�îžÚ0eõ"Þ ‚ïpöÍ:Ú¯BNjdžÎÓ›ÄÀ§„º¬ K‚&{gKÑÝéÒ Ä<(af|o$(QOÒàb‘#–…WÖuóm¬ƒwM�ï4áìö¿Õƨ7¨SBÿ*†å”¹h›ñU¾Þ&듼"¿ð4³K *øéô½{`ËU9.Bmïn“è+׆&ÕûF[cˆ1Ï6Y¿x„fýj­²È[¡ºg ”�\$UL I:€EÅ<À.‹Ë²Ú™‰ÀéŽk½�ÚúÒö×RhFv*Êô虳…d²Ê0b0#¡¢ˆ¬û-tD«O“¤‡Z“º€õ0šÓéUˆM÷��5Î,\®\ �‹Ç®Íü°Nb¤ÑP1&oÀ›[À$SøøV%†ØÕmG‚þ_&ó©3kZò6¡ê„‰¸T8vñ$ Ì»y»`Gz™½ÃVk9 ô`cñnàVÝéÑï–²d 2nì��àbý•¥/@Zå:"â§¿P�žž[Œ´\£ Œ? a+€œúä©7*ï’qÓòw�fÝY¥²š)‘Ýrkq;í.‰w!ŸàdÞ»,ã)LUc™¶¸‰aÔÏÈ›wŬ³”0±8Jž˜’ñg©ªÆöYÔž+¶ærÇ qç©Ï�L㱤“ˆÍ1êÝ-üÿ¢¤®³"#6[ W­˜ª‚ð�° :K¨”VËú"o#ÚaaÌ#^ ö¿ÊÓÈ.: �³Ç’ðAÊ>´a„H� ËpÇLZðóNóTÛ²Ÿ;;Þ²¶}o†x’›úhú7.çyN3ìB=·b©n°ò,Áž8° kvuux/�H•Å"l¸w£ëQŸ"Ù�sùå1 :›]Zú~©œßµG‰òÞ©«¹œß³§Te~r9ÅÜX+|ð¤B›ë›½ô\â– 2.óbn"5f7iÐ+ȅȧ¡¤$ùºœ ¤´ºRSCÅç»`aúè�yÎ<9šÏÑk(¸F Ç’W(….†âÁ$ƒˆCsa¾„ÁÓ;°ì›)j�e‡Ÿ÷0�Ì�ñP3ªÃ±zmžñœÛ”15‘W-Å2ÛŽ=ÌQ ßÁ!*”ç€H\ê£/ƒF”ž“HF1'’Ó¤¹9ª”)u »Oí�ôˆ®ï‡W!bÿ¸õ_y*A¿ o*Q\™è¦yÀtv€P Õ蚉9o“ÿÈШ™”·¼ÃjŠ“ˆ�]M ›!)S&?´ËÿAš•¨AÿÊ6IÈ_FTèǬÅO—§ Œ›5«‚8£‰ˆDÙ»};2bèiÛo~ÆNr!õa�Cy©>½”Õ<¥È€ðºó'ÖMûVÂu½½§›�=�Ãßý‘,âñ?z^yÂö|W.vŠë½©Àˆƒ�—9I�d½wl}Œ’–5Û‰‹QvpfÏÐnÞ·c.É&íbŒ~ñøùü>€éE)w)}ÞíJT5†Mmÿh~|Žœö‹æ€Š9íTÄT;˜^@<²;¡oˆUæ\-ÆÌò·¶"·è×B…Ózî¾øSëð>o´˜¡UòM• 'QˆY•r5çyá¥c $�[»¸�~;¼ê H¢Ù7÷ã7ûìí1žÎ=Ç[löY˜Ç¦ª§ÿo—òÚž‡!RX×ú>GOÏÌ+�Ùë�‰ ¯²»ã«zïÐÕ´×Hý˜RÝ«ã\�È{ýj¬;mxáÈýÖ‚o×K³”r»òój‰çiåx�ø.4_=|jAÄhŒšéá«(Ó|&È×�H’ÈÂø@=–»È’éc€fOáã¾Üxœš�EÙ°æ)Hc'—°•µì 7\è Þ… 8Û±Y†O]·rÎÒKx]ÿÂû¼–®§rã c6RðñiÿÀTµÇwñ�w¼nðaÖ<·`nÚ Ãr•¢HîÏ5ž©”#çkx )Ÿ"ßÄ>6$Ù™K9·äÆ&�Óv4k6û$æ�ȘˆÇ*Ü`2Ö53.yf¹swà N`‡õ<Í0v)u𲃻ç8�ÅÍk0¥ãóv€~–½V{0hlRâ#rnˆ\ Ûq6 ༡ÂÑ'cÙYX®½Ë@ àéˆ}ê‹ÆŠXŽx`¸±ŒQ"ÿb6|oÞÀýOjFÖHJlZ#J' ²é”Íë£W)ðÒÞ¸â^ø4JAsÓÍ<ö.j(pð•îÑJA«œ| ÷( �œóJnê(Cªë–6±HV‰®ŽÄÅŽ´�m“ Çøˆ’QÌ6‰MvN“}î"P…ÍíNú°—pl”Kâyâb¥+<ÕBÚû„_Ãà¡3ý(¡�Áédzöþh?ÈU\ÅO¿YfX¯HòùüÕs½àwÌõ*ýò'_€4БBì±?só¬~Ña[^þÁŠjñ?IÉF#e1(U•4œjBbƒ¼ìªã³ ¨Ô^v³ªRl-.‚À:-Je4ž§/~âaMo¥‘s¹Ó»=Ž¢ôg"F DúèN·¶BSbÑÚÆ™0Ò…¤9÷ÓU$jÔdÑ(˜€Ô¬¯ñâÖ½dE° Ó|pŽVr‘·tn?iKÞ"‰ÉPªÿˆƒ7Äú\pIºäœ)�¬“Š-¦ÃàRÔ>Ÿ³¬\ ôKÚN¾/ýBSzÂç}f…2¼Çe™ë@מ’ÉJÒ“)ñU峑~MñÀéÙÊw‚ãžú¿‹º¿Äýð¼wõàWÐhô›Sa4{sìeÑQÜþÃ3¥yx¡Z‚€á‡mùud^žû«mI¢°÷Tï ½xþjˆ ùÓ�`šãjïÔ~×׆�òï:WÏQ­B1…Yš9•6i"´ªlÈ’ñ¸Z3îæŸcfŽ´U\l¹‹ÍA·ª}Æ tãžüÌ»F̶êPF³~ë<ß|À¨& Ä¥dÈgn(´Væhˆ4tZç 0ÿÆüuƒ¥`Îtׯ!®Ý™ˆ4¤]³ß4#™­C4ãó7ÔµWí˜ÜBv0ÑMÙŽŠë{CÿuuÞR¢bDç:æ­�ºYÿøw|Ÿ¶DùÏ­4*êK wžwŠÌO³Árª¹¦"Yî<¸7q1Ø·Šyn{»Oèx9d\+œ-CAþ¼…úôM1DM à¶Ãh«ºžáÌxB«:ú4V¬Æ‰¹ub©Üèíèq-—°]�Äu«[’.:ÐÕݸI‘÷è/Žr4,#K°£Ù÷‚[õí%1·gß2/4ªâÝÈ$¦]pKÓu%ã„'>ZÎ|Ã[LžÀ—uhF%+K„¤3(‡ØŽÑ*`ë^[rn¹' cu¸  q(a ŽÉÏï“<@ljæ"²uØ4[ȃê¨M0¢´cHvýŒkµæ©éõ‘‰ÂÊ íù¶[¬)ù¨wñ†Î Û‘¹Dß4#™­8:o¯…Ñѽ—n óRq78Ÿö¿öl:½iE«MÆ*©”¸N3‰í’…f·gØåà§ö–P(´H›õÀèb>)šÄkàqÁ * fˆ0ª4GOÒÖ²,ݦ‹)‡ÜÔo n²œw_Ó§AŒè`èJĸXcÈy¾°(›FOÓg£¥Y¸åÀ¯ *ŒÂ]“¿ç¬õa˜ó˜©Õc\;ËY†‡Ðb´�ŠNÜsÃ1�ÕÑÙS<�6ÆÊó?n‚GÝiQ/I€`oâMyEaï—ßù  ™9^#Ø:´,B 7×p(ETkõ�J§Ž«Uñˆ,)1¶?—"%˜…H?µ`dÇ~TºcÎ…¬Öø-ÕÁñƳµ˜'´‘uÇrŠMÊ-�nŽƒæk4†2QżF¢Óú(’ÁÉÕ7¸‚0°¥«°C?c™ÅŸÿ>¾5 ‘V’$ükï²Ï• >¡Ôü×å�ôJ!(`Ç>¬Yv*�Ûüðÿz‚‰�‡·þ@˜•óžÆì;}ûðåÀ�JºÆt¾Å�Û÷6‡ ZÛˆ t‹rkç(fu]7 ÁóұϞޓA |aõ6a|uö0daU¹ª50‚²Ë—Fˆ×):°Õ1&àÊ*q"‹¯SÌ„�â³ý\rv¶ûí�ß-§œ…Že¹›®øH!èFÄKÈ„üög„xí¨ßíùœ+,¡!*†j‰(KO G„šËùäÑ÷ÞWuŒæ²ñ_›W`ZæîN{D ¼’Ök·"ÂÕ~ÐꬶP/ÇÝ£1�=Õèÿ¢]‡ï NSE½4omÞB K:äjÏnßèt‡†Þ• Ú‡¦â…[ÝúÙ8Ø¡êóÌ'ÄZƒäU­íðk±—ÚǬ;%?A²Î6?õ"fÙmG‘|Uæ@‰Q}»Æ{k FoDV$— òd8ÿÂ)�Ä<£l£Õ�.:p£ÜÍÄÒ È'\ð—Vžì& yK(øLB¾½Â¹PKw…’ûf]�¡�Fò½¤½ ÕæÑÓ®n¾$„”tz“#¨GƒñsðÆ*7G�‡ò&,V1D§êò‰íÁö‘dÂiß{^�ëÖüÆ3þmN,ŠDߪ>Q›)c6*fžZJ}�Äë ç£;�Ú,¦ãŠU¥˜nF53ÈÀ.ä¢C‰¾¥%û"«hš� jÐ'Kì>V¦w£YíùÁeæŸNlä…ƒfnQ¥Äå蛎Uußt ©Ž–GAùðx qH§M�~2¢Ýºµl>K°«ëoà÷ì(ÐtØ©ì̲WÔß3uÞu �êѹ‰ø¨`ü»ÂzÒyGÕÇÓmÛŸ±dé.s^e¥ªHtÀ‡ÎDYpHÎ\àqhðg‘¸{^¢ä2™ÖÇ?�Ñ93bì¾ÞÈý„»‡Ø£!˜WgQgÇ a ÷«âéŽèf_\«¦sØHÂé–ÉØw2’|Ít,IÆ6/†GpÂÀÌaÃ0.*¼2æ‘ÜÞhW’—<8 ,°?3~¿‘Îá°_ÌJ�•x»’}Læ�o< cæÖnLÛ&mÞ¬ìä.ò;> 0×:zÛ0£ÕS9FØú/&0Bš'’YÁÊÁ±ÁÉÅ’#ÊTlNHªvèÃàé!˜Q˜[´ý…ðÀ±¡û> zÖH=Ûÿ@é4o([KBvyL\Y1Ñ v«yZP‹Î۬"v§ý0¤pëó&?oÀín ÏÄC?‚mnÀŒõ¸uÛM?ÍÌ�ØŒnn}a ÀÌVÅOà.Ärë- :Fý…ªÈ±™•ƒJ1[Gì—˜i©Yá°áh.8ÙĺúÌ,ô„ ƒ+õ¿×§úŸûƒŠÍrm1(»ãØK¬¾H]‡:²M²U+ †<çš‘@ù,…†ˆê!ù^ô{|s*)®gÏ÷³P RT/±uZ¸:€"Ó™.Pïk“qZUÏÔ× �`Ì0Œ¸°@µ¬8È/|³ø¦KPÊd¤„p¿eù¤·ÖÞÃü¨D?â.0B¥×᛾–å‘…(ùëxþ² à·—oXÁ»Xëd¶¼{of`Z�tå"úãCaç\›q�º%«š± Š hÕÙð—âÎf˜c5È_ZÇmd[ä�—ÌÝ/5ôH犸jÒ¶ýAÀiÑÀ9J’þ˘{‘1Ñ�tTB%7ÉSŽŠhþ2z—gÜ\ “eت»Ç¶Ãg(+ž^Ò—>1#]º¦Qš½ÑQjWX¡ŒðA³d8è4Y¶ä€/Q( *è&÷æE­¸+—$ë]ÄÏîøÖ§+â1Iæ'ü6ä IV÷¡¬$_f]âú`j0’†¡'¤ªæ38=- ÏüBt¸�÷éÇ:¿]™°õ¤³OöûÐgWÜù%Ã:„Iÿ„MV�…M] ˆYt òZˆ p¿ÖèÊ~ظÕ1ªPºþ+ø¬½*-gZ®®N‚ްə"*ˆÿ•}B¬åþ8Ù^ßY‚«KÄCæÈŒàÀRûÝŠHµÉy9 ú[wžõ)GÜo‰WCÑþ:Ái ueDIJˆŠqŸÜÍà�Êoãè²D[ÄÙ(51A|ý(HÎ<¢Æ!*¿’ÀÙi®ì!ß¹|�?Mc^‰VμzÛ–Ö¬}GŠ “jÕ­Z©pµ¨ÑQ–ŸÀ9²0×ÂçB?¥+¾½îp„kÛ''ÔØ…2qû›^òK@Íð�Îì*ÙWoE1ÖöÏP&iG-‹9ÖáæzœtÖúªœÓUQv°bt­Z¥LÞÄ�`½gˆ~\cß ×Î-u_cþL÷ðú"øNÈ5Ÿ×Z‹òØ8ò%®)ƒ k–ãÇÖNßÐ[’Oœr"ÔJ$hß} æª'€§m ýò£/díu²7X$Zae‚Ô†ˆ¢4Ñ�MÞjƒ¼­£+¨|¦õõß;êJ�ýISØ�úѹbB›Ñ7¼ðçN&º2àÕKX.Ç'YÚPâÁŠo}+Æbù^ ¬S®æsyÙ)€ÂæÜêÀý÷Úy~aoŸÿ½‘ùßg}ZÅÀ¬ÝTëJ­ó“#VÇÊã-Õ×íû$y7EifH>YÖLqª£yJÉôwõ|«.š0¤{—míäûòÄ-.|¢bÏv^(â*}…fî¤4ëSY.›„²IÇtÃ7Ù«¼ÈçmÉÇðŽJ�ÌRp}àÊ·"HÂ-ÈòSñ‡/œ,×ÃÍü$þîérJfЂd}Í?¶š œëÀǪ!RöáÑ0áq~9G? ¨ðÍÙm]àô×0¿I@qÉ5¥«›\,,Ä„£i­ÿOOëfŒ/ä1ùgØ#q–I¯D½p—r2ÜNœê»x»kk^�¥×›NªÌ´�¦©ÖáŽ;½ÃžkÝÐ…·,}ÑÀ·ÒòðÌ[Î ð;FÛÄZ§ý¿‰R1 XO€9©‰EO~ÒëB›‹Óš¾|ºL7OFr®÷a¼2§¨·åzP)©ñ�,ITOYdyu§6½«&ÞnkL6”¦x�ÌU\uÕ,XèP†Zq:ÿš f4¯·Ä>ê�ûLÍü¢1î= &¿2ë;æà&*L—-rš8¨;¬àÓ )C[�&ìs®–ÆY˜²`57�#ÃèÁÊ'ùAà€ˆç�€ƒçÞ<ÞñèhF¢ú2ʘ5ðd·ù]�=áÃl ÃSpi;$(ŸUÊø¤Å¸ÜÔ«x%åcÄ$×n=C‹Ô¯3È[¶5±�í“Ű Ÿ½˜lH÷4rÝGcŸö„r�Ô6‡IÜ6 ã$kø›e²å <ÞÜ€h‚«WìjÜ9}vˆë Re²H=»ïM̼„EÀ¹·‰lkc=ž[‰­—ïÙ×éÓ*TÔ;MsÒÊèÖI_Åëò ï¥à„YÙ¸§3ò ù2V<ö·coèÜ«˜ñ¼*—nl<Ëv_¨Ómk{S5ù‡÷rm*ð\:ì©ÑC5;h£Ü¨ÿãý@m�§ÛWüýsš¢WÇ”1ÎÃqÃÆù‰´î]¥@úÕ'9öS¾ä©ƒ×T%­w ºØÙæ¯kÚ ÇÔÿeò-ƒ§n–'ÌÖ—X<³Ô`7†ªVll[^¨Ãþޖ̤òÅrÔÕ‡/…½á�_>®ƒ6ê †´�Û`DDDZkðx}b¨JNr±{q\íOk<ñÝK_w²6KNõ¬l˜� 0µÚm¬…ej™­eŸ¢€¶˜ëäMûLåì;ç”¶Æ +ì¢óC"]± &•'NÎQV+Ý,UÛ^ãn¡¨ J/Åö �‰ #`P‚òŽÑ~bü*ˇё _}Ú>“þù }-Ô¨#TghÑÍ…BÈ™ì¬èƘMUœE™¾Ó‡U�¿©·~˜Bût½,•5ߨ·%¼v@L˜E�6k†àôÐ'/Ú:Ÿõ¬ó† ”©²éü�Ji ðq†=ôhŒï¨Á#‹ŸoŽÆÄëꎬ.ÙƒD°m&;�Â¯ì¨®ß tk;Ç\ z|‚'”�Õ=bû¿«4Ù u@ÌXŽ_�¡$˜é|<¿› gój—Ó„¶u`]BÇ%’„udÞû‰S«I ÉÍiƼFBjÚ[ÆjO*n&&Ì.–*�ÄeÔXññºiÊÈÙ:Û¹�ãR.ÐugwWŸU"“&9UiÉv ^1!I6ç^Uš– $ny%º ¾nOˆy,][Ç‚.¸6F~£jÙ–öÐÖüÔ úŒž4IÌÉáC }‘Þþ‡AHŠÊ7Ÿ?æª þp*Tþ£tv‰9AéísS¢gÕ|°Ž‡“/ñ»bE|uAh[Ù>~,JÙþ‘»`v!g¨0F©}óh±´[…9ºâ'd�ElºÞ„½\‡¦�£¦ˆšÜäó[ÿd«ôw8ˆÞyÓÒ£²þ3xÎ{²[MxC Äcü£é› "ò1Z\¿qn±K¯ôKKWßd¥–1-ÙAí»;çè`ƒÃ†¦Ã/˜QŒ�å6ü÷?1ÔS7‡`¯¤»·�ñš�äÞ&ª;G©"êþ¥~ûvQÚpQJ –%Rv¦™Î¨”æc~AT?+z¨Ûn@«¦ƒ¾|ãè¬Ô¤a~zcë¿”Úm©LØ ì²÷³{à|ö >¥@±j(±—#u;ÈŒÏpöG¤³ P£´ƒSXCi2¡¾�ëË=nߎ¡ ±�AUÚ1c+xShQÐuñ”‡¹),Jx@1¯4èÕªƒy6ÎËÂâ�;àp&.†¼.×fæc­HPåÃß"&meÉý†ãÏGAk¶‡Î.‘„´Õ~$vH›¸ˆÃš¿kzï{�¼hhgR�´ñ�äB! ÏjMW-4ïmYÿñÝå¿Ë~P³÷Sà  c "E·Ë!‹™„þ¹‘ìRc7Wx¸üèFå\çÍÕç%Æc ŠÖñWöƒ}¯j²Q¬š!/Γ¼E“OÉ5RÎ)'sŠtÜŽŽÀÏ.Ê0¬O„Wy*D»_‡8‹ãUŠD�ƒ”3KäyŽ;p£ŽhŽñx™p?ð¬èŒ`é’aàmàà2ã’´›c¿U ‰~‹'Ùý2tïÐò�âœz·ù¸ë‰Êä¶l‚ñ sË“ e{òóÿ›Ã>6ñS¦–@Øïó§Ê=Kº2¹gÞòÒ׿êšÅÈèYéTz Þ¶�¿°KÊ»4Ù ïâÔ:šÐ÷ûk*sIþe¥ñ¥æBéÀµ®bß;cÚ(’¨Ñ vν±Üœ¤²ö™wóÿæN¿ì9©-e„b¹ºS tHØv¶û5,ùoÏp2¥Kô‘×Ö:†(b¤\œâ‡13’HFì\/zÎ u{´gíx®_£FT3Xr�b$Y�ùïäIš[ê䋪ê1òñ£›Æ×K›u]¹ú�Í<…ÿg6ñÛ§Öq! X'©e¿"¢ùÅ}ý'NCª¢—32R±Ý‚mQnK†Î–‚†q \¦B¨b�¶_„õb†ó„™1†ù_³x¦3Ò‹{�+–W…aªç¥™‘"H�†ùYŒ×¢Zž:Þ6ªš•œ5ÉP_±c }gÖ±X7׊žk·^5å´;+·_mæª^üVË!ÓIÏhG™`Ž*Õre3Í¥¼› �ž96™+ü\or;ÜÅŸ<°ÛîýAó´ $Y/XׯÉq5ª¦?„Û¸ i½ÞX3ægzÇZ¯£«o|Ò¢ íhOukEéïDZèÏVTak–Þ)«Êm!ðîD®ì[|•Ò@¯Ðç�B_ávrvFª}*Hg·ÏF¸Àd[;nÒ¢¡þ%N2¾Ä=¹\–4œ•Q!šqÊæ6 Ãî‰gý©éÞ?8¾}!’b|Ëf­ â¾�dëGO �•sçtTsºÈd°7W–y*'LjÁ¬±tä«Y/Ø¿*?ŸÝ�~ôdÙäœÂ®K0®�<æ„fýƒ)ù]¸‹ZæèÏ2}IäXV-lgh´ÒÏˉo³¹¥ßY´fÀUÜÙÆdÊ\A ´ÔIuF±Ã7_\NÜ$Œõ:?p�‚ Ô‚Ë>Fú¸—&“:Ý9Ò � }ؘÞx´¥¿|ÊnÉeXM¼Àôç/“± l¬&’øÞP=¼ )Oá;&g¼”‘=*}ìú¸˜öÅ(µ·¨9:Åx»•´wÝ¿6\ô3G8ü/*ænFÿ4 \ ŒVf‘ð ˆþu'NAÁ‹Ä¯ä6ü,õ »Å¾ÿZ=Y„12ˆÓ� ø¥š,nÙÇn=IŒ5>“ùš>@ªÍ@Š+ÇD9à€`;3äã…W*ög 1Öbý £»£#s5B¿{®Š™a@K «×�Ý‚CsRBÁ63t|b&„­· Î}$|R¾áˆFNÒÆ”Qù�˜A§ gøÂœW8B óy}SŽöi n+=ˆ×à™l?lÂX~ãŠ,ñ§(¾2‹ŰdÐøË‘ƒÕm εÛäô°²ëðc®3ož�ßýCÀþšrX]"e5š¼|Ç—ó�ö}NÿUÒÄAàô2P±÷ÄÇÀ*[†½uWK@~Ìå“ ³ Åát¥G&!ÉÐàwiÊàéäëÍC¸qÙâSa©­ø¦íÍBΑ™béÎJ1*Öë•©ŠbãÝg­fN6\Ð�:·Ååñj¦DG>Ü;iøüû¤ô�*:ô‘Ågæ²õËJ­mQ²lm¾BUU—NèÀ?4ïœázjO kB 5¡5×ÉÔš쎳ÆqгkÞ¡å4â5O šÝ¯F²¢i] Š•Å1Õ:ð"šQ–SÏÖ%–S›®¯ïdÇ—[ÜÚnLoÝ?ØePGôœNÖOô)_né6Š_pPQE²ñlæôD¶ßý'“;Ýh‰ºû¤dΔ€�6æïYïn' ÷Ùˆ;ãQ¸›¨Y4¾î­�|LI[â¤Eæå¤æ€\ ¹¨"·¡Cô”iv†/²X¡k‹„ê'ÉÃ…R7A}4ÈÕÈ}×΀Ê?O�zܺH£ñÆ—dYÝ1á~,K´·ºnKÙ^·n‹+jìÅðYü>»º@%4¸¢àB‘çâ›XQŸ}æ|ƒò>¨Œéùä6Gu.ÞP³6‘óEnrj�"jz² ýú¾�šÖw‰4÷Ûåàÿå#ó5Õgk§˜?‰B)ö`k÷Á>ÿýlñÀBR�â,Ø;ug囓䋜[¹"«d%ŠÞÆ�)õÙ«.¿ÿ:ßÁ ÷ö‘!r·Š¼¦¬F„—ºÕ÷²%½ttå!ð£ÎãmRïLçrc‰K¶pÒ1Pƒ ÅRy› óX±“±A1V¿“VžèôV}B¦ê°p°µÚ”yˆJ|ކRš@ ÿ ¼ßÄ( ¬s#ý OζíC2�uQ¹ 6ºJàjo&²1ïI|#ˆ$ÜéTŇy'fèýû�1¹_` Wƒ�ðûÄhæd ._§'}DàŸàíF„OÝýo`"äÒ)@?ÏξùÆu Ú‘ëR«OK?>s‰�5Q½' bD×hï8·ð`«?tlãr@`9sW®i.Øá“{7ŸB(œÓLx³Èc!ó)Á‘•y/›}ܲ§�í@i™'2*šÊoÊdG3½w0Ú&ƽ°RG/9÷ÿô€ýÅvÐ@Ï›gÍd2¸jdIó¢ÄÞnnè?"­Å'K— ›âMX¸(}© ”3C±\†�-XÄD½ÓÆ‚/„2y^¢1Ú%‚!&s�]`J®ÇŒ—Òrì*P0áhîY!*5�R†.’àN-“cgÈ„þ]ퟃeùŒÅði]:ˆîPBéŠX÷P¬�}¶—½4¯Û0Pþúü3Ë É†ŒÖ;þƒË{êúÆ7�µÇ OFÌ™ ;ùhý�wø+"úo÷ Jêr½­¡7gÉ_°öw©«_¦žVwh˜Õ!;¯q†¶Ýõ|!$ÌIghc¯ ߉±ßï1¥jý·C¿W¿¹¦b©}²±Û ­òµ l5ÔÉ)¿ é^ÌU3FŒsv÷ù@�Þd¿›æ58ÿ[• ‘ȹ3eàp³ÈG8lä5_>~Ô…‰bU¥óRG“–î:Ū4^ .õ�Xþ̺)‡šµénn¯ÅsÊ(&?ù‘š,J‚ýý ‡–v¦%ÓxWqŽÄáµcŽ¢wŽ´&ö ][u‹Gm!B\ÔÀ¹=ƒÁ$qºŒà8Õ}r\¦¼gÚÐÄz…ú(N0>Û;¤'Bð/Tƒ„µõ²­`´äò:•ˆêWEÛùžº‹µ€…ŠùÈxìÌünš ñ”8­Ž <–6‹IÈ4©BJ3›”Fç–(£S‡��Õ­Ù%¾MRnË�ÇÕ:Øb�rÒN=@п˜Ø‹Yæ·'•SÉl"³›k!œ×ýä!¬B˜*%ã‰CŽ©ÈœN½Ó¸fnŠoeàãñxñé—ßÅž ÉØQ¿\‘6Yóå.>ˆßÚ8¢í)"¼ó!Væ…¾Ïßç¼\™Dc—w^&jŽ74ôô�€ ÇÏ;¡ÌBEëm^�h+oþ7F¸ H0î+4yrщ«•ÛlOw®³É Ú Ô ”'»»Êß�À½• Ä^Ž ÁÒï˜À)o;놗yâ.¦|e⼿å[~3_}¤,ñvún¿—X„²Ó.7Ð3`Û;Ãä[ª’<âE>$öo,9d½aˆFÜ·ž+ƒ�Hé2à*&¿ºu_ƒ^–if#õ¿K³:c[Qãšê5o8g77ð2Rª1.IÑ#Æ¢ ýƒõÒc9Ö[*•�*ˆzÏ�z¿ÞbZŠ!-} qòÀo߸ „».>ÿæÿƒæZ¾ÀVö¥qì÷LIm-4ýil19+,hƒ3?”w�±{�s4[›~rŒ$Œ‰6.s†Ô·è¨ËMz!àTíßÅÌ]™œbì¶5áüR¥}Ì?\.ö}Ž ¾†Ž…K9ôZƒÄ|²›,�!�¤¡� 3«Æî[Ç?šqAåeCd‘oiº·�ZÞ5ç¯bíǨ0ÌÇ„~†ÇbžÑEÕä zé÷ ®â>¨×•ìõtÔïea[3ÒÀL¿©)k—‘Õ»GDÜj¢Ÿ:ðO ïŪ*ކcŒàRëðIùʬ@›»¸œ¬EJö?ºnÊ&lžXŸ¡þI¼¦hÀÈ>�@°X›DDk‚cß(Œ(y÷ «ÙëùÙ�<–:3õÁ*•8œ8Êï¼ðpÖrŠ`Ò}õEmÛӵÉ÷Ÿ·¶!mU×4èY±—Îýg¿·Õñ±¦1‰h|¿?+¨ÆBÌAdFïÌÍ9˜¹=v÷¢Ònœ —.Jc«€9~hö}ÝÕ rQK-lž¢Ë›@㢠£r{—܉¶KÞ!a2I‰vùÍPH&.O×Îÿ‡§b=bþÌ>¦,Í�ÍiÄÍcdï¡“]©ñ:U)SþÇÍBÌðäfEË£LÓxUÐ{šË„5.†÷W}Q!àýÂk4~x�×ë¸ëA3»¾Ekh©E×–íi C%‚FIö¶VCCÿÌV˜Å»¬dÎMÿÈgI;þØô Þ)LŽ»®N0ªzÔ¶“È�NÊŒ‘lôO‚V@èv„mƒ5ÅV&Ñ“ò­6¹ÊsÚ6¦í¹×Û'®¬|¸?lù0MŽ9¢Ý+k(.ˆ×VÏ«'u“Ö=:Áü-è_n ™9þìtSßéÙë l<»ˆ†èY­´>©®ª§I§ð��¯?}˜,wHГë/d~«GÁ®%Ìj¥*b÷GRVÉ•D±o§ÃŒ²÷’¿ÑŸÏXÁéÙ˜çkm‡À2 |hÒCm¿¼Ö:·©r"LçV9S‘*ö>·ù÷ϗ͵�ï‘A¯W̄ƹj"H!{×aàOüÏr´ÎךÐï&(ó®_A¨î«½R§á I­ßKΕuÅ ÉDÿ~ÝæÛUaË…£+*=Ä÷ö[ib{”þ¶+wÇD›ýËI‚yŽ%õ–—[, ÿm(±òÒà-×ä2=�Ë2r÷„ßÂöCÛáj ŠMÆÞ«ƒ¾� &k‚æ½�©¬T†k³/L}Õf*kî5�Œýá¨Ó^~3¯In@ê³ÆC9&;(™½½ë�C¥À]޼�˜ŸhêçxáÝ…FÝ·Ø) H‡OO:ÑÄÖm´Îí]sN…›Þª Ÿòš~61â’b¬ k Yé2ø=—„ �o ôxõÄŒ£{"¥à¹Ïu‰ÎìX‘Xh¡C—5j ƒ=ÙÐS/¡Mþ WëÈ Cõˆ*:]Q[§t4ž©±Ó/Tì䞃¿} 3/QßòóÎF'ȱPä›�$~ƪDß±‹U®ª3ˆy= Ödk=)kbÀøq{IÁ½*Ú}P·î¸mŠôp ŒñƒØ4ü]UlP>É�ðõ 4oTêk Øž!�>\}êR ‡a�òÓEŸyA„"ÜìNŒ¹‡_Ãu4#O�°fíü\ü^÷d‚¥!÷ì=ÕÒsv"Þ;µÉ +�@W$CÞÌœUfIÅv*öLÕ¶ÝI²Õª]­qMDX×ÿ{Ýï¾~YsgGÇE³÷Všã‚ ¼›‚êGüX–$`<ú×!b.>Hœïã¼C«÷®ãÉŽ^OªFÙÕ ß¿¯ì‚á]ù�_m¼#¯³Šæ¹l๠›ËÅP4ÁT >-°²áÎÃ4¨@nÈùµ�'è:ÁUzyGž‚¡å±}U —1ûÛC¿ë$H°ògk`W¢P#µÂ¼)n³ ¹õSciXrujs¢:Òs¸V¾À†p5Zݧš“$vÚö�mSLÊ€ê‚�H²A^�µg€‰  ßEùó€ÛT’Ê.=&°1M.¨ÜÞìY‡ÉÔ $9®†â qfqޏò!ÑT'ÈLT½•¼jÙg³r»ÒÄkS½ý9Š1äß#¤Ç#)wð?Ðãnáx˜:Þ)së¹–LwÁ¦Qf’î>–€ æU\ü›ïW mIÂñg_�ùÂb‘ Ó'"EFƒ÷�'�ÎM£Â'6Á£f~ >0 ö´ŸÛ j žI‹u/‡ÇêØ¸Ï-Xã¤TEÔþ ©ÞcÙ¨a†]1ñeè Åm`Y äÂ4S.�W”Ýp¹ \2 _´ÛõoÎÇÌ:ì|ćޔÐÞð!Ü`àßÒî_zcl4¬ÔïªÀz®Ÿfr/b:¯ȸÀFX�0½8Þ$2~ª|£Úýª½c+7ñt¯hrl·g„�R» Éò–=ÊpCtþ3±‡ô‘}øäïG÷ $È´s½LŽr¨×ˆc-CÎû¹¨‰”îŠ-�¶±h:Iñ~¡·šC—Ÿ¯cËà°&ꯋAðéAðaÞ|oа܋›Z”³*NDT=Qg…Ö OS¼Ò10­ 3ðù$*OÁdj˜Í¬Òºzæ*ñý·{�Ì!,±TM´u*Ê}7ôÔ�=¬â–MŽÎA&}ö-´Ò 1Ú£|\ÚÒ<2�mW¸ì¾ ×TŒ À X̤uÇ,ˆ¿A©ðQ Ê¢Ú3á¡}@Š˜ �îËd€`ýÛb_G• ×æ·÷]÷a8"¦“;gma�iêž+2¯Š\5Jê•ÿ¼$ü’¶ÁŠG‰ß¯`Ëÿ4¯™J tž%íC<ÀŒ+˜X„ ùþœoïÇÀ›³›ð–ßëØ\âèîË+ÁúW Ö…M0aR'BžµúòºŒ,óôÖÖ>Q-n¿ U%*÷wüRô†¢$ôM™{Lô@Žƒr›UžÂ‚É„–íRU4¸„]éeÞ0ÞÃÓ!±„ l~š00öǵeý�£¼ì~lÞñ›£!}ãÛ:Ô�H¶_¨Tì.™€1­_T°<¿cZ'íg ÷Ž?#´è f3þ&H7Ê\ü${³®Þ!YëQ •h•)Ò!î^ Î…ºB.=ò5˜û8@�o&)ßd‰ä;VÌ·I"àÌÏ[¹ëö3pÔæ3âýÑãJ™³¿JKƒûÞ8üT/"2±¯)< >‹°K_5L¿€¨eñáÖÈvYRÅî1å¼’3æã FÎ[d›á44MUZfÙÀ ù6tw·ÊÝ)¡¤|ªs›J!Š"¯d¾S'ܵõØnð*¦N�#š©úš�ÁóNŸÂyÕׄ9v6W¢$;(¤¸uh,’`•)Ò!íG F9Eû›”ÌRNhö�ÔUf«LÛ8À@’Pz§-ÄØY"Ö.ñqÈËÚŠß×­û£Æ$• í¸f‡"* ]Ï]Ec^Rx†,7¨µ´×ýðf %¹ýs ø§dÀAÿ¦@…ˬ½œwzØ"ê¥I=i¦)ßd‰ä;Z{ü8 Æg­ÜæÝ2…”+§m2•G¤"¢!&SKx€ ‰gnü à-Ôú@<Ù×lm£~_½óF{î~‘|›ÜW®>Óæû».¹ò�æ¯Î¾Í¿Èz†ý ìýkûߨïù?·>ã?¬ÿÑõüóý§îï¹§÷ïØ�q¿Ù½þËÿ¥ùþý×ÿ_´×ûï`Ïð?éý€¿£ÿ~ÿïìíÿc÷GàËûwýOÝ�€ßÛ�ÿÿú=À?ûûaÿïÖ�Ò?ë�ÿÕý ~�ý¯ûwù�ñ?Þÿf½¥ü_åß²ÿqýœþãÿÓýgÕWÎÖ~fyÎóOä¿Ûœõ'øç×½kÿþÛû‡ïoÁÿâ?Ç~ðÿwô_óØÿÒÿšýÎÿ+ò ùòŸðŸÙ?ÃÿÆþåêSýÏlv©þ—þ¿ú¯`_Qþoþ§ü?ù/ûè}Àý�ý÷ÿÇ�¿0þ¿þGûßî÷ú/ÿÿ€?Æÿ�šþñûÙþÿÿþÿ¸Ûx0þýÏþOù__Í¿²ÌÿþËö“é/ùïüäÿÔþÐ{‰üÃýýÏôßéÿi>¿–ÿbÿ‡þýÿòßÿÿÿ†LðG5“�õ‘ ™ôÅZÒh¾©«ë>¡ô›Û)#çÉÿýå^ö°ÆQŸ/GÀˆmâ¶rɰ@#€²."•í©YöÑ>!�#­_ÕøËhPÅ%a(xk®V>ˆOÅMÄýŸ¬•Y“òÊ“7X ª‡^=�*~)‰/ÍYužBéð¿À^•üIú ö5oF‘¸´iH?:ìÖÍ¡QïZÖõ|�¼™¦-÷r�³0‡mdþl7ÂXë�_óè6@k§uÚ•ê�æCŸ�ì~+‡Geð6&lãªyØæÖþ35®[ äúæÑ…²“ûrï�Ÿ6‰¹P©„¡üò�Ì£µ[°OÖkÌäÉÆ�œú)Ïå¢'‡ Ùba„ZäËþ|ŽíÌŠ»ª†¡ÔúÂ8Žîw±ì6Cô+œBñHàìÍ»T Å*;¶)Ýk\ƒ>X«RøNp3{Üæ9ñ!øü,à—)[ ]XûÎñÂô'+Æâ96Œdr�ø¤rDžj¢­“×è4zNÖ³§æ>¬Ï:«ÖNžë—|–ª©ž9¼f,@2©ßŸ®’Nƒà¿øk½È7' ¬§Q”Ý(†ÄÝŠTwlSºÖ¸žþ‹ÌÍ[Œ_�<Àú§ÃYa¼´·'û)"È;è«ÒŸS¦HÁ@�k\³šhkçÞo–AØgg ar·¶XàÏAcTD*Ï×1(òWyÃÁ÷ŠfÈw4µM#“§ó~½kfШ÷·wb”U@¨Ÿq+³[6…HñE V›È;0µ×<ô63\|d;Ðp·k7W0¿\Híéïdá›ÂûÖP6Äç)–5…ÜEÄÍõÇùcö†¨?ž=F+U#xe„!þ×?Õg´ŽBùïdGO8ORñÈ'˜¢^Z˜­ßæ*‚,GÕá7q:¹xªí¯…£B TuLSÀhØøöîìR£»P~LúÁJÏÑÃB»ÄaBÚxI=ÞIÒT¶Dž¶L­™Ù ^rçµó„€ƒqz_§§ámÑ婚cq-z%ç Jy¸�`¿Ýy7Ùœ³ßàFfòÜs;¼ã³æ$&ûýP;а$üÃQÞ�³*€TX,/ »¦qË÷i¨òþ]¦K­ŽN-ŒÔS‰q΂ ¾ùáe‘Ú]nU´º°<‚ÑC-;­lÚöíþ[Ú=¬T� U‘'r=*àíp8ð»6÷JoùåyŠVQ8&A+~Â#¦”X„Mã­&zµg7O'棗3ÚÇåôó0†Î¤“C mDiS1ae¥åO\dƒý'SЕ¬|¡r§òª µýMpá¾½Ì.=8¦¤)í!jäëXv‚Á_‰®Ì ô ¢‰/š8”q ¶_²äL3á>;v§äŒi;<«î|ªš„›Ž)~Þ‚—VTÎí,”19óc±SüGf8µ¡¿U óñVujó[6…GÕ]kfШ÷·wbRCï6 g�;g`ñÅ펛ƒL,nLý:š†öátƒ¦]梅ÂW«¶©d*ÄVW9ÿ�ÎO˜Á2ªosÒx1ZTÈÑÜP­à3z‘8^u’L.„A)Ö‚) Q=8TT!™¿O\°G0bÚsgWPô' ã_ $9)xŸÇ‚i {¨1½þ«ßg¼µ¿ªDNT¤¦®4Þ›v$à†¸cGCd® V³G Ó<uJòrìR£»b�Ö²‹:Ç¿’*¸�^•×gqÕEo(©< ²ÏEsЋ€_ðŒ‡P½&ï9÷ ¹1úJ¹+ÄÑmò¦DÍi«/ª%¦šT"ÙR5ÕH m±•ûI$ïfMPÏÁ2š¶F62'áø¤ Á~Ó DLùzÌvÚ�·gåÕ}Ã0Ütœ-�MP²J_0¶77¾z¾‹r£ÌøžI›�/Õ¼~·JÉ$L÷¯p×"H€áb5�`Óßð6õÝšøëå»ç �¾Ð…L?�»NÌÁóЈ5.é•Ö¶m �{wv,Û:� ³oÿÞ/UzûYÆuwuÇ¿Xý·z‹rù ¸í€ãý1„´†ü�¦7õܿπJ�êt•ê+þçMLá·oúdT6:ê ÇÑZËž¿rdîo]Ë•qú¹Ž®}üôó“´‰—ãó�ª“7Y³¾ŒÙeÆoñ{âÆ-h9ûPóù8iÔÚ1Ë{¹ ?=¤ôí#0e»æWì¹´ö«…‘ö�ìÌÙý~1ÙW°ÎØ¿Z(6º#u%“K�ƒ ÷?zÞÏ·?7Ó½è$úmòŒSíᵂ¬i–ˆ+nS+ý h<ì—å:ú\Äëú }ýéÅpãäúQ×f]æ £Š2Ž`ÜA"þ:<ýP3Égßö÷ož('ä>+H–íæ` N£WF–‘ñSoÕðÛÚçNO0½§Z[B|P¡¤E�ƒbð’L»ýJ_@Ë6Êqôœ±"«k$ÿˆGÂ&ýîäAQl¼Ì«ˆ`²Á ââ$Ëù@cdðW²�Ö¶m �{wsóp2‹åè K:³[±b­1mƒÛçôM˜U­|S�5Š*ÍŒIëbñ|… ÿõIÏt"Ã÷Ü,TüZÕÄ[û1­WšD…�U¹ýŒ>Üždˆ”ðýwŠ·Yëy2ñ­„3Q&@Ê8!b…”ž‰‰£õÌ ‡ˆŽ½v�Ý̯ð´[ÐöeÁà(®^yË} ƒ÷ ’k(îØ§u­›B£ˆXqÖP?aè)pÔ†/k4ö ?uÔ×lÎ>"üœrH¡è‡/+€%&*sæâ¢³µó¡ö’œÏ„RYóœÍ¹l Zײ�«Fõ»vCÏÑ#c¿§K÷ÕÿºÓÌ�ƒëˆ�È(é�äõ;F“/2”û= Ò¢ñ9mSŸÚ§ŽÏkf� ‘+É ‘à&ØÎOù>×áOƒÍ–HD` N·"£»b�Ö¶m ’ÇãÌ×½ík…ó»4Ô3ˆŽ6šB5Ú)S¹Gœ^Ê;þBךõJœ½a‹?ˆV}ú;nëX‘ •žw&Àþù|Àü³Ê �Ý£9Z¿ù™?Aç\Ã[lâV§~yœ¨u CÈ–hi�v>ï}Ú¯yÀ³i‹–v3˜ë‹¯Šðäò_?êd–䔣�ïM)®?²� )…÷Æo…DtÞ#¶‚ؘÕ(Äà Ä3]¸Qæv ‘ Ù‡ÃÃÇí7ûñBïÁ€e2=QHø£ŠWÓ~ÂíÝØ¥GÎ[6…G½»»¨9’«)Ïñb …FDÐß¿_ã>ÂZ‡�HHÃÈ= “ cï-Áì±¾íóOš‚ˆ>b™nˆ@­ìʃ�é³ÚRÚ?´²%ò›9q<ò�¥ú]ÉÍT™Êæ$|àhuÕrc–âígÙ.G"ƒ�7ƒG&­VbF·a�ÝÎÈû¸7Šf™AVvÒ%p5Ö5×òÚ|áXEÖ/îó×Õf¾ç¼Ü‡:ŸKÿÞ⺭é£fШ÷¸ÍCó®ÍlÚùºð™7ZUÛVФ µp £e»0!Pi:;ÌŽõ¥j®‹ªÇåb²¾”2Á#• dºÛ•%ß,…æØŸÖ}ƒî\?.ÌÎz•_2®ÄVIRìc‹rÓgºQ¯²Ý·�+9Ÿà<Ê]s¶ç;@ó1Ӛݙ'ƒ¶Ü•dîh/ `y°›q�¡t?¥ è[J¤8Ou=�E^_Ũ±9Ç |_.ŸäìÖÍ¡Qïnïûç]šÙ´*=íÚš¾Û»é»Úƒ‚—ªˆH̬tkf­ßc2éq ‡8ÇCøÐïÈw�cêÐñÒ‹± ubiÂ5üvN5îXK×ÄMo~A­vŸ.*_yE’-žó@—ôE6ö} Ÿ‚;–«ºYÐ^F�ÓýÕ³hT{Û»±L Ö¶m �{wv'+Mâ¡R4}L']ã¦Û…ýöCÏì‡� ôÅÂO°òtr\ M—£Ú–Ws õ'ûœd-ÀFye*àAœÅá ¯«r¦xMxI ¬÷mâyL�­ùÐÅØt÷oÕ±{8${U¨€0SƒûJž%ûÈ–‰½.u/ÓS™ÃÃE�3H¨h[­Ã*y¢/ú�4Fôüq�fš(÷ãaïj]¡Æ{X6ÔÖˤ Kƒ,‚¤¹Û(¦ôrôw€ðìwb•Û8öîìR£»\=Ò~Ô¬Z1Ïô{^¿!´²&Õ…v=©b�ñã¯q>ÿî,Zh) }GQú½®:bæ–ðZðÛ€�ÕQݱNë[6ö¶)ÝkfШ÷¬ê庶⵨ÏðÏÍ!,Vµþ Å*;¶)ÝkfШ÷×RZöîìM€þ*µM™ ��Ýw’7[¯•õr*4:ØUŸ†ƒëõºxYÇ€ú=øªFó~·ä�ðô&HVN<ã–òy4¬œHxµ+{ï.‰í¼TE~ ļj‘ ˜å‹L²9]Œø?õn[¸¶ƒò!<¹�+B¥ÏTe³fKÑt’Ýh5ß"þ8SU\‚wÄJòè�Ü8)û·îö$6[´¬5V1#xQö x°½8¡ŒìH!+.IIUÂaX6†Tf¡ªÐTŸ9`\“¹>Ã1Ц×wТܥ™êQàúü”\ü�ÑàÔ!\©,@'^5tC�óÝiË[KB†X¶†BOZðA›+mߺ´ÿ>åÿˆØÝåüK\Á¤Ã\ÕÓÅày’\Œ3¾3ß‹Ï*ñWZÉÈ/rSª0 Þ ²³\¥Âw–gLôÒìö=I#HÌ8Kr·¤ÑŒ…ª7UŸX>¶1½ê°â,x–(ºÀ£ó4÷÷™ÃŒº}êÌ»›ìo‡� ¬›­œ~£û„ŒBª­V4ÆjV�š<¿væ ñòÎA2jU¼Rt)¹S£kü‹.áíÔP»=»ò6‡n.E^Ú<ÅØc§�á Ïñ#(f‘Þ¾–NºÔ8ŸÊ^Ó[ɬ†1Zñ¿ßnaOÁɵ˜žm`'Í�UQûZ>,´éßZlÓ³ü,p®þe!*ÄòÏdLGI¨Ÿx–ÓÖWî›ãÈÌ>¨ŽÑ#©ØªE ÁˆqX¡8Ä�Ðwõ;‰·¿kçÁì)Y/€îA8Úx‚3NŠ’þ¹`·Tp*Úi±v:$î¥cÎé©ÔÞ<¸ç‰Íç}ô¤eø Ûg©�!í<ž?�uå›X¹¤¹Ü[ CÞ ÄÁ©¡Øø˜T0l‹èÔË.€ãÀ�]'¦¡0)Áì]ÓE�Ù=UåwDÕŠ\ìv¥ÂdlJcÞ_Ø�Ê4Ár+:^ñ]–ð§0ÐÜv”ïh2´÷K›ùɃnoUí¾ëvüü2‹C²ÔEMæv€l{јêûù_û0˜:…‘¦ÇbŠØÓéËu›wV¨tüÒÛØÜs—ÀV¢»u®ëtÄ¡€Ë[Ä^ ŠÒÅ_¤³ÃK¤åUFõ’‘¶õ 5…!>yØÐ/nØQ2·°Ö…Oxôȱ?Ô>©/ÎÝvô5êÌ<ñ²KVÒõN¨ó€=FÖG0¬k2òëÀ]=Àˆží�¦^¢×Zó]—‡Þï_¢5²x¡)6_„$F…ÛœiáU?f u3ç*ÿÿ¹<9…¬Ò Üùª÷µ¥ØKýÞTó ÑG+8<]Ìõ;™iû^÷ª' Ò5UPy.é®ïê+\bë7Œí³Ðz‘êÆÈµ¥�Ø·\Qå°šá‰÷Õ6AAóžÿ&áÅ.±¡»æ�Ã@¨ âG‚(Ÿã&C]?(TYºÞä º\üâ˜ë\Q5ïæFøs,aW'-Y¼ø Ô� P±U1!ãa°äã&Ø�oô5}½À|©.Nt)ÖêøÉ´oÿChÁ*‚ß\QÿÇÕ'8qzqF`“huü í`Ž®fv¡mÆÆh’WÐeh+‘ž>›s—YBœ 7‰±¼J�žÌ|³‹5+lUÝûâÚi‘*gu×x�7Ùã9Ç»út}P³YæB·ƒ“^Ÿ �É™sœ!¶öh&t)„E³¥JÜœ*ó$¢Ñ@j�ª­@ÐLj'b³”}@ ŠlS":b;ú¸¾ÏOW‚—žðÂN(æCž ™6”2^U§Ïº9ù+U™Xöàôį2¿+·Ñÿ„õ^fv¼Myþ”¹—‡wð·â…­÷ŒtW½Ëþ1´ÓjÉÊu¸ ¥MO÷‡Ë¼H|¬çe6Q®¡Y(jQËÇyNu6�ÿaZzÖU29f|êõãòRùö¤  ðÓr<ÉŽ×9x¸£‰°^$Þº8õ^„IT=¹éUÁIýrˆ©~"‰ç8u»S¬Žt²ñƃˆ©)Ÿ(Ÿ02‰@Î/Àö„Á è‹Ë•ú¤$á=Ôó@¸3)o z¼©‹…iK+hµÂTP´³­¯”OÀ÷ŸOžèHÚóQq�?âÒûðvD½  Ø‚Ðg�}GÊάjpéFÏ^LIª-´õhéáƒtõ¢�ÎSšÖ´›ÌBÎóaž2 ¹ }ç�לwÀÓ ÀQئ2¨är1A×2Y Wb· èMQ=XMD4^o9‹3yRÅ$è0q�³.1L�}påÀµêßJHø­ZÑ¿í툽^úð‡¦Åöÿ”/}2êî/S»¬—ø…3öL¹Pø ­Y�,pði6Äp)»—½!ÅûÊ(tš‰±ø¯Y.$!&ñNÖsgÈ9;—}?„a®ò×ó;3sVeMjü <Š(>»mÚ€p0PÕ*4A ÓÄëgm""êÉXŒ« ~c¡wì52ŒK¿ƒçéÌÁÉÇ'CÝŠ2ò„]¥BΈÇYê·L,L\ça …{>Q1£ª¦Ÿg͹F¤l/ߠر›U*{Ð�VN8Ïô®Þ¤b鬬èÉ|¦ ôØ–½èÁSúC£<¶¶Ä?¤‚ÿ*™š�õ”D_¤ã VXEK‹¥JâGó5Ã�É"°�Ÿêh©+Ùx8òÏå’¤¾› ñê¡_wî¢W#Ê"±)½7Æ'åÌÈ¥3š¾xL­K¬¥xö®»j÷hù@•ăv�¯¦åm¼_Ç›$Nå^øõöà´ÐCs€À,˜= Á‹'Cõ3Õ0Œc.šäæ¢Þœ—³XÜ}íW 1¶Ͻ/r]¶’Ô×J2pc7üd ’0^�ù°ÌzÑ ÎÀà-ÃK¡£×è{2�|ñk*·÷- ôŽÅ¹ùÞÝ…ÒˆpiG›wò¶2Lȵ~]ÉÊaØÇQŽl–i3ùMÀ4Ý ‡ˆWÓØ6ËFVÏêÓJe«a¯Dc–!wí%ÑXè—o».Åñ›¾Üÿ1IwvIK�QaÊ�38ŸNŸ‹z ä#¾Ð~{¡l¬U1Y–>ÖV®÷¼Nñ’õ«`uD�µˆœ Ž¢sd�˜çroé*ºÐƒ–r¢ÍýQk"¶@vÒôæô÷ïø ^4ö=ð;¼¯B›1�>]váî˜�SHê*íVR7h_Ì!×ùD‘ˆmw%ôˆm[˜®™ö ™¼ÀRê�òY“°™ztóåõ‡Çù=1Ωхö|YÑÔÝÍsà°Žs¡;ôºð«Ah_syHc°F!Êï2)á·È,t—A‘%,áÌ�Ì eØyÐqËäd5„ù™ ®×>•þ:|ƒ·]üAª§¦�†�à]¸ËÖ…«ýQ[èÁøáÐIQTçöÛXÊa±Ñ˜ÏÄM“òn;C®NèY—!�m‰ ‰*‘›\q»:­=0ƒÎ’é–ò¶‰|¥“rVsëö!°ˆµ¶ˆ’Ô›t;¾?˜t}ˆŒ©ªàбJG�b·³#õmP}¯©³ÿ£W±‹&•j_ùìúKê% 7žì›0F÷üþä?,Z#0«†P5%3S«èºÛ™ýPÞÕ �J�–c@N>&§é3Õ=»ûªIIƒ+Ë“íZù°Èƒ£#ÄÙÓªÌýäLh ‚5š‚j¢ Ó«îhЃew¦Ô\B4ìÅãWJÒ±çwŒƒöÚå–?]†ƒ¹ª«¯•YŠ °®á½ñ=á<µæ 4ÚàÏà�¸öE¤[y-§Æ#ç?‚ƒe-Óp ÅÊ&<�íßiž¼|·ëÍt{*w€»(&«Ê8ý$Õˆ°â©™t±-×óŽý›a�šÃ çÝwêV¬ÓÌO›®ƒIbÎe€ùÁ>€Ið¯�­UÌxñ½ò7*Ô–Á§¢Ç{P°¦¦ ÏòMz½°Kîµæá”?5ì¿—•hPnŸøj¤UÞ&åOôCH»fˆG�À�Õ»c·xö6ñ.�Þ:ÒÜŽí¸¹DˆƒŸaíŽ:*Óºxª°$� C¯^BÆÆè7Oƒ[Ié:2€2µù»é’M PÔºä¼l ]8râï˜+Ñóe:šy³%½pÃí•�ÓYš/,žÃ@øD|Åê´Áñ(]%Ï`K�3²/>à¶±îò ˆo ²UºQÜ'7µ“.&$EmÐú ý1ð ‰qǽÔ<£º,x}üèú™ÑŠß6ŒÄôÐ} œˆIa¾~Zv�÷Êú‰ªrÇ¡¨Ö[MŒÛO;rŒ²Ïúµ`ïÚWõfÖŽr2pâÙ¥U‰ì7“ÂÔy|¸Å58î˜ä 8‚dÙÙ= à‹V*„` Œ›˜“¤/G½H�U·9P-Õ�ø¢ÅÙLõýŠK:`ki¢6y5cµP… „§ÉWÙ˜¤„–#xûE^Ö�ÿLÛØ´ºUšxàâjo‹·° ì�Ia»ÄÅî_ nJâv‡2𘚵¡JpÄÔJpGôQäÆ½ï ˜\$-PÅNXuk= Û¸{­•~<.Q *ZIð†›Ž¸�úc]›ž<¼Tµ"©e’¢ï+I98†NhQlLœwÁ,—=?Òe0£÷�d‡@q|×»ÿ�U½©,[B#\dÜÄ�!y.ïR¤<' ¼2Vúl#‚�ŠK:`ki»ª¶,ý¢kÎÀÛë#f�¢OÙŒe°Èå$nÒ‹ý[›d§¥TOp#Vsv ñ[*.=’ÇÁ©Ó NkI�ç61ÿY¶ö× ž$,™g~Ä”®›PK pŸoB£Îéëi»ª¶,ý  eÀhðÆ�ðJGÑ”^º™³43Ÿ×Ë]Æf îáãƒ`åyϳ®_H¦žzVp6kzÝׂ·d÷Ǩ§ˆ¶‡i†{r2&Ï Í‚�rc�bqðUަÐAßÉ»@ÞÒ¤†ï›:†ÔotÊòd|`Æ·ÉÞ[­÷ã2‚ÚŸ³ršØf¸ÆzÓ°/€¾Ð™1óâàŒKl žY›¸q©z�˜”]d�À›þ“oCäÞÏÙˆ\§Å²±â?pfÅ@ ŠîN’Þ¨R|£~ Çš»f¸Þ/I*j™ÐF¢÷ƒWFôÆíjß!'Àâ`q?ö{½{üWŽ—w aß±Âìò‚ÌŽQVפf�úaiÿ<³x¦ñŽ$Â%â ÇÊ1f>tEl¤ïOáÅä…ã6÷Oj"Iˆ�Rä½Õ¶Œ1�óÔ¶Šñ°ƒÕsÝXYÓû°‡]¶7•‰I5¡oåü1Ë;›™+.mY[ ¯ãŽn¬5S0ú-ÓÛtÌÔêÔ:TpX?Öàž�™^yY×ÕÝìôà(öžG:G8J‚J²v;=®ëÉ�¤Z»¡ýÃÄ,ûÁ¨=å*v©·,Áü÷N:§ï0ÍB¤rñ†™’‚çæÍ„c<ï sά)îUg¸ƒÿ—ÑKíq‚œ{°FÒäe˜Æy©DOnlº‚â,�!0BààR¯b×Ìó€ÀÙ„7Õ=h�%›iÄq i�UŸ×§ò±¼á¾þìšU@ YœçìK¸¥ðWž{î¯sÄmåìŒ4Ç.ä;á%ãËÀÞ]#l �=²[ã‚îÔ””œôq›ŸDë+¨ü îªù‰Ó½�éQVLùÉPIVN Ø<¨%¿±<á·@®ñhŒ�¤'iB¼ì%Iiâ1ã ¹,•ˆÚ£‘ÖïȘk_©g@�AŸu›7¹Žm޳€QÏÊ :Ù×™Ê×@7Å5G»š£’<ÇxúßèæC�ZB¶¦µ©ûÜpý@'ÿ”º�|]$±qÒ„û›¾ÉëôÑÒ5̦!‰œØ½�˜�Ïö³-Y80ºw£xè‡öëÛ™‡CûLšÛPÅSÁî˜CªRbL%-û:³Ë/(Ú_u0ýy¯‘ðdp¾Xü‰‡ÍGÕJü}i=nwÊDì�òeV‰Ž\Åq‰nS¼þ‘í„kuú„¤öˆ‰œ³y9‚¾âo²u]xï±|ñë%žÞQ÷f¼e!óýÀ¼1›ûO•ȧ–‡Ö´¢ç Xv’'ð‹àœ¦K%E—šÜ_Æ›˜„BÞÝdé=þþ†éÛû7~é{pWîöpzßJ¬é«¤9ÇE£>B0¨ósé°aƒ¯Â–X¡�SÄÑr¢-¢L:3¹�ÖfÃHNkl4q¿Ž³b^7AËкËWã„Ú8ˆ\àƒž_]xLkœöÝøâ n‰g<‘"èŸàÆ_€OnñXŒu´ó„x’�Q¶/äÑ*uÐBÚ4Q*…Ød¯ X!”ä|³|B"�?ªâ3™‰³çà ‰ê¿yß×/Q§æ�¤±Á5<(ÕË!HÄ1€C"ýh/ºŒ¨_&¦f�Ø@¸$@t=ÀÿÅ´Ûµ©êæû¹5ý|¿�Ò&5Ñ͆CÑ“ÎÇýÉðÏDÏ(úÉð!ƒx&á;gmPr§šþ—ô¸ÖcñgÖ4h_†Cçv{ÎÆl�í!ÓtÈ•è&ú½b #˜áíýùIi¨dÆ�ÙQg «SŽ�:G‚{PYz:ëÖ¢þ ˜pÓ”v BDï‚ì%ø( ÀÿË ê¹ÓT¶~n?cî'Xƒd\÷Ú�YQ®VÕu°€K6Ä�3ÇaŒí.¶k•Ïe¬« vk¸Ì£RQ·{wvHa:ÜKÍD÷¢•⚸'Üçt¸8è»ßh率”KÃL#<ó<ü�9¡joûûs™».^P8™‚B…Ž.˜yßJ»ú°›ýye•m[ªè³nÙå�qÞ¬„lP¿ì…Þµb×ü·w%ÛM«dk5H¹GRȹrÉÕsœ6(çÚT½Îkq<ÓÀ/Tß{Aûÿë†À¡÷âÀY{œlŽê[4`!¡tâñ ž{åÊE—VAê§õC „·òû^+ c“óõ_.X㯼––—îÆ˜þãÙCÍìßæ±læ•mÌBÛòt¶YÝGQKpáÃ,yã€ío05ܸ²ž‘#}ÂâçsÆ�G�äûb$SÃkdGÂíŒ1 ¾BùK†œ %”à[ˆeþ|M–T2²;;¼vA÷+gÇ AW¾ßµ8UŠKç�´5Èë³é¹¯‘¶æS_…³õ£úq{�¬°,-3gDîÝÎ ½Fñ§�»%c¼þMÒ™g½6#¨Q*êô©œ”˜˜IœÄË¿=‡¤_�ÇPm–ièoÚ«/ @#Ÿ�DŠüÝ´«³.?§¯ GXA[k“](‰Öbp�³¦¢’º |=Y;Þ1+Ý… ¬ž ªnI›+Ǿ´Ÿ¯ú`[_ú²b\Ý®Ê "Ù·ãcU›ùä®­C�ñб¾°³UŒ.!þKtÿ&Çz*ãœZI™ÎÑ®Pqñ$Vž#Á�ý¬ƒ*œyaúŒ}Y(¤Q}ïÅf¼ä͇á)Ø$‘YžÈs*Rîr;À‘‡õ®(WßÃÓNX·ÏUXRÐ?¶1½©úx›è msj›Í¶^Mºdh IÊjY]y߯Ո§ânÓEx4ùñt�&è’Ø…\yà&– ±!åÓ’ÌÛ2ÜNÌhI£4þ»G2è•?8Ì/ØïÊ"ÅG¤aÏo€¬sëãXE€`ݧåf'á~ù�½1ƒåÖú/C޽R� zñë°YÉúv®†dV\ë¿€;_åGäFÁ%Ö7zL+`ŠèCÏž›�¥�{ƒJ�óÂ@”J?ä:§$šãØ�°Üh[_ZQ÷D=–…Š}5Ñ•âñy±{†(�Œd‰±ü¾dŽœˆú‚Ì[VGI§Gÿ<OÎ{[Öt�6 ù p.Ècé–áÛ“g«4ˆ¡Ù,Õ0_0 ^z�Ž�C§ *wP9Ç^>Ôþ[‹4Í:/„qù½ßæ^“éîfÓ§sî1z[5|z4C./”#Å"Ù߯°~ ’°Çl¾ 48L"„b+œÆ¡1WkÞO½ D)F†ƒ÷¥”TÚ°z_©+¼ó! õa@Œ·X"íÍ’ü¨ù2D �ÍõÕã™R$#l+€óiý<È}M2#ïË�D5×Þg÷uÙø#ˆµs�ÛT9I÷„ÊÒO±H ‰ÉCµŽ¶Š ¿’·^u©A3¬b¯VÒ{ËŸÑ4÷pHªÌnD„Äcžc)ŸôfGÅ´�6^�wĽyðä4;Ú¢ h[³ë6Žû}º«´íÆ=ŠÐ³…nðJêö}¹Qâ¹Õ·C4Ú7çù¨Xx<Ý`€£Ä�Uœ‹Òø`´ÍRLíõ¹˜&«üc]‹4'"zgfyì ØiÇcÖH?Êü}‡j+®¦4ú0%Úö|h=À9°0ôÖ!¶æ>-;§Ågf*d�WZ!ȺC”gÒt’émç�˜?/Óf×Ï7ìûØ# ¼Ï±¶ð¤›«[Nó¬5†âj“Dj>e ©Üv¨†æÞÅr®\ @80²Œî%Í8ÓØ3ÀÍ~÷²L�xФ}5&Ç¥Œó¹7«³W×ÇåX[t„.•È‹ìÎÙ´#±øò©66 c5ë#cÄLŽZôúí©ÈM<½¬|Œxth�¿[oï§p)Ôk¿bA…«/ŒŸJù JÁ>^2ú¯te’þ�`úÕ©é£\X†Œý£(Ïö|бçQ#ëê~gYîñ�Pv_Ÿ�àÀrût6dö 7 ÇÀŸ‰XBÖýk—ƒ»ôXß4ÝëQ`‹òÉÖ˜lˆIÖñj�°�T¸µ 3y€$7^[€ÆòŸœÚï¥a¡…'=Ù›&¹0«JEs•ˆÒÆœSÀvÍ�¶àD'C‡ýô¥�Öˆÿ#]Cz9RUF3f)c¡ª"Ž“Lñ¼Ñ><Ö&l¯aHïczÌý’ÿÀ^€¬üàPŸîÍÔF¥|RÂSÒˆoøCŸF˜Ev3�GcL!r¥>´1ž2OÞ"§QãÅ ês–rtx_Û'ñ-¨lzv‘KCS¸è«•Z™U5Uä}l0 Çøþ°Š$-1G¡ÎÎCüTY[L…÷eC´šHʱPu­ù»alOóŸä�‡yêÓ|ÂO(}KËõö¬œSkôñ­¸Ý;î:žeŽ%sÑ*©ÊBö9ÁFR¦‹ò«;$i[Š‹G#ãȸÒc°cB7ÐÀñýH»?gÁÜ¥ýE¤Wa+ó½(V{³% �f•V«_ifÐâ$` Œ–¡Ï�ØuJÚÔWdîå�¼ WEìè»-ÜЄ´xZbIöOY,¶3­Ò qÔÙœ§M1Ï á–FsÂ×üÊmP�ð†­ w¦„�52æÄá[‹\2wñ9ËדּÈÕÀCÃEqeÉ'ü—ŸX¯ÂN’à8Ë®T…;m�k�øxCޤš‚2Žk±÷’·VŶ—­_7X¶q –óÁ;#þ*vÓ®�ÀBe Y”@a¨ÛòǾé€ì#](^bxàžÈ4ªI¡‹ž…TòË ÂËRì–c[qKÆ 1)! zF(r“Í‘‘Œ£øÁߦšC3š‡à‚/­ÖÈ“”Åš)Kmè?fÈ u! '‡v‹~óâ=Gˆ3|凙Ärë:Úú�p ¸ âÂ5ÖæÈ‡±• ‰­4ã˜×¨ëÃ7›¿®j:Ô¯}Ó]¢0Éð<’~òÆ´’Õ ¦“Ž�o„„Z€øèvÖYÿÊA”ÎGŠ#eQ_O§‚uoá ø‹B10ÄÉ6SùÜèÿÎz¥1S¾d wr–Z ðpÈ»Q±Lj {—ºž¶Àö€Ü@šÂ[(h=;é»v ÿ’J׋•ßQæ°i“ÞõHâæACùì�ªqÜxÖÁˆH {*]Îõ�g8²SC•8;2³á\µØ›¸%ºƒ­ÆôûšN Lr©�ðgcõ3v¯a"´Dàï1µÚ¸÷±ÃöI–^N­3°«-1ËŸéûZNâµU'ý\‡ ð« ‰“ þ X’†^Ǹö6/µå¤9àÅi‹{ìP‰gqj%c[-ÂH}òÞ¶7Þ{üƒàßy•ñÓZ£8Åt¾[�TŸR쀠dw8èTrÅüϯǥè²�ÂèïGTyKp9 ((xrþ£›ÄÏí¥—±–KW)¸‚ÃŽÈ>¯KôÄ.žHf,­…Ea4üD<ÙºĮ̀ˆÒ�¬¯R‚<–ó0îVãwcä†'îÒD…sz!tLDß2<[T„|Œ £ŠšwOoñ4w2ù®5ÆZšzJÚš#* DÝ�–g= 7ƒ<�‰þ²M°Z!ÂöBã1¢ê§n|$óúË6£I ©÷�?±ÑyQÐñ¥l MÛ¯!Ã9Œ2™v6wPœêãGÿN´F]éÑôC36üõ2«ÃYHÁ’ïp H^ÇVš£ªI—x–+›Ñùeº§`/·‹Òš,ÝQå*Šg±º�eäMÿ½ÃX²_túDx—˜ÇàÓ�FÐɾ¸nP­â ¦Z¢‰„BK?n³ÇLçP½Íû~C.y“Ó^*σwð¤z?/G¿H3¢§HçU˜$êÀD�tÚ}N|�nн0Å“{›{‡�¹×꥕qª2Åÿ>Ðûþ&Žæ_5óò-Rp:®�PÑ$]=äÛDÞOõôä%ñ-ÁŇ �ÊÛÇW&\Õê¸�îCÿ{|°ŸFx¯<…Øž!&› ›×ó)0«t8¢Åâj”S gÌ/¦«�Ú¸èÒͬ'#ÔóÎë’;Q¼“öö½éÞœË xó2½�“G’ÿS«ž<@øë:è~0¨ÇšìkGK2Üðº#ˆJ)!\µE°…¦›žøò·ýÎý÷ü£¡%k –Áv…")/NÇutûP%kož ü´>®iÙjnŒnˆ•ï|.ÿVŒ"]Ó`pެR�©"žRHFÏ‘~2ùÕ,ò-dƬL±–y´è߈ ©½á'+šT¨júgÔýñ�ŽJ¾dÐÔA8 sW‘˜¶M–^# ,=hÇ=¥µ\¼óYOÕ‡ÏNöuƒØw:Èlú6öö`š#ÒŠk!õ[^ĵ›ì-H£aùÁ׿XFõNÚiªFäâ´^·LÓ `a,ù¸_È“riÒO� €ïÎxÆßï̈iŽoúÑ–ø4[ìfsÙ”=À* *@“†àÐDÔÏ ›MÿYǹ¹ß)Ç¥00%} r-v…j6•Ùã- yö´%�wM ¹5–òX�…£ÖY#ÐÃÁ3òQÿé�ºŒüEå¶·RAO³2™pD®K o2ƒšÑ~6v½x¡N¶iÁ#¿O¬ ±YyÆlT¨Z9 몋ÅÕ¨WÏÜ"¬íK 7KUíqX_¨ÜN>X÷ÎñÌ/Ä׵įÐw‹+îŠ r»j±!GªË$4¬ï\ú׹괩>ŸôhÒÚÞ›ÕX_~È4ÈtŸ»4O™ÜÁ��Z‚¦�uA ›âO?êAæ')Šz'³Og�A<®à K¸DÁ„K†mKö.+mƒñ,�³•Ù0/z®¦E(¹áùî%cÚMãpûù§(¤|÷Ý•y¹¼‚µ‚–;_j®²ˆŠ;Ö"c<©†]û ¢V@‹»Ï«XbÜ~)yÊ}s¶+o1SO-FŒ§¶‡ÊÿY†ö{SýíÇ… f]nX½è„…O šl˜ÚÊá×St•Õ€äÛÂÉ£ l@eÇF$N×ÛÞ@’79P=¿$ñ]¶ôÆÅéÛôä‘\"‰g³%/¦s£+e@ûSý´ÛQ¥Ç¡z¸g§Zý Á-Å ‚ôÎñ‡µ3׺"ؘ¯WÙFd›w×ýÅp½°"Yë$±–-;ctõµù¦�e{™n®)wF'TN¿ø°1ÎmªÎ@_ë…�Ÿ<Ÿ^a09ÂÚëÑ=¾ºëÛ"Ý×ʽ@‰Oà�/Á¨f!Rà ¯×|ïNpïâxHG÷�WÏŸé÷«u‚UPýœÛªµRo«Á³ :¨Ts vÃúlýF£gÛx }³xÐT)ýbÏ]®"¶ò³`J“ǧžK¿)9J/œ®½Æ¤U<^Ò@;‹!l’/´Èï¦HõD€”‰º‹iú›¥ÞBQ™~XB5Anv„üéî£�°ÒžA±ûhYFÀ"6šÁëÈC×�0Û-DI½£gN¤×øvöHÐûp‘àï¾ gÊÍ>w{êÛ³k0ÖCQŒ~ o%ôëå#Pî 5©íy:´93n§Zô <Øb”¾g¥D&Ùá*3pQUœJ~– ‡$F‘ò3/ïß»Âbïb· ßh¨ŸuS-äæt¦¿­ Ò¦G‹°ž¬ è­:š8Å»¸¡J»Ýv¨þs½¦Œ ºZ{ʺ ™]ŸSã¤Ò�éó¶Ø Ã‰_ðU%ÏN[í×qÖׇX5X I™ÝqGy‡§j1sª¬ºc»Uœ¯ûë¸Ô£ê~x&»lJ¥¡Ëu Äÿþ{™&–-¹hNbs¿<†Ø†?°ší)�Àç+ÙˆàÅb;¬-évjü}Ã2mÝHΆìSXg—•ÑíÚ²Ñ ‚DT=£\[DûtØèµØZKÕj1,þŠì®šL=€™4œ¤Þ  qçž/Ié|ª@ž-�\k-Å“ÝsÓèÖô`§õ<|ûm rM°bpå+ñ$)_{$|„�(EHLá[£lщýMÀJomƒg;häfªÙ µqyo†º³�/]×DÆ„6e<Ûqˆ*‹ à’mcÖŠqŠ,±úG:òb‘ž/l®ðÛ� @@‰ß°î©ÓK(/eÕ()X›ÒÔ“¨ª…í°c²�iÓZ¿Y)?—âžSæõŽ{d,íðÅzþ¯+IR±g¼BÎÏïñv—‹¤Î®É�™“S€p£!½9†_ilt7‹;bUø:éÉ�U((*˜kÁyÐÓ'>ítÄj�k æ¨ßœ¦èS¸ýCÚi2 j548ÞÃÕREÛ.œ”Gi+éW#ö”œÊ—©á9¢ªô?´¬+ϤàÅ¿;ˆq\ê39yÍ—Âá™#4Hùmµi烳²®+…Xê5à².Þ6¢ýDGÖË5ˆ8e�¶ ÐÁUÿ sï¼ÁÒ‰¦H©(ÞèçÑÇ›ìðÌÍ É¶qê¿§*ûlE|]w‘O*í<¾ßóCòª ?¸Ú/üYŠ›þMé³Èäo'ǽ´“ßzSÞÞ q=k©�æûƒŽSEPõðEÚü§V –K§Š0œÐ5÷BµŸ�‡‡þ[Üá§ùÇŠ%3yÎYX)i,y ‰ò:Yt×EUaÚ)�<›kŠD_ÔW¾TìÓ,HÔ>xÖOO]á…G›V+R ÓbGåñçm2˜êƵ&Kôº„¼aÉädgV‘€¬Z‡ùŒ5}ÊÊ’ð˜ãGÇ·&6‚³úÀÌÿ"×7ê½vë¦"D §E*“¼¿€.20Úô§ÞôGÅCi¦qÄnÆ¡ÐÎTŠ›6™„kŠF/˜¿ˆÏ h¯´¹�}Un¢“0S¾?� ¦ZAWÏÖ ÙÑü¨[áÂz®ß×ñ&ʳþmQÓXÅÇ­*ú®¢õ—Ö$=ï‰�ð¯™>°·/@U}l7NÂòr¯ÛP�5_fŠ„A4Í5KÌŃHÿõ(Ÿû§l xï‹ÇÙzï[Aü2mŽœjáÿ“®½ì‘h®ç9oÎü—ª˜¾I¾ræ Ø$ $ú ö1%„œ¨õ“é­ ‘®â}¸dü”zrgfßQ­VÀ‰z ÂX1ƒÐ÷· ?Ñ÷@ÇɇTÇ—‘•@whú¼�V„'îS“ ßüxí×c¤ÖØÐ(wŒ&2×~ü´nV¿®3K¿É€Î~ÁBšÌ¯³ž÷ßg4våÀ¼³Ä½ðUw¢Âß« 3ðC+Ŷb€Óû�;ø­œ_ÛÞ-êIWD×ᾟ)S)¥}æÐ¿€”þæ†Þ�>éÁ-ìíè‰ÔÇx 7¡a$�^C!dq¦×wŽº¸øF†B ©ž.y ½À;ÌEgðÇý¨åÇé„9߬ÝùS“ GÕçT¬Jïx5âƒ8Mk‡™Û{å¦HV Æ^_øŠ›ŒäuøügzÏû‡Ö0­ÿÄD´ßG©îbô·?8ûK:ݶ¸Œ–6ÙkªJ•a]ÿ¨Æ±ƒ¢A[/ (S#ƒp*¶YG’ønä“™Uß2þ©�ݱyžÜR·öŸm&§ç70¬ôt4·ËŠeC0‚êrûSÞ›~ÂçªR'ß瞊¡cÊ.uœá �ƒv�dõÇø„S"‡Îáô ­‘1}Ú ÖŸ‹pôHðà šl¦,;éD‚9)ˆùГ¢lϨôH ŠÈ‹¢üʵ¥Ï>yàMÇEQñà,*î�ƒ‡F�~ð�v:Ì r2nô‹â¶ê­G?¾ƒ6´ŠCšU½hy±_žhÒ²[ÒçbFÄê‰ÖfîX´pôBPHQ1,jœÓÅ*üåÌ„v6Ø!%÷%­]a)ãÔë8pfoþÓ'¯zʪûŠàžSV®­,@×Uï7ÑÁðèm(Ô�\QJ ÙÛóÔA9 ¡ärVì[ÞV&ƒF|5W‚´)d¥½j½°‚âÍOdÎŒ}ë…R%þ/·IkU‡mNG�g嬷÷u€¦eíèN¸|9vQ r�îÍà¿/t$ AEGM —ï"] ‰31U?�ˆ?ÿŸ>ðïÞ@âƒÒ%'Ór¬ù<$}úG„y¿· ®òÑ\Ó¼ÚÚ7æíÐV) ¹Ì€�ÞíâGh¶�`é5¦eÎÆÝŒÙBe“Z©sXrr±a/‡ùjð,þå“„¨ú(óê·°òÔ_‰nÃÜÏì»kÂÿ%%x¶;~«ò’ªPÄeÝÈ]AÙ 7¶™Ò›T!Nv¨žCý›>ükGðÀä@r5%Uåÿë!âg¶îŠÍ‚?Ãï™nœÝr(™Ó°Ø°""N»5“ÎZœäõ‚0·ªT•Ÿ¥ëa´(Ñh[èÀÐ~Whû,2Rœä´ô™¶xÌnK¬Ùætþæ0ß±XKHîJg)Dé¦h¢¤Qó�{IJ—[]ˆc¨Ï^¿”jò<Šm¾Ã\˜31—±[qãÓ r Jðus «Aï‡Ù©®­up�Ÿv3žÿöÇP1£½t¬Ödq¥PU¦ =\x(Ç¿¬Ÿ�â_�€†‰âP6„—ÚqË"2ÑjÑH=ÂÖ¸«+ž0y-¸CLêmôGÐÖÈÚÔ©ŠWæâòÚ!Y(tãÇx•º¯RDv¬ý\µ"»Eô­^$�2—˜JÄÕí0Õ.GL€ç_eè$¢ß%òcx!£Ü݃)8íÀsðèmv=Hä¢Û7|‚A³ú뇄ç†Ôf[2�Òk­ItK]›R›Ce M@”ðsæ†8¿šOͱ0æ¦Àº{Uý;àû’ˆ÷Ö§“z¨ÞÜU '[ùcsg ÄÐÉvÝÙ>î§KŸù âÎLaUw®ÜPñnÑw®{Ž9\ ´ž(¹ŽÒÍXƒ,òÒš0f‘FïôHÆ�ò%BcÎïbMè�ËÎЊP;´ÎÄý´ªÝuY"2 È7´ŽYËB"Rëv5Xb•Ç ê�ýëÚå6RQ˜›]²:0Ô €i‘E˜Ý ®o*Q�¥ÌÁÈ`s`b“ä’ͳì `$Í•[ìç)‘Ò’Kɯs|`©@tr(Y¢OM³å¶ºx$è>¶Cƒ�‰!ôzТ”Y¨!1ÈWÌdÂp€ Ç4 TBr¢-�ÕÇÊó¦šñ ¬�…U°žÿwgÔ'“.Ù°Á$Bá\ż”öw� Dô�CKpgkþ¦‘H(£rT%‹òQ j�øÅÝŒ@™­Š�Þ>¡Æd9€MÍ´H›“tAþ½S]ë»SºÄ*1f¢ŒÆqïÓÆ %º’±… XÙaTUㄬ nmÚ«b ‡„sÕ]\­ÂýxÉmIì¿V±CK÷_Šå…·‚ñÂUºT…IäºõSœ4ïê.°ÖÃu¦^êXÑG»;8äÃÿk3…ŠÛ/z" ¿uzÌÎÆv�e³t%wúryµ•üH#Sô9ÁŸíëøÔç7Ýnê$¿'¼·4w‡<�Ï[‚N2ãã'1Å}ЈM'QNÏfËÄÉ(I™@4–»èû—³”~ÎDº9ëUݾ!õág±•ôúØì0X>k}×Òƒi~+B¼¾ÜožL'¾ÀÐN—'••0aÌ‹Ž 4óYw?NÏìZØñêUG¶ Æ/Nd…îDwxÿ[Œm9u„0jº·Èžì룦Ž,|ùvnù6ëÿ DÒà)ÇS˜&xÔ–Î83îH+ÂæQôú~�´¿‡†àKè]ÞÀ(`TPŠFéå�þæO†8í&©–;œBöävNNé öWŸÚNj勞|4vBý+`ÊRëKr1¡D‰/“|ÖZ¦™ï*<í Ž²HáŸB�Õãç­.µÌÔ�Pµ™€¢tËå+ÖnECveÆ•ö�¡’P‰Ëó%ÎÅC)¹gó÷Ä*ó')kk¦¾…l‰‚ŽœþŒ–3 sØÀ‰ðvß´,]™šv$?ºÅ±c}T—˜Š†1WÅ™d³òÙ v"ýáÇ÷æ _ÝPÂî[ÞÆ×8Œ¿÷›H=ð,nÃÿ:¶DQØJ‚ãúßXSNø�§+6f´[ ´¡Ü7½I?1>Ø%Œò³“’Huê±i_.z®7�PÉÝü¦C ‰Ê»…pGhÊÇ y£nïŽí3Ø…±¼Ò`¥"Ö¤"ɺӌ�€{\LrsØ VGƒáo+koZ˜¸Â*§ùJ`EZt|ùÑJ𶙔޽k£[!Hàâr¶ ¢.cvÒEXÐ…_•Qü=b\u,ê23?øLº‰+;1·+:êâF4zú‹7l2~eHê±<uÐÆ+‹£+_øÈ?¥Í}âËC­WHª?/g5áyúwfÎ…]E™Mê­Õ&1.O::ÒRœ]Ý'o¢£5ë3ó¾�mPd¹.ÖÂHÙ~ ¦îõ EIvU°ÅæÝ_E‰�I÷ý êA$²á¨JIÌ⣳ÞÑ•e±îõà;°¤Éö.äÖ<Ø4†B�Qn´hm„Ý35õØp,RC° #aŠÊ³AµG49¥vpÊ^KXgyôMÇÂæv3øÝ¡×Y„ì~´½"Ÿ‡ >Æ9qÞTúÞY!@!ïÚ›xBÞv0 ËÒÇ@ì˜íߦõѹ¦±H‡Y~5֨ijjµ‘ÉÉ™0¡¹‚¨ýþJÌS9‹ fÙç¢V÷VEx�gëéZeȘ%4]^c÷§«¬@‚xÛ.ž‹©!Ï.á2;±Í!pÌÛ ¨ K¨¾1Ëk�\‡E‹ @"é�Ã�™Ü¨ytØF‰ØÛÔ1ÖE7ÓC. ' DˆØpô+”bˆ]”h_E˜›bžZ$ªÛ�ç6Àªdð¡|ÛÀ¨èŶ&[Úp@W•¬Âû7§ Úu&� #*MpcéÑß_î2⻘µ­ÿ2ˆ u Îòe9õ*—ÿ9/ ”[^˜ˆm¦ÃõYH˜žÃ\f'(ÿmCŸ@qA·ë½�a¬îŸ±Ê;‹þ´‚O-`j-Ó/ê“"ÂÊé¾ÀV(˜oò1ÎŽ0¸ÅÅ{?K\ÊoQ&Ø(Ù°„Þ}k’ª…Ní°¹Ã'þ«9ë=iÞ÷n}rºâFôÏ€ïF¼*±‚׃zê}ظóø4àôýαTk ï–ø#“ÿðéÚØ,Òƒä{¥dtî*rÍ•×QzÃ~<“h &TŽ¡œŸÇ¥SmÂñ…žÆZ'%xØ=œ"cµîŽf2ßj7�\CnO`mÄ&9…Èæ²„Àöë‘ÕýFk†ˆ†ÉÈI€ì%éÁS`ÉU{Ÿ-zP®}­Ï”>£ó2Ãà5’ýyTÃäŽY8Ó¯ˇ �é8{X¢ãÉ%bbʤآ­ø^'°nE}¸1÷|Ýeûæ¶ýÙICÍ}ý64¹Tÿ,«nΟ²]q7Ýÿi€ŽÝàq8Ä ö÷,ÄKWµ!.K�ë‹}Þ¡¨Ù̓éÙ±ZÜ�Z,Wm¥s—ø‘ 'Ó)'¤Î‹`ØÛ·Â뙉§‘Ç©£?ÚM[—ŽEÛêu4�Ç÷" Þ¨“–@X0ç*—ÎÉàö“ù¾¼�¯õ±>sÝF¢‰M¨m ëŸ?¾#MÙv¶ìª_p;Æsµò\äzà“\EBº*�ÊíBÙx°»újQ²c�"ÛÓ²Ì3ú=Î|•@k,P§?í!=·ÙOÕ&X«÷5þÕ ['QÛ5½$¬F{¯bÚ±guh’4ÇgK=ÝÐF¹Å|m˽ÜýºšuU¢‡#ÔùÆ1ý.Oµ ¦È@[Yô)7öï� žZu­ð­ —äŸ*T`Ê󓬀ò�[Éa$⸑ëB³¶tèÀÌ̉+X=ï†û¬†{n¦ö2äü´mŸEàJº¿²$3AÔÇ¢(t5ñ�¡‡LñJ,ôR_°|¸P£ƒC~N|uD£2‹"ðr„Àˆª�é.±,‚¹0áè–µ‹áwŽ ºþ†dhMíH‡:Ú¾­”âù"]ðçiíúB‹7ÇÑAéT÷˜é¤Ëmbš˜­ä‚@²o*� zAñÉŽÛìð¤yEÑ\×å»�7’ò —Øf4?Ë6·Ÿæy9'ø ³#�]oC1O§J¤ðr"BöóØ�¨ÕÞ™émUäF†œQÓNçǸr¯õ(�j'<#–.ò–q]ÏŽòŠZX>¦ŸY&iï¬)и­�S$é9}³èÐ+Í Ôí8·Ÿ,“Vå\ä»XËšLc4(Þ¶ é4¨bÌÜIÁ�IíýnìÂè¹Ô»Ù¿Ê­qìmr v¦{*€ÑíB¤ 0Ú)³q(¿¼æ}ȳ¨|²Ee=ª³7ÈñJ%�xõ±™iÄp�¢óe6cã6Í;ªNãkêk%P)¼T¹®0]Zº&(Ž',tãøÈl)\ýL;RF«Æk¯X+¶¥¾Tƒ‹-(¶,N¸ÌoƒÔ}±Šï¾)‡Où~‹ ¨:´‹ÿ‰ƒ­òžäÝ™ð±Jp1ûŒl ÐÊý/µQĤÐè# ²Æð_l�¨K� F3»€®ë›•0£Mu&ûr rö;µùÅ¿hïÚ@�)Ý>$²f#À,¸:Ï‹YJÍäõ‹‘gÏ€ü=+«TïÜš=ääÕºÄ9ßÕ·yzÜM\qAr+ÖMôCžþ°åwM,F?ÊMpˆ$købd²¿<´êY�|+I ôÎ(™g¶™7YTŠ™¤ÿùóÖ¸8+ ˜ÊÛ{>¼Á\J tÝaSÄ�þ´¯QÄU@[�ÈS!í`ÐØ/!s](Y‘a‰ÏaÆ#¶ˆ ó¯7Ì++§;™ìdþŒÏÇd—¯i«‘þóA~)Çh\9ãV„´®/ôÀ(„êe¸·Ñ“»øŒèŸ¦hMÿÔú�k�òm#REο–Ó úMÑIH"�™QW=7FDæa¹5‘(\rl‚‡ÀßPµ|�½òMt£°—`CSáàìE(!.“ÈOS_”«“Š´ïhĤcs0R" 6¼î?†E#¼©T+ÂKÓýÿlÖ\úŤ~ÂäÆ_¼±„ío÷³®ŒNŠGò­Z‚_LvöiÀÚ-ñ["Ùá^�Z÷€^Zõî*¡;kh‹ HÈü›æ“C 4צÕb�Šf°+cãݲå�üæÏQLëÉQt”Ù4VªOˆ*Ú Œ+‹rjµj…¶ùDÛá^üp¹<~E§°™» P!®ù$›ÓuÍcWæ\ø›E)Þš(< Ö^n4Œ¤8°µeñ²·<ø&Üiû½‚œ|63äµôà ¬þÇíµ4¦êU“Ñ_`¾ð°ûùÅ­¹$M[Ý/Ї ïN>‘AP:?ˆõ@Ve²-¦)®r+_ÀR ®nÄ÷0H§_ˆì#AŒIo€E7:œç »U‰_�‚NËùwC½VEžãÀ¥,Y@`í]p7W„Ò—ÜŽÄ›Ÿ éž5Ÿu%DÒs’rãÐŒüò—šm5¦}É€Šª¶«8n¡’×�€.`®› T …�â©Y_(k“ Cìaæÿ7‹|7÷6“f&å½mŠôOAÕjêºh¿Ú"‚�¡Ï™nÌv.Ož;_1¾¥#;—/ó²-߯¢¥’BÃÍ›~mÃX–”©ÂÁï¿7ŽÇ]þD£ÁqÉñ0 ™ê&i¨gv3•},E¹¶6ñ‹uh\Ó-Bû¿}žÇ®5´±ÑÆNeFµÊã81§ÓÔ¼ŒO0yžnñI0x•Ï`¼¯Ð­@©¨�#²|�º~x ÁþÑÄÿÙÚÚ ü¢¶³QY²‰)»j‚ØN9HD÷î? ™e[­õ4œ™ÿx«ãP¸”@WÅ ³Ý°ë ‘»+oª­ÚºÛÚºÅC$Ô%ñ£ ³Kk±…ëÜTCÓ[<'­¤ýcZš1 vI%õ„k–èÔp¥wr<Áµ_“'±Y5Ž/Cü3g{ºÇxb_·|<•M\'_ŠC‰ÎWuï%˜Eí–7ÞäÀ½?¬iɃÛg_!lÉÅÓgqXNÀOÚlà˪¢;>€ê”zaò’àè#tlB‘ê»›‚Kj¥²°Ä×úI<4·A`¾…›³J1í—�½ñÞ¤Ë$'ä1ˆXTœì³½Îm'J|0ï©H�QŒ\/‘¹wÉï�¼Z’ÊÞu/´¬�òx`‘ÿ åƒÀ=p«¶žZÝþî¿fsfìvvÔ5s…,^ª,ooœÒLèø}�/ÏmPvæû›Ô{.xfYØÙÀÇürMƺ ‰CL<ÜóIŸFÁÞ óT°–ª"#ÿ_i!Û¬s¯¸ýâ�Ö€„�&û¢Y=9ú#MŠÙO´ù+ù#-tç^¯�Hå6¤/%‰—ž%n•(ÆÒzl]àc´m¾BÌ�hç¬Eã€1¾‹õðZ—­ët•øB¾eê¿BÌñ Ä[þ–ÝŸh‘N@ ›�t°‚§»~ÉÒ¾§CPuW�±P•Ç*.†^ú�ßâºå2½Y‰-‰âlfùIÚ¸höE vÂc I*û›.¬©3|¹hfËÈ�R?šÛJ•$ä¹;gÙÉD�‡³ñUÄ0}ïÎãÅÚC8¥ I§çﮋ™Q$›Õ=螘¡Ÿtà5GÝ˶®"7_Õäã5ß6 Ü"MQÌ·Ù=°s©!tà%ð€¢.C3™ýÕ!Ÿ]T'�Ð8`3‹�qß@,î¾OÚó~Wwo´ïu·Hù`vEì¾ÂÅ3ÃteÉj½�kF…î›Ö&�,.%u§ªáý?_Þ#¸‡,jÙ×ǃ¹QªÕÝxÔD4nyöh�vÕ–Ñr|ûº©‰�i¡|l�)㕲dÙ„¯0Tòü±a0Ñ ‡º•Ö#–`#šØ,/’TÙN™(‰ýÕ¤DJG·è´Šƒ)‚ 9`½�Ã}éW�@äb ï³³�@Õ>)g»·´ ²@5³„xõi'ûSÀ@Xl9|ÂÞ¡,‘:bû­¥iÆ[U®0Ÿàt®¬TXA"ég6²vŽr¬e¸Ó‰>ÕXàpÊçÉ3±Kþ™È¸Ñ%Ö)ýxüf^ ¡Î¯*é o$�'¢ÖŠö¢�0àJò°¬æ Õx1?:úÛn÷þÃ#ÏÄ?Ê�—QL‰X gñMªWZ¶÷¼0jÞB÷(NŒ-9mylp"»gwñ¤xüƒK•=Å�R²R#ò&)͘óåŒY?´†¢û³82¾ Úß�AºÜ _É+’çIú•ī߃Uï¿M4�H-J`!Ž8 ¸bLa9Ø ÿ©®¥¬�¿øè:E˜gÔy@ �ˆÿ&œç>ÿâ7âéÜY>õ7$:êÔ¹kÛÔ …œþ烹ªwkÒÛAÁ¿Õ�úˆ ñ ”ˆ“Hû_©zöŽ@ÙSßÍK>Dz­ëª7Ù8&ý|3Cü¬ Œ‚cG ÿÕŠTÅT»ñÊÑ2qqW¦¯²ó}•ÚµóI;n£5–Ãp:cµv@æ°)òX©êj€D§§.'Š™²ÜAhl.ÎË­‚z>§{Ó®SEO ´~åµ�"Á~& R¸@¥-‚ ´øïvªp »©òvòA.U3B¾êïH^§¸]é¶¢Â,µÃZ½¬ nüu4ïF~ÏÊ/g)Uâ; {¿Ý)O=Ø3{s 9¬„ë&dLŠjLމ—ùqÅãv �‡GCЗ­¾„AYàá<ˆðjÆOü„t£âèT,ïq,yÐÚ¼gþ׺<Þ?žñÉÄZ ²ŽS7VÀ±‹î�Ö 0/Âo4ûæc²ÝåPõ@Qiî¦�‡ÌBêΜwEybB-µðwnkbÀm·–œ@j*î·‘û2«¦ûÁS®×ò2Zoˆz+åÃ%-õ*h>¬7n|µ¶¿¦÷Åá(~ZoWh³”Ï4‘N�÷WŠO:5pkù¾=Ê«m³� S�ý@´Á÷‚oð,=„–¬ïöQÎ'‡Ñmþ3lÓQ¯=£¤èÓëÚÊCqÎO¡Ñ©x1íy…ËËÔÁ'¾�'•pìfó¶‘Ò¾‰EÉs»â˜S¢ÍüL¬Qbß0\”Ë}J$™ÉKÙ�±,ÕpÈ)`Îj÷xˆÆ† ¥ †=L�ëè %!‡º)N�«aV=ê&X�ËmSYþ…Àv¼Wäö(Ï�9‰Úó’Þ{a‘W’ÿfDAOf|Ãã–¢kf¡ƒñŒMðÐòòl.ߢ쬘Yâ -ç°±ïì²÷²4ÝlW_íŒe1ãDãq†® ìÙ-ì êz„R0ÒFº‡â#BÐäs ÙûQ"ß°y¸qnÇs+ƃ¤Dëø~Ásâe3›QHp>†3>ÔtÈNy3^ ‘ÁeF—Ñ "”’å U¡½×‚k¦4Tå›O¨ß3˜‘K¬Ñw·T.Ÿ\×’�¯�âÕEeïmMªÞî}ñ¡c™%ó©v›Sùmp¬ƒW ]�cÿØN¬Ä0D$…tÌ~Ð`¦¸Èulô¾bc©àðÑÓfʳ�¤ëо")+¢òve±Ý“¿ÿ)ËÉcûÁ†(A±Â"¦ Ub©±ý¢XzòF’v®ìK'ÈF ƒÿ˜3ÍäÍËÁ‡þVÃPQ߉jJüm=ýA7Ke^æ(Q*ƒÅ§7¢øÇnöÿƒb@”QÚÌo�Cu›Hö˘äK¶ìAJÂ,¦ØÌvúLKÀVÒœH÷R¾žX7C;‘ò~YÖ”M€ùi«Ú,8e2¤êrà/AÄ×KÂ�ÉAô6ã^‘ö�LýÖ¸œ3º˜â‹“æÕKuY½ô¦”Ö­ŽªÃ*³4EO¥#ìÑ¿rÐVÈ™õâè©=:Žá­ ÞÞoS¾©_u[/ñ1‹sê±^1%çyê¦åFÚVÞ*݆å´TºÕ¬öµöŸד”y#ê»’•Ciꂈy yý‚ƒÊ Z"�oó¿º/k“Ö¿ŸU-UÍh74ýªX¿W9�C¥Â‘yÞ IOfGÛDÖ€e7dâ~úƒ_•©·Žs/uHK‘$m~‰Pè³È]u.Ûrg³ãþ N¯Tu "!0} ‘Õ÷ÚH «¹YÙod›6i9P ?!bê¯çÌo±åõ“Òr௛%¼¯1:|£“¥iËân„�/@ùBžgŽ8LÂïU—\²››`Rk<¸>ܬI¤žŒ÷JN™Šfú¢º‘FfßéÒ¥Ï%KEˆ¦Î ¬âœ(AÆÞ7Ò¿W:üg8?Ks7…·¼éãïi„®*À!z‰‰¬…)ÓÀbè8ó=Ò±9ÅJÎÒOûf©�þ5×Q_j°hÍ�Ó­`•Šÿ–²âðÔ³‰±´Å•ÍL=ÙF&:½®®{q».ØéÌP­Ðf%GèëÄSX)xñÑÌÙ!mûœ Ëö1¤\l¬ŸNƒ¹»Ðœ …á3°ÍiÞ 6WÒ)Ulý>–y:ãÉÐÿÕž#›ŸÐ+ú‡}‰ïã«!iÍ"È�<©s•u¨¤¥¼6�É:Œ~`Ý™@ÛŒ™¯ÃŒ‹¾‡_è‰Y.$¥¼Öâ�Vžrá"‰©bøpê à1ùá¼û�OSà}7Vÿ'+j_ —�$WÊÁCÚžñì�ÓÜ‚&çÝ!:Fð¨®Ôè›0§lf�]ÜÞö‡™{r›@”ÓPl–s©[l©@�Êš*/TçÃ�ôi#iÙŽÞĦq2†¼RmàVÃÀÚîlµaaO)©Áƒe*Ž‘îüðsä!uz6/Эb}½PÓ-ªM¨TaOUßÅ«…dˆpÑ™DIë‹é¥5ÆW[«b0ÏùÀ}hÅÄ/Ã19ßÅã³÷ªì-ù —øJR�Þ¼”•mž�j».ö'6¹[ÚýHŠ��H¼®øŠÐz´Äl¤Ê3عÄÖ6�™QR½ž×=MÇî¨Ìź—a¢ŠˆŒ §´AÉ"‚>»JÝ K'}ú?€³‚|p"LÇkÂÜÀÐ…äª_å!ñ�=cÓG$õçÞÁ†v°©L�‰¥!ÖcÞHʸү’-9ß6F3#F¯A_Q>¾Øv.ºN,¶ÚÊÔ)ƒ{ Ôýt ¯GA3,1 ‰BöV'zƒ¥8Á7ؽ ã“%ÊœW‘ÜŒ¿u²p¨ôiJ›g›Åçù0è±6ôÆ ­§ãô»YWwÐèàË·�jÊ…�Ý!¿ÎQ(ëêÔ+TðÌÆæÉàþ_Eš6ð’Ÿçt8\™bq5ýª�õ·T‰žè”vÖÀ«ÃŽaKÐ/iw[ƒ%±‘¦ û›„Â/¯vÐû(<�{`w`[·"EḄ›J�!È’Z<¹×"W›§ôÔ-¿©²íÝ…‚Ol`†Àë¥u$3ÑØ#·—?ö( Ž¬ØÕ«{Œ&Ÿ›¥’¼ü²’aNctký›²½yµ–øÝÝ»%BÍ]LÏ)ŽÀrÉtl°=:`ûJtøI ¶ÈÆD+¤~º²*÷{¡8 áÉÐ#ÈH€…êé_fA"¦÷]ëÜÐר <|-ÇYë{mn–+ Ä<¶NV�Z˜ÿo f¬wÁ²0*ä‹Ö¸6Ë7þÁ¸©·}ðØÈöª‰ÄEú¯ó<-!nJø™Û�@0ËK¦ÈÈÞMd¨A†kæ.,›¾þ5Ì ¹2½RlBv¯…HñR7Ž�¨O„®hs_L.sNý,Hû3ÂlqñXÅÈÏ;¹7Çk6IN•Ò}[éÏfä6¾Ì©‰l:�+9Œ¶¥š£+È︀¢ðôßmÙðEŠ ¬îËU”°[žDV}ì k]Ä%R¹ µ0«Ý�¯ä„ÜùC×8EŽ™¿ç]ó‚fH]²»å´Ë£¹,šÏË]À’ÿcÙnËu+çd_Ž5�}í½LÀé’3F/Õ)—·G¸î•Ö<ûA�ÎÂ3Ñ ÿ @p×[!nD¸vÞKÐì å o¸ùØ*Ô‰[vñþàÁr�/Q)ºÏÇÇH×°e¶fqÇ*m¹‰sBÒ¯ÉäOýÜø^ìà"UE}v ·Q„#–qteµµpõLŠÍ5¸TeJ•€¬´…ÎÁFb½’Ãψ­ ‚�è‰÷—3®4ýâÁ‹¢U'/ÂäI.í8;üäú¸ôaäð<óI}›wýœíI�ÈÌš¯U‚ŒFTÿX{_ãšïÓÕ ÜÙ2€‰ÿˆ´ˆb@ž‘î~;Þ;Þò3r¨áæQ} LÌp’%± 8`n â8C$1˜é¨7ȸcÅK›¹=10”ò�àpls6ï�ÕÏùŠbE�Ó¬HQ¬0Ña-8qÁ(_Á(TqD^�Ôþéð¿=¼<°�ñ^6‰w® îƒrp=1C±Ç‰Ïk–‹Í¥xs$ô!¬rw? ¶H©­{1߬:†€´h—ß d q8ìøg†²äŽÖa\×Á²ÝÑçƒo›ù'hð}@²b‚"¡¹‘»�K�¸òÉÔvY®6s£G…«T¤F@/µt–Å]&¥ˆ¤û#àí¸‰Ã[Ú_ ¥”-Ûƒ.)c®¬Ç½²�œQE¢ èÅf¤0®r·õ•Õ›#É Aö·°�ˆÏ¶iR’„"±€ªÌÑ••0BO Fq¯#¡µŸ½;%µ$¡fætåý'\ ÀŠ«€°r¨‹™È%÷á{|Ò>gÞ<ðë¯ 6öp3¥ìù‘P0AǶÉTtVÍ,k¿ ˆ4bÞ'pÛj›³²ÛÔ‰íj,ˆ Øoq»ø­Co®ˆûz8Ÿ$aNôK%�m¸ ‚šdê¶¼™Cï¨8“ë៞ ŒKi~4eD+ØvíÀÔ.²Àííºõš¸:x¡—`óƒ6䔪e%4™àm�ì…³t®©,3k�böƒÂhëha6ò°x/õ˜9ÌóK>2s c¶ uàøéx¦öõ‡e’¯Oˆ]ëÉá¡¢¨˜¶÷Ü¡ƒÖn€ÕV”ŸÞZˆ3‰u¬ ‘ ¢†g“tçHÿî�HƇöú"ЮÁ£¥ˆz•)TñÖ•ÕKñ‰3Lµ)ð„@0w2Þ,/*¶�]©ã­•DÕ­-ðT^úÎûâ«Ô=Í!ÔYÿ8Ió›¯RNHfÖîXVÁ�Éô É8w6B¬ÅÙ½t¡Ø¼0‚uÑMZMštºìîj!=¼Úåõ‘× Uývôðl3ìžk�Ž'tsxuÌ—ŽrN7÷t ¤$=\ùË× èsîrÉ�¤¹LH�„ÅÛ•�©~LÍ ˆõ]’336¯ì›ŠÿbåY<‡¿R•Ü#§uj‹æ|�µå;ž¾¬láD›_}’}Í~†Åóps± Ù@�©Ö¬Ê™îŸÁàtß�¨ U]_Où�{·cŽ{Ó ¨pðš º�j®1öÅÉû’Çöj¸jSð&ÛY÷X$çs­ó¬Ý�!)ÄV G¶®–tƒ÷¿QÕliÂ4ƒùù9 >¶½üQ�.~šà‰”«¤¨òè?ëí-zfåø”Ó¦C1¼=#@Ó(¡Å0fйŽ,sI¯¬~~Ru<îT„,Ø$8mÆ6rÖð-OÙg&ª.>¶85TM‹®¯©â•i xÌÈPç±x¸`ÔK $­ñç3åúð› Ó>nö„@„qÊÔÒmÛ‡„‡h'0®Zän³Ê0Ýeä¯8BSQk—­'']Y}ÅN”—o/}Âz~t×Ì9vÀ¿¹}l'ß"ûA´ãÒ* þÖ¯ ÁãÜÙÃëG¡}–Ð�ýßv\X­Ç˜ÛÈ�4r™†¥lûsWSPºàmŸŸÒÖÌ�‰¨Z=(¬ÿ!¾õ3¿ZÜB0z•±!,J• 0CýÄ#eŠ™Ú— 0Vû[}î>.¿P˜5üüî6ER�®Ë¬²Óüô˜*Ãcî ³Ð¸ÝšœâAçb*$0Ú� Ch¤"è¢fÐWß�:;CØÏØÍ.3½AÓµ…4Îúç��kˬRŒË&懾éH€ 7y½C–û÷ÛÔ¸–ÿp ãeÔBÑŸòt¶œSö þù UXÿ™/�lWáEÛ Y7¸ ­Ýö‡s¨DùWœåü¬=3ÿéœe×íúž|õëïGcë„“z2©sê7Á FUè§ÜºŸ+Ö|‚ñ5ÓÖ뽞ùÿÊý‰MQ‰ÖõÚºÀ¾á<Ìë·]A…˜kÛŸ½…½,;U'™ž %ÑùU² â*W5_W‹ü�‰Í?ÆŸ'ÓÁŸí§‚l«¥. Z¼ka²º�Møm°3s¿Jûe¹îÌvu(¤‹©4`x"Íó#Ôxƒ7á]6!YnЃ©p‚.ùÓ^¶z©YVÇ‚hcæñ×ÚPÌ{^ü›L\÷)g^*(#h.ˆª�éòŒj78§½Ö(äŸjLZ?Í; •ò¦È¢âè³áì�WX"Ýæ�ƒd‘9¦†Iâ¹².‡l®‚ÜkYÃ`ñ®©•á()8õqd»ÊÁþ “¯ ð ªw“Єæ£*ƒLè‡" çGëBC�wßw’=ß—ò›†7êé y2`³Œj×/°Í È!wmU&Ú6}X€¦Ÿ¹ sÛ–¼zIã�ñJV2WŽ~Y.ê¦9¹Z—[.Sv<ŽcJ*‡hÿ$þmÖR~Ò©KâòÞåögW¬8rg�ouèý»MÂÜÎã•ZÚÝ Ävùbw’n5"îJÙ€w×�ÂJ °ÀÇ#zü”tHv 'ÄíÒÜè±EYè¸c¦òôøc½[ÅÆöÜ'lÊP� Zð5\e¯4”(I)t|FþãM'c‚È—þjL¹�CtUÅUb%ƒ¸QÆä÷6×ÞôBQ9(ÂEо�𛜟Ü]1²¥EzÝ'«Qû÷ì Gª[;ZIi‰1µ^oõaÓß:ÀZ^ˆëìÀ¥‹BÒ”Ù-ÓWé½0ÒpÞæÑ]²\W�wà[+Ï€ãgrÉ<ù1%Ôæ�ãéö*o4ŽØ&§ü+8ÕOg²ÿoGÀŸÒÏÚWŒê™‚Éa± ºMZùr²ñg3Ê�ÜJ˜Šw«šu6-7n§5ÊU\þc�Ä6MY·LæŸ×Q,ö ni7Fi×'FtC`™oë:Fq®ž ›ˆ‘ýâ#ïø (e‹·;… Ø‹äÅC7Jsæí¢h‚1H ü:GºeR€¦™žwÇò›C¾º#Qí¤v ÉýOx¤~ú2ž„±"!@c—±Þ¾ zé#9^¤ gwÓ¡¢kOzk!TV‘×Ñç—oo [ôk$¸ˆÌÚ+´@˜�æì_øÇJx®Íï@Kò…A‡›µYdýÈ‹å±^ƒkÔ®ÇT<ðr\–eÌXò’[ÀFnÖ|‰¥Bâ­­FD6yðø�Nô¥ƒ?tPY?̨›r²îÂvŸX| )}@› w$ G$ÏÛ¹Ýx‰Œ$³´5XÄâø‹å¥E�<¯ô˜{äÚri\‘qÅ·I��:€#Ùr'»UlrÌ+Ò?k\HþHB5˜ Óî‡u`–@À7h¿¸•Õï(q^YMiv>&af*€}éþ aÙÌ7¸%k>Áˆ‰Ì‰<ßCg‹‹E!)„•îÎMxüˆx‹SºbAS1ý¨ˆ¾í‘]eíÅÕ …ïÄ,wU¬,‰uùâ.Ûnm÷t¦�-#HJ­£,o}C�|á²¶õYÔuÅz¬JDZˆ‘/ žf¢ù,0ÑØE™@A€ÍwNëSâ«�õàÚþšX€¬ÈLP/¶È«Z©KŠ0TJ?ɳ¼m›¥OÁ@ìèšv>=Üþ)$j3 …{£ ä­Òn³èBð4ŸÖäy4 ž�oã’ ÅÓ:o Ë6 ó1%[�Ъí8-ÂTê'Ûm�‚�lª2øUæ¤g'"Mb¦€?å¢áGþC¸DuóH±¤[Ê_ÌЙ­')]¯/FUȹtÒ=È„ª¯��Fɾô)RB2A"ÎÎU H»Z\Ä,˜}ƒ€Cå¼íÃÿØxçSFÎ[¸é :ƒ¥˜=”i0;Tªqñ�»=©™²xC#GÞ¯œ™} miômÂîÁ ¯’›L,–‹+öÆÃ(¦å›#l pÂÍñûvM ºÚ³ä¤oܤ橘¶fÌzGôýúÕTù"öÃzbE§Ñ&;àc"­>XYð)Ë,‰£àø lE§ÚÛ›³U(j§"…=$} äwè[ó"sè#ŽE=Ç\|´>®Ùàk˜WF ë]1RÁ¯¿Uí�Ÿx´ê„ÿI&l‘ïèÁ¾�A¾™m´àLö?§‘ƒß“ð`øXkß ÁܙרA`È»ëäþ|ä‰9Ç™äià� nt½Î…¬(|?Þß 53 V/Äâ©¶ôª¼ùÈ''­^`çÆ'³ »¯:6ÅÝœ:uÈÓd‹šØîZÞæÎ5d•Œ‚Sœ;¹ûkµdÈ¢‚ôí}HY€×Ž ` ŒÌkl7ÞC3ãcÊÛ¸Ž’q˜$äi6{PÛæv WdMo4f»H¤éÁCpV”Xä1–ãän‹ÍgvO¤Ö.øq¶bͬ g˜[«MΑÑýÞz¦³t‡¥€^¯6?ñXÃø%ÒTþ˜{_¬ÅrDwÃ`Åm"Y�ê�°iƒQÐ'È„®®2Ñ�%â³dQø  YɧÅÝGy7¼Pr«‚ŒáOOÊ4ËJ}†Âg²:8èŸqîÜü8Ìõ+Æ–‚Ïý£E@â=}ì_òcô)TB×µ˜ª ÿR¡â9 N*¹šNŽ0¾sáräól}äñýF€àÆjUùtÊØÑ(L¦?8�?²]qhÓŸþvœjFîúq˜1#mØÔˆZÆòVã� ã^öý°+‡{„kÜé®k׃e„¼ÀpÎþnsÉq šª;¹Kuõ ÿ“o^ ѽ)%©¡/×Ç;m´Ã žÊÒ.w¬ôsN•Ã3vh”ñÎÀèÈ‹3uÁN©ÿ qÓ;²zó…¸ ºá¼o°ó ÉÁô&WZq½±1ö'=D¸i¸ïÄk5é.‘ddqF‘ÌŒ#ô¼Þ+ÃÚÄR�“´op¼ø6ô‘Žã“ UŒž4ÑJ'ís³³‡ƒOã%MEâ!ŒSO B�úÓ‰ãŸÈXi&Ö°šê“q·dÄá9ëÆ¡$òÖ�un5} 0lwNXaæš“:6uƒ·Ž6Ù0ð#‘ŽJ‰ˆk=‰yoÐÓ¨Rñ0ú; Ð�ó ÍÐé¥ôpÿ UÁÈÓ|Ü÷G›Sõ�c1L@|=g¨å�Y“� P•áSÛ1g:ÜjÄ—/­ûÕlV»™d¯~yJe—Ì&Ü9=É¡kV�ÜË/¥íìÌà áïÃOïxÂTLŠDñY4„ä$VúpŠªËý'O~? p_Ó�¼yÿ×)Åj�\·[jŠζ1OvMÒ)l]i,”á)ÐÍÈûäTØGþY×Ä;Ÿ=ªãM=¬ÛWgF‚àr{êÜ«œîw‚øB“vË,M:¥ÜY±-â ¸Z•~¬ãäã qØr·|`<{Ó.fpåyn{X›¾ »¿¦}¶�ð_°W½j,‡õú»ñ–¶2A+×ÃÕ3xºltüûêBþ'1<©u™â÷ZKöŸ¸m}ѪÓåYMtÚçGvFô?k/×MÒ²•“5÷“¸&Û ð`%�[8­Ì¹a)óá›°ýºJÄŽ‹‘Óæw÷ªæs±Þu÷:NYYãoîò‘ù9Ïv�“#óŸlÓB ìD¦ �ªMØ·v·×t$œ{À,ªßœ¾‚Înß/~þYéKÂes†ÍUßK³æˆ–†]ýo_°YõzkËoPX6ïCPÿ»$ÉÖð HtfV³8�ÑÞeÓØ Þq‚Ù°?D'¡n„*4›6ûʺ”-?×¹Zm Ó=]o÷¸ß›VFæíãT5¡zÆöÂ#ÜL¾FÜBø+²5Ùºbj³«JÃ1}“º®µÛ7”Ñ›]fÛMú/VÖpxÈ_$•ßc*¼ÒÊ ÀB¾tÏ›�é˜þJ:5³î’þ¿¼saŒ|’&^íGdä†êÿp»¼™¬©9�üRû¤}v롈 o@²4Φ�솛ê'º[ɪOÎÃU7±{æ.*È 䵬œ¢‚H¶|ìŸõ€g0ñÊq½­_ïçÆ$œ b9õ¶òÀgÿS6n4\�/U´ÊO.?˜±˜3…LXò·ðð  Þ±õ.YqÙo‘pÂ&)8&½×O3ÉÂ¾Š¹ß½ÜÊÀ\O�Z´_B™-Ù5…�zÓž•²0�:¡R‡£ánw²ã<„žL¦³…gÀ5jXLɾëIÑé>ÅúŽÍǧ!<3gß‹‹pS+eÂò4ç¿&AŸ#^2‹Q¦ ©éŠTB»$?~|òQ%B·l$ËrUR@„.Ó¬å±�zº…â鈃Z†ñRÿ^5�ðHvTÔŸÛ¦®c`ÿÏ»=D¹-›q C<÷°†ŠSWB’ÇbW(¢Øîø!ÄgI1£™—"°£jú�u¡ /f7â§ ÎjvQ"iCÄÍ�T ¿—t¬"ó²SdG×Õ‘²R–Þ:¹R €Äyh"©EiýË!éæe“Üènó›øp«rSvU¾$s.…¼ÖòéÂÛòÛŒ-£�™·óû*²]w3*@ÓÑ.™0%²ØîÕóAÊ4*~Y !§‘»ÌŽ}±îfÑ ÎÐî—:Ì<”¿F«}·Æ5tƒœÏÀà.aºVÃkJõ¬Lbþ48-œ£�ðÂD<Û: QÎɬ w_Ç¿·1Ü)ÁÕ « ·‚jI´ìñ;”b ?üw*£é'ªTxpb‡”õU�á`;¼:£¢AÜ¿ÔiÂ;à£pFxÎ�Fû=ëŸ:!ÐB˜½TË+ªP–e΀HL¼±¦Ð­LÖá�éúLÉ2Ú¡á"–ñÎÁÜ„S¯{ ]ΰ[Ÿ¾ì0.NÀލ�5€?Ë@�C†7‡ƒ%à‘Ÿ*Êäk¿ ˜tF>I¡’ÜZŒ3&¤ ¿ÜðQ�áèâÃâp&ù0ÇïÌ&õÁÙþZ£"?Ll§?IÙ‡¢ŸV^'l^¾(!ߨ Ÿ6Ê0Éó ÞÔàŠÈÒ ª œaheO0I±WÆOì�]­ÉÊo擪Ÿw3µ7™=yPhd�nhlöc]yÆœŒ±áôm©4Q©9I_x¡•X™òÍ—E(€ðÝ�¢Ö/ —_ªGîêFÌ%s Æx[$¢r~Ÿ'g µ`¶Ž³:É‚³#?3·’#�<5ÄÛ?8ÿ¢?�±ÂÀ?Pâ¬ç+ª‹ô¿¬ëÂ1À}µÑê�.‚ƒî� ƒ/ ©>ãL ÿIŽÿf»LüšzGDŸ´'iÛ¦@²Ô–ÒBvÅTüâ§4“Ñ ‹œVµÿï ù4ho1Ö•Ó>‘œhò·%€sMžù·A¢šzʳ£ñýÁÑR@¤í4,Àc/+èqyàåÞ¸ÇBÃ%yWîõÜ{ü¬)èu†¶‚àËÎ1Âo§£áßÞ›5VÁSLxv»Ç‚Á¦\ŸÏ¾ŸÄsM°Cv]@ûݰä%¼²)ÜÞ7:ESËŽ˜°­o¸ ‡¶îœòzñVóKh�û*òýØÔw;½‘мw5“¡Úʲ!”¹€3ŽÅ­äMÄ+U?ðã`Ü>Å(Ë ªóóç[Š éh }é%ÿ^íÏ�ã¸�3ú#Óµ†U@n¤ªLØE­ÁPXh…ÈŒ»ËÔ#{hm®ßQ��;cîPY¹æA@ôvÿ{î딉‡iµ%t2pá~éúN «@–ô<wçvL àYÕâVbb³Ê%ñ Hó˜É&Ú’W¡nL–Ö€r|‡ï4à¿É¬'ù1ÒxsE¬ËO©3ޟ̧ÌóíM?XE–ÈnŠÈº*•øß×Ηé¿ÔÉix¨(ËâM‘쳺+»ùÞÈÓÂTª!';çÍÎÒofÚI! {È¥\•Š®M×jÀüµV G�Ì7Él¢8ÒYVåpÁ›¢ yÛÿ´dÂ×ñ›û?‰æbMÆR]µû×j€1Zþ¶RJÕ¯�ŽZ£j-¬¯Ž)ÈgE`,”d·©†³LGqÄ4~OùѶ44•jX£ o¢‡¸v/ƒ÷D:—H“’8í¿WÐ�Íqß B8•»¦OÛ¿):ã? ïÐ'zßiõ&-:ðå„ä)ËÐy93ç¬}’¤‘€µlÕR>¡�"Sš¢;…9äÂÀçžCŒ¨ˆ"ë$¢ï‘§~àZ¤¤íŽxƒæ4T‹j_s/ãK>{V ¶nâÜâR'gÁž…àÆäʵ¥‘.õîLáèR™Ëý¾šà¤n\‘ÅšÌGĪª1ó]Ä¿½3‚õ†�–$‹¸›#Úù†X3ä�™ª§ë™¾¡¥}L#m^O”� […?àwìv—Ï.eŶK&šH%òǬ=a~ñQç)‰’‡p)ø&²îü“ÄH�ÝHOÖ2+IÌúB@²$é Œb§–&rAb¦ô41{M4ߘ-ª&Ì2_g:‚ƒ]å^*s¤@pïÚeÇôési|íêëWX�Aj"m–/-ȪÊÛ‰�²h‚yvö��~Uø²çïºÐÖ-µ¿·òeôIsÇg”¢`Ò–ÀÙãÎtQu¹kOÂÞ¸ \Lá7MôPµ´Âè´Ž6^’H½ˆÙcLÏãR‰s’®m¥Ð1Ì Åü�eä˜({,Wx—˜ g˜íJ#[|D.l!ÏHÛç�í*4°Ÿ ”»~˜ÉÇÛÞ{6�ð^…S¡3n(–R‘®®n„t Òž$°É_{Óž1´Ìl/lµÀ~K’Ó9;Ï ²w‚Z÷p%`$²\�H¢82iΖâý+dTÑúV®5\N²:ÞnŸÌ XàÎ.öŠ[êKÃYÎÉÒZ¥…©€#V"›Â¾)t¨5^Qå—(´+´~ÓÛÃûNÈd‡Þ§ƒ›d•<°¢‡ÖÃ>Ø‹Œ¬(=ÎTM>”� ;*“ÑT×N 8ÿ¾((ĸƒ¨~À`{îcµÙ”}Åîוy&�X±´ôìE¦¤Ž#æúÄÒ( $ã7û}¢9�Eç#QFÑK�bt¢µ¾×íá‰Ô7J³«'ÚHcBž Ðá³ῲàA’AAÚÍóÆ%Ý#VXê1æÛ l­t͘?@°53ÝÇGÔìÇg¢H€Ç΃½¥ ®­v;sY~Œ}¡Îj”ˆÑÞ> Qó¼ê‡Õ–¬¾Ðsùk:#=ŒÏµÄ:w•c®ªR›˜ëv2± Ƙž¶H*}ð-‘5шۡÃÌÇ(»tú‘ìð:®)Ù‰%( |`i$úµ�ÈJ¿ŸHŒ0&ŽÎ-fa¾È‘äáù ü×(Å ¹´» Ít³úÁ!qçRn)‹¿¯ +æïwò Ë®G'OJî4\Š>Rc“[÷)��:-}ú{d�0YöÆ[í)‹W¤â†©ðÑÑzb ’˜â —>yá+{Cª”l%i¬˜rªÔ÷›@ܬ5]”Õ¸Ž[N30`À‚áÚk [ð#?®:£cÁ¾Ã)±…´¨È\»ð0Ðæí¥Biîvùg�³méúì‘Ê^iÏ[mÓÑ‚˜W_1Æú&÷ùì·…?;<„H¦…öUXz /ó¿»”EÚv<¬BQb¶èÆf²ðØh¶¢ŠÔ™¬ŽhÇêi$¿^•,ÙXÆ'"g� ÓZ®]ÉÆÖÙü>højöݾlx¢Z¡á7Å‹OÊg°³Fþ4>g*AH•Ó„>E•Ç}B0ïð�Ü54r#Dì´±í,éPÎàÛò!7£Çm’…c®9V’ AQÀÙj£Yb ?ö<¤F>õÄ9èXÙ”¯@L†ºÉò&—•ܽM°Z3×ogù1°ü?Z@H2�8í±!F¹ ú"MsÛà^‚^×ÿgLng¯´‹N°`ã'XtÛn$ä«Ušl�v¬žÐ9ƒüÓí:ØòÅä’tö´aFÎ2£lpzñoÝ¡Ë0pîjVÄ&PWŒ8±ÝçIÑ|UÊ`_îáY6jtj!gÐÛœ"÷`!¥a"ï NˆŠïY÷F˜´Œ¦hlÈ*iyøöüÄaá‰\^z”= )H¢{û”VhÙi Ù5"î5ëÛÀg‰ê¾wnÛÝ|£­*�@¬ Ñu÷’´l™®Y6 Ã,&ìUˆÍÁ.ÔFœ7¾Ç}a2øªDø‹Þ?ÖJò¡ åž=öx>ª ѧŒ�¢®M0žIY¬Ø×ÃÓõÅ‹¼)•ÆvnR÷»û}L0æÒhOòزð•»�PE톉±e~pö�;÷t&@ÎÒ\A»•ðÎ"_ãù)M³´@#[äÇS×7°æÕCô‡ÖŒbÚ«†iæçf‰¦Šüû4báÞ3�«çzìít­þÕø{š‚ñÔõë›ãœEƒˆ Ú«ˆ/³�êœáÚ‰I2Œ|Ø8z]¸˜žQu‡˜ªfëþ”ËèŸû¦eìD¬§M$#4™¥ A„wYÿæµýñšÆ†OIFID¡°é7ON{m¯“§ßÊ8fo�Rkô4 àÚ§â7å׳ PG\-£fa�.mb[VòóelØ«~Ù—è_$~,À½šlvÈE{³©¾?õa”ï{áHÃÚú]q8·áˆ~¹f„ÈfÎá>)§¨Ü_ÃÐöø�ÛcKdM^ØÛþǃff›_a9.çÃ6tû˜qöïG£fjìQà‚ˆ%Ð4Å“š]•M‘[)¡&i9ÆIÁµT4t¹ƒA¶a«{¥¸/kˆÚPo<_?ŒA�öE6�‹á�¸Tw|4{&1à|Ÿ‚%À CöèŽ-žÆ«\;¨=9ñ €ìŸ<˜—ÝÄj¹eLóÃkþV.›HÚ>µèûnŽeYýÜkiW®-W Â]0€fÑ«DD‰�›¤ñîD± rë3ÊAc"Þ£k¢ï�³Á¼#0希Kž¢ yn±[Nl¼—AyU±»Õ÷[öë¨?¡î죲âVj †ÂSƸÓõæz-ÍÍýUùpi!¤ ÒOô³öØÐ;Ê»]’Þ&ò ÌÏU-�¨ AÿWõ\>_Û(¡=ÿÝ9PЬ;Õ¸ÇÄ™¦À#%q­õ °ð"Ë ¼¡ÝõÆxü€’ׂü€ùdØ�Xö¹ç›ÛÖ°Œ/öN$肱‘™užrg(Ö_nãÝP&2È_øIôSÊ}ûw à}S!1ÕsDùXd 4Ú—ÃíÍ%ÄeWÓæ]yæñè–;¼–Pƒó}?nvºº¢ÒéVæ±ÖS&Q]mÍ@{`}„²›ã¦1Œˆº_:\£°@Ÿ©›‡dQ¿`Ï·¹¾‡%kù'r 1]ÔÅa¯Ã ñ¥ú˜1_݀ɗ·5xÿ�Œ–N)ŸtmޱAɕֿ±ÖS&QA.n7£N~ÌòD¼«�©²_¹HV;( zºkÉ”¥Ëg©�¥U|_Õ†0Qô™nA×0îxD£¤Ñ”´<²‡·ˆ"e”6I]ȹì �£hë)“(®¶�æ =°‹!· W;^Óµ‰g»#¼^A)h¾iÙ UÙéºceccomp-4.3.1/docs/images/disasm.webp000066400000000000000000002442641526046660400175110ustar00rootroot00000000000000RIFF¬HWEBPVP8  Hй�*´Y>m.“G$"!¡*²Ü¸€ ‰enüZ -™y^˜v3GúƒÐðÿ溣“ñdï‰jO¶×ió_Ûý*loë?¸ùÙñK®|°¼ßö¯Ò_æ=áÿ™ý‘÷ùÏöGà ú¯÷ŸÙrÿðr}ÉXÿŸêú/úïÝ�tò¿´þã ÿ�ý©ÿ£òüßü?ÿÿf¿öŸü=¾±ÿÙî ýüÇÿ?g/ú?ºÿߨå~ïüþÙÿÿÿ­ÿ§àÿ§µOðþž ÿý‰úYýsüìõŸ�_ý/úÿ÷ñÿã¶þÐ{Oø¯Ë¿dþÛþCü¿ö¯þ_ê~´~—þ—ûçøûßÖý@y�ð_ê?À´ý~ø+øç×·bÿ'þãûgï—ÿá?®�ÿ›ýS÷£ÙŸÍ?gÿ/þ'öïûïÈ/ä_É¿»hÿ!ÿû�¨�ô_ç?uÆxÇhßé¿Ùÿ~ý×þçÿÿèÔ¯›£þóþCþÏùŸÞŸŽ]ÿý·üGþ_ðÿþHü³ûùoíŸá¿ó„ÿÿøüoùçùŸîŸæ¿óÿ†ÿÿÿ“íoó³Mÿÿ_ÿ‹ü¯æ÷Øó?íò¿Ì«ýœúKþwþÇù?ö³àÿ0ÿ5ÿwü÷úÿÙÿÿÿÿB?–ÿaÿ…þü÷ÿŸóÿÿÿùmô¶PÑ�Ï.�‹1Zž=¡½ñïП|PÿKÖá±m3j1L¶³w$9v© Ý¿j•èPñö+ë¿Ô~_œ|×Ë¥Û•ò¨b2:džæìEµI8÷^‹sÉH�¹jM�ûgÔ‚öÏÚ›P`‰iïebª•Í’“®ˆUÃË|çÅ;3ºQ[g&™t¨ÕmÕGÞäû™|ÃÌßÿ51þ> <~‚PÂ�Ç{“+ÝíUDKNCßÔ½¾¦V+ÝR´¹}ÔÌ4´TÕ/õ\¹ÛÊÇð—P| bÛ? h~H•�DE·?ŸðbPqø†ä‘¬”°îžoì~ìR¼„v3ü|%ü4‘8 m¦òoǾXÇ=­jpyšÎ˜æÚ®9M Õ¹KºL$> �¥’S›ÂžÇ†0æ?÷Ö¶kª'µ<ùºjÜ-Q;¶·ÝÖ$òK{X«4¿¡gÏÑÞ÷jŒõþèý⦫‰0[j¤ug7£q˜ûžw÷-àÎù†¢\-ßé"Üu¹ÆÙæ œÖûLŽÍJxÖ@aýª‡vïS[þjüv-m‘s”“=)-,dMí0†*q�ƒÄÛ™ò«}qJòYù½Ø…EËã52Cû~çåŠéÁ“ŠÕ—¸·¨ŠW_-€:.!ábŒQzž²[ÈBÀžù§P.ʃ“‘,d=•Ò ò“²¼ È0!ÂUãÜÖðƒõð ß ß… •«ˆpßÓÎËíûÚ¯î2õMRM/q 4- “ …FüÖçÓGÍF…‰UŒ‘�-ŽÙV²|7 Í¬§B«èzp‡±ôΡ èõ0O*/’‰fº6úyãï"ó ¡{SÄö¶ÞØ&½ûTw�œYo¶ 0"&Ÿƒ!Å^B ?7ÀäeÊY~ ‚fŠù†P/KÚ`^ô›Ë½Ô4§Ç¶mJ f¶³Cè¦&ÏÌ8ì/t"•}Nâ¯!�½ ¯¡éÂTJl+¼¯?·Oƒ`Û¤Y�ƒ GY�ñô ,¥0°ÑÃs¡ð´Ïk߸\•ilR! ®|Â�ò±Gg%ce¯FÏ$Éÿ4=‚ÉÍ”MoI|WuÍœ¢åqfà¡éÂUä ³ó| p„¾ ¾ Ÿl.@Ï7_bÆ�Ò,�o¶NËSßòÃZ¸±Ô¼/@Ò™£A2½6Ï©ó„£\Óþág¢1ãR!Wíøº@Þ霭]ñr`ZL÷…ž™›X€À‡qW�‚ÏÍð$Vx«ä»LèO‘{×¾�ŤÚ×ä�ynÀGw¸¦>žL6׫cS…ÏRÝ=ËûÔ©N%yuÅ›¥0Kñ¡Þä G`i~Ã#“¸P]£ŽQœ¦uËÀ…Šyʤ°Ö]u¥¼€“óFÆðSþë¥Õì…sø5?Ü¡'þ˜}ñé$K.kúg±ô†ö±â•ä ³ó| bdc€åÑt¹õ«}½÷XÜyôÉ¡×v\cµ¶` p-kÎR)ßpI>`“¶‹V#‡l2nC§{?ÕTÿu÷£b•Û'Êð±ìŽèLG>bVT Nl’)ä ,j­÷Ocþ†ÙÊ^P$¯WS<†Â�[ú“r.]»×ÿŸF¹�ªPÜÆBµ^B ?7À À†Þí*ÉÁËZÙ ¼ �¦š/‚ D„Ùç=c9dJpñ’;)¼¦-Ûm%ì9[õÑZ¹ù òÉM�ÈJ «�T‘ÝwÊ4PùÀ &ãˆ*„ßÕ¼|¯Cö™ìtÔê‰-rIgúÙ=vò,GÒ §WübÊ1PÍT Y‚‰ô‰î‰œ9N$v¤VšyF€½ÚC­©µAܰ½¦#à „±v|±~¬áˆ×v 0!Ÿ.™¹îÀmÒLhL ÷Šz=8iúñY¶½Ó ‘¸á)–H3;A0ÍZxhÁÊûf/UÞ„u¼¼Þž:6cQÚƒ¦ Ó¤ ^"ò�Ùf¿iêd¿ñ·Z˜|xTxK�.H8÷ËmH�3Ccñú³æAH å>‚û)Ò¤\Ù]ÿöðî¿UtKn2 ý“i}�]‚©öAº¿¬—t .¾r!á³ø=°z¢Ú´Ó¤›„®ï£éÇZç�ÑÝÊ´f‹þQêEo ¢ëó×<ô…wañ½û®jáŒd‘/äþ@بùb.²!걫‚½t úíû�ûcÁ0ò/ œí¦šK¥ÊÌÖ>b;ÈâM¯/õ�(€ÙC ežp ê†äÜP»²ÝM–3xðj�\€mèþ’ a`u{І÷•wðä0»ê²Ú¹c>˜BÇ·QØózO_ϤÒËk„&'›ýT˜jIØô8ÿ�{ä\®âk÷cÄ®Ñ%/{Œ©¤ Òª2Q½­jMp ×Àìô®³}æ°‚ÏÓ$bp†)W�òCL U |ÈçeXÁ±æl´yBâsÖTïkOüDX3lˆ»V!]ä¹Ôö+�0®õ²îŽne¹íNBòj ÃQé×óÊÚ…- nö¯îü ë&À�4͇ª³ø%3£h §K'>›~U*PÚn›þœÂš\ér>©“ °{iƒxµL'À7¢SÝÙh@ˆQ¸àv˜wt1¨ÉgR}RQãý_L‰å WþÖ\ág¼á©æóÈ;X½ ©Äšå¨—QQÅßöýáÕR5ù‡è*Þ}jÈ�×ïýûSÆc¹*÷—ó„9ù­(f==ËS ›‹­1BøÃÀªc%«sü�šL!¶×Å·r†<_®sÕ%‚m%rÈV_ÃrW¹²î¼@/€}³+™™€^¶½My¥ô1%³OhZA7J2e½dDìpàšèòŽæIO0Z0*d´£ÝX" �açK¸Ä@þ¶+¤Šbƒÿ&8 Ã÷NIÝì§ð€À‡qW�~�$Pp´F§¦.>•IUØZ@QÚÄ¡¯6ß{m'ÍGtY<ÐþK9/x¼-{c�°a¡½ŸW²¢÷ ñ=K2$žÁ±ptÛ\5´í7ÕŠÖþ2G´°ž0Â_êñ¶ØZIû×5c™íþ8ÓQ2—”ºq4EòyŠÒoŽŸ§Í)weãzí¿ ô{ßs¶¹Ö ±�àþ¼uZ˵³£`.I…¤(Ô.SÛë<‘î{ÝÜðáÂ0äÀìêX‚ÆÙM¨9°†T@Ú…}ÂÊë5 ¨®¦Ré,ê ß(C�6(¹¢Þ!ˆz:§ßû§ezºøl�»œìûø[ÕŸ¶½Ùb9•yÅEŠ ºÀ¡ŒG7è&fð´ö�áGÒùlAnYf´³Y¼ð«§ì´ÈõÿRc'à97d1ûay-‚QÊoNŒÃO6ò��ʬÁøø‚…kœÆ'æ©Î3ßñƒ»w¾Í¡ð´+t¬6_áM¤NæL¦H�> «‡á—Y`�ãè3 ÁµlŽO~›ËWÝO�{Ó£(›¯ –—¡søreq!`XÐ÷Öm¯)ÃV9Óð3k…vØä®"I|øâI(¸”ß1m?o VIå˦4a*F}xªëóXéüƯœ$ò€2¦•Ÿ±ÔñV‚}žÌ\ºö‡Jê@øÐßghØ}FªW£nhÂ$¢oÇÞø ·g3?´D œHè=.è{ûY.îöëeïfïLøEf¿–’› ¡œjÜ¡6g¸~S˜vôgLQï'aìy'$~(‰ÅºÀ9+q-Bl¿$ÖîÇk®aU‚»¢�#tƒÛÇ m�e䣵?ÈcýÃXå”O $­^³~YûÔv“È ®J£F^¡jƒŒ»2TËù°ík>g~-¡Áœ]p÷ð�œ<¶©PîWšbù“i«™Gžj&®Wu2çöqXÜô¶,Zÿ.#ÅYôþcþ°%l£rå;-ùl¡üpl¯tóuÚGØŽ©H¶™’«ñ7pª…uOòË Ÿ¥Åá�Àk§Klˆ§æ_³ÛÜÀž-Ủ*wèèë¶æ¸·…¼°¥¬ÝÓ"3âf÷ vŽu ¤‘X2e0ßÀ~äÞ—™ˆ2Òéã“Å›/ëíÿjR@7H,]‘1@kßñ¾+׫Öh¨c~BËD6x™}aa™IjöæÖxð_öþe€øgïŠ ÆœÈ�÷“žn¶b(r㟧0&>ߦÉÔ7Ç—rgÆV~þÀ¬ûÖ—ß‚‡‰Å¯y�ôœ=lŽRå÷‰éBÏɤfñ×»�R‰4Rhq1L«yh«Ä §lz¦ÎÞNâÒL±*wJòA3Ggƒ,x`ÏŸ6ü#ⵇ]Ä…oÉÉ� lqW±¥‚‘ÇìÍ€I]áEŸƒñ P×ðpõòÕõ÷œy탚WÖÇ2€¹a€;ZåUÿ§¶B¶Y Â_À³{ ¨Å0ÝÇéä3`·¡ (%RVâ-3 G&ù�2¼ð.Ù&>ƒ—ÔUQ;fJ®ý~|_ÝwÝ‚éÄœ¹ª!mŒšMP37°dœÏx®�ä©>Hü‡Fw~F|ˆf—?“âYƒ×~hCŠO’ŒñÓúã„ç"÷0UŠÞ-%”ì_ÏaZÄVðÊ`Q“ûŸ=#S߯“+âÈX ß÷Ä�ùZò4¤k¿�Õ&ñ›™iŸÅt6!.þ³ #uŽãÄk¼sr8%eÀaO¼â�/ylÑ&_pbí+E ~uRÊþ³zkNŽ=�áâFÜ~®_¶‚áñšªšrélv¨]ÝUS ~¯·ò&̯øu…Ç8m2fÊö*ÏT½Ñ”€…9_=?cÿm˜Aä¯õ~›„„ÒÀ�-õ Ù�ïû¬#ãbɅ݇^„LåºÝŠy/ëßô¼åµ¢Æ)­ÌûX’îHm;5%KÔÃ)³C#ÿåžîÕ™"Ræä‹²Õ‡ìéÎ{åÛîW™QúÞ5]ň”š‹¿Oö¨1œÌÊaÎ1Z壪��ÉæòýJ¡%‘7ÄòMySó¹çׄD›ú!oÍ3ˆö{‘ûcÇ¡|sÔw6Vd îÞLïÑß 'ŸuªºGµ_ºÌ‡6ÒÊT÷Ú»ô�Ù‡�0Q(ÀˆLï•áG•ö.ÑÒŒ®þpEOP?}ÐóÙýOçéôQyÚiÞ}«×ÌO²�ê~é'ýò Ù‡ñ·¯â±¶±ÃPòò ¥Æ+¬`AJù Ù«v�4| 6¤‘T@Ÿöà&}½jj¡SåãGßà{î¯à¥[÷aS³lã¡1,?kú¡:üY$¹5jh h¾Ä^b6Ì�ߪڈ&Ù+Ý ³®h%2\½ÈϿё ‘¶_UÐÿ 9râ™* ?<<AZ•æ>sÍÊÀ—]è5AÑ‚]vÚƒ™€?t÷xXcY�«z<‹¹Æe†)æ6ÅÙâ4@±h4d’ºj^E„ ¦õ ‰N“ÏCíàÖJ=ñ�“Ÿk†G_†&.kä“cï©ÆõIˆž™«&ëN¬Ùù㸡�åºÆN—¼Ò'ü�³ í}K¯™³ò§p{¡h(+(ÖÇ—c® ©ìHŠu”9{’YÓYgî®tÜß�î5y€’и¥gàdµ’Ô7!ôtÿOL¡UÙ°2ëÏ3�dˆ¸õk›WF‡ÑËÙ*± tìum×2èF¥{J$|JbÅ/O�œóÎ^2â• ¹$語ÔÊM¾1lãq‚=(Ž®„B×3©k­:Þ‘™�Òî_eÄ$Æ(͈ޕ�àóÑûËógiÊ`„ÅÚ¹²õéF¸[;; ëH¥¡�i§2ßÅ{Fg7¾ÙcÅP»%‡ªnïŸ/ôÀ�"l�ÔÎ6PËŠ¤@Eï¡%qrÔ¹iY…Ú 8ËøÎ¯»µ‚áÆXã·á#Ž&k6ÒCLíÿÚ>H+E“…ªèà~ûÃwξ[J˜è6Ý<Š=æÚß丱FÃi±Ê¿¶ƒùË”p1Ôø—‚‰±S3óä¦=anž\À†�(óΛςOÿ?Š¿ëCµ`Á]}‚p©,FòXaçnߺ8HÈ““©F žŠˆãã]:é©€¹Ä‘©8#%66¼Ã÷-~‚C<Š1ÿ²ùOûõš40ɲyÇ�­�Ÿbó§° ¬Åä|ÄŠbÒ? O–ÓU]^Ï+8ã\áõ¬úœ¥ lºZ´ÓA‰Š)7[è‡FæhÒßÅqÃB‚H½£M¬:ž“õhùH¤�ãò«!3dä?#ô]âE ·)j0Å«èzâÖäíÀž¿¶]E�;Á‰ ¦s]…Þ-ëR²ƒ!t†N;eôPr~½‘2°�ÊF¡�×b0.OF VœÄ[�<nµ®€Œ;?W°¸) ­„«ÊC„*µ;ºÈàOµM,ßã…¨ÀMq-©alÎ+±fÍ> ¯ úúf�†fd÷!�ê3ëwø -n´ãzC c$‘Äcš!3–ýdÿˆežhƒ@3À¬A�ó…ŒuêVÝÀ §Rý­jœMê{KÍF›;³¶yð8%ˆ p‡¿d_™¯–j¯1¶e1t«�¾Gí©` �¥@Ëjº„!iÑ”ˆRð~'T\»bc.›Råy,ÛW<+¿Äsa¢W×åûf‹|Ì2ú»è¥½ár;ò²ôÁžƒ˜ É¡¿1,œ7?jÐa7MZ¿€¤uÝûUÔãž0Zͧ,°P[é@f÷ñ bYÖhÚ䧛Ъúœ!Âö<[Çb= ½r’%7䱨çðúžXF²g·^QÙùdT(Æëá‚gÃè4Û?å÷£YpZÙ^V¥Zð]%Xî8›ð~I°[…³%¬WºRAŽæÑXWÄì¹%£ [[ø { Â}Õœy" ûƒ‚Ýb\”ô]õÌù< 'ó±sÏe(¢òM¶«>Ù/©K ýé@`C„8«ÈAgã{ôTݨ>zo™¦âOý[ìÝj%‹%‘ m?¡e•ªRk'È¥uÆïÜŸöú~¦c%ø„[ûËßfú„ôrÅø/hý ÒÛøä¢ý�š�•Ñð™·­B1 düZÈ—=.J_àà ¥õ…½Æb¬ß'0iIÏ[NÞV�ø¯x�ðØÅ®Úkì©ç{©ú'¶Þy©˜bYù¾8BÐí)k¼ÃâÍ\œCüóŒëd>ôð^©dåY?ö³/¬S_Äñ™c|¨: Ë~ïüŒÍ.ˆr|2\qwÖýçOŸBÞ¥ßó9µb¯å›QŸú¬;'TÄQÌ phŸ 6ÍŒ/FÔá8Ã@tèÎ÷ ev#f]&íÀ‹`|‘8Þ5êdRxKê{4§3Á*¬±ðmŸ›à`Czjbu:Et Aœd¡�x[°d5Ë×ê(¥¯=8’ æðÙ«G¸/„ëyþO´Šwm_±©c®ÂòQ#…mÂâ­éÌgNè/ ²Dës+Q¡1 ^�tÔh,Gj.ƒ}·yEä3­ÒºCt‚Kòë}l&ÉX[Т8ô{è°N2Ieæ‡Ë �ôÒÐÇøW†«�*ÔC5»Åj«] ?7À À‡qWw.V§$lèyZG«x? FýÓTƒ�úX¹Ì æß³k$œÑ¼0b>tl4F9ŽOÄT‡èß5$F—šÕ´­�"bº¤àP{Yõ¨ÀS—ôÏÓž|žh„’DÂy“êRÉé­Ò²œê„Áþ9­9tAfF·ݱS<”âÿ~ÔX¹!¢tlzðËIá-æJÆÉÜ}ôUÇæøá ìËÏù°,�ùÀ]cœ]¸Fu¥–n~¨^\/ç¥íf�â=Jßf±Õ-– ž‡ÏŸ¿�ós)hfÅ• ¹„§cb!jßÉ%OÄáhè`«ÐYù¾8Cмzé¦efH‰—YËV–¡Cºwä^|@øÁuÃêÉv““_±Ùæ ý¸”·RXÈÜîšœÁ’²<’skÈ{YV×¹WlHïŽP!˜ ¦Å$œÕ¯ÿí èzp‡y,ü`˜«–N…WÐõƒ: 0#t@`C„8«ÈAgæøá ú±l:úœ!Ûpõ‚Ïø�«êfÖ 0!ÂUä ³ó{ýÀþ2ÕÒ3›}eÌ*Ih?Òñö^%¶f&–ýÂóþŒ2—O¾jÎ;åž”€u…%Q¬ñ�¯W]©ÞÏðEž>K]ÁYë=fÆìZ×´+�àyÖúZÑâwŸ)åºv à‡Fâ·9Ð’ÏÑ—`fv,±3LÚ©†©~D‘^@æ¸ÓèšUv{ÙøM£4Žúœ$­§·Æ•„@:ëüRUpPÂ6QÇgcê¯Ó$îh`)J‚àä°Rø%¦”©Ô¸YÚúb íƒäf ¡á+1 PeÐlI-öôl˱[¦ÕËù&Ë«Ð]Ô¶oÒy"¤q÷Æød^¼G�Ü~QkSƒU†<`GŸ Õ7êtWº›žZfã‹î¬¯ ã4—Ðÿ»a~¬1;îÔ;—h�¤Ÿy Jíx—59%PVuòõ‚áÑ[ŽÁAT"ëégƒ9ýcÊØêBóS4¹QwÀ”§•ñ•Fៗ4 rL²Ûï¶åPZs×c “ûC1Bë±ÈSÃ,䥳±[<°ò�Á`¢Ž—A´ 2\i÷¬ 0 ÷ ¥€�@—|8QÏÿImÏy¦žÃ�²hÌŠ7h¦ÍlÏŒâpy”±˜æ¬O”›§éa’öž›æx]Š”%Æá}o$K—r”ñe=b»]À:³Æ/TQta%4Ú:qFƒÁø}§Z0‘œ™ ëŽd€ulú¯ýéÄù¥¯Q7®¸,±–v&î1ÞŸ’OæèKPå6`Ã’I?’Ê;�~]ÄÈÝs‚Q~åêtâ8EͶìa¿ž¸�0|Щ�ÇÚn1Óá©§¸:yÂ8u§îªÀf‰nvÉûsFž·¹¬LQó<�7¤Ì?Xmnp;v齓Yef\8ÃQJ%¾Þ“© SÎ$ÌAfZ7¯ªó(ë¿®Ã�V*úé:±U¬“=ê“¡ D‹¼NÑ©X'l a=þ§9н9Õ‘@TÅrc\�»ºÄx=|Ê1w†�<Ò¨=îÇSc~²Ýùd|Ë—+Ø‘ n^‚�ØØåxNöcZÌ%W Ü'0ÊŽèg6fF>u]2x%›M;ÕYPî�èÿåZª#ê¶ÞÝwa-ú ,'Lz}éÝYÆõp;ÿÅž/dôŽnÛî’8�;*ÅŠ/œZÓWš¾;b¬^ÓAtBˆ.ÜÙ w`ˆ“Ÿ?¹ØÅ”«éáÕ µYÆžX©f8xQŨ]XX$Ñ"E/¥l-S'/gýÍ[YÙÞþÁƒ§ø½šDv[JÆÝƒ¨œÑÎë¸} M¬®7œìEïõßIóNûøý€ sýÑb“E ½í/°/à]>¹¯ÌJÃT Í^˜ë“ùuE¯Ý¬R‚2JÎ ¢…¼Ôí=¹×s^Öƒ)§òYa>`^ ­®G¡Òès“*Ü;�[ëæ@ ™¢Ïé§â³ã<¬ÔM�gmïöÌz’v¬�TAúOÏh™ç$»ƒeÙƒ5ƒŒBmx ’ –QÏÝÆxÅf¢?æòsg¨Îöœ.¢•«‰Ôƒíœ£&Ä 0ÀDßø0ÔñsMŒS¬ˆØ^L>é°>yÍÑF>¨!ç( ÷eÚTó±ÍLšï¶´íp%Ãá†��1ë7N8À²SÄóF»°òpHÇ)0ÒBì`%ùÂÃ,ìE´¿X×¥÷‘°ôþòþ›biÁq tµ¢LY§A£Û$ñÚr)Z³‡™óßKê>úÉþ÷%“Âà9CÒ¹]­¦�M­ÜU‡,LG¸>z¹ ÖÃIÄ =:^“¯ÿ KÕ žÿT5”œ9­Ç†,R":¿)‚™äUe㽚j;ãÍ¡í¶Nèá�¯°w#¡•Ië™g¨gL#£21îH¯t‘ߌèì�Ãå:h¤ø�lÓ¹]¢ÜyŸÓ‡ d+eOCÖAZ5EyµQ}�¢¬ZTuÊÌw;ŒÆH,L¤dnÃEr¢=b³‚üãÚ¤üšmÓ‹iG{Bÿ6ðUŠj\tw¶]¢QÒê\dùÔŒÎHÑgì%·°Ù9‹„G°?¾un,wPë…ƒZ´è4H£ÕääÒ‡$›IÒIïI-,L§ÆïdE´ÂÄ*–MoË/œÏ]Œ’ÿ~Á€¼èì›ñ­*GL™Œq|díaž˜¹Ÿ¿›T>KÔ¯éTõ'#©–O¬ì¦w±ãh¾p¦Ò*c«9‚Òs©èçùÜã€9$o¦Üù˜&ÿþ!:‘Ê`¼îEMꓼ ¬wÉÆjÝ›u¾ ²}]=—`ß¼C ÇG¤½,D�ØÛÑ„Ýæ’ga鯤½éú]Ëe\«XHžŽâa}’ÂÞY&t(c'fP¬Ne£cïDè±Q—€Ñe¥<9ÆS÷pKµNѳ‚®UGÆÈ@ŠøïÞÃA·û~WŽïà1a–JÍ&{¾gÛñX=ŒÅ3xz5<…ï0%,êc…'w§èÿÈEaÅgÀ/O(SËc£1…ªS½�ò öðµ Ρ]¾ð–íöTÈÍ…ãi¹…±”zY·JøÑÃáP¿õÐåêIh½ÇŽžåtsxòBk¢Ø_oŽøÖ¬Â è@!Lãâ_]!oÕBŒoÊ‘ãte‹jê †g¼³ëãe™Ú±)xù‰Fßþ/AÐÔn¯Ù+Zhó<Ý{×1êQ9¯?¨¸ñ àõÅ÷dï®Ñg²f„Ö!V+¸ueÆÖÿÆðÞVó`Õ Ï3Ø0*G†+ûýÖãø¦õ€aöÉ‚´_¿¤¦ëRŽ÷yÚ•8'%°…ðNæà““<©À¾Ef?RêBaVx£C*§Ú¬·s˜ïRž-9J¬�¤tgâ]r£™Ê,*ý¡–];yHŸ ¸g< ß*Á_;s4ÌHË­à^ÖßU­£á‚Ï4¥áôJ±ðELy†’ÃÐs;$pŽ42\¶Ó×sµ+úx‘¥¦AZ±ŸoÇ”AWø¿ù^ác!fÉ�ϰMÑ’czuÞ{së� ›ýOÜã�+íÁÌ ˆvIÚä’ÿ͈Vij‰Ï�j�Ìk�YXÁLSÕ(еn&9¨º5±�2©Â—+ûq�ú…Ô°î�£�Í/�ýBfßZ1è„K¾Ð³Ï^>-?›pSŒNþ¨˜[Ÿ_ÌœÌtüþg© ®û¹¢ºØ£Ò%± 6S>@2–¥�c[´Ò$EÆfG>较sÕQQ:Qd{³8º‰× Dbþxçá ÍŒ. â­Ù2" <…>}†¶ð¨2Ū`’¤`E›ŽfB*DVí¾BŒÀ˜?/8Çû†Ñ•e™�Á럴 +„2AIÊå—™í'þú²E¥ºv`.‘“E¯žÏ�p¨íCŸ™F,jàDCÛÿz“éñ±Ì±žÞ{|Í̶µüc6.(_Ýÿþkœ ÿ0eòÔÁ•ÓÎ'�ª¨æõw)˜—3ÜØ2CSp 4ÛNŒX\ìztÙl™›åªOmõ$¸ B5v}ºfàK�TäK1Ö�ã+ŠÂu™†ä6�Dƒ07u¸øÕÑ0"÷Z¢„xåõcSþDLÀmyœ†&âDºÙí`Œ¢†‚8€®ÓØ=mÖ߈\v¸ýŒ2ˆSaýŠ'ûžbØ>v¥¯+~Ÿ³þœÊvã^8C.¤9ŠO±²ô9Ýì#³08h͆M‘µ;×Ìr÷…¬]~.)nänÕΧÐËjL ÎÙm¥rXBµ*;kÿ4âÅ·¸2ñÌ%¥‰ø×„êÊ­Ÿ§zvözšú\ýÔÍ>îîæI!~ÄÀÒD-òf R´~–3?!Ï4833È"x´k÷½gõíyO©®GÎ2>/è)w(uËm"nEF ¬“‘££î+÷…³$ÂAš‡x—µ„Óôq Ûîˆðg埽ËþfOoûÓ{CÔè%æµ3—lWmm–ì…‡ÊÊA¿—I0§}WåAöÔ*݃^—“šÕ²ºÞlþ…Y×t>â?OBÝ…£ßÝËî!eq[a/ƺ†ò`u¿á‰bKo¿ÅÓånSb¼íž^l’Ï ]FîöY̨Á™—ä1•ö¯×Ô´5mF㟠•%Â?>\^B°ÒXd¢t3ä¹ì{v¨øÂ¼AH@¿Ïª;r³cpBÕ75¥§>Á\Ú-#�¨|”®(_Ò°)?î�øì·nJ³@íL®¼‰;Ab„N+H·uï¯|w´Fô×c§þ™lgÿÍd”)˾ZSÍÀì+¼Ì5�>TÈë²)Úwj§ú—¬º¶Ä "­VL’ªˆíÐ9rp�½‚ÖJ4Ñ覌<-\>øK+`árn9„Ь9hÊäÌã¤ñ†ÊyŸÎV4å¢,>7ä<èQÛKŽXŠeb>ÜåÖD½¸yÍb âŽ5üÇ–¿ÎÞ è’„Þ X Ôõ ÈzÑëg1צ漾ç+ôº„÷ˆm¶N˜B!©14¿Z>‡ï,ì=í ÝU5™/òhËäÛOÜ'Ä/µ-C*’RÍÆÈ¹qÕŽ |B¾|uóä�V¢„E;dËS¦Òeþ”œê7nåwŽmÌ’¯§ÃÜ„UüâèÓæ ödõ‘=Ÿíi²œš¯&2¶ÌíŸ$éü‹ð?Ó#]H¾t+õÎXÀó_G„EÎg¦£ÿmzL+£.7H z¨%;ô�”ëÍ8AkÚš ½ü{¬Ù¾Læ£ìÆŽòmÿúbq’¨¼o ‹7¶Q‘‚ i´ªšT‡Ë¾<ÑQD¼á®s¡½ïW¦Ø±(Ìy™‚df‚X ôðŒˆ× Vºã£¥Dži{�´T[¼×µòy]µFÜ Š3�ÈÂ…„a¤­òßq7òåe‘è'"�þ ƒ·šÔi¡Áí¾Âümßs¤§ï C¶l›(8!ØÒiýIƒDÇâIcž¯;.]Aè‹jO}N½DQ‘{f¯ä`\ª‘ ¢à/Zˆy¿°×¿�Ý—¨P¹SÝIGœ&&¬ø¦zª‹ÛØîF* ,á1ö!øþC+· !F[ P{ ‘ñ”—n/œ€Ü7LÖÈQªN�%¿aˆÕt®«!L=ãì}ÇŠéÒ2…|tâÞé‘Àù‰oO]Õècs>†Aèô•FÿÑæq…vÌ܈NNàËô°&)í¼Îä�›=˜ZÁŠþB;§SŠ`Pš‘/LpïbÁGÓò°R\G¤±Â'l¥ëoWµ÷¤úÚOK­èµ_²yÌÆVð?$úÄz &‡0èÓÙzi€¢›R/èŽðÖLtÞV·Ø :ÏŒ^¤þ–ÅS€Qªü:Ý»À�®jšXÒeù2ò° íÈÀ̬ GÍ‘Q}IilA�£ä ƒbõh½�~è?ÐnÇ­ƒ‘à•!*‡T÷ï#ênÉ>õ˜6a>²aòŸª0p ñhZ6ËÆžÕ{�ŒDÞ©´Ú³�뽯Ô_D[eƒ6û‚S¢‘Û¼RØT‘žïÓNJ×Ű¡‹ ê©�2À<à^SAÁƒó3„b0\šÐ4þ8ÖNL^’EñÙMUÚðTÈ̵_ê/±q!üÓƒœ®Ï{[‡‘GÝO:“�/áЭÜò&y{¬'÷ѯhÑÒG:Ô„�r’ÅZɹä{*¡¢ØkA ;~‰ä..¦no „GpòÆRió^U§…&åÜ M´ï2LMkJîÕÚuA—ºÀè‚ÖÅ©[}¥BzËq¯òw¦Y­Þ»¨Yj}âÉÇF°o„¡-s@2ã莎&·vH8Uåû¨¯ÖîûY TœÒy#¾H²ÞPÅO¢äa�áõÞâ¾×°qu¡b½8‡ºr‡¾‰ »ºfì±8´™ûCÄ£1µ&VÁyš¶*p|…šªE§¯Ñêwš^¤‰fa†«+’üâ#ß«Žª•µhlî} €Uh–Ûr6$I@ÉO�¥·u˜#$Fæ“AÈ¡Á®9ôýœØÂŒù6è¼Ñ“õ”M xÁT �f�|a!ýð�5ôQ0YŸ_ùÔÈT8ÌÊ ÙõÊÉŠ�,ü>Yuøˆúžà ÈÁ8#ßžý¼ÜÇ€]¦“ð)ÇKð¶äUõ‹O׳d�Îí X«)êSæl^ ´å´BSŽ—Ãð‰ÛЍ$Ùr$2Ú¡©9))£%�ëá<­ØzcN1w-—ð[Å ,ªX¬ÿCÏgüQèëoR´­#œ&å]~•V)ÝAiAø0lq6Œ„eÌTî—æJ¨8G.Ë×nWÿ›•x91âsFºC�L8ѽ‡KÀj¼“®%»¨ŸïøÜñT¤6ƒÿKÀ‘·&±ŠÆ}€‰ñ5$�Ÿ¨HPAá!îãÞèÁîÙêÝüõoÚMæäB7‘ E‹oçÕkLØÿçBNf#ŸRœ*õlýU½0<êA÷G|TЇæòÚž8–žV(¸/N¯G¸’U Ÿz>@ˆ^¤£ Ñdè¡q w ¨¬ƒÊLË Œ§y "ž§ÎLæO{î0P÷Æ×f7˜xÁ>ÏoÀy]õ«´ Lø»ïUš»tÖ<ôYã—V?—Vö“oœ¾�˜‘<½=±5mG:fCyðsæ=·¢€×Z\C–‰J#’Ó˜ g|i=ÿÇ¡ZU\þc¯;óõœÁƒÁ$[[É÷f›4±kW4TpìFQf¢ûB[?5Icù7Ÿ¡u!€Ž¹ç[ò…G¬û”NyÍ–cà±”lÉxØV�Ò…AµLš(YûÚ†DÓˆCie 0×FP!ëbb{’–´z$YCjáâôUŒ©-㉆4”ãì;¯(Mñ÷∆ئ¥ÿ?eœö`W×P–¦(λ‚ÇfŽ­ßmj¨Oˆ2®@äýÌVÙlo¦Ø‘æ†4ó¡´yèwÞ [¾í÷P³m;”_x^ØÐ©9Â_T¶½&…õú¶€@Mc� Û}£gøûM[Q7Û©ºÜi-Ðð­vêÈAÀ­ð#^ °°? :�y¾„¡LŒ[EË œ #E ß0…:³?ª'V nAQk‡cIA3+³lƒ™r%n{- ¿P¼q`Y,ŸÃÖþƒç¹!~–‚q´p;²�÷U.w9a®ÝY8¢Þk\jì¼ÀÞWs΋FÆ¥ þy•Ʋ©”b›S6½,²¢u^s-mü&Ç]srrd.oj¿ÔšçPœ'›Ñ§NÂnˆú4¦P!wÃÐÑÔ±’‘Šofã�‰»A½š~+yÊX9�g]ÎÏ 9›Œ¾Cžt8ç«ék?}eá.. -³ly‡¦ñ/ûÕ£õY£[´Î{ÍéV¬úaÙúáuµ¢î%ŸwFJˆÂ�CÉ#¨FØEˆ7ØÍØ�«¾ÐÀ’Ãë…K‚ÁÞ�aPü†¯Ë;ÞÝCËšoXT¥Úîi¶ ÂÜÑXf”üÝY…ܧc*y¼5˜¿’ ?W×�Ÿz„Ç”Pgý3:d”TÝÁ-|"Y"«ËZ8¤‡ëéŠ"¦˜»Ø zúÌètmÀýóЧQ¶ð¬3p�¹?rˆ´ˆ6ˆbŒ…šPŒŽv3ö³¹Üµã¡`ŽɤÈ,.õ6UQ/¦”„w¿8Í�¶,E³åÔqq­\J¡óá§ ¤šM}µ«ŸÅ¬ÁæPxæj¼8#ñj†y�‹=ȹjy;ž¨ài¿ÅÕK¤h…©b2ƒ¹NÆTòMôy„§ý¼Ìüˆ«�’¶Êœ‡ígs¹q7ÐãŽâƒ;”÷®~½,àÊ×äÎØ0éƒr´åÂÏs¼›P¬úýzO_yûÉ)igÎ; Ö§o¯n¾Z s¨Öúj_’Ïþk Û=)éÚbÚ¾½�øÆ @Ä�EË–¶0oT[Kã2ÞLÆýcÇ‹5ØR(Ã¥x_ œ¢ÌÃ6¬ç0æ”G–„:ì¦7¹ªU§H”N8sünž¿FôtÔkÔ°!:òííöt �wðò+iؘzYÅhU=~k=dzfžï–|]¦Ó!Ÿ¼tœqñMúáÞ ˜ DTi\Áª¤¤®ÞÖÆFK›üÁÎZ#æ à ÜU{ˆ�¢³Ž!}‚åÇóïVÚ°N�W-B‚¶õÝŸË·Þ¤¶.\|š“î†PGF·¿Œð†ËØ%Q·LŇMQ²'nÿ"nþ0+~™jÛ6[ãVß)ûε†ä‡¦}uuFdŸ��ŽgjÃ0_ÏÚ7`lÇÞayÿGäMX¢b¹‚º””ôO¶o&¢BŽ›j_:8õH¯’‡ý ´àE^ç÷¦m’%ŽxÊlܽ¥A0ÉLRHö$ÑXí%G!R}æ‘àHú¸åþ*‚eQ«Q½’:½G�&¡Ÿ«¤ÙŒÌ¯?@âaN¤Ã ×–-öjÙªW? QRË.'Õg~‹IågƒÊKÍÈ/‘“Ö33€ä/ ò6x€!}ìåGŠ0È«?-lùÁù%“¶¼™Qq´'!­Kz€�µÔ°† %� ­ý&?\� óív®!R4üÁ’Õú Ó8Ut»Íz£+£['±®0~¢!.æL/K›˜uI×¢¾Dè®ÿËZ¡ „õï�}yï·gâ»Ùa÷d¿È¹DLlzùV‹5ñZèÀ¶îÞ~k… ²ÄØBq �ô|‘J£˜ëù÷ ( mþSÜ U„Ϫëã={ˆ…y{ŒoJ†�ñqøHP¦8QJœ«²ßNxF„{øJ�œaõߺal ÅÑà¢à£Ærn ‡¸Åä¨6«äc§Û¤¦)µïÕWá6ÑÕ°†MúÞô4ÖÉÍb?ÿ%ïÈH„í{<ŽÁ ãýyn1ØgÇl ¬"á»Ä†C3�3†í_eÑ7·U(A5,-E;õ½¸_u—ãÇ_ô¢•(ÞoÅ1-¯�wø"ymõ¶9°¸Ä¦OÙ5²ÙàWåÁ‘åj –^ú/ôá‰(d ±­ñ!šÍ“�.T?¯µ³£Ûþ_�<M-bÔ‹¢‡©Æ†¥{lp¾lß"5úN˜…²ÛL¨×nb¥cÆîÛ) !…ÓÐïÖ߇ªUjJE¯/½æ^œá•f´Í¢µ ]–ÓÇäG™Üßò¸o\% v×i¬�dzÀ2¥øÑoõY¼U™ëzâæùÎÏ‘’Åó8TîÃþøH¼8›Cþ2 DÙÔŒHÔ? FXøË…«FÛQ$yEÂ…°ýLTW¥º‘-ç>ôª'ê [=²ë8�V©&¼fÁ•$êcWŽqOècvÍS}ëÊ%�–ãDjégXÎl  Ja©2 w°ë\ô诋'Ê|OÝY—‰® …a‘§ló¾£þpHÀ\H3JlâÕ7•â‰'ovl<Æe/ÔQ¾mßsû³»ïbl |ö›$¹î3­{[Ôù©ø­AKÒíæÀDsIâý\Ë@,,è5«Äõk•&éi_˜æ˜Ë»¥�î1î¨f31 ÔܳLj¦w#’Äâ#ãÁ„ÕA%醿×)ïG´6ô¿²Ñ\�„‘îé¼ú7\RÂm˜Æ) -*ô[ˆQW›A�SR-3´s�ä)ßMN5ðKòÅ¥¯¢¾§K«©R6ªš%ˆÜbª©|"¯~EE®q¬šR—SÓÍC;“‚søül–ùµ üD‹DÑ%/Ž'³l2Uˆz&!çË5#lÄñ¼å�&S‘iAáßÐ-ÁH/cžD~1‚EÙh‘Š� –v_ŠÈC‚ÀóíŸK„•Fã•-2uA2‘ö¬­�Í ¶ê‰"’ši›«JåOû*ă¿¸�%‡‚¤oHï‡m&ê.¬ð Þ °’*ýGVÎrý£ìž`î³>O»Ï»¢íò‡0%JÞ¥†åÉ`ô~†‹µnT/jLÕ”á'îëF²8B\J›.ìc~:îšÜ9ú´¡¥|WVÍß�'êUècš7õSÈW+ê8~øre‡ß–|ì%Iú2AJµ©§m@…ñut—OF\„ljûX�æ´eî³?ι«P¿©À}JdÊ; )‚$ÜŽ_*)úCÌ?EÒ†¸Ò­ðzFž£÷2Ì=DWÕÇS`¼öÍçC‚[fº*‚éo/ÎÝB'ÜÞ>ë6Y×EQilàÎa}³¿>ÁZï `B’xóV-),[í�g¶Eðb[Gÿ6R0g¯�ÛÅÐXd­”uJXQ7þ+j6*gúöÔ�ñQQr°-WùOÖŸûàI/ Ÿ\á¾.YA[„\|84‚[ÒGhˆÒ£;&Õ£Úòã~w2!úéæV”tQ„‡=†ŠcÇ? d†]ã‚&lq39ú|;G™õ�?˜ºÑ‰‚¤³#‚D4“�Wø%ݲ2aƒ�Ñbq9€M>sÈ9/Çù¼›lå©À„Û5Ô­Æø2üi† îÞî­g9~ù¡”šÎ«$!–kKÁ¿/X¶í@7‚ëáÓ™‹{£ J–Í0(šO·*¨²µ?)}ÖLìIí,žåf‡v®²¿x?ÕD"³„ Q±ÍÏÍKµ7M«ÂÑc‹ëÝ33ÕŸE÷÷ÉïªkÆ•éõN…ñhûŒ\~S$ 1þ!fê¼£W8DÜkö–Ýe€4×)»ôTðƒ�´(FÞÊùÖ/ý²Ø=¶=–1kÛF¦äìæ¬³º‰QÞX9¦r¡��ÁEE’·¸dXe;ªGŸ8ƃ'yù>Zô/ôÚ=æ ’Ué$©á²¯¶v/W ‡ˆ\Ñ\3lþ»CûŠ\Y{e»hÛĈè&ŒGbA §5¡Ío?¼A r½ |=îá-æÉYØC}~·›òÄbÛáö½Æe%¹ÝR;öJwÏ25ޛӱmfë}å˜Í•Ÿ‹IWâ,e¥˜—ܤä–`†¹ûí3Q‰z\4\‡¯ZÇ¿QØE ^;º«ÍR?Á¿ÇEüÞ¼®íàFh5„€UXY×’\%JoÙ]%} <Š�çQÍÂõ*Ÿjs ­(~ü—˜»Ëþõ0sŠF�îg²n9X.;* {ë¼;—€bÝæ Ž«÷VtMì§‘ç¦înˆ=‚¥ìÈiÿdŒ¬32ä_ìÊ·&üîvÛÏ‘0á}r‚¬ã㸞-Î`U0V¨>…Ž7æßMs¬‚©úË÷nìë$âòá~̵öYàbägÓ v±ò=—êšùbíDL À?éäl¬»cÎF€ñÓņ¦H!z7)¸íhEéAJœ××àC€»“pqïjÆZúV5pjw•˜QÙSǵ“¹·Š)FOÀif¯š’@Ñmòæ)úðÚNßU0˜ÿ çßRv^„$ȧ¢íN,*R®ò.’“x’G¨�r¯5ÑìÀŒ*ÏDfuÞÐË ¿�&þ4yúÅb`?äøÎ!AŠ}–$à�!¯9I´C„í'N`ÐX'Ñ<Ñ…LÇÛÍó¾­"xOF1||�OfÒð:È$“ت&æ'ãI…t�¿nØF¨c~ô³}QʃÓ(ϵ~.=Üü,QÇŠÖw³ˆ_$õEÛLG)ü|²œòÁk1L/¬ÇÇBdƒg‚¬^N±"ÖU«€¦ÐÔiü­¿^oUJ«ã¨ÍÆô l®y×ìýÇ[bø£]‡}Õ¿ÞÃb6êÿ¥E­C®èï›:zdõ�^¤~«E�M‹�RÛÔr!Ø©MˆÖêúЈPLò¤“ËN’Å<,“ÏàÞ^�z b%#*ßã'9ˆÆBV±WYýÀ& $FUÄ'#€€2õ•¯´ÿŇp=ýÓj¿iÙ4ô`ä¥ï øN¬ª C!‚0•¬€kàU,�ðìÀÄšèM¬Ÿšš3ïæò¤xÆu Xû�DÇŸŠMì,[pó;£hKŶ¿§{û6®VJΊV*þ`¿dL^šh1 ðúPÜW~ïž"/³¿Ù\ô×u¸²¾ûÎÝѬ¸ƒÜ#Oè”UáQÒÕÓtaϱkŠóÒ ¡bÈÈ8šÄ*�ƒî"‹¨¸3…‘~-ÂÕS^½7Œ95ÅŠ(�u&†V8…CœIëvÏiEly[кS~•ÍËðÔIål�Q6N iO?§™ Flxtg·«FQH Rש)Ÿ!Ÿx2J«!~Oä­š.0� z!OËgC¥1G(ð ã~}ùÚýý Sr…Léä–Æ.éq/:…Â?QLip0EÆñú-çv¿%Í¥®S½KÉè%3l†Ïö”8Ô}®-Áš :w À¥Ûá'_ qåÖ¥ƒŒm ô„ õ±£”Ó£ Ï­­#ÉËùÓ` ÙÙS¿œêó‰´�8%NŒ38fÂaæ²ÝÜ=h›ÔÒ¹×…Déù�|Ýz¤r¥‰Äš˜˜ýWk?C.DEò”~"@nñAV^v6‰¾»Aàyó_Ýt)JÌäÞaÇÌjD> |dˆa5(ÒGjÀY°YÁ+¼Þ–3,Ã) ×”ó²ðK·+ßg{GÛä�Ó.ÜRŠõ�¼ñ š×+Öõ ã§ý7I˘qΩñÞ¥±\Û�ã».Þõ&ElÞYž¶~§�„ùÊF$g£©‰œæ¾úu<¥Â �&�ú}XcÎ9ßgô�ž&³N|$]—Œ Ć–JRb‹õ*äZa r(?±4ÕìLgjž6tõf삌¢ˆT¿G·_}.0Ù�ìÅép,•ãU–¦B£m‹5:eÅÆ;H?°^Iû|RsyéœeÊÄۛќÀÑ�×㲑äÌæ‹K°¤“ñ¿ýÉ DŠ¡u�e[B®7®‹.8KZ§‘´5 c²Cä2I]XÒ'Eò(x±{C½ë‡ÊÇra·F“,Êm„m¯ýÊ’þ5г†+Aà{¢>X9¯z%�ùCé×” 0ÈÐd�6s¥üëÐäëm¶Êf´‰2¯´ë„‡ªsš'­N”(|H0ꛊBÍ48”§Õšè�x…ÖÈ‹^ß"äÊK–á}9“‚.lH)Jšp‹ðIÌ&4\︧‡åÝòÓeYs€ˆá¬˜`ªìöQ“övcûÔÎöMõÓ“…|ÀÖG{ÒµQ¬qï÷Óç|ëëšÖ±NG9©î 3)»Ê<;»1šÅ{»ÃJ%‡¹c½4j>PC*6qs^I8:ACýµ“�…<<;¾š½–…bœ9ÊUá–ÙÙGÂB­_›ô>еõƒ¨!•U }Xà@;3O°c8¢dÃ,jž©<öD·h5äq>þ†D��xòÌÛùÍ&$¿­â Eë¯äÎŽ­rh/f¶¾%º ù!ç4}>¾“ßYÏoßÀ –±�"àWN/Þfègß²Dhc”8€� „x;Áè- G_;W/Öy”¥�;—¤m\NXØx'½:…Õ<|îTåL w×®µR€¶N¢Àa’T€×5("àXÁ(bßE\Ì®¯\ËæèYt=mv8}óXð'0Ɔ]xq‚C((ÌT�·—x° G]Ö‰Àj�ÖŽuu©Êú“œAÊ:"‹|¯±&¼}û -•^ËžU0²Á!Éðsewó�­‹¬;Œ2éÒó‰ÈŠxédûÀÅŠ«tü%›=Wä‡�‚6œ©·È�(ÛÝ×!ÏÉ\dPDÔÚƒ$B^Z&Xbê>Y‘ø&Íåן…Ôóã嘉Z Y$ õI’O`8ãQ»w^M$.Žj ý½·ÝžñLô/éÛW<æ×'Êv½�›¥í™_«”/7—ÓÆ‰�‡ý¾Ž‰à³Ï\§}ôÄ$lÚ“›ì¯„u^µ¨˜Ý:¿zßdbíÔU R`†‚”>lå"5=ç p$Òöÿ:å¥ÿzábÒO{À"Q-W.£¼õß(E�³|g)y c•»¸i+‡ì§S�ƒ8WÓ°ÈBwÇûÝž†ˆÁ L$<±nÖü“x‹7�ûÓ„Å@®x­gSBù½uÖ;ì’Ñ–º}ÂB&UŠ}ìxFÀèPa 'ù›Õ²ŠnL0à \_n]ó`,/B‹M!âÑË(ë;¤i­g3NÅâ0|¶J¸#»é©žG¸Çt¤úá�ÜÁïY¹ž ýHÂr9º«}ÃC1óF Ùµ�;€ñ;¤Àå‹«´s\~­™šìñün7)†Á4 ~ÎHL|Ÿ¸*(ëëMâʺ£ T+@‹£$�×aÓ sÛrjƒËß5Ø3€¦oV_€Ü}&>ïŸÝ6®°â({f)ꘄÛÅO*åî'p`zNZh‘Km�Öì ¡åöþ�j^“{ÛIké÷Ù ’%ÎdŸíÞ¦îL‡=Tƒ±tBd³ä?§Ð>>ÎZ>XñžÔ�¹1ÊÒ{Áž™Ø¯å‘/„¦"ÜÎÝ64ºÌ]»©aÍÇmLÝ7C©¯YVMÀ©½¶Ýî \&·5éêñrÅ£Œ¸¼hø*5œ_ÁIÌÇÊQœvÔh°šBg'¥!*²Ââ)ñÈ’ÐÓ¸/Eù»{Öu=ÝIEr“¹…v½ÀÅÐ¤é Ž¿Ïã`îcsµ´eN÷ðé½ç‚òœ0ÍC—'äPÙÍf›¥žY¡8�Xã(XLš7þš°ÈOGtÙÇÁv8R)È—Ê“FŸÂ¥K½Î›*+W…[ä\¦-X2m±ÈÛ™ãwÑÖzy‰Âb<É¡§¹ŸLå€ÿÇÛ‚”�½$ êÍrI×$¬¨ïÓù.ŸÙ!]Kâ‰çËœ@$Á…í‘q«ð,Ø,Ë2tajë+ÚêË™à¤�þ»µZJ¸Rµêù7�Ep×ó«WdµÚÚº<¶u:{C «œžåÒz©� hÉ/‡™7mùk"™�ÉJVäMõ³[Æ(¶¬iÑïÞþè÷Ãi‘í#Ønfê}·&dÁ¾Ú±M:GÁCi ¾|ÈÕu¢ 7ò¯Ëþæœ'BØ`¾ùŒîÿ~ƒûlVN°š}o.ºr ðCÿo‡æÿ|� O?àðªÏ7G]” ÞÒ6®3ü fy²Ä ‰ÇîS‰%iÿãοhÙÿK>¦ù3ØE3lNˆQ¾‹XjR pOéO¦£„*¢óÒä|4™ú„ ‚?äd%àhóƒ¸ÃU›ž¼½mI Rewµü£uÄý^â`ÞlgΊ〠û¢>oÒ5—8¢æŽO¸(a(ÒiÄÛ.ÅÂz“ÿ4¤i´W)\žý>F®–H:“ªƒL®‹¢†—›§®Ã¨©(ý¦ij«²+Ù^~`"AyÕrÛ'ôvgh‰EΙøPG0ZC q]â' àažAqôÓkSž{~„©¹ ëÒGxˆƒã«Nï©ó„¡ÓÈüð¬Õ–àve ý%2­çw·U#1MT�&%.ňQ_1L{Ô�­Py¿yJ“wÛKÅÝîý÷Žeõ8!_k[§ÊF‡7…òÎ¥ÂeM³n9É}Rk@Äu0!�ê·˜°CCù»�Žð3Öä)æ¢Ý Ë]TÑíÙþ’WJÊœrÉD¶e ë¸a±L¦vŽ£Òâ¢Ø+ �x±¾ÀµÔ‘zP½¬×ù ‚q¡Ñ¨Í! ØÙ/ÏeîBÄ5×ÍlBø8‹HÊö \ǽ©ËR¬ �l%#Q$TþÒûEŠ•×j¡!¿Aä$ç»­œµ™ÃÞo�jh‡' ²hûújºôk–.Óú«PMf8ìï«Çò!Ž� u �×9�÷˜—'ÄæÄB·zq-ûËÜìÜæ™ŸW¥ëµ[ÆgПÃñnCÆ«�›èÅ/óA¬ ¨x$87t#MÒËK2y)8ìYN¶mžºjP–¡o¯Æü0ë› Þ„:�C†ôêfÏÁoK˜î&ïÝ, Ÿd9¯zŲvá¾Þ÷‰*½—,âIØ2m!f¸hZÔû³;²†\ñ°–Eehf±êfó[Žœ9ÔAîžëÞ<7QI’8ØMXÏH<Ï<  Ù¦}ñCYÒhG½¥Ï5k� HöX��³`±,`=– ̱~ümHÖ Ð…Pz£ºâ&‹Ð¸FÁ(ðZÏ÷Hqëû3T¬#’ñ‹¿É…¦tå›ÑJK$éhÜ¡ƒÏsõÎËy«ŸéBÝ«n²&KÖ.j¹s«ôxüõöMC¥ æ!pOj×.?߃£@!U‘dc½æ±òÔï½1´ŽãE@¼,7§^ÚfÒr ÃÂøH‚D 'ĆÀ²"øqÜÌÊìN91ƒ¡Ìù-5ê»/ññÄ áiÌÙÉ$£ýŒÇt|�…Ê©qDT£H_Ô© ç’G Γà·ÙësÑt“B)~÷¾°ÚÒ�³!z¿ºÅ¬Qty­Ý«Ä¯9¡-Q/- ¹+·5Œ˜íbÞò�äyÁ|:Ð`-´kïR�E7× DÏr^–ºQçb¬B7„qÚ(€ý·vÒì ãœ)3æÍÊóS)¤+�-Ç�F¢É·�b6xýšm¶Ð3D»\_§ÁdYå€×Öm¢ýM�Ÿ¤±ÿït R6*�c·¥õ*}aJÍŠÜ?ÉØ’I/3ÿ4¯à�«®6XÂcûuÒUŒ’‚o˜±©ùÚ;z{^ø¨;à-ïÏWÐÙѶ¶×˜Å™ÇæW‘Ÿ@,K¶þÝÚjðMûJ2³òL<± “…&µ°R1Ôà4­»§XÃa"©¦�¥‘•hÖÔ!apã9ÇWˆN6gë¼Ñb›a•¸MB¨ú!éº�x"]$ÖX땹LÌ2 ”:éY…ôK�¢‰íX³®T®N#ëgk©Êd�!È”�C¨g4³òIÍ]8l¼5&gL¨äã+Bmš/Xú¤¢Ž¶‡¬å¯ÚBxË)-;E=¶JHN›2ºîz›®{bj§ ¸r(N«¡•ˆt&TLä xSÆý0Ê”¢ýU’Iù‘ÓGG„t~ZYúìÙM!àùö(%[�—ŽÅ¡gð§txç‹|¨^üG~À?¼¼5ù ߯*ÖÈO^ü¢Û¤yž‹ÐyÜ[8õò›ÇÂ^9•ʼ¶YÆòÕ€µ„“&ÎÖŒ× 6hÑÏ#l ,L@@–' ™ùÄ,ã>àè¯-ý•±Ërñ� [y'r÷hO1·h jˆ‰†cqS¡g»ª‘yø+Téú^�O¿PóuðZÑ›ç}oàÞÈ8õ–VhÕnÓ¼ÕKN] ðîõÔÚ÷¡IWáÒ’ƒ¯~Öôjٜц(ö=:/‰ó™³J&€>ð3й†åq^sz»ù‚ ¸’buà:äAeråý«ŽgÍùæäå;ç:Õ/-I<ï×ã/ïsëÉI4’ó§ÏM ‡Ë@N­tψƲpßá4 y=Wâl'I¡iµ‘a"�ÿ —H#ò'9Ý1nÎ%§¤áX?—’ë¿?eþ¬}ÝÓ}yÙ€ÈwÇÈå‹y/wKçe`ëÂâ)� ¹m²¸’‚"Q¯nzGÎ¥�´_×ÙŠMhš$žvØ m«ÏR%��8°Ç_Ìn…Å­Ç%�¢wâz—Ò™!T™Õ�„šÇãŸFܱ¡¡öÑ×_ز dÈ~ž÷:äÐt¸ø0XõóøµÈã£|†lœþþ¼ë¢×Uà^Ý3äæ++]óÍoš~§T¾ˆû”šÙc`0-Ê.qV3ù<õ(id¤�Å¢A±C�äh¨õÿ]ŽDy€æà/eÅô�U·Žg9wzÀ9’ékšïâÛ¸R¸bËyêêZiä<#ñ4 ]ôRýêÖéÈ¢³Ý$ ˜s†$ô, ­Õ?¡ª�žs¯ëe gtÕ¼Ÿ<5ùú¹a4‹õU†AÑéoj™Ãñh2ê«${ô»â:ESd©z§dÏ6ÏÉOÜ~¯xž͉ ± ¡à”BŸ¿äÒ�ïõ½¡‘Ç ß8óüè; ü~ã][“«â6)á�­ Ü<Ûô5“VƒÊFb¥]ÝqìÒ}Ú\BÚ:B®ÚõfêZì­ðé¿ðQiêqá %p3ß$Älý\  MMãí­$Ê–_š'‚syCØ”M¼GzèŽý·R2ÏûcL‚G_èÃDjâµéDIcuÙÜÆƒ�ìü½¡w–VóÊvÕÍÐ×pµHó§´ÇÞH1 Rìû§Ä‘i•ªt‘Ö°¹¬jj@>§R€j\UyùÔ<–SDà–L…ï«j[µ!?~¨ðB¼£5†Ï¶kÙŠêM¨ªàâÖø§¦nõ‡• ‘îµ,jÊW³ ßÏÌz± *ü¹ÝàGÜ,ÃH…9ÊüæÖ'†Ý‰½Ö¶Êô”x�¦õ©Ð€³{äázjG ËYÉØÇ'ùSèä#מ€(,ÝÛƒT|̽׿3N?Øx¦o%íîk¼ìÛ$e“’¢õ)3.Ç褼ûd÷¹.í[¯Q±?"ð¸„îësc‰ ‹»xþœŽnç7ˆfú*[�›A`�¤±„#N IHLŠS²ã±°#ws�ÝÀê¾5*ü›‘º#­ˆµÅT²W�êÎS]¨…ôcó“Fæ# #6r–)”ðÓÂ$f‹6È ˆ�˜£ñÞœJk’¼u¤þG›f*PÏ&VV#ò I{�-èØqƒXKd–’‹D[¡±ŽÛ‚¦§C€ð~/±œìçx1Áøâ¼ OÖ'h…Èe Ge鈨i¨= ?`×Îû|ˆÔâEH)’Ó¤ŸNÒ&E\M”3–ßÛz;˜íy–ÆÚªáN§óÉÆP�ó&ÔÿÝÒˆÊ'"žBߢ9q;/’áZá X¡Ø3ªôñ±h蓳'6ׯILcbÛ‰:~öE ‰Hˆº¸µŸl’’è¹Ù¹ª)}W~ÆüHsá𳳨œÁñw’ZÒ÷ Ó?i£,ŠÁ.™Ñ‘M9Òiž�›ïÆ•‘Ìvó­¶Òù(Ê“þKÉ-n-Ä:%±L6ü7_&™e¶2 Óµ÷35Y¼ ;šôð*ÉHI‚Ĥ `×y|oPP NÚÉ¿Ê} ã´©©W¹~/¢Úª«DÛ²Ò1D4 ³8 G�¼{æ]‘� β¯Ò䀯#î༻•²ƒµo+üžù_MÏ?þ•XA:Ëg Ixmß…u¨“÷ΔbÎfŠÎ0œcvö è`¦OÛ�l‹Oë~•›µÓÆ_™ì˜0åÐ*[QsÇk–”Øôî#ì˜,|™ÒÇ‘ ëÔü$Æ´A¾ !ŸPÄì ê\@J�ÛÐ"jpV­—’–•ÉŠ7»<-X�@ �'R¢š«�““IòV. 2Tr†ˆ .W}�B\´µ3û‘[œ˜ÌFV·Š¤-:Ã2Tæ¢Ó»ä,ÉbT�£]š'æ‡a^1M¯êÉæ¥UWT ¼Ü캮¸Qr:ž\ø�˜SWÏF’¬âz&Лþ«?>U›%=YÈãTÀ“I¸v:)G÷$4D;E -�Es\ä8|ÉýÜ›@m‹¿W"dWŒ Ý\²¬}Œ«àÅ »D‘–®¿2zJUÕõ›­©aÚœÁâ©Âò!ºÆÉß_$ü�ŽRÅÊé6ÁÁPìÞ8‡ríðõØè Mû7ÇÈ{‡C]Íé[?ÿ’æ�9ŸŸ ¬k7°@6™›@!b1Úú•_¡ï¢XÔy¦Gœ-¤·sûwvåìgʲ“V›É‚£ÆÎ>Ê ÕϺöÚK “4ÓþÿÔ-Y~ÿÈÜ»B%§ÉYÝåéÁ¨ÏŸ¬+â2&×òhâ×6Ã�·^ÜÊ¡Œ›ÂÓ“y‹%7¸NǦÇÐ6<y,ßr1²}kÐÍy7†¾Ëò²{› ÅÑë‘óϧi˜óO×›(¢ÈZØL æ@~ý•»¯[m+þI¼ëF’T­|�#Þ“ÑMKËšó×'þÏ�Rò£¸j&éåÑrhS7, %B˜Ý—ž4¯q( nN#†Î<Z (¹£q7EöšTò¼9NÞÇÔÙÕ®>îši©äTRŽõf£l‘¸fÈ­ ×WŽ“Æñ{»ÀÓ4d;9‡AÀ=�AQí({^á]JѦ÷ÖHÜxrÊsVÜ]üÕ“ŒxíÝÿ ½Åhòˆ‚qÃMÎ¥¨ˆD7‡ÂIŒÉ!£ÛhÉþõ(Ma;v„ú ;>4åѪb•[øn8{Sœ´ˆ4dg°ŒŒ±ú¿~h¸ˆ}µ Ý)ûog©�^4œcQl¶ ëÞšèkÅD¤™gÕ÷»WtÙ]$¥�"çCÔ±}2ò}$YàÙRø¸tFh6íýÇ)¶Ämg§wZ$•éºL=I÷-… H.?šñŽ ­5®Ðü+x+z„ŽBáB�›†ß$ÃôT²œgó¹!h`Á^à ‚Kõ�•ÏÓ…‹•ów{=™Ã65Ãt^`Q“¸¬²sÞ´f‘$•¾±{îLÕã]×p¡?»\bói$ì ²-�‰l»™#¨vÐu<¤[Ö¨ÎÔRÙr ¥%èF%¼«\ ¦Òë4Íuñz3 ì¿ Â@geíq[Æ+Rê8“â�|_joÊÀYšíîz ö“aCw¦Üï ýòÅzÛ',~’œ�¾M�#óv†œÄ³(º»…(ŠËñ¶Õkx?D:*n!ÊW΄ýNíÞ›= ã38QÂÈ<�n/÷GwÆÌ¨æåeƒëÜßcy¤˜l°ÌDçªu\#j)°�Wfõ Ò4ßçÒµ3O {.x:$„)AŒ=úõÏfá¬ïmÔm2”Y¥©lï!Û|â/�Ìæ^ Û:±¬!ºNŽ?ꃛ`Oï7¹»Ç ¹ .teÔ4°ÄÖ»Šu¼ë¢tdàx „YnhQGðÎ�­Þ_𫥟º¿Wy¸ÖÃÝ€´xkqæ`û©íâ,)õc¬ç Þ]SÊÓ–�ïÊÔ�nŽVS£XÄ&‘¿?¿¾1âœòñî¤î óö¯ýDä|ÏðZ<óêhÏM1b g«V2ªô€¸)lÍ84¹£ƒ†Ù‚Â!mõAÐÒX §ªÝ$ L¿½¤�•5MŠûM¸›IRw`ý/i%ð$£”u~Ge)çé¾iJéÑAN7:F Š –±ñ°Þ¢¡¶ØÕó‘ïŵ#ˆ9ø€BÔ’˜½*½_k©‡Âïº"áÏE·çöÊχ$AbëŒ u÷ƒ’�}ãØRù#Ûkhú`ýìš 3—oO­ ÅC%ÉŽæ@=`“`Ñ4yóβØqeOÿô*t ì‚ö�P,I‘�àÄ�÷Þqík¸}‹ìÚ8¢œÒÒR&˜Û¹NÌ™Fɬ%Ù$÷bÝ÷Q¾&- ijî½ck ßËÁûGœbGrèå_5Âbï×°k�œ5åqÖQ¶íoÎbÕ ËÁèL¸‹t/Qqf`šõ,ýÆôE�émñ‘]¼æeßÕÒ<¿áõÀwÈ nØžÚa¶•´S‹=.æ\Uð†+fÛØB» [\¥íüÒºÂn^15µTÕŠTÀU É¯„4JPÒÔBü �gHÄÆ+9Kí—é6ºïU¦±rÜ6µúB£EÔÒù—·|]�Œäó.ÍlÌœ†aêh[-íqʦP’hx²»M«_|bJºö"«S¿‚ÁëÝË|Õªù'[èiñèkGöLûï4ÒàÅ› XyäoÚ¥œ ù[ tÒpÌJIô?Ûý.`+ù8Ÿ6Ôü,EoX³|Äqyç_¯F‡ò•˜PÆ[vÀc3R"ƒ³LæË…zL÷ÝBÿ¢7×f3’ˆô~ñYܬˆ2Pe$ÿp6¬¬P¡à-�µümÑÿ;DV­·ß}¨Ž€¼0ÈCP(éQqiÖEJ!Yà ;86ÕØîñ¢ô”×’BÕððÍ~Cëâ¯#kŸ�7=(+=|Ô[Öº¶Î.lª ç1ªë±ÃΜŠlªÒ~K¥"Úf1°ü:Ú»Š_íá("è<.ÅŒõ+:~”î;Ðäøßx�Ï#çumj£V)�¡µÁ wÕ¬BÎn>:\åí>,Rm;&›YØi‘›MÊ0¨ÞéTÞsß&{8^Úʾñ ¤õˆ! å©ñÐJȬKŒSâ¿dä"Ðý„åfWñ8ª @êøµ�ň´¿dùo©B™ê}àukìýÈ$O$TÄá2�KæV…à“w!LG¥E§9¬†òfˆf§Iæú �ÀÄð墨˜ä±ñªšM™ µC(…ò[k_d—:´›!ߦu˜þiT‹™þÅ­bÏ´R 3?K À0œM{�`»Q7©O´° òPŠOüþwõÿ[ÊÁEäÍÆsí‡Ê…:}/�e=�_¹‘H®�UNÔrîn¥&Äw}TÓüêØ1†ÖNµ–óáQÛœûpi¥ålb(˜�V´I0æ{ñ»;qb’z³¾3P‡HñÄÞÄ"%™ò•ßÓò¾¾_çZàl‰6gÝ«yë¢EÙrP »hØ!7ñ«\ÑÇaŸeÄJKÞ–=³ŽØÕ Y B¨dUss:™è ¸b­Ÿ,”ÔäZo‚øAK|·;‘<å1 '¡-p]e„K”(œ“_?Q¤Óq§~^y]ëBuN¯IN¥�rm¯dž¹†cv·Ç»è»:ØŽÛïdTøso‚G¿ ÖùN.3w3\¾ 䩲�}õ¿\ÍF›×¾¶Ð¼X;[_¢Ñ ¸È`F‹Ú˜t's­�Ì‘§å4ŒÌ;°Çr.âÞ…O¦g?C†l�×ø2I)%}·…0zñ, m~jQk'‘Ä xç|$ù߈œF6És¨ùãöÓ-@¼3¡XgM„«lÐ ðÙ]þÊŒ}ô‰¶û°Ë¥Ëeï°—[%¸Ø_ld¸Ñç÷5`ÕŒ…ÎÃ�ZVˆ  s†ðõº€|2”�`hÆ€"G›:�³ [Tô#ôF«h=†žÿ÷*Á²Û++õ,¹kKE�ÏI-†H©ýíÞÍ<Ê@Ö}ÂÉ )R>G<�¯ê^#ëJ™2!†¯b¬(]’5X=']ö/·¯ î,”ÈîkÇ#ÁIo!^‡––�nσ", eGûA�øŽp<™õ3\Êbúö¢ C§ZÚâDˆI³+ãŽblý±0.JšíVc9¦­|ÿ!`¾·ûWÇŒeEUû¦Yö ‡DÕ?‘K/ꛄ #�)åè¸TÊY�ô¬e‰#ìd/uÇ'â~ù6ÿªyTÖâbH>ƒ4,¢Ê^îïª7‰÷°ŒÆá?Ú%†‡lÒüÌð?èÞo8zT�y¯a–Ôõ·%ßæCµwØ Ð�T”¾ÏØ÷gVͪO.CÅN3Câì¼URáº%¶‚ðWåJܘ½“jºÉ"-¢®¶* •„Z™ò<äèËÑU£Vž°qwT”°ê7;x›ÚRvk#^âqSaA)ʵ¸}˜°Î1R×ëjײyIȦÓMç†üÏÔD"ú  ÷=æõßU‡ `O†¾–cÖ’„gK+ÜC!~6(KqtÔŽØç©£œXU€«Ävv¬µø‚#Än#¬Š\—²‘íWY|Ë8ÑXeU P?�Zæ�cÌ^F%ªg"çÈo…¼cj—ª¸ì%3� E‘Ê;Ѧ1ÉšIÑ)I—ê¦ñeK²¡ŒçÆâðÀÆ|&ñ^^ždÁ±ë-PÐ`DL"»{ÐØø;r�JöSK2rÛœÌL(a s±@eFü˕Ӥ²¨[ß*-bhÚ-‰í^ÝÌG@óÞ§®Ñ3§#?­4ÉtɹÁ‡1ŒB+Óz3F1Õ¶8µOЩ�8ëÞbãŒìKiÁI]4G+Ùxç¯ÛO×3‡ü,(W#(GÌ3¹ÿo›<‡ã¿îSms�,\³@1@Ú?]-R˜Œº õw`}=±ë-5�m3Æ0ÜlYÊÜKÙLAücÍÌ~U®;†Z›Ù[ū޲0/› âX´`5ÇbYÝF8}ëS�åa¾�\{ÂŽ )7�S5¸^§›qÑí&®p$ÍÖâ9 §RعÙókбF„ɯÿ4öW¯a0®Sƒ�h„/Œ«‰€6¸A$ øJM*`áZÍßoŽâKQ,&6KËXLñßÈE¦flÄ ÷°\- ð¹[ÚWpx“;RŽ%­)0  ¾pâ%½6ÀÎmüúÄΛVôšWW²Â¦Æ÷ü0!¬"H™‘ôÒñ†Îàâ™�³�ñÃï¤Üƒl½ÎNGμæÁiR`�‘ŽÙʶŸCˆ²¦¿+¶¦?MÑþÇMš|+*=êz5Ð.î"a¦³R6–ÊËqQ\;ð›´c¡Ö”[&²]2â„ � ÚÑ23akÀ·€´fsóïÓb¼úo€¥>2é9ÑFoâ�Y+ûV:ìpâ¨ÂSU± Ø^°òÐúÀ碖3½˜¦PUª[faÕgÚ¾M�ƒLä€{ÿ“Ô9/›l�Ý̵ìàN†“•ðu@ÕÆ8á$ìlмB2ãV¯ §î[Ã!<¾„OW|4#ÉÚ‚é_4 2¾+÷3_Èø›÷1êoZT#ñã0aþ§ts„ÁA¡*ÿÄuîA˜â)³±‡J1ãñi-]a^¦ël¬p½Åל0��dz (?Ê»/nB-»�…Íôß^5O,Ø)èZúFwN�¤üX-¥Ž‚a±‘¦´%”M9™ôßeÀÀ…ìØ !ÖWŽ'0…ƱkNewP9¹¥²â”üH[ûú«ÚÆÎö‹Øñ�S@‹»))²÷¥§C5�S6OH”c×ÜÔn±ùf1šÚ ÔÊVüßµ*ʓ۟Ž£Âíþÿù‚ŒòmLÑb! "ñSÇŠPØ!Ï£ŽzÏl^Nje_{Bé +´·’aáÅäóVwIŽ qâ³Y‚߯Øs+Gªw2Wâö9Q8¸�0-æ_X£ó² ݇È#v÷Ñ1rÎLÿµ—ÀÉï_`l³ö7â ÓÌÐ;ã÷®¯â2¡YMí D°& vjÒ¥!ÐnçFªÉd2¯™ƒŸ Eϼ!`ÎãI»õžz´ùFþ2q58]½¢ �RÑgLЃCÀÌ- ½¥€-Bø¹š÷Û'Ëê¯ûŒ(`Å1UîŽ"ÒŠò„ñB)¯Šâ@&’*¹±u¡¥·XžÓãxŽ0Æ*S�ß]}+ìôhëMgùgÝÊîÃ8›H,q¯`X„Uy¢A‚¢î¸lü§:Pæ$49æ•k\Ú+F¢ƒ‡ªxTb´<ãȼ•ˆ¡6ÂÉTî7‚ɾVE ¢.V��‹D«oºãRÏ×vÂ<&¸Q„'Éã±ÎtÓçÏÆ²øNÏfXGÅÀEËw÷ÂU­úÎwÏ>»Éd9pÍ$å~ïø$·JÈ2Å·g§ßÃ%ÃáÛ˜�.º˜:JÌ—«' €N;%Sp7eº•.?Çh­‘&N»å»û‘Ïϱ…ë,î¢S[9¸XdHf<ÍúŠÌÙO€Mˆ™6#ÝëßÁ¢ç‹áõ@«�ˆû?�TVd/¦¢×ÿ{©õ±$v†ÍÚã\w¯m|’æåï&' J]”ôaÞdcWÒþŸçÿç�‰ÎÞ.†kÌéä”z©ûäL~Zâ1Z]‹ �ËÊk‚ÃÞDo ÓFÌçXCÝŸ?´I´J°Î][Ñ7S*›å¾/³–° ¨òÄeuþ huÿ•ÚÜ%Þ-ÿæ#›UwTR>ä´¯,µ‹Zm禀¯µÑyo�cJñ+àºÉôlE¹ùM­¬uMPøp·¶Êf¥plš-ó{0·8Îþ×TiĘ¢œ‰š›¹zëØ}ì»\ŠV–¿¥9h�z$NµŒ™ì�0÷]V>Ó9ÎêÆvg¶S®·ÝsɤF¥Ž+䀄Ä7Ãùt×'‘N{0ew—©¶‚åÁ �Šae_ÿY�eð´£ôóÉœØk‡]í| énq›�ÂjQÀ´£§’ëO…ÛÊþT³(ëL‹Ÿ¥µɇ‘À3Ñt†È‚S un©âþ}wÅ¢d®äûæÎ9Å[Ý¢2c »)©¾îÑgãŠELzï(‘àbegMSŸžš¾tBJîb ?–X™œIQ  ƒ[œ}(®…ùEc­=þx=èUŽ�ÏR5ò?`�_ÃP1Ûéù9o]‹9¿Ý¥.™ì¹$À¿¸Ë…›q“¨00Ò�¡î>²Ÿ?óѹ cnk[ÅêA+¢®AôÀÆ3”|°žXøÜûºB5쵟˜áuãNçg}á²Óí önC”Ò{¨,‹‹î–‚j”ÂÈÁ LO[3<Ûÿë2 ©½UïÙ#9…!£htx¨£\2(Þx­ÌJ…Êö8�ƒ›�¯M©T•çre&Âö+àtD©(�ú&b(ÜØ…{t œ¥©�†�U0ñ?XPS„HëÊpÐA‰�ïÙ4Ly Žþ9&¤Òàä˜öÉ�C)T<–×|„ìê/–?d²õÃr›æ×’<|G«6ÄnXT ‹ R¹ãCcù¦@ïI6óÚÖºýTZ]缋#aVžÐVñ˜ ÕÌ<‚Ù0¸Be‰¬ðÍ€2{½(¥Nl§éPh¦r‰�>rËóµhÂÓSRAyST÷ÿƒ>Dƒ1õó@=· ¼~ðµž@)ÿRJÛŒõBÙ^ãJ·iÄšH^\îG[i-ߎ¤ �»ÈI�ƒþêîFÌÂc…“Þ …ôƒe„#‰ÕN".!%Xbè °‘1ä’$­Gøæ �|4ø �úpª +ø�í,ºü@­"La»FØE\ꦫ�bEáɇQ>’Û)Š„ž¬•¶>žßm–`Þy,ÒÉW>ô»5%l»Îh‘†LËXÀ¹—ų�8ô*Ý¥š5“ò‚7¸Å‹çÆ”i0ƒØKQjFØõQ÷ º �{€†á�ÂÇÙØö[dTDUcS7[ŽÔ(4v‡¿We'W%Tíf�ÒQ篧 ÔE&¡ð‰DØ®aÓÛ܈¬õW¯›Š¼¬QØ.HÍöíÍŸ=ìTBðà(Ég]86‡¡9_�|'{¼«– È�¥ˆîνž!÷»:­|›ÆÉø,“"fb‡5GÔã 3¯W[$í׳I>o)^bqÓéX‘¼˜ð¤Ù/{[þ°×“Žbý£ØØÆ¾ä_êT€°9kÝÊ3àÎ×\Dð6{´ê�;ÖI‹);Å)?ù WSWÙw¥>!=’â0Ö€›×*îÇoä´‡'¦Z¥é£*®œ>óñ-ùu4 ©ÖC @19ž»�\†{šš A ßÖÉ}˜ ÖØL›,¶k(o0ï’_a?•¢ œ«YÝDŒ—u––† ù*mg¯¸óñ„ÓîØ&*X«v×pJˆۄ ×Ê€í ú9]pKS�…º4›bd8“ƒ¦X Û³£×šê•vH¿ˆ07´èoê%¾~>“ù‹žKÆÏtí¼ŽoÅÁp Å•ëK.à+Žý©ˆ±£G2N „¹åwwsR…Þ$rãtƬQiUrÛ•Xbž˜Ø0exS>8Å^& \d¹V;ˆ·‘j0aB‚@êmšºEâóQN•gÍÛf ÝûÚ£w:Ä*G®=™àŸKê�~¦þáQÞ‹R©ת8¼eÚrk0;r( áÿƒs�B¡\› êœj‡zÅ_¤Œ…$·ìH1Õ #ÔQ²è<Ëz½…ëÊ æZƒü6ÿôŠH)ocq„B੽ƒš)¯O±·°æež°ÝŠ?¤£ŽÁpêHï…­Œ�D¤c+ÉÖôq�4sÏ^vì·pÂ�Þý•÷ê n\á~—­å`€Tkp\?7CšnKxÞ©…=µÚý"îÓˉ,5™Š&³X`\„IÇkÕöé„=š²&ám3ë²ô(gxþóÌM°çÏ„f®ï‚¼ycð«³ÉÞãë-ZH±skÔ&7Såén~ÐZ™nÚ‡%ˆ�îRGÖ¡¡Í€+S§C‚KÚ[®- °xVÀè“yôÀ)§ÌH–sïi’{g¡qý[-ýÆ]íмtOÞÃ:dªèäÜÔ]ýèóô]M °!,+…ÏcÄ6Ø.qû_6qݰÉîY•¼X÷ì�p à�`~–ç'÷.Äåº=àÆ/¨3gÚš5€§ÿP0í�Û¢-é`–ÌIÜ[©ùLÄŸµÝcN}¨e¼-ÂûÒDa ƒ€È/~8¡>)å»O”Õ<à xÉasB�èc‰hÙ@›MØB/ÉFµ†~ vZh#y‡©v“™˜ÐwIú\øåw®�€ê_Rªz‘p„óÚ��K ¯*ª± Ú: ÍWàq4ºRz?½‰&"ÄBMOÜÍf-ìf 1ô42º76•éH=‚Z1-¬Ã\Öh¿•èŽW}tm�aªUÇ¥6gª­àŠhбŠèo†�'9ÙÃGÓDãÎ`è8øhJ äÔIç%Ä 1^:†ýŽvý$¼¸]“Áj+ª¶Øà[>NQH¨¯§Äº”±yŽ-Äb3f^îm¨›£ªÃMÚ¶¶[€Ì NÛvòaáÐoÆ–WêãRÄŒËæ&©¥©„(FAƒ‚µr»—}!(Œ¨/�CH£Hì­ªòbÙ^RUoIŽTFÖ—DX1ÎÆ6@‹p¤�kîe/8«:S8òÌ™7�bõ­JQ8ï~†kØ,ïÌ~9̽q%0Ðæ3tšköXn2�«# ;è9N:¹à8°Òd]øo³VÝÀi<¬éùɈ0·…¥°v*uö�éÀÉ÷»Ȉ�£7G´Àž÷b&Ôí…ªöÃx~âRš¦©=J9…7Åýe¥µUœÊÜQ”]¡¨ÌŽ©ÉÉÉEÿµ7ÃÎ00Ll¼©ž‰/‹À�½øƒj Wê£=IÐðW¼„0ẈRwH˜ÞÏóÊ?À¡Ú’QÓ˜ÌEýu4ha&ô†Õu£oÈÛ;ª2HtPs†¥ý0¨ÍÚÍ0ùÞŸí'<(µ• Ò* ‚™4™ºÿþ -GXhˆe£»M%3}Îf¡Ë+–»ï¿¼qJ›“õÆNØ/|炌A­Ý¼Ùs¶ý½hÈš-Hpa~m\¸Ê;�kÁ;�2Χƒ~M›½"丑k‰9‡õ±I|‡‰B¿^Ï Ô¾ÖRïËß|Ž‹� '$IŽàáÉ÷D3§�¥¯Ê ‘žl¸ì¦Æ7M3^nChúg° ÔÐ vÏ,¥¶…Óó†Ž�‡ ÈnIÃTδ +ƒ˜Òklç#ú¬A µI*¸�ŸÇÿÝ›¡âÝÞã©2oÃ.¦úñ¾,âǰtã…þ †6ªeE êZ OaÀOAtŽ«‚±×ó�•h¡£>ûxAæH_æHÓpfºÆÚ �Ì?Ö6†1£µ! 2±e³á�(ß–Ü#Aغ¡S"öÉaû‚ƒÈµö”ß…ýC´qØ 4L:ë¤ÏéÉS]ˆoj ù2š_ß—¸AüH’X›iZàüŠS0iD=Áû€ª§õ’¶Eg÷YØVÒ=• |¢MÎú_µ®xUíëè*•¥¹Y‰Ï#É9_ß%¶ úcB�ó¸lÎc_‚š#ÈP×g,;ù´¢]�`¤Æ<ô7C@É"/½Ë¯j?÷ØÃ)åæßdvv<ÞL\©ö¸Ô�™ˆÈ°¿|aZÔ둸dbk¤,¾äïáTˆ¯’гŒ VT†°Ûž/©ÂòIΜS9Q9ÚH?t™§\>¸¡^Xx™©X/è6àMÔQء耡Îu�Ž2e>üèr±þc×á‰Í…š¯\]EÂäâð”�µ $#FsÚÔzºI<“lŽ´ €æ*é¢×/;n0W¾p†¡Ó\ŸÞç>À?C^>¶ p`26ìBXQÄ2?Êz&6+Ô׬tëøný6ûkÉRЫO îï œ!ã7JÐ(æB/YoÀ¹E£žLI‰¼[F<~Ñ]w'+óÖ\4ðꑃӬúLÁp#½�¦4ú?5óëØQ‰¸OÕ¸çËÆbå—¤ �\ʶ2�„:¤åM¸�ƒI›ŸŽ;ƒžR=úNVÆýüu"î#_>÷�}n0åð¦Ê;âˆG¼–rCxD# œFÃõ¤!]20�;ålÜØ»€«{­þÖðŒ%@>¯ŽJe’��„U¹ 7ê’+î*.iÎÊi˜MN�ˆæ'ŠáVÚ�iöÁdjjà�q­a|^ùBK®€‹W‡6%""y7g!ŸZØ E‰d:óÇB×R++Þ,=8׫´z‘Ü™/–¢ÈµMaÅŽm cGÝ~Rîbß‚© °¿Bð†¶T q@¿§)9{( î›ì:Vé»#še[|^¦Ü›s]sø›Ã5 ÿù±³Õ’˜IïÑÅñ˜FZÝ%:Ê)a¢ �ý QÀ.fÍ0c grä@õ1&ç]Â�Ä}A•h“,ô‡jóÓwñpËW¬Uåc”ˆ±¨WiýÙFò$qq Bv ÛTÈù��CE(Q°'kÓÜÒMi«`/§�&ùìöF[.O"Ì÷á(t ™ð„ìà²ë¸ ¢xï%ÜHô\FøÔÒñgO¦CbD$rR|sl3Ê·ô@_±Pƒß}Þ&™‡³ì?Epy["#ÐÆo¸6±ºj±£¦lF‰5ާ%ŽÃ“œ™Ô(µº¨]§8ƒ]&ý<óàH¥<Dñ¤=.·<££ÎïoC77ÏI;AL?J ô¼ãOÕRÆÊ�;Äß½&°A?c}1�û|^<Î8Z÷Y )\�yÙ%Æ&û)dÓ®ãÀø ñŽB°ühšúÌNrq|û;Vñû=öµÏù}´Ïm@χoZ­°¡«ƒl§T=ÍÛ¨ÝÝWMÕ‹vzbj„Èö®UDÊ6×ïO tP:`j§ûºÁHÁŽ a#%£|žÐq­u�cìftå›»ý™±ðxr ²'ïT3âõÀìg¯Ëº¡º@ß!ÜRYÿ†è¾ô: ÑÊÈ#‰ Þzv8Hyƒçµç�.“Sƒ¥qc+¤I—=�6zõ†›ÂI³»òÿ'ípN/‚NÚÇÀ¡˜äÌÙÈ[ÛDÆ)í®‡Ä©¸!´é�M‘G<ɌкqŽôoÉeÀÖC|“º1ÌF¥§¶Cr}ݽM2ª-ô–¯F��ÝgÚ‹�âÇ¢‹Oü¤¤c±…­þ4‘tûTZ¾Ù´ò)GÄH Òyßµîül…ùNþJ5ÞZfwõB~âN¤ÛVN~®Æb¶|úÔÎqO!툽¥V3YµMbÿAÖL$ÎmÓ©K’)Œ0HQ\Ðà<æ<¡èq†÷Ÿ¥÷¤›’!ûÙ’×eÛ+Âj³e}”Á€÷Æx‹xÝš€§ûç à%5´…ãºîH©œ¬XPšbÞÅa-fmB)“¸wý+¦ÉÎqMä?$C �ý4ç´3èmPI¼¦¥žšÏ­…'­ã Žy¦R„©‚d¨2k$�ž?æLî½ ï,�8%ioÉ€Û… º@!È‹Ý T÷¹²rV¥¬cRu+? &£_>»R­]Â1âW v”Ë[ÿªÕžÜPC{06ö�Z*ÿ!šFãÍô/…—”‡�×�ã8‹(®–„@$H�‘£R:~ p´Ô € ûbGt>[‹~±BÏK÷ú‰h„š»‰? ñùi-E�NÐ È��VCxžKT[Þ4(L¦iC´zI]1–ÌÅåûñT!ϽÛÜŠÑ=çñ*ë€Ï wã�ïÚ4ÈØ®û¿WcëlÀ/@Õ¤+Œ�03ø}…‡e0Ù’(Leì¤N 7鲺=—‡>’wqÓlü.ìBk[ÿËüµ©ÏºÃ� 0é}©@(�KÞS_µüMg¿cUSqªßº”<)8[Ùý&? Sˆ9»ž,lk°'È¿ÇPg2ëkGãy!øXáè8R~ºû °…šòʘ$x=ÜóD6×›Ó¡û[ ¼K¥1£¢Rm<Å"²éˆõ.ž}f:j±\® jñcI™€°öÙx´<'þÚHnt4l Éø_ÀrÈ�ăõ%ïû¦ cÃá?%˜µÊŠá@BÉ—ï>cIæù†µ±{¯sÕ1-ÖæÈÍ’4ö‰dH*ojW�ÓázÎþÌ_˜�Ü!˜Æ_–çs]‚:�0€;²^‡‰¬<­9>ræ (©¡Ö˜µ�ÑdIüiŒ7uO" .^ýŒ�S/ȽËßK @€N ®\¯cýi‹Œ¸&·˜y ´W÷)_ª¦¨+¹¸ì„ç=HÝ…9}es‰1˜ý˜tn†Ýì¡L8Ò›Äãs¢nŧ 4h©›e,dv16�˜âIŸ6ê°²{#—ø&o½º5vŽøˆvÑwD*ïBÙŽåI@£å|F•hÑy$`�¢ ¹äµö`9ÿÓÛÃ{s@ªîlàÙ×f$¢ÂtMæa"=“ Ù.»f>ò\h=$-ñVãmÚÝg9·‡TÐV">\ă:OÇLsp9äzT–ñSÖ õ¬{©J–®,³?[{÷‚øŠh=gmsFgx«³�ë@å†Ðù”Y¸˜íÂrÃNòËû ¨§� bàÓûPOÇ€Å<ónsg­÷ÙWõ)ÛŒuïGøÞrŒj¹E¥XîmFŒx/)ÉÑGº4�D¥. ˜­¤ÅÊï}º®É¬ ¦TSB&ÍîÎ @’ïçWU‚í‰ÄD\ûüo‰Qa^þÒtI¯9¼„V_Õ{¥pçÒ¼ˆƒjƼ¤ÍZ6�é÷oï†ÕšëBË8¤µá:á$F’µhJ?Èì¸åmÌ¢�ŒªŒ~Ñ ¨¼ó ‹,î”É5(c É,Á{­â�ò’.rþG Ìç\p�C¼Pæ­-(�ÉlÚ“›‹3ˆSÆ–ÙwyúW׌Z:²ùäTATùÛ]ãmŸt·ßt�£i�¼(S5G³+{š´˜·,'‹gs¦gädpB`–½¯—¸4ž¡øô“ÆÇiiðžYÍ´‚¿TÑ’ÒÊ! •ÿàºÖ²� Lƒ1Õ1??Dzu ®^ì«£ñ³G¨+g›)rë42(^>‚×Ò¥E©w¡U:9ÌÅ0‡Wû�Â5ùÍ>�[c ¾úóPÆœè‚âÒý"¢š¢Ø _Ó¥Û>n¦%aûaŠB™- |£ÈÉ/WïTƒ&…P�”Ædtœ;¥äX3ï›–ÛØ5Ny²¬À@a°$¡Àñ±WGçûÎÏr8øCÒòË'ÏŠüëäppÿµÐRXºÈ}~-�ËD.:÷‡Šô¼¥›ÝÂNÁ‡M‘ÿ ì¹ù+J„s¶cqÞ!zVçYÒÈ%͸ ‹`}ùåodx£¸ñn)TQ|˜ž“ÆQêê;ÊÆCa#M‘ÂÃ4ca]“jsDÓkaÙªÔš¢ ‡An€œ(jpmcŸÈxÒÀ—Ñ 9¼ûyÑŸÇù6„ðé�¨Õå'b:ô¿Ïfž/§š�CžÅ‰àÔêˆ3N ï¸~†¥Ôh²£uvZP—Q?³4Ÿ$D®†K^¼h"m�ßmc5Löö;|*w&Pu|C“ Q�mA�û~1ñ‘5࿳§zì ÑÁ6(ä=L"wÄG-âÊ7oc½¶`E™ó—ŒÞaNÄh±½‘SÞµ*ÌŽѳ4Ùõ’kÇZ”@^Æ|qqÞ[w¡¦_êÙ€0ºá\.D~Ä ;S¤X‚ÉLWœ³{¨a¡`¹AÍ×ìºF"ÊÜH*¥x¢–ÂÐÏhCûßZq5ZxüÆp‡ƒRLÀûˆÀÛ>š|nÀDß 4 ÷çÛûìšÝïH,ÁvŽ›C>·¢e¬ÇQ´õ*ŸÙ"Í®@•dqä,÷=ÜÐÄ9çw-­´ô$8=ïxÜa¥¥¾ð¡kð�ç£<*É:;vw¿Š[t$aíxMÏ»í�>B1꾕õ,�ŒÄr9ìûQí)ê³?Pð“+ýýúòX¦·k‰k’Vc^§Èìü™7k H«A¤X½Dhù‡³aÜ—Þp¸„¹ù2ö©x$¼]â'-¹raTJp)}“¾%ö,çØ�ÙA�u0ç¡7Ud�*¦�ÂòÕV¢÷!mpÖÙ@ô©`ÙòLÜó$ºã+c™¯g| §,^ˆ'ìl~ìï·Ò8óüS°ʾë97¬£n)MŠk•¡-[£jë^ì}Ð2™XC� „Ö¸áL^�˜ó±/6.åHÞÓ í³ñùÖ:^IÏ%¨?ÃÊÄBáµõéaYzH_¨OœÿÏ£ÑB\çÛtÍ×õVEÆá=2~ —œc Ã�Æ�ªû =uí|ÏÒT ¿K¯p?Nâ0—ƒ<|1RªV'åÿ¶NZ±Bññ¬‰5FÀd?Ç…|Þ8W²ž˜¦€ŠŽÛs�\„"=bwƒÚ­zi«ÝIç)4î ,‚Šq!žUûÛg*bΕ5ьةv'%ð¥Ó0¼xØ�¥�´sSæ1«-¸%€:yp·ÇÞ›ˆAà¤æ~'ëÔ¨ª�]ø?W±K™6šC±0þci¯ŸnQᔕ©ÔBÚÓj‰½7HUÑx;ô$êýV(cnÆ�û¨â5›AÊÌI@ë �ád=úh§šé$™²Å�9‡:ÔïÍKÖ%Ÿ’ñ*á¨2º|YN¡¢(9 tøMÙ~t5®M&1û]�Š\(°|£ø�ÀMŸ"ÖÕ…N8ÄÉ—°ÜI©¢òrÞ‡‰gSA¼ç¶òXE¯¬´y%V#ú€w¾Šhí`6ĵ€•9Òeö-Ô•Î߆y<ÇD€ðàÉá…tÛb+¹®žï‰¡}s z±aF=´ÄÅ&=%õ;ÈDog ÿËY˜zøãU•0õXœåˆŒÆ„xdšw$o¨¬D™/㘮òråΊ,y‘L8þÔñ¶/w$D»~›ñAƹ÷rC *ÚÕBãúJ¯² Éà~vžâ°g¼•Ïo¢°÷듟¢�¸›åS\L^´l9ážÄáô¨Œ]XÀUž°IæsW5ã¶'È¥E¢pýyûÁ`ɬÁù­Â*†xXnƒZlV”/ª:]�»¸I Qjúg*¦GøÂkѨ;lÑV÷UÙúʳÉ9ß$6)$0Éuÿ¶ð8»>cìS›ƒä¢9DüK)¾óbh�ºâ�í�ñ±ÍÓÉ ºÛ§Ne”€õ×\ “r(¸‚üKÇtÌ€ñû¦£I¹ºuÍ#]lø r÷MGŒ¡ãX¶““G”ÝЗg*<¦ÿsÁWçü[ÁÏ@ÐQÞ†éoåD(Ùp-=?'¡\Nf3a ®U½ªRŒŒ¼ÒÊÃ�=æjGMÑ/¡qqž8xÄžwý€ûÙæòÝï¤ô�÷áÑeã(¯ãÓ’À�ƒ—B×þ;ÓÇãáI`ä.œIC}ßOÚM²@€ïä¯!\ÐzCmX#Û2_Þé9ÁµÁ4 Ê ñùzÚƒ#+5æÀ׈‰÷“J.~XŽrHa_Ì!Zsò¯"9?sîVŒå‘EH”4ñ´y‹òï'ó}7òÎ ÎÌ^8Éè³®à,tVš-£fQ6–náîuÌåkÓ êšm¹äl¾ï‡Á:tÅ‹ ->†ïË@ÞJʲ¸?"¯ô¥¹:|M˜�œ’ÇßDhq¿ ë=”½]ã¦a^ýxt_ô$²æhúë¦ú•*Zæq [ðàrð3úZBm‹+#Vùn�ñôÌ1¡´ ”Õ—:@VZSTC^—¼B&Ïaø«ðß­p?øó /[Ú<塱  ßð>TN#êQ3"7î°�L•Ï‹í ¤~E‰CP¾ƒa’LCZzó>n�=¼Dv´^&«ã˜J»e‘‡5Ý4¸åTÈ�†ŒÅ7+ S¢ÓKê˜N�*?[³Õ ÊÌc»n�paO"܆§é[VÐaÍõ w5p4 #Ô[Pçãl58±DªØ:z¸“žè˜jLÉàÎIsažOp‹j0•ÐR­~oç#.{y~ǃ*M�òðhCrqøE Ç÷ v “2xJÅX—Òê�thøB9T°ÌŽm@¢/�›EKi²sDú÷Bôq§”È<¦>NŒ‡i» N‘É�‹„Ôêy~äcñî¶�ñê`§úüb¶“Fbü …Ží¿¼@Þ/ú1ü€™Yƒw„%4*Ï«¸¦¤P‰¸ÔNÁ\šà³¿l®©ˆ² oYÇ¡ƒ ;B2Î}´FFÀ˜fÄ�­zj,šD,qÄ„pØ3¯”OIGþØ¥�i墣€¨õ8ºi÷h+ÙPqûÁ0lÛ¤o0è y—æÆ4<¹q v]õ:Þ•0NLÚ‚¬þK’Hò/]›¡í«1ÁS®ˆÆ “=Öva‚êYÑõ@鑿ÛÄû»CðÓŸ|ì•Ñ?ƒ'_ !íš™ôøñ’²ì—æ%<ýí꟫3ÀñàÕî.ÌÞ,Ý…éQt°Ï¡ZcÇ…U«¸ävP'Ÿ¥éA‰w(X÷ü‹¿2X¡äV;°XƒóóQ�;Y¦)r—*W±Ú‰ÒÙÞb2ÜXÖÐ$çÑëêYë>ë0À ~Kv¨m+1’Žá0p%ØÉ_ÏùJ„[JÅd+¢ˆc™+Ð^CYÃw‰—@†Ô�á¤v<­#ñ쥔Êw7ËgîT_”–ðØrq¶E ½ÜL"2 eNR=çÉb÷N·ì›]JT2™ßL­öÎ ÚWMÄÿKž„3~�æ óž…Ä›VD¸aSRfJvè¸ûJ"LJÓTT HWL8s¼;‘½êÌÿÿ’`?WΫm^Ï•ãaÄuЄŽÕì´ô� Ù§³)€DP¸äÅ¡ž)‹½çÕ§ü:¼0õÏ”ùKƒ >,Îr¬øƒ2tü0‡Â¼¼ûia W˜ðFþP htÖÉó²BU”aë²ð&˜™­íȵW –ë,ûË/lCØÖ²mÕŸr6W…rÄ@Å2º¨š�¥¤²†½2‹•‚‰K¾Ej¾7ÓýÁhœßp}êo�_ã°JÌáB�òAGXó²ç åòý¦,•Iû}'`"ŒAy@ýÁ.ëE\a/K³»x¸È‰Øö1Ñ×ojè sv$¹h\âÔ«'ý#Š×‡>üâ"‘œäÑUÖ|†éŒ•¤ÐPÈ™+@z•«�Æ6½ ôWz‚Šßùabi¯»­6áPhÃSž§*{Òö’_ç òöM b.¯uN쇘Ö2@Vnä9s=I=q#ŸÆ*ã[Ð…H,ý×ûß›®|t­‘!Ê4¬_BÄ`[ ÆÏÑ¿<ïvž¾8ÐÌ1(`ûÒÞ«^…¯˜Ô H'qäü–O½}¿)2 $÷Àv-»æ¼ ®?Xaˆ2Ù|'T™¼°(ai¯Å¥¥~`–LΣp/‰$£–*‚6q ¦Át^ý <~éë®-‘©ÖBŒ„x¡æiRž,Ls[Þ‰±îp‚˜²ª¤,]éÇêh"”è+­ì¿ÇÒ»åßK”*’ø¶{eÂ& Þ‰;DùBì�‰Ëm> ͺ¨êcù«â!Ï,c„ñÇ÷ª¸ºV«C1.=ývx0µCU_±è yZàæØ7Ÿ¥AMN²—RºÙd RqèpHI÷ A˜Ó†§„gþÉÿ• ^ ƒZIU É ®”Ò6¬ ¸þÔáÊßèU/ú4g'¨]l'˜ÿ·€mö[¥íWÖnü»@Ö|ž@ºkr!rÁ¬ýìþ ›š H£~ùCªh–UhóÕñWñ/ýÀ/Ê£ yvÃzoU’¾˜|*Œã:ÂZ]I0u‘>\/Ô÷–O+Ÿ}0lÚ›0!ó¸âmXƒúxñ'0ºL‹¼ÑÄñ‰Þîž‚Ø=¡¥ô•}×2"-}0˜¿‘ˆ[÷! ÐijƇ~—²{6û{/놋0<Å蜧R«‚hÑî1òÍ™Òomü‘Á¤A`GHó PiT»]í`ˆ4ì¯M“×—3&7XˆZð³CúH0IŒ†Ì+©wűôsÌ”Fª÷ï�q×(á�¸Pd•ÜŠÍŒHñ`ØØÒ�•«êÖ@3~ÇŒÎxµg䘢!ŒÓk­ß\zUŠöd¹èÛöÆÝ§Èõƒ×–ÔÞL”¥Öõñ[¬í/(P=²X>øI¥sΡ*±–Ù4Ã×ûqûÃAeäT�æ�Ûj…Ém}$£ÅEeÖBDETQü1””ÿLRŠÙϽÿf“ü3ü·fLÆ["p$µë 茳}ÿo¦»õ|9ÆEV‹µÕPŸ˜á¹Ž¾A�ˆš£Ùž(î=üˆ¨ú¨—ks£ïÛÖÜ,ÅýöÁlŃæüCxžxøA:3UŽîÂNCºÓ÷¨‹÷£�r=ýAߥÚRòh ‰®Ñ4yy‰À4Ë”ì8*}U ÑÆõá[•{¤¿/Óô~ðÜk>®xkªÅ•2JésŠ7wOaÖa°f=’ÃxHDÌ¡3 ±Xak¬d•àŽa_9,}¼�³'…Q3ý tf½ÁZºBĤwUj·Ñ� ®OK €Ùe¹ ïSØñÝn(¿ñÚU[µýgO£i‡`$™%¸õnO¡ƒ¿˜{âðá÷èÛë±1bF´Åêy3vÁ±ôm h+1À!V4¯ÆÈ EÛëky¡~K‹?_›"míÅØ%Ö�oj*³ortÅ0Õ…ÍG­oÚJNÇ‚é}>!¿nºjbÚQ}W³±œÀåÏtA±(9ƒë؉pü¡?ƒ>�6 #ÅbÞíÍ¡:Zé¾ÿ˜rI²xb×fÉ'ää@¥›Ü¢ioXúqCïqL²Z=¨t� 6\{3 YÆo{�(nå}î|ð‚Y4FJï:÷�6j¥1²Û�µKW‚H ÀØÒ]Ï ¤>B&ˆRþcÞt0eBpÊAøÉ+°#ÚÓMç–À–m– $¬m¬éC²ÉD ;b‚¦‚qL!£#‚{9œª1Çüj¯Ä35ˆHÁͲøØrxÆd_°ÝAId+|Cj÷ÒùÎ,Ïa­!ºÿÐ)’0�†—ÞçÏ0hW�ö/_¨³ÒwlåëF!Ý *ÇìóÿÊÇ6c=¿¸;Ÿëé{òL("&‘,ÄÌU‹‡·Kg/WSl®]“°ÿš’ãÒlüѬSÅ©iÏò·Sä² ‚ ˜è•Ør>ŒóäÇ ¶@»ÎP•þ‘7Bí• gJµu�ñ~øï�Ë'ýE ­lþÆa�­�~ƒ5S"ÿ@?!èÃHÄt³¡ÜÀ·@´±A§QÄžVu%>P§&ˆF<€à¾Œ\ZáWïkrwûh_w�‹)Pæ:}²l’~FG*¾\'äXª2‰ƒÅgE¦»˜O äàÿŸ¸!B» » {cŽóýu?`œù4�kÁ|ùÀ>ò™>.T8d‡tsãÀ�àC"¢î…+›=ü¯:ÿ¸Ûp¢cI™ëÙ#vá_?©�ö8É�t¢Wª{R—bîx´„xãêÀË!äu¶<Íúß–ãÞÞщjtð¨uR+fÀÿô…3†g·ÃYùëiÒ Y3 ½aøï³þh-¡ð§nu#ÿpŒa–Ÿ eÏsͨìv¹€ÆV,ò‹ÕoæhuT}÷>åîØÅ�±5 �ÂuÙ]œþ,Ñ÷˜¦ƒS²ršO2×`çñX•>Z‹|ß›»gHª!€öìùûXwü«”Òµ1S;Ú>ï„}œBá»ÔßåU¤S®~,ü§)Txb›‡«áp.*Ìs ×Ö9økbdˆpB®nÖ±77‡+M,WO‘8ÌÒõÖq n¤Î@·�-QÆFYÏ‹ÊLs¦¨™½@ØšÁó#[¬‚á_Ááéë‹VÞ(LP$¨ÆMaýëIåº)µG{ÃŽ[ZïW Rû˜·¼myÀ=$¯Ñeºa ¶_2ÆíØÉ§ë£r3ÒÜqQ$Œøš aÀíÙ§*Ë?v:–-R|××AJ·&,¢–,ò�"¥º¸ŠnäÐÒ¦dö„à# ÄÈú’âœÞɳyó“LÝ¢—Ú±~V�Ù)K°[ 2;˜ùfóL>>‹³gV§žDŸx?.ÊUázQËíÁÆ£GÿÈ:¨âÞ¨#;°ußvUu_PÔ IüHfCããñ"IJ#ª¶ÄŒûûœ²Û†@³w+g“¤é<:ø†ZÌŽGÀÊ ™uLÃxºK1ßV�“¸Ãœ|j—\ ^I÷‰ ©¯(î§“Åàý"‡¢ç8ŒÊ(<Ç¥ØOÜ%ÚZxP6`u;žÇ#¾>I±Ïˆc]u= -¿";äóZ“JÒ¬|öN{Èd%•ÇÓç¾®p<-jÍá8ß×î&—áHrªÙ �Ü<¹%wibÄü�.»gº€ïl˜ ÿF€KñÔ¸®�´ãi!™û„MöR ›²ro7±ôøQµt ½ê (¦W-Ò=ÁôÉ#KÑ:~E\Ìù±op¨JDˆ~éôܼ;ª»þ&dÜÞ�\*ÀrÌ™°8÷›Hzð1‡‘Œ™ô<눸ގ þæ\Ütþm[ÏКÛ/ÊÂÆüh—ín³Øí”>"öÀòUõ‡ßJÇÖ}` <]L¼#•ãû¶YKÍz‰7ñh«»™•ªŽþÞ¤�$ša�,;�BoéµÈ »hùù=eç½Qá?½^Bz ߯]µ6žÁ#� 3Ÿõo¿ç‘Õax#0Û/´ÞæÔñeƒB6¼xRójâ ?E£—á, å±·6’'»Fö¸à•º:]È78%{AŸ�ºBîkt½c¦;'×­vÒ½Yd$wjøÕ¦áùðØg^õ¹‚H™F‹n"×f“ï~ŽÏœ/(Q° ^Hóç/:¯ŒŒ(ÖÖ¢tN²³_š% 721„”2ª·áos�r)YÛBD~™õ XƻňùõHýÖ-ô6Ñë¤|~ª Ç²Ø w°‚–ú÷Õ¸à“&³Â¨=|ô_­àqTf¸vþ´ÄŒßÿkþUI¦ú eïx¹Rz"‚»•Ï_Í¡‰f”–óÅÖjLsØ=u `ˆmY»v‰°‚®ÁãÙ[vÄ I„J«ÔIa1Þ�Ã΋SXÎÁ”0Xâ 4zöá™v$cP6]Ú&ÀQÕÜé H•s½pàœ°=˜ÄŽ_§ALž¼¨=Ó}/Gl9(ƒ2ú«aØ= .–Ôô¸ÚšC69¢E-оvÇj´²}æ‡Ù8Qý÷g+ÇmfDH¶1›“‹ÙãØZ.3?ðk;328 Îø?õÊò¼î’ìkFËÝål/Ÿó?ˆ?l̵‘kw5½éy­G߃”­Ô"Sù2®ž�^_¾•}Ìb׊�.$ü~êD˜•\ ÷ÝÊÞ4!¢‹UQ¼Þ^ÿeoð)dúîÌ~QšeM„ »6RSù�ÿÉÆBMª¼ùφxÑ E?ý Šø%½TéP¿�5Çâä–—l(´Š[Ø—GTãgÕ0£_Zì×5KÎ& ·êß!ŠàõôEí.åoÅ_ï»+–¿ÙœS\ ZTsMº? ¿r´èò'Õë»y¨øs´¥…R2½§øÎ°ŒéYÝ“/'jõ“í¹qG« øª¯2wt±�qP¹m¼¸mšó]ÿ.˜1Þ�Ø[»¶LƤ³k_ë·€%) f¤ºG°E7]\™9ÐzPà‰jÇrâ�èfŸï0 ŸÓɨ4v&D¯5ö’pà…à9'PI¹¿�îÖým…íƒ$ð»ôS ð²zN‰òûy€­v¸p̧'Aøùd¼x_FÌ‚fö·ì“¦ODE•`,sõ_²žy�ë]®qÐì3¥þ�‰º,ð’ºÈ¯f‡�ÐÕúH ñÏÚDÇßî³Òѵ+)ø£™ó³;v#`ïyÊ:ºü)3Ñ×4Šý BOTI4€nŽÛ’§Šœî¬éH\Ô—�Ì–<ØF$ÿF|˽ (AZFî½ÂSÙëK'-= hýµ×BÛø¬lˆ�ä’7?úÞ�79«·=gÅ6ЃFùŽö5ìc{œT%�˜±`vPêÀÃ>̽ÑQ¨;Xy¸TnœÂ„ð².TÐpxÓoöU…1l)‰û„>úúVŸVÈ›í͆øÑÅ>zþ{åë–µó³#Éc‘ÞZy[óŽÊÇd‘–Îì?ðÍ;ÀLÿü¶Ž{R �I”KG„@t„�,vøµ§OÞCËíË ½UÌŽÂÙòe 8]â UÕH8~j: ñ}I¥Ó%O�&‰€r—Ø(Ö¼q®è1ù׳�Úv`›c|ÄÃò´»X5�íii)F]½¨gô=}Ò �㵕V.Áúz•!,�d=½Õžê!GÒ¯}Í]«%F‰¨¸l>Dv~EålÁZ°' .rÇ­{)¿¨¶`Ø.²£O«°p±œàŽÒ‰ð�RÙ]¥�1¾�™–lj’W¢ ] YZ¬¾«1Iè¨Øy“Ø]ª¨mùÅBˆ¦ðÐ,}\Ó¢]Gµ¾os.†GLð‡Vw6e�=39o±ÄÉiD•yiþâŽä°Aö¬ÃO-ì'$#Dºöþ2­X[8ô¯ódÆ,¡X\ýžºµÝ] ƒv6l*òvå@C¬Ïû°­Î»·%c»šή,bXs7YTÔô®ò£}Aoæ+ÝûA^Æ„èoCC,Fa×Ãn©_1ªð¡·E¹¦@Þ¿»ìµžJæf¸`vÝ ÄùC{Êyâçx…ÄwŠšƃ3ðÅQ脇ˆ$çÅ]¢ÈísÚ5¶xÒceÖrɆŠüè¯-¸g÷ >r+eYF ËJ³ô-fðå{Ú l/c"�+ëvÙ¡ØöÈk‚”òaž¨W^Öh++ˆ{Q¹-ª…!:|æ$Žrëqªʛ«âû=©\z0­™úÊêm£$âRÿ"dö™Ùï$7h’¤:6³0BÉ«w£wÐ��l#»'×Ô¨—ºQqÁKråÖi¹L¤�¹‡Oá8žÿ1eÑÕ)BÅ$¯‡ðóãdǾ®õ\EÚ% )5ÑœÓP+‡øC<ë�>÷èú[4Fp¼ ‚µñ†À&›£ªë£F;¨ì$Kvr�óËA§Fç+Ï J¡UÃe‡ÅÑa8JÀæN~ö¨_°ü0?úGò`óâE²Oˆ@PàÞ’ø :$·ðH ;†ïA0¥Q�λ9û7°ìò9ö#ƒ#ZæßµcCq� d\½¦QèÂ�tÈ_»sUÙã*ØcäÕl`îíÅq0c¨PS¦Ú¸ØnÍüz˜õë-lb§Y©f®{´nÈ.®ÒFÄF¥t@4–˜Jq•˜Bdo-eá“V¶Ú¼îΙúê]åVþ—M‡��†É²ÌE‚•<¿FÚDô*¢Ï:ÑÃù�è¢íYÇ)|šµ ú@¥iߌ*Ó(]'Q]úüÉûu@ð Ì,S øÈ¡j3Ïž‚Q×]„Ç4p%íWcÚ•Çwí &îÐŽõûkn3Ÿðq8Æ` ia”sKJ£&Úû‡xë–og<~/×Âs‡ Hb=¼õFY-˜~'aÛ"N�ÖBå÷¦ÏÃvè«A1uìPØŠ[ø,ç}4ƒ§ÃâU!s<€ŒÝë È¥xsÙyþ§bh;ט�r„lv0#aKT±�ƒL_ž“ã:@´¶íå‰äõÀþîÀ„ȃißø¦µÚó=Rk€ÅJ×!¥˜|ûeÜOgj­yÃ<³1Ø/§=0¢*³j:ˆ›^�øú¿W-‹®‚¢‘‚Ò‰Û¸¶Šˆ’œÒ)0½èÑ”û Jí!�ÿ| R»€AÿéG“w‹y|P~1ÒÐL ^YųLПA|Š ~s2áGÕTä‰A(›uÒö•˜ÏMhÍjÊ ©‡Ì�¼í3Lõò„òuÅF�Ìê¼Òè“ àtì�%Ñd½µ ÚãölBºj­íÍÅ{R¬½£2ÅÀ7bn@ ×B¾øD3»Ä¢XÁØgu’ ëÍ©ç}ç‚]BT¤7‘ßõÔvÀëÍÕ×Jkj9‹ `lÐdÔ:x]$üQYãÐÝ5Cyèí¯†#«d=ßåÌJŠb)Š[Gˆ1-ýxÜ1pƒjÀ×Ü.¿!*“ áµ"u�}Æ i4Ù FDK~CµoÊ’ë±ùù’pîväu`�îNð™µó3lfi£~ Ù)ÛËòÔ‡·/²ý�¦§�’ÈüÆœØQÛø}}€ß9y$äK‘ãÔH~î0>Ši¼íjDÃ󑤟™îꦴ|uIYâôÉ󀇗ŒõËŸ7 ¯[£ú­­jÒB| /YÐc%ôhÀŸAY·k.úÂcðÓö]’0·Ž³’CO}ÔeÌ¢¿õiÁÜ¢‰’S„òãw@sõGý¿‚?Ýì¡,wuÎÅû8ØBË´õqɱÌ*Ò y?4'Ä Ù;m·¸Ž“ëq88~m ì²LE'š,¡ ^mLã�¿è²‹œÉ˜ÒŽ[eètÚÉX“Nôx�­C¿þ\ò»0/»ŒÁÅ Àq( ìuι>œóóïÕ?¦=¼ñE¾³ÙŠ#s/ij“îšÓ£ŽÀãê ÀsãGôÔÖàƒ®ƒÈzÇ`Mû�§7'Ž�\ÐÿcJŠà,Í­å´»ù9�ÃØÿS£àéa‰¼ÏaÛö8·_7<}c‚|°éô _·Üuiûĉà$ËP¢’Úl/¡è<ð­9«ž®çûê�¦³šîV÷"𓘠Ûè_ G}ÊÁÒ3H Øó5.•“ ÀOföè>w)å;h=ׂÄ9§"ãA¼±‰õ,|wo# ©H¤×FwÕ“šÈKЈ _”¹à/·µ6à�.‹Pt9ZFañçF'GZÌm]¶ü�¡‰(쌨é‰(“P;XIh«jL{àÒ¥—íïœq²½¯¶Ct~VÅp’¯rÛŠ¯èK*�¢’x3ºÿ:¶¡B”nבš°î…©g�µèŠy†¢ß%6(Rõ~àCXZ¡‘˜Ï� çDØAž|=é©c/O&­‰šaJ�C]Ä[�ãù®³ !Ñ=IZ’‹Ã‘¼ïFÛ®m´c/*¡¯Ù ÏÃÀõÝš&F¥üÒ¤g€-¬™€ÜéÆ)…­yF)5ÕrBœ/ù¯ eUTYŽ�W†¸±5…‰^†”ÇË-KhÈàCU1ÅkÇô ¹)T+?$a¤žZ5jÁÏð—¸c2üW0Q‚ˆ£ c<õó�¯öï5û8ŒZílÒ@ŸŠ“´æ––�-È6ÏŠ¶$C¨½÷f<Üô¼°Ð.¬X–-úIå*ëílà<]§‚Ñià#ÿîy9W1ì‚Rý÷1PîÇD€ÁloLúõbÙ&M!]; WÌ盤8>2§BM6Ü´Ê0ýî†þ†^æmÁ ›êãèª’Úøz*·é É‚k±ËÅ-‡®¤‹Î�«˜ÝbîIæÏwç>UÙƒâˆj†wœ¿ÆŽ¦Á�¦¦YÔ•¾W¥*ïR8@•ëÀ\(4êN­·;¯aXýã㻲s7ÚvÀŠÚùY�ÜRýêC¶h(ÖxI–~˜yït##÷¼iùæÏV¡¨=ó¹Õá†.òTä6ºª»Šöަ;M¢—½9aº–A.â7õ{gŒýldúnÃc¿Þ±(ÄRLJgjÝ/-T�~µù,:ÂÏŸ>åâ¢ëOmd|ö½Í`cÙ™M}�ùEŠº Û§rˆÉÖy“¨Ò×›àÝçX«úe©ýn°?R‘ VØdLÒëðŒ!ÔhÝPº¹žQ€v>&~^+r ú©]¶ ÿ=û2ÙMf¥rþ‹ ÊšÈ&4NàU�O!Òü^_D÷.V�«±í‹›Ù†òÈ\Xaçtº·/ªpHiµÙû’ò¹T׎)ª`‘ €¯_a{…'DC ã¸r€`ê•�¹ä:ØpWÚ0cÔüw|‚ˆ±j-,ñôQCEìX…«Ñ•˜¶Ø[õRQô݆.òN,%þŒæ’Ïm5E7¼RÚ¨–¥„ŒåTæÆUÕ˜x­1õÈè¹òP<ªƒv¦ÇFII¾�Çø0ÁÔoãçóšÀ–…î™øa…îï "kãï�ƒz¢ Nž`ß§ 8•MQ¤1YŠJÐ’ü[ ƒô�þM'ÌüÚtËâñøšT ZUî²"¸&)/0Ô]ùP þ�f†¾•“óZóò|#¶}¤Yž0þSßvÄIú¯ïÑkn¢é-MU,wDkn˜� ÞõX& è¾Ö7[ë ½ÕA$ø3\yó1ÍŠ-Œì"æÛ_~³ë³c õ=„¡½†È¹_Àó§'œ&[€• „Ë­�€cú‰C¨Ç!» cÚÅ#®¹¸ýÍÍ»�uô󰎇º²ÓFÝžÐÝhâNmC^Âퟋ#ÊUwaó¢«{¿�6å[‰ÀK:Ùk«}Q¤ Ò€ZxcÍ·h¬­› PFµß,–³ûb&2‘¥ÞqÇ¢%Â�=НUþ–Q¶ïš5àÖr0 pre/+þã1AD˜ ߨÓ­û¶/Cüóh\$&ÔÀ·˜¢97µ–ŠJØÌ«ðTWŽùÇ*Û5‹K +@]T ¹¸ØK £σ+šülÊpÀò±ºn.šÏ$h¹§r�bÿñ€—i4�RuúÃ+ßÉ=Öô«+ÂŒ§»³iLï½ ¸•)(¼õL.1­]6æìèà æÇ¯JW´hÉ÷ÚýÎ".\@YptëJ›¯I^ x¨"¾)ÀGž;r�Ôø“‚H‘5½×‡‰`†+á6*øw‹?¨!Ó /žÐÈ;®”b)˜aÅŸ—åµµ:‡AËp^Wž§VPA]´sAtéµQy¯¯¢KÐ5• �j2eÃ2ì·v$vš‰ ¸­ßžÊ dž{¸Ã×¶Ñò“ÛY½#Å®{ÈBð´ÍcjB—ùŸ@ö½ü0üƒD DnøÒ K±™DC¢ ع0³>|/¦ÛÊRÄ÷~¨�<§—¼Ël6Ã"–Áî/4ŽÞÁ×#0TÀÖ¾Z$mSæÌ „¹a,®‘§ÖqóNƒÍLœÓ Ûmœ*áãß½R¹DøéɧÄü5*W%_ ÷Ò³ÄN³û0”C³s®a4îFÜUð|£.—Ç=â!¢?à¥uÉÄ,W#»ˆA>$Sü”‹@Ça-ªÙN£dË'cþ ÕBæÇû×€YœŸ?µJ ;¾†ýIP1BŒ˜²¹¶}Ê PuÄ!ñaÖL¥ò,R«ôCêôŸ¤§þ}Á óúþZøª¶bþ+Ÿ“…T3ý`:ìM®r²á¹ãr$³õä c⦼T© KûX|ø½¡­¶y{Àã°¹"øÃwù(‘ ë·bÒœi§cfz1rÐísj72~=SÏô9<ü€ãKV?Ã{XF!ã»}ä† x-û9ÖÌa¨™y‚AÊZ|=É›îÝ®.Kñ×›vE$ë?ùßÈ*ö„¢Hå cÕrMµBЧàøR_�œ«»�ó”Êb»Ê+ôôÅ « àxr|ý£²Öµ¡­,17šm*"9" )Ì|ž‹Õ5ØŽUd –BŽ�W?§KöÕ!î0ˆ¤ Y1f ¤Ðy!Í?èé%–páÎ(‚‘Œ>„€ Qª°BYHö¶’�ƒW˜¤òÛí¥;¹ ƒ¬næã×Ó.'ŠËÃç_›yŒh`˜�Ý={í—Œ¬˜Í{3†^'@0Éåž„?¥¯ÍKè2ìÞ)ƽQ?¶ ÉHüþA±L,%¦»Äú ºph…à ¢<^;>Ã÷uG®¿€\eÿæQ �±�3tÜ9ÿŽä¬¬õT–£ÍÿNv5¯ W={|wMñÁ¸ìÛ=ê*Íõ8CD± 5åDS õª«ª†©êýY=RN1L¥V¿À¯*'ä�[³é$�àN§ua/ĬO³Yf5_U¦S/&:,ØÚáJÄáoª»lƒ«ì{£>¬D²S|—óÙ®ñ0þ=S§úÎóмÉ+š2ú¬´˜]úrd€ýÎË�JØ|ˆ¼�ªPÈŸ—ú&$´“ùú_ÅìK:u\AÓͦ j0:å×s gÓîNv+æÛlË„þH±Ð HÁî¸!TÖà¾Æ“¬u_bÊoûÁØ."u@�0Åò¤¬Ð@—ügß¡aLý~ðJƒrxâݱܸEþ& ÞÍÎ@‘4º×Ò‰Õb]yÂB{÷ËÛ{y‘T`SFývLag×õ²0 •`"¯™KíÑe$bY蚃‚W®v¶ó¶N›ƒÍ¡@·wV¿ç$§PÊü£Ü^. "n~¼ƒ˜”ÿ–½ù§ øjºàM&ÃÌ%�ѵ[R+&PH8�}]ž¨¸õ=×ÉUÀÂl�œ~¥û) ‘.z÷‚>i½°Ú›—i˜âñyJ�»=³ÔSéØ2—–svÚ ¹•ŒÁ)tB~�¾>ðxª5ºn-ðmþ"þoRh[¸¨Ä‹¥nšj32�Ê$çÅL»@¢�e<”Né¤t·½§Ãk%ûš~©J ’—2=xåýDW~äOžr‡N�< È—½m!—§†LÜfŒêÜ1cϲš ¸Ð>xqn¤êœˆw[.ŒÂ<�O–-ÞÐİ4¨ à{ž¸ük¢ñ@éwY¶[Æ+ͳêÞ”Õt¹¥CyVõ‹hªM—Φôs ”ßÜ+-0ûG� ¿‚O0íô¤ÓÀå¬ñ+Ëhš†|Pý•ÚZ{á' og®®®|,,„”«˜ púÙhïí6ŒK Ä+¼°DZx_O�¾`6¸CLèUújãÙÂó=¸á²ð|b¿Ü‚¦}@~üƒ97)SγÊ�õ³qTc|ùfÑÝÏ+;ä%)¬„Üz¸õ™€˜:‹Œï±½¬s“ΠHþ*ˆ(cÆhGµ*ý U•¢ä´LB¯(ðŠéBñ�ðëÊNçb¹V+Ï‘K!þ6Dܘv-¬{«[…U�1vf·=Ì�€«³È%“iW ”è×·Êcf•‚¨ ÿzÓiK¢6Ïö©V[™£Í²•„R lÌ€éªþCÁ n½Ï,îЩýl 87L@1JÒ« ˆ„V�NIP¿vÐ`€†^ºã‘JÈÍP†#‡ŒÜ²^è _ ÇëöëŒ Œ¼ "›Þ›LJÒZù1©µ²¬g²õÊ otg%Ðî˜û}ã¯ÊÓ1ß ®åK‹VØN¦_ûV«r¶…B<. ¾¬:bÏ0Y¦: õ •\÷MÔcluuo8ó…´Jg U¡­°ÛÈEÈ"ÕÅ÷`Ý ¤Û€ëq»›ôÂF ¼G“âóQø€{¼n–iÅ&Ë�‚o¸è|”˜ìÂSummT¹x�P¤z°:™9>sRë/5¹÷®Èîv˳°^™üuê™Â³ôr‰¡^9«Æ¹è*Â}>öæbÑü"Cð%°z¡®ß›�·DŒ3çS;Ô‰žn5É` �Ïpü¶°à)BzL9¿À¾šPÏmÄV€,O”“ðô�ŸÏ¹?ú�ø�´ï@TY:ž «âyÇí¸;½Ïo[¥í ‘pq„üXô¶ÛÆûŒÏ“Y‡K¿ÊcÈ(Â’mÕËù‚ñµâ-%˜â2¿VÖ¹‡È�¥S`Û´=¹q}7¿vüɶZ¬°² C]Ù ©d¯Y’h©×ýtöU L¶\ß3®¨»{yÔ&|‹ÀùÕéùǵûÊëa,cê��®J“>ÑW/’ SÁŸÎq]ðx�~�û”$M烵@í�j’­˜ÊZ{²M9ET”ÛjÕ�JíUùl‹1Á×Ù¸g�¸ ê,Ö°ZšÍÿÐ'T—Üz69p)Z:¸a¡¢æ8‰-ÄìmŒxoÈkó©Æ´Mc-:ÓÞbfàbÈf‰Â߸”Ÿ˜ñ‡êö[ÞöJ�'MþŽ|ÐÝÏÆ0ÒÏ·3:¢”ãuãŠ7€ôk>ÍØ…Òø&ã©„Ò¸ÆÜù ä÷Æ[×0nb³ïQëó ˜g[Üm䘨8fA&VLšìùá1ô3\J­e:3tñW¥ìúÕ 9m²7 +g€ólÚ€~­KQ]z4ƒ†0Àº|Î- Ñ‡æþŽ#k�Ç’hüJœ£F×Ý¢á,÷�{Š»ˆ¹–îH¯P©åÒÚâêT1¿dôT"ì×¼¾¢¿?æµßS¾Â •Ú>ú±�û†�dê<ÛÝfY´ÎM¸YÅsEÑ#þ-ouTD‘iõ”• 6®Òðñ“PDzVŒy2×䑯œ–V´Këvw“e¶—’XHkó1RÝ� ¹2Zzƒ^ÓðX6Cx•Ma´ÊžØÁõ¥Ö$‰t9Q†Ò^ð}_Ù–cKŸ‡ëEè¼Ö¼+¯{�×kÛk9ÆÑSTÁ"w×�g=¿›–¸Q–=ßpeg¯‹biÁ¥{«×ý@2Ì‚P>Òu†MLþÿÂQ7*?Û«÷ñ©@827Q¡­kû‡ •Z¥þÎð+ýr½r(.Ä¢ø©Î3}ä�qiâƒ%ùÃ'¢½úp›‰£Ò[ ÈA爣×gT ú¼–‹ËÊ’… ’®êgpØ€3|óšœ}Éi©».*ҫЬýÎfPT±Œ¢Š ÂíÍ`zHÓ]¶,€<žÍ%Nç�×JmtK?ÙÝ*s³!œm=J2à°ßŒÿ¤—‡rp:Äz/.Ù¼+uÿaYÀ~™Žõjùåš�û¨ÇR>¯:´œZu,v�„2yª/Z=¿U4.Û­$˜W!}0ò¹Ò˜Æ&ž¯"Ô²nûeå ÃÆC×èç i=: ×8}ÈÄ %­õŠBõZ+«MË´K$ÈþÃÏ]Æ6…_ôÊ"]$=Lݸþ¨óÄ n720‹íjIÖÆ4áZ|vjË�´3OÝEe&»p}ìwKZ@@EŽwyO^¸Ó@¦‡8WD¡ò Î*¢D¨[�´$³"-ÍÆ|ŽúÉwp<�1Œa°¹UëLYzH,ÕÏYLyôÓ:Ï¥ƒ/þtß0Ã×DS‰yFÙ'[Ûö=‚qJÁâV¤;+lº™'ÛH—[æÕSyç“’AÅÛ)Ì/g©`ƒ�ÿ=sXžv ¢?L¡à„$&Ï"‰33¦‰o²`!ùHïÁºXZêVPtvÄ09o¢K.²fÚ/*?"âUŠ'y!2ÚŽ¬…]ûrq2Aú8�(ñà#Ϭ¦\ÑAΘ�v‚S48ÏK»É¨7†[ —“@ÑTû̲õYÈú·å«²?ªpAóH»<)Öý+¹õTmbŽqv®ØSÀ ñ‘SLÙGVÆÄ ÿÞ^¸tqé-�’•ù9aPËV”Cv£¯|-ÂýiWpüæË-üy»’­.3ÓM:¨ÅSÚÉ¢½’§âl/©–d•ËñÛ ôT1@¸à[˜�ƆZStZ‘n÷eŠˆÞzpÃgV�в´Eèç,ò³“Ì9¯c{²¤bSµR©:kRVrðŒ_ $ð»˜wqølÉ·B22Å«''!�bH«NàOL.ò4îµ*Φ!xÞ®åí³šSå4ãjÊ s yXs › %½K„™öÑï°9vlˆ¸A1,âŸj<×ÌÔFÒ!åv鈰汥`ŽœWžtáV“\¢×‰íÐÌ8p„þ-ÇÅé`ÊÏŸg™KcàfÅôüZ¶y‹-ª«d°aª´#Wxájkùàч„¬ -2ÁR­ ¹XïÐáNÆ¥>Q1¦ö¡;±È4Â5Œ FçÞ‡¾«ó‚¯tŽ€EÐP-­¦µÊùûûÒ"m¶çNQ ^ÎC<° Äz’"–4q¯·bdøZø&·Z÷�®|^¥k:+MùFØ–,æG÷w’ç*Ââ×;1+Óë†~Ÿøâ›­Á…?…>zŸ„·0l,.ÞšÕ®©â•ݧ¼ GjaÄVØ}x1°Qũ٤bÁÛX•y¾z\®'…>çU·Çÿ~$Ži÷ª_ÊѪVŽÅÆ 3ß[–<Óm8R¿°NpبͷýúqÈ6–†XœWYÐŒ”Níþ‡GQÊ9xŸzÃÇM•–tH/�ÿ'ñ‡h€m{„\/5¹'gxµáÙ<‘—¿'‰d ™Öžm <ú£l)ú:&ìø1&–Ó5iÍ[³Îd'9ybÐh]ö0ß|#qÚÌ@GW¨èkù^¢ñX�þ2{¼%÷‰Ñ*á¼{æ/Së1ü©é áôű°ÛPäËÖ9*¬xÓÏÔܘ‹¯*šè.ÍSéßåìB¾=àØ”,K=.Žì´gjm“ì»–÷Ëá®?mä°Øâ>ú ¶Û€ð!Ÿ¯÷˜N¹+ÇÈ‹zðüÃ[¤,”… §#7Žê‡yǘ'’HOü¦ ,›r”™CÙªƒÆÎ³ÜQ¦f¢èŠ–š%[R²ò(Ecm1Âÿ)šS×õQØ@²Ï#cE]Âî�­œ¶è÷ÜFÌ•”|Ƚ°ÍYíÐT8-ܯe�À “yâ�¬ øºdýÓâ›@ü‡·škåòŸÛÊÊ_=8˜»âw2ÌÈs‚�ÄŠ²FŒ¡®;çø‡VlE-ëIw}™õ©;þÔ0–+š,*l‰Õd¤|,‘P{ê[çæã%Ü ô˜Ák¢{&߀¥é3½õoÞUÄ�׉љ ~ ,ÀV²±C°n¬Å™…sBÓÒCM´ÔÙ`‘úÓÖì‹d_ývãÔÈèó9+�˜Á"ë�9áFàK¾7­Qe\¨©tÉÀ׃Iz'>Hòy§™”–˜¸nŒžM‰;ñöãg¨*_6  ÒËɰ^TKª† h`�†JÞŒ:+Ù^ $�ÔjíuF÷€-A˜“îgji!”ÛC¥ ;ErlÀðY÷â&ÛÌ]ˆOÕ-QèŸ1bJzŒ»â0¥ ‡î>ï‹îÙ“°l¼9ÏÚFñdaä•¶XEr@ïÎ]¨•$TN ʈŽ#M+®ÿ;ÿDXQ8œkc¼ònâ?×ʼ¶>=&O•ÀA´²©éþøc��ó×AQ 29ÆtûEÑû§5¸Äe§!Q@¬�ÖÚ´�Xˆ¥YwU:|Ø„… v\~,‰ ~•ðŠˆ·¬',ÂÞ‡ú6-*Š;5ïRÔ&“ï°Eð^ž#Æv�†‡eá¸ÚY/½Ù9•¦TdèAâS9ƒº¿\1¬î6[˽ĶkâVÂýaoôÑ=(½ö‰îÉ ‹¡�~¡34‘MœŽ’ ˆ£ ¦üŠŽ—«ê’€Úìñ¶X�:“ ãò”–Ñ4²d|2XV„Ù(´E•Éä=3gš4ýû�¡µ¥Û<Ç9¨JVEMž³ åXÚYÒ }/TÀµ³ÁAÒ6'`h(É¡#zY liŠÚ�Æ'£i(sŠ¡J¶Äíd[C¬êŽ“ öW‰ŽS’hŠpÒ§=øzSñh¥ÛùT÷1j^«Ä?°z—ÃLÍ�Iw¤ Ò2Ö²½LyëBvk�ù«†P©)äľ§ôጭ…ä2¸¹ ì¿�Sß&auñÕÒ0-–ué#ð1]y…7²U žùó½¼LCñ¸¿^ø|Ú^F’À‰ÀÒW€ " Z6ûäàtÀ�õj«½>×É�½>9áZ,Ls-ÜËHzÿÓÖ®=MD¶ÅÅÿS¸+ˆw®‡ãÀÛ˜g·›$Ç8‰nü^¦üýànbñ¥8R¶P[·öZ®¯Ið´–lþû3™q~»e:€V©QãÏ›WTZºù¤Æ"3¼{'àèä`œdSCƒ(“µFªqïý›,çG?»¢`,)Ë¬V;z”™ÆêáäâÇáѱT: mv­ËÊkæ'\ÁØí¼–Œfœú’AC±‚FœvÝÓ¢ÏÄ?�6J§×fãÐâ¢qìÐ{3Uû:;:kgR�åec*ØCëë>L˸]×aœoO9”ƒËîA(÷A�úúÎmìZàvºsoÁÚó¯EŸèù9 "ö¡}ä”]7º­‡Ù‘.^¼o‹s‡†n§LiX-–p¶4J%ûéSôm]š¾�hžô]¿šÄÞ4Q}ƒr\ó|]`+ŒW²‘'›Ð"â7ɈëÜÉ[²|*Û’¼Ž„çD1^i?«9¡Cd1œ` ŸA•lõ0N´:ÀÎÝ ý >ì¡„r¡ÔÆñ‡…=†qŒÀìP±U“;ݯ§÷ë×]UvI”Ú6Ðèy=«NT/UM¡ö w ¼ª¯KîFS¾F²QƒSh÷µ&ˆs� ’¹ ÕºŽ;YB”-Ò‡ˆm„¼^‡¬:­Ú�.¤xå�@T�©~&K%™äaÑ%_&÷¨ãñ_N6†ûQÓµÿÍæH~ÃG2\£Ðrã¨Ç…–FPÃs]»"õÛÀþ[ÏËô$„[? ˜9Öÿ,ݦ|yCX)<ÏE6žyïO=ð¾IïÙe@N£SAÃ�0›4U›•w§Ð¡y!'¹\öhBÍÁö µÈ)–‘ê³=ßßáÀ|YÞ<ŸÐÿ�+™Ý‡ó€×²”ò/¸£Ôåh˜žÂèÝ¢WÇ(Rò‘ú±�Ý<–þFY§™Ào‘KZIî®b¯ò-C�ÂmY~½žœe ö\qéÞàÕ3N=ß l5£ �ÜENÍEN7¹13\‚½IºD1Ñ…< À )¶K·Ðé^Z{Ì ÊÀŽxiðE½ Ùİ胅ù±¸_röÙþÿIh6 òÂf¢‚Æ~�\ûþÅt6ò~]’§f‘~VE…¶s¾�þ½¹öÞµ´;ú¶qPGzÀò ß<£í¾HÆ/»ËqÞI�YÏVàÙseóŠŽZ¸•LrZÖyƒD p&:&±ž)=²Êí*3åÂÌ/$5#ß½~sÚ «ÈÁää£bÚ õ%ùZ¶ŠÙ_?•ˆ b޽J@�°ÿ'ÁyÇX¼îÐbë ß%»cß�S®‡‹ 6ïÃC‡óáÛV„³ˆÐå’1±³ý›9Å=°‰bÄÃg΄ç&{H è:sõ\*T!rzRgáî¡t˜\KŒ��&û÷emº žÿá�]º1µSyrÙZ2$µâFº-cÆÎIV2©Bêd¹ÅÕ7»]§+º¼úTp×¼ ³š�@Êe —‡n½ØÓÂh×$µPÃíB\—]¶,FÃvË™<Î\ÈÞ§é•ÅÇq‰^]Ào™P@- y†ÆA²ïpn³�P9²Ët…4;¾*_^@–-º :£$Çĺô·H°¹[k—•Ø¥Lñ.>N˜HÿÓDwÒбc‡¿ÉÖ Ÿ´$Níü�.¬µ®,@pÉqWB�åFYtçìE‰Ï.®® 6O0X9Í7»ó«ÌUA7ö]6d¦y”šÚé«D;«`k¿fY‚uÿ(pûÂêS5"ÝJ>K†œØ—wPc^²—Ð*ôE¥'dAÏÜ€\´ìA˜’®˜ãÍ¡Þ#)!G“8k*·Bâeµ�§°¿ÃZ6S¶ø6·¯ ð"ý�”‚%öJ?Rh~ñU;lMò�ÃÀ‘ÚÍ-ߺŸ³qf.ÿv�I\ì|ôeZ•ݾmØ@*»òÒ]F‚‹¬»ƒPèë@Þék¿#Á>æ ÌÁÏÂ@ ?v:H0¨žñE$�ɳ×B"ï©¥é!]âªÇyãQiþ}{�®6ez´F3ÑÍJ}0„vë,;yE*óuu ùƒ'F+ó«7ë¥sDYÿv¾·,Qÿ^þ¾�É�’JÕ ±™Gm;ÖáɆQ|}vG»`×õMP3÷‘ À¼^ž§F¥KÐäêƒHˆJ¯VÏèZ$)`0míPN_¿æÝUïñ¼Æµ7››pï9�äïÇn„åB½1«gÅÓ5¶hf�ÁÒÔKFMsc‘ìûgN�kgÓúF“„}ËLÌ|‰ßá¸]®ÔÏ"ØóÓF´Zq¿É|32&ÛËcb™t¢gv´àe𥠛Fí•´6jc$Öݱo)QTVÄ!Ù°.Ò*¸_ÿ«ð«¶)Øþ{ú�¹·¿ÙaEƒ!€2÷YQ·n¨�ašë<9—)t�5­!=ñؼ¢7¹–̽g3K #w÷d9¶”»÷` Î]:ÿ½ˆé{»HV¢âZ/‚BS»)[àö‹ÚR·²…u4ΗcLC°MKq)ŸªåºÞÉV�hl’ɇÒÄ=Gº|Ökªhøô» ƒÕ;‘áŒdËJ(�p ¿'½/´– Ü ¥¿)(dJh8Üì2 ë+7µ{­š¦•:o^;ùy‰ø}÷n\ZÚÖ¯îó^ }1Dªµt€IéDË#TΗý ¤§÷…�M¦²L½‹��z.?:[ø² Ð0ôæÝ²�ÚÌÍ|ü Ö!Bl{}å*»ý^ý|ÎR-ƒgñ«ês�ñKÀ⢻êq›æ8™ò¯“LÊ~£] VsxÒðÌ�µvµU[CK,‡áÕJSÜÑ ïˆ0 >¢ºj¯_Šé_êB’ÅWöWåRuÀ5j"ŠàmÍ×ôtí \S¹íäf� Q!£®�Üõ9ðúV*áQ¢×$‘³\ÙŸ¸'j6·;ß&O Ùƒ}ë+œbÐ;ŒÒðØiÖ§„ˆ0˜0ÁúçW·ý? •h¿ÏœÙîVÞ÷+©;�ê‚:, ¨bg=ŸRüô2n=õ�î’ÜpíÙYKŽØLòUKFÔÐ#íýbŸ® ãkïÙy¿>+ù=œØ4<“Ïõ`–&£ªÃx uS·å-¤Wå- ¬3{z#"rF‡¦›wj*S•ù×�ýPÂö©£ÝsxÖÌ6>~3àÙ¿ÅõL BÉcŒ€Šu2œC|Q°X§*Ôh¸sYÜøç|÷:U±Åòäß<æ|qa ·É^b¼· îU±âó1aœù$·ødÊ›kEv;ÏÇÃ>GV¢â/oK;8ÇUF�S`Äh¨–MC˜ vuF}õÉ¢¯‡îëçúëÆÐL¾HcËë@iéôq„Z½ÏåóF;NGGÈôI]½D¸…$ <;èœ%Ë·ñßÏaIµ,` �á' A4+ËÁ†²Æ-£ÎÆo@ì¿p0€‰³ŽÁ·E¯²Œ/˜e5öår¦øš¢H&‚Ë®†ªÔ+³ƒ÷©¨‘о/Evê-¨£åÔ)ù�‘ï·6ø£ %ï†^�ËÞ ¢”7ò!uûÂg6Ù®œ­la…�øO¶`¤)Ï/Ûký‘ÓOì^ÕÃíû֞ÈéÔ1òl/ ?cé”#NIIb„A§iòßî8£Rlç?~ÀçøÅw–BæÃsš‰8ôŽh& Z@ÜÕv5•çB›Qriö,ƒÓC5á/ÃÇÕDºyžá'†=’NÈ¢¥IÎ×}ã„ÔuTÜÐÚ°²£ÏTV–—›4 ëOzÂYü6ÊϾp‡V7`ŽíÙùÙ¬p ØF–]ƒçTÂ8àÝ``ŵt=1Ón?GðÄŠåxË8C]Ã7K„ÉÎÈ»¡¤Òè}éÏwh_Ïhì›ìáUK/0Ñ‹Þþ‹÷ í=33AÄwƒ^’]l‚×=gkÚÿ ë &ŒHÉfY2ºŠì§6“Ȧ6.Àö°XL½ÜîŠèØub{pÿ%äÝiFÌ9(Í\GÚQàÆ—XùgË”…Ѻžëê[èF¯u »G‡��:Jç 6öj(ð·xÖJ@vyû h*ŠTí!&,‹¯Ã«È¼oÎ9¥ŽƒzaŽ:0 É>®P.)ÿª/T˜èÇ8ãÕȇ¹kE~¿Ç›î¹‡ â5�ÿãŠÖH$B¥ß3|aOÆêaµñ*Dá ïÓ¶( !¸VO* våb>m|/ÿÞí‰WŠs } YÂX½èû4 ÆX`Ã×%ÀGÔ4ÐÏe/�ß`ƒ}Ï’|0G†ƒ¡Ý˜c[E‘, о¢�˜üHY~«0𮟣Ô ÒÃLC$¢í«Fý8Xç[é€$V!=åBÉâÙŸ×ÚÇ›º‰˜I´‹Ô{±ÕÏÿå߈¸5HÉÇHºÏ¶xºÞN5ò¾øûcr[òV­8sÝko_¤O†¾ãQRñCîÖHÓÓ´îqB­ŽÓ9ÔiωC|Yã\NÊDIöU„²|#í†=ߢzÓ3n¨Ï"m””Ý’[ EÙ(w)ãG0E­Ý·¼ Ñšg+J�ú8áë¬CüO �ÿn¤÷9úüÄ΄:ÉUKïü”tÞçÞ–ŽÂ}!‰¢_gŽNöä”ã^§àö< Ò‹3×]o¢T™^êKu³œ·¸¿è: ÌÌD༯/ØÈÊ•]û‚$sèsù’´F¬GS/B•d[EpÀ½�ççU% äìQ«h¾_4l­¼¤L½Š'²¬r]òyQÛ…á�…äÚENÈyíè’GxŒ²«+e~YËï‚Cð€ŸÛ 8ÝÜÃÕQ<_C„½ü¢.ÿn4ªó©A?7’˜T2ššðáü&*Šÿ$àü¤ 9rå®Í-þ›Jî÷;ÿމ¸+ÛTW®_ÚÍøq`¢~$×i*8²gc˜wÇ“·n¶�…Ñ݉ϱzÀ¶@O×s}cRá~4�üf/z™yüðÕ»)3ƒzF)Mð?œiáßT3´÷± ú—¾?š@J�×à" øûQ?ªcõYñÇôxÞÔKUI¾ß–‹F䢚+×"Ÿé+/§›Ôòf‡ÚC{£ ï¤{[å1uÌ‘L_m+ÃÿpIblÈðdõªè„Í¥)›jx%RmÑÅ b¢‡m¼�yøÝ^§£˜·{5�9Ëùn¿K”mK°?¸× dç_¤8½÷îiP¡(ÜKX ì7ñŠº!‚´Äí_2<¦o‰ê–Oø×¾i ÜÓ°…¤q€Ã™¸ó7[¥ßAonÒ‘¬xq¶0õ°{Ûo|X“FÕÄs‡I8�o!?†N v¦Ž³"a4ôS&Rkw<îø˜±Fj"‹Ô;Z9¤æÂdMÐ~(@=l’úïù¨PÈõ×å5Ú¿g –×8¤ ŒXÇr·¢ŸNÁ:èðˈ’��Ê÷KYñ¾4 ètâH`Áߊñ‹ ö>íJÜ4.Ú*(m’¡#×QÏ‚î_‚ºKhÑÄ»3ÿéÓ[!…5-’¶ô'Uh²~&ïµ{oƒæ‚]íD:JéxIø€DË^(�z–£ÐEv'Í”7J¹`åÈ6è¡*lBo(LGÅ}PÒv�Þ¤N€¢±Âqy¯‰ês¯ã�ßø%Ûj½¿²ºªK¼TÁæN‚edªÑæ×‹ÜG¤å�%ÁZR6Ð¥êÑ£�—\Üvˆ˜óZ#wO�-�Í…ÌÊ8o#î™—!uàjubÇ�òFshPµ‚’·†ÈøhΞš|‘M·;ɉ©çÞÄš ׋˟ܵDžËUgs¬È¬§ZL÷H�OªŸ7{içá%±zìfå2Ãm5ã«ä¬ƒ„TÄ*Îxéþ¼ôŽejDk$Í’ŸXÒx×$QˆCœNÕß�ïY÷ƒª»¬áÎÍÊ~ʼn͚ÐYÏ­÷àTîè+’“`g0{ˆtl§øüöNÛøÔs;•®$X ý˜…=Ã#zgE£ N x=áuMm“ º£Âô¹Íƒ¨ÄYø¹Þð]Óú©Óå.»ß­dNsÁð7ñ`nI߯oPyá9(ü4ùÙa8ø²ºÚPG€)žÎ…TÂjrêegÃ�}"D€U$ê'ÿ!FÊ�çÞ,åì/ÒŸ:K%é䨷¼=ÌïÓžµœuß…ÙÆæÅˤæÐûq¥¾'æ¥!•ô O£EáµÄW>ÊÈ-‹§±!Ê¥ÑHZ‡C›Tø °qCçj0q„P–”¥½í¶JèFÀÊt±yå²pÕùù<>Žò@aåÌX8úž ÿÆ^brx2¡gÀø�ÿsŽáùy§8änÔµ‚îÞFm™C–§s–óljØ£ý ¯+/f–7qÎxÜ5 >/à s~£GrDH™õÿ7 Þ´¡¸\Ks“ÝCáyÀ5N€äÑŠ“ïS ´€?hÍ$·ƒa�rq«|>À<�ív¤4S±•n³p‰©à¯7®¿íÓˆ•³‚¼ßŠS£¥m¹!ô—€¬Þñ§x‡^D¿BÚ6¥ç}ܲÉMf:ÛGÌsè˜ù’žÃôÜĽ,Ñ^, D2›¨H2E‡ås£ir·s:Z°fÁT°ÞkdP¨ê?Ô˜í+w•íöÃó\|ƒúq7 C.Ò‹ÏRŒÅ ¿Ú�%Â3ÔMK´5xN> Zòû¼ÈòÛÙgß7Y!]ÆéI†‹«•• ÷v[u•ãwúÌ5¸-/÷ˆ¤�š0ìGö†ì Pá~¶ýšcfå’kÝënÕÉœM³˜àxo�¬ZŒ&·T_Eb{½�m Öô­/c8jM舮»'¨ÉàzP­>QŽùª‡ˆuäKô- „ _bü0⃩�HS9Æ(Xªv£çr¬t'0~?ŰIòB8ã«·C††àç‹ /¹Â¹›ú�s!L×ù]` v²¯­0»[ÿúb$Íÿµìó-QÃùL Ýš®š8Bâ"$YX4×B%Ý#åQnÞG_$ÊÎÇ]qÝGý�Ã.U®×4Ø×^Oij=4ÔTà¿ °µC™‚` Ù4ÞÏ3×ðš0Ü!‡í¤P–; „]_²Þæ ˆ}~Ö)öÍ¡=æx#1«ù¨Â›¯Æ->õÿ;<]N��¦‹ÅŸO-´ÿÉ v\XP–»A¢¹N•±4̲Ά¼k[œÏò„�wE¹¬ñ"ð$šÌ7SµÇñsÇÙ4õT"q‘oA«?Ë„®áæö:Õ NúÙ“A‡œ£MIS±K>êÔÑ=ßÑp.#'Ù‚B‚åàý’mŒ ¢ÿ~Žˆ¯>©P×åq¢þÅoÊ‚Š5“` Áãôž‹/¶2>`òKÁ6\ß öÚPéô* RJW�àgP‹¤-ö].VúµË‰æl9‡kxÂXÂÜHéõ£˜†Ža#|º‘ñÕÐü�8ñ¯Ó`C×®wŽíצ6% ÑôOýºÃ#P/åר”.�D`°dÈö-Y Sò)yM<¶JÝ!]dq!¤Ç2éW1±�gx3Ìò"HqûdTàèß94_ÐçøäY€‡•ÔÒ�ºG§ ò.²ÿ†{‡Ê—`w“ ¨–ÛÕ:tÁÓœ—™Ê/ïWÞ“Z›•¿•æÐ²¨oÒ[:KÞŒ¶ÿ±70F €„œ}±»ž$¯x�‚4v£XCbt"ê\àÓ Ó‰jøYŽAìG&H…ÆÁ{´ö¡vsz7˜Ø»ç}–±�ê ’—j48ïñÄÉ`ˆ‘ÂFÈ»»³+Ñ-é­Ç=¡Ðn;‡ÎDÞ¤‹M Xaä�ÏŠ`t¯Õ( Sm’` q[Y� zRo×÷c…"šªXÈnÚSÈH?½xŒF)Ÿ¡Ê&‹GH€doÁ1Dzl=ƒW¿VÈ�°QàDmÐ@ÕõèT‡M‚9ÚàüK36Å»ôGqw§ÕÑ�¨XªÝFñ:û]ãäàã=ŒèY¥³.>O_³¥»¡? Á¥@SµÜÍýçir×›yUòCn¢¤÷l*Ñ~ E„Ø›^âÒ)Ù†ƒÿÁ=²CwÛ  tðz*“��ÂTB—ëù 3 bʤ‚��´’µÑh¦&Öûzxp#/µAE3m0 ƒ1 ì+u+üü‰€-·ª¸·[QKë.µjW¥ç.a©NÓ(iÐLJ¤–ô|ëº& %×™áM#™<Åyþ#¹ßp)E/ˆ�ã:õ#E}@�Uªž=X†Ý*�ËJ¸´Z0ÃÝÎüjð>ToAÿ:6f`þ7pÁ‹Ãº$þGÃ)j¢Íº/sAÎ!bü<æ�1dyË�NŸ¡ä ;” LMPØÃêK1ÈI¥ùÿ¼Å!¿�ÏÌÇÍ™µ <±+‹¬Ñöí•h ËÜ(�tGf.0Ä›bÕÔ?JÃÓ â44Á‡d‚RŸî-+t¶˜ž_�p×€Zê=cÞ²æ¿)r+¯¾U¬Èí&² üõX¨ÔóÀØ]–¡š…mú´²/,Þ” …錣 à�ªà””#-B{9{rÉ“6EÖb$#ÕP«†ÒÔõ2/h~®þ #š Gä˜a÷Q)aÎ2ÛNDc¿ª€ñj ËŒ¯ý™Æ7£³ã°rD‚µŠy#N³‹‰³´ "ÿh9S BðéªØ£?øs{–“\*ãCšVë¿Fñ©A5ÂüÔ0׉0Émtµ)!Œæ±ã¼„Hˆ¹ÊíSqý¤³8ÜÏ�[og}×B#¬© ÀV¸àø…„ÞÑÅÀÇî •÷cîb= XrôD\…3>:ˆíGw�‰d¤Nž¿8½±7pkƉ=û¡¼bb‚Öº@EŸ¡S{ìþ”ŸÖbÐë²µ¯¹»o"ûR‡Ò»Ú$yà²P_C%Êrµ¹ZD]mýŠ¢&±nFSDç"C[µ¼Î Ûê›à׃W¨�N@À®¿y|̤�Ý«�ÂÐÜm*ac7fxGñ­�§•##;ÁjkîÛ2B?ÿË)ä?ù—s’~­°>|M©o~°Õ”`55מß/Ëÿñ÷è»Bónn+$$ëѳ‰£„‹ýIÐ!ͤÜú�ñ6•VÀ:ðÉæðG[~´-«�•§üç,‚“ª¿U_/*M Ö³Ç/d$Í/©�ñ*¢>¢úœBæ_L�rÐNKŸé\ô£ý¼?§)œcôtÒzâf°fæ _Ð’i6}À]7ZÙ†Š‹‡"nfYñQcÃü¡ð-LNI(‚1iWgdZV4£}�îF]²§¨ËV—3ù"V£À`úƒ“•D˜õƒzÔP](Mj·K+ žBëºëðF‰5™ŠÛ˜Œ@ͤÝ?²oýo¾þ°1熪½&wUÐÁV_†Î‰ó^¹¬e{Y;ùx¾âj&ÁÔ :E5D-=éG!¡´n¨À@ 9>cè- S2ÎÃ<„ZHzX·(;©öç¿;–õ}ü¯_D’€—ðÏ^­ÖÔjÖío…¥Ÿz‡9RM"�]Ñb‡s1G€ŒùñóNèWN«˜šcµaB!š!U¤tBS_ª�T9LјËíÞ;’DPF0ö“aL‘xË€:Ы5¿5W0?›fHÝ 0¥6¹˜pì!š?Tæo¦à/šhNÁãK)�âÁ…ˆé¬B‘·¼2¸1;u}öÔ£I„Îic°ö/Äe˜¤&V.œ©ÐZU{P+o[þ¹¿ iŠÍi­7â,ç_˜âaÏ~òš¶^–Ò©ÒÞ€ì)›vÚ»”˜`ŽijöJ›•Õ"æX*jƒOã¶�(aWk"ÍÆÇ±Ù꫱÷W&]¯çpD»÷ÝÁyq)ÏÎyfÛ_«&ÏÔÆ`Í$”M —Eyl/æÊ�=4šÓu”9™�’âC#8¤†É€ñÌ܇¥ßM„÷¦f�h©òí?má™+‹eYÆI‚¨–,%o¦´N, y’â‡Ò)½é×½/&:�ê.�s{»¥Ã.9EŒÜq¸¿DޝÂåt(fìOŸÔ¦5Ë’¼u+ÇÛ1eMå¹B4|*JR �ͤCX§Þг‘Wïh{cñÝ…NÕb/œL8 c7*ï'A ‡ë¦öBè ¾’ÅÐÙ÷5¶,áì ÜÙ£" ì°óç_…î¿N¨Âpç9oÕwz\tÕ6šªþõ¤z`Âé×J"u)òoÜȪZ„Ò*ÚÒæB—´W–ÌǵoBžuõìa‰ÖK?‹ëylÇóªÏûˆqE™³v¾˜ªãƒxÈ«£�Amµ ª\"ª’«Pa-±Ûþ•UÖDûÐ@Vk}2�Óÿ0ef…þŸ Ï›ò4€0 UŽ„,ì;}&°·ûóÂÆd˜êLV®á·„yXÜñyÕDÏT¯œ–�Úh³;éý^=OÔhQIP~Ìétž}Äž†¯É¶A‚ �ìîcn…âÞ¸qJú�`p[eûÔÉ»Ã]”8¿£‘Äv“ŸÎ°aý8޼ÿJ{v­ÀýýãR`YFÐYrã–qE–=Š ˆïgácYòÉŸâÚ¬6ùUŇ9´ùQPÄÇãÿPJâtŒ±6°:L×dæ©BƒX?¦ôÜ>,²%£wF‰ú`”¢SYâ‹»®ß�Dúé× =¿ èxjkO¸¯>gp§«¿ØŸ5 0—•HŸ¬Û¨ÖÒ¨î‹Q"\vF ¥yjrÀZA•&؈þ2=èQÙ!´¹p¡8#ธ·°«Ì›]Û� ·QÑ]0LÛ|7öó�m®­rˆ®1¢¬<#pˆ^Å,‹>T¦Š ’Šæ'µ§#Ñ ¼=wï`§cW‡~%R£ýôbrsB$ òQÞu?"âð1UÚM_/š`ÁŸ\¹ã?‡ ÕðÒ¥K¿JÑ@º¢Í£ mßп`-F Lÿ_KV•ß³åƒ6ì3³jÂ’×þïÜ9ŒÜ§ º'Àðý ïÛaøËä�Y÷ƒ·”PæR8ËÌ U¤Y2º“ÎŽ ß * ïã(„¤È÷]y�sÍ5cŒ1ÂH Kìhù·ú›t?BÔA�o’Ü3>\'Õ5ÁÊ>–¯º¥ ¶ùÄM§–ŽÄä„âå†.œf^™¼ücf£”š÷N…1»<�ÎlÁpäâoWôÁŽ‘hónÐ/œGÅ ·==»-u Aª—e‡ýúȹ≯>Ø›~$HaùœÄÎ?ÆÆŠx¤«¥üìôZ Ð�ÚƒÎwö"�8 ·“öð1€n¼õcu±÷Òpòõ²ôîƒ9å:žé)ÌWžá´Aš¢(ì¡¢Â;œ{Cq#�€õVVçƒË1=ûQ äŽFE´£9Ü*°:ÆIª¹N‘Y?S÷�É ¿jÝç;hÛ�ö¤Ñ£êÖLÌí'ýŸ¨(�cdìï:Ö±$æ–¥FGQ 7ˆÈn*yÒ‰—mÈÞH÷ŸŽ€"`Œ€£|ùs Õž“{Sd®ÏwçÅv9*Ø\Ôhjc ßͲ¯´ËÁ4¤m®æ�ýÃMì´°ûp¸s Ž“A­‹m;ðR«KË=ÞÛ&+ó3æÅʹ`¨#'²ïY®©~¥?¾ŒõýÇxÂ9>�+l®Í(`傌˜²€zé Š‡¨RÎCXð‡[*#±yØjKV- d9œé&¢ ƲÊr&ÒÌÏLÇax<„êJ!àkCXESæ/üÜ\[¼mN³Àø�Ð)ÓYâ×$#YÌM:1äœaZ~¾€˜?)(㪼Æ}¿®L%PŒµp7ao=rýy"™6©¶-e”}¢Ay3-±f®t㟠 åùd24!¼ *\­?¸Ð )+²‹¨ g ´5¸±Ö'KS|å®þ”¶(€_ÀQvQÑZ05ÆÂB«Ô1s9[Â%ÎÚÒÄZ«A„¸U½ØÈ9nÖmTböþc×õÈj™ Ë�{Æ*­p#ÅHü>ßøD]ª¾VþW›?ZÇ�ÊU„ðÐú·Ò³Ê¬45ƒ Yðêª�SÀãMuLÌ9qCƒk»& ‰Œ {©¾¿›…³?s„pŽ¥ÙÌÌ�gàL‡k%%B¾ì!¡¼–ò¬qP²œ5¯IÞ�Ǿ콰|C‹‚̆·%pÄœ›*«F(%óYfI²Ö89ULzS˜RtDB¼þñÉôœE`øK,—à+ºéÿ.ÓàŽ{(Ræ‡%¡%÷MÉ=l7Æ)fê×KÀ® øÕ„Lj†—óN2Z'Ù´âRásêUvÄGeÀ6�¡«Y,g^«±GãtÅòâTüˆ½¯Î_­ûK6O3àîJQ4’Þ~u´¨þkŒ¬Ý F0‘>  É‰ÉÝ{ýqŸ˜Žûûjc—˜Òò÷û ߊÈ@õá[l¯üï ]"û�ú;Ì‹Ïg®vfg5‚Pì…B2X�š¶3H€¿ÁÅIã«iâ÷Ú¸:ëÄX6„¶êzw ó|†).„œm‡æW¨¿Öoˆ3i81çÒæO€ÐÛª3(ã]·jÆ}”g»\Å#äUp{{<ÉcrW@B–šWZO!”d£A;¬:›É·f˜bàÅaû¡<ß@¥g�6#È™õIP­¬×¶ªÿ:„@Åjóµ´3 °”`P…Ø_J¥`µ)‡×ÄZ]¶÷O‡QÇõƒ<:¢µ—©.ë!DxÖÓ¼8ö©êÞ”o]§ü6ñ¹Rn`Kž=:gÂ23 å!½3/Ø'Óß> ÜűíPϸß)Gr%&CCnù…Û³ñ!ÑSÐ÷г²ßj ?ó½DM>{sê[ÃT–ƒøI±£™uñãL^%Ærõ17¹�r„¥ØNªpü$îð¦É^‘=v].Pó<ä‚‚¨m½®Àw„ áZ:‹‹¼×)7böÇÆÞ–6ºàèÖW‚õ[|.¨¬Š€R’¦5IS¢“²èýÅ+Ã�Cþ6q3X€²êxV�}µªKkõ†ì’@ÒÀŠªt–³DÙ�Rî(™~„w¼æF{Ù%ž<€mðÕXo;¯bCE™ ^MöÅ\7)«dÑœ3ZÅ`‹\K)Î#<v?QH»qdÿ�OP¶Y~0ûùÛ–.ÑM)¯Mˆè·ä‰«â†�,»ÜQ[GžáûÕGèSt)F1H’èM D£¶¡ŠzŒ<¥g0õ×ñˆ˜GÛþˆ›”Ç]·×åÜæ¼¨SmëAÿh*BñãF°¦ˆO„zÀhœ8!­4ÅŸ'“ÜQÿ¥ CCÓ¢ÏD }Œ€æ1ŠÌ5¨D¶ÅƤÚá¶õ}ÔD‘v íBNÔyÁEgò’£XCÄA¶e¨ÅÔ󈎑h½ø©[Ò'# wsèŸÕùvé?¸ÿ ùu~î\ÒßN¯Ü²˜ÌÔ/Á°ïÛq€›þ>73Ãà¢)3žÔ8:ö»ÎoFB:Ϫ‹�6¯ÌÖM©Ÿi –Š§Ü t……À…ŽVñó”>³Ï=d¯;ZY#š;ª0’zêØcRÑ%£èQ|7KX�ÿ‹F"&4à�Sáç/´²‹:Ÿ‘††�>ƒ@ÂCˆ(‰Åù  æ§1Kæš6MN”ß…'N:V]é«]àéiˆ éÁ”f¶’[`(â°ì¡oLÆ8†µú* õ³ëPŒhÖ°Ij’SCA`‚ïFb‚†U;¬@i¯Ãw,©¼Ì\‡‚4or¼b‘ŸÂš(…€Á�?â2…_áfÛ=TBâEÑ&ûÓŽbM\ðȸ}§[¸¦ïº‚ª€Y‘áã ÇsÒ §4¶ß{ƒù�ivxZf]ñ•ŒÆ U,°NS!üú·`4¾:²DŠ´M̓¨Û iJµ�RN±þ ݈»Œ´  Š3±6JÏ…´UDXª¿Ñu6v@UªÏð†DÓ@†�¼�llXS‰mw†Ïw'5{8¹ù�ÐXÐ\ÇÝë±íˆŒ’Q %tÊivlú��fðܺ>ÎѨ‚í˜YD”°�N}= ”æC‘à„±ÜÄ·ëé£äœïú`H‰ñÃ9WxIˆ?›­zù& S¤ì¤_tj¹ãåß\Ý÷ë÷nD{yïr¦ CÈ+¦Â,d•â î…8zm»e6˜ú�ïÿzŒ˜³~¬6ü‘s¡&|•M³y�u¦�öÀ®¼*”ˆÉD‚ñ¨§š3×"˜t€Fö~|&ˆtBÛŠYén}ÎT¢ Ð £†..Áïö¡‰õåŒ^pþ2oÂ?öÞŒi™¹âoIõ,7­a/7]\§$óCOc¡ê?)`®¥;´%ÅŸ¬wÂnhäÛs[Ëñ ÌC—^6¯�8àMºý´ÌF“(,Q‚�àòƒÛÖfÙG Ùo41WÃ*âã·šwÙÒlñq‹¹Ë'9WöåEhþõ@V5'+o#<9´ |=PPã•íJf7�]3…êØ2 ^“ìj4|~’±å˜roíOðP3·RÞÁ")�ìg?à02¶þq>ÖgÈtdçùËŸA5Q×ðuª»rÚ^ “'FYDöäËÕ±xXD«®%q£ÿDHT¢%iµ6P�ùž塼“ R Dòj¦eº!ä5G4?~¾–$U˜Ñq?ÜÀQ‹Øî¹HßshKÐLÌýò  vßl͋ӨÍ×PÕÖüytg.iæzº:sÞreÐ@«_K€Â&+¬É-sèÂ×ì?;ÀOìô¦]i¶Ž¥§âR'ÄB]^o¹Ön“ƒ +õ¯Ÿ öñ„°뺖W öÉ*´#Ãǽfødÿ{dÙprÛfèùPÓ¢f[�%�3ë�îßrIžT…K{ÎFXlô‰IvM™+gªDí¯ƒÕ[)o WíW½¸Û=ú‹Àðic¾ï©fu Ÿ“ÿ0�w­„ÿ„1ý\§’îc'‚Oø+îh¶à‹“õ‘OÏûöf aƒLÁþdfºŽ£úwÔŒ`;˜@¨Òµ1RÃý·óÜ­ñŸ=Ÿ©PÙ»åÆÑ<õXŽ*KÔwÈ¥^Šoú¥æ‹ñC›xÚM¥§ÍUMˆ9æ!áÅÙ’Nq jX‰��yñ† ³€·Ý“¨j€O¾‡—"ØÒ3Ø‹§ÚYò½ÐŠÅ½ …Å|waÏøX†Oþ1Œ‹�7I(ô?›Õ.Iüd«láh�¦>ù¨ù~i€i�ßýà�ÿ©9÷SÉ”†ÛG &pj(†\ôý2Çn<©¾/»yUg›Q£%Ä+¬ZF焳g™'QƒKÞ£ò¶s/³¤„ζañ°É1t«œÃ,m=눠$YYè’»ÞÐêöU€¦ñ´¨¦�L\#ÈíW‚…Ê–ˆN«œEø¾#–¦e}غ]]ÅEqnˆ¯+£§üáP$\‘ë—JÏÄfðr/ZøGqÅ7¹Œw�Kø“e�*‰IcD¬e”�û$ì¼´AªÁ�œOÐÍòö¥«Zðæ¾( êë»’xQûïq�ìÌÙM7Œ2o>UHøAMñ"ÐkW_ý+½c’º¿‘~–¥bj04ÝkÏ¢™ùD<±Ígžtñ¾0 Øýn:ØI>»ÇLöz:�AÛØ{)A l+Î&c°#Õ);YùáïôÏsÀ×êý8P´cA´HœPh‡­ô<;ªã=ÇôðÖ_Ã7 ¤·ìs]³Ê#ì0‹/¹z³4E*=Œ^,Y�[§ôÔm¿:ø›®ó/<ÙÈ�gA$r-ÊÒL™lß¾|=Л¸ëa°É— Š‹ÃQÄÔnèq¥?B1N?œLù.'oȰ¤@,�!´…úO@?šÒ„éµ"±(Xaú6}È ìŠ¾äÉsm»4§• L>Ô!{ îF±9@¬³ê©�¡eh:MgµÎWf ¡æekÜÐ:-ª!J¬Ã=ûEM玊]ÔÆ›Ð�bÿ,|ãvc•�6R5 "(BHÖq.MÎâÖ .¼Ç‡A:8·�·øå^¢ ç/DY_¥<(•¶fÀPªl= âLK kð·û¶«êˆæ†²Ïm½å'Û_Fmqoª€=E^ ð_@÷5rEäl|¡öXÞ•ýæÔ/s*Oßïœð1“[Ÿy×øKÂiÅ _cY±ƒ‡pÆéám?»«`½ZcçEêsžÉQ—?÷TôCõ&úxHÆVdüß&ÿãuUšlpî&‡Q¿ó–h¥A;lp#U �Š9Yk…Õ¬÷%!ývûìÑrBY÷Ÿs…Í}¶öSX ¡�QÈåÒÒ~'Ü(Èâl3ÓÜx�HÆ¡3Ù¿”ŽC`òÛ�/D>šŽ5кUtâ]Kô1&­ª·‚W÷v/øëÑ†Š¬ó#‚”8)h{Ï\¸€×’Ö/W,—òù€`»ùû9ËïCÀ÷:ØPÞÈ¿Ú9ÿß0æOéã8Ÿí¯çíÐaBð%ïürâéܺ**©Ž]ž6Öò&6£– Õ\ž}F•u�HÈí&  É½?¤'.ï”QbhgAû�©C^O±¾Õ˜�Ñ™zÊ{w猂T  s º²g‡bµ ,£µÌÿ&È · 3¿`2\„Ãp6¸ÜƒpÞý5quƒsU`töÂ?fÄJ)n”ÙÝݽ—.H#Ž»œ›ÌåÇÄpvx\# #ÉMÿÏ+­í{ö—Õ7cZ „+aÓ›¯ƒï”2–˜�ÑóVë”Í+)Mfªæ<‚�ßdCrË•bmM<å§FfúyûÅ©ÃuTÂ-ý�X°-¾IlÌ/ò×ÖÀtrɴ̆ӄ'M@ÇZ‹�d�Î�¤—¸2³ Ðs¹‘ùd±ôQI™GÎa‘ô*Œ º<æÜ�¼Ü­RŸìoXl 0å•s‹ð°sµÀ»‚™jK1  Çƪ_U3ùÝ×á6ïû/ÜI´Í.È|ã’’]‡|_‡XA&WËï.IþÌ”d׆ª‰RCGÚëgÌw¶KæðÁõPkÈ)5ßú oo~ÂXõ”X`ey¾êà%…ÿ‚±¹‰œA›ÌˆB&f—EoJ!…hÒ—k>õ‹ó›ó·¦B£K 34”[å¹ÒPT¹Úî¾~ÓVtþã–oxuñ®SÞ¶À3¨hª4Ot�b^}úžwä [ï}2"8svkÃù1|�Cüý5Ô§_7UB?jÔ:-±4 i»s‹ÿè3g¼>×@áQ$ÈõÞ¾ 65v1Ésô¬xãbÑR’idD);¾#ˆr·J�ßæê/+HhÒ–¿IœýJÏ�MáÛ«9Ð<[£[FôéÍNe=9JgzMýð9?ó×^Ü]Ë6©±P]8,ãlÆ2Q, sÃáÍ"6-X¿Mmt të¯à�âì•©8°Ü¬®ƒd9Xäâ ¡%AÀ¥@]7)g·ÜËó ù%ÐüÇrÀ£›:¶¤ƒÔØ–‹¦»0¤è\¿.KëÑ-®ßØŒD]÷ê|í9Ȳi%4¢LB30Ã"õËÿ‚aLc±ÃâJ â=â\¤4›,� ?!‘Ù Rô Æ™ºo½zðÝ|¾»©:j5¥í�iÀD6§zn{ ä�c׸ëÅ ‘ñÖšÜWipd]þbËß­ÕÊ~Ô)8¬‘š„ )^hà~`?¹ê‘UUñˆv“5PÇt¢‡ÑÕƒžË qΉÑ1§°•Ý/DÀ2��«®¶w€3Ý;š¨â½p¯J£Â¬?Ùþ1óóŸ‰É6“®kS.S~µŠ�•ˆúç5[`ëF¥¤Z±äïhüo!$‡¿ð®5\ ôœQÔ?Šï2�ù§Ôá öU›7ÞpÏFÔ$iÓÔ/•Å\¸]WݯÜfãþ¨vL|“ü§³?ÍóG‘8E)ôuõ¡0oëˆE¦>žgp´ŽXTs]¯|«Š5?) ÒØz“¶[€âéTž@ßlx¤ècìFŒ©-è¨ h¸Ÿî`'€6wZçMÈajÎ6(œ,F*¨�Lo¬Œa×�8dk<éf”ÍÕŽ&zÖepÂgµ�]¨Q`Õq ¨†LDh!ñp<®€DÏü+nzÚ"w¢CòÃ7�â‘G¨ái:žÐÿŽmì´ý'ˆ_2ĸÑý Hš¡ ÷Í#»%¤–”?(Õê®ÜÍ6“]د~€’c?Êò÷y­ÂÿºÆ„»2 ÷@Ìäˆç×½ÊÓŠ *PwB“]ãi{Ø]ž¨�àùžþØ5pE›Çª5nˆ`ýæTq–€S‡mÎÙEŒ©¥À\Äwó˜ò¢þñy<.ó8Gš!Œ•)G¸q° ²N¯òB`2y¦÷xL7¼w„5„ìö]-¡ã:§ð%ÇÆo"˜¬d¨N5lÛôf@©ùÌË%]Z‰WÀµÊ…h!—ý¤íðð½Õ¯É üÉ/ö Js�3JŠ2âŒ×LãZ÷·›^H/å0gˆ?B\šý3—Ý�ÉæXß�.ÁOÑ©¢v"þkâL' AfÙüÃÅž�˜žm?‹~UP²ì*¬ðÕýbYd+ûI16P¤Zr)¿||H5§½Hj{%JT]Ò CºE€¼íÃ|ÑÃéDÓ¢/[~ ªÝLK/ÈÉÎFrO<½¨¡¸Í¨e³¾„S‡§´áEOИ$ü`¾I�ˆ¢èUP•ÓÊ«¦OÄÐ2ʸ®]X­×Ú¶ÈZóø(åýßìW_Ëžø_ÖzQT)ž¦îdF•3¨@1†®¯H†ßùx�P<Ošr‹Ö¡î OãÓ Æ[öò#Éé =úŸUéÕ™Ø-/nŠ(¬?Ùˆ—,·µœ(œùz•ÿÎá&u�¾ÕÜâ: —ܱ�ž‡Á5¤¡Ž?øíœÆ�êHtÝz­£L^Âi/G]ŽðœÚж_ZÏ9ãoY½¼…)Î@ŠX�¥»ÞtDdZàÊ" á‹R 6ù' ÜS5thö0û˃n²˜Á–÷컲¢B~ÜÉVbЕñv±@ ¬ÍÅŃ6øµXÜaq¬¥ý3S$;�8Ô\jøt¥«¬ÔŽ4º°x¼@[óÄ•ÇmTW"±° ¦›Ñó_äûÍó:­)n‡-9?âŽSâèìü-ÌåÄöÉ‹8ê´Ö.%Ú”/xÝ (-Â2—ž\ž¥_†®`Ÿ±Y€9هŞ~­ú©Ý>äßš¬—÷Öã‘¡·Y%^úבödÄ[&ü´^i¼¾¼¸ÛÍ[¢ÔyŽ›¨û_·ëO\WbúÎÀ %"Ù&—¡4s8§ lÝ rÉ©_ ]„…?8EØk L¤g0Ã%¶0~ò»¶èwWˆ‘ßa²àê'ì&Þ!¦JÈÌ�;ºÜÏÛL7÷ŸQç&\ç¤Uˆ¹‰±VUׄåèþ@‹Ï©§KQ[1¤K²Ü?L„ãfS%ÖËäý{oº±¶¬ïŒRq)ž©]•±»¤Y “~Ü«^b9±RèÈÚ~Á=�'}ÕL(\øLœµ¬‰qÛ/]<´ø’U�I?f|:H¢AÝXgëÐ=‚öøM…×ã©á�Ñw¢"çU…`g¥ŽÆjþe³ÁÌ�,tÝ:ñû®U‹TN±\F¢5} Û¨ð×%±ëËÚÕG5äˆïÜ™¥ÝÆA|oC͆Huž¸Àù‡�{n§3?Ð’§$R*¹ÔxŒ{ÑD­qÊZò±�vÉ|º& �‚t>‚-¼ �¾´ß#gÉ™Hv˜ÕÙSœk#äÉÖO<·�Ysݪh ðeU.8m!‘¾ì·ŸN$vãty½ö_ÛS…­Ôáã7Ì!.zyÍ2LÞòˆt¨+�×—´Óu]‡)-òiÙ#‰³Å#Ô$Jïx'`,FÐÒK�À†Í®×AþÓO¼Q¤$ä@18;ÖÔ,}Ìc Ê�¼*›t�@ö§–ÿxêÕÈNÁSl¬PsIeóËwÐ:~�yÈsRDWAo oo‘ûç&˧>h}%ß!e16@ž&Êͳe}àHV³âЍG}\’˜f Â@š7S×M¬o`†›?/6 bq 5Ê�½Ø’(£ÊŽÍ´BÇ0[œs‰É†Ììã6kvÁ.¥±�Þ–SdRùÃCyxõv³¿ej©.Î? ýa&ePßœäœI¾Ê0ðP)¼Àú*Nˆ2‘ŠBFÂtëç¡Ýî™ÿ¯„˜…'E·Jª[C7OÖå¯�ÅÔy/D¦çÇïÅSCDyvÂÞö4³Ôíܦz5%H QËÂÄ!=…òZ|š²„Ûæ7U…&.í^ �ër‡cßÇ]·@ƒ>ÉUÿ°jT)2Í ¾”8 0]™üH9}Í•½X™I2Hø}ÇݺÏãY¬ï<¿M'N¸¦ÝIG¡¹ë{Þ¢IºÝ÷%1H ¹&Ñd³c~õ0…¦ñI²¡çN 4-¢®Vl®ª–»´Ç›mÐðËR¸3^‡m²óÄm˜(î˜ïÔ` ÎüøÓ<¨¶qeãMâ¼J! kà’Üðµè�Æ€m^õÏ—hL‡�¿†ÖLsó@aê룿|‰tõëL^ö±�> ­»ÊO£jDÙ¶ F#©vîŽgÌišqÝät¹æiËð(ÉáFwóHȸRèÁ—KxÆ£ä!ãÎïª%;ðPœÑp¦oÊ™d°º}œ%ËþT×-³W,J—ì>¾Œ�ö„•›v’ŽáÙ.Dy.w|lPYõºe4? ªÝ2ù“ìqW)Í A}ëÿk{­mÓúV‘¤oû|¶úo�lç.ñQÀ»� çþj}¼·s&U”µp®ô!j—Ú’.¾¢Ð!þf,¸U¿¢½.m‰7'Bx½Ê¼,ÿ/æ¡T)½�ä², :˜û5¬_b6²€0úÆj«þù'÷ºhpOj[p.,}€()JÊ}�Ç}¡ÔFŽTyø�Z)4…Ê¢¬Y¢‚&Q´â[é´lNÇô´pê#ÛªxY’8ZoË—;cÈ☎Kcþ#š.E~™ð»Ñ^É­e«Î�nô÷œR­T£²¬¬ê8ö‰vhZì±í}Ä<~Î�ø¨019™Ù9|@ùï ÇŒ¬àyJ°….p#ÆûhÀZÂ×'bÃ#Hšøú¨ì¤FQx¯±§l:.ðvÈX¸2~¨á²Ë+¯Én‘eQ¹?Ù•S"?úô¨ž!…àX|údxïóºÛž|NA�Dб¬æ tžÄÖD÷®éµªMço>=1nƒ¨GW3š*4Îre`Kòzö±©üAfÒŽD‹1yC¦Ä%5µ÷¨�gÏã ñ@cÝRo˜\Ô¶jÅ¥^ž2 †RÒ¼,‚.?Õëêð91Õ"ÏÔ�dûYúÚ±^“XÜ#ØMnB)°æDÄ4Ðð¿y»Àç˲¯â.ØmÚܤWþiÖBŠ5´“úX#mDj¶k ãî"°¤§PpÔF©5Âg½‡ù,Õº<Ì\p<+â|L4_œÝ‘ó;‹ €U&…Æ�;�T¦Àvj§,�T-Sc†ÿ¢K°Y‹ÖèSƒn¬ ‡;ú’Æ•^ð�v§�‰…©ðëWR�«f*jí¼ztê8 <ìz¾ø>Š–p½cvðc† ¹!�¤«r2Y¸~ðçš§\$ÏŠ-eT›[úrk(Oö GÌX1C·Ý*âòI`Ê»`ê’¼„¨ˆ¥—LÜ^úO²¨±$•òe:è²± Â,eûD”%&íûc€µ¶f!òŸÒTw6›ìõœæ™¼Áqû—TØ3B™ÖVëŠòb¯ nýP�ãúezësºª±œÉE]1�4GŸõÆò®ð¹ìÓ{þÞ�¥Û")N5¶´¶¼CQ=SÎkäú&ûAŸWæ$+\Çüž»¯`†?xœã¥ûT2tæ¤¤Ì QA +Þž¹iÀØÞ"Ù…þ¹É’oxÎ!š�eæv(õ¡ÒRw!ÊPö M،ְìórÛF7—ôd³pýâ83�+ƒ™Ï0�'ïåìf„j’*p¤ðÔõ ò܃Á ‡ ‘æËáäÖŠP3rfÖÚTr&늮ðQ¦O¡ë[V:S�HikÛ…³Z\)Ùª"yƒÿ—;0AÊ»õ¦r(†Ñ·GQ»·t0ÎI[DyÇM|(Ž,}×(å3•çg$b¤x+È�Ï@ã5‹KÚnJOè\‹E¤OE÷—à±¶Ì?—üšâ Ì¥îe+¢QŒFÓÎ;W “Gɹ¦S•KÑÉšÃ,Ö±”·ÐKd Iò;ÚÍÑ'V\WÿP©ÄYYW­3ÈÉzúºA»pæø½×ó²Y^ã ÏÍúÖ5Ñ?gMbªŽ' –þ�É4ÞzšƒÞOÜuûÊ·Í2 ‡³uõOoÌ †Þ”9RÏßË÷»t“6mQ q<É�ð~ µvæôÅUL` Ã?”¶ÉÐë·JÐõ½l‚?ü'ßX ¯k{Ó:m-+2Qà‡>…›H/AOÑ·/FÑ<‰øVÔ(…œvçaž½v™sT$• .þjÜÏXƒGåþnF«2éz]œ;qù >óŒâ:aO7»T=ý±ZLHA´lê@ìÊ=ýçû'¡º§µŸ#áð¥Ðê¬ß�Vl%´³¶TÝVr¦¹®—t¬jb§%w+É€ùgˆ°Î:ÆÊ-”m³‡ææ‘wjƒ§Ž„9¡¾PIÑЭ¹ŽŒwá/*Ü´_ªª8#Õª¦Ê9°5 wDøáØcèUbÒ°B™Ü™¼mDßzŠ%y=Â?� ßùëÓû6&X�û›ßÌÔ?›"µØ§`…ò©«}tá…§.Öñ`f-m^p‡ƒÞ;C#~Ûˆƒ mj”ÇÌ;³­3,/°Ÿfq~cýg~]`�»Ï5F¨_ëtÖ¤�KT|’ìY¯yOn\}ÆFó¥¬{îPƒÝöüàÅ�û—™þ <ŽšgÀ€3ëýc>&ô¬— †>š”\ô³õKS2—:°ÕË·³‹è ­šJ5Ë@9Ì_£³<\§uDYµ¦imšbÜ4òÏVK­fS¬ð›y•Æ�`‡d6ãÏVæeÕDN†³ £8–¬¡1õ“dQ #hý-¼Ôåª[´¥*Ê^‚O_Äi³Ê�y±-ÐC³é!ƒ1¸´¯Ñ~SáÏŠ Øà¢ÿ%t\qƒ‰“5¥9?ÕnÀÍë>´ 4’hÄû Àâ«ó‘ìýH›TŒ}Í®®±Û¨ýŸÄzAPšñ-üµç‡>ÁÞì–ýûÉX�,äâA€mKϲ’7J˜7¾Ý¬šH2ߦ*IK©åTi+ˆ½‹]¼.¥ážé¹ {(ýÄîŠ0–8z1ë'_»PŽeT­Z—!�U5wÁ™QÄdÑÍŒ{$.)(Õhi™ÜêQ0¢Ž6ïãÚl *_BžRz"®ä't�µÛÙpòY!ÒôBn[©ÉÙ@ jõgêgî©Æ‹õÍâ™Å³<ªSÂ#³%�Â}æàEz|>¢\D€ulèãêêïòä^š�‘)0äQð>±œ{Ê0S£žªæwêüØ÷ë¥ Æ³4(^Ì�ß÷%\‚ÅÉ×1LÏýݹEuu¦À„-8øN =Šª Á³†b€+²Ü:–Í‹{¢•n=ó×t º†€å„¢Í+€]•ÃóA�ùkÂò1Qä8½Rý¡É¯/‘°Ù½1À%Ų� —…Äûº‘ôË“´ÀƒèÅzKN¬zØn”�{8ÿPôÁÃSÐÙÍ‚Ò0U øúšnÄâdf8òZ)Î;u‘f/ê3Œ~â…Nà_û©Å}ÒLÚ”åWrþˆà-*ÝýPIˆkŽŠ{”*s† ¹ $¾8÷оÊ�6/k—k*¯?9ö¢ì´X¦á¡)|ŒQêóä}¡ôŸœ<÷ÊÒR,n¸uf¢+K/âhª³+†löUŽ¢«¯ qKZhçù9|$á+}Ÿ$%clQV£!€«ÿÔ–W]»jðS•STê$} �éSO :†õ0–üÏ厪Âj±µ‚ž€Ô8…ªmô8¿Šü4tiÚq_õáK'n=#˜ÍÇ9fˆ“t�Bò¡n“Íüún��Î.¢)ôC ·kÙÛÉ D.•¸‰»òƒÛ]¦Lu°4Tmc²N³w‡×rʃêO»4£]µO‹š¿/¹’ÍÒ�àÈoŠV—¡lWå£[ƒbéÆ!Âia’@,!_ ø¨;¬A{…@P9<ýCÞ��\gæÕYM…v eÙ¥úz¤TÊs(K)Ïßž™>9‘3mÐràR¦,û\ƒÕ¿Ò[H” ¤›ö»u±Æoq¾O¯~¹J·ñÀ!S˜8‡Ý@IÕaã„"�ÊP¿½!(XlȰۣo7äë˜×P¥ËeÐú6—ã%td$ØMÄoЇ>DÈì?­×uà-¼¼áfñrÔ ñ¼É¼lâ(f¹[01ÖðBaj»’'Â16v¥úÄ "Wzˆ¿wtNÓè`AÕÙ3GVÅÜmŸlQZ óp÷ÀëJ�° &!æ:/ñá‚`裖dÙE›`€TüããWÞ„ZA8ŠGy %Oô£ øú×é6¦Þ>ÒäÀ=L^˜8Ã{¤�§v üEpù^B‹â.7»íTßÒš��0ã&iîÝr‘„ЧcÙÛ Pî+$ÍïÈhpâµ4À.×ð �ºð¹ s–Lo˜IÕ¾'Ç¡´¿ öIc?KÉ÷ßÊ:|¶ë°L³£zóN$ž!Þ¾œÞ!ä(A*¿ÿè¼Øå^½Up¾­DâLÔ/‚blŠ­xÁßV7ÊŠ‹íóÓæ¥H€ò;x&8ÈÇlj>}�« p›´YH0å#]Eò•Ì •gc¢-‚_…z§ ’F&S;2» å"ªÄ7úûCÙ@Ÿ†Ëû{6Î_…ÿýucTVÌùðÙýÊôÚ�A±Û«×XfK:¼¬’€Ï' h ÔÁJš•FHÙQʯï>•h“NλQ‘Žeæ™û<+ ÇÖ�Œ¢ìˆÉ¡ªü#CYí¥t^ëÞ¹Í*.:r«þr3š.¾û™Ioºi‡Ñª½ã~­ìÑ5NÜì’žb¾¼ÿ“2meD‘=߈4RÝn‰¯Ž§5ê}JÆN�Ãõ'�˜—�Ûܹ‡ôtjÍIDÀ°Õ¥’Ы\? �lbqÛîá~Ûu,C8𙇆Í]Pš…»î>¼q-E4&ša…nÈUöÄöúð òÄ-ã(%uÏ÷®‰uWjûãø·¡‚ºÌàÿ½-ø·º�tЍ¸Ô&@Çm-Ö{cضŸÈ,ðÒZZÁe½É#vÎçS"‚´xø¡�žQ¦©mÔÊ i´ž‘�ÑÔn38Ø?l†ZÀ™(רF;=E[¡ RÅŸ›û�Uc"5à?™_:ÍÖ¢wŽ7{M8Zœ4èÓÎñäoÑŸš6=§=? C,‰3½óÆÜþ&éôòܘÛè�دbV;§³€_Ê ¥Ó¨µ²…Î?^TÁ“6cíVóš.ÌÛ„‚ ZlrÓ�ÅÒû¸’/%{)Æ ·üï!ñ!mwAŸ½Ê(ïJŽw§dŽoNO„®,C¾ XrW%~š|@Ôµ¡›ŽÐ6A&Îr®ªý¯]ÅÇBè‚÷÷'În1[yDÓ�ßWËrÏ.^XŒ!Ö¦’¾õñˆá9¢Æ›Ô©Úøn ŠÉ—TLï°£` qÛè‰õÖòHÈÒÕƒ>é-1ÅŠ…�q ìÒ�µ5ßLÅŸ˜— ð¬÷Š hðNNØbfÖ¨ünª!ê($Ü»K`­Ƶ¾äë5KÌ̸í0²‡Â#êÛé–l{=“S1Í•œ%nÓ<~½(Ö¾²³?pÆHÚÐ|½nqú[è^Â;oį«wÄ< ±™ï¶¾ µ¶ØqŸóò.ÊÁÎß"mR?Å%Å�XFͦ©åbÏ>M^¼lÇÒm�!'#'¿%¬[1½ìÚçàDž—Ar6ó¾ýQ¡��[Éd‚”¤“™ÎÒ¶-ñ5‹Üj7Á«WgAÖ¡¯V3í厴O'>›S²,ï¥*áÂëBStõ)gE¡dè‚Þ€@ž³È…Û)O{m7ušO¡†ä“±œãN¨ã¼i ÿ.~'¦‡DKú\~W ¼¹¹ê±ºÝv*]ב*þÔû¨Ð®×¹dI°fßìT<Ï®\ÏJC¸u&#½W¸P¯c«áêµb9È`’ãYÐ;¹ þ+Ö@´VöŸ9ÆüUHÃõÊ’¨pOÃ-9˜mÙâvYàõŠ+?HŸ¢íâŠ1Ž¿S ÕBD5l'°™Ñ5sÿ»g-¥¦&­C ›c�N±“ÀmöâÑUø_Ô–»‹*éÀK3Tn2·'ÎMÖïäž§ìÈ!ÑOÚéµ?šŽË¦#¨zx튚×AYû í$À¾vi ´Ítp* ‘!šU@„Èh[z#00mý‡›*Óx6ëQÞÃþÞìæäK(q £¶Ûc½à\{±Ig`V….Ù£GÈáçäbö*æK/7Ó]eEÔBhÔåÌ•UyŽà³‘©»„­©²h@Ó+øEg îôÕp2¤u�{e•ÊÔHæY @ P¡�z�c€™ÐØC-&.é|æÏÊ!61©T;þæ ˆòU,�‹”g¶rgcµÒosfK4Š÷ûË.jÍøBB» IÕÙƒJô-ÝÉÒçð劗KuÄ+³aòÏÝH¥Æ¹.�;:�–ܾ‰”hìÈ“¤ÞzÆÐW4Xp�”õ==o†ƒN¥4¶‡v¿ˆ3ø¼ðK¸"z”ðìü à…ôœ3Œgº>¿žKWí¨#ŽP ϸ.èŒï½xÎÒ€ÓbÇŒš]U­5öö޷陪L³­Y×\aÍvn–øú=É÷ßHh…¸:²ì¸7F ÷@GÝÝVýa9¿õŒ<’º­•Vº ©¼WÝéÁÉy7g ÆÂItñž%º¯áÖêRQZ€éЧvŽ)í|òh™ð;žÞ éîÔ: j‰£9!e¦•ç¬T|ÍÅ×,#ëV‹ ðiÍKüöÒj:?Ø3H¼"¡'æÒ"÷i+ qk°�€[e£N‘_o 2‰p†/�×´ø¶y#¦N’7 ÏZ>#Ì)� ›0cɼ�V‡ZÚ®.§�Þ“0žiTº’£Ý¹¦½1›¦BŠð^«¬¥Œ€[ÄSR¢v„�æ8ø_<„¤ñøõm•-òb¨-gO=‰½RØân`R"íøÿ4I/Vi+(oמ+ÂŽÝù^]¥ÌìŸ�åì»›¡mí#øf¬ùDøü¨�jZ>�šªÐJ¯Eû¶ÿziùR¯Ž£³-¹AcesSbü,W ÇSØjÕÖÊ8ˆåULµ.ÁÅøbßÐâ"õjùíÕŠN‘˜Vj1ç �¬îÚ|S#]ypý~žN¡nWÞ�úôN�€…rq3¸™l©6ز�S–’L† �RÀ´f©K€Ž&It®';õi?de8ÕÀvIúeA©„#ò!­�ïJ!¶û~"N¥“ˆÖ �ž­;`$ªl˜«ÐÐ ÐÉìÐ'›]yO÷·ÜïâÆ 7bZ’© F9×įÍ&$i8„ÇØÖÞÍΠ׎F|OŸ¯”ýâɧ®bö蟀Õ#èϰ>ü Á’š/Qr §�•UÜÁ–»´OQc·V±ëÿPŸ×ù|Ò…æ"ò³¤ÞzµC ôL¾È·&¨@!ª3SÉ/öV©R„ó$ËÞÛeßvß6Ö�E.¤ÅçD§4¬Ð¾-däGÕ%�qJ‡ó‘©ð®Ë}O·²‹™QÝ"¼Ý½š9'Œk†¹J͇I°pKÙ²á'Øò›äé¤{š-v$ôôôú÷Êo¢¬®k¼ª4[¸ø&ÉXÁØX¿ÿèß—õ&ÀAXÈ1{´d QÔ7k,¢Y“”û¾)–ù�=“¥ ¦q––ÿñæu´5Sû'x¤ö?øF5Â�ÐVè…Xçõ`\ºB$tD>Ì å¤ÚÄ?2ÒûÁ¼Òlï/�zo¹F$ég¼ÞmCb¥-’Ë­ƒ¯Ã~ÝJñgáµ.íÉ£\L­h,ÈIã0£½èác¹lêS,a=¨ôRÜéAûðÞÆ …”"­cRFÓøiÜ©¼O9š„"•w3E�¬é °ì‡$°(WÎb¢�¯#ŽÈ«Î4¾‹ N-ˆ$k´a¯ÔháõIÕ¼ŠöŒHZPÚiÁ¥Ìf3ª!áæiº&CãIq¾XóP6ucMEªÆ@Âùø`;œ”��n"GôsÁÑV>=ÎPíÉV(öS�ë�¸îSt1«N0â ^ˆ uÓR«àJ¸«Ï0Þi,¹F¹·B&.Ë–G y]o'êBJÄÆëgRY[Ô·»QJ1šÁw42ÊäÏ“Ûp[B𛣠øAæ'(Hæòº4xZÅ>Áß�kcOf´§‹h¯ß)„¯ˆÓ ‡Ä:ªÀ<¹ëÀ gAÙìÔgu¬ÁaiÓÖx9º†´è°½¦0âbLA×ù†Db¨Þ ÞƒÂ �¯G[ùÍìËÒW6c«ÀOôê¤0«'µl†vƒìM{»qÅШö* Ø-£¢dç 9#ìš u¢Ä~”•!І�C1’N¯ 'ðÐ4L“ð.�Ê{XÛˆ~,úG5YM=·ÆH‰'2£òÁÓ;LÝÇ·°; ü´�ÃÜ97læÿuJ¤À§Ë|©Î€æd>A…g ¦‚�ÄÞ­ùÅRÓµSª•¬¿�wgº¼Æk›ŠxaìGú*ŠªYÌJ#5mEß…Qy{ýÇPÉ.gÒfy¥;Nó!¾±Dý¯~Â$­¹óN‘¡k÷8º&µ´´ ”CLS¦Ð*g)ö­€áhÆ©ÿptbÌ}4#’Ë)­ã¬¼T%oÄg¢I¨Ò{c•Ÿ;—rµÍ &bµ®z+(c×Qù×GIF˜öÑò½ t!L)ôh‹MU´ȵ6;€2fIäR ’ˆ£˜ 84M;hk ^k“Û�U•1Ëô¨¡ó'�$Ò-A¸/‹ÃÍâhˆ¦šmDÿl½fU‡}­çÇnØ á@†<÷y}½FäÀ.sš‚uì˜ð½èKT“/õUÝ$–ÖÎßµ´!ì<ÁzcNÞMé‘`ÖÑе‘!§ŒXÓ(2UF£ž?̰l¸EΘ­‘Þl mä ƒÆá‰† �Þ.džÍ>} Àx)ð�¢Çž¨7ûæy…ýÊÑ3E–µÇºàK§A%…–×”\/΀Ζœí¨®ÏIG¡«HºÇ|yIÜ—ë+Å%1Î$ê:¨˜±ÌVJæ|¹<~ðG?W»E=„çˆGÉüSw!YüTmÚ¾®~ûÞe¹™‰)÷cVK2–±�NéÂ:º½úB’½öXi&„ÛÄh’v¢4^®s@Õ“’ƒˆ®2 —BË`Ë^ì›Í°qᚩиL&œúÁ¨G—ÀújC «åÕfBššùßFù^tùzbwå…X'óþH.>¬æ “FF“cªQÿ¬0 Y¤»´®#¬¯jNEzTG=*¡PÊ-ň'> êDÉw1çéé�¯ê.Û拓 ÇÖ\®bŒñ0ÞÄã'±µ[cç6Ÿu‹Eÿ7fF¯ø…aÅ57Úr\ê̽�x¨·¨„+â¼F÷ \¸é&€,_‡gÈMÜÈ>ë1_JM'™ºS™¯~A"€M 6SÕ�ÛåwûÕÛÜãZÏ¢ŸÖÔ$Ë�µŽµyâ‚bÎLu¼¡‰ŒîŽÄ�àêùö„h‚ ¸÷â8—ÐÙ*x¦ï²+@Áå·PPÂ¥Á³aÜJ­ÀéWž·½êhODÒê½ÍÞëð)^‘Öa)ÍLòJ_D½V¡Îýâh•ƹdÜ�©ýèÍ�âïQ›©´c2ùs¿t"ä�øº*ï*“ü“YXöàý†b˜•Â>€M©ÅÏ\dp̸¼^÷Rïíy<;­: šJÏÆ´™A�±pW_ޤ“\þ�;—°ZA{ÔÙpK«[é+[_SvÍW\sãSž…&!83>w˜7î’z°nUm¬ ‰x ƒù]äº2>^ûå|ecYµH*9·«JÓiçÔÊEì�¨…d_n²c]80¶C ÐJ…Çf/Žš|O´+H&¾_¯ÍŒ³!qÚKåÿ½L4ϰMºï�ÇåéÜ厅P pCõÇc½æúžcÍÕ›Á—jº,5X!æ¤Ý¬òÁ…t¾|…< SרQKî½)N…­ÿ¶—œ¢sÁ­ôÏF€üØ�c‰–:½¶¹ƒ�טz¶Ê£•�{–Cy¿\ GÞ’˜ó‹Ô`¬sÔÒçYmÈ=ÛƒëRà™Œn�I–�‹µ)ru”�ñ:ca.ÈÆæð­Ù„…,£ÿ2«>Õ�ÈÈ‘÷ °&nñ¥Þ§n/Æ+eø›ºŸ7ÔÉkéÙ›w½ð9q¯h$´ò�~ÊqÂ3:‘wHþé½ú=G ›‚{bɶ€n!"F7˹ºC1 ôù"aÞƒbïÄÏD4€+¡Z{ Lø=·¤ò«ëuñU�üˆÆ�ºÂKHª¸£^‘Êõ�¦_C×’7ˆI—Ì;ˆ´Mf½Ì^ÂÄœÆîc}ßÕ—»4º€¾0†SsCµ1¢Œ‹z¦åy8Ñîy€†Öì;•ªÇˆ"[Í‚Clw½~=GÆ ´H}¾yÌĦjÿ÷Ù7âP#§”£W�J‘çá¾Þ<êIzM¾Î÷{me�l~ÆF¢Qu´�„6ŠÑOÂÿ¤Ü)ÆYGyfOÌÕ1�žù–™ÿž…ÿ§µp¦‹KËüÿ[÷NŽ!�º�|}Ó h=_£–jŠüG‰ø1 ¡ÄF_:&>Ê,ÿÏF1I¥f]'åmÎX"ìÇ�ÐÑÂÊÀ®3` µÆ˜OEãî3=I%î Ž%ddl à0_þláˆ�¿…|Õ†r•�½Ǩ-˜K È ¦`�2Í6tU¬ºÆe@²,Z^š&6w%¼ ÅÜÅø{J°\0@;íh¯ª�¾*Õó=%¿Þ›ŽñÕ‘ÿü‹°·ÀÃKAÐmûݶµ¡¼~Š#M+¯M)®¡¶7ÈVyw„º�Ý9�ãW3&u’–RG0[KAv°bª}¹>ϱ‰²±ëÀ‚DË{¦~à|+…ÄKVáá.FðÂv™˜?ÜÕ �ހŮWJai‡œOlÃ!Ï#œó0!ûd™_ž”Óa)Äè³Ç'oÃažÒóÖù’‡aÕ©qæ¯àIA¥÷•£à+2Ý(-¾.UÍ,«-ÝÛ\‘^á¿ÃCÑ·µ D„JY-Bµ £çDÇê·ÝúáßlÂ’®±­¤¹?&ü³yUfWB_#LÌæØä´üó;©í$ ñI¸VÑá+q¦ÂS‰Ññg€±7°/eöòk[hß,æ…2�H®†…{¡Q¬#R«Ù”n�5IaÕÒïÑ,D¥«qTC¸oÄ�Ø'À�×nhæ =E `"î¾¶š`¯mäXA¤ÕÀ»\™{H–i³¢­e°ÀÒá”N`ÖLÛÊ ²›*õ:Nëð o Ø:>¡Z%Þ²€þíú¦æ+v(ôÖ?["¹}¥AÞ°Ó~Š#2ôѱcm½ˆzŸ2…åÞ üDP-øÉëºuÛœ¥!¨à“ðE8œ^¶šS[ÓI4›®»ªJþÅṈ…lÃÙó(^Ußb2E‚k`’ä3æâŠ` ‘á}ÔZª“Sîë\Ølpº`,cã šSH´K©GárÐceccomp-4.3.1/docs/images/emu.webp000066400000000000000000001303241526046660400170060ustar00rootroot00000000000000RIFF̰WEBPVP8 À°�L�*gœ>m2•G¤"¢!&Ò{P€ ‰enüxy¨ÄÜÓÔ×’ÿIÞùÄüçõÿȯx¾CìÛáŸVóÜ÷`yrôé?h?á?i½Â~“ý�øþ›ý÷Ô/û/Üÿq?Ùÿãú€þ‰þ{÷kÝ7üçí¹éå¿iÿç|‚Kþÿÿ»Ù»üÏþÏp_ð?è¿úûƒÿVÿ#ÿÃÙ³þÇïÿ’¯ìßôy¾¿nÿÿÿæ÷ÿáí]üÿïYM?®ÿYý ó3ú·÷_ðæ¿Ìÿuô¿ñŸœþïýçö§ûOí÷ÖïÝêÿ“òQç_ÆÿËÿ/ê_ò²¿‡þáþ[þø�ß/ˆÿÂÿ`ÿ-ÿ#ü§¤š~ëþ‡üïøO�_Ê?›�þçû¯ýóäkã¿âzîxÒ¿Ô­ÿûËýäÕÏž§ÿ þgþÇøŸr¿uÿwþ ü§ÿr=þåþÓüGåØñïéë½~ô�ÿÿÿcïõ¯^Mÿ�ÿ™ûmðüÛûÿýoò_îÿo~“¿¬ÿÅþ‡ýoí—ºOÌÿÔÿèÿEùwöüßûWüßñ_é?jÿÿõ(œ›ýtÒirÿF7a�tÛÖêØ,�$ÕÆakè• ™«VBá˜N;“ÕÁ`LÚÚè>AäÞÑ,+H±Ð 9#…ã�ù<6 ¯ˆ`±Ûr³åª0ôKˆ€z›v+Cyø”ѽªüJVATDÂun5¬ÿ^=.�цþ%Úgþ'çE«ö.¶¨fó.2vèвèÔ[ˆ-"j,+ˆV˜"¦†§$õpa-”£ÇO–²n1‚Öc2è8Þ!ãj^;ºŠÁóêá­¼¬Ú$½ÄGŽzÍ/¼Õ·~ï,– "±}ªË‹W­1ì¬9뫱,Ø Zc•Y-;¹M«º…|vŽ÷´>8œ~~˜S;ñMä<>²¸:‰ì‘0Gm$2)ÙËA}žKÐ)c9_�6ÇäÕ´ùc\Îï«TÌýÜà&»­c—–Ç¥ CÔ\/º ßÚB²P.:ÅŠ ëY‡©1!T!i!Å5æ7ÊUúÕ£! ¶L7×ÖESñ|ñf3¡Û†“TøÄt¾×=Š);Eä@lxös†Çœq�Ñ»ÖÒâ:ÿåtP¶³s_"kû®Ç4Œy;¶‹Çm �NuNõ’)Ïê'}|�«ÀJ3í‹k' +øS%³?¸³,Hÿã�ßîý{Ñøê°ý®J�‹Æ0ªžh „V/µÏ)jW&{•>Ð÷16»3×üR·ÿ“†EýЇ.W> <êï¡(¥Ã}¨ÿýž,� Àò¯/¦+óY‹~a‚By$LI®ä‹”” ¢ à/¨7²äù ”‘èÜÐXhßhÅáüýÕƒYPB+Úç¯þ<él6¡R{™|+QÚ"vÜsèÓ!ù#J^/`? Åà.çRY*»-ýt ×–ÝÇ}‹Âùrñ�z—Ék©úY�$u“–‚I!'øz­Z(„O Ï!žÙ?�Q¬6§c²ü:��nvÆG�d‡ð»"¿@X,#"µŽßX¾×=Š):âp¢�ÃO‘ðöi£5_Ã-lL-&v ªv7¨f“$\P;À²Å™ö0Zü¿VèJ/v(9Så'¹�­R¹ñ#PæÖ×RØO´rªXj†â´' t! –ǸLÉGãçÂEoabÌåêÉj5ë>)û»)‹ì‡~�Ⱦ°d E¤È{Gz'y=ÿg“(»I{“‡KísØ¢–ú·‰{>6úÿduOd<$;ÜÉ`Ý©¢ìO½ÖdÁ•[Rêu~¨÷FÌ¥ÜA¯óq¥úµ°W.÷8Áú/°i3$0Þäh¨!‹ísØ¢KTº‘ÖWªp›´šò]Ëš=ŽÝ½odöª!ºïwØqÿ„©�æZÕî íFúN‡¸¨¶½½‘K~(‘¢ „V/µÏ%Ã퉜a°t›�l)§vÇ÷AE;ö´(O$‰JØúí:öÆ¥£AƒÖ±rÜ)!²5+¸(Ú=+‡‰[WÀN¬ÙK‘¢ „V/µÏbŠ[ë ýѨ°Í’uufÏÈ“¬?*fá3_ֽ̪¸·¹PûÂsý9]>ÜóµÚp@»\ËÅáåhÛ}þÂFG=Ub‘ó´p3>S`ùÁ®µ·ñV±Æ—“̃ÛFM„÷\à ÁN¿RÏì¹Gsœ<úLÊ�ÍžJW“ž°Ä†vÏŽÆGDÁ˜nTMÔy|ʶ‡ÈXµ,P èZ¢ÔÎŽž‰B÷ nwc‰< ½À ®6¾¼É†ÜÅÄxJlºÏ°·Cyáhß‘5sÁ:PL!¤ò©z_5ï7÷ilÊœNÖ¾éòGMõFƒ¨‘1‰SçWFˆ["®¡×]ÿ!㪵g"Eˆx°Êµ—�˜ÔÙÚ"ïª)€lÞÛC"З�â§8dOÎaÝmùCeå…hl c˜¢ �HÝ0«Ýœ¿‚`R7L¨�þ}~Nž÷ û—+#,þ5A¤*BXúí\•X�ÝÉöMÀÀ À{±±cø°+"ãr‹•È©zûŽÏXh‰¡¡'» q³ÎgÎ7«u\ÄÃ6dZf ÿF�ÁoÊSKs7³#<£q}8H”€ð/aãG 8>±ïŸ‹É>VÕg`”¦0?¶÷ ‡íâû¨M}öönùžD¨¤Rj@¸ž0í=Ïn—j;î {/×ý­Y6»D½8±|d™‘^jÏnБÎ÷uðp4_7‘½5ò£ÄßqØØ„ã�NûnoJÔ *8»n-Ô@D‹XxkÁ+BùLµ�µ˜ÄФP¤ØÁ'ˆ½„üwìknÖO#vyVì-)ÈÒv~chJì÷Æ�϶F.o·ï¤aÝlÍ:s�}-ò çµ9ñÝ‹8›5HêHÇæ@eûÈ.Ñp¢}X–÷¹‹ ß<�i4ìws` {Å §…þ2r2Aÿp/94Á¹2N|‘Éß,³Ðy[ŽäÖ„¤wžH{v\çÉd¸Ð`9©I?í13t2"4±eu» ¬Ìvmb«‚L;Åj¡d¸ ÔrŸn?ðçø‚§�e>q%jø²‹šÇ6C¼„ æA2¨‰Bü £W¼[<# ÇÑ46(ùsX0ÿæ2Oˆj=ßè}âT‚ö�­âv3û‚Â@°±âäˆÍñ\[úƒÎø‘ Ýj­§|Wð ?‹Â3fú·Û–Zl‚È2ÅWâ宜!5@ ‚CøÐH;Ýô—A� :½êÕqœÙÆì¾„ó½Ú�›ÃOÂLÛ—�0Cèåɦ™õ"½8‹GŸ;‡ÝòÊ<¿†§RÓ8!““vÏ“åõ¶s‰»:HÍOk¦kЭl2K�;ˆ:ÿ“.úfÁi·÷<Š‹¬¹ã¾åP‚;ÿ+€\>ß“‡{WøåÚi©Žš”dð+ÙÌ­×IŒO¯+eo:Ùˆ !ø±ðºp€¿ºñ^ÓùËMæƒ&û€%ò-ÌAãåðw:Z0Qi>ñÌ%¥¼-SöM{¯›€Òý¯3òx·þ&J¼�t*õf^«<ÕØ¯À�T£Á¢‘ç…A*ñ'cˆ ÈhábÀµ¿I)€¢3‹dñð‘F¹Ôw‹¾§ržÃ¬š¬ íÍ™�‚‡ vÐ}‡m1‘Ì+‡"46DØÙtùŠq}?Ávñf”s×%#yñ'SÝ·@Ã�¿59Jê1³ Ó˜i“æûšlzÚÓz :•º—ä9Cß„ôt êpºv ÏÚÏŒ|/Ã`Roµ6¶«-ãXÅóxK|9õHwYœj‚€7{7öÈ�¡Ôö5=™©6ÜóªYN½ùÉåà»!¶aø­SÆÒçZô–¯ã±@‰4ÄËndRgýð]‡rMàS€íÞ7hœ]õËðµÄ_Ò�\·!ó»º<1ÛkñŸ¥–�˜_bœß銉?ßâ€$úg„ëÝpžµ2eZü¦Éã¿»:!èâÕ ²z¤£„„ cÈâ�¬d6Ø4ÉŽÑ‹ýÐs‡�scÚ·´†·‘Φ¨¥Œ' �o¿ô6˜ùWñx�)e©H¬Ð±GJ÷d{Ѧe�™ÔFX¬›w_UåN€¥„+¦®é ×IÑšÝÑ„Øx¹[C"ÇN<®¨ç¥Ý‡«)®ûÖ¿&kæcÇ�s?š-C±Ö-ÐéA%Pâ˜vIïDñyT¹ñP‘¡¼(3ŠÆJß¿CM7‡@ïèh+ªòüÒÙŽÓ�2@>ùî\àÁÔTzœâcJ><Ò¶¾¿�wçâ~Å  ²áº%+Þ'äî[)¯5¢‘~È)“˜óÛ?s! W˜S=íßq$†Ñ÷”¥tª"5m6¶æ^›mÏÉ­VLfóft?€…÷@¥KC�z ´ü�B—¼¦TtW%­>�~Ÿ‚©bz@¦Rí#ÐnOi’ =—vE4¡% nJ/y“ÌF´ÜÝ'Ozì}Õ±„ßlwþY¢ÇòRQ9Øvæ³/�‚�Ç’¦A>Yž ~lÙ*Õ¨©5”/Ú‹hÅ¡!CdDXûïÕ m„›¨ç®É6È�ò3—7M¶˜ýe ùZ…ËäBª”éQǬ¾hŠŸÚ$ÎuÍGIñͦÀ82Æ�nÉ_þæŽe(6~ˆ·$‚?ï³VÙ/Î9Ÿ3Ý¡‚H÷I¼^ò§¼-#MDQ;j¿8´ÈC‘ûL=âùî7ÆÄbåLÅèÃŽV‘VÝÞ@¦åªÁ$ËÏ.B¿IXß×É|òŒ"%Ž0…©åÏxЄÃ*Ç-KþHÎppZl¯½¶‡=jwøà#„ŠÊÛñøÑþu$Bï‘p¾ÃŠÈ|Ý1Ò9ëѸMÍhš¢ƒUÆb]™v†•ÓLzNԀ设zä{yln¶¤öÎ<%SVë5„CÈp·¹gék©ì–œÙ]®›nÍì›á|ËŒ�ûA¡Å±¿¸}ïþßÄ\¼Áá|ÒÒk$uS�vó£àDŸ.Jl T�—CBàD 6\„òš-‡tßžŸ»çÐ-Ç>ó'?>fIO@EWÉx”ŸâŸâÙ“[;_ƒo<­‘ÈŠ7Ù1­RN›ËŽƒ$zÅ4†ÚÎŽÿC——ß('cßi1nÏ´*´üÉ{ë$1F@Ï-GJ‘Ï(´Ù£³OU•<žh}"š±ƒÖ©±mžßFÁíìHª„­ÝQ`Þãß›Ô# Çð^aTCA޲gíʼn‘ 7­Ó?@m³¿:†2)nèü Èy¡8È'CxA·™Ò£†Ñ½ìuß(ð3)8ÝPñ�gwˆN®:¿_?ˆ4DÆÛUC/o¼uÆi�¼«Ä·.7AdIãn ÓMÜKIŽ"Ã]©RuÇЋ­—`!Ïú†Z&Àdv/Ÿ¬AŒ>ãaÉÌ­ªû0@=´N¼áLÆcé"¡š÷7òQ¼1G¬ÚVñ{cøXl‡Z~ðë�ÿ¥š:Ç¡"î|ú·[þ®ð•ÁÑýï¤ý%Ý®2K¸ p6ì-ÍT.Ù³”óé_Û&5†¦Þ"•ü]†+ŸÿÁWs¿/wø¿õ‚(£ÔWøUj÷ͱŠIz“Єü¦á«ÄuŒË„RÐ…áŽ74©“m™:‘ ðäÉvÚ1ïNnÊ9�„»¯½At ·³@TïÿM[¬8ši�Oà¶rìt° +Vi'u©íp=޵àNÖ9 XZœðbª4,$óºa�RuÁ ¡Èr ô3íÓ �›÷…`_ŒV´Þz Ðrú†¨”Š˜îA–8LÈ·3ÅËAd´]ü¨$1/n¦øÖ±Sžã&Å&œ)£VksŠUdžpŠª‡ö)\f’-Ò ¼:±-ÚJW‚qòv¼Qʯ-ã³*)ÐøÕãBvu•Àüþ¬´€È½³ïsÆ� ¤�·²PK9¨w¦uDˆa<|(CX6ôÈxòO6­s@ uáHÂÚ3(‡Ag´ã¤s%^`=GÅ,ÚKÂ%!yÿǺ‡I�¢'¾:XIKì$Rª]J¶DS î+ÀÛ7üò…HO¸=wßêÀJ¾VÎÙ�^æÓâ9�‡ƒ˜ªS/ãõ8ü}¿$ï[®xÝžw,„>ßÂ̽I;lðË÷ájhö%ý×ú3*»Ùu:M.ãÚ�l´CçäTzÅŸÄwØï0Ûð‹H‘#¨Õ-;{áÇ€< ’–¤è`Þ²ˆ 9‘àT¹Æ i<�,Öo¸‡=¯†‡:N·Ô¸/<AŽ'^ÏBB‡\ßxæZ« ½nq#QÏY®¬ [íˆÓl‰µˆ¯Þ™–µ7æªl®ªF²rßäGmûÎ!·ÉX¥HßÎ\Æ /MüI†K)‘�RÑÌù)ÀÛ•æ}‘ øÑnÝ'“d£æ`)•cL‡dBØ/¸œ¡ôuÈ�Q‘ä�íæ½xÊ£­uÇ¡"Pw²[‚ˆlÛÕþZ‰¥X•ûS„ÕDq;RõëÏ3€ÒC£žâtv©ÏØvŠ* ’Ë;ÂY�Ž)sÑÉ6ø¸ÛL�²ý5f «3€­Eüt<]ÏìŠøŸàÎÏ[î;€qnOê1 Ò­sQ°¼®®HÀ;Ì2Hlüê¾x¬)j˜½¹¼œd÷�wÙÊÔk­]ã‹:ס厙å|7âZK’  K2ç8 *ø¬½”Ö´êóD.ç1z� ëÊîfå$Á 'éhNf¥‚Q�Ùë¨a•xØáü·F]r›ðS+&Û × Â(ÖµìÒhG’•2ŽÒlöGÝ!X½œeä·Õf¥IeíNwD=�ÌÐ�‡Ï¾ÅŒ/g”Ô±Í,_‚�•€±ÌÞf=@(±‘EöS?|àCXŸ äœSÝ`°'NgQ� ÷*k\`7ÉÕЭ—*E-�Ê>‹›¼à«�Æÿ•±.·QiÚ•KÔ„t·º~úŒtíZtjýÊ@¼5¬À }M$ªÕƒëþ²™Î•›x»áÔ§ÂM>üp1k™‚Ž‚qÉ ÅGDR§!¡ég�9îy$fãf¨›Ý%�tÃ~œ¥E.¼à…Dû¿øYêªOù—¼Ý”uÁòÞ\ñïÁ¤jææ¨õY/ämÊí¨èòF´| ©­aL®¡j»E!GôóØ1RCãw ;¡©q1ʯp!VXៀýØ�vs2geÏL;éxð¬á'Daç&ƒì/Kz’¡!e긑Ï]÷¸áic*Oé¥ Ö‰?mÞRª‹�ÆÞ¿ÉÛcýKBdùœêU½ÃD*s3~Þ0áÇÂÂÙåJ>UÅÕþË+ÄG±‹ßëä¿íŸÁ¸òJãÅA¤Ù¶]IÔ ¬ªØû“¡¯ð=ÕãU\eÒ~­Ñÿ:n®ZP¥p©(zl’ª�¹£b{ Jc‰!Ó~é{Ù[ QyvDü-X8‡x»e÷Åè,ì�qw&O´¨—p oɾ�á2œ5-ãÏ„/¤cDëñn5Ó^Ïþe·ßužHÁí¶qu°NÒäÐò?ȹê$îZ£‹£O¸ûzûã…‘6~û?3>Øp]­õ¾G .,&Lm'ÿôŽcç!ÝÕJrXqú>Ï‹¯�Ñ0ÜZH¸�Ú{ɶXÃua‹ôÍùÔJ†pwaìvÜ,Šâl“>æÕ8A¥ÙCù ¼¶ó¤‰XØZÌÆ¥úIÇ„¦/nd´ñŸ¢øQäP1μ!ið¼Ï,Áû_EŒµŠ—˜Á÷Í5ÿ‡"‘ÅaŒM•Úa0sû>@=Æ}LTomÉ?2 •mL¡É»~àË£)gð‰?Ö,ƒÂõWú¬�MÄ|üžDÃ;–Ç5ða�! ~ ˜}Ab„c»`ˆ¾}ú¦³ žz¬Þª jš€*©îüI^Ý–°Â^»šÁ%ˆ ÌF_>åÚŽè$å³Wó’:_MA8T´ÂQMÚ'ôU‡Û` ûöü· ×Ìwµ®CÕóçÑÂ3EÏ . �ja‡’�ÅAC÷*è«Ë×á�lÉÍÂRR\�‡Õ1ò«j𜖖ÃF2)ªÂû�”y“÷Ž�„x’¼æjÙ2ð1¿—�Ø”+pp^e@›Ñj¬˜üŸPΠýÿ~�ˆì)'Q„ì áÏ)óšQš�M`V:ËþÍŽÿÀÔáV7·º%�j¤‹4ÙŠ(kO/²ŽŽ´3Êœå²,vÝV°ìÉÆ1¦EÞ}½0(v ¤¤»å`Çu}BýN3º!Ú ¸ÿà<•íöŽëFÕw …r–0Îf ušEÖrk.äB¡ü–$‘0ñGå,ð˜Ê†ÇBY†µ^o3/BSxvÙéÍH.’ö:‘ª� ™ïrôRÓ•òžœ¡_…¾h´?…îœs@�'Æë)¯ß°�… Ñ[€-—ùKT2hlM¡rQjd½gV‘Æþg,á¬Æ !º&ÍŽè FŠI@®HgîÀ–joå…ÖALº#lês‹C ;êE/ò„L±ãE­X ØCÆé@zï¸ðìáô!1(VàÛ‚ûÁ²£w#7ƒ¹á5¾ìœ+àåè25Pl¶Ú²Ÿ¦Þ¢K€{ “'i¿zÆW\“ uX›€H×6“Ï.^>ýæ)ÕßBp�tA–åàÌ?¦,+d™_ƒÛÚZóÅ;hœä8Ekü¢ÝL!Dzä§\£‹Ë|àÛô<< tí,},´$\æJbr.±eF.C>ê]ò(·èã$'%ÎJZã“, â.ÍðoÆ�toÙa€l‚Bóvq[BiPª¬^«Öø³:VKiÎ5…§]¤\‹oR ×>v‚Á"�¢ã&øž�òžUšéæÕYØþx�¬Cýž´Ñêyöü?¾7Ò�öí�Ù|>Ý &q²ôá©åÆE¡ °t½âŒè´„·7 |ê¼¥ïõîê*§©lÌmWî¡™Õ[/_gÉ_‹M¦CŽ•ñÄ1¶²Ž`݃'f£á)Ó¨ÅÑû±ëUW‡�ñ“¾®+ŸãÚG•Bò„ÕNF¢yÞµ!²F¹T‡…ÙÞØÔ`tÇ”s"�@¥èáTpUFKàƒoÚƒ9Ë&Óø9A™5Z@¹uûÆY®¡É)ز®¢78ÙË�æÀ˜[�Áõßœ!‚éð‚%Æ&ü1{(WýˆTu‘(;ûE€�þzNŒpBà¢)§ì~ÇfYmw‘s¦v_-ºjYeßm³ÇË&x”Ö=x3ðâê9£$uu[ö…­+ª$Ñyvª�Ç<J¯©ˆ$ÎLËáµÊäÓöò =Þ:¢\ö&Œ*’6õ�¢*׊�Þl�ýá{=éòŠMn0^àa82Y¨É£N›W'¡.¡Øx|]ÛÒâ¶�pä)úÆ€�ŒqsH^©/e}8QC&Tyv­¢î|ÂÿözPç²—êOuÔn®`’:xÙN²h'³·ÉµêÐ…ŠÚ�W wÁáú ÝXG#`>áŠÿ½ŒU2{vÀRâ*©+à’ÿ«´Û`~Ù÷…ôö-î;T8Oþ¿1Рúî rÁ4ÍtÌûà8›¿1nIû¦î\̶}‡‚?õ0A‚ëÇÓQ½: ¬èìg÷1QŠT^(¦i–«Ð½*@§†‘7µz´IÅRWî�Ùš>@°K½Ù×lÞlê£S„}önC.öƒÄüèp‡F÷º¡!‚7T9õQé)ÔØŽ‚0|Ï‚ÿ¨GªÕ‘IÑž�IL‹åñ {gõÓ•±Ã¥ÆÃÏHE~6»&½Nítt�±^øÒdt™ÇnfpôzSÆfC°�º|ŠŸ®`l^»†ò§YÚ—íÖªO*™38KʆnF!ƒ…”ø�]6³|oI„åÃ,�C^Ö±?D‡FIøë6ƒ$Þ&®'éо',�G¨;`ÈEÔr5¸Ü=Ñj›ùêýùÒHtv‹q(¾65wÉü\Ф”ìZ°�GȧD=âëy™¢ g}œ?Ø2{Â.h/˜/ºòðõy‹äOÀeI’’·©÷î<÷AÖÿÊ ¯ZWŽ Ì_£@=^ƒEÊ$ïrbek÷—E¿ 9J`¸,ïþ,OññÄê_&c¼�¼½º›w$ÆÔÙ–�Åð%o�µïoã1z= îM¥© '9¦äªÆÛ¨²†% –ïÒ—Ša&šP£©ËÕyÍËL1Îz¾Óy(¶ø¾Œßû¢(IaSã~�ëÊõþx)rçë¥i ¶Ö4tWª@W¥Ùwb©)üR=Ë y\†”O¥)"2†}ÇG@ÉrÇôŒ�²lã?t†jö´Yíï¹H>Ñ·¯áh?x‚ ßœb½�©p�l)*‚BޱDÒ” ¤g^×1.¼“:nŒZÓX¡Bì=�§>ðb2þ*ü:ˆÈ™™T™½ð‚yXØä xÎ_‹øh¹·j-wQ gžü‡þAê8`d˜ ´} =o4«}ŠÃÎÓ:o¨• eÄfkÊFÿ¹Áç?ü�Úéík~`Qhþáðü2´©Áx0_2y©9Ó”gʼƒëû"ê%9pDdøÁ¾6�ÎÒk]Vò6&KQ¤Ö™£¯xg@ì»>…%Ïë– hP þ »…1•ˆÿÃP%>ªµX™È§Nÿ;Ã!”ÝÍ*Ê{í„ÀìNAåË(†fŒ" fw({._½æaŽÉEç9™‘7ôÉ)Ihñ$[¿}ÔñÊÙå„ÉÂ�GzóñÓ67½CJãCƃ<ÃfxÒw€ž—÷°ç­ÇVÀRï“É!r�E­#jÅì*@ùeJGYâ]~ƒ4Ùã02 ìXýOã�†4ݱF�ä𭾊›|Ôz'b´jc&bH]ƒ‰® Á/³ZQF5²�‹¶Dsÿ¾¡ž×:ÔB oPAW¨Öl•V½U‡ómÂùàŽòã¬HÀOc ¥½�І�VN÷˜*¦ßk~i7ã–±„È ÉÛZ­AJ×ê9Gø3\F”Ê’]ð¢éô�ʧð£ï††áìýž–åŒÒ¦=D4"ô²9ÞŠH¡âñj²ÉÉÞ?Œ�ð Deäx—a¾øtˆÑ‘ ‹t†HVž"õ“Ü:aŠCm_²ÝiòîáÍ#Xî¤àt�v( …',žº0Þue5�fÁ¥ü<]fU;îÙ›[j˜£uŠÐS€Þ$ܼ£þ׎ugñPSë΄ð öú�+{º+ÏZ¡¹) ;L\Ü=B1õYú7�•cc@Ú�Rn… ßœ& *äDòls‡ÐäDÖb¿.ª)×åáÞÐ{vE)ãM]Nÿ#ùÍrŸkKŸ–nˆ-µÀ ¡WÏ”zâû¯(þX+ÔÀ äQ� ’ˆ!Gzˆ9QÓ´˜Ë©Í)çž'zTºäØNÿç‰iQñVJŠáqÓñ�N¶~¯c*ýÙpç* ?v: ±ïÕáúCÌÛÝžu®ë¥‘ÕŽò¢Oàì‘eL€_I;ÔBžA„` Þø æÌrÀb`¢Wª\à¥'”ØíÁ€Z¤Ëvn�N_ 40äųm…b›PNúÕ1<ü€�ûZ³“<@3ôbAkiXÈy�W4o) eÿ is볨9 Ú»Q/xl4†@c_b3¶Á_‹#3wŒSe>GÙ€ÕsxjÈkàý{õXÿ�hï=ŸëÿÜ]j{=Þ¨Pƒ>hv’Çéw…]1>“'#[/7ƾHÀ.î¶æyç—ËmÜšgþ+ óž¤ðai+‚¯ñ·ˆÇ–\q Ï ¥¹„hô‚'Ì‹ÌÎX³<‰êæ…Rj†ßñ¢ÐV†ZµM’Aü�SX4îG'fˆZ ] ¯@BU²É¡€ z7ÚŸï@h:QÓáèÖ¯ãPc6¦<¯¡¹· 1ÿóM•Ô^í„åg€rI¬Á¦i�ظnÈöÆùHßjï:ƒÖˆ‰,ÆXÙw}•�£Ü`<&â$Y¥™ÿðs÷|÷’Yñ€(6‹E‚t�³Œâ:Zq†%”¿¹@Lm¯ˆA3ÎC± ûq5ÂÅtzæŸêÿ!;:ÿÇPPKr£ömøEìÝbÖìº&ÛwŠ%qªÍ3I“ìíÚ›¬ÁÑ÷ÎdÄæRˆ“˜f4åv›Á†©¹»ôÀçB˜^d°)/ ÍùV¬ãî]�ºýˆ NÅÚ¯ ¶ºä˜O�XÏÎN ß K_VóÜð¨2²º£j}¬ô$¥…ÕÁ£¼w÷™^~²OPRKŒm1ÒJÛ¬˜oí;ͦjÓÉîkKd.q¿-éá:¸®q§©€gV®rÛ·“£4‡=“0ÀÁp ùFDõ$­~^íñû½kG�¹§Ú+ÊO'I߬êsè5Êç�äiú½û+wuŠ�È7Y£j¶Thé?åg‚ýŒì³"ƒŸàxàÖ²|¼cD˜˜%EL+‘b¹:¯ƒ�ó›¸ÃGøOij ù¯t9Á-�0mBæ^w„08™f»ÂkÍw¸P8ä öeÔ4Vjl ;i¨éƒä-Í_sdö#,8OaŽã£.æ�ðüq°‡Þx⦠›Ò/ÅŸÅòÞé½ D=áÞöñEùôÓ�˪iv…kØÍEÁ=è4ªe¡Å4fgó¶%9Èä#|›·…zæÛ�[—ê÷¶ü€¯C=ì�YFÕ71í?¶’M³Ž ïžÝìÂ[ÒPŸŒÔ Î�ѱôê¬ 5?ßwÓÛQhfg׸Z­(¤ÞöVjáRËxÜ>)ö…’oèrªX¨f÷Êå2)2,T~ØoO,'§û½ŽŒi:;ã­ÜñXF-håT Dñ¢ürMBòá6¦S¤~Ì—{;ð l¾zló‹3V ›ñ;åF )¢8m‹Œ[Ù«E}ÑÑ­ÅüÅËæý¹X¬±`ᦽ’#veå[è:?+ ʹQpHZ­âø#sÜÅpmÛÇ¿]‘å•1²»foÚþf@…,@¦o·Þì¸,!�…墶§Äÿ)Ve¸³d`™ã÷}1Ú¢`BЧ¬&ò‚ŠÌ�¾šÜ�&`é3‰NFÑtŽ3yT*ȉ˱¼^³õœ_t™BAÃR‡ç CdéyLûJõ¿î:1¹Ÿ5Ô»7Íà±â&Vƒ€JáFÒ#�•±_\à?ï'¾:-ê�‡¼�ƃØ[®T…S·¡çÉŒ—~ü�á ›GÌ^5HZ§l bë]FŠpuCP_?9 ½ÌCñâÔ’¡�dfz-K÷‹JÖEFæ�‹É©+«h0ÆÿZØ6K5C·eL%wÁè¢Ñ¼�ÕËš"WþpGwZvÐÎW“P°õk¯ÖNQÿ`“‹'åÞD´Õ§fùf@ƒ\£w6T¹Õ‰4ÁìezâyЋ‰¸¬fñ½w—è×�œÅ�{Z…•l@—Ÿ¾ H†ŠV-‡-3otT5s3{‚$¹oïÊ&Iæo‚ ÛQr5Ä×½Ú@Í"¬ì*¶È99ß”¼âoð'È$ C/ù2{eòí Aifªþ^gq»4ÑûÑc½Å‰ß3T)ÅÇu ™ÃLÃŽ¿Ò׈"‘<5#œÔDG!Yj7Ê~€n‹æ34ö…¸m“KqÏfI–qó-µåÝq*%£²e¯pLpA»ïžž| –;V¶¬bwª5�¡FL…•œ`×Xþ˜eóýíÛ�N“,&€á÷yèÜn�3°(-âÖÄ6 3¶kL¶ h�;§­ð|õMü­ êî›1M¯8ŸrrŪØw^>: ¾ñ¤Œ5�³?ÀŒò¸·a+ÈA�dˆË½V캷”9a<,¶Å~¹ÐŽLú0CòºL7)ž-Ê5”‡ÈŠù 5+Æxœ‡Oͯé„\ƒ¦]�ŽŸ;VRm�)3WÊÅ#a“Ì:0̇Éó<ÜcÓ¸ùt)‚æ,á)’$ú/°äÛ=ªý Àf"e“:×ð%׃}+T|Æçü=}p ­OHâ¦QÝ2¦z§„öUìx¾ËÊëÃ{“›ÏÁÂM $èÀ©\š:WR®ªMoÖˆÜ|q/ éÈ;Ú¬ÿ=Q„bEÌDÕo ßÎÈåo �!b,/ŠVäÚYîÉŒN¡N_{ éç]†L}P(„Q�ªFæû‚:RÐW–Y½†’Å7í‡h�m/Î…jÉ—ñQú$ÙÎÇøÕÝ!ý\¤éMê)$Îay]ðR›DbÈøú¯Ý·ñ½YzíÍ»ƒvð±Å„iR™A˜åçæSÃ`QEGôÓ¼Þ{—MS'Ž$I’Äo3NA¥*˜ça‹…¬ŠJ}7ëGnŒWüV³qÇãßtK›®cý9ŸJ¡…Ü×Þý|"hËí!À¥ÞPB?øæ‰Ÿqÿkt¤Hœ+à[7K“üLÌçŽdû6‹´KÏ4yë÷ z[d¶8¹Q�ÅÛ-šz[!Èù¶wŠ.$ú_ {r‡’ Ë]ZÊ£Á@ uýû{§wõ¿ÚS z_±ýQ¬+.*u¥°7>1¼¶ÒÈÚBH'Ê�3§jÍ‘~ä®VÆ3œ$4ð¶Ë˜vƒ¤êtÞs¥ÿÌèÈðCË\u;ظð±R® üÍ7ÐoŠ€¿œÐ¤y£´Í�¿ðºGHPYjÿ´È.ÏSó¼‡ù6b­À Ù­÷8÷{þ#®âO{n¾–`óâàwÓ»ïÖ„ÄÙ�Í¡�E[ÍLl«W×’à‡Ï¯±»\pØéqòµ[�D�.ÅPã;­�2 ¦ï×Ô]±ÿ|�]kút0™‹S{Œ_°t22~Bol�K.„�eÆ¡óÌï^¼;–”E¤¼‰GWŽª^Ø+^à€ØÝ$Ÿõä¡{dãˆ÷LÅv³×�ó2æÞŽQÝ| ~‡ÔMIþìîùëo�Û-¨ˆO?Ө޵"I�ÿ¤ùÈÄNƒ.˜[†úSY3Ÿ÷ð¸¤6A‹œé¶ô‡ú-V Ù»¸Qb…¡iÀÇF2Óšâ¹»Q2áŠêç4B«U[`Ó4ÜF”P@8Ùvæ_#òçß*•º¹�Ê›okq·m�¸zwŒyZU¦óàmòþm$bxRq•‚dS—i­”qæQOss¨úp†™¦\…¼½Àt� ƒø¶Ñ«Iq1ü¼*îµ ’ªåà3©õÏ_y€È±År | wh“k‘o‚¼…í´H[ÈEÃÀ ï—ôbýÿ‘ãôF ãô�Ú£oöÌwuC†ŸygG¼8xÔ 2üFO¼†¡xg&Ô=Q µÄ;R+zf4ÂQcI;¢Sæ ù›vÄ„ ºm‚ÔŸÙÓà”3ŒÞq ?rœ¢úÀ"‹ÎÀÈL÷¦vî!�¶Kâóx•ùŸ¦h…ìáýY†Z2J=ËJj‚1Õ5¿Ì~–t¤e‚¥§�yÂõAÆB7í4¨6 rŽRRW"’�éy„£ÎÍ–Ýø_Ä´9nèWž¹¨ŸŽµ"°ø«…˾ý°`˜§æ =J»›±19Ú˜ ¢D�ÑŒŸå’2]Ÿl6,:+�ÁBÞÒûZX_^ÉêÉ$:¾Àƒ\‰�®I;rË8¯fòCÛ¦¯¶NwóÑ–ôºm)-T­a?ÄÀv Wɸs«Qãö×L¿Û!¤,›ËãÒ�5b÷ŒÊ<ŽŽ© mðD\|ü ]^¸ŸÚ0’îÅçtlKB£ºÍ×SE´ƒå”‹m6½L *~§¯ž@ɉ}�bb£¨'Y_áìÉÃÚíœÞñð:bV9„–𿾍å*Zñ¦vJÛÆaΣÌ%肞6=$.[›�¥f]÷9åwT#d_ÓÞ5‚Ù–CŸ%N`‰c~:¦]$"õBðó�mwè¯Òoš8¼ŸyBÍ|Þwìä4eƒÈ–øä«c–ëÿ ÍQ†³Ù�J^56 §BeTÈï\ÏîÔWAÏôå#ç8žæþž‹ްåêcÃJJõš#g߸·;ëÄ(VÎNÕåZÑ*.Ö¨‘w1ú˜ˆ�Cv²…¢žtÊTœqƒwENc?ò<Öùä ~†]b|1'^#0‚'+ö/>Ü5>ŽÜemɦwÀ�¥°tIöF¸ðÚí‘Ôšlk%Ž}!@|ºü#Pÿèá8À�Ü$óàuÌ• ¦Q4Ac½ŽW~¿úôGQ£øÜˆªŽ�øï œ¾#2ÉHIÒMWºu ¼\PYSí ²ÔM³ú«±È\Ôë�ŸSqip…Û”žÇf±lÕ¯E2Ð]HB°lNëP–~œ�¹�–&ÜÍo]Ô¯ÿÿÿGv�9Uïq|¿öbÌÀTX^…=‰8¼Ì”¾R@GÃV�Ÿ1A `[ú¹ýb‘1q«‚´,“F¼�ðt€“²)o7”Z´¹uŠ/¾ò;Ý#i›ž´•,pZ‡ëC} ^cñÝýl!úÝí:¥õí?^@.âã¶Äoµc Å~Z=¢CŸöÄè�Àüabhø× ™?ÓÛr'ƒüeFÍ

´y¸dUÖ©Ïp9“ð¢Rrë‡RöƢѳŒÅU÷< ¤zÏ@¹�óS9zºÔaýª¿•Cb îƒÔPHëžÂd÷÷qXwµ*¦íFB™•F®ZÌî[µ}þå[®Ëñ~¡(»ÉÿÛ°ÅÑćXàØhÜbïttië‰u …b€\1I`#Ùë·lV5B©(\±±í¡ìB�·f ކё°ô5P$g´â�h�(/â=áŸÚãKâD#Ñ™Êq‡¾j-×ÚÃí1Q �\fœÆ´L§,4£—éüÓ[9ÁùÅêN�msñ“I ¾el£oß-GýŸãÍúæ;NÌÍÕ]_"œ·¹œPx¶MÚ�sf�Ç›hãrt°(Æ�GEÝ­uFW³›œø9fKgË`W-ÍÂ<ü pσR6*�µÁŒ¾�‡�of¤Òºu?ò@ëÖɉ» äÒËߣ¤ÜNèF¥D Ã^÷¬/©Â šéªس�Ç#À:_¥Lè¦,Ô‡yŸýv ˜[Í(¨zÆ€À‹‚i„ÏDvÙ=Ü‘¨4+Ììú‹ü®x�‡AVŽç§èÓÉàÓŠy;ÌO½KåkF 3ŸÓT½KƨCÂÏæm5ÇOПØ�ÃûZÙçqz/N¢† ñ°x-BÏs=„.`ÿ>'“²ºÛŽ P�I—ìT‡mÆ»ñ»§Y‚×­<{Þ«ËØgbr)_‡Ÿb©‹0hAФ­Žo+ŽÚ„¾寨Šd Éh…ô6­ãô°g…øÁ~“�]óX9ò;b‹™¬@Ðjpp]Hšš^Ú-y4¨í)�9lš´W*}2>r ¥@ˆÿ>3\GN ÝâÕñ,8ˆcäzõ‚uOÉD» U|ïß>n/ ìþÚ<ÂÖÉK+Üâ¡EÙ‰4*Sžñ¤1ÔtCÖÖþÁ7f-‰'p?Åûû�¢Ø• çeI8"E5¨€�êÚñb‹p×˳ðYÞ&Ý;‡¼dë!3#,ñ~†kc‡ êqÏ­Á¨˜ƒu<4!àºÆ„øÊ3!£0âj0w•Óe.¼Áríe¥Ù+µ ¡ð" ÖÞú[<}ª©xMXµ¦z$ªÜLÙýB™V�W‘-Ú�æÖ‡(îHFâ°6piøôî˜]ö9þÇC¬#sƒ2î1é5»kð¨wÁ�ÀC{@œäŠâ9ïë£ÂÔl¢³üáxÐFJ9äËΙ߬åDâ¢Ïs dÃëÂŽ_‘ ºõ³=œdø„jÈ"±-“°îŒeÙ²wr¯ù Ö ˆKT”nhŠìS—s$Ýüý“Ë9â�éK@‘ûYßðáJ-î]òŽâgÜ,ux¨‘¦HÞ%ÉÆ>5‹<ásBÐÛ£Ôl·ŽQ6‘æ�ŸV,¨å_…X¦‰¼;´(êã™§Ô‰ÒÂÝ—eÔ ûXÃ,´U±#fø�rè÷Õ¿Þ;ŽÏ&n[ªe<ßDZ ²åØkƒli_å‰1$‘�šŒyªÄ2]ß‚t"ÓPá¶st}�àÕ±-/Jò~ĶÝù_ó[* à„Dµš‡½AŒ‚ÜVy虩�/ë=�w³ €ö?è­Ö¶2g„^3|iŸÃm„å}¾”Æ9úüÌÌ»!‡ôUÊÙÖ"/¦¬$"óì `ƒi¬Æ’ÿåÄë¨æJpÐ¥›ŸaY.C˃ö€S¼FrÖ¾ô3’ðÏ&B'ëÈíe?.ê2†êpË6—³®\%oÑ‚|¿´´Ø+1 ~JçºÁ‹¯mˆæ¦ô†¹`ŠŒ:Ýþ~ý޶©Z+¢9w»ðõ'«ÜàV‘¾+喙ß+ªÈÍÒ£ûëÿÓüs�Ý—%_Š-ÂÅ�¤7˜s›Q]�&ÑY «Rˆ = ‘ê°®ÜDFž�³N=âd´¬? Êʛꮱ°»ƒý…ô¨õ-µâûž.ø€¡4çÏs0òGAâÇ�m¯±ši&TJŒ«6ðc7Ù-jQÌ<·¡¬=�*p{±!(Ò*õ�Œ†›š±=}äŠI�M [–@!mü%!qF˜µ_Àã÷~ƒüŸ²ÂÇ%x:…ŽS:ÞP_LÌ[ûiaÓ P<–ŸÕÊc˜0}„ª+ VNKIݨ#, |±&Ú C­Èa¹íý¸v Áˆy7 Ñ É[GDO‡Î1f¾K/ÖQ·sß•‘9íå3Ž'â<èCÛ‹{ÃB¬pZm.ê'ûÕÒ g{ИŠ‚×$檘Y_‡"ߺ†Ž ?B ´ˆiâ"ñA+çÏïÆ|Ñä›[õCß|çÒ^C”j78¬®lL¸%àh-1 ‹†ÂRLâkÈRœ*–ŽÃ‡¿ÿšJŒwím8Ï p–<Û¹üa…¶ z›ÝÊ…0GXWòÍïɮ֯QŹýÄÏ IcQÚÌÔËS~æöË¥‘PɼVó¡7eožQ“Ï^¬ÏŽŽ´ VRß D…0 çÇF³}ˆm? Ü9°)!AÚ°�¿IÕb&á�«¿€|×s ¿ V}½Ñ úÖ�²1nˆ›ž¾c$‚ï±Üv)ðC†å9f¨‹¸R(¯E ²Îí=™7%ú¹(ÂU³“ôÒO¢À˜ÐÍó‹µéðë/gŠÏIŽ„w¡ÈS�ºý¡¼Q¹�fãJâϱ&º8Ýt£ ßsÉ.mèçH&¸;7×�8tð¿;×;f6Y7äû¥_r ~gz­vô±™2É\¶îÛêföJ³•j¾LþEÓ¢H›'Z䄜îËÑ bÖX­ê©„Ì{x0ÔŸ®G®U+É*d†_´Š%"B ��ÉDÜ­×9ÁŒÞ/© î{mYªÄÃí5T—E2ª¯ÒUˆ<Ó8¸YÈ,v±e^ú¦D|]¿ãºÁ_ÍÙ®6PˆJ:wg<<�w¿¸*ÞéH_bVº9Dw;Ø~͸.Š”ÌPÑ£ÑÂÝÚ1Ä÷‰ü}„OçÉT¦q¨¶°e;½©,µ…tAÙ;�8kä`2sq»ÉÉu5.Â5úº_(ù«Ÿûž :X+¸ÆtIçqýK¼'+ÜjŒÎñOéŸÙ3Ï@%}ପú° öÂ2uM<η tWuØâú—ßZ;šÕÒjޜنI Ÿ�Sãÿšs[ ˜ó½ø• àøòøp´X=jïXH�c6*�éËÓH$6¨ÏÓì�NàKÔRð®.ôç–¬´ú+JS3òDk‘ueKÁÆã;t�¾70tmÊlƒˆ–¡¡[•ïc Þ‹þëkªiaš‚ MCÊwø eP WkÑ�þÕ£¡È�ý™ d ƒtMùïúx!�Á.#xà�û°Ø•ò´ßXβ Qº­ â)Þ~@L•!Ο&ïv-yò7·Wv}¤øÉˆóOç­x�ÈDÆ i…£7Gn)ÿ@«�kcê¯xš•TNU\£)Ý–a_ç_å¨Ì!˜„ TÓZš´›øn ½±qgy¿ŠsÙ3è;Ö¬9X‰Ò­Kи^l½ÍÞV(Ùß×ÓB]ÝŒ'a†VÃ÷ô¢%™�CúÞKpd-•‘Ý}vFQ¢¯ÕÎ×a¡ðƒ�•ïî·ï¦q,®=zÈtöã�ÕŒ}jè�±U¬SóE¼‹$ÅPêA•ØËŸU¶2Å€M¥� Œ†ä®ÿ{Wù5Ià"FaJl¥’]SC,õ.Ë~2ÊÔU«r`éÑq‰‡`6Aˆ³&ÎÝÉ©5ê#"Ž�ìüa!À2©†Ü‹�Sì+µ§Œ†óÕåð†ìF< 3©P·å?Ž�ßîï6ß-={2¹€Ò%vpÈy'Ô¥ðYˆ|â2–'Ž&†zõ·ªê¾ù 4ß`Õû2…«§šÅÍòý©"Ïzûï7ûˆMu_•:¶Ñ¼o¤6èŠF#Û5{†Œ›KLûgšA±}7ñZ[<9éŠ >|,n¾G«JšaF€HRÁ ‰®Êáðp°4“-Bö Æ×úQ©ÝþÉ'½œ"Býó7[<ïA› �ƒv(ò™c>IÇJ X~«Oô2_�·Ž�¯KçäîËbÿB$vñh~a—&ìÃÀ~ZñúIÀ¹ü^`g ¢ (û×$Fì@`�ÑШ˜·ê  wË>ÐSk¹Ô¸ �Ø ¹º5­0~¶¿zæÿÔHÏ@Jõ/½Û€ÉšÀë[Ló!Ÿ ¸êÝåžÈúøn¨H\“z�oÒ +Å~ôJj2ÓŸ‡.9{°DKOzGÞòä×Èð¤¿KHû3l¥}O¬uH¼›œr²~LŸÌ s_ïRUp‘¿<õ.NÒ�¦á0c¡`Ÿé4.ƒç½Û½ñ¯�Î)þˬ´¤ÿ6#Íu² â‘ 3ÍRÉ/€ ¤d¨¯4.<ùU1}‹¿†Ü=�–F�²w)ÙÁK¿òÂ@e£¹‘„„ z¼TYwú_H ïB?÷‘q5IÚ¯8¶g‰ Îg4 Å2†«—‘@»€}SJÞ~áe��éP*Û_À§DxŽš,‚h5NÙ7ŠBÕ f[2´¥8ÈäóQ1ƒãÆ×ðø4p f¬M†×å [�Ñ4!'Bmšå¤òK@zþÕa.=Ûº]Ï�å€�ÍcQvuó •³ÕÑ[�¾îƒ‰š•¥ éx¤4#�7U¿õÄ�ýÊæÔ0TtŠ©¾”ôu]Tx�,ëæµ_.\í�߸=”V=§J¤ó$V"—5�îÇFrÙb›Ý µV¤uhjdNñì¥-Fß ¤Gwþ›ÆBGµ_œä¯”÷%äÕq4Ë‚ ª:݆-ìo^-âKìî ’‹¶ ‘¨LáÆávñú¶¹#Ïs‘ àjïC”Ì�†ºsâ=r£«¶%À«›&v~™ÐZͪ¿˜ƒh X«ad¼lÁ­U80jÛ>BùìHBjfêZؤŹÓ�øD3,- ?�y©‰ 6×(ª˪ ì"�í¨ujñ_‡ýÞódðçÔðª2�RíÖp¯­úfY0ßñ^?¼E¹ƒro|ã³t1ƒ§Kmµ¢{ÒÚ/ÍÏ­àõ÷`HYBC.ýñMÕº»u|Ø3ã�*[Ø]†cŽ]Ïg¿Û á¡(Îþƒ‡‚ÑÇÅ�^Åd]Ív"†ßãçVÌ©"FI*´™'q çò+C¬¨ê{+¢hlöU¿ö¯j(Ì9_×ÒtêâyZñ)=ð¯r¡‡‰3ºÇã úö'7¬/•¤mߎÆq¡gðÔýV|˜ádé„ôÈK®ÍwX; *H •v™¬)‡»øS~Š5ŽHņÜl·û«ž€I¦oÏïEC(qÐò8—ó˜~rõö¨Æ5Tº"›�Фœ‘/-g£!¸uùJû œÛèw¬\ ³ç’4âÎ�bÝ¢&JÀ _ûÄáÉ`^þq4µ¼ŵq¹O÷¼G¹¿›ÎqÉ¢šUÄDŸÅßdÍËÎõØA£Eñ+ß@ŒRyŸãSPøÚoö«â0û4=HÑl$øü3\[�Íä†Ô°x¨ÖL>�qçÙOÒš=¯l"Ø—Swææ¹n CÎXÉ÷䆚îÚ´Wx»û™‹&¼'°òF¢JÒïhÚþÌâòÁäÀq'ï¥ÉLŒ°]>ã'´a™{«Š/ „»òü‚磿µ‘…v&çfz°K¤§™‘„gŸgh>µHЍ¦7,ŸªMš;™I_­ÎõÕ{ ïís\gJCr0G·$û+`R ë7=KZÿÍÓÁ[BCÆÙböH¾¼õ',#´z†"”%eàÔ¾ŠùU~£{!ÙŸÁÞl¸õrÝ?ÞÊP'¦B*€"Æg�¹r´üF–ûôé‚úMMÅ(ˆïÉ•ožg†ÀRØþŸè î×§Åt_bL™»úªuD‘ ï3/Ç`ÀtNZï`Y€¬4ÉÙ;)'Ûþ^©D�ó<|9¾qb·b1òÙL'ªNwa[ÔAT¹šÊ“L8žÉ x®T°bÿ,Ì·üýC•œÚHȳÏ֤𦧀‡=ׯ.LL<×ÂÉ7$Ç� 3› â—Ÿ9Ä”dcÚÇ7³GܥυÂ% ­nW‡×¾$ŠÎ}Jï4Ë”<c&ZID¹…³X°f$FÔ‚zèÀÂ-áf~-« ¾&� �7>ÜQÅ2d 9(ªHL½\Õç<`Á�q×ÇHyŒÓ‘©iÝTÊQ��®_Qy%lÌN�×Á¿sbÛ Ú ¹¥Ö!ÛQ‡Y•í üW\ÊÓf$yIÊ&V`³ù´GZÁe@IOŒûJà–âsº³e÷¦ì>À¨w§­¥V?)Æî!�¤<—q½ ˆ·nWŨp1Úº}�e0õ “Öž¸Ž]—ÿ Ä ,Nzª 5] ºêâ´bP �à+ ®u€-d½6Š� ¬Ë¶@Šñ¿¯"x0¢›Ðž“òæ*™Bë0ôudŒ.™ŒÌè¡9ÞÈÎDë/BEºÝ®Õ‘C¬´‹‡æ aáÕJP‡eBÏòðá7^\øà¹œ·|™ÁRÉÂtSÉj•NÑ þo¿Yu.ò›‡~¿5‡ ù3­ñ�kéâ; Þ'1Èz½µÞ%Þ©ºL´›r¦ý;+¿R[ã]L㬼¾†ó¦S.‹XOÐMâÚpd`¾Œ}n½Ð ¡œcšÐJi?“w8pÿï Ûð‚7A1öDK^ÏÉJ\Éòb�y׊#Õã´Î©&<¤‹ö«<ò”.NæÞúnEäWü+{O[$Â#4¿®Ÿ£CKº0½P4ôQªô Ö}¥˜€«*BHíg9a9^ž•5�,‹i*ðfƒÆžæ#÷*‡u-< Øb5ø¢îHÉ6ÿE4Á›7 ÜÏ=‡LR“¹ˆø=‘ÂÉ8¢^yIéý‹º– J÷Tû4—ºgˆU ý‹¡˜±£E§ô‹“üd0€ºˆJ‰�Ùý7·Û ês.LƒdÏðÿéÉ$\ß¼øÎÝwŽôî!›Ð�êùpº$'Ó-°²ÔÁXMœ¤ÄŒÜÿ×L´À·øµs¯¨’Ï=K]ÍžðÑ¡'Øãðô–Z‰+@Mô—ø€mÔúOÙR6’ݶDH}7ž[—ŽtB³Rÿ=&Ú6‚E富úL{ZáÕ]�LBi ™ ™â—1¼¥m.â¬OÜú; ®õ¤øý¿)",_ q Bï”o¢×îWâÈ îÅ•k”•/4IwfÄ«½I�*ʱ/芃.+å}�1ÝÐŽ+8LCAÈÀ˜‡ÎÉø¦78\Š>Ã6S³n¨½·b¿ ¡§ÌÙ�(ôDFOr‹zEºL)nˆÑÇ7Cé5ijŽ?AcĘH‘¼ƒ÷ÄjP ›ÍÅ*£�×  K9Îôvõ}MûS­c&ÚÓ¿g€£Ì`ôóÐe­¿ÆòMîÒË%ø~ÆöÝËòhˆŒžåô‹t˜AæÝô.µ�'Ûïd2ÆH—FŠÕ9U}uS2ŠP ›ÁîWé.Q˯˜:PÀ€°“na Mi.c>Iù’Zv󵟣¯Ïxuk/‡]…²YM'òhˆŒžåô‹t—ç ,­¦©:V®æ#¹ý±˜¡§ÛV^ƒ´½Z9�P ›ÁîWé.OçÈšgUD“þèêÜî äø:DŽP@�#ÖJIY”�Sskü—Þ³S¨¬ý2ƒHl€ð¢ØWö~`v—ýƒúìÊ¿L{�­ˆníI÷ ¹’Š= V9åLWé㕳ØüM]ËÍë‚?´·/¶]€6‘0ÚªLOkšÜ:Î+SOg¥=3²ØÑ¡áô}‹•Í3-è¨|©÷úù�»¨#gR–ëØ‚lÁ‡8‘œ“Á�‹ù|kû Ó‚~R1'9·4§àG2 ®äãÛ¾¥· µ¼ÓºÒ,>Vlá�kó¯Y–§µÈ>�—já¾ÏJ¶†ðÿµ›5€ºa8‹}( :¿[·rzµÝ�Õyœ'NxmŒ-Mœ (WS‰ðc‰Ã ~ÚšdŽ™4×äÝ­¯¾WÖ@Å$2x%ªÍªù÷6arZPKžÁþŽ®ö=ÀƒŸ\ùQ6 ~¹«às‰øÕîŽ5îTòL]HB�›8Ä×V,®EÍ>A EšPÝÏa3æÔTVhßÿp¤�Ÿõ×þ¡µ£Áo”qšóÖs�JÌE%¯ÙqGÀ$»Œ­ñÎK¾þÉmʨÓÐ?³ÍœÌqÄê�qUO¼ O ¤�@€QñäôédRiÃzŖܤ¥#ôM¹„nT>ƒ©þæÙÞBiþZVôU˜üÈ�yèaNÀz¹Û±Q}Ç,[5ä—‚ÔLçÜÏêtž £a(Êè»§3IÍgP_´G¥ñ׃ӇïÅÚLOŒ·á)a#–“©@QL½KÝTb–©a§DQ‰B£�cánL0�+Mj@M©še�ÃÓýLªrôì?W3?zùwÁäMçN¿:ê+üç[äQP¬ô`9jyv'v‘+æh­÷(o`e zúâf—ïCô™> €UšLC¯ŸVÈb2ãyl·€nY«Š0ÿ?& %�™MäáWçËG† ‘Î Ï—Ã$Ÿ›¢†å2ØwÚø�5Þÿ§ã2z÷Ä-Xñ|׿äÔ4ƒ“>Ÿ†n ê«» Z‹w@RüþDúê�!RN(dnI*±­ÃÁ Rû¨ÌŒÀ%K�wݨâ¡Ò<µÊˆþ´»5Äzü0~àTf­l^’ øª•‡š\`ú[”; �¯{è×�î¨<«+;¨0 eéL­†iL( !o§¸K~ô>ˆ$ÐÿŸ—¢ÍeDSöTÔQQcŸwC}/ÛÓ€7vC½Wÿòxî_¸m;süVèõÓDj£`smUšÑ4Æ5ŤìªJ:}637íjä!tþõÕ„QדžÓRW–Ã(&ÝdÔÆcÖ–cïþ”M¤ü°u/þh•7…_‡Ç»êf¦ÖLµ¨�!+¿]V!ë!@‡‚òS6Â]¹¤Ú$÷C°ª 8un–\ÓĪ”³­šߢBé§ì¬ÍÀù]e£Ë—ˆÑµÓæ/ƒ@$E72õ)f_Ÿ‰S¥³ÜQ\÷­ŠÏ/}¼<�éBj1†?û¢ âÊÑ3”`”"5q]ß ­¨ºüë–Ó™ìrþQž(™b3ÍÜGÀ™�À„%Ýöª;îj(°—V­4|Y�@嬱žÇaHb*ŒKDøTÜOàø6ˆzû­\9|ÀõäËC_¿ˆÎ)Ì{ë® ÖÉÞË`µ©16X‰©ÃŽlçÿýñšœŸ¢µx¥F‚�R �X8ªåiê—Éû8’ƒ&ànDLëÖƒà*&{Êl Š/h~4 cÈÆ¹ #ÅÀÑÁ”1Woy)¿¾­›"Ä´ AwÛÌQTÊd-ñnSçñêf©8áçñæÕÝäœ�Ë‹YJÜ™ÃK{f7‚~)¼qS%ë»A¬Þæ–Õ„ë_#‹]\`®a8¥¼ æd¨#´¡ àW�U5ɲNyë› �ˆ |2�Öˆ(‚Ñ�çµò–Ü©’³:Ÿe’èÇ]V§Ü�±T(m•.E:[k~½ rÿ™ðÚÄjÆq2Áˆ´…}”w¢6 ’¡û4¸¯ûÝU]~B²a½À®;¦v®g�É¯Û ª@=Ñš�–úuËGßë®hëÛHH' Âö£PGÕ|%âþ®¾”“ñÙ˜ÝâÔ�ÛQo„æt‘8­ÑîËRnc®°²w¦-¨L'„5ü¡Ùu¨0 “}¿å4T×:–2µâžb­Õž¦4C£¦oØRé&uù힤Aüû,8#™^ Y‰³M>Þ\Í' ¢ÖÆOúb¨]ßÐÖÀü¯Šd Çð�W…Û.f�ÝlS–»«‹RÙ—#<ޤââ@�¤7¾ÕHr¯µ[hô7•™Á�8$øÊJ).a4O4%XåTcðœm’‰Õh'}ÑxÌkNú"Ãø»¹(w�›ÀËŒˆ-žÑÝVÎОcy×¼f+{¨2–-•ÁZú�è‡Û+ß=Ù,’šÚ«z4&á!3ϡڎÿú¢Ujÿ�s7Šœu¤Í‘g�QØé�ŒúâÊö~Á. 8Nâ$ÿCX=G²J¹�×�¥“J �ò�\,` _”Î]æ=+‘;Fe²Ã?ʇ{>RÐóÙœŸºV"×XÀf‘QïãïºÙ7Nl*>PŽÌ·lÁã6£b4/ì|{=›ÙØy¿#£Ò T„œÁÙwÞ�eØ ——ŒMô9ã3' ”–ÚÊÿ¾D¥ÂÕñk{ƒ–ýË!6xLímöêÙ©¤0=ª�K-§®ah¿È–!cºm3V–ÔG½Ü��íª¸r¦)÷i“f|—œ&ª�z4M5MbÀz° ҹ勢áÌ›{0²R< FЯwówBÿZ½’vAPq} ÙÅ^L53¡à 4ýFÐú(0ÇÁ@]Ϥr„ÕLú†Dc—ÊÛ#¬�Ó„T)+à ò®"i?0xÁ‡®ð×Mü‰JvmiÕ•›8ñ4\ ŽÚ)°=x:¬ßY®ïÌ„ãm‰5æó¼·Ië™–c¤ àfž5?¸Z, O%9ü–I<’%¡[o'¢�}˜¶"t ­ K'„ÙfÈ€ŠMÌé ‡n÷G’š60)Õ�Ëmu¸÷©w»Hqøç®xVÉ­½4í}ñ›N$. 1Nrd‚Þ­ öûŒT:h×»ÿôÔôÖ (¥*€šˆ:OȉDM½ûq®�çfùýŒ)™ÍÒLýûÄÀבΡË�õûœµ«©íúý‹?jQg­ç¶Q½[K\»¨÷ŽÐÀ*‡´§°hO”αô¥yõ:Z7�¦œ8NÈÐD§B']b…ð–éLŽi¤ÎÃÓÙ,(¸aŽùSCeRí¬×W-Ævkš%;„;í½£ñ¤ESÒ“§£ÀS22áH‰BöÑuî ²»PÆÉʧӠåë9õþ] äÞvG´Ä˜Øã"•.žz6D™.(…·–:Þ ¢•¸ˆ²MYÔz�Âkx^—Ó²'7:H>R”•¨GW¬ØœÌùÔ³Ø~1 ¨+ Ò:À§)Þ}àìþä%BÄ;´ÜˆÊ,Rä?»Pv1G$ô’8Ât·¼Õ´3�ëh˜�²îë^6§™Ø††4 ˆ/.…Ë1E¬QN¯Þ˜%Ý…³¸|SìÕ÷Yöú…­a¢¿Z nfDé£4Kj™›ñðÄæµèÖTõY;葳C¤Ù�à†Ù†&ÞN­w‘n²µ­Û‚��}ZCš2Û…æ=8´&Ò3Úe¾Ñ585ð¡oˆ¡‰ÒbÖ¼ÿqÈd¾Æ¢ø\Hþ¹”µee:ò�9ˆ¯×Ø�[/ônEÎzõ%çcdÔº«ÏìØFp ¡Úümý^Ŭ÷õ@•-{Æú°Z‘8j2ÎRÿ7DYǤòlo¬Ä<»gg¼• {Šýöq“ÊÞˆ–0�ÒˆûÙ6¿e7Wà´|—‡Á¸Öîë„õ%ïFB™4ŠRÏüß–šRÆ4K+¯Î#•úõ�U':µÐ›tüX‡æË©'ƒV§éøqÞši¦aæ%,ίúÍøÐîùÞ!Ðâ B¯e ¥¦¯uãYüÔÇݱ¤_€8O¹H*[žvhˆM¥hB•.–»†÷Ž|ù�pÏ0i–­4k°;»ŒÃ¼°p>]65ä(>Ó¿ÃÞÆ>©ý#6¨” òi V§;@NC:<Õ…¸3üŒÕ7Í ¸éÁü®mG­h½•ÎÎ:Q/PêÌ Ê�ß«~å‰èL}iɨdX««Ã˜ÝoÉ¥ñÛ&˜€®Nׯ³e¹,èðWûÅÀ1Çí“kuϪÁµÉ�<�½æ žì0u_Iä·¶½^㈋ƒpç­ÃS÷øîŽä³\G“‹¤{P¸jæ[^>š°ZY*•‹<&ib’?¬cIŽé z»ë¨üÎ’3¾„_›u5¼÷ ²Íë!qÝשrÏW¥‹©uTˆÜŠ·!ÉØHÐÑhl¥9 ¸T-4Æ‹‡ÖŽ“B|d~KPÞŠù ¾À…ƒoDµÈ¥Â�6:HBÝû:7±Šñv±bJgÍs¢ÖeÆ"�ª-“¦ —H’‘u7A�Ì'!<‘BNÕ�¬0™¼^ ší”'Š•Ú´c4)ð:m9äHÅ9_'ù©bÌ*{*ÚŠXO´d#v�Ce¡IR0\’ ÍQ¾$+»«ðDH­kxK…7htîõDTÆ2Ö�®üç]a<{kaÀªÎoË1ko¤Âo››½xú[+T~Ó¾vE…0¬ß)�íCWïÁŸ?/ÞwjÕºÅû…9SÆ ™MtÂ~‚{¹©ÿ%ˆC4Û“ð+ÉÒnâ€Uw–Uß—\åâz¿°m• qƒÄäê‘föÕm¦’Z9NÒ¸ÂãD“òZÕ€ûìçª ¨]!ÊG�+kÈsxiJï:§­¤/ÚJ üÝAl;¨wå€Õ¡7Rƒ\HÈ.E÷ÐÉäÍ 69kuÿe�­Às˜HâäiÉ´ƒ/ c4s·Nò);Ÿeïé­¨]*¨ B±Ø~#ÕC`§��k¸k_ùW(/|Ñù�ÌÜCåò“†ó7yÆñt>¶0�ð<›|¸‹ó\Y(ÚpíŒY4üä7•Ë™3I—–ú4Èóa�…²:„ZçTb>–9Ë"Í"aݧÞëÓ¡wE @u߸I¤yw¤‡‰9B ÃiiLï°_8Hïzœ²nG] Í¯6kN*ã äÅ:Q6]È[¦òÕt�û¹¿%qé5îoÑÚƒùÀŽ—;®ÂüÙ áþð+êDN‡.Nô£Þ®ü)©ï€š;]ìûb8Î=‘f ›IÉ(_*'q´×øåŽñs‹7\O~EÕ?Acµei74 Ò3U,ê¬2%u*Ô¦°“|aSñK±ð¬1wAöm{)l�uvNrµ)@ø¦GÜâÖ,'Kz)Uy˜�]1—¾’åBcÝv*%RðÑ-­â;ݬü‡}>-_0®? £sm¯ÉBÁõ ŒÊLh÷°âøúí¸mÝÃØÉ»Á%¬×(w?v,xéM¦Q$ÛB-çìx¾TñO{¯@ÙW™Ä¾Nvê�å‹ qã=èÂù<&°Ú@s(*µŒge>`Y'8ÄI!¤¸k§èÒ¼]ùÀzï'ñtt‚ «ÆcŒtQð—þèÐd›£ÈD¡ˆ‘TÇhzúnÇóg‘g§Ø ]/v_r)k§óTBÑ>›CÖâ��S¦¤î •çwÚ! »äœùÔ ú”W9«¼Ô¾ÜbLúð“SÏŽó-pBÕˆº6øü�XÆŽ�ì<[¾Ì·&¥ylºúÖï»@%æ}“¿èÒŒŠAÅ£RúoAw"˜†Mc!8¤ž!¶ÍÞ#xˆÃb�ÎU‡Ë€e±¯çdb r$= ÚÃB m_¦9aöOò>(Þ­Ÿt¾ƒ»lèY¼2Φw˜fQú6ôþüÜÉ_Qîy§©n ¦¾ Ͼ0gåû 0(_á׳ã¿mís%HI©©éúDf °x­¦àJ ¡~æ Ú¶ø”ëÁÅ»&$ð'Ùv;Ñ¿¢ë!#Hfiñ‘K­Ô]ö!8RÞÚп¹Íýç7J1ZC0«¤ž�Znå ®ûº3ò<÷\vÜ•íó*d¼šIW4 2\Q²AuÌÁKÔ4Û�% Ê$(>‚ò›•vj‹ä!ä—‡®Ê~�ÐÝ`š $c¥‡‰Õµ=É(‹hÕø¨Û'Ƴ�N˜‹-·”Ë¡»¨Ô“æ=ªÇ‡�ç&¶÷‡5sêc=eè.[ЍC5ß��ßù¶Ó…‚¯K0¶´ðsÁóP%£Ò‰ˆñ‚0¥0ù  šèûý3@9Æ­BÄ d\ã°v®}Xg\wB–Å% ¿ƒŠ,ëønÎ ÉÈEÑæùÂf‡c<Ö f¾Yž}–É_yWDÎ;ÄÁ4ò¨.‘MKaTQ)‹ãp£ªTæöjKàî¤TÐí Ìh¡�ÇlxT‹À»yâ¯ÿa©í'šºbÂRØÉ pSÍ{Æ�Ý%% ltpŸÌC¤ÄµI D´ã³Ì=>GäÃ5ðâ2}þëOý�çìŸéGznÓ^ôQ‹½ Y†Q›•«EûÍlV‰¨³yˆUy÷ë(ÚISp;/`eÚ‘OL0áy¼&m§üöÉ!JÙýª¹CeG`!ŸiP”²³Ö‰`çÑï�îd“fû\K¨-™‚|ùôß´Ê) óÝh±L~o»ý»Ûg<ö•u~‚s•L+UPÍç®æÄ ‚™æ= ©)´(Råaî$I0<�ýÚY5L®Æ`µ#%¤–¼»°æ»´íÓç¹ÀÌ+h�Áâ®Þ�p†7j…`úMÀs¥Œ#Ó;¨ª¢ÞùŽË²‘NH pr§SìsK}%�„`/Üqò^r�fЧ”É ¹ŒPÐv‰`ÔX¢}KbTš:BʶóW”dúW:Dã<„a0™ÃQاäA¥ACÛ;)å åÄy&‚ W ãçŸïé�;…-ëߨúÐ+n) »ß<@¿›ZÐ,b£š`®:\^÷RT‰ƒ±ósÍås+—®@{²©ÿùä‹™Mæs]VûÌe™éCÈü5“´oo†SëFž,HÓvWX§º\à½u¡,'¬Fª2o¡úá©@é êÚ}$Ф(r­Y…©ý™ª¦­¸?�·ÇL„}ËìâÁí´}?×ΉT·nêÊž0#˜Žo‘•°Û>{%j®ˆškíq[åTû /M—�™ÛÑ;Ñ{'7Þ�Úc@NZ¢üÈì2í’ ä9ªtüÞLé–‘k‡·W·„óŽ/5ô&~wîN¸×× ®9· i)!PŠ,®coßÁqwYpµ€äI1Zõ˜ ft!,Á‰¥õ㈞lœ” ±éÊsͲ/`©8)ò¤:’ry­ÿ�­ê¬Å^°îMî´9Ó“5å~W#›e€„ªOL0Ñk‰soûó*^a«ãsé< VÁWä,2ÝòGlf&PzÛæê|º=A†Ÿ¾©®\èßšâΫŒöK¯�?ÐõîÛ0h9cŠâB&XYÖÈP¸Üc“å¹ÃÇ"æö5Ç«¼§Z¢-îþŽx„6T`VOÔ÷OÉü-”±ªñý�¬’÷âzZõºŒ§é¼a¬Š8]åÚÚ4%¯`Bµ1ÇP‹ŽD ÓÍø£'­ÒÙ:oÐ’N)Ó5…wL]gÏBñi´í"8y|¬¦ƒá†Ööä}š¬Mߌ…YÔЈ![Ï[JJ�?ds†–'1²ÍËæ‘V?"h¯?ÿlU1OamƒçÄPrãBβ¥ß‹ÑÔ{´ñËM]³µ½fÌìõGÿ­/ LQ—éôv�Bê7Š×{b&¬:MÝe&ØJh$56´³àýÒ>åß,eÓÚ‘5Ej·Æß5)^ô:y¶Z‹ÿ—ë†ù s�x“Ÿ§£ª=°Ø1fÝÅ�²o�}» N çf8¨ÕØK£D �w·kžDÕœžÄãDtem­NÖu gf·ÿM“î«£0ö‚cv=h/Ÿ.�ÃjÁ;›,³Æ¶Ž�BQã¡:Wó �WÙW5ô¸’šNõ(ù·>X\%T.}ºÝücžøöØyœïY$ú|½'SÎ#þË+ÄS·™åÑ ¢˜¨*.ƒ—�e"Zœá‹€íÉ�xûatqÊŠäåõÅZädÓæ‚®ÂMÒ#ϽÙ4å7)VÚè=á±’æ„Yªjçó¢íÎ+O¼ÓÍÓ¬¦šA¡MYè´EºÚb1…’÷m*&û÷éÎÔvtבƒ0†"Má—=u=4£*u3’�`D­,ß§3‘Ád±‘n ñÐOüæ3IÎr{MŠâ9eñ~ #ˆ+„zÐÅùÒ{ɾÿº/=•¶·ôûŸÐõÉ/=nÉ\Î0W¾¬ó™t-ØÊ<ó*Žd6Ô5Qq#M$S§ ŒCÜB¤O©GŸYÑ&ö9ûdiµ~ 4–*ì‘ š–ïÃz–|06ew°Ï‚o�‡ì�T EÁ/Æ š´ã¼ft‘ËŽ�'ýÇ•ùGØ6Iéa ç 04÷pý„Wìo+®ÉMúÔ”†išb• ìša’»YXˆ–¾üÔã‹Ù·»Ê‡ÿœ"9ðƒ£)I§ PDUbÚIæ&q‰´ù—ïÝ¢ã�tÃM¸�§|)KïȰ»B2�a¶Ö7/êà€±Ø03Wh ;d&9x~‡Õõ+@»„ZE©]Œ„¼è'€]Ùk ¡÷‡ÁeE1î¨0¢©€Qër©`DÊwñ6i¯ªËîo¹ýPýÁÒLyfU¿õý/Lw†óøiÐq&t±%¬ÞU2™O@iµöþÍõÿ˜ ÇJL׳S‡û’9÷ØöT~ŽíÇÎzHQ$müìˆ4a²½IÛFÉ 6gÝuÇDàs`zƒ-¾›ËþœxÁ*+wäØ×ó#ECuÓGȇ,¤¤\5¨’Y–vKŸ×Î+1u©‡éÈ깪7pÝŽK…þlª~Îz¼ðÔÊìÉùñ9nŒú¼„ÊQª<Ò&ûHûé-‰g˜Z˜68XÑͨ»äûfŠñçk�¥•^î`ZÒ¨w…Îý Ú#†0Hý�>Þa0VˆÂîÜ}5ª4Ìwæ#ñƒS’\eÿ¹yXîÅùˆ&~&×v98m©có_å¥`ÿ¬zñ¤¶5ÆeubY½øç+ô‡‡5=Ô[ ýc8vµ•z<Öõ¼<ÐEj”Wô�M–t™9ÀûsýxþÝ™¼?@oU þ? TR³Þn;‘ �9?-=¼^DC× [æÄã'Ne´s98*ý8À�¿›,†}"X3�ì”ú²1Yûh. Gྡྷ–FÉ]Kñ„>-Û·Œ½› „œ#«U?  ‡¯Îª€§n¡Ô@„�4¥°k�ŠŽa¯w÷cÖ{š$…ÿþÈÖùú1uqÊ™9Ž }â<…™oŽãEðá¨@„i‡¬Pîxa×ÄÆ¦�RmjT|^…blÄò„ö#NàJÖÍ6MiFmè‡Ù‹uT½—øžÌ4â:#Õ×ô¨ppAÌã÷ê_ÜN©°Lä—»òú°œ@‰—X³c½?ztg�j#ÑâHZôrøpw~$ÂÖ¾zt¿èe=TžÒõ"lp‰ý»C‘i~?ÇÁ›ΗWžó’ÑâR`©dÜ<¢¾¨–a:ÕŸP3æ :óÜcˆ2x«LA¤Xgô*yDŒBM¡¨/lÙžÏP`‘Á®{¤Cîu†Ë*�îÎXEYS8¸ðŒÏHUÙ-$ª(‰ò3±©É.î†.þ~\änZM›ö­t¼b¾ÆKu U¬Èm®v%[q!8e®}™Cîûy‘w=§‘}9*­èrÖKêP�-¹ztèY ñò9eEŸ1!íM×@iE;‰°4Ûê?å‘ñ²}£fŒ)"z+µ›´©^‚ëVäX™—ž÷Ø; ûøBœD“éů« ‹Â nŽ#L7žIìo;€[¤Á=ÚôëŠôlÂVtx)æG¯.„ù`9qà›Vʲ­¥�Ëñ[Ô'?hg÷�àgÊïù îAÓf¯ÿ¤ø@xHŒèd®b�Í»b(i¡ÿ(Ë]´žøë¿Õ·ÌŠ«>‰öÖ¿½5› l^ƒÃ¶èžH²K‘=׿§ˆfÞ¨XPS7ÌJNH�ÀnêÞ’ütþ¿°ÕÕ瀫ï�¶®:iùh WHß-pÚC™ªðìü ¤A�k±;‹`5bÇ>›%q/P¯õñøû©˜ |�7Xo�|QᛎÐÞ…ƒ2ƒô·Wušåð]!Æ4x¹ŠóVYJf‡4l¡õà¡-:-xh#µ›»ÿñ=©Yf(ýÞ(bJ6%Í×à�è•ñ QÐt´ˆ@n†Ý´zÒ Šÿ„oµ30J ºf íµÙÕ:ÜQ|j ”õu£ÊŠ‚,w~… ÜÛ¢÷€ýAiónû™wþÍeÕœPHų·ˆ 0¶õw°|iˆÌ6«¶Ñˆ¯XkZ6…6¹ÿƒWÍ}dXí°iÎK%�LÌÆü Ń|®,ܾa~GÂÉžå·Öü÷¶D¢E-¶q*Q_2¹[¯¥sG‡7O"™0�rÑÀ‰j*­º ŠÅ4šHÚ‘ì°5í$ªãíiÓ»¢›ú¤vÐxÅ"嫸Qð€ `¡ Bs_ØÄŽT² †ªšÂ�£ìB‹öµžy• GhÌ­óÿ$º_¢Ù‘LA(t™u™j ɳÑùðp Á£"–÷Î}“^ìÀUß´D…üÊ qi sOû�õ0ú]¨·H‘B½¯Ú 4<µóMØ'ö&¼·q‘wd”–S”„ІDà$—×þY—ÁWóVûØx£#„WTÓ°¡CxL.gMÓ¨Õý!pn¾¯[í‘f6ƒ¬cže0)e¬|\T\]íO¹�n`¨žoˆoãÃU8Þ)@-øx¦b6¬üš 'Ç<“üÏo>À# ”׎³ÞÖr#Œ“º?q÷ªô£�ëèÅòöjν%8}˜ =º¿Ú÷ FD.TÔ^'8ËÝaÂ'iÈ*šáN)p'“ùÁŽyE± ˆõ˜¬ø™Ëùõ@ÃÇÄERêe&à—ù´œ2= MÈ£´æ-’j]ÌnV£%äNÍÛگ˖­š–ÝÄž¨q?pj�Íû'a=U`üD@L„‡Çi–ªÙßž\šÀ”v,oÍÿûÿÍvðÝC<›èÏa³:zG �¥x‡Žƒ§Üþ«p{àN(„�ÆPu‘Rs þ¾ÕFøûö$Ê%-e¶ë(hz^BB@Ã~ÿ|Õ­,kÌÝ-B‹¦P0ˆ‡@W™ðÞ¾U�®i �³¡Už"õìÒEC�Wò×½¨�íRšÑ–$ yüZ þuV7,o‹—{ŽâG‘˜8`0hƬ\“�êÖ£ÊM”¬v™`5¤ÿ…ÛÝÎûª]˜°@ÞÖ¸{Ü æ “XÇAì•êq  }p�Ò�)mýW�q§óLo.º�æªùvšx0}q±62’¼eºý¡Hµ*¶ëÈP ÝDÁíá�/YfèÔxŒ¨³ O9X›#ŽuΦy€¾ËÁ~Uß̪Â"rÞN¡Š§Õë¾\3ØÆ|`·¬†ÚÈŸv÷g�hµ§Xêµrçæ” ¯¡G�`ÄúM*M© r÷ FÅ ¥UQÌuL)‹|•aü�Ù³‚�}[pr¡}0•ŒÝêŒk´Å–Ʀ|Ñ:œ?/b¹Þz DIÁeÖ[€ªªÌlU4o*ÿxn…´ÃzÝ!,Bíª*HÙЛ¦c'üüø€�ñä·I„‡,9ºæ©üqª� ¸è±³‰$:I¨¦EÔD˜šªŒ@•„ʸ¤Ðìö×À�Œ*6L“q¬öᬰ¾e?;[ôÐ ·bí5¡Y¡ØÂÎH:Ã��K»sÃi¦*b 騳:ç: ¯4’ïð�¬pôí|–Ý-yGÀ’ßP ,ck‘Ô¹[œžbuÔÝ(·Ø‹VÑ›'òžX8ìlFsóU²Ã«¨ˆD³+'�f¾;ñ‹vpÁŒ x=1H™‰AV&K1ÆŽ¥I* Î>“çÌ2dX¹6E³ÒTfD$Îr“KáeIbmLÙ³¦kTŸ^ÁÝìë ¶õWòIîØH\Æœ|w$5�I©™Âwbnq­i´¶ %�~Û{¾ªÅetÔ\¯-¢4ýøgökÒ˜³Q„sõ2fbЮO®Ð“�k±÷H… Íë¬ ÍÊ1Ò]u½°X¼qÞï�AÏÂâ~ÌrY¶Ï ¾ óQ?[ä%Ò>.‹üe{ÿ4OÐß ëU¥c„?Ú§ýìÖ-:8Ë_ ;×ùúÆ`C¿¦ØÙMT­ß�þ�ZãÆmâçÂÛ˜kyí©És•K†˜LùëÐVŠÆÅBÄ=9€Ç î«4)rþ)¯}ŠÎ)Néäõ]ìÈ•’2$¡‰ ™F’´Ub³§"² 8hѬá0t—ØíÏ Pað[ fèE!;õjÒÝH•TM=&š–ƒ~ÀÅQöAjbN¯{¨üÀÄ‰Î€ÖØêĘ19dP;Å Ó ÿ8•øò³þ3‘ot¼$o|ØšPÚXQ‹Y©ÝD‚c£ùk‚ìUÛy”èXœ¦±ñˆîå:ŸÙ�5ì=ç!IÆ™å¯Ln|þ†¡í{ûó_N¬ʨ+9³¾þçfUYà‡�4(X ›!ñW¾Ýȇ|¿ «ØjþDZÐÒÉŸ“dy 1 Èìu_¼ìŠèXI‹†Ýà×Ù,�œ|�X"šdoÕkã€îZ¦£––Á5øý/ÑÐvÀ5qË’žDDiöÁIUÔËÎ7{ý@P:]±g[ö³ØîÐ%˰!ªO•Àõ�˜ï§·q€ëYݽ‚Œ ˜fYâr�2Q�t —ø›¹tJN s¦‘×qbÝáùqWèy“€–Mä_–{H>ü5sJ D�?²{²G0Y 0B¬Å:a‘[K�•ó�€©Ôåd9Uqv€1¿zá`^ôù¥ýZ1#¼ëäº)ô¹Ä4_ÿá­^‡Ž¢cч¡¨ÁŸ‰È‡¦\Øûºµi‹~}#\€Z…ƒ¯xO{΋§\À±bžýsƒÖ•¸G n0\yb6(~>Žp†Ðqý�B ¾"‰ÉX×S—; / >bꪊÒ#h†D×ÄwÈ“±Þ>[ô`ê¼pМFŠ; ÚŠ K@VN3Šõ��Iñ$1•Ö&Ãï#µ«ÔÓaŸÌLßG“¸lwgs��O¶G07áçå‰s•S¨éÚ  ‚0;5‹£ÛBˆÛi}kÐHû !Ûñ¦¯çE ÕÔœ€Ìæ` YP{[7$ŸâÂÛä�Ç6RãpÚ†àžµ$¢Á‡Àõ!úÿ�\‘S®*¸;ÀA�|ÌM+�yÃIýÈ¡âh� �䆒ëÇŒÓäxä{/²²Â¿ÜÇSäÎ�zöÔJd¾Ä=‹|Ì<_¨(?wœQa(²ükÂlËÙŠC‘ˆ ©aý�ðÖµZÕàe+$$‹ ޶ î}‰:‡2VgGBlz@|ù²!R[ûç/0<}(­YÂS1,aówmÁfž½Û¸?u¡Ã^ Ä™\Ý¢�5ÃH›g2W¦B # ~tbx¶o‰NñJ£nv¬¦ÕÔéÊh�ƒÔ¢õøØ–°¹à_™CÆŽ€ ×?x!wÑDm�`âR¥3n/Ð݈¸ˆYÓXd-ßu¸€T` ¥oÊŠ<#VoëªD¯æ–-káñjý¸§ôŽâÚÆ#ÏÉLe24df-…Xݽ[ÙÕM´C{®¯.ÿê,íÇ‚yÖ™fäX_Z†1&ú BG°8¯€²ý“<Þàé¹Ô w b³å§�±z8Ta0[‘¸Ç¥Îœ3ï }NPÈ'™iá<×aõz_Ñœô›GŠIä¸c �­N Ýêx'Áx‰Ã²ý ì˜äœÌKþû›1 ­JF):ߊ/S[Ãíø5­ïeæ'ñXè�™rŒRŽÉ@o…¤á˜ä�ÑVÍý>W’UÁ )º ¢Îþ]Xü§Œí}CÜÖZBÁF×;JF�õIœ3ć‚—ÜØ R>STSC”—&ÿ‚ü)“ܧ�þÎÝ ÿÞlKŸT?P”Uèõ*S•0¶;ÐÈøH⎦ó•m]V&c½Ë"Rpå›V4#&¿@À÷"[šiYd ŒØžð³áPÊÆú Ü6þ¢‰g�9ˆç´6‚ö¦áï©W —ØI§¶¨É¥û.ÃÂ㿱iníox¨"α'8+,6KÍ'�z¾ÝF57½\�Ý7{BÕt)›PסæEK¿)û I�ò'P¢«]‚{2 6¤ÝýC%ó$~”õÌ GQ¼�Ö§Ö@ àºWÕ~S¦÷hnÞDˆï» ‹¹Ájçz)U´ =ï†úÙ1"·ªñ?§ÎÔÌšìæÃPpTM°^�pÐÍ%Óͽæ°QQÞ—ÔŠÒ$‡¥ôF©ø·�]7ºAÓm—G~ƒøzLV +è–Ò/|Þc…€våHáÍæ7 ý|ûz�•±p›\Å«AbVÔùÝÆU/ü4Ÿî“7nú}3Ln˜U²ýa ¬œ‡g—Ïsc¶Í£ ×{JÝ‹Äîø&©‘±?sDÕ/ rs« M$ëu­sÓ3~„EiÇ|‡M»G©$nìTšþÿ0çuè4‚列ldk.7¿Þu-*Ž0°Ók�µtØ#6k ï‘’¥ܬ…ò õ–cô<ƒ1 É97X [vƒ*xEÐY�]€R#[:´sI$ˆþTxÕÐP§ÔëÍ•07¢ãC¨u™(]ÓêQ®ˆS¬É„¶Çœ3vÞáåˆ?HvVÓ*ë X/GQ”ÿ�·ß¥ïÖð6gB%øYÀp¾Úÿ@skÂr\Ðl—ð4ºL�ê)mWª�rµÍìã±·x3w®ªqFý nö`‹Ãã€ÜTbO±áSÂϧŸµÃsÍùD#ÚoD z{᛺ÓMçQÏ&‡¨·7¾ Z½d­Íp±Ç­ò¼ŽÄìôA©¸‰nzˆûÁ��~MßH§¹ ÿ®}U<Ö5,�9çúq>Xvhxó‡„}œI¥ÑÎøÏú0—8Ü‚Ä+ñVÝ—|á×Ó |] Z:ž#öáÖcÊJwVbÆþ©Ÿ%ñ¦·y ‡„‹»¾¬Ï+3†ÖÞË¢–œR1>[ÁZl(Éã$H3¼òH—O5úúA^Dˆ…¦%r¸{ºÖ¬F®›H=Ÿ(k-¦”ß T÷x™\f\.ƒmú¦š†�ÍFªûÍ¿›¾ùú�b®pk3-©`�Ýþþ|È‹c&ð6Z‚Æ%’ت6ÄvBFU¬ÐŒb¶Å4ßÓ(¬"Žéý¬{\WHËáÎ÷:]‹¢=Gžðö�[R$è'ý³£�#Y_êKaâÛµÿ{Huc#4Ù0¡s®46}Ù¥l“ŽåM¿6öÐNÅ0VŒÓ�•ð¹ò±ó„x4£¹¾_à×vÓ^RˆÀäq”õßf[Ú½ƒŠCÄ™]w•ÏC7IÉtÍÙ:ØÂ¥OKú>(-ʊ∈«V!`÷ÏÕ…©›‚kµ4¸ºj‚€B<Ѽî©ãç”â:½0™�ðÊê‹oèo×fŠ`+‘:lö¤EMš(š/ˆ}��kjú£ö˜ÐØ®%‹v’Ê5 W89HÚÃ0X„nf©íeXßFàΆ&døk ÀÍ(¹�¾ 9 É»†Éöèó‚r�ïŸ9ñm�†™ÒÅù<- „A‰WVgS áP#¼äþPóš…^3¨ÚüBßj-Ï!¢üt9�†ë%ç ½yq Súñ׋‚¢RŒiÞk1Æ€3ÀœïåÍ}?”kªDè…#€¼s@MîO$¿ˆ{¤å/×1Áñ1=®±Gí°^·­É xÜ­IŠAá>oŽZ1ª[¶V*L°‹å �%»�ãgBxºrjítpíg߯—·ŒGÄŠ¯=õˆmÖ—C“®¯½þlÚ›XêlñUsÓå¡<¾„Ô¤_Qªr«|—NÁ øaÕIƒOÚA×âgo!1¦ªŸ�[†:?‹Ä�K/îçòë¡ÐäRVº.òÄ„qydLf[Œõ®ÚDÇ2à¯9ô~Ç•<˜Dâ.…Ù–�ô¶çùðá+•WéŠvÛ`Þà�WˆB”]ÀC*…¾p{UÞñÔ.šÀ•¨ù#vÇ‡Õøvük‹¨£ä÷ ê¨³2(Í"¯¿`R+ ›I¹ë;ÑDÅ�E¨²j¥ûÍz[Òk«ºÉt(Èò?óa6±ÖЗ*ÏÖZOJ�…*<útËùhГé£û¨Æ¹Îuþ)œ¼[ÙÐÅ3Ò”‹;¡ð‰µëÿ¹^Ô2ø·¾‚¸³þíU}äô‚ûS$ÆÊß¶µáùõ½\}¢EJæª î@ÙKF¢(­ ÙxjòÒÚÁ:wQgê^'»ºßj€T‡ÆææiplòŽ*æ˜zå.ƒzÕH†Ab§õ¸W¶Ê?M2ûwY"S#¢@¤Iá¯4­¤ü°¯–/†Ð#ê£OÙúÊóòø0¤Ùy2e ½Kø zךÙMý¡¼;¿‘AÒžo �ÂnC •€ïÀÔû¶î¿×B!·šŸ?uÏW q›Ò4¾S×TyB:°P0Ž v¸âÖ´øu–;m·SqIî/kŸ9ŽN0µm–P+ÝéD»Ädsº^«¡� •[` hjüöun“D@$ò&Ä®a‰í¦7Cï]S¥^cœ[®Trü7e¨¶J \Š,›©pIç ýj7DCŠ0«@æØG�Ä#>uþÝRÅÙ“ââ,I§i+Wh únÖ£ºF™Î!}Z=‰°ÓÐlbœ¶cZzÎ>V­¢˜åb£ˆ!bŒÑH.Ð(íôZ×´‘ñ¹Ø·cLæÞóM,TÒñ¼š=RJŠ@L@fg”—p_ì”?PæKmŸ…ò-ámZ;´ÃíÆŽ½æ\•er{@.ŒJ8Cfƒô’„ÿÏžšã$/5ÊFëØóаx´…±ÿ*^4‰uwbºø@GyÇÂái`;õê ·B‰ž8ä—ê³T¦ú ¬×vT¼5 ö3ª=9¢´dD�ìlÐÅÔd@é×ñgýr5|É•0Sà’ÒMxA(fH; -hòÚC¤�wªÏL+fPС^¥éÄ< <0*é¾;72¤~Pwù´M}ËU0Ry3¶{àsÔ ”Í\6 IÝÕC•Jv>zE³þðžâÕÛ0?c¿¯…ÚˆÐm�†c/ -+=¸hT}\e̵K÷ v‘”ß ®kþæ ÕOÆÏ²îš£éæÚzY’ ]ÈEž9éÇÛijV¸SfAk vÝ6†ÈQ2�#ÒD6Xí žqšÇ3šSV:â»ØŸ ¾™5dÿdˆ�u·Ö‚)J+Óp9brDr‚Ø é µæFÓ´‘Î }ZSÜw 1>Ë~áé<ÆM °?üå‰ÒëâG<- …(ît‹ÉՌΎW‘u‰~Ü/÷êºÚ¥€ž:Àýg•÷X@É™¶¢�â¶H^º[}X-Hl•®¢Ó˜2®¼¶ú:Ný'k/ÀæÍ¢öŸ¼KœÕ!3‘‹ñ¾*浘«îá#¿RâL‘#( |ØÂ­é„ÚCöÒ{ä8e]tM¢ºxè© eoÕ¨u ÏúÏÙi9fÜ:!±f‡bÐЊWá’7B•¤øs®1””æm/*i›� EAg8'Ã9;6zK…¢=s _;¸,'¡Uݰz,N¬[oe�ö·+‚7` € '†�²”³•^F=r�„W4üR¾ v9þ�p¥˜êÅÞ§ ’·¢€?ûäU+,_º< rñSJI^‚.º{¥ê¶ów)AE€C^»ÔûòzóÞ †�I;øX�Ð ¦�ÖóÌÒ€PRP-ä+Y¾T=gÖY ?[Žé/³¿ñ‘Ä—�â%²(Ÿ<Ñ!|s§sgq§¶L{=¬ºfq .VĈM8ÃüѢγ��q·ìH�‹¯èµ™u¡ 9À £ÌAæ1¤*36¯f@1çø?Tö áîzr¡X¥Åe³½èvÎì]6Aê\[ÎþZaÏJ¤ \äGµ ús#OÍ•â›L�Ë .EKmr‘ÊÞñ QÁ›'¢¥Á¡ÇŸE ø�ƒ¬�¤·:ÇÞõžmêÝùw[“œTœws€aªm‡[Z_”’¨NóR‘ê(õ‰“hÇCJ6 \ôQtvKç•óƒGÅ¥´´¨‡P*¿‹WᶉáM®ò3XNUÁ÷@8s¿²7™ +-÷åÝoôòâžñŒwéå¤<®Š-ëãð ÜÏ\؇��NÆ‘VØCÓ#j½|tz]”¡ÖÏÑÁjêÇñnY’üÄ^Ì5½¨7Fé¶dóBî”âʧG@Z@-� (�æw­÷riÏ®ÁS1@Bµð[—Ñy/ÇB?Q¶Ö‹jIW…ª™˜û¯Úv<Æ~»&’’ÆÎzYC—“…MšºwI�`u°nùÐcÿ�ANÛiVéªÅ^PæŽIn•äÕ ³á‰JUˆ 6î´‹®HB�c_€£®ü!§9“ïJ细6g`Û3ÈCFS)�üqJçsÝ#M;¾b€£!@”*¯×dÁO©±Åƒ“•ýGͿԢh¿F�M�ñŒä‡óÙ¨Hjä0žÝÌ$:η˜…À—#|Y’çÜoß�j¿Œ%pügn†Nt†90@Æ ceccomp-4.3.1/docs/images/output_trick.webp000066400000000000000000001454561526046660400207700ustar00rootroot00000000000000RIFF&ËWEBPVP8 ËÐl�*'à>m2•G¤"¢!&{ø€ ‰inî¶4·Ä¯´�>Sûg£åcýÇöoì|ö5‡”•~Ñä#ô÷Üç?×?€×ÿÕ¿\/Q?¹þ ?™ÿ‡ýÖ÷9þ÷ûAîöÃØúgûoUŸõžÀÙÏÿ÷þkþ'Õ§þ—ïÁgõÿúÿ¼·ÿÿïû€ÿöÎé7éô�Æoêÿ$~'ùçõoíߝߨÿh=¡üOå?®ÿmÿ-þ?ûgÿõ¿Z?/ýßñ?Ó�›ÿþcü_ï/¹_Æ>¸ý³û?÷ï÷ŸÙÿ{~þßý»÷'û§£¿—~¹ýïüOí/÷ÿ�_Çÿ”rþÕûwý»Ó÷ú¯òŸë?]¼[tÏôé?º“÷õææ¼“ÿ¯þ+ÚãÕ¿Êÿcÿ5ÿ«ü—ÿÿ’?*þ½þ3û§ùßûŸâ¿ÿÿØýþ/üïüÏöïÝïñÿÿûý›þoö—ÉÛíŸì¿ö«øþ]ýƒþ‡øõ_³?IŸËÕÿ1þÃöWÛ×å¿æ?íÿ›ÿ_û7öü«úçüðèÿû�ÿÿÿÿ›x69ãêöþÝ3©¶èJ7ày¼;õ¿™}eúFõo>A,�bÇɰ#bPºC7§¼÷üsM9˜\Ä5²†rÎ�2‰rC`2lî·Ðì‰(S²§xø¯ÆŽÉÉxªY´Å̼߶kÖäyt]æÊÓšH%oQ¬p8Ó‰O�Zú7ο 7Ö*™eËãÒ[3¨Ê:¬ÒÞ(mß>°òþì;ÑÀ‡‘Ó?Gì“i`9ÎχA0�‚'ëjo˜÷£L»Ö»ÏƒrËãA9²Tͽe÷°fÓýè�$p,ü(ßP Ûˆg¨pДgGtn`ë~Õ™¿­0|üª�õæš*:¾Øw5ž”‘{¿²\.4(N U”E¯›Ðã½²y5ùæ­ î/om…óOZÚÊôûê�æÐ¿–º—ÀÚ¹ˆäúhM*{ÖÔ ÅÓT_:{l¨¥9¯ý¥–0Ëœ¯¿}Íw89cÃr• ø¯txTWº<(™›b=Ê�Í•$Â+s ãã lƒ­PÁý•<L^ÍP3ì™×LXîrµPÚèdVTødõÀa¢¦5ç$SÒœjù¾í¸ùضÁõø|1¸¾æ(ZQ®Ívƒþ)Fú€VÝî� Š÷G}‰!¯‡³a=š^¢Ò‡óñ=¼ßV‰€ ÀÚæNLgd0–@ΣU¹œ âÐúX‡-)ËI(á«…cf‘1³aH˜Ù°¤LlÖdå>ê•&i¿ΣÓû»ÊÌNùgùòvƒxò­�púë6ïp:_ãÇ@»[)¨ÉŽðb�+UW-R!yL×@ŽæKñ Ý×· 4r¬~?…™fȳ?HŽÉ°ã�_p˜KeŽ»J—NšcÀÏ…m¡]üw?QJ[oœ4�O!§KBZdäq,9¿!®Uã2Ÿ‚Áú¤ÂI«µ‘•NIO&eî76üCþݵü² [ÕF/µTúÓ´×´J]´šòî´ÞJL¼ �ùaõêûHƒÿL‹/ø½ðá>êź,Xíߪ£ÿ—‡Â“{j£òIj8¾?ÁÅØ="&;£ ÂAŸË“x/ÎÚ…’~¸%ÂÒ¯§~!E0ûq«ºÆ=qþA„íñYÙíázFs5Hï…Ôßæu-»¤«G§JIkI›êÄ?‘+ˆ>P¬À�<ûÂÁdâ¢×Åz6£žZò–¼¸6raŽZ˜ö!ÆÊ-YˆÒ"¨E®ëÁµ^qR¸a¹SO{ïnPø>ãT¸þ8{ÜÄ,;mEåÃ�“X›�ÖT¤°’ýíÿÀO 1›Ú½*ãM)”nzå‹—IÀÚø-^îðJgfÔ‰8ÖõŒÓ+ø˜T€ƒ¼5)x3÷$±�L«ÝÅ‹¡¥}êÊ„vYR¶¨k°C·Ô}D�á¼þŽÆ5;d‚˜GÂá{�ØÆq.¿µ¹ý?,à–´†ÊÝ�1C°½ÂÕÉËÏ…Z=~êX°å¬Ì#yï aÜÎ%×a¡ÙM­¿˶ÞmÙ±$þŠt[Ýè®\yå€}õû2¬^q€$�­Yy *¤W�[?Óåcf‹„·Øº\A\îÒÁæb¼7MÖA6ÓIÁE…Õ:×(³Bá²zì‰÷ö ŒlÆAî’1#…J?õ&ïnîVW�@¦W­áUÞaŒaò£Eryj(rÉ"³AÎ%×¥Éĵ¡ïì…÷fHû†Ó�k%˜ ³•­X?�ZŠûF€ã„ÜSb.íš(ç˽*°ÂŠ p‚Òh#£†ZmYRŠ4Õ$¹·(tVùé¿.Yãy‰Á—�zŸu½€‘»!ÒHøžqû8µë“¾ è°•?L hžHaŠS”}ð´ôãî … ¯PµZfƒss˜J-@Lù$~ëhsöAµòM°w ül¯Uk&s´t`“:ÓÇü2å´•ÊNRo\B^ò  …âÃÛZç¾Þ‚Ï©êV¹õ{i—Ô“½U÷ ójÀ0£ð£}@+nf"tÛ«;%ÒÇ‘ö]¹ —vlØmÈî÷Ò —¤Îš¸ò¿—ï„(Œ?ñE܈�áAuÀ-3Vu¸C3×0;ùO¯©÷€GÀÛK¼E™ºlLW¯š;F<¥Ü5lgA�¢[É›q~èOZ|s*Ž0} „IDõ¥[Ô¡Ël§�ú ­‡¤­YÜé/74­4n§–u¯Ìw°‚ó¸Î ï'êW’[à©@+nŠ÷Gd.bØŸ¶¢4È»¦7Ê—üÁ ºztAE€ñ_/û¥ÅªÏÒ{üEC[„»‘K)µÈsg]ß0fœfꨜVrwƒò:jü¥�·Ü%È{Y'ë�» çô4Ñ+pù$ìt—i¤½Ã}‚¸�rÈîÄÊsgÿ#¿wuijDǽé{嫬x¿�gáFú€VÝ‚\kæ@ÇFöïOt‘Ö§ûLÿdñj¥g?+ÌS2(ݸ�ì´Ȯšè9On’êf;xâ|Ý튄„l:ڽܕšÏäºs”¼Tq�J®(á ý€ÿɆA0«UôgbyàQÚs3À½–¸·Ñ©9 ý@�fóž(ÒQ„ŸNųJU¸O#‰¾¾F¡{5ÄÖlYeߘÿ“[UÀŽßåߨ µ[ _nÝà—DSN+üÕ•Jü5!ô£1Kî¦\{Š\¶¿G¨–sFAÀF,ùI'ÁþI¥gɽÐy§Ô„„èë§’ /ÈÙ°¤KÍ3 éŽÁ¨¥x©Á Bx³€Ë–”xëunˆ¤)˜!hs:bÂ>m³ˆñ!ø1�{ùY6ôÔO5¦ˆ×–#i¾^­Gþn…h bÐüÀ)Œ E¯�Ø5¨6ÓvZ ÚÅ2·"�uðnj;±›–R­ßÂA„¶ÐÅëüÅéŽ(Éèµùy¾w³8Ðt}𹕻z(²´´›3¦ÌYÔE¸áò"}0�C<ªLÊĉ^èð¨U/°7RÉ|Nqc�o‰¯C@Þ1"•<†š@Sýž¬ý.góm0xP³À[8•MÁ˜�SÙ‡I=ì(S ô2|º)¦à2ÒÁbô âð"t¬Y´àSȽ0ÈeÃ<Øÿ�®?3G|2zv�f`%�³½N!Dâ³Kó¢*j…¡%˜Ñ"Ô í™^aÚ-™w.lÿFî¢ñutäŒJHž˜¨Ú Ô?’5¸ëâÁŒäæ†ÉÇ9ej�•ºËá•¶~ÿó·9��Ê-8R_]i­SÛÌ�÷7Fb“¤W­[Š~¨ÍâFÁýÞ�ªw@_�]›¬¬ ï±þ_êR5kš’ËÉSÿÝ»mm?¢ÝM'èÜ~ôûq‚á›ûäûÔ>zIÉᎺDÏ0� ,”}ŠÅúlÅmHŸñº¦,Íþ¯�>N1ò³?þþP§ü_B»ÈÌ\MqÀ„o/ ËïÊÚ¼*N¯¨ûa® r‡E4ÜóXú·îNl »[í?ÏÙLJÍ:µ Ù‹kÉä÷9˜ÏÎIjDÕöõ6» ÔØH?•-‹Ã„ú‚(˜óÕæÿëÜXš'ž˜–3:­~~V‘1³M´ä ¡od¨GÊ—¹ ­8/Î$[ì ßT$„чfg­Ü¢d�¬23>–̤6©IÁ¥Ýý³œr»ŒiFá#›0{>šƒ·3cXz‰¸’C8��¸ŠS—ÖЊM„ÿw²‡LKå÷aû„j±¡ÇQûªc�5‰ø§ŠÍÃï,$A�k…¨«Nnh­·E{£Â¢½Ñ7mœ`I~o‰5ivêbSÆÇX� [ÚÏ+¢&°¡§8X-�"÷ è¿Oèêh,Qxl2x˜ìŒñïVý#…_þñâ”´'æ�Ï‘ÈT›£ö"´ ½Ò7û]Þf@ ³Y¢xÿ×ôÔ.)!ë&´0±z¤£â²ý2ÔVM‡»2@Ý™ îÊþã“4U�‘f�yv…D�»ëx´ŸQ¡<�0åÏ¡æqkV%/� ¶±îÈH~ú.Öc¤­É9Êÿ³Æl³¬~‡Éñr�ž¡g+¥¹ÁTJ‘ú8%½Vàž¤ ’—)èb©ýnnä@Ù³rvåµãßµ:|BTˆqßQ-íŽõ¿J–Ô/Š?ŠÉ.}äÃÈ©JÕ"žƒ8!QŒd¿�°£n.^Ï Š÷G…E{£Â¤ÉjÌÓKæù™€c�•9AS.€ÛþE/úª|¬[ár!XsPç´‹þN�“Ò4uØvpN�öv:\l˜è¯ø +މ W��´ÜTˆÐ„úr©ÉݬQïI$@>¹·Y›µlvЉ§yš_’ö[Q¥[§U~¢>Æx«KoÅ7\? àëŠì%"0T öë¼*+Ýî� ïáƒj3 dW=±¼n™$´H�Í‘þƒHÙŸ¢<ñó~òv›8©?Â-âYPè_î¿äQ(éh‡Š(5/ç×uÿ.îÙo¨/äõ/šSlXá�ŠhÁƒA0Ÿ'çÿîTMüÌÆÝŸ†©öñö1+°µM }æ"8ZõRsαåy;C¸â„K‰6‰�› D±²o’•NÕdw qcñ|=„”8Xú~<ðÙúûóøKzÕ´'ñôž+vªN‰­ÿܳè9ÉÔ~–™S@À„ëEÚÛ]tT\DH�`ŒQÔ0ð�v f$&]º˜ÿ¤r¸¹©•‡åºtlͳ½¿ ¥Äl«†(mÇü_D£Ö¯”ý›—’é×¢ÀbˆV6l)6‰ŽÓ�*B@Cþè|ݦä±Ñ;-ûZE}õ‰¤8ûõ$7çžw%¸™¦9ïFvoÞ³~TãëoöLíwž`Ožú({G™`¢»ˆ�ý;•ÖõjÜÒ8MºóGQr`gßÓã%KpþàÝà¸ðjøªZ'æyÝî> ¨õØqkCÒAÆÇ]I£U'À@ÜSÂÌ4¡‰Ö‰+F¤V™FF„ç†Ô–q³OY ”4•¦±cf‘1³aH˜Ù°¤LEü›Âkû–�I/µc¼°ùÝ%”–)–¯óãÅxÄhY)›�»9œPwÊ7Áo2Qªç4 æóX�ÀMóž2=ÿiµ¿GG ÁŽXïÀ²ŸÕ0ÎK]G7ÛƒÙ@‡7f@¶‰D‘ éœü \b„r&jhÜ«xôvœ0yVŒª®«ßÚÂ[¾@g*q$å'O‰Œ ÇQ*Cíwêhæ|Îÿ ØPETWlñL&~W®"t¥îö%˜å&tâxû±¤¨9 ¡WÝ¡ÔÞoZGh�iL’ß-îaŠé*š²ªE5Á[m÷i:Ó­E”tX´Z¾RÍlø‚×fxêL²=J§ÞµŠ4µo¾ew�®ËKo5K^ ú<~ ¢¥ˆ ÐÚm(šûvŽß!Ù ÊÑTBoÇTÉñ©\ž/27é<êYú*½F*¡3ÀÛ%Í™à"H±ó_EŠí 0‹ %‹Û"tUì�Ò[Î�TtE¬"¦÷ˆWFo <ÈITðïÖãZ­®)èŽ!E 60¯‘-³t@ñ¤çñEJ}Hþ°O‰q19Ìyçu>µé¢Š¬¡±d»2^í¶Vɨ�V‘2Lu½ÓûÍöÏ�Á¦÷—X-´¾$*dd/*xeè?  úÈ»Æádûf°¯LЬ2x¥,3EíÑb1+ üþ!UÝ&#Â:Ϻx£�ZAZ~�h\y°‰‚¼¯KÃËÙ.W»¦„ëV(¦¨ÝÞC7äÎ@Ç®ñ+Ìjáe8Ü6Óª¨Ñz©¦SáÆ+†·)è>©ƒ§?9gÈÕ‹¥J;¦²ÇÀ÷!+ÀöèñHÚ�iéBµ÷2=K k*“e­ã™‚z"q�Ò¯I§,øqñY»˜8x‡õ¨a‰•$›‚¢éuyr9& yˈ:xvá$y,—Q)‚K�ªGi¿´gÁË=ÍÉ ÆÑ˜®°ëíS¤,Éñ‘î’ÇPv�¿é億úPL£j…b¸†0Ž ïÓoÌkØá<¬(,ô‡Y”º5êN>Ê*SRôÀT¬žfÐ[ºs˜½µ�¹� ³ÚèŒL€5]µè�ѲZ¤æÒá@ÉäÑ„µ¨ «�’æÏ“Üé(ÛË*6�ÍŠ«)ºû'*¿,î=3O‹ŸÛ5 æ‘C}þt;Ëc˜&p,…@• ª;»%€‡§/©“¥·Ófg/‹ž¯£#wÓ¸ßGòÿKø\kϦø8|ª.'BÕ3‹ã味÷.ðñ=hefÛ‡�BŽ�b÷Þ€‘°Úq}3 µ�[eIµ«»¹aµ 1›×ËNÈ2Kù‘b.§âéel¿Ûe4’ÅW²°×`.Ö‚:î/�õûÂ:ºAÛÀnŸ¥µ‹œ­”x�‘�-iÕÞ“þç_Ì@q»Ì*)PœQšFb!# ‹c³kÿd³£Ùïå¸m�Iš½Y}DJNÝRØ,ÈÃWÆFí)ØÃÌÏa(ZGÖcVÄrkǵ?¹‰ªbâ—Óbz�Ñc‰C„á9süÌ­ç>ä{’Á wTÉ�³¡¿qƒ$½¦ÜÑ6i��l7,”ãô¿‹8\ýõÙÄ«`Y—QHÚ2f2ožÐwrÃÔ|…P$&¿çÃ[”Ù©‘uolPû“$�Í.YЄ<¯]Âh¸O`å Î�2ç—|3çôu •&UUœ-…\¿H<}UC!7Θvmp½ÁòÔg‹Th¦ÌAð×bÑçSÄìϲ•öšKîÖ–¹áËó`gsßâÆw+èTÉ~s�Õu]ß:—¹d¹| ¼Û  éû¬�ý³œ°¶9¤7&ÏC«0oöªÉżÖÉp àñ4“¸Ï¶îgç°¸òÏ:ã+2>ìt»G”cÕc¬Œò•N) 4Ò,·q©LÁ¿ª€/µãÅ”¦šèu<š�gw¨î1¥Âñ†eÂÏ–§e§Gqqu¥êgwº„ç L>»Žÿ§BçÌוî[ÛcQÀ4Úêm¢Â"qÍÝ¿¹ŒunÕ[·˜õ³S+³Ì’Ö¦t{ö1¹>}_—±+ò-Ñ—ôs ù¾˜q † 2Êà+Kãwu2Á>V,u5TÙ‡2E]ƒ$VÕ$ A8O2™2ÖÁš{áï/�›™Mãûõ‚Àƒƒ¥îLcëºój#Ãו©43šq‰šoMÝBb6ŠÎ휗4o'b�Ÿ˜ßCµNþ,hZ)cñ8V¿ñòþ`ú÷#;ŸÿÏXÅ"g˜wç¾�îúz11K 5µ¬^(‚|ßô ¦¨ n^F“3¬÷n¸ikŒK ÿƒ§‚3}$M‘ñ@Œ[& °Ãj]á€æÐMI¯~‰vúÈ]¡ž\�µ§4éÑâãY7þ}¸OûpÄTµóDW\frSä´Î .gV?<â(â/õq·ÎÓvÓËuÉþ•ìwæ�r!ßô¬0²° ¶ÊuüC]-‹dS"ο´ ¤Gµ™‹´€_ao•Ô,âãËïr4X*ò>ÞÁÕui”Y¸Éê`´@;·›”‘a3nŠeÁ*Å� ÛÞ·zÈ?ãirçÌvjw W¹AÊ�c$Mrr•ð÷—•RjÝþ±émøÜ$Ú;‘_#…ªcT†dÂߦ¥Hd‰ÌÆÓbýÆ/eŽ ¡.¨m¾Îo%x{q*z»!‹P D1+Ý�=zHkÒ‡³“V‹ÿàIyPÒ ÈjVLâ…[ÿr„¼��óqÐ:fjÎ5m|,‰"°†X¸çà¸IÃLU*â_Fœ•_†tŠªfÛÛ¾^Ð_¹æž ±±½NKg|°«µo^Õù�´ðm�ß…S¶Ï4¤5=UÈÏQá†ÊäÅ爥ëAlm“ÅTÀ¸ùþ…|¹8@¸€Ö´wÅ™y8×<øãf[tŒcbJ/Ù!Z–¶† ãùe™[Þ鯳ü”nd€Éž�zš ÿ >tÇ3G|n¿ã�Õ/u|r=Û‘#ûhÔKæƒõF`›!ñ%îï52dˆ§ÞøcaÏÀXpG­U¼a�Þ¼±Ó0�Ü—‹Q¿ Hþl(à| 0­¸QðµUšJÍ�×Ýa�]?AD3›l¢N€l]2…�bàO8cÒé¼14š³ea}ÂàÖ�¡š OLÀcD€H˜ §‚´€;ëàÈòû ”ûZœq%0†ÛƒØi=g Dù¼1(«äͧ?ÖŸTZ°'â°Ë—º»›fŸ×¬)UCÅq#ÍTARd5U¯ùÍÝ⺠Œ¡º°{ÏH‰,{¯h…g¯ÝL+-VNóÇèKžc5ÀQÖé-&ôÎ1'Œ7Q®röQ¢iYÌàè!eãë(íJí¸i\gÜtzJÉûWPG9Ê¡¡HÁ0hs™ c'L|š~6^�·±ÅNÌ&Ÿ„mÿïá¸oj?dÀe�'Bd©ï„:´²3–�;SEYÜÚ¸¸Â)*_0¼MSô‹Ùq–lx¼ôn|yÆ{hß=!‚»ZwÐ>efªö¥yòPÌ~0/9u WËS>®½|ÆäDV‚ C!Û<šëhB'Tµ4*TñÇ$G¡FW ÂÁ¼cqšÔÌõÊï±Æc ‡ÓÐkö­Óä¯ûjÔO¢r†äU†ÜrÆ2tìHŸàÙÚè|ù-¯L¹a}€'I ×®îYð²¦N•:¾²¤LídD›\&Ÿ÷‡ŒLI~„ïµôÙYü³^×0Y~œ3Á{‰‹ëŠSãQ42¥™M}Ñ^_^ll¢µiF¿XQ§ø«•¶¢¤Ø¥ŠÁü óšzOϲõö4ñ!�8‰ª’ ­F¬— `ˆëX4ª>~CZ6?0F�T©×˜×é³Й®6Ø×¸2Vð›úŽ)Ó˜:’ý{ný¬]†þîSkIru ØîÚÍä`ûsÔÝÑä5%Ó‰¾Ö'Ì� ±Ý¢Ü†äèb‹BÏ ¿0üFØÜ‚Ñp- Of4wû��p¡ÀO¥Ý\ì&AñWÊóþ'9þ#Šd(y.h‰é¸0ª¸|·$h¾)Á)¾ÞÌÍŸ½éiµÃW Øz[q)APø·z†Ž`ÁòZŠº/"¨úùÛ!Éâûœ´.–/Æ~tŽë�»,¢ØŠ×í ^Û7íÙÙ®7jûˆ]¬üõph[Öåý‰#qPˆ¦ à4\F0á�®âSàˆ…|>wû¼÷ù JRk+¹ÔCeï­os6 #¶Îׄ‹�8 5�Õ@žD¿ ¨¬àô4AFgÊ´?ÉÉÌDsÍÛtˆèywËcM.wH7€+…¥ÝnH.œ²½MÇCc¼ÿƒÚ´?´1+q U}exí×j'Cù�JÊQ!uÍíJLª¿;2þ›x„C¥«r­SÅ`xë߀Ý쌹Ö?¾,£1[‡óøÄ/ †²Ú¼]é]C¦È·µºvÿ Ñà©Ô]§�ªe _-V÷þI y—ò �"ðí=è߯‹t¦8ò¿\e°~Î <©Dx–…|‹ÞŽTø¾kÉ9VGNüPºÍËQüª�-­Þ—aGã· ƒæÏTò+[BØ’y–XÌ3Cø¡O²|Ò ©õU4d¿9›Ž¼+š£�5é´!›Û8{DŽ"_�Ö·Vµ3„$ˆ¬»«~©6ÜíÒ<ÿd�…ößOY-cFŒSG\r*5")BXr)ƒjÔrKI\_ÕVqAE?4dõM”�o49ÎYr‰�û‰¹¿×,w6‡º$§Ô6mí9@¯ú�}@)õYé¢pK[Jü˵+%™0Ñ×µs,MZW†Ù8‘w?"ž=I¦y¹è»¶èø�ÃÕG'U²naˆ‚ìLÖY yuQp­ü˜Lmæ�zR|�sQ‰JTAÐe°óÚ"�‰Pó©3œ¤"kž1œ+/9矱ŒÓlVÎC¶^æó#mÙ‘ɸâ3¤¦Wµ5ÀÌâ]¤£ûÆówo,À«¸Œÿ&Ó­É:õ�†Qü½9n9 ¡ŽÈÒD<™ê4ÎøÃ¦&dZ¶ô^dCù·§ê ³~{Bÿ�碡i™pjåñÐ83~”�þÎ�9ÀÜL‘ÿG>/䌋-˜d‡gÄÎV…• ™ç¬zðÓ;Œ½�ÁÒ9ÊMqôáÉ §j4%¾·½Ã ø¹j‡æŒ¨™ ¨«ô梂_”ñ·&ê#E5ÒØ~lÝŸë½öâ~ÓÊttMÙw+z¬µIFAµ˜5µÏ•NÀ„D3Ë\}{|K‘õñb/‡fGqÜH7R»µ¯¶9Ë„Q¨C0Q�ñoÁÕAªlAä=mÑ}V5­m0šU™Á©³]ì˜&s”ø0ö“f]}zE õ½\Ñ0¦pêÒêÐo & –~¥}�^pl´DJO綈 ãL¤˜qmnÏ‘¤›A”÷i@1lU€dÇ(¬ºÄ_QöY™dâè~=çK[Až‚+Nì‹ûõêr H/>Fî¦1¤T´¹J²Màói É÷7Êsä,V§Ið^}¾ßm�,Ãó4ô4&Ù‚½õP“bCŒ;Xi]­Ï¸ôWÖYbé´lUð]ºïðZ¾¥ œ¿EÒÏYþÉ / 4@fÏ0Ï1KšðžóƒÜhò¿A†º°«œ$? ˆäÏ_ =4-ÓÎ_c2MØFX–ÙúR�· 0“Ô¿t©‚òÌÑG.¼š­T½®ÞŒÀß%£QÖê7UÇ�™³ÎJ`;IØRyncƒÉñ¸J"²/éy ùÞòOìû‹ÿEõ²Åz2# «ô /múË9KóÚaŸ2ÐÇÔªj®øYË´]Xˆ|ÿ~Hþ£ßàÉ}=ˆ›ÏòÕ²_=v‰}>9�ðhËJŒÉ­ ‚ÿ°êdmù“�Õ†ý£�ë4�:ÉÆvÛ7nÌö PÀ·ò¡èt¦¸[²_‚ÚeôúBÎÔ¢A0‡Ó´—ŒCf8À š!ö~Å@†!t´íÇ.…Ñ{zâi¾|Ï•×?Ó±‚~ÛFž˜`ΘG�º’˜ƒe¢<0|¦^—»HzßU¶Ì8DB.«È Õ«º¨7 z}9=ê+NwÅ>0•&ô UãYÜ7HŸ0ÚVZNç-â³!7ð¹z” è’o˜‡àÙB÷Ê-ù™�¹Óììׄ13øF2N©s èÄH"_«x*ºúsrÁ‘õ ’r„&œjE¾Zläš�¨‘t¨6,ý�ÆÆlÇvŠT”iõÉ æ°T�¿�C¨ƒ’hòÔr­Ø¸OMKï=N¡3áýùŇ )íŒ]˜IûLÒ’ÂÔÕÉýá¾_ÖðeÊÿÞ_c³ë)Ï? à´ |_ìÐSŒµú‰± Õøí”jbU kèD#°îÂïB®ÀÍøY%F?Ë^@…E1Þè(ö5 ¨š# Š”Û“*š€¼?+È,2ðæ@Ãþ<ÖÊ' 7 ]ØòÚ· ÷þ¸a{`è�=(;µÉ6Ê4mœ¾l¨€quBQú­² m¼ˆ£[àf½‘$´RÜò];IKÿÄ+VüÄ÷2úwÿŸÝxò_WyÀÀvÆ‚› dÛ±çê› ØØ1ýK:UÔÊôÝ9Ú¿îMª†AÒŒV‘†â_å«ó{ÌåQ�»›hÉ"Å•ÿ�Á¥ëU€Ù�MÕ28.ÉÇ8ײù¸¿D�{sç™ÆmƒêHÏBzãô±©0ä¬s€�=%7"Öh©tÓœÈÓ÷ùòÍÁX¾ù»">㺕TüÐÛJm&ö¬Ûa®"1<»n–.ÞÂÆÍi“̾Ë\¦X?eã|ÂyœjH�°ƒ ®²ŠÙíÿ97·ã¬t2Š;PqLyÏÍjè¨D ?n€í3K1tú½=½ë'ÌðÙd\-nHÓÔî¼ à…úý;[uöý.¼‡¤¿yØÃ~½«þäÚ®2çU4º9&¿êóëóìïžr=®ÿ&Zôœ!´Dã;¹i׋“vÌ•‡‘æäñÕDÌßF�…¿Á®¾ùÄ•£ñž ÖŠÒÖm}ÐQÍý”fmlsDz+íkdèµÃÐNœx¼-ÎòM]-+6Ïš[;˜ç ÖôÁuUJG2S/ÍhÙœ›c~büÌ0´¯›Ž=Ý ¾ØV€\c°M˜�£ÊËïN Zøs“UŒ&î§lãÆ.oøOâô§‘ÉcÏç]¸ nZ,^ µŽãé$|ÉóÒ¢RA%”f�TLJ‘¶dLa`ç½kˆÛAG«{{í©–1)³ÿ¤ì_¾Àˆd¿êa3ëý°ºY«�‘Êq®,vÊÝÿý©*ÒEŠºÖ{>1׈ãåÖ�ìx7y �qöÏç¯>ðu:>Enù7>]·ü„É=ä–aPo¢¾¢Y§sg�BÎNfµ¾(Ú w½‰n¶ G²+Lµ¶Ò @„Ùš{éS– èjO‘*T^/;LD’´ôVb@÷@>|y_1$†A,äµÞ>;ȈÆj©i\R…|�-ï_< ¿¤ÞRZ֥ʆ̹ɰ¢l,yÙÖŒñ¦ò_Ð81 uÄIJü:Y¬à,ƒÖ¢-{âÕǺ·qòT¿ÅʨÕÄ•ýÎffÔ^úãb}Qš'ýÍ! �L §_�**®FƒÜ�÷viJ)¼MÁÅAì]n‡+çÅ“�«ƒ«óÆfgõçð5I1ž²8yy`Õ²Ù óD‚æl-ÿÌÖ&{íéí;2Zû�†DCì0sÛ"\òv*H&Ú .1þzÎiÇDÙ æ†Îò„�?�ìu3ÂX1SKIY,+|Ú%à=(HBZGà"›cø˜'ĘT{h�¾û¦|KáHn ïõpùôÏ¡5„j¿/²!è2¦‘³¢¶¾Ä0WbI½�û–ÖèXˆˆõ-ÙïŒyÀ{ÆØÔ²½´“)J9q évÎe|õ$¨œ” iê&)ûÃ7Ø�C±¾Gáo81Ç2ª!g«×ƒ ³š@j( ÷'U H{õ�m5£ì‡âô"ƒ‰Lc sXÔ±€ÜþÉÏXæÙé:ݪ2•íéè]»˜r’¿˜ùã»=©×�ëà´X"Õþ@àswN´@ÆòžJJ£·»²ïtÓþ8v �Žq±ƒ°ÈP !ò<ƒžs½gÓ/bNB,øfÀäŠâ¶ ëChè\Åæwç;Z|‰AYò;2rHUÕÂ.d¦¤/ÀŸYÝ §v~sK¡.|Ř€«¾þ?]C…,³¾ü7F0á3(Hí‘a,�q�¨K;œ€Ägùò_—r èêv@‘)|*zñ3_ˆvþË�h@Á&_j'¹ˆ°QÅËS)!~ìÎŒ�ö @¹Ì%àMþ&g&s—Us—ùV€} [u¼i@r!S!ȃ˜�Ó6Q9r:eêÅ‘ÕýÞ5Q¢û¬~0mn�ƒ NO§âº<*¤u:¸ H KW»¿\lœ Ž9s£�"å€Á¶ðmyàó8uëšÕID3»÷ºïä( Ã3z‡ô;a�àÕ%_€pF§Ð-µ*­,wä—ÔƒMj›Ÿ�Ž ÚÞíƒäÔ¯i’·p�„Ðuµá9ˆ…)FE}jàrúˆüTöf¢0llyÇ1<Ê%W÷!AMû+¬u¡x¶áþcÓ‰¦Úÿ º5¤E›lr½‹Yå@Š0‚ƽ%‚É?*”‚þC®,vmÇ„¨NÒV³´éªØe,Ðg©â€¨Üúû:¸ Ѧ‰Xâ<ú{¸à»/Þ-e¸7¡cíW£$1„RÄÈ( ¯$°—Ô° I¤¤·œ[$�×-(®ŠÀ÷=õ|õ ýv„e¢¬hýQ^ò¢‹©ˆá_qfÖ=mU}öÏTê{ªÛ†êsÅ"Ö¦³uv= œº­ÙN³zI¹~ÙWaÉõLç•h;EBƒÄŒ(â¥Ln°Ÿ'™Cxßi“§„ÖÜF¼9²€—êíð¥á‡÷;Ö5Ó:6"V£ u|¼Øô#9ÏÑÑûk%j çèlrÙék>·1Pé@[#| †‡…•�µ dÞ#ºïQh‡ÝŽ(/]EbZn×C¯ü<†H%ȧ€F+ÁF^÷jE¦ðŠS¼t@õ†ç‡P ™B-óŒ©äM¦86Å…?&õ„æÅóe¯°2ÓŽ<À!jSiJ(xªrl¶–ýï7)#Ì`î+Q™¿^_£,ý)B«pŸÀ€ÜàÍÀUã(möU½ÆõçÝFfdo“n¡9×r“íÞ{9É¥Q¥”þoók/F�ßk¸g’–Mˆ´úÅv‘íwNùØksÍAÖeô·Ù|ùB3R0eèG\8 »ˆqÏ01ý®"èŠ%-õpÄ©Èþ–¬d¨2~�ëŸZ»6`�*ËëaLéöR‰z&c—ÕØGN+šë ›3 y:~V8ïŸQ¡|ëï‡?<}Û"z"£~°âp1 Þ‰ÇÔig´ã�ê7½*„Ú�õ3þÇ%olؽЃöó€¨Þä¤(²n'^Ô1 ·IžÐ2<´©Ø?áЋ%ÿ È—,9D›çS~ÔbYÜ}¤XlhUlA—¡Áí«ÇÉ‚È?UìäžpwñÔè[;Tl ´`1†{íyFZclÒý tÇ“æÄAÇ9^Q:éKœnŠ…rV¼²ÑTí)·º=Mîlxç’#œ€ñ‹D¡ªµ¨ÿÓЧ^*'$–þÜÕpÿ禶Y þkÎoÙ�Ê‚¼øq© Å~̉Ìgä5Úrx?àT~NÚ ”BQÚ®v=!Y68’]ÉjKR Ƚ`—Sì -^3¦œV�ã�K1k›z~Çèãà–x ?�Q$c¬ßÍ}�Ù�hQÍwÕÂÞ¿tá÷ p¡ì7°iN£¦6~þõ_½ÐÿËÅ’Õ­Ižù˜…’�Àòù>%©v”’^g}WîöM�wøGÔ¤‘"ÁS%8ܲ†|¡E”Äù½%Ä0ž¦\¨V ¨?¾Žùœp,ÜÀvA,{ìRJ$ù3û´íLæ&˜ü¯ÒÿƒõÒʸ£@‘ß%S?ìÕNÂkI æ݈ñ‹ÕKõ*G�§Ê¢è“?¬iW³#èÕ]TÁ™á” O–%5‰ú˜µ¨ú·,>ù:æló¿òüBJß��c/Œçj-(Ú ;¸É¤…~‡z+×oŽÁqË[�9ïŽí®¦ØfQauà/5ó@°Ä ®ü4å½ÒðéÎ#þ€�¬o(õ˜^->Ëʳ/a¿Ñ3„ ‘åatוZÓ‘J|šï�—úˆñÜT F��‡‹¤”HtJap‚®åšþWV†-Ê ŸT+®šÌ»_ü 皦<7 y0œ¹9-C‡¶°{¤Ã¢FËÇ^Vª~—PØ¿Ó áa�nݬ†æNAv¯¾ N$LqýÀÆ’>ïPŽ•c‘œ!6ÌGìêvÚHžzí�¾ù’¢„¾2ò9–¯k ¶‹I÷$)Ž™\ÊiÅsO/kV²²5èÝ�½7É2.äJœzR„Ñ@ÙÙ ƒþèƒ�Š«".™ž—[ê`0Gô"HÌŸB» ªaÄDÚ¾vZÑYªO}dhÅSùA )…‘~ž%š’&à€Ûwá#þhqÒ§†}²¡ëÖÚÎNÎØú7’áÑ1¹ÕôÿåŸ<1 K{6æ{/`¬6€Ràf�«’Š­ú&µÆ#½ØR°@~"å±ù“T¬ŽúúÏɼ$�}9±èž¶â=㊘LÖѤ1y¥Yù’Ž$Ýé z… Q"ÏxòVØ­¸¥Í'ݱO¬Ç—¾ií5®ŽÔY•"ñ~Ú3c4U¸oT2¸¤\Ã�‘Ò+Z§³¹ô3…CÇÈ ,‰±62•0ÙÖ@ ;`ØvkO˜‹ŒÅúÃ&ÑÊhB[óäÏ»ØuÉΛ§¥å QP¿#®¤{‘ÜÁì1Âí‚ÓÉÖŒ`©P·ÓÕñÕ‚ÖÛ,-p)¨U,õú ÌŠf„¼ ô]Fv�S<5O&–Œ®“fÊ'Á* ûÇi#“ê:aÙÕ÷î:²^É›õ‰ØÿبJþ4¸”ÀmÌvÛBªl�`±JÊ!� | Ðø<;˜û;Îã ¼m¥÷[tðêDŸÛ‹ƒjNÇ W×§�Rw-€�Ï>È(§×<ù¡Ÿ» ¶ˆmR¥vÒ±ŸÐ¨C:bœƒ®¤ìè/ßé9ž¨uì2sÛŸ` ´…T®•½¯ò‹fúNnî‘dRªVEÊØðãZÉÓß®âS¡)T‡,IÝ3û*¥¨;@òÛ†œœ>Yù¬É+ÓgÄÓËCi¸2uj' l{\p;Bå¹Îœ`{»·è™ºà-Ô-¬wðÊ'Y••¢Þ•ò³Þ~ÇG !SÁ/ vSÈ+u3j¶}f*}(�Cûˆ Ç„åF€êŒ÷CÐÍ¡&ÿâ7¸6¤ðNYLfYˆ¹·{.½j +ÓÛCè@¦�½ �¸?[ -"oÌÙÃdÌgF3~«ÒCæ†7)šÒ€S7TÙ«šƒ¡ÿb8TäÁÏ‹ÚÇDjnò­·FÏNÂB�q/þšï9oI‰2gxϦ6Ù€¢õ•dº@WnS8ÒùF½‚b0)¾ÞºÍâ‚”±õœ}!Í Íw®¼ñ¶š‰$ÿ¸AÝøiÛÚ²d{Bg<�^§tQHñ“8dO¾_.ÿP¨È^¸{ ]ÿ9Kìä_Џ%÷~tjö›š¡Ã"Ë� ‹�ò@Çy\³š ÿ˜ù²«Y½�ÀGôÎf£Ö•5òªždñAÖ8 ¼~¼’_Èȱx÷‘wþ�,ép°¾Góë!"$·ƒùs˜ R Ë/OºŸk¨)…PŽ(¹U†äkUì¦B¢ý_ÚMä㎃ ûvdT1�‰lb!YA±¤SG%�UBƒ-˜È ÇJ¨¢¬{˜#7��v:ÊfŦ¤±—®¢èî?#¦E;>sR/’+ù¶hÛ¯ªq%êŒ92g#Ù¥ ɽJ;~zéùÄçc½RCïn{fÍ YQ²™&#•ÔqúTíÛÀÁÁôºñá¡çI„¹a#Ù Úè'õÞУ™^ú€µBý º`c™Áô‹½pKîü&ÓàaW»i€Dšð$/ñp£!u¾ò¹g3h@RüKÜB<<‹Y×»< žîtÂ*I™�Q”ˆ¿iõÉÚqO¤é!öÎ �bÜ¢öH0¦:‡£JVgÇ9p(üµ‘�œêäê'›/ÌŒXóÊÂ`ƒ…:˜7#èUá™�Bå‹qB½Î0ƒï¼%÷ Õ‘I¯žZ©ŽÖˆ³®¼'Õø8Q”œ !CÎk/P^‰·b¤ìû 6³±ô¶öv©/ש¶IKs¼Ðy s2Vô‹�7Ÿ+q• U65Î$¾²ñ°±Ì€>Œñ]¯�fÌŽ•Xb3ûÏðí„ÑÎ�"~‡ªIÔ�ßÃ3Ø·9•�zÚ«èk$õ„ôÁºÍ¡<úåÙS»y¯�’€¶ã¢™~Ÿü@¦Kš»¾hÌ e3çÑc[XC 5 kUÒ H tc ^ŸÓÎ;Z䙿‚ÓAˆïå8z/¬K­Ë@Ÿx‰•d KV-ìWtøè�e¡üç°Ê(·A‘”óX�ûÕÞ?6eýŒ"šç~ãGÒÚ¼9y¼·¸ó ÷¢^K5�nYüRDK >Up½ËèŽÄØëœ�ws[—^f‘PCŽ»ê¾,­à!ñÜ�’×%Cà;!Ú“éªo×ðs3Å[èwß©�wúÍ·oLÜâ4aÚ‡pP›‘”áûÝ~».F«—BÊm�!E L�m§Œ&2RÀª[Uö³ � 7^ð9Umk²q-ã>|o1úqѵ9¶Á@asC-ðT›ÿ Áhz¶Öl ˆ·©.þsÈ�…aœÉùòN…ŒOuöÊGYd¥™Å‘!ip±Ðô¡},èÔ3ÇÆW™·‰&$íøåSåûk*í‘eÉ10É¥Ô¬ 7�?³¿ÆA«NÒI”~¬ÁœÕ�ÜÔ½²{˜ʶ†iœ^ÝWÆñÝÒ`É”PÀ rƒÑh‡š¥µ±jNÅ”ñ5bÐið†÷I¶EÌá†W¡Œjäa8¡K߯XéàðTéË»f½ôËú1<ŽlÇZ÷7Ě憺~Qý=4�̼€z…!G¼ó/¶šÕi¤˜,uÝ�¦Ë-èáyr3¼ïIûE�‚….N%¼;Á;§}D±uß¼¾eé»XG¹H€JÅŽ¶î5XÑõ²oOz�1fBb²Þ€hñL" skN8 ²L¤x ‚²[hm¥«Ó-ÁLè¬õ°"ã¼�� ¹žºII”¬Á êê­°”#…?Üq¬Àô�ºÂ¹Ûe.ŽOØÿ ãÐ1Ò¦@AÁz@m‰Ê€ïD”-ËbºQ3'V”†e›«^Gµ¿\D­lLŒ |@¼=¦¯=ÚŒùÙÝiŽ–;½g4Ä”ñòŽÛQ„[Ûn§ú=¶7âmê0ɥȹ¹³cC™oZv=ÚšÝßÓmÓìº)ñÃÇ ÚcG¿ªYòõoÍ’lãΔooõÄoòÉ})ÐõŒ`ÚÌä.×2¤Qo)l%O"„Z¨ÿ�ø‹—W| Ý&=Å‹¤‰W-rˆNDNßÊ”0„w¶³e/¥•š–š{v¦�gš‡³b ‚_Äš¨ü2 ÐÀ¾ƒ%)™£hkÖâ…¼^é &Œeòw¨ÐÅô5îíæ†ÿÖmò‚Æ#¨ �;E,�1ãaû|`c)kF–2ã °Î ¾àRQnw¶&+XÊ­IX� Áä+’ÐÅ_º Í,ÖÉC½ã°þöösÌ9¬6Ýi:ã´˜·œêëš‘âH‹øŸUßÀ�ÚM‚Œ‹ÓÚô¢KS^LAU‘Eu« c#þ¾þ°Ç¸áOíÊ€•ø�7™÷¨¦¹õ›¸77u›ªÜ€vÓ´X�O¾÷1}.“+µÉrïú�uážÇ_L—š# ¡e£G³ ~_VJ‰Š/Ä“À�HÄDw�‘è½,& ÃÈ W$%ƒÖ7gLjp{¥èÕL%‡lI{4ðYÒ5»ôã³ ÖN²’èÔÏ99õ›Ýð�º–å¥X‡ ØúÑÈ�¹Û±W4 ˆu¢ßËg ºp„JŠl×êSÐ,6TùMQe]¬â$îõù„1±i®âÀùsƒø;öìÛ HªŒ L~/,U‰|û“Õ}÷ógAkÅÊ¢^8\8À‘AUXÊj€‚M]Ÿ:êÈt/nšþCŠJ÷z�‹ø8Ýú tëê´Ø½¾ÙQi’ ¿ý?©wðÐ…G'ê*HËúŠüºf¡Ç‡í¿Xy˜I~8ör=|­£*X?’+^ÂȤ�6-G:hR!Á0ÝÖì Ä ^ÛMÿøF.â”™;Yb «5H3Zeæ²ÿ(š4×ïój‡`o½£�L‡ªƒƒè¡ÒZpÛ‚â,zF"|…zר)I6~#”‘ €Ñ|.eýñFoÞø’ëᙎÝ~7¥½’�d¿�£åÄ©±¾$ Êþ¯ÛË=›¯4ßc?PXPQ©¬…ŒL‰6À¾úÉ4µÇrSÖªŸ3ÆÖÚ!7ô ÉÕ-i%Õr¢¥æ eÏû·D²Nç)bÇà*‹2©ÜŽe¹GŠ;ƒó+×+âý?écAºHii½EåÇÁÜ2õÇ&/Ë“{øÂCÈuIœÞ›‡®×Íÿ0°ÀåÚÖÚWã÷›L1‚çljK„ñûÅÃŽ Z±þ@ƒE��4Ý}štÀF¶rhH?ÇZG$±®�Þç@2¼7ÿD¢X 6Lc“�‚þ›û 5ß�uyM-ÀNÒåk‰ݵŸ�‘êy2Ý0_)ÚÀ¶ní6—¿Ø5qËÛ€u9ÆÁð�ïCZ…qŒ ñ©Ñè8�˜2êxùÉý ­Q•|‘ U›ºR¿íYþ,šá#̵6Xk½j�·´n5RБÌ(ôìÞ¶'PíÝîµê»¦W„§®…õhDÜy‰Mä2n·.Žé”å—°ªžVûÆÓVY5èO•Ñ•š7w. `ˆ+IfVˆû†v³1[w²X3�ÿѼç<ÉcíéS\A˜Ê)ɆŽì¡ÎS¨]Eù¿` î™kÞ9‘Ϧ�׫͗ç’ÿ΃.ó�©çŸŸ †ñõa8»ÈBD/¨ÒÇ9 x ò]âÁäá&ýöV×jOa Ð9?s~N›Hˆf7°¤F¥§ÿß” &eÙ±j®0)!¥�=Nbb£¾‹þ(P}A ×�<�WlK°aÏ+ÄöìHX�ý)T?¡9´Ô>ïȽñÛÛ#t‡Äâ)·w¾–Ù�í—Ê×$rשyà°å*/ößXhÏ\þ“öÆ Ðóë㥺™}Dš YX§ÚÕc½Ð,Cg’/|ÓБôò›øTxÖ‡Rõ§æjå;B¨ZÃ?Ý …øª_KÕØ¯7-rÙM†£]‚UÊà˜ô{'%°_ü}§Ž.œZC.ÊFœ‡�^MXƧr�Þ‡òÄæÔ°}qÔw2ÿXˆ¨ÌÿVR1üœ¨îExàÌý?ë�¦+‚%ÌsøÎ…¼y6¹„į²ð ‚ÀY·þ!§')°c4”q>˜önl ´×Æm§5®G3-ÛÑ(ÈnfDÎbúÁŽ–Pò3B•ŸÊÑdp߆À¦4�Ó÷8Ãàƒß8ák?� ‰¢äfO\bQB*$ braÆwв�’˜Ð–›nª,œŠéàÀÌvŠÍŠYnÆÃä8dðfê×:º«hµ».Ó~ó¢YÊ ¥v�I `¯r¬âzÀ6 ÛÑÒá™ÃýŠ‘e÷tŸ�¶šQ,Ë…Ga’oï¡tû0©Lžù=tÊIèG7WóÓåüCT´À¦î_8' qÌÝ� sCܬÜ—IK”.ƒ W jÌ2{ŠÃ O÷¸)û �¸ÿ޲çx·©\,Ù§ƒ@9èTúJ}´¿>ÀíF«ïäW lË•!n®�-¹k…9%ëdLÀrÌYöÇ=GذKOŽí`Y­4½ÀZÖŽG¥’;«~OÁݶWŒQ.”~Þ‰Pþ‹ßFªÄÁ>×Uì¤nMÖaN F f²HÓΊG5^\ýÙ{º÷,5™å§!SMÐhÆ2»œk ¢;¢Ò 9 Va Çö_KœÒ¢‘D�Õ¸N0¡|¨¹ÊL°ï$Â-¡ñ¹ÜÛúx%'ÒB9�•ŸÆŠaAìòxfŶ•evÆjm¦ v˜†¦NØÃ’ý"“÷BmÔ‘W8ÙGt`ºå4ÙâÒ%½T“«Tnªe 2¹Œf5÷Ć’àOÍÒnÀ¬ow‚Eýý.@²(¯L_€-‘Éíxüo-pZÎPÑKì’ÓyŸ÷çX>ˆ ¯e ØÌöË¢õ¡03îômŽGøò&sùd¥y¼{kºe;Sázœ°áq«Lm“ñIã'jžÇ@óláï&õëÆoÿ]k.Õô¦@¾8Ô)Iœ¢¾w09,Éãlßõ¤”ûFy~ ÀñºlrlMËÍhr,ª¹gpλ_‚K¢º‚üè–ði86ö\�Îoj=¯½1Xæä.[Fg§Š?ÇÉ“Ïæ\cPŒÆQl@\\ôãGÒ‡,0Úø†/©ð<ñ®NV¨lÄ©”Œw©L6t^²–#³#ðŸiÙ~… %¬a#sÓS´ÜÛ©x8íõ~`;ùéXª…à_°ç±’ÙŒ¤gŠ{((+ÖÅÈU c+kf%ÝQ,ìÜE»„ˆ«ô0B‘†Ø/h[*Õöƒv“YÝ`ƒËÁ÷T(*SÕ9 7.€Žœ�4k˜h�ÇJ2ù‰A”ààyÛAÉžN¨áë%�³Jp@T ñùÈ~¸˜Èés@„ðwh­b-EºX1éÑ5tXytvf×½J¨çí-Hun(u¶«H8Y¬TO“Ÿ1¦ýÎéεpó¬°ˆì…<¥8:LbÈ\­ssÍ} nƒU=ÖŸ¥ª(áÐ7U¥§€ÉäÝ4?ÐP3>åú=Èíb ÉðŠHÍ”–"ÙŠÐS“7�kVÈŠØRpl\Dj#Á=êÐ$SU1uÓÒS¼þ¬—%³D»Æ„Ã"M,Ô¹MÂ[ ¨š¼¨b€ dëϨI¹€@z¦’|*”*ý9‡–0cõ®>û�X� Ï/ï°§Pú}ôkÐ1Ô'º­. Ô¿Ò»ôc .iMQ§ò¹t˜Äý˜ ÐFÓ]†˜Ø(†Áwy>‡JVL"Ĉ¨ö.¯IL2[Ê ÷yq‰|‡ âø¾*(ãõçÑ¥ª8¯/‚`g¹¡ÉJà•C—’LÞèæT‘æ¢6Æçƒ-t8š�¯�Þ¯I¿? d©¼Þ  ¸ké¸ç°Šß¬/qôüH‚ûàÕ}]Fã‰�mc5TPsj†\ûö­¨¢2·¦¤E˜'rè ¿ÅŠ�•¸Æîg^xHy™J†÷ªãDvuüæ †p\̺ȿ%¦~3Z{®"ë>§3X"£…죂N]aR5!�^ÿ?\jœ†¨­¦ŠEÕß{ó@5 ­=è y*$Q’{¤fƒp9AÈÀñcYJW=k‰œW—ÿa{gƒsûÄ´Oç !f±#ü;{dzh$tÌãŠT504Ü¿:¥S‚À ýÇoîO‡’gl`5±\*±,A×M»ÿŽò)Õ¾^ï%Œ\œï´Ÿ3ó‡õj21-j¬¡Ï6½À> ÏHëKwÒ>Æö­ë`ðJ?Ì`úWÖP`6²–#µìé.ÉÊ�«t %,›u)î™sŠÚÍ!» ÁæÄ/…=?ö +>¼åM°Z6ÞTš²jеÇ:¼�ÿŠx€mmÆ0´¤±ˆ´¸äÌõÒìiLUe�œÏàe—é·{;@+^(¹�Ž•hrWü¯5[êè4œŒð+þ,ñ+ûþ*ÍцáÍÿw®Mƒ‡8Q±·WZF ýëU‘Ò¬ÿµ¥»ª�J,-ëœE°x—©„é¥ÁY2o‚„8ÒbÿÛߤôm ߢàïÍÓKÈw‹\>T>�,k¼8{•¯— ,ÊVTÅÞj« »0€ñ¢æÊ …í§2‘Ž·[¿»ÊsI‡„@ê ™×ñF�ýŽ$ÌúE†à�0Z†¶¦’ÔÁ^še>ôÞ·Ó¨ËjtQZgÀ‹�a\æ€ &”•ÔÛjfÄ'†7‰òu©+“!,å�!Ë@‘‰à¨flºoð4i&JŸÀ> ìÎ3za½“UÀÄ�%° pJ{slr ŽË³=ô¼X?…ݼ%ˆe>âu§ŽÝF-*± WÓ©ÌœoEk:ÜM¤Š:‡¢¨6�}(¦Ëã‘8ãwµÑãð ¡÷× +œÐ„Ò’º�Mx`Á uW©¹É¤Uƪôu†+´4˜¿öícV™=z\±P3Õ.8ЭR¬>Ѱ°M›®M‘< h4 &�#ǰ»„DiC5÷f…÷‰JÀ<‚ô[>ãG—_95ø¥‰ð6ÓÍåý¸&VpEh‹@]>yÝXý ޝ‰veh iÑ7€Ç2.¸ý…S–ÕØðñ"jÐuìfq6¿½{¡[ëÙŸïÄ R×J™]á{›*êWÇÌFô|ÿÛsŠ6)N ÎÓª¤¨o]OP•ë­¨éØ%âz¦ðëi&.žÖ*ðmª%Ϻù™cÁõoY+5/†¨Ãtƒ9x úõÒÛêh|Fo£ôû÷¤ |.‘ªh÷Ò!-¥ÕÔœ6Ѳ9»%vm“·8Sºuù¤÷C‘öæ>li ë…Úá|û5éÆÜGý²ï#ƒJ°Ö÷D¥>žFÆ×ŸåϽ²gìtr"}º„Š`XGéµä¯¡¾] Nü}¿OzÁ̹£i÷jÆÁ©9¹dÖ‰ÐtdÊ�4¿?)]1)œ ½Lܯ²©øKñ™îŒfévÊO8�ú¯8ÅÝ™Æî0ðöê_s™»R÷¯�Ø'gã×.÷ )•�¹ÅEÌtXl÷ <±øáxbªÌÝk;†ásèì"Å™;dRØÊ�ÎôëH—àÇÊ”öñðLŠHk¤yY¬*çø‘FÒÎØá³Ó“•Ñ@‡òEüÑÉIJXéÒç>)+³ÂY?¢÷Ç£8ÊÚ5+R×ò5Åo(…èe'?î Xˆœ$ËzµiÙ·«Ôð$XØ>0®R”/lãuOn Kë�§L²Et3-È�\§4�QC‡ᓞU?OÞÝþ:qR$ïZ ³™ÑšÊçËéóŬK¿ M”7¦ó¥|‘|—f‰ê@ÌmÆ,Ëè7üþY½WÒŠ¥Úç)ÚŽ/¢t?ÉDûÌÀûù…ö›…íÏÉãXЦrõì,P‚Òg‘{¬ð—[}Ì2½B5Vq£ *Š{vö‘wLâo\‰�ÁƒSL°Éó I-ćö,=GÊè~1轩Öki�·®7«ç¶¥Ogm†�˜‘-!{ëÖÎYM[1?ª�¨ï?Ón �ø|‡|-¿&‡†Ä›kçIð !Œð¦Qg@æ“ÊɤÆYçIãN@ƒšÚ>°nŠŸé÷ÊWÉ*¿èWœ?œf'ê ´]î⚘&8DΨsw„Ôü·x6îµ÷•qÕ¤^Ç~Õ"Â:É«sÑ’qWÙ„;�cA-Ýï~†ú‘¸æ•K( ٌپÒÏX$O½GÂ[Ú·ñºçë§‚‚�sñóJãÃö”hù½*3ôÏ’KÖ¼5�„´L ä#?þ:Ê£Ê(�î¤R+1ζªÃÀLƒt-£´ÙyK258ÒyÁÌó œó‰ük g’)Ô$Ä”²ü¿;ÝNriznÍwDΚÌBì%.öíq §MCØQ`6³;À€ ívŸË²ªY¸‡Ø[L¿”M\•3™‰ —tU4îÊ?†'Lô?7FCë€�‰ß‡œ ~"ôZ—Á¶PËFë¼›9mZ(¾RþÀ>aÖ ‚ÙãŸø3*1i�Î'ïnŠ*�ÍÆr8qs"Y4îh~{D�øÞ/á¼Ì-òÅ&âšÙí/ã¶~¼¬p]ÅÆWõ:Ùø²aóÅ©‘€·²7ØÁïgõ/ºª=h½rO4x[^b^äßXïðñ¨ïú DUÐL!ÊhÎ8˼&§àØ雳*ðRcNr oÙ¬�»SÖ“Õ7…ü™ÊUvÞÇ�õ| D%èœ7R‰ðÕÅôV×Ý&ŠŒ´ [+ZÌŒX(ê¢pu�# ÖMˆñ]Ó¼85¶RZ=K¨ÂÕvo‚ê9ê—ÚOšžlvM»hì‘*ôÓ Î{Vw²°’9:±Ç¶<Ì’UJË|1'Ä×Á팭1vK¸$Zð�¶I5Z¶ˆÊBÅ`ôeóÍ¥œ�gÊ!N7臼D± ý1 CTQm¿ó”(ê$>Ôœ:zÔ=S“fýb ȘþìÄë§Y}'ðͦѓGk`¿OÈ›!ÀlpEÚ. ŒºadÇ–00"ä|îÄò»�×*ٴ꼸WS:|9'06šw .ElïÃK"ô-ªOpºÑàÏþ è D›Â#c¤Êí„"�€†ñ.2ÔZÏNËÆƒ�9¿ŸÁ´¿�k ^ÍT´‡s}sº�u…ú,bûÅ7ý“—¸Ö&�ö„ÙOÞþðrv"€M¾)†fg›{aöÇ;¼+òëÒxéî9’–¹Aä{ˆš§ˆäÙ¯>8 H7zæ•Øþ9Ü|!z»!1ÒrÇxÍtòÔ¿zÛ?—æØ¶,ó×øKf\•õõÇ%�¥ 3AÅ»<ã>O׎–CÙœêe²«Ò°r`O[*¦M¬]bF°Sãr ²ÛEX Ìp=%ý“¾Ü¿ØLdÅÙ¹ž©¬0ú�‹PNçÙes‹¹OåE’xö Ì*¼¹4óÂȺœŸZ”me¢1IðEðÂÅÛR^¿]BVI|ã?ûq:¥kiÏ>c8/¹~㢟°ö·=]†;æk]ˆ\1ŸT…QÏ’(ù0?cqXG··ýž_^ª6éÏL.¥|6×»i&Ó夵¡"…bz¥Ÿ=?‰=qY‘Å8Ë} %0KÃõR±(¿†ŒÅ+0*£™Ò3–"Ô`¾ôˆ+gŸµM¿ìi9eƒ0–_~‘ç:M{hîå7ee©h›šý%­Ò¦Ù³‹'1N¡5q`”²A`¾aA Îõ€¯&Œ9™Õ‘²>gE ˨HNÞ¹¹æ#VÝEWìJX@jÎ$SOOÿùgЄ“ž«ëæü&�¸¸·Ò„mÀ·£]r,÷;*“Y&Lb7#êÆQ–ùK@s¨±,Ô÷@¹õ ÝTæ`ý#Tq“Âl×»AšÂŽÀ‹V°$Ô Ö8…ß×»‘j“"xreY\BtBÁÿZB”«*é™\Ÿ}º±%1š_„“sÛp;/Œ…‹j:Õ¦[eæX#®©ùta<íÂ)¯ Çîh”©˜ìégÆ{¼ƒ=&äU¬º2¯º¦mS…À»MË7nu ³Ðµ@·¥ ‹tº.ŸÚÇ•ëâ=f�ÛX^Æ_ұȖ¸ë�Wl¾” öb#®]ÌW¶Ó4‘T‚ñ8-¾ëÏ]Ì!ç²ætË*M¯œñ^ Ü­¯fràÙÅå\ƒ oXdø±êG6¥wTËÇ—2hÃêEЏÎSßJ{N/|êü#{Üg¸Ù­-Á£:k�8í"=eÔ8` £Ñs ny¨:Íæ>5� gõÒ²ýuø+×ÜÈVŸñ§!OþÜ£‰ò†ôIBæÉI„㢉ȠPT{¢‚òëÇn�lûÑåì=�U„©ã;CÍòÃ2{!G¢º§#×v³ Ûtm1ºèø&RBù[3Òn®#vlœ9ó¸%éšK[t± \“Œ*GßOÃŽ·ýgfN¥Û%bÞ4Ëtõa³0‚©|©•|Y˜öqn9í/ã¶jŸHÇ'DEFZ{í|ؘoºŒ2‚m?«h;ÛÖpn¿ …é=�ýlsë¢Á`‚ÓNÊL^ND³.·ˆli¬«°fÿ³^M>‹û÷;�biÐÕ’Æ/hܯ§yÕ•ÿÍ5¢­ÚGZA+ jn4&¸üU)Ä?!çzÁlª_bsçOCÏœ°1›GOk´†in¸þÆ΢ç,ÀpS8�Oî9ñy0Ê*¹ÿwíp�Šm§Ø~€‹ù‘x{Ê6ç+U:”c ( N ±áeÕ.V Ô6zÆÒÈSÄ �˜'<7m<7°C÷]`�ŠJ´Ë‘xJví�pvsN3×ÿ#Db½j+Ÿ`›%âû�iÍK,ä¿;ò°‡”Q4+JÓìàBøa™;t32ä…nŠ·i$»% Æ˜‚¯¬ÔMÒe¬=º¢²™›ÌÎ'äzyS2ˆ˜“70#,£u™ëuNDîÙ[e�ö¼O·wºÎ0J€§µèðZ¬ßÇêûØ‘3_ÊtF�T1,8iyaÕ|ÚÊyì§uÀ)_]Bv‰”ùöà¡Àdýöz­W(d>²ÁDÚr'm?MLÆ*ê•SÓs®²rÁB€ß°FÄTA41Of�QÛvÃú ŽI‹Ñã¿É�—ì=:M¯±–Ù'òøLÍ”B½€"ð^>:"%œCϵ3ñÀɃ'&•Ã�TB0cÌ ä±%;R׳wû9“wbŒñ.Iòo§/7dÛÉŽº >FaÀq ÑžZ48[ŤÚÂnìî;ûö$Ø#Û�|Ù?¸èn�ÀíÉ$SËÖud—Uáw÷›¾îç[Âì4ƒˆEÕá+ÊÖ:)êd ¨‰f°Påÿe^NÙ‡¸€?’¢ãñ]%fÐ-›­haƒjŸ¨û ÝQÛvÃù€†çz÷Bd|ÜÂú Ä–^¹mÜþ~!ËÂÕèú¬/Ær ’­ähs»{ÎÝ tþ?kîÈ!òSzlXs•âăP30É,á#Ü‹Æ'€…À"Æåe2™(µqcÅÛ]»Ž&¨—µZL«lÜq´;Í9Šív3¦V”ÿ$jõôöÑ0¡‹ì σM$lÔë¶ŠëÆëxªäZæÜ·bÆ1œÀ\¾œ!“¨ïò�åÍMg@\¹¢Ì h«ƒo�ý;–ì!f,»GßÃ'4u©ñ¬`^ì™a 4Ú{®fËMÅѯ£µK_Ý¥ŠÑ:Þø(›NR¯|ˆaò~>áßÝÁzbA:fæÌ Ä,ù”¯¾Gγ`ëÝ ‘îƒ`Jgk¢ãɆ¬îH€/‹Â‰Õœ�̰'P[‡",¢xÿÚ.^\ªË¡wt1cÐ`7nlÎëxøé(ýÌÔ/‰UÂ}Ç*„â­I¡d¸Y2PíÓà}<ñvtI¹Í1÷�&hñ×?ðÖ€\0ëVÿ”ÒÌLÛaP}ÍíŒ;#Õ¿¥éIwH_nq3ý /€fƒ+êþqŒíÜì,ª¿ÜÖ'`Êì;+g.�ÉbM†PÝ íÄC:X=áwúj¹„Ó‘ˆÁë«è7^Èˈ]´¹¯JêÕ�ú±™H¿I4Ã11¨T‡’$Û|^Ü/}â•|í°š!q4‘à¨uW©$­ƒ¢�‡?ý‹ÅçšÜ<¤ßk„Çö1ïµs¼t˜á¿†*e…„�sB÷ØŠë.uòÍ$EäÏ7úÁ±âÆ€Œ#Úè•ÿ2TôîE€6ÉÓ8T®q¥ã¯/ß¼äUïÛm·ú“\uèyøþ>&R6Eež�pJn€³Ò½¸"üQ/‘g•6ÍIpùB ï&Rä�çÖjœ ”žj\sÐÍ?‹pW”èú½BkT€¤/ª¼·ê�uz j)©âÀËþoònÅÀè�f¤Ÿ¯Ak€¬c„ õä,\fåýݶŒ3Çxû%§GØlà‹@Kí öÇày¸úÝsÀ°Sêþƒwñ ü½rŠïYU#çÖm=}%˜2HLý3’M_\µù}ma`½_„d|å—%X:+!½©aþHø#à­Y0 ]#¿db˜¢•óWwL,z/\ oâÈROý¸A°ä8êø ‚a»LC7L×bt)[|s��ܸ`Ï·×ůŸÖø•øÄ}`Hù§JYžÜ.>ÿÙ¶"ùÁ|½BS-³Dt~£r|>í±¶ö57áiaWm$w1¯€\pUˆ`M'æUâ¼½ó}à,jÙ=˜nÞ?bó~¼´+3ã ©,ºd¼… ÒðLr±³1Þ?G X�dÅÍ­`È`ñ(ŸŸ^úÑ#Ù0‹ìœ�ÉEËà XiXåM.¼æËO2c‘@]nq~ý qlv¶–PqOÎ¥ N÷%�h˜½”» §Qu¸‰D{¿úîÏ.š…‚ƒ|\9npœü2nÐÎÙÖìÏ¿e†³:S‰ 锇i-å^ÉhÅÿ Õò¼›§’—–ý ê²hþàPH[Cµ�vá•â1Çl`‘åLØŸ¯†XÍô‚/B†§ë­‚/íuâ;âž‘± íÙ%Ű7í-GÖ+8dŠ~o Æ… N�>‰wØr�~ì†T3øW¬w<×v<ÌÎ8’ß¼FË)eåj òDþÅÒ”W-ªG·+úÔuñÊúy3¡qáƒðgéP­ ¦Ž4JfÌsÐí#þG7[ŸhÖ‘÷æê¡ (w: àÏAV«Ê:Òí AóYcQdÄ1GkßE&éå7è5þdTPÜ5¬‡c€ÒïŠ]¾fœŠ†ÖMwÇÝþøh+â°ÝC;`à‡+5˜¢^“�½ ·ñ{ÒY+“‡«%W›Ÿ2>•ÛŒÍV{t9¸E~"8ÞÚþ~ þ˜2æàÛ¡&PqÕšÈÞ:|þ8íãÕÞœ¦}âýYuÔ�k²hÓÕnm]o½‘4a‰6ªºép Åâ\üPÎy,gÇDŽ¡àß$8öªÂaמžä3¥ß½©)c£¨öÛ€Ö}±¡¾Æm̤­Ñ�çø°¿S"*ž*2ù`îCú¹†È»Â7>)U‚·T,¾Æ84ÿyíÙ«çd¡u8 e†R‘&ð>¨BD9Ïð8JžîµøÙÁ= AÃOÎ0‹Þê�hÍö,êôër¥I‚饔ǥëdTŸ=•j̉ŒhÜy9YªÑvÛÔ\¿™Ò.9Iºg ž·nÙÈå’†À2=£ˆÊk#£z0*„KE�zE@ýµ3¨¿ž�|¬ ÝÒJòæUŸÄPk!~" KÒv�މ$÷Þ8›çg/¨v2^|ˆóe‚jŽ“ÅGŠiR·m�…Ñëî¡õw ¥�‡ZØæs"d0$ëYUŸä,�}k˜ðôôb^xÆ»Bàu(²,a¦ÇÑ€x¥}‚äT‹Õ@…þažáƒ[C»)ê6ØiÄòzõø)ãt…ÎÅ �¢…ßóT¸ Ö¬KO·¯Eo›Ù:½zèkŽˆ„òš²Òõås«V“êçÍ9#Ji‚—vþ/Yõ$£÷«�rÒ Qûè&gª ÆuÅÞÄDêñ}óX*^¡°uò‹“ïœ$Eæqï¢Jú  ¿'=ÙKô"AüqŠ�\î×^#IüNˆ”,k¸+aŒ©>·‰Eƒ»ÍQâàÍ—÷¬Cì[‘!8J×ıâTšEóu�ãäªXMÐÏþЮ¸m÷k#øwNòƒÿyÕ¶ºÜIÇãÜÅð&ôÒnж ¾}›ÏÃ}pø+kÃá 0Ø?qšcŸÇ'ÐÊd€ú†íHTˆä‚–¼Úšj­zHt¡BO,¿²ì}~1‡óÏ~çÑå.øS{äHa…‘Eaò`¥œxÛj̺ÉSzÿ}ÿ:ô@uhh§¥ˆŽ‹® Ò5iŸ¼ ˆ°x ké!›6A¿ÒÑU�†iȬ@Qaß« ø=M¾\—}¶ÖØËR™;âZ 7ã÷E‡9e.= U÷†QQlócqÝÚküuFÀ©éчLÎl"¿üê8r’„n5Jjš“/YiH`¤áñ—»Ì»n¶òÝÁçNaôIP T9Æ,ôYÉ2OæÉ$Ôlû)Tù¸"Tüˆì ào\^ûÃ¥Ï$ ðYM5L`Òð¥=sä™U\ÂÌ.»•wy&„Ú[­Ý„]tн‘ϯu}ÿY° Š•w¼Õï™Në¦m0ó¡5“�¡›8n¾’‰ûùö»µWtѶÆrÅHŽK;‚j¦áys+n¨i–¬¾e^‹Ÿà¼ â]QäÇ—ú¾²zcÿMJöIýöë]³3¿¨VŠ ¨˜Íºsµk�mde’Sä×¶V`ŒBÅŸZ=wƒ0)ZÞ+ÙqQ+ûvÍÄïP*ŒpŠÒw ”+|Nguºk1/Ï:t«Ë¡4ÑO²tεtÏ™Qšæ4Áá7Ë•õˆ3'ŠÂJriW¯3f±ôôyyÞjüèÓ+Y´­Æö¿î{`ã0‰jœ%çÈ—šÞÕ|áÒ¥è§�÷Æ›[jÖ„ôì¡Gç®nãÕŠMÁ¼mQÑÂεíö¥S'�Á˜äB ^ G�¤áxïD:UåYle¹Â—d³õ•GÌj!Éé:¨hÁÕ?öÆü�W ©›%ïõ²m° ›vØ�ßí !áß…åÎ6QµÉo+‘ça/Xúz)?ËôÚ¹ùΟ|B°P7^¨„Á°Uap"ñ‚ÞZü,ŽwÌY0•ƒL7#UªRp~VZYIŽ›ç(³¡)JSI‚Nù¿Ý’rYú‹T³¦ÜgÓóüQ£˜¤¸ÝgBòüɳ@�;r¾$u‰7�)Æ7=Žý¹”ÀγмȘb¾žw••)œ&BUÀ­áÀ~„�‡,®çääÑìÅ/cs¨W�µan*Ui)”óLI�&tTÅ–þt¥BE T»`ð¼ò86âD’‹dä¢>èCù^ ¨b+ô@û í>×/ƒ)Ý`Š99³Z„~à××>Å{ç÷…÷ÆLëÀý„%Úœè H»(/×. Ë…+KÓ0O¤ì¤-|ë¯7ïûx¯²tºd1AÜ?§¸¦ò_�Ø)Tõ‚Z!ÃtÎä’vZ"éÆ6®8±I¨µ½R…NÏp=m øj4&Â�óùuÊ)÷wo¥(P)À™¤cô%ØøòÍ?«:¥ót¯Ú:ô/KØáê I©ë-—w&Ò`Wcôfcs+øûµîiIBÕ#¶Í·â«c©þr-L= )'Žlå/-HÉÒ#M¯{‘®ïaˆK5ÅDŸxÍüèp&Î�køÅ¾ GÛ8™þ¡X5eeµˆÈNyXËSâ·,Mj `¯¹!ÒíP�¯ÎªÐ”†Z×þr¬¸hµôÆ"ó ϽAr¹Ýÿ¼!]0x¸+;½×°«e׿£g¬ßàþŸ1¸jAvè#ÖÀÆþ*y'sál(¡_±ŸU13/ÁOzάKÜ^�¢|2HxíYåêÝ-œVõ‹#’ÖDÙDÄÖõ4/(€h<˜�èH°nø¯ÞÕE8íÖ¿Sž¯mˆ-J’GHºêïŽÿ:p—påÒï)¤B›­mñÂ�WÓÅI'aû{º9.΋ß:F.øØ–"F@‹Ñ^Nk,:¦ß�™Î; 7P~¾…ך4v¡cù×*{7{göFÏHB“ÔÔ™g/®®î`°?óqЋÊzÊ„Á�¿ï´—§ø~ÔŠT Á¥'sÙ¾1ra¸/¾î4¢I»ÎžþE�‰áC»D ’N™3T�–pæëîå XcÐ�Ü?Àj.RÕê” a2Z5ͪ·³mèÀ§CæÉ�+M^æ/sÝÁÊw7ŽÛy©Ò—QÆ¥üAa mêÇ,_†M媸ÿÚ¬¶Ãl½y¹4ê•åI©gx•ì80i~"TŽ$ ÒH®÷M6%2éÆKtO[„Q¥î(`#Õ±ÝáP¥!ñv7¤iKdþ‰DâB>Ízvƒý›4PÆþ�QxÅø¡ÑÉL�‡�Rö"ÞlÂC}Ÿñ‰»èÙ`5‰ N&=ÎYޤA°Í’1Òž"y×~€Ÿì²=~Y‹J¿Âq¨NˆQ¡ W2t: çOªÈ®‰ �kg8a¡ŒÐ‡AåaŽ—�6v† Poˆ;6Hà²ÚÌE#Ù]”/š½ä”áp õ’NaðÄI‹ÿ˰gs@GNwýØ eqø7À›# =µ=QÑÂ@™ß?HzÐãêd¬i³6²Ùß­aýÉ…´½Kn°”9âü-Ä“Cfâ{6Lfƒù—çE8�‹¹â4o¿MzÉlk&­×ñFò¾]æ—�dÿÀc"…ä·>O5p׉ â’*En½&ù�ÖÎ�}kYU–Edç4iÆa‡ìª£Ù6 £ÄÚ ¡F9iêT”Uæ¼»MoÊ Ià¿# ­Ç(«³ï3=ay¬$G=)k׉dz³�†oÞ«�Í\SS.ל‚=¤“òÛŸÌ”úD#Gdˬ§7£�, ¾ùeµ•hÀ_GÉÈ+(Óð£…?öô_:ìÔÉ}ÀIñjß&U+̵±‰r•ÖâW°ç­ó)N?)êFɧs€[p=ÏÄïØ°*ÈŽÂ×Å2�´5©Ù¯sGܪ1K€GèÌ<3`%”-a)"l——ö!'Ñq³¨Ù!+wšeÖ¨$Œ@µVîÎK˜:ClÉVÛêôÉQWå¡c“ºaaº¼è2ÄwloG'šób:Î BBcöô7&ÂÉLîVÅǶÒñÅ« (‚œ·zÎä-Œ\K#Õ˜ ì3~ð¥X¤~f5v¢ JqÁG\0.�$ÇÞO,“-ŠäG¹ÃÞ,­Ï £ñŽ)ú´íàà½þ+Û$Â-‡\K”q�Š_M@¦³5\쨦²Û9þlfåĈŠt\K½ßÔö³5ª'”‚ÏÔO0÷‹÷(\W|4Ðë=aaï$Ç�éè-ÕíXcnøABD´&X/;¸ÏWÒ!¯ùÚ­½%XXc_�‹Ð)‡éè°Ö:ú#êE]Ÿ€œ®“¤kõ š±(ç±3Êͪžåቜ-“úO2©"]—áf~½?¿Nêôw¦Õ¯<2x�‹ÿ|ر;�>ú¸¶ël‚î—Ê#šz�òŸØÝp0v-5È;õ‘;Ì4*þgŸè¡x]s•=O÷Qî õœy 4´ù ·Ê¤PÚ‹ÐñãèTcf ÈV`öŒÍ²€á½ŒNÔ=r£ÈXYOM¢'‰��íj‹¬ˆ¤Ø™¯7Ÿ ³g® ·Tfúô‰Øôˆß8/æÞ}©Ç[qÔï°¯ØN±¨ÿßøÖC• %3}F à´òüðÐ úðÙ+¸ã��Š€rNr�ˆÕÀ1 ”èfugÚ… ¢&†kzú;_çèÌ´ÇÄGRj°æÕíÚÀºëòøóÃFŒ\\£èO<VG�á°�dé~Wc|+�)i ¦–„«dnR1 «7a% z×`1Ì2óèÆ·í Wì‹í~? ò­~2JêX(ž«¯+¥ÖíÏ­/OÕ›üìv»D�0UÁ8{¥±ihéwGxAæJc^ H¿ê}s»3ÞXÄj‡&�( ŒUS¾Æ�$”˜Fΰ<‰u®#!TR'À¡bBݲ˜qd·þ‘Ýdÿ#®ÚÕîTcÅðyÐ[>+‰Êéli1ȯ¶qêÇðVTGïÎcí ™¤@?lI@_Ú«ÓÛ×îuÝWgÀCÞÖè›ë¼šPäÝ0¸˜qH$æïlUÔ>Q0z`š$ØHÚz�lj%FRvˬÁ¹a;2Ö Ü·¥'wuÆ×¼»Wͬ ‰¿‚S™ßKFÕ©‡|Z€²Ø´Lò¾óf ×Tj;~Kò¡®-^{û� (É9Qî#fPŸNcD›IRa‹T�Sìky˜VxøhêNÜhŠí.†–™ÄSÒÅkÛC ˜Î74±ˆ°«íÞõ;2쯖KŜ· …PÕÙ!h3 8‘Êä¹_M”D­¶*ÚB‚ô^×Ó$ÉμÖl`PZÉœœÆÕh.¥¸¡g±9ðµ× m݉½‹”™|ã–¤(ÑÓrLn_µº¡ ˆ%Ë 4k^gÉÿã@+Ú»ì¿ÒlÓ—WÞÔðÐ|À«)&ŠÁ>e(_9\ t÷éŸ]ʈ ôÌãÏWOtªŒú>üþ”4µ+e¹�b�Zín‰Ð˜f"N}â±eˆý•Âf’(O>Ô•¡ŒÎñÌS Ÿñ³DËäu$þ*íÝj"çìì®ñ q2TY8N�è)"f¿pN­ÝKc_ RÉ7rŽû¢jº9jRŠÂ‹f¤J Èö¿¤º~Æ“+[°0àª9GàÀÇ=æTQ“ ÷hcÍ}Tyfä4烆Š}ßt_E?<ú¢ŽjS/˜›7˜೦~0�Ë?ÑB2(ðºç*zŸî£mŽ2ÍÈñÆtÍN1Èr èÕxm†`qT&„~6¼‘[ÈúÐN¢#€zuГ¡�?}æìœö�÷ùG꦳^@>wXd�êSã$μ—*ÿ£µšo2r‹Ǻ¬y¤±«ãÐï“U;üqGõU°Ò±ôyÏ"ÝMXn_þ™²¼ö˜ƒ¶n…̘Áš¦ÑâŸä¿]˜Nàn 4ö€À&¦@“¤è#”«·O€ÖBÒìhCô^ÂŒé"°5gÌ'– ò³>"ݳWdùÉJ“j¡ªwÓ ôu~ƒFetÜÔMO½¸áX®¯\ ªú–pì5ô~6!·k°Ö$¹e#GÍ'ãÖ6b¢ÞÀîÛÞå°9Êu/J`†ÿZ9]‘Þ�m©¢�Eˆ ·VÀа—)‰»ü£E¥RQ‹#YSJÆ’ÈÛ<#Ú@ ¡È'­A樨Í6rž8îòdÅ•4¤kИ"1Åöä´KÌcÿy‘73VNa¼z´–‡ ®S1¹È_×$wºœä´Óe‰i‘1ű/þü�„‰ÂB—¹ Ìpìo«Wà¶¶›¬û®ˆCç `ž×ê€^9}mmi!¿XÊŸÿ­1 ©mÒûØq€(¯wjS}E!u»è“`-öÒ Ù÷ü ’ª‰+&~ÖçMÞÜì‹”*ýç€@¿ðç³ùVrbE»ð¬¶Ü‘Gôê5…9”S��¡~rêó(ôÁ¯Õe±Ž€^1ØøØ�7oUée�t ²hS¬W¯ú—ñL¥øª±Ã¸OÜ[GÔ[„ʳïûÈÞG’àŠ¶ìû¯ûVNå>Ì™†Åbh3…ÜÏ>òT\\(/ú®¥@&ËrŒÂû–#è"Ý0�‹•@�h;[ÄÈ yQ‡Dž?¯G#EÂÖçô 88Ô–þŠVK“Nbzdzì¹é|µ£­áÜH¿«#ŸÏ¤¯!úˆ¶»ä‹zA[æzà?g¹pò··• ›Þû¿9è60J¹¿�ázù²oú1$Wm*탘?Á«´$ŽKÙWÛÊù�0I$“ xfIŽ ]œ 5AC@ÀÂx´äñ•±þqÓ¥=:"¦Ái"¢Ðæ:á¶ôñV#úFÐ’\;¥(Š ùLšôq­óµeØÆoæþº9è‰ý‡•:ŠY¶Öp`J¿ÛŽ`ϰŽJÔ%e ³ 4>ªjè´. Ù U4Yåì÷-Ašü®ƒ[q*a~›F(«ÅFlݨ$AZˆïØg ÂñãOáÛ¹>¦À‹Ç¥ç«Ÿ@pÊ×`—�R¼¹Œ(ÍìMÐàŽtMÜMPkÍYŽ.š×XM÷Y“,=jêxm¬ö]cÇÅW¸™à^t+BíNt,ëÌ(ôyd|­-T?ãuÒšÙtÒ=o÷¢æÆžü/3ü ý²ê¸ ˜­~6�À$ùé¾YÝ®�mTÚ-v\è¿û¹S¬íñÃÊ™Aõf Vò‰Åé±·"Vå3¥íÞ°ý¥®bBeÁîô²Ë'Bœ ¥}ð-Xü×@Äþ3]-ör�Gd¹Bû™·ÊB¹#ûmm‘ÍÈËBú1­Ø •×�>7F)ëûÍ8]|!`¿xø˜IhÍIT ú–5M¬Ôû²�_-™V�ó„¬h`’ôQöúTañý%íiîä›Éư&=+A¶©ÆÊ�)·ÉtÉ�P¼t=/Il 1A‚×?R›*Ô²ÇÃü×óÎBL¥tCAfws1ñe£j$÷bs™zgŽÝzI}X¥^0F+„Ë^)iªŸ×0qeÞÃ$TWÇ!èãñ~ßht³,¬�ŠêËýýN–$ëKŽ/ñZe½sˆø&È»—¨â˜–5©gøë1ˆm­0¸Mêú7¼cDy/Îí2 zŒÜ qCªDcλ û;ª•N ’b_.•Û�èx©*Éòb_ aNßûŠ0¨7˜Äêµyå<ÆŽ/耬󻿸‰Dª›BÜ×eÿÔkq´Å¡‘»ž¤ˆËÁ)y„�A‹¸ŒOe-O #rž†k›�ïM àµÐ‚Oðg‰gÅè‘#)b´bÙËTÆ)«Ê¢$y¶9t ůéýø•)áæ©ÇÔÛlOä¶n Q¶åèÖøáÈj±¹ÑË–´=s²o¦:ç CçÕù9i ¬HàÁë…>uB`œ�ʋÎb�(à`¬D~Í\/´‡Ë×v�h‘ºô%]Þß[û èA!붤¤0»_Ëçø�@fªq,*K•YFŸX9k–å×RŠ~vè„óWT w—[‘ã¯3lfV” P˜ÖàX>K:³Ò_¾_ŠVÅ”úd™¦q¥æÂp@UwÎE¢þÂ;\úžóQ%¦àšh̳pÀ6MÞ–hzº'|¢ºlsÑEÔ¯ ZÂŒÄêV)éY7T?ÆSšVr¨nJ?š‚é„3{Š¥+°aD¹ �8‘bï”X %ÿ�i—é†^¤Ek7<œKCpg{»UÚ€^~ÔDSi“oˆåKPÎÛ}ä ‚ù/ ^2&3,?K&ojÝ>#ìÞýÆ·û@0ík¶ÓDÚmRL`$ùî´°ê eí¨ÏW1§f8Hœ�ÇÔuJ&kˆô{Ùq‰’j¢Àõ̬Ó#Àò*qÔ‘#—;S&8û'€ßF—! -Þ<p¾Z ø1÷I<–§þ1X ÷?nují¨sEUÏ9ö)õÄÒøE©Ë&à_?È…Åb÷û[ŒØhˆŽðf „œvø$ƒD�ÿÀÄ·]åfÙ[ÓæµÕ¸}Óe¦4 êÓÃ0Fo‡èë�n÷ƒ;ª ëg;bíë„b[¡‹ó'nü6¸£°[âså(TÄ¥T=öno[AžöІrEîšÔ\ûy@9ÿ婾Am�’Õ½¼õŸàHCr²ÊÆÖÔ8í(x¤+tZÜhYH¼\å]Y~tZ}ò(Ó‡¯H"Æ:¬MP¤viNaD¶p“ð¡¡³w)¿hÓKÕ²»œ˜ªè”¨ŽÆkÅA|–Ú4„’>´^Ù•¶êT…4ŽMòÚáùŠ5Zlñ”øØ2âF•¾rXÉWW»á9ŽÑùa]þ\§.ÍP4"?£2÷°VC¤N¨îy tàK Ÿº £b½žÉio¼dŠDz± �€”zsAœO|Á~e¿)¶)“ÕÄQ{•æÐ/F ©_ó(^£%L�q#C\²×;Ó¿ñ2”•MTÈ잌Pº6¢ÈÎ iÀ¶;@sÙLqÀÅ*­¥Ë•lðÉit*έXSËÉð./+�+árùxõPF¶é“J©ß~—ò6qßx"œI®ð s}új±@„úNæp¨«Tï°¤±þ»²KÝ–ô¿w ÉnI�äl0D‡[%™¿¤ïá Kf°0•p _’èªâöò×<œcp\ìûWÕCŒxð qšÉ‘¼è›1ÎPB�£à³e²°Ê€u›3ˆEjDÚ£¯9+|ÓSæýÌ7­€€‰E‚: -™?ý0`±ü© æY8±û Cê‹ò žFÃßšÆ"³k߆å€l©8.Ç2Æ€çÝ·ãz+7µÓ ^�P›ì²ù2Êq rZ¹Páf³Ô("FÚ�5ì/öG€|ýÉuEªâ‰ñ.ÝÜå'¹\›6.KR*r\.Þ¼’ 5+Ç”»4«oûb�çŸÓ»‚¼Î}ÑR“<š‘u$æ&h¹ž˜Æø[Ñà]Ý£ L"­®¿„´èA[#’S‘åÕ˜¾Öø� ÙÑVéí· ëõS¿E´'b?ü!ú$d⊯’90 ¹³£Gƒ¬³Q{¼h»Š‡œ÷¹õŽ™)˲Çèu\µ7Òzãàep…û Œ'Øy: LjOQcuÒ(…¹ßF¨ãr:[Wë <�t*^ýÚõôqžãVW›ñ¿[2\òÉeÓÃý!�²,y�}ÿFfì ¡•Ë–„T/žÈ{U§EïgµÚ9�cÁÒ·¡µKî¯ÏÙ¦’v•�!Óá`¢­ FT»´ÉGâº_ú™ÄQ$ÑaLi(;Ð�\K›á—*ìÕç#KlMb|`Ù…M÷íÊÀpmí¥<§Z¤ðm³©3SË\šÎ©Zµõr"ˆÃŸ£)ÌùêîÊOV_GÊ–]{{Û©.?VsÊ�­c:o.`<)ê" ’ÂšŠ€¸È¸]ë£ÆôOª®-|˜õéK/E¨™£«AoÔúD…Á£2ð..¥8†É™k¥�ÖzŸ•p“q{ êrQˆùsv\¼þtCêÌÇœœc+^È–KÔàõ¼�+’2ŸuÉxžD^Oœ„”“ÇØy4' !h’ÅzSzƒˆAR\��LBúuÐzs)¹‘°¢ùj·µavÜYÄErLWX¨Ãx^&D,¨|Gßwò|>á_„vΑ‘G�ó•ì 4Ô˜À6®?ôT«ø’±ŒJtíõ‚�~á2Èa>%T•¡W>ß’ÀCÅ$ù¾âqXRÑè’¨t¹Â—n[º[¹Cf=ø•Ù".P*WA i�n´¥Å�Ö&¼²˜ô†"ËnlIꧪ‘Þ�ÿ—ä—KĬ+©ÂŒC©Aß/ؽJÌß© •µ"ªtÌ/Õ3Þst«ÀãU6N‘÷%õ>Æséd¦÷±2ïä ìMÈ5ðìÿeVfѽÜAØ^ kä1Uì› J!˜I΀ã´{l…ä¡ FÌÞ>�¡63ˆSQgŽëh® {Á°%d�‘}–š’#‡[//‚Iƒj�¡ÛlÒÄ@7‘³^‰Ž£þ¨ôÙ•Bñ]Õa½€´KÓµ^äh"ýJ1$»ÿ7‚NRàæƒe™æAVß�ÔqLöÏÑ\8í™y‘/éUÞ;Üäy{Ìü=ˆû€•5nÑ9–«Ú±0}“mÕP>çmJy(ªƒVh\—6EDH€Þ�I�bšÖ@¯¾µ$òHFwŠëÙºÅ~ÖÞm§ÎååkT¹wÊ�|ð“ñïA�ȪÕÀäùå/ Š+N¢…}Ûú�Ê]¥÷ߥÐV¹~8€`�ž9’�£…Ñ4™ÝŽrD”A•)ü_Ê#R?Ó~‹ ˆò]ƒ^ Ÿ‘àrç$rǸÃéŸ}\LGqÉú >€/÷ÁòGíH.Ùƒ÷£? F¦9ñ~d×ÌÌ­àaQÊô¼j¼|ñMnQ!œÊ§¯ÁmåÝm'¡]/tIÝVÿ’¨í¾…ÈwB>éF¼)„™…½¨qY ð*B‚ùÊÍ»5t?yÞ!wôVkÐ…ùˆNÛ‡SŸa£ŽÌmaævwÑø\Þ�é}W‰D9tãç!Š}ÙÙ×YBèHUcï\¡Bu®¿©„xÐJ©¢–åQ3o¸f}æ”Ô’¼FV}˨“±­Xi†Ý!½ßË.ÈÒÔ‹�‘/axÀ±°[ÓÏHà ô"³ïR�æÃá uÒtþ^ ýku¸ ¾ V+AÚo(ÿt³ƒ º F�ZSÈ¿´º'û¿žž…ïãæÅ¹ûû?ðñtÖ½€ÆÞ¯Ð…í@Í{ë©1àÚH8dyP%æJrZMŸŒ4Ü¡Q Ý s¨Åø:7(Ý:røMb‘ÕõÜÿ@Súþn­!ëšM÷Qµ©ý¿ç…�ju�I-e@ Üyñ2žö�Âʶ4[Q—�7ç‡œŽŠ/�>¬YÆO¾¦•F“F�b“ß³¥gðþ=ÒW¤¿x×”ƒ¡ µ²9;æoåM{�ó„÷]¯PaX©ÔŠ Bp‚Ýü[!Ö'=W@µ“Ü¡ØÒ…sÃRnªo>�éÂ8ôÇ ¥ç^i°Å —uº�Îb*…£ÄÏD:É€Ö_2~?AÏù”Á U£óåz‘“vŸ¶ïøhBƒ‘Þu½å…:a¶oŠ�ØTƒ…ÎFƒKTªßc.åF·F0ާŸ÷U•$3¡<¨tr5w“ñ˵ÛúhÉÒkOÕ_àìüKDSìÝ^MŒÅ©ù–²·´^m?cDÕ§ìN-ð]{ù&RZá¹>®_Ô7ê !n”ÉâW´Iƒ\³l¿Ï=a,k1±2çBŸUç(½ÊÂ�ûô²…wøšJ»©&çq½x*²qC<ù´¼ixr¿U‹Å�9Ë“¹.$�0ßïYã$¥¨Òp“Æ>©)^ [l½Èñ=5«|LÐëƒbÊõ…›å=;†„QçÍ”Òî$„<Êèø"ÿ“_•0�¢b�q‘¬ÓX£Æ²ã¨>h÷ ¾ðRciOöôêpçhõbðe@^ÖxèÏÓ®ü�ÒètjWG…¼{™rÕ¿�xœ©¸Ï1ýÙŒ¥áB»!cS­§ 5 Ü©�`_é­»šUhÃX>ýRûÞ>-¯# @;ÊO¦$—°«Þ’ÿN¨+×ëE±�Ñê£+žõáµÙ5óûÖïÚ*^¥šì¶[ª»ŠxDL²?ëZL~QMšÉуe|ÎØ%")} 'Áïû¢`W�8:ºôÛÊ)ÞÜ¥3p<ƒ3â º¥„{s„a Ö™}~Y]Û»;#né�9é°÷é0¬}M}?r½Ñ¤ bÜ%!lœèº0Çé—ZæA•ÍÞÁÄšÀd%+‚py ¦ÚLóCÎÕ³w¹îå �3ˆJ)08ö+éÌQQÖ¬Lø¬þá» Öqm�Åfioß~5á¹ôéz’p“%.Î7Ìù«cÊ0ÒŸõ¿#­’ÍŒÄQZ´%Àç‡EPèƒÖwÚÍœygZK8êpÒR€!È“¹>¬Lþl½û<Æ¿Âù-æ®wþˆ€·ZÁR§H1ÆàrÄj Z÷Ê®`Y~ïˆ&&žÞCsâVü¦.—ç+?쇜t$¦µWÍç²ÖQÓM±@§È×Òñ@ƒC…CA0Ýî�‡eebße·o±M&†M1é[yæO‰£‰TþMëZþ?æ…–;‚¸é‡'®dÜŽáô@G3vö@h÷>шCÃñ~Hì9ŒcÜ�ÔÚ%°ø¯ ª:P¤ä �ºÁ§d´ŽVˆ'ä�fÞ'©kY?�$®‡:™¶+5MTI¡¨YYwé÷Lô¦ $Ú¥sŽ?"©ÄTZ¦aUÂi•C¼¦Õ}Á‚‰±F:$%YŒ»£3ñš‘†Á!uoïàŠ¢—=÷½™ ZЇHìݳ¹ OÔØ´Êz7�Æ âÕ`\‡´(és­{Yé]'à†çØ~6K’Ó„"éq7ÏÄt1H‰�¬ˆŸžëú®sž«é£ÍvŹ—5¡L´‹Æ «Ó΢“¹0½I:êuº|JL‰Ê |ónq¶±k¦¾¿ïªµÄ\ä„/×ýÒYE9(‘ùú]®ŒÂ5R–·!nwÏÑ']Ò�Þgj¯Nè“ÿí`¾B*€3§@M¬$‰°Ù½U°kqÄI­±fü…A*eâÄ>ç{ÜðZ=áÀ‘+/Þ`sòÉw<òþÈÇþ¼¬% JÂkö9Éݯc�Û«+µåK?ãÖ‘TfZÝçí`ZFmîœ~!ݲ^‰Ž2g0WÙ|×Pºãåļ$}§ŸC¯ ñ×ùœ�,׊Ýb …—MB¾x@ÝÞG=fèÇ8˜Š�á÷yk^ãG!D¤¦w 4\ÇX £¦‰–˜!RZ�ŽR—î�hã’YÌ;˜ôÊD“˜¾{¿›5CÜZ|G„´úp½þß{Æ;štQ¯Ì¦~ÐÄAÒR¥DÓìI¶—i´“ )ȼXOÿ}ëÑCYOϤzi�ÒßèëŽcåS!ÉÊ�`½þ<:hF^-Åb ï,×é›Èm�#çô¯Íë`«þ3‰†bï«Ï=«—NÍ%àÜ¢æ¼W0z[1oR@g˜GZmŽntX‹„°Z ×õ‹Áé 9õ8êÖ)«8© ï1ìú0„hÿ%"³›xnàŠ]j;*&šx½—0²¯I½vRŽ­¿@±VÈFú@Od±¦ðhá/é5bŽpâH­õgÜB>^å9g±k¦­1G<æü¿J¨¢s!qБ¶_”ô˜ps.^qà‘ɆÆéÙRé€ÀÀ'ºã–ŸFÐù-�‹æwNÛZwÅ�W,5w¾0³0s-1Ο‡VÑŠ/èyg"34"Ææý‘á'±ì�èà|k²&QâPþ²OÉvàö/TXj‚ÌdW*Ϥ:ÄÍàã‹w:›(Š{øßs@×òbÙLêßD÷_™kd¸~°†ª7‘PxšGááœÓ¦·{¾,Ÿ�£ë)ËA'Cy0J ºƒ$4”½‰²½Höcç¢]B„|[™–°8TŠÀièJE¯¦è*¨@0ý\�ÒµÓnĬù"#YŒf8¸|(0áÜ�xL;®±R2¬®ð¯¸Êâ½Ø·\ý‚µ”´´ÅœRgé/ë>]ØžùUó ‚»[Ôæ¿ð´ü¤?�ÈPì'`ÀV”d ø4oÕx]µŽøk]‡€2æyа!K£8Æzk �ÊË1�†i¤Q’<š†e&_ƒÃ³Ž 6\Kê!Þþ,�œÜˆBPPôebÝå¿ osã—˜ØqŒWóƒ²VH¼ôb¾Í!¬ Áý>‚$Í6#Æ.û$ ý +A¡LÈRmGXÝñdüèþ˜î¶AÁH=gl0�c2´‡ÌØ BÜüÑðnkª‡b—ý¾øF÷ÐmYÎßÒ°j8)] ~øö/"ûV)ù‡ztè!d~gÞÂëÅCqaãŠ]Ææaª”ËüôïçÚ©:vÉ"¹6ÚÏÚ Œ¨¶lš–ŠŸŒE_ÑçÞãÛIKãS¡*­' -ŸDGÛªVn´¢z)`'n ûîqÐxmLF¿eái§ºOÞç-�tø&Y¨[x‹qî€2÷§}¸Í\�¯b/¯í+h~.Yp÷ËuÉ¡DÅk©kÀV¨D7<ÙÙÅЭϋ\‘C³s(Qâî‘Î«Š˜©ûʬ%ùu¡²}‚ñ�ˆrªÈÓ ÒåÆD}­Óo$ÏKDÛ áP4™(õ7ÚE¶Hz·Dò�“eReßSî�éqÃ]º/hxùµ�Å@쾩4™»7­3î“=­º]g.À$ú’�"©5xwˆÙ¬—ï}Ь½xdÌíµÃy&šhîœãY¤šÙeEuñàÆIþ¹? ¯žHp8™}> rgÆÂN�w*Fg«Âô9—ŸxõYN‚P,ãÂÃ(#‰êª¨õÜ;N0SF`‘Ô€5!ç~ÐUàˆdn¬™.˜‘�öÎaÝ�“Õ@@ýû1ܨÅl�LÎÄâ·ˆÀæŽÚ”zXYrÕ¿£¼ílùéРÁk†ŠFÊöTÜ ˆ=¦pÙRDs¯Ûœ�¯ÂE~,@ê5oB³L;ÊßΌyïéO½e½~smÌ'múG—ÁÈÒ™ÌôBˆeò8çŒf jG…@v»Ò N¥&–ebϸÐ3 Wdx“ëø]SßÖ¼¦ßQðÚV-ïŒÖ«ÂO‚Ùû_ìÚÉOP âg™€º]K,4x#€˜WûN$åÝFÏÙ ÒžÍî|ró/–Çâvþ�4šL¯ðÚèÊ–€§6¹–ĪŠQQÝÆüó9¦NÿÂÆ}õ0~m”Ür$P™å6;e;‘ݰšž{q¢gÝ�!gÖYr0AíªQÊhí%Ì2ƒ\Ï|ŠŠ|Z%O�Òf¯²R ËwT!$úêºà~‘›¸{˜^eÝ%¡}Í´«b¢¥*‡–ùgü÷˜Ü:,éEw†ä7!µ‡®‘N`²Æ¾.Iz”VBa i�"gvŸ#b™…zúë{жµ×ç:š2N̵NÍÀ>(‡ÖߤÝ=þ‰+«üXÑèT_@ƒ¸Õ=Ž ¶mH´t1ídFSËàæDúšk©åýAH�¥ÄÀdïÜ1>’cF_œÄiVìéãRãh¬’©ÛqâPäû^ÂÂÄÇ¿©i6kc7E0êYÿÙ›ÊHBÚÊÓDQùèÏ�ñµ«v!g…a,z–YoO/”4aÂVîÉõ˜¬Êß³û–'„kBn:M~¾a,Ä'#tÇ׉2­×R÷B´Æéë’ÇÎV݈‹­º @ÁG•ÛõâÑâ˜ÆqÛ˜]l´®÷»ø³ÕÊѨgqû>ÚÐçÙéÎÔ´:.åÀî«ë¥\´pÓÆØZª£¿j«Ö¶ãÙZ"I°eá°ÿà“Pu;ú$”Í‚ä¹Ç‰âÅFd j°_•­šúE,ág¢˜ ¡û�¨1r7 ´ÎiHÛxÓ}âdJ¸ßï�…"<«µ|œWcŒw%Ê*ÇjÀóä!*i§kr�Ü© ά1 A çм~ÃÎgu'‡\½ ØüoF@�´q6XÙ²ÔüUèbDlǘ2"tpœ\ú—,üRIŸ£±·Gfß||)I­ãª¸mVÅ„”Ôìíþ‰Ý4¯oµžŠŠº1=áâ#qð5帰ˆ©€í [[Íê’ÿºq…\ËÒƒ:™¤®XÓ;�U¨Y,5eBÓ÷�y´Rt fh|So©3Ð’öò&ÇìXŒY$fù$ƒÞŸ=Jï¡2j®”ï(Di L&|QìÂ!ýý›Pt«VÒ�í¯š4�dÀ½ƒS’-µòé>#k ¤šv&1£…e‡Ê_r³1›¸X•C‰Ùᬠ¾ºŸÅ]Üg¤÷Èæ\�CVš˜¾iï‡VЀ@:xÜòÆÿñö×ÅGȦ³ä%62ô: §s¸Á–£2ÀºµNo*©è´ÖlÆdïåôÉó Õd>!ÍZςΟ¢ ŒÈ´'¶ÞÓלq�¥rç_—±¯!…Òv·¨­dê(jLô^C±í(o±ú_¿7öæ™} {¢HæÀ5e�|\Ÿ‰á\^eGWŽ ­ì-qgÑÑÓµ„b$~LÇ »½Ç‹�I_—�AÿŽz*Àïw§üCÙj¬c�Fg£"- ´˜£‘:¤mÿXš£¿Á×€7-QÓs‹çph<#·”�)÷Xw�cWÙ�€T&ôa÷��\2)…BC³ZœƒB—3-Ì«î©!‘͈VÎ;Dvj 4ÒÃ:T¸0þ´=ý\ØîÿÄ‹y¤Îq1ÔrUš�p‡¤¨Qü‚ÎîWg–?Ù­,l°vôÿ¡™žm33nΡ@¼qEÙ´–�ùÒnµŽi>ë¦ b€2wT¶¸Ë_µ³>²!ã¢2Džµ'Æ ƒ""|6:Ö·Äm;§¹üå3¥ †4€ÎÀÙŠÁЦßVÞSÎi^Ù“ÄNçB PΔsS,ÖŒÑ[¦`(?.à4àÔÉ)é@Ü…)™»&Ä$p« gšRtdú¡„8 ÓEL>/‘\â’YêþþázFä¡p ÏÆÀ14RHf™õ¯„ãK§Ëj€øQÒë&‚¦®´íV"�ÃRl¬É[óßÁ&›bNïSl¬ZšuN {*²k1îKÀô6=ƒ GÜ-U÷»¤+Ð¥·ñÆ64‚ø4Ö�žˆÊ«ÉdêU© ª¶û…@ÎU»?ápúå³é¡n/^ŠÆ0šUÝ”-üsþ5c…2=C>w½îkWÕêœq¹èªšˆ&CÌ[˜ ]çù°º5›þßëTt­žgy‡yÀÅYXÝ:}v§(•ÒØª±Ÿ*¹EO[ö±1Ýgû#==GMX°0»à…èß}uyd2ë½bOü/`IÐŒÊ÷8f=8Î’ôЃbá•à ´Í•»XDvQgsŸ&Œáu‰l[ÖTâºè�0»â�(Ò¥½Ûõ:4íœé†E”F²ÏQ‰ï>Fï„‘³…´|B£wžÎ‘u™ÀX‚JÖ©ämÍCÖþ]eH=¥ÔòÛæ^š¨:Ù§—ýTþ·D~xêpŠ2åc:'’ïŒ×¨8á~k{–´8ÉOy}ê¦7:CÉi\èQÿõþµÀ jµµÜÒ¶Û£ä#†+ÆK}m6LS(‘öÂÿVæÚ24|÷UÏ-øÒˆƒëOëÃüøøXþMûV`ÍÉÈá �1¯%é0m$þJûMƒ¸•, Xn´±ãgõ”%NYh—•ÔKO}‹¤NC®Ø~¹Ò?8�}«“Ú«39^kÕ.¹¸°ê^¯{Ý4ÖtS}ÇQU‘-*˜ÚTHã»y�‡Yküg_ïÊô’—)¹Z¹•Ì ,¨�:®G F’4GâÞ ;²-ê˜/d÷}¢�²<ö‰,Ÿ ƒª¼ûq¹È-dë?°b‡0ÌûsŠ|RõYtŸ†NÎñà]tËÚ¾†¼âk¦¤¼ýé*ÿ™xèú{Ád¼YC’b å¾c«7µ‡À.×bXø€Ùë÷ …º¦GE«ÔäÛa1A iS§è‚*¾+{³.m=F¦îYÝw”8v ÖcñöES|“'.QÀß-{"h‚Yþ_[WÉ)qŒP „J¯Z�»LögD»¤c]fç(K¦J<„UfãôNá±ë⸴í9¦#ÏË%7T½YÄÒíwõbÇíý;Coõ!2²Êšé™þPð,Jøèâù~Xù¼ëLx•Ð?QQ•¼£›ØL19È+r;1Ë΋šWˆ†3:-«áf»Sˆ48_h„þ!FææT´7eMïaÃWsI¯ØPƒ8Ü-A�—öÿkrZ=qËP‹ë©,ShžÀÔvɲ±ñÞü‡Fß0ÏKøyjÇèn® V`W²ÐY¸S T�)Ž­å¡ ôPÅɃ.óÄ*”ùú×%˵®_¦9`c–'*8C>T'úˆÕ‹îE\ÀbÑëc�ºÇ¯›y<ßACï;÷x¹ØmË“ÐW<^æp$ãF“v1´ªg-é¢ÏE?)E2´÷GÚ—;(?õ†�¹Ø®k¶£”Ìž,†oÔ3»øU}JŒ¼D7®<#Ð q�–&гÍcñáú nm‡tÑýÃ_R JZ•½ë0øµßþû h' v²BZÙH.»LªJ ½}À´ÂÝ©�ª¡®Féí¬œ�qêŇ�…ü ¦¨’n Œ×x›k21œæäÔð#!oœZ£š× ºö=‚Õç.xßRíåH†$Š�sÈ+ˆ+]J#8gêRì7ˆõ »âÈ�#ͱ¯Ë²Öç–¬²whÖ/Ó½î�œyhæìŽ¿ yÓ \¹Z8ÞB‰_˜Å¢þèýŽv¹dIG8/Rï^øg ³K$•3’‘¿à²Ÿ•}r Ñ|´•bœ©î©oïæ¤—˜©’l ¢°4¹Ú”õŽt-�vX¥ Ú-;¦†ÊÕæí縛ÆÑ±‡Ž»éŽu1ÎÛ.-i§öå«NŒˆÆ)¤@‡Í°;?1Γ/�C0ª›G.ßMÂc‘ rdœŠŸËqw¿y1:Äe[f<ÕƒÑì¤Ýe!a…³÷ÈG “£dl�›¥�‡øÌå>á%ËYÇ®†º„±Z�®Â³rNheŠ»Ç²£¸7…94s0®‰Ã]rX‹h&!ï´}^D‚dÆ¿æ0’@ž? ÷ì$°ù`!E²“HC ,jR,· ¦ºv€\ù*õU×|ÕÛ+]�©È$3Ìe.Ä‘Ç6Ùpÿ½Meî­ͳXë·le”¾%|ŠØÇùr¶–òe2é|¦&.ÖVupPº�¯#Ý@‹­–�!.@·dþ†­�ªÌA1ðM²]š´Li1SŠFŠ) ë UI u‘ƒÀa´¥#ðEʦy!ÖB¶©× À\œ�æ‚*ùs»L7ºΉ¿ÀÂsV‚Ÿb�R_CÇn_?~%8²pýºžYz×–ô)4¬Ä‰ŒÀsôZw `@õót=î5þÞŒž‘kܵäC*°Ôƒ�q@©­Eîïc71ú �êdhÌÚÄ÷¶EÝö"‘Ë}¯ëûÁýVÝ>ÕÊgµßEzóc ÂU)!Ü@üRWê5p÷D¤4ÚŒ˜),ù  ¹ÍµšNÙ:†cͯH助ÊáK‡Ê}*%8~9A?ub¥†4 èåÜ÷«chSæxuƒˆ̵ìÐ/ÿžxõ~m'?ØJ‚×€+¢×æ@§´êBïc<ª±[˜cÅ6¿ÉE LԚɨÓ|£$å˜^@§ºŸ7­¿ÅƒÊùÈ.¤›âx}Ðà‚¾_–¤s»²â¥¿÷tb¤ rvµÆT¢’ì�ä-;·_pTÓ›lùØ«ªÞ”ZkÂ�´s«þR¬XÆ!©V–“?\øò²Ž'©OiÉêæžÂÙÏÄ-‹dóP´ á�º(–̃(7­´ã v£wÆk÷… „¹Qy ·–0¦+Žã‚áé;1fjf×U�Ú˜)ÆóãþµG™…Ôß�óB'‘¸ÚCˆÂÏ5i V`¯ï/ß'ñ¼Ì))¯ÍÛŒ¥k¤|Vc¼„–«'‰,Nt…lƒ"ÍàÀùZ¶¿@œ¢žÁ}‘Ù2ºvš´´ü .ÉtqUÐhæì ‡±u||o˜™@¬¡;­¾Yfár|iòU´D¦äkÍÝÑíKÈVó‚zƒØõH8ÇQÉ­!—V@oõ±(†¶Ÿï >•Ñ96¤ÕØR®Ì#…»¤ �‡Œàá¥G¼pÞLùGÅ}ïéwBHFÜXž³�Øï¾Á;cHb_¿Äõ)òÌ«_/$о«èÞµ¹Ëû�ŽMÝ¥¦µ§ï}ˆ÷ù·»}��ÇØ.^xYŠ»®|Ó½0êm¥Ú€Ò¢JΉ9Y£{ƒ1�¡ßQ—KÓ(õ�¾±Á2Á°®üž±¨�®Îˆ„ n;C¡/­J®X�N Óo“̈æ¡~6"]ãh’+ì(Üó‰-È©é-â‡ä ‚ià³–M^!!ô¾ø¸·joµ!޼lÚ'3Ã{Fá½äÇ áLÕ=ªÍô‡d_Üc’`÷Ô—™%Óö‘:YPæ2JŠ%»Í&ˆƒàWï:róxXŒOh¤ÙŽ�¦ŽVk·q ý+�^5¬×{ß´Í,m{èÑæÂA±V|ns{eÒÓ~2Le`òôN 9¼Gø‰»éŽ_r‡‰›Ç÷=žzâx.!±O47ê8Ð=4Ź›ÍÕýö¬ÞðA“+º&Þ°ÜL޳×ôòºuü™ãîòɦ5¨‰=!ýÿš“|¿¶€P/$xß­~Œ‡\Þƒ¦‚Ók3Ÿ‹x' cŸDoñÌè¿7 @£Œvx…Ú¹ç$ßÀº:ŠP(dK)àðhM‚]…%¬fL)ùLƒRøGsufÅ0ó[ëMPQ…«qkïÄî/Þ§Ý©Ó\×ùÅ�í\å²J±eÛ¾ã�¡wó@yÏÖÎaäⸯª¤Ÿ�RIAò�7Ð1ºòN…`5#˜™K NÇ^U·›–_0t"A½Û­õ|¯É{�+§_Éž>ï$¾é€�VV®‹¢-±ÃžÿĶW­)® ŒmÆ‹¶éϦS>Y�AsóÏQá¸?éð#—¼‡ˆýåfÉt²W¹µÃ£ð8Á¨âÔñtdµ ’ÞÒì1'�D;¸‰M&]Ñ”mà-Õ}-¬Ž©³í·ÇþøÖàWLæ¬Zä›cºU,²ƒç¾âjhO}@ô<é”ëút:ÍE{*õâlþÌÎ&ujħ=]!Kƒó•ÌøÐžŽî®¾¦²Óõ"é3”Cæ7^…Ut¤ßEqððSµìÚzQQÍZ˜#r[ïšÕ¶—±Ù�½jcB¬p‰e˜y§BVú6ôà ™¨.ãUk2t¡y0—œòB¤¿E•°ŠbpÏ}Ê\γȄ’kAâp‘9ƒÙð®ÆÃI«\E|X_à#w�X¬Q§$µÿ‡)=›l1Â’Ñ‹0ÚÕ²+q|ç£fÑ<—Dbû&Sž8^“š ±ke ºn~r– ‘Æ=V”£†·†$÷ý°‡Ù€ë2ýœUC=ú[¥w':úúøÎêkƒ�ãó{“\7¨�¯ä!È×Ê7ã¨:YÂsþfŠ…fðàÀƒ1ÿظúŽ•É?Oq·PòÈÞKíe®A¡¢œ€óÎúþ¸Ÿíë6×<°#kcßdà*²IgÔâŠâåרž–±™†ÌìñH˜"¼ºEíiÄ¥ÍcQô@#Qý‰È�“Eƺ¶P,m¥¾·+sDº�žzÿª&œ³6ów ÌRÑ*£$¬;üèRa-˜sêܪ $é_¹¼—êâ„^ysH½ª2‰«Ÿé05–x%‚ö¹¾”<ÛX8µl½"lD gÛ<ÌÀ€ÃjÕÌPT®ÈK­n�¼6‰so|ìÈÃ1LDßC ú4¸(v\Ûܿޭ(Äå~åý¡1œ5{DBXñ͆ó:©Î¼¯å íGÏdÛ´ƒø€õ'× oúSp,sÇ¡xŒ@Þ°�J¢™©1[ý�*câéh Ñ±ž­n…DÀDÂ6²ƒ<]6¯‰ïaÈ\U§ U¹JôM‚ÐѾ¶x:»aìêoL¦a% �ßMù!jñßÇàEýÈMQÈú@^:ñiƒë+S®CƾðûSKt—�¼mªŒ­ØCÅnÜÝÓñ‘)ª9ùôì{Grµ"¢‹´ “ÙŸ‡”Ú3 ?÷?¥/ê×tC"_=|~2£+Çõ°diíP x‚`âmªj }ú-B’ö<Œ¼_Ù*Óé­óôT&ÝøQNU6„*NfSm�éÐ=¯YÚ@MG¹2…ýô ™(=Á–wâÅ ÈJ1ùf—ìÍ…ɾ¿b‡ c{à‰IÕD{G‹�Â)p@‚Û”„)Ä#ÁŒ éF é?çßú®Ç¯ �+BÕzI3M©\· ñ¸_Å™’ku<ŒÊõ\°¯%-ËÚ�†j½³@ºœf~$°ù±ÖÙXsDzGýsjŸîª»õà�ª�n SÍ;‰—䢞0bzšhä÷O_Xöý{´hî&î*Jæ¡xGÄn¥ùí‡w¬(Ç »WT_�€¶O9=ÉTêøå�¿‡û0¢.ã�tòN ¾-4•:ðõó:NmÁ�Æt8 iÂ0[#ž�*Íí(LãX"Þ—Îqn…ÎmO«b¸í Õöˆ/‚ýt™h¨Tq2ôñÏû ‹+®3Í� @‘LuAwš´ºzš’!üú;-zâGIÎ8ö¿ŠG<+O©%ò÷R£šöíÑ-ÛÞvæœL¥Ü™rW½7v?ã$!‘Í�êž²jseNYdü qý«¹ Š˜�¿n>[Än�Rª;ó1ºEÍ�Ó£ äÒ–¬¸¥Ê.uòO²¼æõˆ•jˆÕÅn+^Äou®³/}Ç� šsQܲ¬à2þ†,iÇK_˜Å™6#;Àã ×dŒÀpº¹Éôp9²^üè÷Ú.ʳß ¿ŽÆ–$*‡ÊEñÏ�¤½V{øEç6¸ü¥*0™9U(2Ù=Ït†Ãš_]»Q¿`bÜ2ý‚èâY°ðŸw™4Ö*våà-ÂH4Z£«p~ØËm¿eÔ+–.Lc⽉l¶A¹.Æ«œÞ†àû"�hQ¶õ5PŒrW´®z*4ö7x�!Ÿ ˳ŒÕÓIì¾ÚC‡u–+ëYدnÇE7D Kv˜Xˆ·Á-cãGx”˜ ‘¢ÔäÀ„qIðm²PÊ)`HYés?~ŽÀ×R.ÞZû…_£êᨮzì!¹c$©ƒ¨<8vH/nÑ}ݳ +$u õÓˆNÓ4Hj¸‹Ò¨£ • 1Ä ~¼ÉÖ™ÒuÝ�hþ¤, ¯(ûêq‹ë¤Lõ; :¢CÃ-~¤\Lû%§!�TôTã_\gáÒ²i9Ô‡½¹Ÿ‡Ì #Z»ÓVÛeôE)ë&µÑ„Û]ëéyJlöžÌBä? ½ôiY„ce’&PwŒêÞáòÅBVÓ~:î)—P€—u:qçMÜö§ðÌb}]ÅvmPØ*aÍEL•ëÁ»GBÐ!t2�OÞÓ L#a€Ÿt;@Q u»ZœmîRW§J­š[ù&ßš(•Xx µZM$þSnNbAÆOØ}ñoy�1-‰ ²™E•©â„!ÊU†wMAµ�\ÆøÁb£RJ¤,±ÜœQÜ&AÓWðe¯ì_CFªXwÜUæ� VxÌÌÖñN÷2ÈXFJAÓ|G'S*¥èÔ©ÁÌ:ÐRÿ5Pæà$6]0QÊR‰A|Ö­wuI7 ¿,Q¿MCƒ“î‹¡IO*a^€— ƨÈM-ž¸Gè@Ýûz–݈~R=§J­š[ù&Þ­14½‘jÑ„^´…“Y—ÏÍßÙ}È�=ª`X,Üáú cÇÌd¹üK÷yÁ�_oÈpX¨ÔSrÔ£xAàu‘!i¼h3ÚÆg¹?·ôB`A¿Ú®¦+¢]·ÊÎeY”b ¾CÉÔÊ©z4vqh#þndwgÛ:0ðÌ�Ô:z3R†.Q](x'@鹤eT…>´&è$8Ö[áYo¼Îu˜OšÁrRÞxý¾S½\Ħ. ôØ›âÊY!’Ø�„+7ÖW›|äIÚ› 2ì;n´¸ ®–y.Œ›Ç�³-ï‹.c1--5Ðð$`«²!ÇMl©5|Ü»ÁÉÀƒN]0}^Ì&õ?7^�2qµêÃ{JlöŽáŽåöÂ$1í_k€ãgŒÌÍoïs!…„`ôž ½e¥óU%§F—º×XÒ rf-äˆáж Ìä%óåË|!:*^µFæ˜X£~š‡ïß8@MéÇ3 �¾D²°½¬`Ôèµt±:f€“yDR ¢,DÑã8ï€Iê¨øDTè�—NKäŸ \´õ““ =:¯ Ã¥²SWyÄÓ»Lú °~Ô´V±lÁ&ØõùO,¨Ûˆ"m9kx:jþ µýŽís-Ã{Ä{�Žÿ7ÃgÏ~w;Ð'ÆvÙFU¨v·Ps¾ceccomp-4.3.1/docs/images/probe.webp000066400000000000000000000337541526046660400173400ustar00rootroot00000000000000RIFFä7WEBPVP8 Ø7ÐÛ�*?->m6–H$#"!%³Ú8€ ‰enát¦@©©,;Ïoßÿvôhä~Ê>s�nĺ×õ»ÒC™¿ðúÃÿcêô§°õoðÞz?±Þâÿ±Öõý7ýç©çøÿÚŸqÿÔÆ~Á|ÿ;ÿ?ÿÿÙ§üGÿŸpßñ_çü{ƒÿ/ÿ_ÿçÙÏþßîÏÁ·õßû^™?ÿÿôvãÿÿÿÖŸÓÿìß�^ÿüû—öÙ;ÿù§ïŸÝ?j=|ÓñeéÌÇô7ø×ØÏÂÿýÍÿ íïùßíÞ1üŽþãòëàòåã?¶~ç‚õUþg·Chóõ[çßèÿ“ÿÉþWÜ#ÚÿÙ’õ+ôîßè?0ÿ?“ÿEÿQùÅýóÿÿÿÿ¸ÿÃ~ÁyZþCþì¿À?ó¯ñ÷¿Ö{ªWÿ—ý_æo»oËÿÓÜÿKðüÇû?üñ?“�whĶ-~¼õgÂÓ‰ßéºEÅ1§I”zäLÇóãË—¾µ"�@¶´jA¶x[–*l’³·NÇ7ÿq“ «l{ÃR»•Õ$êÐÉÖÀßÒX\™#ø±ãÝ|–6j×”yØo kYè­êÕGMˆ½þó0qWÙ�T0\ë«”þ‡Úì–O|­JD¬ v�×;’Â×lW¨‘äîKÝe€SBgÚ""wƒ§Ì5ŒØõÀYªAÆ`¶˜43ˆåJ¬Û•òÓÿhá Q¬cnµ­¸ƒo ŠY<ÿûß°ˆJhÄDu²>}À°…¨sÿ©Xä;~Û„CÑ‘ð‚YløýÎpª¼6Œmú˜?ªrÐhXÙsÍ[`y ˜×ø0Qw—c¶ªz¨1VD‚¯ú�âú£+¢RžsPYq©Ã?ÀŠ”©Ä-ø`2<ôð†7ê¿V–s$ƒSPw_ÿ¶Ú»lˆ @H/Gýè@Ñ &ä!ؤ�S,M V¿Ío°÷Fü¸bXé$ª|R‘/OZ‡¥ÐÌÿqÌŸF®S„7…ÊC¼‚jBÅY¦)•!Ç)<ÝQVJ׺ix ºGU±Ò*ã]VÇH«ŒÌvÓ¸»Á4WyzÅÛ­]Jx.ù�sè�°2êyçeâ±c“ß+R‘/O|­JD°l·,Æ¡IÙ 7óšRCaA‚Ñ¥³|Üí.ÙSdÃU ¶èÝ.5‹Ñ£Gð-D �ÊŸT¤KÓß+R�ód—dªÐgÅÂÔ�^TÝv@<kà§Ó¾½|"‚¯‹'¾V¥"^žõ»ÖÑ5bŒ[TcƒŒjqIØ€ ¡ÂönÂnƒ [1——ÂÔs0¾ð¹®É$WÅ“ß+R‘/O|«Gò¹  �Ž©°®’ÉLi“çÙ:%-j°_lÅ VܺC…S\—»ùÓ3žÆÔЦ±»+°ÕɨÖÍÌw‰OãJæ(Zcôµ/ͽÞLR|©H—§¾V¥"^™Ý}A =Ûƒz.�ÑÛÛªªíΘŠÆž°Î%™„|BØZH� æâ/R·ƒ…3]VÇH«�u["ªç/›j$^Ç­�AxþýG3"¼*bÈžžaEveS‘LPü¬ï8x:�óuþ]‰•q®«c¤Uƺ­Ži’h8Ž�~¡t-wFž#–u÷­F›×NK'€¹>ÃËWT¥=wN�ž³¢^žùZ”‰z{åi¥vÉÎ II$õ¯})¢Eñm� ”îµÛ‡TŒ²8§öÖÑ!Û””˜cš`·¿àÈËÕ$KÓß+R‘/O|­4M½3�¾Îï<û¸qõ›&ë¤C\õä êê ÷Í·ÿwj!fH—˜w^�UH`¸%Í—MšójÉï•©H—§¾V¥!ê6ƒZ$])yrpÇ�ô†~z$×Þ¹\ð�þ~�½¥[H™¦ø7—2¾¶–$|CU±Ò*ã]VÇHª®Ø•“¬R7·Ã¶9hgý#ñKàEÙœÊ�Á !ÏÆ— ¿;‹Ô ë6•J€åØ!šÁ•)ô÷ÊÔ¤KÓ;#.SÃ^òë-LôúÀjs¬¢@»‹çhڹɓ›{òöŒ™ÇÉG´‘/O|­JD½=ò®ïŒâêLké�U9ùLZ…xç A©Û\+¬ùJ˜ÝßÿÙ•q®«c¤Uƺ­ŽTþ7ÚÀžúªg§>òª�ÛêCö ‘£ÛFÅ\2ßîLS¾6¹Ãæ¿ÓÂGtÄö<7û?À/нò…L!"˜lŸmFMÑb¶Uœ‘Ë峘 Ùd…ë† õ¡±–u7õ_*€°-캣q·ûUê­í>¡ØciŽuyÔ›ŒÐRˆÊ bØ 'ÖÌ%ˆ(ö=¯ÜôÃŒÜÅ»‡=ª>¬œGB›ØŒálÏtÏVWTvzØ4Ԁ͛'†j§Óš÷H°±­½êuðQJö5 MÇ%£�ˆ/ÏòáZ°¹ µPË‹fpįÛÛxW’a3¨Ó°£Ÿ¹`¥Î¯‰®¾–¨câºñž£K)ziMKï]VÍ[ÔÈÏ9]ÚªØ-Hôš:=‚3IšÑ.=¬ÝÍ×p0’6Ÿ(òúš|ä@ÐQ‰Š”uýB•€r��9Ûg‚¦U‰úêÂÈôs.ø"ÎdeÙÌ&‚ 8K#ßêbBÕûhû΀[š´×»DîúÐý¹~=b™e=hT�æ‰ÂžØ†˜D«(e½„ƒ­Û05ó(ð£i„+}yíu ‰E‡_IiÖ@O<-�Gß0î+²KºÐaPÅŽë*ŠhÞc”%%vQw [Le‰F÷?¬aŽ0 ëål NV‘±,@HÔx‹,Øm7e= Úa})¨eôM6i�pqãv8±¶ÿûÚªæÖOùçбÄm«ÌóQ÷>¼»EL9ÿ’ŽQ:ëôm¢ëóòDáßB:ëÏï‚;$5ûùÛm;Öõèºw£žÒ U�;Å`½Yj.pø§¹’�XI³nJáî5†L²ðÈñ—¨;ù\ºDsÖU§ñ£|"…3+’,€*kB‰E:⥎5:œ³´ñÏŸÚ  °å ò�ÑDw_GŒû®j‘»Mÿ˜ÁÅ®©p>EQ �=¹J*Ðü21Og^áâãÄeÿ 9¥ç£é¶‘ ,b ¡Î^Ô›0ð0‹•„[FøÝFõ}öR“œ&‰çÕùþì›)YhȈh.<è½;UfŠ}þ6/à/Wüˆáºyß”4 ÜÕ,ÊN¬pQä犅4…(yH:�¸Â~™o:p&öÑ$™ÏÔ"P¸̵Oâ¼ÈÑ/$¢MÈS�Mäh†ï¬÷oÜ ^ˆ ¹�¹z êéw }`‡ÄmÈ"5*L€\æbò ”°„U›s¨ ðÑl‡‡ß¡vm=áVµ‚e·Ä­{ã N«y6$rwðõÅfÇGÚ¤•?C죆ü™W*$§wR â,k½†œ§Í"ÃÁƒy/V€“ –Dÿ:3Û¢èšr›XÀŠÏEš9ò–ì{:�݉’•Ë»nï�N­šÁᔚk)›"àÿPé.9 ßî°�ôµÝ¿ ú¯X1ÞöTâ8½À¨7cfa]ÑøóÒžk°P�‰V³(ζ¾\ZÜ#ç9ÿ<ìE}wp°¤r�µZ;Œ¦WÕœÏAÎ%án!�ä©Ir¬~·Î“<úr—¦ñ6XW9êQ èR Rí[Ùu;£f¤·ÍŠº^9GϹç¥ÃÕ­}ÙË ‡‘vu¬ö7¥€f4*{˜ÿ:ÝöIñèx°±ôˆ âM?l¬›ðŒÎ™QrýX`�9±wæ Mú(#T`�ˆ²mÇÁÐ8„ÄßÛaÞ(È×¹ÃÞ$_ýwsí%½2ß8T•9¨},º–€9D¸Ú�RWõªå6á�°áá�pãõ�5doì™õb£–é%?ЄP¾°R:±ÎGt3-µ�Uµ,tlî»ù‡�éûÚ’azõ‰qÙ×ör@¨?÷7À”�PsÏFL(+p®ünnÇ=—“ØÛ'Ûòð6 G÷yïjÛ*¶~“J!ZP!.?vá½rdz͵ZšïÒãÑb×áä´9J�Q'¶,àq|Ëòê|°ßÐc"# dQeÓýWTHém]hŠ…ñ H‚Ùpögu²GZÒ ü2›p¡8b¨ VN¡.yà eê-=3'» Ÿç¯m¡ëõ‚‡‘È”ƒ ülàøf>Q6ª…5±¬â?M ¬.ÎÿÄ×bbê)aú¾xãÓß‘V·©³\A¥þÝ�ÃðQßM™�ð4 pJ�J­©CùY€Ò*™veÁdz$ùÞ=qžfF û- òFê8Çæ•¦L]±ï-Ïë ¾r�k-o%N?\¶£ˆÑâe Öe¦ø]žKÇ)‡®€Zó,™Ô�Õ,œ2ƒ2íÒ8CïÊî÷Ws…N­åÒ±ä%ŽiuÌà5�:ÜÔð‘>f4žÔ/¹õBjíúaº/U ¡”ÛØü=åˆPiÒ9!²€Q ¢³ÔlÉ�™rŽþBÕ}²Öég.fÛÓ„ QÕ¢|ÆU`…¼,‡÷8¯MâRBWËYV8·;"ËFü³Œ Ÿø{¯Ä˜‹ã¶_VLä@€>1Q†£¶RùE§&m*¶Ow¿‘¯Ç%Ç…&Ä…àƒ�ÖóY³"é#7ÿa€T…”—YÅ9”8¤ÛD}:&vϘW×Q*¤±º#Fć‘z÷D`­o�ä¿Ô�áŠ4PÐrê64½+Èå5¥>B. #—´Á< äÅ­ÒG«‹œŽR�ÙšèÞ¿ðýQ3"½ˆ”/Û= `·χ׮Õ÷ ’è5ï?�3ZkRÈ3¯¨&­ãAêÐÚmSC¶— u@=—DSÛ|0ë²ËHÿø/®�ÔÐT�ø«½ÕD›‹xk«ÎÂ7,š÷Ü­Ã[ÙMeðNúÞ Â©ŽÍ¿í©*€GèUgcFaùuù—á=÷g½¨[�^|úš¡OUà\ˆcþNgÆs\;:.h‚U˜á;ªS`ñxÝ•^š>7qŠ;ŒÛ[`2øÃ«+= h)•ýûXž~RÐ3&à”nÂųH$àn—ƒ§&|ÑÞ:z™ƒf �BÍ´7Ë!‹ü̃£#†Î(NÙòóÆOgꄳäDÜÆr¤ýnàÀ·¶ã¾ðú;ºÔ‡K+øQT»ýå²ìà –F½c ˆh>ƾQ:#3ê,}ßÀÇ£pù¤:öÐSœûm ÿ÷%/ÏüŒpk��Š?a±cîÿ·ˆ÷ÞYÚ5êÙ–g~¼Q(ºñJr½wg™–©µ¢�:™ô†Žp¹rz]®c�ýÖ%ž¸ý>E¬rReÉxgµÉ$û¬¸Qmϯ'¤„v¸“—åsÒSÌÀ/¿bÍÉJ™Ru’ƒiÆwøÙ*°þ;î€ä§à^ ÕØ`�]x#$ܺÇÀihi y@m|Ÿ ¯ìÂÉÓL¯ÄmÖ ËHï ~Š@ôûVÓ�î·‹i”É®^ª çFz™|çºr5iôQ\ôV@ã¨eÝ቗zã1}üT™µK*ãd®«@Ì+åý”w…¶¡8D+ d(«á„½¢^Cû�(ءŵŽàl}\wãJ€éºÆ¬š1”p<hWDåé:ê™i¬)–Цilµ«ä+œÏ ȵ‰'IK-ÈP·Fð�òã�Á×›ónŒyK‡8½²�K…2T…ÔÐ3 A0ÃY|4ÔATˆøn‡[£¤&@�p¨¤‹ÃÒ£~Δdì³ÂADó²Æ žqŠ�A•™ñMå>ÖÌþ‚h€ â*ðxbÑ›Á®�ª›mR§¨~Oø¥ä�qÞÆí%šºî{Ó3÷Ùó;|Ü?ªÏ‰{Ûtdˆ@Ü3¯¯eÉ™ýaµ€<ãö/Ì~ŽÄtsÓ §ê¯|Œ€ˆ[ïzŸxžâ¼x‘úæ®6æ°óoM?mÍ+…¿f&I.¢éMS¡ �b�/£ü(¥¶Uá�Æe¿Ϫ³Çe'¿èòâŽ^ÑGIÓ±«©õÈXUæ€f>ê¬o·½†Å]I6™Æ²$yTlýaß’¬\+Êa_{S~xÜ‚6Diš%êõgzÊΉ5ŠSÖsíþð…–‰ÓtüâÇÀd1僧QMOÑUøÕÖð€¼*VÙ0ŽˆÔ,Ú“3°i÷§Í Šž³;î¶u4F}ñBõƒ%Q‡z,M˜¨0|”ûó>ç�h¿þ“ÑéIö*3Ðw¢»Œ[§Ÿðž ,¼Ú{µ¸îKça³¡PöÈ‚Cs>ÖÛó­³_V.õÀyd£½æÚJᥰqgÏÖ0~ò¨~&¼ˆDâ×DeidæÖFÉøµÈÓ9}`m )=R¼îµtEM|,Åäq‹etšÎó¾f ¶Ôß½}�ÂOf4œ�þ­Ö€>»19ðiÇ—èµz¢Îóƒiè˜üÉ¡zÞó�ØÔ= ÃU%«Š*Ý- "Ö]³ ¹ÇÄÌy_S{ßèI‡3rWf¸¨ØëüÜ7f¸�^—÷Æì´Ëó8Îç= çA–ÛÛÔÎ'/ÍgA›e’�d†$àóˆ‘Äî“ã± f¯Áö·Çƒº‡£$ƒfþ}–×�ŒxSÕ¹ÿ¶RSã·m2RMVrѼXûä•“â^wmŸuÐ})IrïÀ8Ä‚¶·†ÛÖ>é‹å޳¬¾ŸŒÞŸ¢mþˆnšy{â|ù¡zk¿‡ðíN�q½;|ÌNs'§èé÷tûAØû� �òuyx�XbMSOñögº]:«lƒžo·L�);:°È9v²>ÿš;ˆ[2û<±&ÔÀþt�6ýŸu …p;º›‚¾L§áͦl8ñgwÜò°2Œëêï jÄù2åþªâSƾ˪§t »6+Ë)$Ì¡ñ¤Õo¿Œ­GD9áÜ*ÉÛ“çf™Þ�còè=!€—"Ëí7"àL p& V(ÓÕ‹¬°–Ûz(­�ò7 ô{Q4´Š™¦Ì”¼ÒП¤yrÁ'¾ó]êW¼· =ñ¨æ$™¦ºfgíU-üBÑå‘òÓÚi¼øêùûú¯œŒìžñZqh¹«b‚^£õ�Òv&ê†JªÞ;@1o ¬LËq*•Õá¯+&¾šâ¸ˆºMD#úYõñA Wè¶äššüüºîdØó€>Åe[KçøSOåÓÍÊ'ñŒÕ6"Rƒ(Oá¿ 8 æ÷ÚVUÀü«¬óMÝÑv½´Kávö}:UdÃ,ìû„�!È-›g —à®PIj)oÍå �뇌5*~—¶Ó`g­¦!q#4ŤÄ#�y˜NѱS]ã€8ÜÝ�C‹ºn6¯…ܾíúΟ6µªY�=;ÞX6`¡îq“ëWtž†!Ö7q5ÜÆð�Úåø¡Ku;µÍfÄmØh}Wqmùˆœ®½—=õbÆì/Ò1EñöU¼²¢ÍÒcÀuý,A´E0ÖžPxƒïÏT—AÄ;9½£á¾Sg¤„98ÍD[—µÌ'väNc?¿J+ruÚÞN#}­�”Ø4|÷`QG /¶uàûõŸˆB„h6Ü” iÖËfiqkg�£ž¼žÚ 'w59�;A1CÀu�dæÌô„\Ò €µÍ‰ÖŠ��H±¹¾¿ò)&•UHzBM9X~Ù0­Ž€hÖm—�~AÝA´lc;Šv7¥ƒK“|NÎ�JÔïä$7k°¶ÇMÿŒÌÕÖñL¥9¾¯»S´aß ¹'È�!èž=¾ W¿ ›>{‘ÀÕ+–IŽûÖÜdý~%Û=‡çµKàÁwšì¼e´PXÃ3ö|qòæ'ñù8à¤úõ௫SÇV)&“Î?/Hfž×ѳ¸ÙI·EŠc—ç׊êé£M’¦'óà¤/ªeîÙr=u½Úv ￉ 6+ýÇ7ÇÞAÌ(›$ï � ²:üShl˜(+'’¥&JX7¨ƒG=Ê„ÛDVJÑÓÖA¾Ú�ÎC4ÒæÍG@˜Œç™þñ¾‹ §Õ¾‚–—ºíʼ¶ç%°„‘=�;•³ËeZ—ã·ÝŸÿ´ ¾~ÁaC*É/¤›Ø %Úñ @iËlÁôS5a¹"À7DÙÌV{ô´�»z£ÀQ7·ƒâÅ•Bà÷©-²Â®u(R(6¤ÀªégˆÌ„Þ òGÚJFäÀrý ã §õ4žÏOêŽp„©O9ÙöËüJ5]Cº6z¢ÑÊ‘�ÖC¼ÝQwÁÓï�fpÿ k9Á¤‰E…L(™ÁWšb”æÞn`œd–r~†àÝ,Ù]<’wýuÙÛ´�„Ü'§E0ǰ�âL¢äï÷»†Ùˆ�ÔrOº­VÕ­ÛÑóÖhKÿ6 Xªû‰E�:®ä¯-R75øŸ¸#N|Óíîaê©�FÖ—2Úp&® †¾­Ä_˜·=\4-*Åô¶�ʱÒ(Y±RÉÙ¦ÃÌ|˜Ð|²ñvG5±›‹»ç·>ßpßÍÏÚ�Ó"qƪ€æÇâzVµH¡c;o‘«zìø„n4ž öåº5g•W2�œlÝ·õPÙW–{ÕQyÔÅúÿ± Ïo+L=¿Ã[�ݖѾЉtD!ˆ/Ó÷Ÿ=˜N1òß9Ÿü`P� L¸6 ”²pøº_A¹ Ô«'&©?N‚B�¯{.�ê£ùZÙöj+y (žÍšØ4�pôe!®(%Y[G<^ïÈOSc­º©$‰rüemªq†|Ï@ßEzwàjwˆ\¨ó…´›Ì|Ðwý׎ÃF ÚK‰\üµ9 wŠfÞ8oŽ{ ÕZº†Øî=ãTAMùÞÊå ¡©_>Yc©ïJ\N4Ü�ë8I ß¼>PwÆKèø_ªŸÄ÷GFwkZÂÆã#«Û+ÜAUUO ‚×2Öä@Ç€ÓV9TI'§øv@n~å5Maêj*Î�l©žeožš³Íºð´ 5õ'ý�Ã^ÄúvO«+©Àÿ#Ù{�Ã7ø!3¡I†<ªÕE­ï܈€oä®ÀÜ4Ç‚©s©šj3ŸŠ­°…殇7è�C3´Ìa.µNb]ܽ¥B¯÷@ƒë.R‡5œ×Šë£ïK�¬çSã¦÷–8¬I„VÆBHnpïmÕ¢‡v—ñŠÖD­!w¿Ác° ¯¿Ï^pDªÍŽP<œMžL ÄP XiúÑ ž ¹/ƒú¥÷„cò’RδõÊòœJ"ˆ�D©Àë(¬¯î“Ô˜ÀsåFïÍŸU¢tZìà ¾ÙµÀ©æÃTÌ&*ÚU­® š³š£R%ÒvÀ„Á!‘Ú§) Zk‹ÀP�+!À"V…§ê1^cÔ”î 狵²õú"ØþŒÆ‘\[e%¼M7¬¯p–U}Ç%‘«(Ûˆg™ñ"d„)‡B‚ü Iš¶OæBf��(bJmˆ%@�P4Êe•òÙb~Èœ¸ìTëïâ ?÷{zê¼”’ŸîZÐ c‘ë±Â‚CÚ ¥’FyOÜó§-d‡òÑÞä³}Î2²EæÍ¬nRÚ8ªx:ñô™bº›ôévЫ-¯ñÐ-¨QÂ=ÞëB?Ð6_·L¿€ð“Çžoärص8�ùy~ºÍ¢ ï‘þ�äÚ¶ý=õŽwü�Õ·È£2VèѰ«1ö.¸»(©9| F#ðÙýwã%Ú,JØ÷Ðû¨4"]2F.øŒ‚üËÒÒÿÄ®Èa Þ7@üÂöcIëƒÎú)Q¢õåEàHËC¨q˜"‰@O#r¡ï>�®‰5ÔÚ£¡—ŠT#A’*-%/ømwE4ª„¾(6ב4pœã)ÔëGöÊôGÇ~µë‚z願ÔMXÆŒ&.,=sþânv?^�Æ ¢Ú,ÌÛŽDkEËðŽ·K‹qó�€/±9U�BAœ¤÷·âÁö]´(LGq¼ƒ Rÿx¬Þ´eì-EŽ‚nçCƒûæ ù͵ÓWrVôüoýŠa¶-ÛIˉ×ÊšN4Q�jK¸hri ™1êCx›ÔF O[³6•xX"°‰ˆ¿¢gŸ‡ÐÄ-Ewv-KOðq, `N”FR_(ŒEŸwcÎÂé- Ùbr®µT�g²°^pr}Ʊ ˜ˆÙ®x†~º?쩉¨¼\f«FsÖ¡HÎ1§Š–|‡ËaKkPãx4aÏpe³î”�vÊþ°ããG&‰³¡„ÈR>̘�è¯?¡þ™²u eór€ÂˆW™ZËd�E‰%%¤ù¼$–5›ÿï_­Šwí|”|Ò-c_Ÿ{ýl)fçý1©áú¾�²o±CSì„Y¯1œ±µŽ¸ƒÌ]êi!ãÉàh< q‡‰R븪¶kð€ûØP'Ç÷‚AL£Q§B~%Ë�¿r?… ¿(íj’ÝjY ù&ç&Õ34?B&eäM|KYãOgCªD÷Ú…ØÄ*#ú|eŸ€w#ˆë•eJïx5žÐBp³ÑgÃÊŽª;£ÐË…Ãvm[é­h§º€Ý¾¤Îva¥ õü* ç3Â7Â](~ß•o–ogÁΙLù‹4ëwŒx—<ÌBËŸÑ@¯¿`ØÕ=·÷Š[绹‡Q"k/ åo-)“X >]4—º:Ýx£‚â‹Oè§Ð*£÷óñ|9Щ’0‚º¬!bL?M#íÅá �9n@ãš©×ö§±ìœx`'e*„gꑸµK¨½�4ò¶ðÚU3)\7ä&±oK©ÏÕ¿~G<òm,ÄøcmÞO.¦wv/éÁ’Úh u� ȱ"þg�Çà `¨£Y‡Þ„Ò­wRBÝ™ý�ë$ƒ}uHÖÓÃ\*;!ò/Ö‰qÎÂf|ØåY템ϒà(ÔEŒú‡Ð²� _ÏT_ËŽ˜ç$“;ƒ *ôX²Ï¢ãÕýŒó[Ñᵯ“QG@X¾;¤….ÆUj �zæ^S-f’иbKÓHÒŸ‹ÄÙø”+ ~²ù¸€ÇfÊ‘?Øe�H@Îr6ôjš½+�9‰�mõ—áÀG,ÓEyý9»çéëÛlÝrî±>¯Eþc¥xºëê«<{3É|¨b¹xêOIÁ˜�`Zšý~¢¤®ö,Y0І±Õ°$¯¡$F–¾®¼ûæp`¾Ê!e‚%�Û­}ãQžúãݽ*Ÿ 8#ŸôïöõPêKØaËcš�&Ÿ>³XØÙ�ZazcN:Í’n…¸·BS I#b¡ç·<ì6Ž g7u—‡¬`Ň „qÄ(ÃÖ”`µV]SýQ¬ážÎ€f þ3†,ð•š/› =.»ßP«¡=L&æÌ;£÷crÄ'ö›èXøLÊ  Âà{DP¶å^"x‡bF@FxË~ pù˜6ŸdÚL �+8ü´¾ CÕ­Ê}ÃØˆ—GbvÎ ç;[šàbX=7«d. z<䮫›º|ðO¡Gøü»¹¥AÔ]TŸŸªaÉ7ÖæÃw²Oñ<4°åÂ’1ˆ0¨AíE~,¨(ôm'FŒÚí;�£1ßç$¥Í" xÉG"˜r Ù,>áçªôª:2’·LCR‰@ ÁÁâÅ»¿èNêNoä}*˜m¡Nj�r;!�œ«�&ŒÌý>¨Üe¾'Z?S¸²gëÓ ãc [#A‘Ëö©Î ?Y’WSQOá‰KárÄ|P‡àzÇpjyÔú çÔ`7›D(@Ùõ|ï I+¹þ]•ªvxt¹SokÚxÎ}h.VŠ–ˆþ„¿þk—CúHwƒ×ì7÷V/§Gd †˜Àv‰ =æ[[9Z·˜öhvÍÞãl8ÔÁ !nyĤ^ÄÞέ£iÈ“ª‡ës.ÌðT¾ÄJÁÒú›ËàÜ©�µ›7¬K…:ÚN½ÔÐ DLÆ”ëG~¥«´Ñt8ÿ-Íz.‘kÛÝXp Ìñ‡KŦR¡•Ñ¡¢r¹0pl$°5Ü52¡Aóà«Qž>ÁpÕÇ\¸Bƒï“/©Oõ{¥ÑÉp éÉ Ü,?Æ:�¯Vªæsþ�¶4ø¼¯œÎOò&dcÌ·˜ï"a2‚~@?„oø€D]÷neÒßóÆL$}Í«¨A¤6í"a›ÙÝÂÝìƒ 4S q³þÙC5`hj�X6™ µÉSöˆêJ{7D[ƒ±}pÐ;žÉàP•i˜WûÈvnkðAô?*fæ�|øI3¤ÆåpŸ¦½‰E{í¹aðm¯v^¸�™Qæ/½äMöGG½e ±Ý€wM¢˜x8±êâ¢Ú;]¹…‹*AÜ)ÏäY@$sñù§tIg}ÔèiÞ¹:g›6íÜ/;¹u;bëF¢ý¯øÿâç ”^I|µÖÇg'BFê¦ÊÉ4":ÝP[H«ÂI“z¨‚uã²Um n�™z­� 9Ë7lÙk9rþ²5@:Ôç”Ç‘’¤U=lVÅûQ´Ë„åãÌwbݘa¾|á¯ò¾:Kz—¢'{Ì\í�¬Êtà¿§RÑ2lª˜û¹£,ÝîG{CãsQê‡ôò�Ðóÿì§€f]˜Äe Ër™O�²Ù"¨†–ʘ¨L™*óÜ*(ì�„‰‡Þu™£l±sÌ9¡·Ž‹ ñ*¬]¢²_ÍÆ<¢Œy·qo8R~áKÞ£ ¹ËR¼êïñ¢ú¿¦E='¯ƒÅ#7Li;”Ðy�€'Xrt£³àÈ1Ù#ˆÄå ,c¶`˜ìE�¾�ÿŽ}Ô˜ [K¯€ê�5D¢clÈz®­Yý› ‰žãolçÝÅjDá}^å»%8Àûˆ(f`§\µL=CbíD©N;ú9}‰:òŠÚ«GlJD Ûˆ1OIWRÊ…úC+yðwù4Kv?õýÓR¹`0bNaÂrVTÜXA{ñGðØOYI{P.â{Ž[Ÿ¦º9ñâu>WO ¹ˆ¨åÖªãUÝk†ñÝí¯_¡á±“XdŸX^T ;)ø¶oÏX1bÄ Ï éÊä¶,øËBâê#áR� õ;ćn∋�ˆô§°ƒÛš"ýçsò’އÃhìWpšÐŸlß’ï…2ÿ‚�wk‹C4kUví«B¾Hàš±M¨„9ŸÎ�¡ÿ¢u³%5ç±¾B ÀûE-c±œº{­s£�¡aU‰±´ìùò«†lÅkÞC„t‰LsS­ádKW î4Ѫr=RïövW T=Ôª®[ú>G‘½{œ¦q¬xð ô%¥êI\Ü‹Ö"ØB¥nU.RÁr˜ ‡m$ìÕiêŸu±4îñê¨ …¨‚û°Š†Æ2Oʳ»TïúHrÃënWOËŠÍðú?�Ë´]þí+l˜…à6;­Í2@<ÂoäïäÏøŽj0€ÇqlÆô›k~44~ ƒ4±Ò3•¬Ä´ø!؈¶Óöl»X,�nO¬ô�ôâ:“à)Ñ ëúâ4ÐX|eü*.Í“Xá�U/WÍÃ)1Ã¥Ù7•WY§fþô‡•BW!©ÑÉÙ;McYkÌápOÑ�$C Yõk�”�Í“G¿ã{²��W†Ø·„J1ÀY£ì.T–A½³¹OncñEªk "¯ˆ¬-/ÅÈ3ú™rÝ7¢ —6¥+3°_´r�j¾ñKNß6”Ù76Ö}�ÝÐŒ€4~‘.q5…�â·ê ¶—h Àæ}ôÇO À„¶oTÔn…?Ý£pÙì¬ÀÆôY£'Ö>ÿ¼ºFe0à9?göùGÀŒZA�¥ü_¦¤šŽÄ`ˆ›ô5@Ðê$œ›Ñ‚nÌTS{†²×REƒßŠ…œp|ñþ$yål0ÊBâ"Qñ=$òoGÁw©lãðúê^UªyÐûÛØÿ›Ÿck[MXÙ‹•iå¸z¤žwF’H^FÌ:ï@?�0Í3Ü7íVn�\†˜Q-ò 7N¯k€9ÁÙpŒRC.×!N�>gHPâÉ"Å*â) }ä1<µ "à�„Ü?þ‹„ó(Ùce|ôó•S䛳²—‹+†�Õ1égøŠÂæ"ÒÁ=e‹HîÙqÆ”ï»Í¨³ÜÕ= Éòê„1Ë0çêlÛUYqcM‘† �5&ŸØWãî&4¤Þ´=M# Õù�çË ”/¥®F0†.€ñ©––üïEYAÆ"n%®©¥À‚Ó›ÆFYb°WrߤE¥ŒLz¯u9öéI‰ÊëÙoqW¡8ðÇt-Nn¼ÂzïÃÉ«ÚaV#*^È®*†åø Z9V ˆw?“ßO�¯~ä\ "Ÿˆi¥¤™]ãñ€ÇMiÏï"§]­ô2­nÓ䉴_i¼‘D&Võ­¸†Ö2 µHžæáêæ,Œ 3„Àr2*‰¦šV0GYë,Š�VŠ ã‹ÒÕ–b.Õ¾"”.íÇ)°.v,æ“Þgö>T׸�,ç–ˆ€20ç fœfÔ¢@6‚üèh'R¢L+ò:�dQ «ØocVŸ"ö€âx75B†³Qß±àøC%P(#Edåeñà‹B;µV…£¬fþUÃw­�Ì!´¶9Ø×Ï `aüÚ¤ hPšé¼š' »ÀΘ#[$§c÷|ÊÚ;lòëgâ�O¾« s2 v÷õ‚ĈmðŸê€à¿ûw‘@B�ùK;÷ßÁÄ3?X¦Æ!Øß0¢l“çˆÚÕCÖ¬b«a—=ßr±àÄX¼D¸$²“wÈ)J¾öW‘*5—|¨~ËÑÏß¿òÀvÝ ²Ÿ¼œ;þ{¤\V×wÏm,|ÏùˆÿaG¼Y¤Ÿ«™*Õ”ˆ³W{,MÙ@—ÜYã·Jæ-÷–8ëóþ•(ÇgÄ”%Œòuå­>Ö¼´Õ\�BÌ¢{EïwÃñÎT? ~w¯þhöwÖÀO\0‰p;ü€ ´„©xDÅgí3!t“ph²AeÓ»½ :wÏêæ6VÃ�QÏ»Ð;YuŽn`U„¡KQ"çHÛ0$›Ìòn(Ì1³¹ä½ÙüP§2ê°Fe®¼�5çÃ�ÎD–ðÜwL"yMa”Ðh\,¥•Zæ¿ÌÞ™½îù°I“%ú¢äÑøèD%oÕdàhÛ³Î-ió7vŠáM—ؘ5än¾¨ÇÑÿ„±»ËÁƒ>з6åë&9eYÓš°=ÄTq¤²&§Ë{Üãß©Á690¦Ñ¯„Ÿ+fÆc ‡æY_-ãÈ€6Ø Ï•¼ƒZÎ<“ªì÷‘ÐA¸8U]Ì)™iõÕ9-ž•Õ±ÑÌéÏãHêA“¡�œ‰:¬²x}H_ó+ÌåŠDÞA ¡LG�€ceccomp-4.3.1/docs/images/trace.webp000066400000000000000000001444421526046660400173240ustar00rootroot00000000000000RIFFÉWEBPVP8 É�g�*Í>m0”G¤"¢!(Ò,€ ‰gnöÁgýÐ�·‹ÿÉÖaöŸÝýùª¯iýOÍOnÝoåÁæ²þ‚öyþsöÜWè�`×ïØïrìýAÿPÿ¥êù÷ùßÝ¿sŸð_û?Ã{‡þ‡ý÷ÿOú?÷¿ ÓÿÇñöÿ�ìþ?ü¯ÿ¯pæÿà¿ôû8ÿÕýÕÿñòaý›þ—ï'ÿO‘/ÛŸÿ¿÷}À?ü{`ÿÿñÖŸÒ�ëÝÿa¾ü_ô¯ìÛ¿aÿµ~Í{Oø¯ÊÿgþÑþ_üç÷/ýßí¾¦>vþÃû¯�¯Aþ;ýWûR?�ýtû�öOñ¿ìÿ¼~ïüAþ3ûøùŸÙ½üÏöŸóÝn¿|‚þ=ü£ûçö¯ñ¿î¹újÿ�þkºgNÿQþ÷ý°/©_5ÿ=ýÿýýÏò>ܾ·þkû_ùoúÿß?ÿü�ù¯öòÖ¿ÐÿòþßÿÿðøßóÏóÜÿz?ÀÿÿÿÉö×ùÿ¿ÿ½ý¸øþaýŸþGù?ôŸ·ÿIÎáÿ1þ—ö«Ü7åÿç?ïŸÿKû'öü¿ûü?ð?ç¿ü•ÿÿÿÿË€Œ€ø|AxçՀǽÝ;W¡j¤ÞZA|§ Ž ÆkÅ»c§ H±îfs:ˆi�–鸦4ô/F} ‰`W•z]�Ò)mNæ:)â¿é~ëÚ¬À6]ø¥ú¿Ìo@�à”rZ 4 Whˆ¥ÑÓsˆx…WßÙÆªÈèpWgLöQ'3�tP{õÑ¡&23ÿ‰/ˆ”¦22ZÇʘLÈÉk*a&Å}€½/^Rò¯ó°P«PFñ竎𸠩{kâû¬ôBXéRcTô·]ã¨TìQà:ª­u|1àéÝKï­c|hÇ ±d}Ó®U¬ä’OX'C9ŒìzÔ�G2Õµ’¦g{€S×¢_þH‚?e ("4ü€KÄa¢LÌßáÃU\ÝxÂ7HßZfIõ â ²¬|û$™?¼ŽèL«I‘Ò�ª|žÿþª1—H-óqb³ÐK`Ì+ÖwÜ øähµb¦bÊŸ“ž’^öò6¿äf‹Ò!2H]ñôÖ̱½ÿncé•ñQ±S ™-cåL&dd½Ód˜^$d‘w“5óTq†®®œ¥0¥µÙV¿þàíHž,¹{åP&�HÔp Â7oC 3NÝëùe m!++ú�ïT÷Ï-WqCÓ4 éã²XÅ»Íò¦22ZÇÉ4Œ&0ý— À§:PjJ¯I¨Yv ¦õIæÕû:wo<RÛh Ïx!êL~rçah¡&½aŒÜ“-åÅ«³9«Å n>¥'ŸÐßœHTðܬ'rUK‡ãžÃÐ\ôCàzûEÆ$^™œ@~Ô¯è"D”EWÓ ™-cÓa—½Éÿôl8ÖùvCŽ)1}—3:B¤q—~Û¹Ÿy¾,^Š™ó‡Ðx:eågní»•ÕöDLžç�ý#Ÿý‚/©ü‹–Öc³îÊAâߨ4|Ôç=½¼‡‘Û©Ûa¼ëK÷éé™-÷ §ó{pí,U>ü]>í?JEМbqßa�ôÒÿÀç׈�×Õ=øb}Œt/ÞÇ¿—U¸þ]ñ½ ¤ \®ˆg£]ãä›þ¨ËM»*á æª_Àä€{P0ê:%Åþ‚öMn(–¡‘HÌibÐÛ'8=�½‘àÌK‰Ûµh#Ìš *‹¨s䃽^ʉ³-x/,_O’ÇYµù.‹ˆ¼ûÇË´„�)?ˆ8÷sÀ´¡e\•BüµÒ�¢(¨>µE@Ægšß ”‹¤“Ϫó³á.È‹³i™sjE�C0/d¦7ìG¡ )í!&¾ÏzÑ% C8ÊhûùüÏêD29ÿÁ{Qm<”€eŒlzkXKÇ)A6é—äB˜È�Èd,· aÛ]O'Çy¾TÂfFÚP°°Xâ;Š¡ØíÖ“DR‹â·ÛÒ‹:¯Äþ�_úR‹–]õÍîëiý:ÞÈü¡6.Çè·dˆM-€uÿ|ÆO‘AP_ëÜÓ ºƒÛg4÷3¶ד/önÈù4½üÊ¥>¤b�×þœàŽÈ¥<¶@¿>å9#Z€ô®E?Ârë�—™Ty x5×ù´³½µÿ)/¬ iëV À ÊQ eÃ>rÌ%,´C«ßG‡ú­µÄlªàŸ)áOÃ09Å0OÅò``dí=88=‘ƒ.Ô«X¨ÔµUl΋ñ’9Q÷'­ûñô65fð·Š:ô�Žóé±1'| ïü–rªßƒ*a40}Q¥5UÀBxÅ:6H¶›1aÒåƒ+ÌþäS¹íšÿÙ4–]÷é¶?†,l‹Ú:Yf‰Š›Z§IQbí²k¤ÔFáèXžÅiÅàrbVTWJ6i ·ë Û‚™�u7€´¾å°—D¨oE) ËV}¤ÁÙ¨Wáàúú®G[íØÔfWHÌ©Þ!BHÏ´� |‹ƒØÀ¹V|uú¥ Òe%Ëß½uÒ%ŽûÌ";C-’a2ccí(‹Ž?§5à•Šx‘‘Þò�€FR¤ž,ãÍLkRðŽ…‡Be,ôàx<ˆéF>Š ’‚ºÕî�ÆûUëáÄ·(¢�us5Ÿ¥Â¯ÆôšŒÖømqª2Â{¥ºÎéð=ˆò¥Y°–@�2m¼ý4Ü<§å¶n× }%xKÏ,ÚP›L™|„7âˆUÜB 4«—ÔrâSp*´‡øÊÈè${„FÁÖ(ì ÜÍ"¬&¼ÚYÎ>Ï¥õ ½Ó5蹌„·ŽÉM²o¥½¼{Q}.#)-¡v‘ðpŒltÝæ|Lº ÙåBf"’“Ü3pÿ¯S|¿LÖú;|PÐ ç+¶ƒ{™«‰ñ_Ddí+•Kçrõ纒³¹õä¡$+-Ùð�q&¤Õl´‚q| ”Ûl\p/ZHæ RøÞY&MÄ2Ã&¼˜÷"š\bd{ç%"´q‚øSýIÜÙe6}H©D>—…gЀݽ²Ü‚ø­S¬5Ò²€Ò.�&tûG¸–8‰ØüAš’(yµÎkíäüÓfþœ”¶xÿ“k?%[óMáÎëºøÇr¦S={C‘ÿiˆ•ô9KîÕýÐÀÞfc‡:‰4ßëþðÆ» a"“„GïdvOF …1?Æ ŸvÛ!‰Å09�ý–ÔsÀßÍŒA¤IÁ+io¹)”‰+Fs¥¹`µÃâU  2&Ù�¤ŒT çVâ\£ÆqrùqK(y®™¥"8^+ }âeÆëŠÿ ‡‚Z{B¼%¡o{jÆâ¯}¼“ ™*åö9ƒ7¶šø,ëþd…Ãk|Ó­ ZD12’Õ¾IºX-�l|«vê`CK-'°…è ¡ü`éóývƒ3!Ø6%äæǾßÓDÿmÄã7íÞÅ ‘ür6‡@,FŠu\E%`v qšT¾ÇOoÞÖå ›!êìÜ)–J®ó»ÛtérÝ4•  ))n�¾…ÌþŽ”u‡¹‘×Ód˜LÈÉk*Y æ�š¦eôlÍ� uˆœõt…¤U_2½�7±ªéŒýÙ{�Î�Ù -’9pJ?`ȧñ„—Q“¢"xÞœ¯#¸ Ö@ïM¤pÓñt˜�Ôv¢�uú!©‡ÎÜ‹a¸>ËÌõšYÿišâàþÒtëË–OÙ…^ºçãhë!¿ —âMûw›åL&ddµ~Ë2ètÉ'­ªY¡eçÛ<_Š8þÈs]Åk<2 ¡²àÉ~^¥"œ8Š•Ð÷9û`­z|¬û äxêÃCÈü;È^øhÁiÃÙ…T'c¨’¼„+Ó¢~qJ¡Ý£îÈ\w…bÅÈ.·…KðêF¿Á¾gÈÑ8yÍ·Ç£IŒw„³]¦ ƒŠ/aà™\$tþÒÈJu{Ë´C�·ÒÝ{‘U›ÃÒ4eÿ¬°>>< ¬¶ÐùRèsÄj=çÜ–×zUŹÿWèÑv*d˜ùS ™-cå:�üj{Íaì‚^²™°’ ¯²8ޤgÉ™/Þˆñ‘à·MmwµW afq—']&#ŠðH8Óf¶íç|,ÃQÇ«\�ÚtÃêzO?ÔÁ/*Ýž¶¼¿`÷¬:9X@�MøžªV’N†¨Aù \2òSª‹ž) %¥ý‘œwp|I}žïÃGòž;%Œ[¼ß*`ݰÄ×Õé«þ5çÄäQW…ù Zu¾,£àÜu“£ûaïcU£ÊÒ¬a‘ ó¹�fÿÙ‡ú½I¿W¿ÛËÖQ;@€hm_éyͪ9°ŸAüä`AÕ_¼ @�R³÷B™º¢]בÆÚ¨r ó Ùü»JŸ\wgš÷‰èd–ÓjÛàÞDÅCã¶&æ¼sô޲¹Z]ËÈÿ{³ ݲL&ddµ�•0ªœú0–loûèÝÔ‚HGŽ*4gÇ‚?#moïÞݘ‹Óxq(œñ÷ÿßp¾EÿÄ1RwXÂZ€õ(n/§DÛ¸8z|¯ÆÜåë&¦P=ÄJe·{¿‹ú:¯¾òQ™÷~ø›ú;ë÷ù“‚‡h ÅXü÷ïT“d$LM[ÿ¸vÁô3—wûH±½Å‡šGÛö¶ð5ŒÏàTÂfFPx®›—�蹟üK3ºT®Ñ”G~QþÌÑ\ÆÙ3›W™!#ì!;•Ö`–Ö¢d­_'ß«ÛÝa3sN°c² Å¡ö§ÒÐ=—Ÿ¬:\Áçl„ 5mÌG~1Wô-{xEKŧhZ÷rEÎÖ=¸ñ,A'¯Ù$}¼uír’2ZÀܨ”DfB‰&%±¼/;"ц ›Øh—‚v@.’Ð0Â?W(égnj+‘LÑg;±9½çH ßy?Ý:½'FO¶;—Ú²9ëßÀϱ»5|�h%áÑKΟ'ï—ºk/v¼ä9äøÜ^iÛ‰híã½­‚ßåÒ+Ò�ˆPˆ×H÷”ñ´­4Œõù“·Í£©.ö`A:`ƒk÷?äÐV>rÃü&�*™ö¸–€N_%¨«Þ\ <É"‘9Ëi,æLR©^°'yLP”í!t§‹/½ùm×Äžˆ¦hú\muµqŠþ®\‡Õå|UέÁÚ!u­—ã(m Nóq*áÕÐÏü”û´7l/Ù'¿‰Ï€“]]¡“Ç*Lj-!³ÖVõ¯NEƒˆù‘H½¿âðR¢Ù7+ô”út¡‡Çfä—î±_p¡2<9p7b1S&�=¬o±Kß.xŒrb¿#o]ßåÁ99Ù}æÈ [#«o5 ·!¹Yè´uKþƒ‡*PÇÙ«À­i†•Üš½NÕƒ ©Hü^ô�¿*yG…wdOög­ÕÀ�+ÒJ@¯qÅ<•ºæ¯ã4Ûúp´Fº81âôËcNKj"¿HšŽÐÛ6×ëæ9¬ífçÁŸ•§åKs§ !wrÚ70cÏ�ðÊÇ>© ~0’¬F{ï üÞ–¯è“a00˜¸É„å$”ÃîãPIÈ�I%õ÷:ÛÌçàKM#È|Òâè;Y#6î?ô;2G0äNÁõa)IØ*]=BÆÑÈ·èâf‰1ˆ(§� 7¹k/)V Õ)䋜갚°&¯Xç‡ÚôUñ&t<Æ6òåà[÷`Üân[¬£š8.'ï»ÒÒr¼þu¹ã%®õ×l€š¼©fðlßÙÔ½šfóù›´ôŒÞ—0“¶C‚dD=¯©lè�/{qícäš}ßè”,Ì@žø–ºY–ÇÜöd‚¨^ÑQ,›ÂÝÛD CÓKí9(5€k€JXfcë Çç"^ÛѼ)û¸öáœ-OfŸÿ}¤�Ч…jí¼í§ÜÍ `§^ÚGIŠ›ûÚ› ž@Ô™Ò4ªµF9m-ÎùÜ’Ô$”uþöãai‘ý$L íAk'Wý§�µ³r  ÒQbŽ/ÙZ‘Û� ë"ÍâpÃ9LCíhHCRØu,æ�àöm‚7íu'±?L"l8Ótà‹?]Äv–h~ŸÒ¤‚Æ`Å¥16D¤0Ööâç0úžå+ÍXÒ0Å'ùCâmÂØ«ö_‹ï㟎õæ²^ÀËJË…³/M7`‘Ò–w!NÐц)äc#i´·Âˆ‡îÒäŽb^í“”ü%tð²ÒÑVåW¾L7åV´Ülu÷± öquHïyä0“ÏæTDN*BTS»Îe2�—` ,t ó=¶ÜNÅ#ä«¥Köæâ¬²´é6âM'H©ZÜîâ»Êð0RLhl“ž5&ôýcº¿Œš/•‡ŽŽ›F®©>'a3'(¥ì®¡C1A¯,�lÉ\¡†a¥¦w�?±Û_PÆCÝÀîQv TQ�‚s€”uŸŽºôB6+k -b›;¨Ž—£[l&Õ¬ûÙ×]¾ChñŒO²—pW;¦pu¤2d(G´bÉRCÚï4<ªX.l›ý¦­Ëó~KÿN…4ù#È’ƒV|.¡p©ÞÍD9›ÎÒŠÒ#¹tÐW(æ1D7<Òjä’†‹SÍùÈ`¶þ`ÍCFÑÕ*î¢æƒú ò^ÊîÓ?€Šç¢ "%^y;_ì It[��i4Q2xˆ½£u÷Ê% £§œdF[ûIJ6 Jtº¢<c.¬NvÊzQ²T*…ë_$LÁ�ˆ5ûûë—9´H{áãSšß¸Âœ£ƒ�nÒºMÂÀÚÊ'’$þUÊs,ªh&9ôÁñªãÎxmÛRqÃJ=7˜ˆæuDÅêÖ³–ë-­ âÀÀHÃÓ–Ôe  BµñæžÂ”»«ÊûÊ^� –�GÎ:?büaT,³‚›ÊÞ…,ƒB{Æh–3¦>’þ‹»ÒÍpÀð´ò_ `À–éþ\ø›Þ4H fèÔ�á´ê;Yq �õNáì/Ábz\|‡ÇF/i®)9ƒ7Ù4’ÏFÆm0E'¥xÆøZO]Ü\=-ÞmÁ·p°žõ1s™D¿K‹H<¯‚´á Ê,˜°âA* "È–K‘"F–!—çÀˆ2é­i±< ÏaØçWá0é=—˜­ö®fýÞ.%W| ­£©]ŒßL±4Q.zŠã#ç<«o@ïR‚8 mŽ´\¬ÅoTXP¦JÈçÇ„gu_ó-Ö•Ö�mùÚu�êý1ç”8M¯G\¿À2ÙÆh¯Fžåô¼ÀôÝ4Fm˜Ì`?¯à†åÚ5툣¿JJ]Çù©æ¹#”çO°m²¼Ìˆî^y ,íÚ¾@¼ç²*ó°z+¨A™¥«þs€•¨,âÅ÷Ù}&&ÊŠ®"¥TÕ%Ý$|=Ú:‚ã¯�õ+œö�è:Ò¥»ÅyÖ��šlŽÎ °C“ûQ�‘£¬®ÆÄ¯FgZÃôí­Gs½ë•Â�%Ÿ»½µ¦®˜× Z›Øí�ÔY¦‹?¼yqi"þû—ÉÂQBg j~TBÌ-T³¥Ã%낃²Ð7PÅ^›½n»ÐW¶ kçœn{÷tÖVû³7M¯†\Ñ_¾;aL ñ=ÔÇ¿ÈÄñ<=î:7“†�¾ÚBÞÕM}7ÿ)¤5<«æ¹€½`�ÖcüþŒŠlesŠ.:¶‘>s�tx¾Oæ€}…É0”é<ãë'ƒ't)lÞ¼©Yž�¾¯œ¡ ¬7’ZR‡3ÝÝàN[Òj‚QÏlš@¸f5¯ûÕi7ø®Õj:’q� jƒÇUg‚÷™·�Zøhónô·ÇT"]õþ–ï°¶tyœµ/Ã1m; ¿¸¶±-²È"ñ²ý-Ä6‰å„-UQ$ Ù{Ü©0Ú>͒Ƶ%0¯‰œJ‚`&3•ËãIÖ>l6C"Ä…ž¤¥lý‰þ ÜþÍá‰-^Á-ÆØ?–"ã=ß:¡�šlÔ±ú[˜3øš-𣪎qf¼…Bk �©jŒÛíZ¡¹Ã糬ä?!~|pÓW—FÂ:^a”2HQNÂm¿õ7G°Ú0RAŒÐ/VF�$ë…Ög} HÍfü µ&¯=nùEO/¤2Â<®]?v�,q´iz‰]&^Ò\¡/€²Ñ”1ÈȳýË{ÖßÿŒtÑÉG�Å�èx]è?f:ôu‘ô£Ç?‘W›òRúúVÕ£öí35 .ClüxÝÙƒSC¼$�™BÁÐcB.¢°°“¾õü\UÞfÆÜK7�¡iâ»:Ø‹×>ðï› :¯PC÷P‘… ŞϹ�·¶å ¾pÎ[æð£ F¾ž„ Göƒ¨ÏÔU€’Tyt&ô1­P‡ yËhåÔq«÷K\TU•"Û]4 ZÕÚÐUwÈáv LÚ@ÞW—ûÌ•ÓtÇ7!‰ø€ ð�¾Ø×2¢J�]cI†¶.WnmXÖÂÓ«=Ëóô ŠdlJí;vykÚX—¨C¥1ý-fì$çhÉ=X‘Èse¬)!Š€ÒÁ±� ¯Ü—r@̰¼ÙQí¥f&wÁ(çl?C6äÃúáI@Ys¥åHμÐcƒ`q3Ⱥ[íM)"%e…È÷È–ÿÿÿ5ÞL?éÑUÙƒVº×ÝZ±û1m!-`C×à._ˆêñRvIÀ7n€T¬7ñæ’†•¿ƒ“«“¨8Mæµ")ìjè§*ݹ`îõ7çõ"%{(»Ó_QzÐþǃ€UhÄI8S蓱Èczüv8 ¸"ó˧s)g˜»š–øÖöC¾¸ŒìJvÄç û)­œÉ‘<úŸÅuP‚ KZ[¸Rٜ癴öŸÏ“!ø/OÇašS¶ÐF'jÏ3‘±!š6W¸öÀ’e"êÝe,E~ªÞ&#Ý™ÙÐzsðuë׳¥ÀeÃŽùw†B’œ–Š#Ëð44ò÷Wús.a±ßhݯãbû0ûM=xò�ô4àëRø×ý6)ÇÐ:‹nëTdÁñòÅG(èùf­¹ïÄò¤…Îüv[?ëA€¹£¼=X½ð7ÔmÉ1�ðš¤Uw d+LhìÖp0�yâp…3!æFøí%qnikÎaäÎ$z9ãòoÁ{Kü& -æuôÙQ7Ž[\E?rSt±Îi§î¼É“x¹›AOLÇ@³qÊ´#Àʳ�“ÙZ¿¶ Q¬Z”›y=g†6È·<> 1§TÁ—„îquæŽó+ƒ¤ui¤îØÛUP!yô“x†ó^á#@ðK.�ôq•û_¸{ü'º:v.¹Þ‹ŽO‘‘àŸ6«)¥ JËúBY… Ë_w?Ô)îõu,—°X6�RpÁð ‡bR¹’¢˜¾A¿5ÿ |†À²ÜÑ� ZøF ’ 3C~/¶ü!b"@«Û.sÛ¨K¼úA{ñÎû¾âC$²_�ßxÓD³*‡;<“÷“· i˜ô™((rH‹V {É)Êon¯µ¥¨1cNËÏybµÜû‹€sLòúöà­ª‹ãë-Ý›ïhQD'W¡sªÏ”�hÏÖ…îYÉBd“§ o©Ú;jÃçUݪ]ñ‹Áœ”û•ô’é$9ê ®g)øzßc~«Ð¨#‡.|JõÈi’ ÆSÌ™ÌVEöBùe]+ËèþQÇ�ÄUÉM‘“ìŠßFé4µ¶îí�o�ã OÛç€\´ô­ŠéL0n?3}Ö@“G´í?îèŠóxÔWæ(êˆ{>©\dÒºÃV4-OÑŽKzùXDšª ½Î¥·òÌ¿®ïɘG+ý”&âŒ!lÂÍ ��­J² îxc&|ïàa»!R #Ö%"Ì…yÝ’}ò¸ƒäwF'°ÂNã ðƒP—»h‰Ëi""…ÑæÊ³�ÒUFͶÄ—hý*Ov Aìç¡Î:üT.òÉ!OunÍâà†t�<û(¶y”­5£gMŒ…–�í®J³>²«òjOÝMŸŽD˜³ÊàkA°Ðøà’y hš0l”uâøê{õ%fuù®Æ³CÙ±2gV7Pd¾ãÌ;ßLe݈l»au[ƒ²‡j7^Ó¿/)w= <ããv¡ÀyAœi„õ†¿ŠÂNY£Ó�tæ ôS7ç/d”¡7uüT7ò| $ù¶¦l?u!³<ØÙÃ>�ø-­kT–Àç žJÛ(ruÂxæž$B†ÔÖˆº NÌ�{f°�ö å|èê4ŸQ}-‘+Ói¨ŽŒHÌ „@eÒÏ[ÿ™Ë¾Ü¡íÞʘñüpˆ…[°¤´Åß×ïg z�êS‚uœË Æ>·‹‚h°ê·’ÌŽ£ýÏ…Xk•^Çâ2p/½Dð ‘§�i @€³Ó)UþcÚŒJ?F'Ðlð¶³oÒS¸Ê?ÍL´ø;³B#²™¦ãÛ¼trâª;ûËtbü_ÉåÁ_Zæ‡c®Û9A‚¡}iíJwP9¢W N�q°:ÃÑSV?…ì[¦‡–žUO‹QîÙØSÝæ² t”æ‘ÑìöHUù¨âŽ#sȧëÇû%ávwʸ¶d^ÛÒZZFm`JTKén³G­Ù3h—‹j —ÛàeŒ¶ÀûW€ìêÒ¤C¾ÿ”u˜XS¿:wx*І·9�ä®.¼,Ö4wG÷Ñ…&=!bv `‡@h$É+ Ê�]þéÅSOMjC½óÿ`òʳœO ƒÌ2b¼%#•¨ÔÉÂÛõ€U2)uÒ¬rÿ ã;Ù Á½ÜÞ;¤òf`¾ò+*÷@�öƒV›ø°¾úãÇoKñãºiÑ�ïìü Ä_ ¼Ù ý–óÇÈ6ºõ ÈÓ®›´Ë»F„2J þ¼ç51ªD7™W}‹à—.ùJD¡ûÚ¨ã·yñÎ!¹8á£× tyDЍ�ÏíH3ƒž±­Ü}„�:é±I…­îòûwD©ÅÔùæÊ-ÓrTLyIøÌÙ Š/ÿî%$C¨[D�¥úŒ�ŠVÕ÷²ÁõÖÁOAYßL4Ë!P‹%“€ø5§»È(uÕü;ýM «ui®ºBe;œy×�–šÊ…ÞY$)x ƒ0ÄQ¥�õ­$ô¡ááÊÊ\�Bp—*Ñ&ÕÖA®¿Ç:ánæø}d&†þ(OEÔÈG�{{%êrÄ:@¶ˆ@røóÓOȺ–â\ÖWš5†•ÑÐ '8ÌA˜ó P~} S{­€v4Ú\K¸2ÌHÒØ-6ÓÝaÚQ0×Äy©�[Á•P²–ðh¦gƒQÚŒkœ»´'$×]ÄuOÛõÇ0òm�'؇Í*}Ó3±RäM@×wBß—4›Kù†²÷§©¨ôğλ¼£·)öÁ>EÍ=ä× ôp<¶�pAñ~dY^0"q*yt„'¤Áà£ÜZô»Üd˜RóÞ¡TIÌGð°XÎ{yéèæ±LЛfL§_¥2_ü±álËœÍÓÊÛ瀫Vói¸¼¶qÚô°¸0«×Q#Í"!®S @Pà@ÌÈP˜oÛ!ÃS ×ÖSùD–­uØö‡™Gç�CÝþ7_Á¯^…è+t5DïÖʃÌÃI»CZÃêAw úhÿ• š@B"�D?¨Ö™&�šôfF ¨]Þ˜Ò‘à8)SD§ß0a`^{°÷â ØÝÝÜÑÖ:ùÿÌ�oïxëP ÚÇ­Kó.ø€9ÞæKàáxåª�¼Fj�`[ÕuÌïYÛË™i\^eɆ (-G®‘XÛñÿo[ĆÄîVÑ÷º[xà뢾̬0�U0k=jÝÓ£¦·rþé43åCNèȸh~⨠Û6z¿xÄiž?a¨!ŸM¤“Ùö y][«õÛ†iåq*Qél½»š·-¡vh¡ˆµB5Äšöë|+ÖRÀ˜ Y@Zš™võô¢hæ¡þ¨.ÜU‹Ó`6¨æÓú„³% -–­´jq"5 ò½°¢qÖHæ rÁu³óÉ|)ÿÂI‰fþ—p"¾›èI©c*^Œ†Féª!»Z�d`VLµJç"ãÉ0VpB‡Ãan@S)wl~Åû–èE8ó¼ ½K«P™(ôsXÐÚö�‘wR8RFsƒ»ÆJWB؉ÙàŒøR�ŒÙ9. Ë�}Mgõ øEÿrÛL7þæ&mî�dKƒê:k}až·ñLk©ZœÍÛŸÛ‰òW¸³�äÉüºZp%Ÿœƒjn&ùX Ž€óVðòHšSz'T¬k$ºÏ´…™Ø^¡oËäD ß’•<]λ”f5²J:–&�cqå:y ¯�„=±TGÔÄÄÊGaq‹ÆšL3tëéÓF+ìƒ,’|SXq¹+üç�êä�†øC÷a)Åd§²‘käç÷9ïR•Œ»¤IønÓó¡Nq*BƒÚ«RÿyAå–ê 1ô± ß~˜þFôî,.¡dEFwCõ£Û`¨.QÏM‡Ù‘$i`è:E {ð†•éQùy�Ú àrCaxì%O¬ ãçÕß#Üyuɹ|íÚNi3IêôȘI—ûþ×”NçßX¡Ú)wù<ÏßC°lÕQ�2µÊ«¶r]Š´™vÖa§PØ6DÚþ€aÖ¸¨¼p뀣ËLRi¾– S;f 9¤„»¦ 3Ô4ecz #f·Ag­ºa…(çÛðˆÍ±¤›hóÛåò‹Ø¸‰–P¶1õk|ÇY¤þà x—¼ˆ®ì+ŽT�:�~mµ¾yÓÇK›/rËíüõ9@-ú°¥çµ§31Ú³ïRÅÊ„u=YƒŒÑÄ?˜Ñc’¸fž©åy@SטŒ½2ÈÌh�ãÇ º(ÌYo‰A–0}ªúäüQ’ºô€¬ÎPðo¢V­Wxd<çb–Œ €¤B5÷Œ›%,ðÂÈ@«¾ÓÀÆiLÈ�:cþ²ù!äªÒV�êûç‹�b @¿JjŒÜto¦ôÓá "‚{fAæû™z àCO¢R_ÙL”µ×äfïÅýö-ÓRã­ž^:²ÇCdœñõÔBÇê¼”¾jæÑŒðœH*G>|Ó×Ïu ûËÌ[:vIéçQseÓ'Eñ!¤ ˜dz j¬QM�ŽsJÑ«�Iô#,虂å_ºmr°8ãT”‹=¥ðyKÆ$û”&‡[ö‰QÛ&2QéÞÖ@Žd8ÙìFÅBNÂ�˜¼:7B¨(I¸CVî’¡öù\ £YöðX4¶ÿ¢beG÷ç%‹ã¡p¿Änže?<ÖŽTðs�Y˜�<’¤ïtk…5¯^¦¶q�:ÿÅö ‰ˆA„°]åÕîÏŸ…¹Ç [9ó¿Ÿ å[íàÍÍâ³']ð¯ZüPjÛ‚`¤qX"ÍbdŠSªç1­Ì[=p–ÑEÍuSà“g÷ã�lucIêÞÂ^ 9t÷C9Íà ÃEtoÄpܳÄF�#—�ùô{A5½©ýkP˧…F�—‡èKÃÿ;¤Ìö#à¶wýv!óÖ2ùœ8À–z�ÄçË«^Ê�Ü— *:LÃÇ UX 2_ŒÊéÏ÷.õ»äÆ $Õ0ü"á¤iÅð<€7ùÆ&\ôµk$ö¿0qß¿½à½ìÁV¨ßdî"¨ßgãİE­ÔÌ—�A½;ïÑÛXÓ—Þâb’ôp‡¹_ä—ª;�Ó’Qó%sÆ=„…­3º€IËtsô–±Û‘˜hÀ'•NTÑawFšˆ0)•Õ,ÅOX =®²!‡§)úc�fM«OQ?a± Ñá}ÉÊ«ªdÉ—~1€t“w{gŽB{TÁO�Èj‡�æèv<Üêm¸ãžWR éG®ù Š8Vqf¿´Ÿ£â½euzp„¾EŒ)ád§Ò`qƒœÔÀ‘¯/Pÿ³Ñš‹Ék/Ë@�¨¡\O)ƒÁ<³ÎϪžÚ–ø¥ˆÇLÁ'8«YxE–qb<øˆ?ó¦4xGF¶=摳äܨߦȦ5t¥h!%�D¯º³ËœP°TÁ5‚$vhD�fó °Ÿ~³ÇYâ­äðSï?ƒDŠüDH®–ÑŒ‚Ö™ù�äQÎ=—‚ 7Ì™hw5 ÏŒéSò7€D­ Ô*XŽÕaøi/�TÏœÑ!6,ˆä©›l…%GÞO%R”桵Ë1éñ ~@rèkÍÞ…ÈûðÀÎX$ºÌú#äwDrc‘t± úß~ÅÚõtžý½ÌJ Šìå“F…’èö�*¸ÿ�¡Urµ£ARkç žà‰ÃO†²‚Ô?ñ)‚"sßùØŽÞ0DUT ,ÌíÓY$†»p> ­\“NžqÄWÝ€¬�4ø]ii ·�Ñ)JЧ4—)"—&¹?•ôÈX#Ü“QØÖA7ÎÙ@Õ/(éßôñO8Ç Ñú‘Èú3)J×™$FÕØaeO à@ã>BÖ€;ؘ½p 3hëXxÇÇ(^b)JŽÔ™ð¯FN‰b fu"½ãª¬éº=ÈÛE£O7%F–ù³(}ùÔ‰ˆæDaòYÍÒBøCOGP±fû£l¾¢•á¼h6$Më¡Nk‚,$º·'†’ýé ¸�Î/+o$\ÿÁþü0H¥et#BèkOu?›¨}èãŠDN?€Á’8ÿgÍï›2‡ß¼ÔRø‡ÌP€Ô”}_EBÓ\ò¯!=ÏËÖ‚œ¶pjƤLÒz²´ô2,8EsH©ˆÙ.›#K«úÔ…�8)]ˆÅÆà3Ï,SâÕ›ÀcÚÍŽÞö=é¡^Îc-‰AÍW›QXç‘ÎLÅó�#ä õ^:õïu³d›zI(¥>H˜µÓ½Ü`9:_è“ù0íq"4öïq¨�Îi¶lâs£€—±Œ5ñ ¹(Œ„Ä£‚߯;ù4SVžþ^3±éZ6U[Ø øÌz÷­q÷¦ÄÜQp0ÜÂaö@Žš¹ô·”|\SD ¢·‚÷HMŒY ;ûʉFã"Û{ëü\O ,¯ÚÀµk¹¹DE^e�s—!5 •_�5:µ¸�D4}ã. ŠÁÐ6Kì�n�~릳>w �• #ï¯ÉÌõs°€ËhÓ›S²Ev¥憎�Þ£c hì!‰y#|ÖžØ(±Í#lÞ)±ö+�`®¡›¯A…óLK]9�«¦Ñ‡�ÓýÍFqe ÎÅJ]ígÚJµibÊ|ßv‹6w þÒÂÕ é�óa^æñ„17gÎA•}ð-^cŸ`±æ­™û±…ýÑ=@î œm®¸=Ò ­áG(ñ`ùxe!$MQ¶Æ?žŽ»‹ôs[Š<·rGœ60%52zç[ØíðÉãÀêúæ‡Eh²ôøÑ•–xà2&=~̽LPÎŒÍÅ÷ÓÓ³üñ>h´nuüfº8 ÷9ïnYs–C…ÄÑq¦:s„ˆ%ÆD•ÿ«äÏ&²2Œ½÷ãhs?ÐqÙg®ÝθË©ôÊM%<§*bÄo‡PQé±i¹ÿ¢l‘wx�j×>Nß(EŽê·Eö•ñžÿ³iT{htvðƒ|€é–e¶g4GЫ(CÀnDj´g¸çs„&µ:öx5$I(%ïáÍ¢MÜw­¹©è/~ᱤ¯»˜Ùiò÷’Õ¹VHØËeïÓ¶?¬+1K|•Wæk™P5ƒJÄp˜aЧLDÄ2꥿¨í[ Ä‹Ôsœƒ9;¶å™§´ãÏVXË|ÝQ4ãßñ€ˆt¯’#K–T7|Ë3zþ|O}pjÛÿdºø¸¸†+ú¡&§ß#©¸•Å�Jøùý†å=ù›‚Á¨YHýÉú‘këøž^Ø�ÍjÌ’�A§’y%K°3¼n%Ëd÷GF]`W]o‰‡éÿ…÷É}¾�K¨Û(ñEÇͦ= ›àXÍËcv®Ù’[H¡$FnozxCƒc}"X•’v¤C¯’‰‡‘ —cóÉdÃã0�.�þ1ïõ½<�…¾PH ?äG4•õ­T-Œ¼®QNÜÜüïæ|…2Ü3\.0WŽ(éìÞg•<©#BÉA-±àÿIÏù2Ú©Mn¬8guèè+0Û¡GÈÞa�J Œ¿ó±\žC84§XÙðü÷þ?tµ#t98ÅÞËV3hEÆ+ÙÈÁm9@g?:r‘¯ö‚’uåeÔ}~h%±¶¦70tûž|sANÒ:[–¼V¼´uû<žr2“#i*’œËN¤Î škJ.É2’Îá©?ð‡j _T¢ËABõ7ž«-OÎÅ¢öõFœ&zïJÜ»ïˆbÛ|� Ùâ´‹òûˆÿ æ/ì$x™~»àö{�•ukï#©;  µÏ¬ù@¾8•¤¼ŒÓÌšz‹úˆ � ˆÂ~ÝÚѾ-iV\Þ ÐH@Á=N‚[{²Ê`Á7°FD¢¤{ìMö#�ž»ÔÜòcÎ8tq�—ÕRK#ÂdüAO\o?²ÑXMÛ´ƒÁíUeªZ*ßY'r ÇÐDZÌ_)OèOÍâæ¯*â@_–´›]i9<ÕqE§Æù@5)cÄ’'H'5ï´«BCâ:ð‘‘¿ïöƒçaHº„ª‰oMŠgþÜ+)·Ç7ÊM7P‡Iv$¸§®ñÐ]äwŸ×£óŠ5n«á©­ò¼SÁ‰{3H8¥s#<&{Bÿ¡7±Éäµ@páèB7Œ£ÜãXŸÛÇ­ôk‘®FÒWÖÂeWáŸ^³Ö•Cíb iòØUß„W½ÓÈN*¨¯2¾ )‡µZ×Ù\®7|�¿›øŸ1¨†ŠåcˆÙâU„òÇUKŸy;/hÌÃÖ©ØzkÔK¾Ð“ ýšÉoïGÎ*)�3ä:Zn%WîO%׌ÛS“ÿ“,J®¥CÈ^Ö)åŸEVŸ8?&ؽ*È>b«Ñû^vkp¯¨ûÇ?€nî-‹y$´¶ŒsœØG>B»¹m{˜Rõ+iõªžç{!bõ zj˜=‹D„­"5°F6|MÛ˜ä+|9aæ²§Q`\=£i–ì²U‡ ð ôPþ»ç ð=W&Íe@kq”diT†y©Ï\ÍéK0Nú.1tÙ!pç%‡’Vh){ã‹zGÃTêÁñÔñ-­X~�€ñû��[åK‚E8-å–U[­b§=[‚îL­P¤Ûò#ÙY¤×軎l»ÔŦrÙàãA/ÌÖÓ¬ìÿ‹Ðž\/Ñæ ¶æá%Fx'#u>JGrwáÀ6½ÝiÇûxü›?•…"£ÅkkÐj“‡= Æh!âŸ1Z´ ¤Ú,¯ÇñË}A2+^ÆY¯3‰fÇV[íBTyÞ¾—#ˆyÚ㯴è¾îŽ�hFN´m‡ð±ú·âï‚9Ú‘¼^ƒð»…Âii©5&ËÿÄbJñ'JŸ‡‚þR�eòcõµö ”ú5ÑëÕ±~+7±©æ|Ó=YLœC‹6G¹)^$�VR-Ø$[Y‘Ѹ‹þ ä(È�\»\kÆäi�ýj¶<ê¡CKì¨Aú~ƒ�;ÿÈë†ÝyíÜ¥'J!É-‹-çO»s©if¥¢D�r“`£A~#›{zfkiþ¯í4¯p9š£9þùÈ[3+,&ãäÐHAwql€«‡ =»@ûläpe~»—œT~ÃäN8ÊfÞµiw Nm*˜º!F;ìeH�ĩ꜖Å�ùÛÄ‚(0$Âuì¸2>� B\23—#²Åv~:г¾1é€ÿïØP^•CÀÓ¹ïG3DŽ“>%ëNþ©Þnhí·žÓ«©Ì�HºDSŽûÓÅÜïsâ\Æu³ ÐÅjFö°öìÖ¯¯¸ïžF�kºÊW¶-3°Ö¤@CrÊʳ�PZÚ»@„×\íhIÑî4sâõ+íÒ•h??¹±�î50û9ø¨æQ9†/í�b¹ ×$¹•š "ßê«Ry{ãÂqŠØ_€³%†,öAÜàJKvÖe7Ï’5™ëÃu AeztÁíÿn‚,Ñ©W=<8>QÝþl˜ìžœ—1}Z» ÙìWÅß Qsª¡rlŒ€ Á”(×´×MoLlÏî÷Æf ëýUkcþYüß`¥£‡6In1g¤îàŒ¡±¨ç¿½óKRI8<˜7öN…)‹\›»ˆ‹ yTéi’Çã³àoéyM‘Ö‡gäÔ*V¦ŠÓ?RZö³QÞñâÝ(£V ÑlÒ²./Ò„«ˆÅ»¡ jz€�]¨b^¦fý\ ~0š”EÕB›ê›M”uêFšMƒ‡Ý?ìîjÕhXÆ5V«"Lkõx£‰‰�“ªNö32}©\h発'‹DËà¾�€�¡0� ôõãšj¨íõ¨ïâȽ Å4v®q%/`JÜU­ñˆRj•Ì­åÖLþ¶W ’›¹ž�ç³Òîã¨7räy¸7»;n7â·ñê ƒä  c£Õ^(§lyÏŠKÝ¿³Ì‚™ á_®àVø � ¤Yw“Ä)òõ+ p¹MR;˜ÖÖ”øm[´š�J0Ýh–5’Þ»ºþ#Psƒ°¤¹?ñ #úûcgÐoI3Ð$ êOëBÈ‹ýGÖ�&�¨²½¸¤\9­¢l„‡þ9è:H|`�ÆÍ&gã$A’Íž‹yìð 'eµ+Õý®¯Ðô�„²\M“ÓR›JUY—'jŽóÓ[Nü8ò,šÁT_©¹†b5ý¬[›ƒZU q†¸ N8n½›Ú]d—ÐDµw\“’Ëù‡KÓ¦í¬’[- c6ÞÉTD µ°e®ƒh�X=Õ7M¥4ˆƒŽEòt0GÆÞXKÔ3_•ŸcMœÁÛ×4«É¥ñ¨c $YR?Ô*®Ä<·ã ¾ÛCË8:ÿäÌ ‚–YzJ0æF ³MÛ³³È·ìLÉ0„©h…ówä—.rø²vÏÊ×j¼†Ã£Ëc¡n47Y�Ó~Ÿx†ßAa^òH�ëxÃrq<R3Õ„±‹oZV8w,¤Q–p±Ãün¢§¶âÖ­øðWê³û�l%?ù ©C}]úTÛ—$`ĉœI ¤}µ+µ– ÿÛiP»õ»ê y„­]g,–nпÀcÌ¿±R{Õ‚m†{Ïë§̳Ɯ‚P/rìï>ÿIdü¬�«5ânÌ)1m®-@³³×Oüö £úæïd™’£»Ï‘ÑçT ¢š¨ÜÚC >‰{K->zÉǬŠÖZ—�ò왕+%„¯—•±§–þ55i¢âdy¹#€£ÓϤë)×{åÃϰ�‰ŽaŒå)ĈÃLðØJä Ñ Ü8�÷á ТÐÅýðy¹ÜV¨ßÅ¢nã¾²÷Ẇh"a0°‘–šà‹ÈlŒ”¬×6WïR]VýªA!¢Õ Fñ;mC?ñ0ö‰)؆LSÛl«pQ àP¹›f¨•«ìeàÉMöºh%³™�­,Qj’W{ðñQætª+ñ½YûP]5 ¿$éñøp×ÃÂ’«õ­À»ÁË&[Àè¸/)îˆ|Of º8òg�÷ZòŠœ6,¯R¾‡oÓäWþEe KE)øW´2®à·ÇžÞøÅŒ€�!pWSªTNVµvó®×´ $ïÁ&«¡~k*méþõáI°M ˆ„€÷(6óæ&ú¼Žlê¥o„m¿†Ï¢§³ÊàÄš^5±i)—îy´´x!ø�)B¼%dÙ1>±?£É“pzî¢ð=Ú_J©­ ª¬Z*Ä ÞaRdC&es ´Ã2ˆãl~né–F£O3j»@ì%㯼^”§‘O¿Þà;ž" Íå;æp +ßnäún@øpx„Yì8ž†ð=ê61ÖaÔÓ0P¸½]Ê÷ç™x©‡[8òzÐÇÆb>ÖÂÈ�å?ê™$²ÐIb1Û ØzÊ"63+NØ|L߀ýÁËá±p.¯]‹ÅôÙ_­e–·×ÒY\´%c4EÒ˜kŸ¥_J$Ÿ]¦ïõ¢³Löv´t¼ iS=ÁÄA?ûÔ­ëJ—†ÃÛVb'/ h3?%§Èö,ú­Ü`²*òìˆaéäÕ^µ#ƒš†yíj�ô80á`Åäf?­Õ¹Tªw¯Õ� ¡{bñ‚Å|ñkFq(í÷…Àð+Êqºì _Äþe‚<Õh—ÄõÝéðô È¿WɹŽÜ±È‹8xù`—èGò­G»·ÞCâÆ‚¤÷påe!‡è� .ã)÷·eÈDì‘¥Ëð��Iꢹ© j•ïå°«P5¤%Òd�â9ûáK,bêÔ…L²zLÊA@[ŽVøQß·NÄôM{Gœ²Ò÷lãÕ#“òcÿ¦žßÍßþQb¨ŠqJC2À¼ºÜ))9Ú©uí'ƒ\:�¹Æ(ý¯¾gq6�‘‚$o�§ ý¡£9·t­‘†bô�nó £ÃeLÊns$η,²xÞ¯ûÕ³áÑÌTIëm¹šh©y¶…ÊÛÛ´½Ço¹Ë«ëÕíexÂû;½JZ;­û–àü¿çø…¾$M,íâ^Ã6‰@nñ¡Ç3¦ûRO—Ë…ˆšãI›sÍlÔ(O¡[S AͶ�{uB®"uV[Ü9n*4ά\ÞõÍ«zâë°¹¡ê1p±ƒr0ô/Ùý·Ò&A+]†\ï ö.€ÉæµQçíiEÑiÐK`û¯�uÙцV¾^-êþÎdþL}4Æ/÷æHIÔðç±€§Áä 3 àÉàu.Ui)›P‘>Z9y¥}íKS‘Êé¦XÝ 4Þ£÷÷®eòQµ�0üªdšs‘îzÄ÷Q€º–Áûó#òh@ö¾›Ü®ÓqÛÌEUZ8f‘”ûá‘t‰ËåT.o·Úqdù©þ58¢ZškÅЂõŠ…“‘#hÿ ˆ¯n£ô¥…þÔÍÓádÍûv@Ê"ÝÒ‰¹$A\Ò-¤þéB][pÏ×[Yñ¶Ê.ï¨I#•éWŸÞ˜òìø{;Í.i%*0h�D[ìÝg(0“2‰„¤Ç«%dÉ8’~PGþh'ýÿ&éÜ£¡SX�ì™ÅŸ`•g• ¼~)Ø&‹Ð<ݱ&Å5k€´…ä¯m÷Õ"nLú—l]wß–"KîR¶w¡Ä gò{:­O!ßwåïâ¡#àH>hûRåÃZ*kO]x„¼âL ¤'ª²3&!|êñ‘[¶j#F:KØûOª’Zi8ð€á0X›¶�¥-¥öÚéVî/Wææ^3ŒO\uÎì‹ó…•Uhs�Ýg€: ¼òz_9°…¦ û›x¼/®øæ‚E1©£¤>•¯×¸ª÷�®;œKhyK€šD>Èä?Ï›)F»u2PÚ)½‚CN_�+´ôU•W0�í2í–¦¼X"84xõ”¶c˜Nô„¨üÙæIˆ,é ŒRe®ó¡]‹Ðð£†Ó±:F�y÷†’jnåúœ‚Ú`ÏH fö �Ù²”°šë5b™ N'Þ`3¶ ý¢kIxº¡«rûK~âÞ¡ƒ«»í˜Ê?íݦ¥ø½�RtM»™ó…¼ïIwQ^xÄ™ØGB¨‘™uá{9syž»n7½§UËguÙíÆO{�†f %Éî r–¾:¶h¸+|&T½ŒÄ–ç×¥·£ j3ôQ4"‰K;ïtyû'Äèá2ôñ¶ ˜Zg3ñg²Í7mÝ6–Ù”‹µ¯Z]� CÊ?qñ#ØÏûÌYº˜ É»Þŧܑñr¼]³G¿ÈjìàÖrm=²«¥ûþ QkhWMOT_3C2bT÷L �t6Í{¥-)Ös·s¼F„°+M¯éÃtîÁ7­8R\UÖ(\Ÿƒ'²ív›Ê%už î`}ÒXI*Oëº –¡þ—óa!A§‹î.ÑkVfÊUçìšßK¸{%ÇËÚEž0F){º�¦ýéƒï&ÖS£Ðå:ììqd¸ï0 Ù3öNmÓ÷‹[h<¹G­°»kQÌÃ_Wm­eõË(¼Tg³ší4j³l�…cqibKZ¡þâ-ÿ¦Žã¶ÍP((cMÖ�ÖÜ· ôS*v3ÿY]hËMhÕ>·.YÙ/®õi²²çìrº¦)NrF,E±\.æˆ-ÊQ7Ñ¿B£‹)udf&}Jfµcö×$eŸ0bÒ'gF@–ÂdM�n gäûè¯GhÓ^‹BQÓÈD6ª]—*Ž€`ž8ÊvX¥€ è³fsOü)!æ8÷š|bñÕ¾À·aþ [ü3Í ëüZÒxá[3´jÿ§«‘_Ó[ ^†n+Óñv»£’‚K·ÍWâUWü·žÞ$W„ŸEÿôU’ïaÏ‚cúÊñmæ: Â*SÑ‚©sæêÙ G{goIrÖbÌaºœ"±âÖ±„Õ, áõ¹íAιÅ?¤R }Áã+Ùõõ°Hk è54š’L&(B(ì; Mv�Ly‚Ň�Ÿ`ŒY÷� ¼÷¦QXþͧ B’X"$Þ©™3÷×ÄH™›¼ 2_�ägcg�¿W‰Z]²I‰Ö²�ǽ¢Ï©Û_–‘Ôã-•ElÝÔ£h"Àc[ÝPO_:Z÷·vÌŽ;Æ¢*- 0�s:EV:€?Y%ç·Vô¨8 >ªÎc…˜ÿ<8\ù—Bò!Ùû¡V<Œµ° 7»Š¹Ð®Zx²¬n¥Ô¼ˆ@¸óQúHu¬1®#J=¤Ü9[•ÇŸuéh™ëÛV�?b¾C tãô~øBÕœ^°rJÄ*ÙÎ"¿ ¡ó ¨\å£Ê›füìXé¥à{åž¼’¬ó߇oæ*æQ‚bp´ØÀð­›�°~=镤G æc0¼ï¼Ä6Cz'MVžx.¼ÿ°ÄA¡¦qo§ÖÃ=Ú ‡è‹Àee¬. ìî6ÇIrÖÙûÆyÿ«AÝæ+¾!R™tÍm¸§X«ï�í4v• æºÕAK÷¤DØÑD,È‚«žïñ˜Ô-'}.6C?R6¨û¾ÖΫ0…p ¶w¢…6ë ¢+AW^²õ©‡#ƒP  £áøhU†[˜HŠ.\5¿µ>� }I9ÌŸ®³|Å0Qà +ææ�Àï!™bææ~‡¾œ“òoES�¬@¶L^Lë&§åg"!  ›<¹Òë*…ú|°‘Î÷Ã=oÇapH;Xô·µ©$õX¼!߇ƒ³jíñ �f2�<^:]S{Î7ûð*œ]—bÁÁažÿ!TX[h�KMÕ!Êa'�¸ (Ï3°7ÞÕ‹#8ßHf+îJû9yÈQåm¿ !ÓIÖÝæ�™�?Ätrõ/xˆû|¤OlK °vÇøÚÚÐjÞn2U©õ ÉÊĘ�”«Å$Ÿ1¤“z»Üñ`~‹¼0&áÌëÝ1“ôæì­,~Ü e—}bC™òÉŠ02½Y2ÂøAÔàÍüïÜ´õ?ƒÍIt'{¥p!íø­üè¢I„ô¼Þˆ NòZeµœê”Y¡�ÕSè ?‘u_ÜFÖÌ_xÉ)ã�³�€OÈïžüL4~×¹§zÜáÞÄ…òKøǯ ì¯-‡ ¼ÿä_ˆS=ükT�±K¹ gÒ®íÛÑ,µ¿¯D¦º4Ò|;�ÄÒ´¾BA#¯S qT› $øÉXz,¾Þ&ðfÍ Ñšvº?¦%K‘´iþˆ�XèÁæWpÖ¼R·ZìëÒæ.ÐîG:Iî H‹  Ê$g¦xdyŒ Ùóâ[`¹q>á Ù{‚óà!]Ÿëš™<Ëæâ…Ta­ÊŽTŠ )-º÷ÜxÙB�bÌÒ‰…•Å…–Úž�”d±ƒ›ŠøvÓ~\m(|p•�‡…ÊÞªáÉ’DrL,Ç¢ªM§–Š›¼k˜ Ï �\Ìsñ4Ö+`7ï@¾—G»´?$pîÔ£ÒM^bË»?�ÕKü˜ Ãÿða -£“<·³4Ä5ûÌš£ÌbT=ÎD('ÛÈW–žl;A%òJ˜VqkÓä\3r/\êuÍÚĽåÑæ¡ÓÄPê1bäü½A¿ÃecQªEbJo$ 3âÏ:j-Ž´]²•P˜%·-á¸(¥¨XÁæõ—лcâú°|\‡f;ż6ù0îi3¹î¨lêŸ�§n{¸~¨é´±ídY†4&á„ú’U°éåvÓ#еÉz_v¡˜]Ñ"ÿe|ަÐûýè…xéÏ‚Š±Ž�™j›¥§î2CZ* LpÈ¿âÖ’B1 ¸6-…'+®Å0Oâ59öÚî‡C5ú¿.Êþ ”†“AjTìúŸQpoÇ9Üwˆ¶a¿w[}.šœ(@.)4[´}' e~ “x[v¸†¬ªC?šÊ›È´x�)‰ÁŒÛðÚ=Y±ÕòfÒ¢3Û�€¾tL"y EÃêÌ…³g}Ëkí ¬¹�d�ÁŸ ãÈ7@™ÀgÑÛ45�VõŸu7Èñk纒!ÄJø½�î1¹w²«˜¥£¾*ñœw§ö{ÖhCg¼ÜåD :»{o•³ {k{³íP€ÿš1ÄœwÄ%›3÷¯© æ Œ"~¼£Ò¯oopç Ó„g½E/ Æè hV®�…´…ÇSbƒÇDˆ ¼�˜f_“i¬"DiSr¸)šº`üX—Ž �ÎÒó9µ_FT°=°²·]Ðÿ½èQ,̯¦àN´´‹k 9‚4¨DV¡sÄ–B®X@´\“âÂùÈ­¯\Ó¦‹ejYóKÍ`:¯ ¦Ä©Â�åö>Á7;1`T¡%LÑÌ›3‹ j®8ËOú™ÙüœêSÅ©X ÅÖ“'†ÂÝêÔ1¿ÐK]i®_ÊÖÜ¢EçY™j”놌qùi òý¶'ϵ¸=ŒQ-OP*¤h�up�apO÷™7ôiâRôýxÜ ¬&üƒxWo'[½g¾&PJü¥ïßêÒ´6a6.\I�ëñ¿T<1ÓÌ&'Üy%¬ùq­íwÅ£&¦×"n§yÊÙ)Íõ¨0'ßËÑ=v3ï&‚Û<[`ïàÕ›ÌÓ`þTí!ÎÀ­Ç«‡•}@½‹eåi”wVÍJÑHÁº|™ÌÀ~–|ËÌËhÕ+œ6I×d±p°b.àgœ$\ 8µÔ��¿ìLI(�ÕËyŸÙ~ð8óZª8*Þ/ÉT�VlPIjÍïû£I¨AÕ FèŒWÔí;LP6Ò5ß¡˜œD èBbjgÙ„…©W1¢ „$]dz°¯;äâøHæòjCÇ4‰SUÊQ6¡Ë§ú¥wÏ`�'6ÚóäKÍ*‰3ü®æ<úÎc �gg[�ûÀv.@Q×ô±e¶ïzZUE�ñ ^ͱÆáŠV~ÑBj~j%ÏbbYá²4!CS�Û“_Doxàr»Ü*�qÓŸøùNÏy†¿}ÌÌÒ£žñQ»ª¦Ê"M30|Za˜W¤Õ,püô ¶A!�Lw%€LÈ6ˆ¨ÜY-/>lZšbÁ©¬]8ti+ž€£7í¤i@rj³šBÀ}Ù,f|[ØÑÄ&»9¼ð4�½§è½Ø˜bëbÝÈl ‹ýÌýÊ{:µ¿/µ{¿d[¸†. ö§-nƒÂÒ'ÒÎ |M]èáZûàiR¾ë%µí]øA¢6N•\$¨l~Í�ñËAδT®à!¾$ÿ8ê“Ý‘8�xWs^küP{5ÃÑ)8nš®2¡M3ø©2µõ–¡B>u­Ñ¥óȰôµµ “AÖó΢AŠ?µÍ |䜹.[p'vrX”½\2Ê`ã™=3/G³•ð®ù"é'ºÊæ³hkåH(ZTãñ•µ�‰S¹ùИ[‹‚Hì^RC7Þœ4ç“çWܺ¶UEø¹©q(fêmŠ…0Áe¼¡æ¿ªµˆˆ%|Y-»mb·ìJ«s«&'ïÊ‘ª"‘îþðŠ•5"¾Ÿþ�vÒ? -ÇMˆ�~tçkSͼ¡IkÆ F�ì ‡”Æ·å,ü², o7›9Ã:B>hÕWŽioûJ5` g{¢ðrAšDŽzdÛê¦Zéþ×(—Óbv.+šZsÛ½'®æ£öó, œù¨¹øùi0]K)ç8MÀìjad@á=Ã'W Ÿß\£Ü«UЩ†c˜ä’(V¤…X¼XTO»§1C,Æ{U0c†Vfïtî °™ˆÖÖÀÆ*€mó ÂªßæL/H—~º?©��èG⸡]õ I\Ãa;T°ÇÏÈKÛò²z^¾]êéëaóôÂÆVë5*º…+y�S tj‹7ǰ٪À”ÙÓO¡ÿ?kÏ=³WwV·XAZ; îu”J!ÓP�•»2ÏÐl‘ºb±žZ´ê_)»¸î Õ\aÁ ~Ôcê;†âåúê1ãÜ¡ç›IgªK1ëÓà?âéÑ�/…ˆ‚׊7x>_ŽqöÅ[½ÛÌÛ¨CˆœRÿý*jfa7ƒ<+í‰wZòBC¥3�d¦‰:îÆ³†"î ¬©—R|ÚS¯ÇHÉÐPÀŒðÖ´’¡Ûõ�Ø]RéôÿŒ±ê ó÷;o׉DŽ«³ˆÄ5ùb>žÜ�3ªîö[Rà$u.|_ŸmUö#8C¥'n½—+’7K¡gøŸ»èýÌœi_÷òöFÕõÒë½Ñ á¦8ºB ˆðº1£š�cP 3¯Õ�‹¢Ìl‰†=¹|‡4oÈÔÛe?bÙØSz·P€Ž0­¬¯C—E§G“ªÕ"’;nð˜ç U©¥Í»ú؆`XE£pó24Z=ÚqÅ#ÊÄÀ‹×šØ¹Û°KEZÅ០›ÑÛ¦žÁYî:«P(Káqjë]‹ãû&ö G¼(‡‹Ò*íJò©U@»R½­³ŸÉôåµ*&–¦±Ú~~ú´v Ôê œ€íD ,1ýd6Ç àRëy èG¸oÈj0h¥R‹ÒÖ¨K¸ Ä̵ˆ2åRÀxú~Çs±i3Û±î>íU%\3À4‡jlîbÿÊf_Sy‘ÐXºmëae6늫lf96ÄÊ…cˆNàè±ÚWê2[@ÓÉ|0M£ÖARñÏÉMïM‡êÉi¢`T»6ÉWÏhÙÞ%Ðäå8”}fö–’å=|N6èGÏÚÄ‘_ÌT&‰#E«´<¿ë(& ¢Kl¡z »VQxý¹_ÜG”´ •Šl<Ùj‡>³£æÇ‰º€âÔu­Pæãá ô.(~`²ó»*j³Î ‰Ŭí-þ~còwÍŪbιÆbB‡är“pÊ#å¿ÅÖ9kU¸Ð^e“[-ªn|³´æ_-ƒôÊìòÈøÓEI«ØëX�µ”qtRÉ&¶ÑÖðÿE8Îtñîîní.®Îö(ðò3‘cbf×$$¼^—zÔ‡Yû²Œ£sVOÛÞ÷Ù:‹ÈaEõîB{^`‘ÊKxJâ}g$ó,›\$ÁKƶC Æá°M~: #zhû£žÙÞ‹zb:$iýiü†t$§oÙ9äˆVPIjTÏÔÜÑ�b“·˜O·©þs¤.æ!9Á¥ÎO;F¾÷Þú³’ŒjýXÎŽ*D+Š'¢œ(òóãUmîZYólñ¶U¥Î>«ó0üeÏá´ÞG],ˆ+‚�rÁÔûUÏmÎ(�¾§¹‹dsG¢âEÃgh»Ü:ΚÉ#/jk 8ha¶(na­nŸ«=°qZh‹Hãs5¿Tò©â&sq9–Aµq‰?–Ø XœŽ‚<ò)Õ°êšÉû à°¦–#&e¨¤èzè:¡A½�jLª‘}•¶ïõ/´Õž jJÿ². Ǩ•«ÈEÚ½óý0¿¬ü­Æ÷c}�èÒÅÌ¢ùQ(A„¥Í§UsMÚ€laÊW{r/1Ž. ®Ò{Á¢Ð=bZ”ÕšV1�èØ÷¡mÞ¼9._I =ÕƒJ'©„FùªË‰Pbà}~ù½0ÈI!�I˜úŸ 59j͆Ùfš¡/QðJ€ò×ÔÛ3¢øÝ�ã±ß½Eî|ÒFÀÕ_SÕ(ÕI�N¨BŸ� øÚ¢>¦žé:Ø"rõ¯ {ÀZwéŽÊÑä†÷åÛÀŽVx­ôt&§?ÃO±\Oó¸G)Tþ ¥Îj±hCXv=bKÎ.~9¾#‹ 6ó9?¤ þŸ³½YÕ—9žçt³Éc`yðÛÙù¾# £é�o¿Âý­ä$‡M7…@ýIAÎï "I'ÈO„+\v\#倡ŠS;YsRš–yW•®›Dùàu|�$È}¼�¬‘£Dkß<â\pîû=Jl ¡P+nË·j›ÅðÚz†j#€MââÃØ.„IEuÉ‘9;B¢·¾Žô\þ ¼ù†8c%bìN¤mCzˆÈÓ{}…Q;AV Äçö,(8™(åN«- Q³—/ÏàXÊç2Ç®©Éx^ «ÚR1Tjåq!ÈT±äþ Ivi,´9‡qžj#�YøÍjc—YØ¢sÍÈ(´x]ž°2e‘ðóTëuXæv¨ÀÉȪíøð'èp=õ$(�ƒ,7uéÝñvÁ•JôÎ~€ ésø¥ÝÖÄ|%´GÈ!ø†8‰7¿Á¯�ƒæãW0¿›{‹@棒âkìŠnœ°÷¼' §R×ú²¬y„l×àÉØÜVÙ6;¥¦‡¼Ã~P$Š©—d+°w­y#(J¿½QA©rú�ÿîŸ3f B¥W©ÒöYRȩ𓉂|þ¥fo`†�Ráà˜êÕ=_¼«À!| =WH Q,WBº5KM°üGÂÂp€Ï-¿ñÁÔõNc2“¼o‹Æ!õŸ^èÖ}ë¾mïMí’#\+Rc¯4§úµ7®hË"Üý�„¸Ð1¡ž]ÔGyR,ªA–²küëC>ɨ‹ãJ†€¨+¨‚ýì ‚W™V�~¥S ÙaÕõ˜Ö:od'Q ZG ™ëA"µ“Ý'ó^ãHûòA¶`ݤÖU2©ØMéÇ—ùÐ_Ü­’ËÄ&ÄS�;ñCí¥f•¢“fžQé£ÐØcºÙUøµ#¨È b:ÍÜèºc�oa¤<áǾî PÅ  F8‹®óÓ¯N|^ 0ù?xk�©¢ ø³!©Z’ZM{C¯æä9¹ÕÅÖ„³œå¾¤ÅAbp G‹TË3I8±˜%·Ú‹F¡Åm…ŽŠ`Á RÊX°zûÒ$eWlâ° ©­²¸†TÑ€¶){2¤?VøÅQ(e9+_ª(àÁR]Ÿžüz-²e§Á™¤|mJÈ–t”@Ä€¢åqfNóÐò.ÜškÜŽÕm}ÆÿVd7/zAîI+cçK9¶’jñ{M=l|åV§",o[àtÀ˜å9ИñïUÕÐÑS£çØ\©Û"]¯å<ÔíÈE%ÜQ�W–òr ?c¹qÏ�™™yÏmñ@â¥À4Áû¢CRpø#�ÃìãÎÏVŠøæ5#Ç€õÝâA-‰^˜¸]û=ÓL8ðÿµ ïÆÐÏÚø|wúT£®ù~áQ�É3ï°7n¤îî_GT/ Œ¸gØã©m+å\D0ÌT«Zv(,t| ÐË: Q÷ýk_´ÀZæI<œ%'Ñóý•dŽÌ }¯ÐÖ*\ñdr¢ð³T’¨�óU•kÊL ëÿç‰e—n%ô&¨ß¶!IpÌÜ[~#ž¥Øª´¯°iåÓ¶ci q7'¨ô Ž…0ñ®î {&Ä瀋n¡Tô?­óÛc è¬è¯�W ï¾Âøáˆ únm”É[^bÛéKË"~Ƥ¦¤ÀCÓP—´æ®t*s ùñ´ª‘r—ôÛçÓˆ•Œí‰½”­Å_tzì›OtjýìžGX$5<µ�2ß4•_¨a,¼B ;@‚~±²TôV•‰Ã>¹xÓ‚NP”Ns/Zê•ÞÀhJ[Ê*ên¹_ÙÄN·òz}$s@Wì@‚œ@¯0O¼TãÜáB|á0ÉÏÓÙŸuú†µ‹ŒÚj‚#¿ŸŒRM+£ »ŠkžÅ#Œ€%½c€ãAÚ¤á†b4ÙkƒR@�G#¨†÷j¶-èªbâP8=ÿç†%Ï ap%sBÍafµ³¡~`_Ũë"¼>‹oXÿ�@jƦJr%�v‰ 9ºžo‚ ™`ôÔ¿`²szÑš÷0Qc¿@€V´~™1Y½ÐåRÞÃÒ�¦ñÿéHÿ ¢¿qo°ÅÖ²0Ä×kDðÖiqÿûAƒÊûé"ò«$Ð踧˾ÞX,|©Ò“­î‡HHÀ{µZÜÇRžíPº´®ÛÙþ–²²ïòÐr™ŠW²ôÞtÁ³£äˆ*¯ßv±r‚^]‡Œ¡{|œÄý{å»hw¯¹ÐÀň_œ¯—b.ÁÌ+X†³Ç÷lüó:Íךé9­¾wˆqÑûÜ)Ú-ƒ¶š¬_¤%MZö|rè²Ø%ŸJ ð —�š‰G¤Žæ®�EÈÚz°ô¨$pg¶{œá}žrY.³`!ìë�n8È×ù[6‘¡²ÛÍÝÙ²† ^VÀÖ—/Õ5î$.xbQ£íµ8ß¾º¹„” “âÿÄ´U¤äº6Áì[�ÅyhFDÅü5W—Ê¡R ù#—E4ãGºGHµˆ¼�׺|\ô>ï÷tñ`äúØÃÀ¿LTÐæÖ3dÔœ‹š�äO›ÂŽ1"ŠÄ|:®–ù Èßí³6oÉmóöÅu$ÎbF1_=i#�tä«àÂ�¥GÿøKí)QæËyZêô¶ìŽt„¹”ÛUM9€ïé‹@ãÀ&øÈðZ[ò’E�ŒP@ªù!Œ­-˜­çx�å&2ùÇëðœûVî]Ÿ5±dwM¹®ÅAIfwî÷W`ðw 'W'f8xT™N’ØÌ†ì«òãàŒÈ J䓸)W?¨ ¿Ý‹¯á›CÚwŸäPË­c6ÄÑâ)/*ùE{öˆº`ƒîU)³{ž@Ö*\¾Åç¸MUsÿ6± ã\–˜§zùãšgÒõÿ³±¤OH‹ë5’þ„"ƒ�³ Ná Ôu:}Úñ–Å*Á„Æ~°Û›Pü¹Ük ¯.˜ÜšxFr›85`fxï}Í9%iDÕ�âxλÇ�Yݤ•à-½%«Æùª—ÓFý_”Å-!ØZtÐ UgâY4þkV’X¿jŽíâ­ó4ˆL@Ãæš#)„;CY5ž•àXõ¼Ùû±;È࢈hŽ~pêXÊDÆðl+dâ™AÆ¢R7þÞû�>þV½Qc„1úXW›¹ )|fú»^|žKÑ‚^ LþEKÀí¦ëÔ™r%-·[µ¬3€ ’ÆY�¤qÅø“IÆr�ZNbÇC��‹Øê${j©]7Ó ‡ 3¦ÒgËïË ñ~Ä:/Û¾zðõŽ2äN‚*7½Üò–eýYx�Üè¦ÿî�ó¥~À}á‘òà Um“µ–#Œûk‚ áà3;:‚FŸu&¯3|ìé4M¼ÑpH«CÀµ¾“\Ä<]ùȆôŠÌš/¡"-n�¶»ª®b òuÍ+ÝöÖ>uÆF<`¢ÅóÄ/9v_ù´#*.�€¦«úN¬{¡³ eM­ˆÔpå­2ëve:×øO—k�YÿsºÅ¨“ÚGSgzç!Ρ»Qñù#oYS°=ÕGšS¸ŽD¦ÕÖÅnJ#úOÊõÂ�‚YšL<rË9“«-ŠÚ:i5XþêÂü§ø#ñÐ…®î1€®ûËVm@Ö¢>#ü@ÂAû"I/c5ª—à'ˆ[µÓЩã4 s“Øø:¼ Ö‰Òì¹ÓnIŒ;Hœ· 3Ä@ ÿ핹a6Äj¾k¸>GºåAÏc–ÐZ¿R(m[*{öŒg7%º ¥�ÛÄw´Î2Y*`Ö¦ð±Å“È�1r-5Öà¥?Ï�ñê±Ã)¾)ÍsÇÖÆØ:ÙàP¦ 3vy s>âýIpIÇr•²ÌÿíÊ“/.üÔ}„Öì8¿³ÔõX” ³c˜E˽Ãl(ƒN¬˜>êWÑ>(²+&7yG©~w9ï1r[Ž Y]žø®‰ö*´�­;€2Vg—�q÷…Ùá^þ¥Ø¸£ÚѦì V²„CY2eLƒ¬Øœ-ŒÐ€ÚO0bìúQë-Þïƒêƒ.;Øx奱¼X·Ê,8Cåä„c> nª3¬c£Ï—Äy=¶¼WD…!ÊØ^|œXÒTÛ~~—Íçq7×)V—ù÷“–‰³|!¶…ö3ã1g|ƒÙ$1¦/tÏ=_ÀÏCcXß4�I H…§Ðön)dnö‹à= 80’�:Ü“ú.yOŸ°Š¨©‹æôÜp,…ž0jÞܬ¯ÜÝ—Á};Š&z$_³XzKl®þVÅÁ2‹Cy:08ñvD”c#§–.ÿG®Í³ŒŒ§®2ÙvÌÈN¹ØP¼ÙÚù�>E|:bS+z¡¡9nø¾›2¡ù`:¼ÈÈòhúSKMùÀ­tZrs¥ñ¸–|�ž€�=ûmWñëm%yukãµNê‹ÿ÷›ð€ Ý0®R`¼ŽîÂÂz5+;¦ý¹“ïÁôM!*,�Pa’h!aGôÂ"À³í•À®äÓž‘MMv‰ïF T há|È…t˜æÂÐAÞ U + &n·ÏõˆFRàùutW÷¬àùË%¼H\ˆ¬[ÖÌó~\ÈET ¥®“pC?»d_êå9a™/Oyî'c¢Z"E°‘凸5²¡ŒÄV9†ö%Ø©àÐFöP90Ц•Ö¾²Sµ–1¸píêÆ)â1Y80¶&Ž.©6^*IZ:@s"ƹ[D¢&׎Ùrš› 21ÝfU;¤ý#®‹c(=«]ä%ft´J,'ãÉÑ ÍÁϱa¨B1Ó§ÄÐþ“½Üs!ð^Ï¿ª1|¼Ü‚¯„pØ^•©R+ñy ‡ÅXŒÄß—_»Ð_î¾A3@/zá3˜0¡ºGtIEIÂxŬÅÔ°9 =E}Ä®.F–Wç >skzÃþôêN"óm—Mâ!WÚÖ€£xêéˆÜuÁÎÆGØë§‹¢k�ÎÎýËæ6�8ø¹;\AòIßÛ'9†|ù9 â- “¥mS‡hº9&íÓ›� TBFÊr$½z5EÚ«±jM�óé…%¤³‘tF½~®dË9òª  R±ˆ¿˜ wW^Ü·¶ ý%\èLmÕåªDíÊÓV>ýÛîÑ)I| WÞwÍeëYf ßœpßÅ3ÖŒÖ��Æ7�O„âM1¶ª‘YÝì�¿M| )‰Ê̽±›þ„Z!ÀŸlTAö­“]«ö^–Tk•?2êŽWâ¸[ðoýõëawi-“9�—4åŠn,˜%ÕF{ÅÜáÁukÿ†ä�ò¼aŠþöüGOyZaFä™%�Rkùt̵؇ö‘ßô© 2ý{cT@zTW¦æ½Ømá°ölºÐ ã#ìô„ŠÌ¸€åÎÓ%ù[ñü_S4Ná$C™Ò¸—*�Ó%WR¢dF‚°Ádsû#p÷ÙQ›8  ‹9b¶¼ýWÁµURR¯TšV_ÐÜaŽ4sÝ™™©Œt–„²,šgGK&^»rÞC2õø Ö“©è"ISÛF1†Æ†Mù˜…††˜cµäVr ÆžScˆ7dEÓ2›Ï€lðæ>¢9:íVºMòßVÓaì̈:?Vh'k~pú˜QöÍ�X%ÓOn'ù�'bt ¼z¿kªáù,]!]œG+Šº“I}½,IA<"ñ03"@é£D™yÛÊ–Nmt/óXå]ÖÛrb¿ ä£áyJ ÐúòÊ1�]ã,Z2;Ï,@ô¬ªs·©ôãŽ@—ç87¬ùdø‡“Ú>< ÜŒd!†áü†ž2¦¯™YМ‰ÐÚåâ�ÑbRæ_µ“„¹ß0…k†'j]Æ€À-z üS” JÈ£µøo¾7wâ6¡²5¹ÉìIÀ GW‹ 3ÀƒäÁ]cä gùæ-“|è>¦ÒìË‚¯üˆôÝ�G9—6L�1jÉ]DgYlf7yÖ#ZÁO\4Iò(ú#)³MÁÐBá6×ÔN�ŒÀ…œãR§òæryÅqû!@T|+¯+ŒL‹´�‡èd6�wÁMˆ~F�‚DGczc“—ù¯aPF¾R_€Uć€|I°_ª}øÕ&·æ¶_HüYÚ“†»îž:qíÆçã(u,³õϦ䖮f”{Ó=YÁ§�Ö‹¯hÅ¥/MÈZœ6/+ÕÜÑÆ"4ûâiÂCÿ"¬vÙrf²ï„:ï‡bÈ9ü´G\=þZlé¶"uÜB+ÊçÙlËÕ�Ÿm g�;g¸DN�Ô\�„\�ž(äëM»B –Â+¾7#ÄÊvy¿öÌHªÒ “ÊI”?ƒÅ}!‘2ñ´ÀzÄys'}@¼S“DA¯iâ»PCR-ñ„Âsm§råu›¬Tý僒]WM°1‹¶s= ä0ˆÆœ�Ñöhíۯ؄Cns}-Í&:º�P²/ì�꟯—^ïfч úm€¬ËÉWV›Ø,½M»äGÏ£‡å|AÑŽ|~>R Ù”ŠlÔœf…¦ïË++êm]‚p?.6DÓ«ÝV{] €]Q/µ]é8-;G‡MecJD��½NŸú0aÅ UÒL æƒ�a=´S½| ä¶ 1Bdßr_j¼Ó_¬«ÆŒ�$!Bi&Ì¥äÄ)q͵ Ç‚Ó~ÐÐëH;‰Å�·dØœv¤š÷„ ¹Ÿ~S=Óõf$@<êGP"Í�~ ¸£|VÜ=yŠB {®ŽùìiÚ·‘-`[´/²,x€ª â" —§vºø2æÞ�µexÎÓ£ó¨{šÃ¥YiE1ÊÉÅÈ[žBï–øÇÓÄjHt–-/€ÿó;G‡NY^­• Üiñ¨`º4 ¯9:Fe‚øw¨¦è=i§Ý$àq›œè‘08¬©ñž¿;ô–§>³ kŽÚ,q¶.ë€jÃÊãò™[ ¤ºXn�nz¿Õ/è°.L)퓳¯Ï_;ÏbÔ)Yœ‚sÖÖ¦kç@F ^öum¨³h÷“…’Wª0i§‘ {�.¢� î‚)‰r¾¾uL]éå|û,ë|¡Í¢ü$]ÖAzš�{€ç›f]92ß@Gm9ÇW$ÔÖÎLÝ2¾ ›´FÃj°2ÊÊ.ÑT:¼šÍò`õ8 ÓíÄg)vÁê×™…'YTàFPf×B|úFÚí°ÿœû“lÌQ-n‚¼N”啺¹ºF"•2à,ÎV²DUˆ#LÝÑd¡úR‚F#ŽVi6PÍ[öFUYFKgo¥½�»Ù%›ž/Œù¿Úæä9]Tv!¡Ct?Ùž°Íw•ôôp°õPCé†ê¨�(«~è˜Ýt]m³O?ñû¶Ú˜°75N E(âýƒñ÷B�×]oP¬}ùò}“XH~Wý"¶· ìåK³Y�`Eù¾Å>yB—3˰§ïk.]¼}TÉ=Âô | —g—œïVC¤E6dû¯*l1zêɲ¤ÞÄ}Ñ:$O'zÞl!ZˆRI¾�[=2ì‰dZt·GiÇJÀ¾xe9i?C]}šé€¼õᯀçk�:Ð~ïô¹-ÍÜŠHúð‰Ž‹"Å\M•Q–ßXê/N¸dÈôÔUàb:¡ù5-x]›L,ýÕc GíHê¡ËŠnº2UÍ„ ­Î5…¡‰³›häDzéAäXýýÄçHï[¿§>��`Œ¬mä )y?m o ëp-àŠò&M…·Ÿ'Y‚V� ,¬"D’Åæó‰Ià8÷ß+´lfäÿ<,>]ýX¢šgñL7u•¨ûëC &kÒC+VôÈÏbÕ@{¿qÁΊí«b<ûPkvB b[/®RŒ�Å©`}Y’ÈüHó-© ÊA;�$ð0—GWD|Xÿ‚5–qSCã'�Š“¥I4Ï&ŠSX„m§®{P¹MµÝ ÉÊíú•!M§ñú9µžsq=: ô¹‚,T0DÌÓ$²3!áqùÚãDª¼6Ý�4 K°(ZElÑ~F ÄZŸl»Ôbùø|q•ä¶r‚mrá=°´ðíT ç³ K4²NµH‹µŠ‘Ÿ è%i7”Ñ÷³m\«Z5L"Ô¥å¢M’c¡Òx4ê�IICÁ�gž‹¿¶âüªcÈIÐ#·Å·=¨³xDx‚ú£àÇ$²ÅÀ¼Gïn_ý:�Ñ~ðK(>6*ÛjÍ”è_-Éks™àÛšÙ—‹MüÚäNK”ÓÐÁ5F &•W}EEIÐËþ_i_ì S=’oP=³šH: VéA|5úé<&§Z‡‹BÇo§d2L]€+9¡ð˜áÉ¥c™ “ší²e“î³L9ä‡Ùµ§.Ùcƒ/‹qâ—Øi¯ñìaj ²õD0`8®Õ¸Cd§Í ÂÉMÔ�x÷ÞudàJÓ­âA¼AtŽó<° Ý#Ζ*9u± ÿ®NªL—7–­ ÆCh F÷×Ð"\ wø³Z»ù3O1õj_gÏ?ü *¼l¾ph‡iá×¥ˆË¤ã/Ï+åš)Ÿœé¾DÐêÚ+®_þ;ö­¡ûÁòܘÓåÛ­Éì)3™è˜ŒÁ©ûXžM´Ý¸%â_ñª`°ñf�ˈþÀ5±«4{=ÇŸöP'¶¹Ù­}³Å:b}ú)͉ý<å†bïê"£Úh@¸ëeá<À¬¾¾å‡;^˜œ(´À¦o—EáwÚù~ÂêO+L yÆ ¨"ÿ#µ8(cêã–žÛÛÀˆëá Èž{3í 5Â΢ÿB̘]éŒsa÷bYnXUäKøÁ?5Èÿ¬oÆÝ©ì,þÏVãé¨dÞ3 …“ÓgŽþ{íÈ)óŠÌ<8L$ÛI¨–³Yןjzh@¦¿sÚ¯x�†yîÚ·k2H'�àCˆLT&0µl�ðà'ìÃè?ûä=CokIJÕ‡¶ö_Ôú×+×Fð#ÔGWJZ�XTª€Ñ»4ò4ƒä2¬ôAŠšð‰ãpŒ-¥š„–6 ”D±€h¨D‹Žb É}rkØÚ/¿QÌ ™èΣWîaÁÅsÒ¿EÂfMÓݲéjq�!›8tàmLb(àYÌ»Ž~ö±…|c/I¿XÅ‘ôˆøê{X<Š ¤�—­WnÄ»“ÕέBñEp°P»–�ã$Ær|¼éÍú±.D�^ûtü]z8ôùƒ¹ðAÓf^÷Èʯœ_ú÷;îO�Y™ø_ñùmÎÄq-§šªÝ©¡XË ÊE‡Ø]fÌQL™HZĉԫ¾¡lkµ™<·Ÿzd¡@TOÛêÃrhæË~Ú‹š´‘¤ò ÇîêD#.¢<˜/»©`³ˆBAØÚúZ¨ñцÎÓ^ÍÛ¿9ÙÜhí–ï°•hS€ªRxxz6„l;¶l¥Aâ&ù¯ia@âÕ +÷:ÎL3‘\€Í¼(~"+;}°Ð˜ I!Åæ�éËBf¶ª>í_²é|ÀB¯¹mßùµÀíÎÙÌ"MÏC½Îƒ�s4A|®–ŸùãUº0{ûôtÉngø�yo?vªóÒ€/?ÁMjÉÎ= x¡�p3ÄNø¨z ?6BщO'½,%·CW˜Þº¡S!.zsàH ÉËá�P°Ÿ¬óÖs\m ªÆPÙÉC/Z ˜æ�E{+g¦,#Y™˜Ÿ*oø7 ‘ÝKÀE8%-Êþþ!φÁ$[ ð� ÒËkk±7»0 ™™‰uäY¶j0F}WÄ€ÑÄ:³š}>0“öˆñôF 6 q©�ƒ0Ð-JŒÆ$ kóÔŽöð+­´d.ã~OÎ*ÜŒR7¡à|¿“âìBçŽ-n冩®œÚkàRį�T„â*%…瘗§±6¿œ÷­Ô ùœ%IQÒ‚× KÕýò6•~êR2>} Û+ˆ–A’¯0.P ׋ç�¯µ÷ïÕߢ2Rqÿ=�N“+ê­PJs9oAqnkÀ%˜Üý;G}³ÿ³aÎQ½¢žß©>1ˆ¼”©øšÿ¥“´è¦<«D›ºAûTzq~OÐ5�ÿÚ½0îSÌï_©¥!é]“eÕ \8ÿY=]vßîéh¥b…Õs&¾�]�5ªÜ3p9ŸÖæÌ¹êp2ɼ¹ì³ ��ôØÔœ¼¿u“ {m›[fûÔ]¼^ç~Û zIH*I AZÿÌ}X¥³ò ËÝ5=?d‘\/<�20£gyzÈ�‹WŒŒ"ÈMIå\eüd哜¼”rÂ&1˜ Ä�d­Ž›D¨âX唿põ}ÝÌÌQ,Û{@݆¤6m½F$ùæ‡îU]�„ÎfI)7}PiP/ÜzšÌº)Q S*e3|šïg—ç ’X>`ÂS™Î[µ7BÙlöL Y[hÈŒ\QHEJ('¤o1ñÉ[„¾Ñkõ?šeQ2›Ú¤¦�事Ãd‡S(Î7µÿ»ï²¢)ŠÛ¬Éã¼”¡‡àòVÁ æ5ªÏ‰¦ í#t�Ä4»Ñÿ|VÕ-Œ¯}teŒ ¶ž^ÜG iÃ+]G+MIŒŽý´¯v’RŒžÖ¢opP_à+«¼C 1U-cŠ¥ y¹<-«åËßIµîÄÃ9Æ÷ÖÔo—Ø^Ð/üò_<Å]3½®Mdîf3é~lWoXõ¶¼°ž�½íï| Ez¨¯Ž&òåÉF~²мÖMÜ|CCcN—rªÑ�¤?ð'õ”�¯MÒŦ7Æ‹rƒb­tÉWß:vg’¨å2¥È$´0Y˜qn^¾7åheŒ-1�øD½“hÄÄËâdUÐÇÅà�¨¦Kã©0ÙÀã £Ø>hì§„Uަoy˜\OåQöªÛ@H}ŒùÖñ¿@MS^yCQ�úÒp)5­¹õèU=FU£¼ ™ÍÅ�úvJƒŒÎ•³A¬«›î›.*§|G-36‰Ë\N™3“Ý_}†ˆï÷ÔH_šk�raê×ÌÝ_Ó#@M¾ª´‘Gž]LtÈ(w’ís6Jù›`þ€¹è2Ii¿!ªÔ 6õQIÒ{©k˜s”F—,Ph1OÐzù­­¿1ðžñ2íÀ…[,¸øm 1xäÿ~*‰`¸hæ½åßÃÞCýN²A}�µ’†ªöEÈÅßë ¼Ð¬ÿ tf¿&2òxø5Âïií@YktÆ:¥m^þú.3âc=-?û8ß"¤¸øÎÿÄT£ÊÄ–Ús|AI€×DÉ[T‹û�âœ3i#Ž8 qA¡*Nh„w–¼ûm€²^iõ…°Ø°, Cm|ØãA*ŠÜ×}k(ž'¤1iˆ&ýðTàw3`Ráw|¡3ïÆl]MÉ܆ƒK¼8åú�óðcð© ­£ôï !}¢íM~x=·TT*Q‹%J�‚^†* ÅRæl0qÂÂZ�à¿J`�Ë5øÜ`K�° ˆÀä+�‹×øòãåÁTˆ8TÁu$ͦÔndâíIpìK–Eìg]LÇYU€©ò-E¯ÿ)ýx†ws3"ÛY"íó„-õï{«óÝ@�Œ M8Œæ«$±Îþ[m1aSH#‹`à,�o¶^˜™Á±-4”ý÷¼˜2³ð�hä*%n�åãPWÕc�憾çûh1s÷ö§™:j´ézx›9îË’"o¼˜v”ÒfK7­ƒÕ¤�] FII7àGísÓÏeýB̧¦ÙéÙraü£Ú¸òcb�T³Œ‹¸J›5{y„Ë·Ìzm–®KíM³*ß/-;îQHyèÝ¡ƒLè*BËÃß‚[!D"U㈘ۛ}EZ‹Vhxu ÎM©x6Á_©@ëÚÝ¡ºûAµû"“ú^o}݉ftÕ·Œpõ…{ú]vòep¯<ÖSJEW¸H­ êÒ `#Üß5WÜ@¡ãFƒ×YIbŽ:5“]qA1hE•ÂÀ¦wÈØ*Ü®[Ķm×Þ­SCÈ–©«£A'Búõ“Ø]Ž×²¤¾ ©­= #+yH ,ë n9•�Ó�ö8ébî×2ªêo¼vÝ26'ÈÐL‹5 L ô¨¿p<1, ª–j2--)@“¦üäà/›ÙB *T¼©¨Ò`GJU³Ê7 ¡ zmÍ@jÎmÖÕ+]ûˆ™Û¸%ZŽË*rW=ŠxD…*``Ú>" ᓦéÑP¬£Á>þ$×rëÓä9}ŠaZ˜MáÚPøN{‰>0àžÌ['HÍË$ÐËé/X»•7|ô�ôÔàGMøù ûÜo8ƒÚèmý†ZßiR¶}Äñ+ÈM08.è_îs§bPßß;äHUÌŸ;õ t»"PwrÁŽ>Ô%Fòºú£-ïÖŠ°ÚF×qDZÝ�Á“—SZÕk‚ìÂç§)Jé)jk1yŒùž Æ(€S@NC‡_vü P¥°¬œ‚}µÝ0þJºÉïWPæ˜ÇíÚTô5W*Ìk�ÏýáDYä ín}×å0 ï£Ë×7ÉUaŽ{´ÖùMî¢Ð+aGc"<ù€T°Ì°um0½¨y´ÿV²“óÝžX'®sBëÑœï ÙN®?ú,óaxóDR,¦*z1smš§ºWGzvTûdîùú¾å�›ÕÈ.äª+åQ‰N¥‹RüHv„•ÎjÆÔ1Á{Ýó@ع,Y ’—:4û“MBFYkþ½¸øÞÚtg³Íófˆ®.P�œ”Žu§ÑEþ)»(§°]‡‚”©6} î.9%kµªœfÇòêƒqB£÷T,ð„ÙÎ,I_þg!Ž k˜áÄŸdTàK1ºì†Å[ön›btêÒ›ªÈ�„ú6À`èÄ]Cà"§l¸ÎÀ.eˆB{èòõÍñÙT¼HR%”ÖàF4‹õ ([�öRØ�lºh6L±Z|Äñ?È ïä)ñ¥$S°ˆBæ‚eT½À“Ÿ§yr¸r%ú×?›¾;ÙÚËÒEååÍÜF.û¸‹4,ûL`ùÿŽ%wK¼—Œkþš«a@fOõo¹ú5éø ÅòœZêCëeŒ¾t�’n0å•Z´$ð‰hø ,s©i®ƒjÖûA¼õœ` À™ÿÿ˜—Eï«®¼Do¸ÎÀ@�ÖËÓÚ ¼ðèÞw¢éÆsb?‚Èc¨>üq¢ý*p7ÅvÅ��¶3€Žw‚fFÅSþç3ðõˆ&ï>�µI”’]á1š³EVÜ~mªq0œ(Í( ­T0EâA$‘Ø\–榕äa gMú¸ž2“kjãqB¤l@e_Ç’^Öí©uºR†¯g ugëlùü…>4¥gÃKë+Á·Â,ÈëÂ-¢’*+5³ð‰°ÊÀÕfšì÷kàlÔÞÞ++AÒø×83¸T—µÎÔy, ÞÚ¤o¦«Žäm U;;kQ/¢ƒ-­áµÞ�lu/&€šG*åÛÄïH ì!Ð#(ZCžK¹XïPáQ,eî$›ßüÜߠܵ˜ðÍr”½�¬W1ƒ¶¶§µ<"¥¹�põÀÄܲà¦Ö½ýx¯ÖGƒq!+æøMŽÑ²lUÆú²W °·cVØ ÌqÞ9 tBuœ· ú<Á»Û†yTÕNæøÆ!r;êBtevòüWh…ߟÜÆþûƒÄ¡ñ(¾äð89‡l¥é<0=ç=ºœN¯È‡<ÃVBAX:ÒùWè«„ñyíÝ�Èe‚vãÉKS‰Uá¹CðL·Š›%Ô@aP¤øqV®aA �äYŒqœo!*¼ »HÝù»µŸçÌ™VÇ\+ýçk¹×ÓÏM\\Q`pi±AYo…û£æX©;—HÖH1 »|:•—Üñõ,VY¾x¹Kü«_q8¶¤à’É5PºÃ‡÷0�Ïöe €‡¶›× #]èqY…—t{�&#ZJ ªV0ª’ÉûÎL^�aƒ•/Hͫ bÀp\iÉ}Z¯#ì«*fƪá){¡TA ‚j^Ê q4‚�Ðܞ诗o[(s�K§ óÚ]:v¯Ó%à˜:…ÄØ��luñ»Nô8n�Ü#u›ó3²¤ÞH‚±êO‡ä1%{m¡Ûÿ‹èxˆ72š«÷Z,ßß1g )‰9Æê²FÇA�‹ñôy i} Ï=žÞqq8ˆ­Å@Íä k’؈ÃS DÇ‹£.=¦÷#W>+‘'// ʬ'ãT?À`UCQ4`‹Ó?›ŠŽ:¤lÚMí–`óÁXR´àY1ë¤3¾ÙµÏ³í†z�{‰D9QxŒvÙ&#ÍDõ9•ÓTúÓk÷ÃpDç�ÚÊáÌk[ióµ—L.`£˜3![À=ê�KíÜPTSÌ4FTy:S¥a½=QË5œ#¨."´a8pzíAš_Ò:ÿûŸjËeù\ûN2kÙÿ&kV“¥b¶þyL‰BZ«°mµ”ÿ]Á¥PÅŸtádBü Û/äò´´fê‘bAÈMß«võyðèÁpׄ÷ì–ÏöB>åDš¿¸m}ÈëUgYó®%–˜³8¶h»âЦ._+l £¡�æÞgxо`]œõšED¦ÿ©3ôˆ¤µÛ,l…w8ÙÍÈrÎe øRé�aW³ºÂâ¤òÄÆU‘*e'Ø'—°‚c†’¼˜ÿà¡3õ'RéãXÈ´Õ"h U¯øÕµowhôf¬¿Kj­Ô‡Ì!=ðÆ<ü9QKégl4zªŽ¨,Œ lE@¼ÉÙ.•˜ÂáwzÉsq™oyÙÆ- dh‡²á¦8þ|˜;^ŽfÑ%:ù­(¿ lOè>rqFQÛ’áÇáÏ)[fy’‹6ûˆm!3àA'qÊÆÈ55{2ühiÅçšð=–˜ÍUœTè2jÈ¡W�Eïùcª ì‘/ÓÈå ïv‚–Ôu¹ÐöDÙoï�Œ:[-J© Ø"a»ß(Ù;·ùÆ&žNü Ü÷ÓÊÏÞJ!Z¹áÒaÚY�áœØÁa)ø­{ÑNRÃ\æ]\M²+>Îk嬄�‰nt$âÐøÀrèJÁ..×€†N1rR¡J[³ �  v÷ñÅŠ%môŸ¢°– �š.îqÈ â†×a-‚�æöoAó©ôšœ-I:m)suºX( Ñ¡Á(ŠÓõ•¥öø'û­^VMŽþ–"B7®)uþé8=Ý©7’¶AT°~ià6xˆfÝ]ÛèÌ&_¨Ê«™â\ÇeäCꪦ¢J½“q²ô1‡�(©o³†Ûˆ7RŸx<a°Ç¶éz‘PdÏ´ V$¢ªã6 ‘Ô±è“ ”GX‡˜çöÜMC�Ya+ÇmhâŽC¦:/æ*ú=‰Ó·_\|žˆ#åV48'ØR.‘àD½‘ue7Oäkƒ­áÄK�FÂj$Ô2A'U¥[©ô×#€Øó*»EªÂP'ÒßÊÍæO®Kn3f3²b…êŠÎ�X㮯xÌmõ"èIZsÁ©úcæü‰SØ›÷ :ž��Ŧ} %åJgýU4n1+2 ‰°²Vó[Ñ׸$ž˜1æM[‘êï®äy�Gû»íl}Œàâ)`yåwÖ½|zoïß:YnŸiÑÒÈ€Ð/óô`µíØx‘­"Fìl]ý�J�<{®à1g�Ü”I„„Ê#¬CÌsËlè^ ðVú߉5žb³µdž3/úºqõËà‘ÕpïýØâjW¸êÆÉHÃW2ÒŸIoê~l|�¨¾÷(9"r0ik¸¨øëéïçwíÆ:�”ÖÏøû;(D(;ñ¸d¢mQ¬¬øêçÛçùr²C ÅÍÓJ <rAÀòLΫԇ¥å÷h«Iú×»£>$¤èaT·#”(ÊËç@ø;ÌÑ}ÿËâmÌA¡³êËöOB�Jþ›¶»#RR¡úa(÷AL^FèpÆ��&�gSnÕDv­‘�!Ï>#bÌ*ÔÜ©uÈÌeñ˾?¤ |ÛõäÂ!·sä a~ °BV•$‚÷›¼ÄGñE55Tןע �Dož­ÇJ ®]|®qP—{-pØËjp‚]Íž÷fÚÿu¥åë3àKÏ�Aëlª…@d(r˜Ò§×Þµ­¸�O^¦g@ã@|#�ùStÆáj¸öüá[Ž_Õ£U¬oÞWŸÄ«› áöúŸ÷P�LÊ– ½ö¡ÒGB”×m ÅIún�leXRgFÄ7ñ:qŽA¼¦‡&„�ÈÓ¾!Ê!6g.w|Ĩ¶oy°�O”À�Añ«@º#ÇrCXžÞ1p¡#ùùÑùp.ÿàuš¢vl×Úè"„M‡pmáM‘—ý£ýg"bŸ¦bL¥m˜A)E]‘BTÖ¨òÜ« 5jŽ 'µ¦RVDÿôŒGc‰yÕËgòjO4d28ˆvgw­°‚¦[µÔL“ë—ØîRÄ÷¦g;Ù´eùÍSbÓCïÌ6-=l¨éÿÙ»gGv=)F9£"ïU®”‡!Ë”)|WÝÓ®ÏP2äpí§ s^òÜjö’£Ff<<ƒWùÈ´È’x.ܘ2¤M�yq-C{Àµò)MÇ*,Ñ„za–æùÔÓn‰öá's¤älÎ',Xåˆý³z®e£(pàáï.…�ý—«.5·KýIfàóD•‹=òs s\-îù‘ú �€°¾ˆ/Õ3•Q�—øt‹Žß‡SW…(~¢ëcvyTØí¨ =”:ËŒ@…Y,Q¨ 8Ì;!ÇÃ~&Fí3®&PŽµÝ£ñpN÷S[r)n›�2_ÂW=C(#Âó$q<­»Ø X¡²u²2�H¯e\ ùë$;ë�©W»f ã¼°å“!ÌpàµM¥dƒÝàvà8‰ &?XGqÁQì–ðöxI=Cå^ö^BŽÍK�)Ÿ×3M¹éw x\gL}¾mú{fcÅEý)4l¢zë‘\…üŒ�-!À–�Ï@L•K½Ž�[U(„¶ÆSmà"¸þCC‡$ k�îßÝ=Ô(|ˈ¤ìÖ�y_Î@�g=¦<€dZJ¼£:jN›Ó|™KÿÝÂÎþ•# Ǧé‰ÜøŸ·MBžoR‘s\é™vÕ/žêCE£Ëä›»pWRìß7·[p^4)ô¿Xör‹›áê NÔ~Oçpr�×¥1¯{<š‹›&û$�5ßÝGÜQNàÛ#«LÉ—×�×ë¦à‘èÌ| Éd\ÔæxºÂ2Ofé°³cmÙHAÙþ†ðø¥—xN:yÏö@¯%u*Vë©ñûr¾ÔèS/€»á #Dò0[éQO—6Dà×Zt>¯¼í;¶(X×ã®×yX…øñ×�-ÎPÉ`ÂÓõåŠãÔ+Òï7®³´•âÛN—Ë�ôuÀ¦i˜›•M�‡¬tè´`Zîãu~(…?Só57«¹�—¤¬Ý÷?§Ø?»÷¦š@9-=:"ñwe¹ÜΙ¨�Gµ¯T¨Nø«ÂÀºœ"y®u+θÌ•&’Ãz•k07Šaá·ó‹”J$Dì±�ÞU\8¦Š}aþ›¢I ð*ß*O¡©LžÒŽ‡ìŒ¾±*ìÝUõi8ø¤¾OùÕÍÿ”4…zïÙ»Ý(BÃ)‰FsºàFýÍÙ�YgòÈ5SÒ›g%’ÎÀÈ„ì½\™æÀu·ÂÇñ£Ôð©•P1G>ä¼(“âÜG;,'Â!Ð]Î{(%%ÀæÅ�ÇaR0©ÔVp\¢‘õ Ž˜rêõ‰8íš§Í~ J3\œð ÿô'§°©üŠÆð›ƒ¦K$ú„¼‹óÑI�ö–¶U»„021Àzs€QM `êíy”Úñç© ¾© "´® ùw™^cL=–ARü gF½€6ªê4KÏQ±>Ð2æÜU !죩+0‘RË+›@DœÿÑ�õx±æšÊ–��œ)¼äª"ÚØ2ØaRcm�*-*PJ(¤£=¤Wæ‘q�f‡8D.¢¶e†ÿò¶iezè16çÓrÂÉû2vë¤$I ®ÈNUNMðfð>¼Rï}6¨Âd¥´¤�¡ÂΞüWŸ©xÅ%½woÓ2i :Y•?¥Ž8À¤¡>7Ó¶þQÔUL"ŽèìüÕÅQŸßìõ#X8mˆê*Ò…*�ög£\dšä™œo_UUV~5J¯Dq´Åµžôeó«TL[ á¹9uGIÓEÊÌËV]2²nõ’IŒ'f�íyØÈއ±VƒÒšRŽºûøÆÙÑÝ­0i|ä[ ¯­ptj±[‹NOFƒ ™K±ØhŠÀeK=4àe~ÏíÝÙêù×ê³bTö%+²BÒæmTnÛ §ÙC+ÀrëÉMo¶bJ¯ I©N{ ‘JOGPÆD©HI”ªëvý³m'Î6�C×ïžà´çìØŠ®rÊÉ ÊS¦â�•”M È•ùtT¢áÖ ˜¾gp�ï¼ `Õ½uŽ£õb¼µ¯ÍùX]̫ե½r‡{ÇHØa)èÉuËÌš5N~¿ŒT†wO³ò–u¡þØ%;;QW�k=N=�†(—Í«j´c}Ór+݃r_Ÿ„åÂü¦buF$‡J\+Kš²ËHÔ�ê¬{~�ƶ�³„«ÐQqEAõíÀŠ*#�‹WƬ¬©tªTúºœ]c…À½¼Í–ãö  ¡þÖ˜CmqX(šµ;Æ,É÷ZÎú–ÕTUö¬&ï…FñÕÍCp{ŸÛ¹ŸÇŠ,F’¨[ Hh!D¥,ë¸Ãª™Û{²è‡ ˆH“æ^-�­ÿ*+y½p—œ2@¢‹èɃx%·™þ=oŸIâ«�L¼Tô»¾¸è–ˆrbиPÆ£ Ë€-(„9qé¸CmœÏEK!­£¯kñ|ö]ö ðf æŸü°&v¦->\$'pѤ‚9Ìü5:3â="ý©oæšÿƒÏÈʼ’ZñÆ{4>_¥¶?‰¡ré¼×ìy¤ôÓÅ?.¿“4ÿšÒŠ®ÐЖfŽŒXì”¶ÛÕÍq`›õ«™èÃ/ó›$>ÌηkÒçx¸ñoÚ¦ŒjÙÌ×Pg»í^ן',¤%¤ç?ò’_GîÃ3ø›Ñ›Ëf•ô_uA Äz/aÝç9Õé�éw¢ý™%w¿¢¥ÆÍÝ?Ý™]ÿ+b9×$ãʨÌh½°4êõÔà§õ¶n9ÿ!Ì8Á‡œ_Ågu4�Òå\î�‚‚mÉæí(hßhá»Á ­|èý ¼W`AGèu¸Ñdç¢v s_¤,²m¯ U…ÕÇS æ*C–DtßxQµ¥e�A¾T¥ÿÍû?0§YñÈ«è3îfO{܆»û‡™ÂyüÛƒÙ¢Þþ:òâ VWTu8¸Üˆµ—¶o-Rdo‹«$2쑃UIçDÁÆÞãrÏ�ª4‡o¸Ôæòqªîû lìæ\a2 GDZ5ÿc™À¶Ò}ÝûÚGxN‚$²$³“ê§rü×–\žq¦�øwr�Å_•Z-Å©–Ä·*Ò2Ýk�ÙàÙ RC*$Ù"Á c]ÆÃcX¿ËtM÷/yT”w‚,Ûaúê#€Zeí4`u>%Ã~]å[1ý�ËŠä\=z�UYÅ@µîdRÁÎD;P ÿrÅo9Fðw‡e}ÂV¢ƒ<˜'è³ hÀ÷dvÖkyëßþQÀ-ëÀìps˜˜QÓ»ÐóX’tÝ °4T?Å‘S©©+�Ë:¶àà÷‘W»B "lœÀ02‰Á¸§f/®4�ðâ muô#Žêçð…Ä¡/�Î*ìúFxD7&{Šô{ÁxÝI‰³êͲ54‘ÑHΖ$s£T¼“+4Ò­¢,&sˆ@‡�ou ö-îŽ[“«óíù5ã€�Ž×îÌ2!éÙVÜa¾h R¨‡òAúœd7B+(«½îeÙ�¤öM±Ü6I“î€?™f¦„±ÁˆCt.gÆT…Ý4ÃxžÊéìP ].7±ÑˆÊ8ÃU5 bXC õí®½˜•øS”Ë£uµJcvø b§(ÇÜZ ‘DÞ«Öú,]\×'wôûŒ¸ÙD²7âôçÂ×ê,œP ’2/Ù¦”(¨OAdù›e½«Â›¶Ø�µ€Lߊ�¤Ð{öΘCw€œ�Þ�b+ÆÒ’Üì„LUªËKǬ«È'‰ª «è`·,²9±}�aeu,$púó¦„^ˆOrÞìnZ}í.Å� ⤀Ï�õ‚Öˆ _ú©H}ÒÂãCØÏ•ڸ̔ªƒ¤ÔSjU;|�ZsA>f~ƒe¼ÙsóTLGÉ5<Ê^÷šÙAFͰ )ÜŸÈ�ŠAXŠÇÃz4‚«0h$Ò†³Ý:Ï"¶Ø®¤Áíëëíٖ׌«pÂçA�} £´Q�‚DÅõ·ÿÌa#°äV’æ·\œF‚|š‹_Ìüñ¼ù`cÝ®Ûñ)‡å%)¿èúÏwÍQÒ!$Ňãþ†pÌøOÈ(ãùùÒ ‹¢Ço¸sFy¤¥µ6ù“„eP`%ñK ¼H3Û/µ{þ•-ÏLK⿬�ÿf7èùz«”py–µð\†÷¥áBCÌ7&K�PQ‡Ÿ~ì]×]ö¥b(éCØVÙ6Ò} xîìàÍ¡©J}6öìå {�…òÍI¨¨/Xš¹çÁOÏŠA±!}.CU‹õŽc2;áÛ“(ˆp'@­ÿ¹¡{xƒ€:¡©‘ˆ¬ÌK¸Øø‘ŽÏð>“"È6½Û.`_(÷ªSàÚÝ7÷jaŒEÁÅ’)¾HÅ&Ü%†Oàèöµ1¥Éš-ú]4ï`ˆ³XšbFùì�ÌsÚë<�‡{öcŠl¤˜Ëë÷£S…TÜì�_/Ejw\Ð61¦ò±|Q¹Þãð¡¬{~‹ká@7‹øZ¢áÈ?A®ž'ã ¹3 W€�ÅÅ碘Ÿ'&æSº‰ #„ˆe 3u¨@Å‹.­‹üÕ5�JÙ¸׋Äô•pNL–^ÐÁ«�8õbðÌ_X;-�D%çúRKQ…o:§…fg¬’Ù`íâpëö®·�G&)HEC«U‚6a§ 8‡æ•ìø¸�É2„6i+T«”[õG·PßÀ4¤bîqHðdÝÕ(ª yø­FϤ¸¡n/×!d8dµ÷ϵ¡99Ôè•™�ºV˪X6îF ÒÆçÀóûýk‚‡N Ý$ùñÍL‘þÿ‰ç/ê“vºÕ_?Q�)Çæ¬e™íhL¶¨lè5'ðÆeÝ Æ{ÑÃ6 \¨XŸcÔ¼‘�þüJmDJå×Óªõ³úÌæPuñ%œó úÚÃcû¤Z6U}¾ogã¶B…53RÔÁâÓrÔÎü½«žc@ø„}j"âñpA�˜Êg‹Aƒ¸#«A,ÝLµ^"ž“hµyN@ó)0…±ê’N–,Úò0Êq”Uj:ywƒñv3Ñ€¸øgë3²ÇÅ€}Aø»CGšÂŸŒÙ• T ´Ò€úŠæä"vE2ÿáE" äת:=ȯ`ëU®ôn‰h±xF[ß™¯ÀjéàlC6:K¾MxS€†0•‰åžd‡;0¦º™j»½W-¯æ]±¡EŽ©õ]§”%ºBD¯# §+¾[²!MB‡mŠíz¿LK5¬_‹š+Œœ7+U^…ëfcvÿW¡b”§~ƒºÚ±,à,ÆÍB'ük(šlàÓ$ø®Y­h'�©ie‡76gC‹‚PwħÊ3!:˜:¸ ÇÕóÏ¥qþäW8è°ì^ †SÊ{> eO�øT½RB eèa6zB��PFéûC ø ™Øuû„Ò@ ú•&¦âûüÈT–”V˜yN^´ä �0G‰Ð¹ãŸæ‚¤Ù$ÙqTc2mfÇñ¢˜~©äc…’-)Ú}ƒ+Nd~=¯‚¯Ôë]�qWÉ�ã~C¶¨ß0¡ÞùºÖZ�½nïç;Qœ Ôéc+ºØ�¨-è�±J¹SÛ%´åßFUŠœ7¬ÞkÅ´((Rþb~`B–gBÅà{á �]i½?ìÃqæ‰|ÎÛÏQ¨Þ·Ay¨@Ü"†ï](ê÷9™S°¡£ÞS#ó7¿—mçBïWU4Û‡èò˜ *—<JrD¨U¸bmÙ•jÂâÆ‚m}\‹û`‘…Ãè”§n”É�€E†©�Ð, t½ C¼¾Ñõ+©87(nÔÈhÝ/-㋬<-•óù¿»ÂR¤&ÿÙÀíý¥óÅêX±¼(=7mÙejëŒk3&¤uƒñ¾ÿ6÷¹n�ÉØEƒ16·[§A…¦3—¡ÖÀå�Ö²$öuᇋFrßÿ|•’N(H„žô›Ë NL®³¾¦—€*¨Îk¬s±XÀ‰¨ÆÇ«Åý[Wn])Í\d,ÎüT\‡Œj$L~Žc¥µDn3ZH¤ýÜÛ $ª·ïÆcm§P+¦PÖFfjKgîõPï<éO –�†/O¸|‡"/)¿¶M[¹>äÙùí°jŸ¬Ý_N,§ œÊš ÁK±@ÔV+¹!B¹g¦BlòžÁW¶4d÷”wÈñï§ÅuÙ�5b#$áïÅ¡ï žp.^˜Ìs±•f¥‰L¸J®_/ê„;W)…à„äš%¾_Š ~ôj‘Y„�H=ª ‡‹Ê^’x7í¾%¢Zìu¸HåÊŠ¡÷W“C¼´ÞÀ©Ü=¦“6(e7¥ˆíVï\í”Ê$‚ùŒÛV&c¥Ç5Ø"TÅåei»¹Ú‰¯�£A¤BàÞhF�¤!æM¦Ý°8¨÷}(&ýM@Ê i妞M`P€‰»ìw™C;ÿK­ ¹ÑšÒ$ùJ/¢ ðöÆ¥5´ÞÙPÙ•«:W�èôðZ¾Jns”¨íÕ\Ô–J[c:ÚS¨Ú¡ŠvÌ ¾’X²¨•øö¾ÇÔø‚Jt0_óiËe[Dã��/2Z„ßt;×ß"Ô6&ÎR7LÚR„Wl �ÖÑŠ�HÇk–Äû¨ÎÿÕh/ævû²ß"Þ!nÏm‹0ì×ÍÙ79Öp.°ÿª—Šë’–í;¾#oÔ^§Ž�è7 Aá™[0<ÍÙ/F^2)¯É÷Ô²‡j)àñ`Ó¶wƱܵÿ�Ê®¨™ŸçJÅîÁH5SFŒýÖ¾…�7QZÍщ[hÀq�]w†Fž‚’�ƒ J¸�:Šò Ý›êÃÊ'6ÚÕÜÎURŠžt!Hk Õ9ÕQ`ÐVú3ÆÏàHœÕÛ@ëÀõxÆ�ïAù ÿ ð)ñ£Ú‚Á”,.Xn¨3ZÑ’æìëiN£jÜòkˆSÛݯD£Ê!©6oú˜Œ1« 8ˆ¿õMróÆK±¾–šº.0±¯g K`g9ºÎ•„§Í{©Z-áä½].Å3ÍB—@7ßn¦³‹[ç…ªí“*3…<Ÿúi (�î^'†–äŒßÓ³Ó¬ƒ}ÐåQqâäWâêuνWp½ö qŸŠ+Eeýå¹-ÿFf|1ê†ÍùÕÑPŒu_MË6Ö®n^¨#”ÿ£×Ä\½¥‡3h’ý¥`¯Ê­~& ‡cW®0a-˜ûìÖŠ£¯¢íË Ñƒ ÿø¶ä?AÇ%µœÌ÷–ü°qÀ–ŒÁHTºê#rðxš ÔîÈ ¤ƒä"jË�¾9ð )J~PfîZÏD`Á«2H#çél%1˜m0F´êØ£  wmQÉ5–/Ó•* ¬[›Qg&”5÷¬V;$1g‡'~ ûYÐi«­ðãEŒÉX}0[æ^f”ê×þK?Zä,N&[äËŸ°,‘š C͉qö$ Çî¶Žš©W'ÕζeH8×2šú,; ^¡Ü¯ÎþÕÿÎÅ>ÒÁþP8]Þšl³"ê-˜Àuèôpë+pVñZ•Ø)÷E.¾ÕÍ´_˽üXG.1ûdõ|­Ý0ûâߘ1‚E |cb¡�Ñ«þ&›Í|ÈŸµ”7øþ9Ð Ÿõ)•´é;·6AÉ)UL@{ ©q+4$¨w¿�ë21)’3vuaÏ®¢ÍNhà9VÂ3+mk³i0XÀ.aJù�&ƒB­ö–¥]+ÇÛØÅ¨Ù©x¤u=‚ ÒÅÈf~ÜiÕV0$ÍšØظ‘aU®©ë*cßLéuhËÉü^\QU�É.ÃÜ42Ž]ÜA$�ø®üqcšG ¶�åò‚«Ye›äàÓO:©­Ôýzéãb¿¢¼ãŒÜ&/ 6m•4~µ¼•¦‰&g|¿QLn¤gºÑÞÓè,pE}qKÔZõ9ȽŒufµ(µ Ñàäý9á™d­¶p  j¸Q·ƒî2+÷P‘NžÔFf&˜³ÏÝ^abRKzLÁ`ô(¹b kiû¯e þXvÓ$”•ïúÞ ¤ì5þÛðøû2ØH± d*ÁxSï·Ã†¬Gêð,»É ªAë"‘`7íŬÂ.áßg:€ â·zºð~ÏU³I­c¼gb«uÕbá!V?WS±&¡Ç‰ûÝ/Ý}Y�6V4ÖHZUöÁ‰u”87¡2&¼ãp«<·{—臣 �…Á”Ñ–D ¹ÁJU*J¹?)h]Ô°‘0ÃuÄV?Áîçü¶TþYõ’ Â?‡çÇöñäk±›"¶ý½u÷ìYöʈš0Íîu†ÔbßF¶±�?Sÿœ}¡S'µ7ˆž¥o\ê ÓÉÀjˆ¯vCCÐ {Á‘YW‚ œÇÐ(HÓ×-NQú„o½Xÿ_¨,òú$€¹o©»²¹ãXTÿAïÈðÁœ— »Ke§Êq³$Z÷oÖi¡ ]ø(_<¾Ü� q£Ž?¨—Ì 7;…‰füãL;ÿïÕ 6`~šŠ@´ä¤e€$Šž Ž¬•4�…R+y €f‘/DMÚïã]¥‹˜Ô†²¸µ`‡/ñkn=�KÚ¡·bT%WlœX  ®J’G‘ìL�& +©„©›GÒªL:bfhŠ>¸pꌷm8µ=Ìä‡vú­iFÍI¡LƒÈÌ¡¼þù^M…½û®4ãße‘ÓH»>Eåo9NYDz û¢„.~*-§¥XÐ8<¾9ª¾�³¢Ú-¤Û¹à%í¹ ÛŠô�ÌA{ëÒT]Ö»"°%ø�‘¨=È@^¶¬¸ïVU†ˆÔSx}‰ì=|ä‘)TBƒÇgc̤_3² àRÔó?^Û³»É7ì#§ùF�(êctýc"*€°cŸHµDgÕòÈdfÏ¡…¥´ä)FÔÁP±#G9«µæná×rÚÐøö î%,�ªOÎY“¶JÎØãuúU!J] N±¿äí6G# èl�ß²€ýeƒ”v“-%�ˆJ¹¬E;"ZäË“, Ût„¢�W�÷,eRxÐ µ�%¡MŽÙŠTdôÕbНà}3… Æ®ùÆ–`cìF·ðð–aÓIÈím^Qâzà`+}¯„p$%Èžÿ¥õ-1³›rG õå‰Ýb¼a^ræ,r¦Ñi24¿ä�ÑÙòâÝHŒé!x ¨Ö¢/„_o`• šö²³¶÷?wA»”Œ›Óô�bØwƒØ/ä(¼zv;rЪ]ŠûuUè°�ÙÊG8;vaùà”wÕ„ÉBºÏH9Ÿ]Æ5°0þµ Ãõ+Ø aéÙÅ"ÿ¸Æ~¡æ¶‹Áê!zÉr°¢»€!Ìt¿YY&wzeŸãÞ¢(²îÁáz™1õ1;•¥^Þ?Ý.Ô ¨·êœ]ŠÍjdÀ³œøˆ?žvÆ12hJgÔÝH¸ƒYZQçzdcR”2z—)ǦYtr·÷J®¯0éÿrj7i®­ÔýÁö s‘>"Ì›L³¿4ãÀ¼imügµ6Tá3±Ô« [λ8¥ÃQú1ì ÔÖ¦öZ/ç5hÃ! žÞžÎK^œœ6Ï_™H´Úå½|0¬šñ€ÒLÛo×îpë®5rŸÄ÷n{—@}¼„c`wÊ-¢U�ÿÃ�}ÉÀ†ÞàñóÓôöÐËÇV¨Î»ì •O AÃÀ1£ý«…¢rRÒ…lêO…*� Øé`7³OÂÛsÛƒyi]FÀ¦y¬uˆ4ÿáûÇ÷DÂÍÕ—-àjK =¡ßäjMËØM{ýj2>;ÑÔÜí“6Ô ú%ky5èpó/læ,ÖY JûŠ×Ĺ—¥úT$©Iz°tk쉮¼rƒxi¹eXÜá£Þ¹ÜmDÎP¢û`¨ÛÝÁO�ºnifº/ÿÇCjüYbìg¥PbÛËìÉIMqW¾§›< ávÊ„êÌ×I34ãÞR\Úô]�£sá9Ó2Gˆ‘ŒÒpÂÐÑt#ɬ;xÅs|Å5>Ì´[r'ë¸I?θ¨þs Ó�Ò팭ý¢gQÂ7›Ð¾d¹+g†ð„”þXmwyœÌc"L~¸KuvÑ®G€¯~Má4U"xˆäV Ò@Ù;$4£¢•¤ÄÓ7=mV*ýEµû»1YösLY4î7<¾Ë•¤A®w#ÀÖ¿Ü;œÇ©>¬™­/…A]É㤹<Z=(Ì Æc™ö_V‘/YfÝ% ú-ÕTi¬ÝàÃO~)xÉ$EVa\âQ=¯²«àÅä zB¿S{Ðø“l‡ÒC¬¥Èòðè—»%3¬‚MQSÞW©_7øË»eDâ)šRP}ò?«¡Øy§ƒ÷ 5n¤²üØÀ%‡#»íp¡?u¿èY%^ß„æ˜÷.­ÅŒÔ’ÚæípÐŬª=ŸD´dÙϳÖ'¢çfÁ�òâD)qrcEh !É™£X8Á«å“@—Ù.ûClðBùaMh6¡ ï|„ÖWææÛßY­nC\8@móó;AA×I’ÄÆŒ÷Ö½�ªŠüêŒè,gf$¹ƒÕÉl –í„Ìì9UÁdh}vA,g†<´�1/’gAà 3t:®3$½\ÎÛ‹oFw¨ƒ ¢Xº=ŒÂ�qÌýgy¼êb^½£œîÓL¢ÀÔ�iTÝpO\ÕC"h¡)ý¸˜ˆìýŠ|æð¢òt‡^„æv –¥bkH•P à*œ¹h. at?òU8ÃèåP‡‚Ï«q4 ImÛ͘*i@›Ÿ×FŽ ÉPÊ ceccomp-4.3.1/docs/images/trace_completion.webp000066400000000000000000000165121526046660400215510ustar00rootroot00000000000000RIFFBWEBPVP8 6Pu�*žt>m0”G¤"¢!'R¼€ ‰gnülÃçÚ�”5‹üÏá•„˜Œw©¿Û¿P­ß²¾Ðþ¤ÿ\?^?Ç|€ˆþÍêïþÃØ'Ð#ö“Õwþ±—÷?ü>™š©>Sþ¯ø»àwõÈê¾�þ9ò�Û?&²ûDá³¥ÚúüwìÜ?»~árýØø�ü_Ú—£?ÿuõü“ù/÷?íÿ´âvýɘíAпÙÿÔþãìéÇÌÿÎÿ…ÿÿOûW ‡õßá=GúßþgÜøçóoóßÞÿy~-þ÷á%÷ßôÞÀ_Ì¿¹ÿÖÿ'î›ýGýÏñß”>â2ÿ)ÿgüçÀ?óëŸñ¼~A–ªó{Ãîâ‡ío)°²$^'�l?Juêm:=Õh:5ìæÜ r7Zø C°ÆFf‹¿<6“ç°HÌýÁ>Ÿ-J—¾—~)Ô®é)_,Ë®NßqUÔ:·„½JZ;[T”å¦wCQ+`6{¤ÿæ‚hz9M _zªS±€ªÙª'GøŒy‘ ¾÷¶v_ ¹eÔ@‰ „aSd0?†@�¡e4V¾Ž§ƒw„ªïºÚ@èsdˆ 5”“/OÍ�‚žÉN©qÀô�¥®¶�Ѳ-¼Âvã¼m½äßµñ ô�n´½§«¸6À›êÙoû×vÈ“Y^�”-éi'ŸlÙ–»ßÓ¤3ÜðÖ7רÿϾJY¨ògAÑÀ:ØC£{ÖG<_-nâµky鸇B}±s4e;%„oy÷€i$G— aU™„zˆöû¿)eç˜ÕÎùFÏ«òζ}”Я Cr\àK©‚è •^bÊdd§»-HŸ}Îà(:`”P„ˆH+ΪÂ=æ1+1¾xæ~ìׯ!D{„ñI%¬&Á1hÜWm#%7ô—ñ”-8™áZª^]�ªg÷)ì†\žÍæCgÝô·}�¾Ÿ‡>Ï&A¹Ãý¸â"<ï_ì½£L‘´@¬;ª+D‡²æ ¹Ÿ@Ñ5r‘yɉ3û(1ÇÆlæo›{¡Ÿž?²—¹½jf<µ…¯�ú=³|�cËÓv& |÷ì)$3‘£ž"$¸rŸ%QoP!Û2«â‰ë#[aöŽU LÀ=A`ƺdr‹U[-®ë•—b¦2¡(N�ØK­–#©˜…²^Â{h´Ú5ã—ÂÊ_ Ë9ޤƣ¡¢Råä{ã@Áç'~ÿtÌöÁ^Ü¿«bÏ Ý©ãÕߪ®J€bdíëÐcç(—,€þDq�ðº²ÙŠI2%(pƹú-'½÷‰#C›°Ñ€’]™GÂÚ‡ |¦ _—Bp’ öóLU/õ~ô|îÛ¢¿”oF€)ž îzL¯ OKðor,n!8“p÷$Ô|ÇL×Ò¦¼-‘ÜhÆÃÓ�ñþLc’¾6�%R«µ,ÙâûRP>ÕR�’[G©â–m·K0\±øü¹Ñÿ’”üòAA­Ê½wHOfA2L2Qð]Í{φ�„BO0CL9y±¾÷ˆ€ÑUÂÚ`¬Ö2بè=àZá]™YUNÏúO'àI¨Ë™¨t.üªW‰ÇQ"}$ÃõvØÒšÍ¢êe)ùÁbÈǸÔñ½%2ó"Û_wûú@·¢RÉ5báÑ4oéÙ�â™j(· ìЋK ¾–¯q^ò{D*=µ×Žu$�Ñ&§\›·æ¬túÖL�ÆÐäµß$õéŽÅbµ0ቭɎiarKwýåmá7e°L5à[o"ùAoÞÜMÇ©áÎâäé¼Ï\Åöý¹ô·Ù[¹ePý™âŒø—~‰”C¾¡·›llÓð°CS‚co ÅFû\íö HôvÛ£jmÅv˜ü}k2"�b*òP$÷ÈçXWöæòóéÞ­@“."ÅØß>™Æù1,:cÉM~Ëô/(x2ÜDmy“›µ.`“6c¦õñQpHçCÚ¢ÑZË:› y»?L#Ó=”1ïôx=gˆÛ ïÐ퉹pyLé§ìpI À“$™üêhðÏ‚´o°ÞV%ëí.æd‹yÙ—©·Ú}2¢Œýó>UÉ‹‘Î1ŸÓèAÜP•­Öãáô=þŒà�£XÙ #”µmÉËJ)Àï¥�ÒáÌm¹�En™“ôŠ©•‘ð8Ͱ¨9 �þ÷ÀQu1Ï4}󙟊%¾‡î$ü#q_»ÉJï :µªã.iÈ›Ìþ²\,¤iªºúvf�³~F�íLqÆcÑ?P´Ä¬µ5 Î%5é µ%˜ÂèÍ_˜#†1¦ cÏàoòî»Ç¯†£)ßù[/¿?X÷$ÔDЙ øÎ éU߯ЂÒáT9åD§ï< ‹Ÿš*mò¦òQ�¡«^ÿkî~†øíx¶ ô0Ú½3Fœ›âü9“–mË»VµOa{PÕalœð±0aRu&B òI·,î>F›½*è#ÍçÌŽ5údw©:sp �¡�ÕØ5k"�˜ÆZ[:Ê«âÞá§Ä`¡KÅÙ;%·]Ýœûl'!`ÎZ¦…u@Ä]-¤ ò«ø|&(ÁG¹. Ó� /Ùõ(Wyô> DÅSå�SÖœ€ºº¬z�Ž,Nk•u–«-ãÕï�HÕ¾Àß=òÎõ3œ… Oæ~;M%-ŸÀ¯ìS«ÛµÜQýÈ~L»*wŢυÀDÀ ê—Á%#Tϯ'ð2â&›lOö„:Vâ«ä•ÞøGû }¸\bþÇriÂ?±æ·ò5Ì·k…áªØ¯£væ¹iC7º×µòõúñ“ÆPsæ²æZ ªÊ½ð|oÓEƘÏÿ]ÜIÇòÅš÷¸r2ß#­ãÚ´SýéôVtTž¬‘-”‘°Àƒ84In»±E›Ê$Ù5H´ ¸F@È {å†SB’Øuã~:M¬u•ðY½Ïœ¿6×Yl‡yK0ø4wl=a‡ä ‹! ppeS¸ùç  Z?ÒÝÓÁè-ŸŽc+N ¿†HHšZúÉT|;Ū�¹«±>9Êÿ½,²PsLßÖ¿ìù:ßèuw·Ÿ3n�8vømÀò&þÙ‡eÜޅ΂Vbä6£(›’³'+´s*A7´ÌéìDŠÊÄ2ï8œðÍbÚt-1` ?%ß#ßaÑñœ]1­}œÁHãQGæ­°”Ì'}Ê:º^—ªì†@¿ êüA¾#©|öý½=Þ–01Õ�ŠYC¨öæ8ìð 0I5ÅZ Ô«ZücüéÌœ°äQbj`ÑPùئ¬åY9úB#óÂÔªÞÌŽƒ5ìO ììô€H7«úA[½ žï¾½ y‹ÝƲ¼gÉÎjóxàÞê¢Wè<ÜÅ=ýÄ2”ªËø«¯‹‡¤âàBÿVä=ëcwáLF7l4Ÿ¶R0Ûxc³ß C÷\œÂs“ ©¯�p ÐÃX3)ð8�¬·]ݾä,“m·Â³�ï´y_ÌÏ�«îKÄëe6ËPÛh%=ñ¡ ‚‹ñɵÌ–ûc�L,æSõZ9^v²gN¬éwáQv90qPΨÅxè‚­ ‰«,æþVŒâ•;r‚è6ûE�í‰¡Õæ÷¯Q^žÂŒ=?·î%¹,‰¸ËêŸ_ b4ä.6�*6|©îÑ?UM®u*÷dA‡ŸnÉ|NC+û$¶´Œ¸IÞ %1]ÉïÛ 9ƒ43Y�GóÔ²"$ v×ÈÃ{œºÏ""f-!v–õ¤åonS+Œ�s)å¸6â%ôÀ»ØÀön'œʱûûí™N¸Z†fÿñTa0fzco¾ív˜D`•bußF¸hÚ`]n@8¼^ªÍ~^è&A�çRŠï6MÝi­–ÍÖú :ºð­kÖDèû¡Œ²­5±?¾ØÑZÛ4\üW&9i€Éòî/`ÇÞáb†0,Èrwužf|©“–}×(JQî!€„hÏ‘7pA‚Š£$KœÿË¢ŽÈóÈ!A�PcºG2cTÀ™¡ê ˜½ØÖfãMQÌâƒX M{œ-’Ž ÁFô²Án+MGáz»%ÐcáHv^füó”jj{V¡ix0U{.T XvÍí¿"I‰¨¹%sP{If‰b5(óîY¶(Uëß3f Šª3yÑzÍdâè/¶`½`�ò¹²ß™w=»©’ü¬ÒyÚ¨�g„ Mî�a[ó ž€g¹?º¦‚(öñ½ÒOæ]h²™ãÀé²Ô€°0–qå—¹ÄѬæ>e¥.+ˆKüùY,×h¾0á§e'Åò¨8´¯¾ß†ª�LöÛÈŸKd‘00 TRá<é“XU´M˜óc ¹1¸Õo…£8zVçaܬ‰j`ÞÞg°&×´ó”l"?-ˆÉ×´É�71Úñ%>.@gÌëÄ')GÔ WõžTb݆h§5¤Ýp€f®ErYÇÌOäòæQ2³�«.GqÕGÈAKyIç¦ÿ?«½ÖÎûky¹�‰Áà[`‡?¹9fÏ™CE ™' ííΩ?t™ âÜ;Êÿƒ&ǺËP~J–‘à�^Ƨp›YøÝÑ.+å�‚úÎÀò¾15šÖÄ®�šl¬tøáÛ:ήrZW^ùàµ4,_=4FoíœüÅ©Ÿ˜ ~WŒ¯pò«c뽪³!u¸e/Æb×8Wžêx¯‹ä•³ò‹6™ìàálŽÀ JiÝÃê…"•©mdsÄÖW"_‰ïŸrîIÃ{_iƒ@öŒºÈë°9—>ÆXÀ»1 澎…¿©è/é“ã]ùl¸’„023Re€(ÿõôXH‰]%]±pŸv=†v>£0RŒr®0ãìüI kpˆÃc&¡u9]æ5 øû)š[?b²äp+&)Ú‰GÕZjÃۺɶ°°uqCïGj<Ò�ÍZñ/="༄L“Ì‘Ÿ¹×F {fƒŸž©pw¹¶°¤+(„ÈLi#Wcœ:&øêb’,®›ÔÝrâQ)¸@Ÿ’OGÌÉø’$1üÿ�Âp¦XêÖ?÷T“Q ]Z[%‘°ìO:ü¯EvdÇ@R]= Ÿä” toHï—ß'³è¹ û&@ ÃŽ¤B¯×C�Ês‘x: =ô©Wêç¨72Ó-D¿V—¯†;ïu 4’¦:Ì@èmÅ“ „�W˜�&±O-F^Ìü –Í8ˆ9¡EÛlSºœ÷Š}å@ˆ –µ4ûÃÃ�¿©ùk[ì�Ìeà ŠŠÛ†Ò¼¢ñ…cÀ@S�[j׋)«9à¿´¯š÷0E‰åµo½„Íà9A ÐÒk×¢öÖáÇiÍëQ‰&ª�|üEó=Tÿ5ðüµŒˆ§\þ…˜5÷©r š¤­iO>¼1Næ°.�؃³ìhšþÛö“a“Þ�{¢µ+�>’C 3´Fêã§žD/xß|8vö±æªš!íá«W6²8à6�Å­ ·÷}GrZÒCaZ?jLb"à€OK_+ž)ûT®Þ•uHäÏ©aþ¶= «k�÷Z3ýzÑjàGùYÈè–Å¿:ËŠÙ swo€xuÆ�èT]Þ6wvPr¾Çïrå±ì=¦Ëb;tÞN+R ×â‡}zº£â;Ĉƒz?TãʃTp8ÒÏ^E¿)Ä"Ú <B�¦IrsùÁ´üA8I¨ßNØÏýÛãÖ¾UíxåXÓ€ò3.¡vÊf7éBR§ŽcÙåüø·zä™oÕ x0G[Ý{3rÉù‡!Ú±ãÙž‰[ÁÀ KºjQ°3p45\õÑ2¤éùKd6îQèKšûõW6*ÍZω¿rMБmOK{_¶XKu¶à¬¬²x;GÚc¹—ñZã.«Ð Sqc1K@SÐhŒöÔxŒôø?^Br]S7áÑѾ÷0Ë`A�ñG}PßÂoø¨/ƒ>úôÀê– ×d Áø3΄=%ÿÓ”ô°qkJ�»•'p¤û¬�³‚û2²m4¸o–²Z_„ÕÿHø4¦g6pt޶h3šié$‰\6 ƒMb‡×tÏüàQà¨�Bø—ÛòúQMB{‰>²Ú(6H-z[§¼}:tôå@;R"4ï¹³Ŗ¨e\îÞ½¢'–<ôgù:œú(@ÔF–, =¿öÖÆN7f¸ÃC”rGÈ„red˜$®ÂÁ² u¸“Y—  ø¯ÿK$}Ñ›¦�E/‹ÈÙ#¶Õ�à»Îž$·@{¡} j°‡?Ph4ª®¯¶Ûì�™ˆÊL|Ó«‹×xø¡ÂÞ$Ÿ‰òm/ÐB]8Ÿ©pV½\Â"œ¥ ]ËíHß^æíc at‘Zv µ8�oàq^á6`±ò=Ûv„ÒÓÙ[LókÒ!Ä­+ì©í�—¦÷Êå^þj¢-瀀E˜g:S �ê+ô¹wêïy !¤J8§J‹7H†°�Úİy)σ r¬kyl&Š�烧s‡ú�'Xa¯M°Q>ý¼ztÃDÖ`·ì Ö÷-[ N-Ïldì+åMH¿Ü°K½#4_œÞ€k1Ük×ÝöM§Â6@ã�Üû@ã|Yÿÿa„zSˆ#f{æ°1¹!OÂi¨/–Ô—Z|÷{ÍwÅVàÓJrã8Ëî64]Ú½ï'-Î/Sœ½Ú¥‰1“auV ¹de9�TäR€–[UíQPŸ=ÃH³ïTæÍ&B³½±” Õ@Ý8ÀÁ£fíVxÓ@4H#M$ç¬ÐXɇ`¸×Ômí̺m!fÁˆ�\8$yÓ¸0I³Å2qAübwÛ"kÄ¥¨Wâ8ö`²Ga¯üp»™!áRZÓ\WÑGº‡Š.¡Ã^ƒoì´ÓfÏÃj:|éù‡ >k\Zu¡râÏoanC߃�JqçRøQP·²­z/2yÈ÷BüdOt‘üùåA±¿y½Ÿ'œtòÛëãaåvè€É·Ê¿��ÞJ¡Í-¨ÌÔ6/·ã¸¦ïÿçÕPøSª¦äÏÆÌ/JAEXœñ°L†(Ðçüaè²Üñ&és)ùõC(§ä_Ýžvg $Ÿ‡1±î½"9�‡{JrxžŸdhtU~ëÁeê‡j£ÞöŠ�cËÚc{L™["6=Ë ßçÇX,:�åMD[¹ÆŸí£dýÛbäþ»þïs9ÑœþoZç0®:·Û¯0!GsKoç¨ÁŒò’uWÁW•Êt[@…[Ä£¹¬y iéû_ˆÁ#ÏN#¡µF�€.Ojµ˜¸CRöÞ´ù¡eúîb�8xÎG “›·1€I¶dåw„¼3Y7¹yä©/[Y½Ç…’ ê‰ô™–“u*ûÑK4ìBSïg9ÿÙã».48‹÷Ia¼As~éj½�†-*ÀÉ©=æÇœÏä ‹Bú¡Èœ÷ëu�írôí-j�#alŽ1g¥¼-hú�¼ðÝ(¹'ØVÂëT! ÉX¡•n©Àüóÿ<>ÿtHׯ¬ÂFž§ÇÙt!Οªî»}ÕŒZÚ1âØñ3„ÍÚ'1þ ˆr!…‡†m”M:G¯;ê’";“ÒJÌ�U®k`65³æ(@n {k¡ófÝ¿è�8¤ž€îÓé—&ªØk—ÜÞÙ¾õ@Öx2»X?u™%ÈŒ{WvAÍ�æúÍ lDö�aZ¹&´�Ö”÷åX=k”ÊäG°Øš§÷âoh5iü’꫽ã�4}Ƴ6áž¿kÚl6ÌB€Bmà —Û=Ѭ¯tð¢Dl¬ÁOðK½ùû»¹ô^{×AX.ÓTêÕ}x×gÒ‰Všs�Zõ>2»,`0”0PöÁêZ“¦5·eŬa€f—Ùó‹¯Ê³ªÚgCé\W1¤ã_Ù«ÔTkÂŒ3ýV”F¬ì;aWç• Œ)\™¶HôK)Ù„ŒèÕ¬¹iø�^ƒê€beŸ¢™Q:±KÍ'¿ üL$8µ^òWÔ‹ }ÿ=B4Ëå¿�ö\@Ò�cT¾µÁ.Ä—ìŒW›$y¹c�ÞaUçàÿ“Òü¡j 0w£9cøÏïùybµX)ûO:ÕG<¾ôꉵMv=~¼zç*™F%©ü[¤Ò J7r¡…ò¢9¡Ð˜ºâ*w—qœ—ó5]1ŽŽöY›Þý€wê^ž8 }yÈ)?µPÄ*Ëgÿ©k Í§ørSU�%�æP”+±æµ”p¡÷œŽ,TÈÎÐJO­„6Wj� ¸VΤ¥ñ«Æõ“†Õl·¾DñÉI Ÿ Ç¨«v¶�îk5ë &1;a�y¤&ÿ«¡¾×ÿjxáöõu†÷·ÓÕ�øía“ÑaÚëÖ�©\Ÿ¯käïî=/ÄŒœŠ¦OpT7z9ÃOc§ }E96œ¦Ž¨‚­&?ùöp•‘%ÕË�~XææºQOJ¢*AnÆVñ¢d@>;ûi,ó4uCÙ�ttÁ’ÔÜèÏü¯)B£•o>]«1_­DµrÔãÈ¢¾f¨¥Ó´d¯<&�Oý�ЏÓ)®ë’p�^?ëæ]ñºúôeÀo`u—câLHVçÙc~ô`Doç)ãèÅ—¹œD/©´R�~©�È“ž¼€¹ÃÌòW&ˆ.ÌP¾‘OÊ%n²eæÐGÁŠ”5¢7wj7ÝÜ}œõØê<:�¸†I¨åA´Ã§$à¥Þ’°‘ÇóT�ßUtÆyâš(w�Ýäy ×kµÿûc~îŸÐ>E‹ß¦Ö�ÝÐçÅÕ݃À޲EúH#| <•âŒéVXBÕé÷±§`H’/±ê S׳05žÉ5å �d¸X6ŸT„,Ýv®ùvÁ*8/„�Ü+¤ä9ðIÍ#Ü}Tõî —¿ÕòN@ØüU¬Â"ØÅ¹ûøõ®0«ÜºÄu{ žä•£GÉÂ@߃ø’!¥0)³þ]vrQïd9†É�™LSëY ¬uÇ ÕPöEZm>í[]|U?ùÐD°DG…v Øø@Ç÷C›»œº´Û/ñ}Ðpay!京ŮÇ-ŽôsÆÑ¡îèÏ‹ˆ¬þüqÉ©ŽÅïT]¥�¶ðòÛÌå<©«H þ @ŒT¯ÞÆîàùÌ6O‰É�˜òYësb(.õ¤µ”¡_fxÊà×Ua:£o€–¿^Î (¼æ°÷bÛ�µƒ HÐceccomp-4.3.1/docs/images/trace_pid.webp000066400000000000000000000750401526046660400201550ustar00rootroot00000000000000RIFFzWEBPVP8 zP}�*Þü>m.“F¤"!¡*Ó¼ € ‰enî`toÅc4Åå¿OýËÒ¦Àþ‡ûšÏzÿËGÍ?{ó}ýÛö?ÜGæßØ�€×ß×^±ŸÔ}"ÿ3û©î]þSõ›Ü/ì×ìoû?�è¿àý{MÞöþ÷þsÿ_¸ó?ñ?ý=šìþêüÿ\ÿ¥û¯ð%ûWÿÿþ·¸ÿÿPÿ]dý'þ»ùý3äׯCþÏýóö'û§¤?Š|»ö�î¿âÆÿlý§úïùÿúïðÞ6<Ï÷ßö?àÿËûükë¿Ý?´“ÿeý×÷Ïáÿðßåu?¸ú3ù¿îŸæ¿ÀþØ•ùüù7÷¯ìÿãßtõEØñ¢ºÿ£þOØÕ?›¤ÿ þcÿ'ù_Ýo�`ÿKýË÷“ü?Á_šÿnÿ%ý‡ü—þïðŸ`Åÿ�ÿ“þïþCÿ/øÿÿø>ÝÿYàµø�õÿôÿÔ|ÿ.þãÿüwúÏÙo¤Ïè?ï�ÿ]ûîó/óø?Íÿ­ÿåþ·ÿÿà?òïì?ïÿœÿéþcÿÿÿþmÑ�BFÁéë'Så†�ï¿¥ú£D«÷T(•AÓ¯ÑûJŒ+kâ0?QS²Tþ²¨vnQc †_r,ŽÌü£ù á|%q9+RÆ6ï_ÜBà»ÂvbX€MÿØL!Å«S–§'ÂïÏ>Â7Ò  ðÚÒ´eœW±@ß;©z:ÂoùëHÀ•D§a<½KÅGÔÿÛ�ÃÁÛ FØj6ÃQ¶�°Ô` y�„E8rSüô„ˆKß‘’¥ë2Ëþ£«$¯-9´ÀÛÛLHÝâÊe—kïöþòddë=üfÕ‡)Ol�•9*Š/=º¯µÕ}®«íu_jÒÙ02@ê"Ý—¢>¸làpyL^´µeëÑp&M«Å~FóO)6þ7LÞä ºl¯+tIUmù `ƒfCMí”%#7%Õ}®«íu_kªû]WÚê¿ ó6�ɇ´ëYÊLÐÑl`OJ"”ûÀ” ÛíÛnr¾ƒÈH¼pÚò¡àvÑÑ!üF=‚ ½i³â’ÂYWà\#“'X‚°s`z%k!åîp¹·LŸ±¡†œ×¼ÔG~,rº^w+ ØfUC†Áìø=däx…³³®%na™ôošÔí¼`„·ŒYs.10›Ó/:š® ¸�¤ ½”a× â¨Â�°gŸ©^ïœô¥†v+o±¥W«ÁÊšà5±y}5ÇÔ˜¡ýxbçËòæš~�^C\(È.^ºF^ŒL-/ÿñäæûÍöÐÝ ÄÕŽYù<‹¹V޵õÒ³z «?®|¢™°ÖèÉõfVΞ¼-ó"�œ­änyw;_Ø!·ŸOinØuzÙ¿ÞÂ[l�“æ¦÷¡"¥düøùìx®öGNÐÅ„%û ¿Õ!&ìUÒJu-ɯ²……ûÝz¸ŸŽŒáPߊ™ÿ©ß¨*G«ý™ H˜iÿFžeÂ{8�cÓz!ù'zàYA*¯Ê½ÓäDJOQ6I¨ë&&[$lH«;ÇÏL�àJÃR@êÙû ã]¦×O¥¤m·‘X%¦ <»y¬ÇE» „o¯¢×ñsòUôkPó^�¡¤ÊSÞ5a¨Û CÄÓÂvZ‡5;ÑØ8úñÕ¡!—L"�£ ˜Ž`úvªÓ œŸüÒQíkÔ©y)èîÙ¨’#ï¼^2ñH){°eu=¥fjAkm[<úÃL¥ÒNv+Ïú8‚¾+—œ „’Lý¢…‚^‘ ×ÊÔ*¥ãF’@èßÅÿb6 É©é+)ñÀ B2h 3�@4΃`ú½˜Cõœ¢%¢u˶Ö:¦‘£›C–�ªd€Ñ–Gå“Ñk’Sš^d#�®gc]ò‡ê—¡O‘äZoâ«3NdSömCŸ™N‡½ú{OkÛ^átxµÑmÃý›1JÈϬض럣zò<ŸFwæSŒäßhÕ§ó˜SA4ŒÎôšåþ˜Ö½YqJä ¢ïö0ÛL d§êH§»öFјœ®4V«!~:ꢆ%LêÌíp#“j"”Ñ.+Pî“i÷ŒŽÆ*¥¨ï„C+¦‘n�Ù†{pÌáÇýTj6Œe£•5˜ÍyDÊvGκ\iŠ…þd§H*¤Âœ¡®G¦Ñž¯|-¼É·Dù?æeŒ/iC †Tæ…$ä~ä¦#¢˜Šzޤ¹Þ!N©Ó·JOŽþ²ñ(ÛTx=4káþ‹ÆF ó�rw7b¹�K÷ånµÄçŽþëÚÔCyýI…¶²J˜Â‚¯[•˳À<ÌcXÕˆ`o…–Þ9ºÿ:þƒÒü*×”¹kBl޼†fõ¿ëF#X)t8ùëæï—ÿ¿7O§º§¶”VÑ5yÐp~I*:nø ÍAZ0§~ˆö?ÃF?Öp0üË\Óý;]jOHß·ÇÁ¨í%–q�ïaÖvÜÜ™}1ò|�tèß…ñ%ßúRIPH臢/â—`xž×Ò~õƒWç4£Ú詞à!C_ŒûÊUQ¦ÊNé2YÔ|ï}ŽËÜë¤ Ói«ÚyêPa[ðN1ÆÆ!ã §é’™´¬ÚVjü̼�TNæ6çIˆþâN2ð(ø�›%c–é¼ø]ÍÄTfÌH®+¥óÏ Ì©V4ˆ+ g-ÉOzòýòà©ÙÈ‘ÌÔH||¡ÿ[˜?ÊöW‹„ð’ÎCÉÝ?ãËSdÛ<ã“iοÞq€Ç8›3{ƒc”ØéúYÐl¸2µÀJJ}” eìgŽ[š%ÊœÁb¾ GÚ{+–G9ªð¶6¤W6ü˜æ??ùdzp÷ëR±XÆÊ}}Éð7×CO³Wû†¦'æ–®]-·®iòn5È:ÎÒD¤²8¸èª9µ ³ý|¿æáT%T5÷n£|µºw+v¢(,òÁVÁè¢`þ,D¾€œyx.üjÍ0I¨/`¥ý…®ž½mÚkÁ/5ÁBˆ–SR�|X– ñ÷Øã°¹òEJÌç»à^¨ð\%­Â0ÇŸB�*®ƒz%ñSýÒÕíÊ.­¿ð§?›Å¦ásc¸©<ü>BuǵM‰â*Þ§Â$ÚZ§û©M™ ‰¶ý yÙÉAÏD«ã,ÅÂäÔÛ|n;°@]ñ^ mnž]OqU¾qûê’¸­ 4Æò™-À×ðä Ì,ÿ†Ï3Ð*8÷·(ü¥ ï:ƺ›k¿#üê”ïù9ë$9*Eo“6Ç7_y+Wˆ±PÁ/ävetùY„/l˜©>î„G‘áû“ ªÁ<ÕúŠA¬nÓ#·Å2¸}£–C YИwüx‰€¡›·yÓÿ´×DÑÞhÊ4¤×2i’õ­†ëï•©<¦C …�ù“32Ã%!‹ä8’ǽÎ<îw;Õmf†R´Þ¾ý=Û. R°{{¯i [Ú<ËóÆ˜„2о‡Q;Ú5:à‘i%ψþCTíµFTµdõX:{ˆ,¨Ùß Ä’FÜõ!Ñn¥ÉÛ�Ü]´ƒ©áf{î´å%ðMj5¼‘ÞH�5ÈµÒ S/Äž±h…îK·ùàÜÒ‹x¥Ï¥'D§3TÃ\Ù`€(rä{W'R„Ãî×ùì[Ib¥ïr픫¤:>w¯Ô ƒ³ÅÊ’#ΧDxbc’v¸zÐFïæCüüÎMW{ðwèÌé ÏGû¦¶·•§hïÀjJÑÖº"¶”tj ¿W>Ò¼½*Áƒ}†"(n1F‘,4š²jXe]õs¸ÈÛ­ëG䫊NT¦;©gü±uS¬×t†bìÁÎ_±Óã•€Ü.*!4üaoGL«þÈèg µ¸ÿ 5 ¹ƒÆõŠ›å™Z[J­ië?¥‰L˜++"çó‰R wwã4~[@Ó„ ß�8¦¬!“áGŽSXÓa[²QÊ6pÜ~´©ÑÉA�˜ï2CŠ�ÁùÊ<ÈBäÓ‚¡ø(tæ²—°ž r,"N»m»F«ü]„äî' ^ÛùÃ*OáÑ_çsܵ=Œ¤áiR¶ ¹0cY�ß5—¡œ|–3¸¾ ªÈ¬_^Q¸ÙH1P^zJõ§�1T¿x²7DzÖb˃,S¬’$\MñQÞ¾~È•¦ó~’þjn•žºìúÈ]HE…–ÛR�°¨å¯YÝ7í3<à}Eí¼aÈÎFí¬LˆEåP¯q§k3qµêÚ)¢aZ‘ò4ßnˆoß„ÉÐÑ~ÚÓS´é*O¦ÀŸ YÎ8ç*êÆféÍ™ë/è™ßsª§o3ZÕrމÕòC^j¡xáÊÀIÙž ñd¾0úâ|%&hû…é4–.p³F¥ôñ ØÊS¹¥P3¢îV6�¾\_ŸÝ™ ûQ?0Û–¬KÿÖÌÀ�M”±±X^Ê^ž—+Gn> dj6ôKµ.s;sQˆâö®òCã3ÿúÜH"=S«ÓM©8¸U!taÁÓƒb…,�Îb8§�AÖyÇAay \ ñVýšpÁÐÿ†‰›å²°®BŸþ©R/dÿÖçæñ� 'ζ=uÔÔÎÜöþx�ü� KÛ}�e²e4%ŒCkÕ!7 ·¬S¦Ž´�õ.(Ñ7�†ÚHàºl^,ËÂDw½’Êö¶ _ªœóÅö®$?—†±f-Æ8<2âï�“´¿D™x&€¯¥£ÝRáf|„E ä– Êu(ßO�Jtóg0=&¶k„  _³Í·KjŸ†{knB‡)tp/p›q©N”ŽÉÚX¬Oað³CWCD*Ïõ œ…+yu€“±‘I¸dï§\®-aô^_\e;#;'ÖÑÇúVPÈŽA0™ˆmÔAYz¡$p?ezœ“ê½.Bƒ&B�ÜQFô5Q·¸ž“ÕúÀàˆ§Ž.†á ›æ³«aD˜¿tÆqõ¥þwä×tUϘwÀÎ&1NÁÚ.'ÊÄõru#-k"DT�¥G²Ì*5/aZª–‹§¨-)¤ÑŒ€zÍ®¦ud¬cg:yV{!ÐÊ€Ô“–×\¹7…ú '¡%«›nŸk†1aÁx¨€ÎþGn½N§f˜d¢ði~°¹Ò¹Gdƒ eç)U‚¬‰!O ­LÁð‹è&’ÊJkA¸,aK$•›¯MPäp…³¨<ÒMXƒÁ ±¥×}bÆÆÊè‘xj`Ÿaó£Íçh2F]Ùó7ú„ƒp)ÙI(Â6êXÙ ­AªóÆá¹pì`-ìëDPé*p´'Š–¦°iö%¤ïz<ت¶b˳»G«j˜ðóâôyp>wIÙ .g,1½‚ÿ!òʤÔó"§µ–üf•¶M×áH4«ò1É:\”öÇÛ¯“·óæ%w¬•Ÿ”™z…„¯oeÑ &µ|ÖÅ…c·¬I3Ÿ¥sŽÝ4×Ö/·«C4yÜø‹² 2‚yHÆáÙ‘ÃgJ&Æ�Û¤êPcÑ¥­Á.¤*âe¦K–£&NáªesTáY¡äùOvÎ7ªà7fóUo+udÀƒÃ«tG&¦{”x`Lµ J:WÇÏ~cx ?ƒSÜ )ˆÌçòýQ¬%¶¥} ©~"˜ùùçþ;Kþ'tâõêyº¿‡LÞ!µ‰gË�„hJâ� bÉù]ÿ¹"rùõdÕ²Êy�Fk†z†t%Iaé�Žÿº·;©†.ÏJ)JËG�šËŽE/ü«�¿¡ÇŒö0ÝyËí6âZæé@/qöœfF@+ƒó/Ž£:cz–&Þ¹B@x  öÌ|‘(¸Ù7|ж»Íq:‹žfU†-Ûuó¡\… �“òÐZÐĽcÒØgd™ïz?©T†¿×©9v ùŽÝÜÏ+ôš¤ï»ƒQøÎ±R§0äæŸaFã库~…¯_êÅÁÞ¸8¹;�6)×8¡]ô؃_@‡ýÁþ9-.Ìþ ¦Ê kÕ…°¯gµ ¾·}™L\ÐÒ;¾TN°ÛÙ4j!+¸ø­P=‘óãà1\tÝLÑ£dh‚¶À–t9-22d¥á4Ææ¡¢¢MábË>Å| 0”^-ÁbÝLÑ1?½IR¯&ȶó&9«l:±Së^…ñ΃P™ðÞð*?‡9òô_{ �©R~*•¿EYïvÂ�¦õG»ù+À7¡âá"Ø�ϵ–1X¤K¨{�¼ŠwÉ.Ó}Å2pýy#U¦N`]÷|Ǽլ/„^õ$E÷Pp‡²ewƒ&ÒSÊT( Ÿá¿ôªC Û¯ä´À~p¢þH5`l·‡ðV…iŽÞ =�îèsÒM¬ÏñÛÀîôº-s´í~–ÚŒ’�÷~¹ÌÍg> 1’ÐU„¤ù½´#‡h'xÆící"s±•±Ê�˜:ЇXÃBp7¦+ž ¥•žëZåGÓ”9åiø€¬me³Ü 4R Î{’¨BêïÍ ‘¯‰Žnl‰×ÿ‘¿ª¬UY!wvXÕÎJ¡Æ�.Á3ÊFLÑÐu „#š¸hó[7™Ý⨿ '¯Ù–Ö÷qÆÜ†h=ŸR!œ Åé+IÉššÖð*;ew/Õ˜z}æÈQ]ÂdU/ã;”�.¯áö§ùýø­1Wgá£))ŒÇÇ»Z1|Éθt¿'0äè’·[0›#ÑÀI&ïP¡È—j/­k�ç캦/Œé÷Of#ùÔE6æ�…ûÇâÍG/)I×ÃnÁr®Ðö+;¯œUŠ^ ×í�ê¢d·ÚçÚkœäYƒ¦ãØÓº‚Vòbû€gSHåÿ0}U2'ò¾ê;bx´³WŒV¶íR7®W›¤Ên(ÑFc˜OÜYF“¬"Ðu|¹0–Ù_¯¿G„çp¡:q*$›¨ˆÞ˜ŠNÒE 0§@ç®uPÕNi£¥%¾?Ël࿘°¾Eî~CòÞoZ5Ùäý(ÌÇAªŒ©×‹ûáOÅÞÓóܹ°€ñG·«ƒ(×Öþ«ÓTªõb+ÄŒ!¹ \4v‚!÷ÇÈÃZa”|­Rß°ºÖä"€Ô�œóò>SJ–æÐïÎ^è›Hì³òè: ˆñAÔ±¬p*™j=GÑMR‹¶ãìÚQW4îô~Âö Â1OÖÛÃõŸ…;�N.Cà­·cì ÉW›0zìŽO(FgôY¶¢wNöcNi7}FäYRÜýŸ;€Òà-RÄgÃ(.ƒ ìGÙ@‘J@ß`ÀˆY{ž#—q7�ž|ÏÝд ¶à‰eà§DÌlµ¨ï¥½™&±C!}�fÂ)]鱿±¤±oñ$Q7p·¡môgÎzýré«Q¥Ôùý ø!1ú9Žù‚4Iú˜gŒä–§=qÉòàò*ƒ´w PNÇ8úqÊ@e©œú4RÆ•�zÛ]A€‚‹Cè\](ME/àÃrâ‚NOíßß Ï°jÐw¤6 ÝzŸ“ 4ZÅARØ­¬Ÿ)ýªKJ ÉQË)�ÁFž©Áic§šÑõxF4ohoìc µ l³ªfÆ#ó|±Å¨äØ•Ÿ2�Ýîn£_8¤¥m,¼nž°êÇágî§�{§f (|¤ç#+«s-”rÍ.‰­Ó€þkú¦H:$ô† õá�mÔÖ#ª;b‚ v…Ü*¤uK쟭ˆÆÉ²�¡¬D}Õx¾àPÜrßþˆe~aî[xùRyúï9^~V l¢lŠæ>ÃKß­Yk\xÂIz_6<}?ÊÝ^}Mét÷?@×ìj.M1•ŽX‡�T¶+k4’¬ùèE‚MBý7bý{,dkó�Ϻ2b�½>èÞËÑYyC$…¯DÈ_š T®å®ã3müÈÏÝç—6\3·–ª×׌dØZ}»{jÙºéÊ@¨…äjІn±f7ø8u ê4¡%›¬|ÒøÛøu6DÂõ Jÿ: YàôA��˜ î{GÒ3$ËÅ.¼Wÿ‚<|!s‹ãÁzN]z,Xˆ�ŸAC¡Y�„|–GÉ‚ž¾éúm¸Ø©Åæ!ߊö°ikNéu¥:m«–(•Þñx¢Öc‡ªýMK¢EÕýž°R&›2‚øHâ�¸yB "#¾æÍ±Ü)É Ã­Ñ†èn²{,¿=ãóiî$v•À8eÀ†×öƒ†é+±eR±+W×Á>ª»qD-Š©:ƒ(iEÅ%vÀºYÔ¢hWj®C0�÷ògféj Z§Ìuÿ25Lä¸H6»B‚;å `ƒ s…M^Û»˜jàmÛ‘h™ïƒˆ¡­Ú¸Ô²8CΡ"ŽHä]Ú;>¢ÕMš`Èþáé 1™ç„ì£î–Ñ¢ˆý z$½ªÄ8B/$ÍËíâ¢AÑãrµ Íx;5ˆog³FÒé(vØ"9B4íJ„34åßÑó@1˜ê¡‡û ¸­]a™Ók=™lN%½dƒ�q9Q�·[`:Ó>ÃwȪžµuŽôM[‹ï*´Ö—¨Âî\'§,^×3-¬\j|=ð™—èØYn>K¯%Ü™fßœùuÈ<Ꭴ^å‰\ädÚNÙß}ˆ|LHè@¿')¼›™–F~[ë þ¸X/_{ò‹—†Qá˜(Tø«Úìr”››~c7rK7DŽW!7z/Éö»[ƸÂ&hârïŒMRˆGö ‡FJò8„i²ƒ KAë}oöÆ¢ioF@-M?nsqÏ�›ï­‡f'Tú$áŽfDí±ibZ0Ϥ¬7ˆq©öÏÀ�6J5àt¬Vós!ÀJ%• õˆŠd‰ãI£R]U'&£C�Œ1u*L^ 0\ó6:m/—uÞ� KË+þdð HNp‘ÜZìN0¥ú<Él%¸9ÿÓ!¼CŠ�k•ªƒV�u¼ü{±•K‡¨Ã�Œ/kí^ÝatöÃ<§`æ^e=öÞBˆvµÏä*â5ÌÏÙÇõNŽ"[¤¡�¥Â$h‡­§4CEÍQKÁ|³dÙãBòº ñ·¼UDµtGøkÑs äÖ©bÖ@s´‰€ðÒ©ÏAQZVÏ&°Ë~(;£Ær¢bøX r—/Ì•T´W÷hó¨Ô‡¤qÂóZkÒ š2PX¦ƒËÙç¿L¾›¼ýžf”†Z>‚qUg×WÎè-vÜíPÒõslK? ¦ž-ßãï„ê» û'�Ò5™ß–Üý—V¾ªÚ¿“t§�õt»‰Úý’¥�•¯>•µ´ùX¥ÛyѲIº•¯ï�q¤«"/ÄÝÓ.j×HQÑÎEÏ_%[xâßúanÔÝ¥;£‹(ø¯Xm3!ÚçtEÛ] &µ¡-¼Y×ë´ÞL�‚‘ÿË´ƒo—mc¸Pï‰oGhƒñ-PÜ#ë`LÒýJ5LJtÊ>Á9úP˜†Útô×#ixüóÿ€jk¾q¿A}ëÁãˆ_øÉŸ<™yÕ¼9ÒFˆŠóÏ0¨<«t•–uE¹�šh*äæí(>ÃâLæò&û©Z}i›÷?Ê”Í5T:+,‘–{ Ë‘@re:ŸõE¨$¿¡FÄ¥e0´[<�¥U,×7ºE§jd²¶'¸KW�9€ÔŽ{Õ8¢I| FóŽ"2…D] –±sWâ0'¸sbNIÂ8P¤J•ŒlT?Muÿ¶¯“H`b¹ôÃ’�Sâ­ÏÐUf›’ $<0^p\¯ Mé­Š¥CP&UaS¥—àq ¡�»7(ÍKˆ1À ö@ àVÓ„—¿‰ô!ÓÍ ezk|!ƒ ™ ¹[Â#}C„Ô›�¯þW\¤ °Ö_7�‚�Âu Û;¹0w…ƒÄ÷ýëâE‡"Þ�Ul¾‡ýBæå„ô�Ìv>} í‹è]va��Hæ„"Yzƒ“NA˜©O¨ílóJ:¸þ Õg`òÿÀ·²ÊØË)´[Nj™þUÕÔÑn-³¯žÚre7Àtk³Q¡ï^VÝŸJ1Iéßon U©€‚ÝéÒß³mõ€â6(è]*Á™Š Ëâ¹\ ¦Í!§ÂÐò1‚º§æe=@í•sÁèx3¿p¸­!„j&ƒ¬c²š3Yî…,˜4ýÇ�ßÚQb†±„öxŠoR*¹ÿå¶P|äØEÁ¼Ñƒ ‰ÊYõ‘”óY |&oܸò(‡Ìågñ †~<ÙÂ�pÞ=ç¼�pΈ&·1‹›"1+Sœ× ýä;HÁQ`ˆeÝ�r¥/Z‡Ûÿjw0-íG@Àc¬f‰$Cïå?©sˆ¤¶Gã·¾‚<:)€çæTŒ)i÷QÍÈjp „x“?ÅÞ“Îí’‘Ÿ¶¾b¬¤‹ýhxWéé{‘ËW ÚQffGõ6>º/A¿{ƒE‹¿àÈô_äYÁ©†mÂ=…Iå�¥Î«jp«¶Îçôo”ë5WòÖ9:wCî.U®JvË;IŽÑ© AýùÌôºBÁ¯Ño:5¢qˆÄ~Å‘V�fåfd~a Ü÷é¯èÌ7Ól2¡×Òœ¬\ÐÙÎB7HŒõ4è>*¸üAÜ,Œ\-7k|‘´Sd¢@‡¦êc«¾Û³"vJúvëéZHrGè]õŸé¯êû-!RÍ’¨Î‹«.&ãn²Ç‘ÓLUb•àgcé=À³ËÙ®!*#ËYp¿Î^~~�FåüÚº„žt ëÿ(éïÿ+hjÒ¹]hþ·†¦³dRÀ¿9³(s¨â?dOwÂ�8±‘Q�ý2j³ÄÏ;Ìÿ¯]@u_ Í…¢fkb%I,vX’-�ðsFÑ^’í˜Á¿Úù ~ÈJT2n.äåô˜bIT™`–ÛJÁÛ|WV<6�™Œhk’§ÂŒ�Â|‰.æE´ý±ò|Wx(X#5EyÚÿ¿Z±£X.ªì¦…ŸpÐ>Oô¿dr—ãÈÚµi8œM\»�W_BhÒ QÍJÅaĪ“.ËÔh×q²Æ–0^Ú7w‘PI¶­†¿¡˜<„ÚõÐY‚êbÀœ �)‘ì¶äÞê’� #R&àœáð‚̺ cþ›Žþ@ Ù”°lvVD+o§‘"¤Ö׫ ¸ÉßèÚ-Á[,åoÅžZ6@9È’ó÷a¢ºHÕD¨ø"~�Íœa9ð^˜¼5å�5r×sÓõ¶ïë�.6%G�­wOkÒvòÿªõ;ƒéZe–Å¡(ˆ©>\ë�òì³a·4Š>^j¡_¹%ÅBÀôîM»|™’ÓE�`öî]Ì„*8MÅRô2[éú'‡³¿_Ëþ>2jþmÇ~0«+‰ØmAM­E:VØ:˜×:ÉæO^÷•ûÉAýÝÔFÌ¥J¡9>×õ¸��é¦l;:ç ¶ã¸Â%/¹­Žás¦áâÕʲ·KŸc‡½«NÅþÎxŽcÃ>¬Ç0Ç7Ì3z¨f ¶ÊÄý"Ø©·¶qž{ZTãçYD]ŠóÙD¯wÒeÚ•U™!:%å¯ç‚Þ�ÄÇ Üù|AH£gY‹È¶ÞÕž´^±ì–4Ј¨Ãî©Â&u K¢¦DÅ/ߌ³>)«™'™»´srŠrÍtMsþ¦û¾vƒ}ñ%Ÿßržþ‹†¦(Dÿ2 ã^ÚÆ2ûvkäÔ‹¿ o@ƒ MÅšgÑ\ÈCª4@�æéÑÿ�Q@ þÊQò”SÇÀ7øëMœ\Ä}Û pA–¨Lü3@¤²(3¹òkói §o,Ž$ôžöÉÒ©¦Ö|ŸMu"?@g ”©Õš™véC–‡‘„þ”LÇÕôƒ±�.û«Í(,œ"‰–Pkš° 4£0œ4}ù­ÙÆ_Pô3x�†3V¸;ª3ÄIc™sÂÂ5”AòjJ‹9°yû±É5«Õˆc¤.äß=žºÐ©%)À3Ê M"0q.™Ä¨æ§øÛhã£}<-Ù$pú‰.RU€2�1ø�˜d¦-yC\™«ÑÛmÏ[vÕÅ*rô𢫳ˆþ˜`RÛý—/brô ßvÑ�1!¥¬”/hàÏ$šéXgfZ�kéÞ^jP)×ÌZ{ te“ìqb_Àgßr¨ }âM<ße*m›"óéÞ�+'Ü>5Ö®°MÐ?Íò×M¾°Q�tÈêKSfŽ{G¤üþ•“†OMƒN*-�ҤfíÓãX®P´D®YDü¢ufMÙ´n¢#CZN#lÃ0W R²ÙÊéÆ=ðžØ¤×‘‚ÅÀÃ8wÎké¾²ŽÃ‹a¡õž™øZhÍØ™™Ç$ûç]çšRå¶SšË Wá•Ó6aÚ¥´¶ÒÀ¤g»_Ç%ºtøÉÎ3QÍžÚÌ& ûå|s~€À @øzPèÛr¿÷@Wznj<\\  aäô\‘é‰ÉGåëpçœìb¶Ü‡±ÀÚÿÚIh*ÀV¼nö¢—î;reÉ/Úf^ŠÞü :¦íhf¤êMCôõ…r^Ž@³i�àÕ†±‹¢Z&wÎ7B¹bÌcùé¼gIÍC¤�Àm�?=¬[†yÂgrÛŸ+¢,™è3�¯Öµ7¨XÿP'vü¤ÓóH¯N»Ô›_£!-ãkd®ˆîŽ^…(žÀ&ÆOéîCÒɱ¾¥UÖ>h[BE¾¼,�;\SXåDô‰<ûU(u°b'øÔÌ®uoÀKùl_ä)£ÔØÍˆ˜Šmÿ‘Nª”\jcȂ߈? J]„,œp¹ »èd »Bfú\p�}sNÍ 9;€úmÓS"'H·sɆ÷óPŽAæÕŠ4{r<zÜÍR\9%S4š‚gêµ,o¯Úè ÍáÖi”Mier¥Ó_|tš“N‘÷CðBO@wGp}qÝ®ý¶Ç?‚’üüÕ‹ÉbჯÿPòfTcÿ9Nü<Á±µœîZ4ÿ—3ÜÊÒI²OC<³^ÅT± ¿Žç?Gõoód�{é$|ÞuÇe¸‰±<žœ&|ÙúÁ¼Öë�B1-Hʧ.u –sŽt‚ gâm†?ÿ*õ>UÃ5·š_Æ�?½§˜2vrÔô�= õÙáq€þ Ó?Ñ絆ÆJ� ŽÏ¸ÌÆ0/ô•: ÝÞJïugÉ�ǻԷÒÌ�-()×î§2ª<# RNã˜à�”ùh¶˜ñŒŠø±Z­ÚÏ‘öÕyŸü^ÃeÇ·XÅðª¹l4²B¨¬ÊPkbNuÙe¤spÈÕ¥$Ó„ ¤»GŒ}Á»ï®Ä}ãîgѼ#¶&Ù³C“ÅÕ,þÕ*ç2ULï‡ÉgIQ?½ã^½é.ø�‹xÅš‚eóä˜1GQÕäO1§ÿ¸/@§‡hàhbÆî‰c©@^ò~?‰äNý…PSŠ¡NwYT ê*?Ÿbé;Î.™C_ «‰ ­lŒq@š‡|w¿ˆö¨Ta(•F^ÊÅgïdULN†ÓÄp0…Sgã��é|eÇ!ýKE6¨]ÔrÏX8ñðã°K%žú…z�$Ä=«‡‡ÚhÖ$1�L™bþ½KDO�;sÓåã'€žc´·ç1»éCb¶ð¤+¿VC;ÈüÂ[ÏAÛíÇGÊW|-)¥‹x䬑Ãå^â­d�~UÐFbá¹45ƒZg4ÎcÈ,w4βpøHÓŸ/.øMÌåÞFÛ%ù–<´Ð`�èwcáu=ˆ¥ùtÐÞŽ �H=Á»9ÏU •{¹Ý§ Ĩ=ýÛR»W•èÈMœ‰§ÌjÉß÷²¼¦Üëé“Á�ßeé=M"®yÆÚÓÎĆ^*¹¡&NÒ…�ò„“·÷ÇÅÌ Ðë�/žÐôøˆ•›�vÇßn5ýô¨—mªé3Ú=8ãSÀ±¡}S{ÓÖ…2�$„;Š“¸ÍÙÉ€³P �¼%9u»ÐÖü @âÌ~¸èÝ[†�^ñ²1’t¥L0‰.a2áQ+“rŽ`~Ü9Ú&�QÁæg€„ËR�¶WÝ>Ðyìˆ^)6Ï2N1r¬÷e¶š\ØeV¸Ä—6w òÄk#s­¶ò~�—[™æ…vvúÁçi)ÕižT@­,µJÅ\ÒÁ{ºXuv.%]zQ›ETU/Z�¥[q¦96eÏ�v5”óç³Ä9ÃPóѱ” ìc�þJ79¡_ŒZø×)©s3…–\œE8?n:J|ìëæŸPP«Cèkh•¤d:cëÁ*i7tsŠÜ�j,¾~œÐî²`5|2¸L4O=¨¤çQS^APlÓÅ“d4Ù C/F¿‰²ÎâuܶÀܾ�Ý“Z­îÎÒ ¿{̘%ã�Bà€é:±Â“g`¨êµ09¼!œè÷ržª‘¿Fœ½|Û …³ÀÇøÆ‹¾×0¼j“$8Ë ‰ðw6oug0„Çä¼Ab½·ð‡ ™ê2-ïŸc’~금*ó€Æ5Æ$*É?†L«)ãU\ÕƒD]GôŸÞ°‹ÈWJ—{O}››à T‹v@Á»¬S¦·Ó0~Ü¢�ý¡[ñR7ÓVE¶‹r—1BœTÆyoå`Ä^?Hëf–Þ)ß‹$·²îǵÙiÅÂÌÈBdϽ·øþ¾ö/ªMÛMÈÂB–ý€e²®ã5#ñìׄE†r#X+_&g�4Qƒv0+GÒt/Šøs�dFN Ë \ê7¦ó™¡~ CóÁ©w0UQkFbhPàʲ´A_C_#ð<ÚX-Y�(Kúô)%:L>È$LöB®FR ¾#½‰ìŽ>…‚8Å:ÚæˆÒ%„kšžÓ6јv¦ôŽÞ]ÜdîÅü-Z…�Œ¯nº•MÜš ;+taâ¢áFïO ¨™Œ%'ÆâÏ…ø8Èf3`¿È­ x¡ˆAèÜÔ³(Œ�ïry%—Y�2ï ŸÊ(‹©íé„©ôï%+*$o ±£‡£�“¯cR»+ýp7!žÒ\ÔGt}Úz(Ê›�`ä$8 üøU‡äœö+©¬»äåÔßä\ë*ï{6ûJ}±'z\%Ë‘›¾Þ-n·(�>ùÖ�úW©¾™™°\X¬´Ö!}ŠÅú@‘=% Ç@¯ O>ñ] ߸ 4Û=2ɪ½³¢èlÁ>¥-�õŽÊ3•A|AçA‹Oµ0Á Å4z>k‚„CM#‰8‘L¼èØ­‚s¬IýÓªZ$Ñ—âfám8xó'"9‘ Œ©Ø/L–3‚m[” M~dœ�å~¼ô’• ¢™¥0o3[¤”Æ)î–85’[·Ã8Ûl…¦RðøôË¢ûºtC…T¹ä¢²]\E1(i §^ަÉÖÕ='PÅ�2ñ×VÉ�öNñ;6oÒïLï…âø¹å”ÞëÂzß5Ó´_COsÐÕÅÆ°¤¦ÊùÒj”»váH§jô)ɯ ì[£pœ¾ÁŒjÏ@mH?©´ºRßóJL]§‹ëyNeDQ”÷Ó^¹ï½ˆìã„ áÎûÓUGÚo>ö%fèèˆR!!°ã¼™Í$'e†ÕLÒÃë­½÷¹÷­àI(Å¡.À?®TÑ(Ïúüg }ßÕ&½Tƒô$|5Ÿœ¨_ßÙ¹ÕùéH0öuU �žNaÓ =7DVÙN!#(¹÷."p �ª;C±8š ܧÌ=…óIÐ/ZºX–Ìç�¤i»wp‹vÚœˆ\!ª«(Ö?Ü(bœ[>c«…¬ÃÓ$ÌBXœON»Ôõ EMžño„gpÇAr±9¥êI÷³æ—rñ€† æ!w�N�>‘[ô%QØá‘pqôDjŠÚ€xAtCÄ>”Ü:a;† à×�†O+¼n8•h…sgtJ/ä÷±7ˆ7c–Ÿ[ç»–J+²’7½sNé­IøÒ»ë±<�Â�½¡Ã‘Qfïû[Þ ¾m{¥‹ê:¨ 3+>i ù`Å+[”�þ•`_#éÌômde‹³ÖÞqþ§Ïe o/‰¾áÕ rEDëx¿õÎÌŸ6Å'–MhÞé[%lØ�í0ÖÔhÐ Õ±1¤e¯�x@<¹C¨•Š�ªxÙ\¶ÛÏêYðÈuwýT¸7@ŠÝµšÜ¨Ñw¢Z[}m£®¦]9è}ÐSm~ Êhéb·X˜ï”OgEb½mè1DoÛË0s�–“ÝóRzâa„ˆaµ¹*õÃë†t0ˆ¢†¿˜Þ*ð)Þ%Öû˜¤CP7ñ®²¿áiâ×üÌœ«Ê5")™A¡”Ú„¹=¶Ù¡WÉJhí Ê1îÏR„k�SoËO?þé¾ÞÁÔóRÐö~¿ºžIÕ牢y1 —9ÞJ íR¼¥Õ®Cúƒ²¶òägEn3è}”²íAiïn'4Å?Z#×2Uí†".fÕ¥ ’סïí‰n hìaeŽlFbÎÎÜ› ?1ä„Ëá”&Öì| ‰è†ÿ)í+ñ³9âd1š´Äc—üiâFä˜ü…½Ý~âU2,ª@ApY£eµÈˆ¹„a: A|½Ûõ|Règ“„ƒþØ¥Re#c%¹çº…{¼í^ÍQÖ ®›‰x'•4]†ÈW4ðë0Dm| Òlr�b�ÍvUI¥áhjTÛ(Õ*ÞK¼”ŸNmUŸ{1KpÜ­Ÿ­/^U‡µ$߯: ¬kÏJ=ù÷ÿzQ©±é0¹Ï‘ÛXü{µÃÂ-3ÇëÃÍ#–³�¦(�ûY ’)XHÉ;͘®–\žƒÂº2(�ý¢Í@kÚùÂGÜ5È–�s®æåÛä�¹¯erÄ÷Ò´õXE†�%Íê›é5"—´‡ÁÀAq°Îî@¸¿#ÙZ€òPÿ#¡"a0š}…±ShDkGqEPôY3‡KVtJñ"L¦Ç=Ô_oPñ'Ù“up¬åOãm8'—‡,ÛÅ„Κ[5èÿß (º¢ˆ_<5 übÍrË×a¸¬j͆!Dz'm&…¼`ZÏò݉¶Â}M�ÀÿçÄpX‘løI§FÜJn«~„¸ÙÜ5˜wÅ6Ì!ˆzˆP°:|-Z5÷#£aS-QdýÙƒ‚?JIÉó ¢ñä#O‚Ÿ[ßøÚ•jG3TçFÙƒnÓ|BÏz`óÚ×Ó�jUt릳vÞ]ñ¡ýv^qo{€¤ Õñ–Þåê€÷ÄÀµM¤)�îaH¸ß“—a«àK…KÐNÿŽS3vÁ«·š4Ê.æ><ü`„|ØÌ µÒ …>©®i|ZÅÆz[ïßµ4ì©>˜\t´}´ü7~5éuK¤@ºoÝãÙg›yÌR™™ìÅ�úÊ鿽‹~6ú�¦,lðwOW<=¶kò+Ѷ!²§�Q׳�K(åÔàÖ•ïlc.ñ¿Ž±e:lÑ4^ý r'—A]º%ƒƒ‘;­åM ïòHfm:ë= à ‘ÖSì›s޼J‘E·iÏ(ˆŸO'…�úJ‹ûÕñilØGú'ŸáùÚè^>«"• íšG¹çXÅY<,q;ƒ7F»�Û„*$QÓ¯4þ7#ØÄûZ9 ³ëŒ9®Ž¾OÉtl{#f�²&ˆxÿ31¾d#ÿŒ›:‚k6¤©GÙ½:‰W%–ìÂÙö#¨ºœ¹ÌËb Þƒþ£­�¢¨¤v˜íT>˜rÒy%÷QÊÊâQ&רN¨ùŸåõĠã3Œ�_bìê�fÛ(/(¨JL‘LÁ€T容K~Þ0+I­x¼³so‚4.u¤|Ddƒ%e~ãKš·ÔèŽõ¼4Q•Ï{Ñöð”ú•(=I]6²ÿ_#Ên±˜Ü—ñÅÂnGo¡Æð´*7«¦*(PzŸý ÍÊ—±ïfB;99;»xz�o_‡êD•eßûSXÿTÄ$NÛ=æçãªHg�:®Dr³káHy×G!ûÏè‹pÅ�e…„Ú´$Ú‰m?Š­ŒŸØ‚àÏÏ�Pb6UôŸpòDc ÛW³ê¸Wmåí�âžÊïÒf—¥gXŽ>É(2âB÷¹'ÁÖxÆŒINœt ¼FÅÎ~ëŸù–Þ§¶Qi£ÖcS–82™Ï—Îy5Ðð·É;YgÛÀª)âsÇ8™fö¸÷Bú"9�®õèw k4•¿¯6¹ù˜Fí šþh$"Æ´8ù„åð&¼^\r!Á€£‰‘Æ@d|€ðŒSÐÆŽ¸±Ÿ]óv­à4ML@çÌ'ð€“«FÆ-Á@-\±Ø.ÆújÛ ’ýÜË3«ÁÒBm:þ-èGר]°®?é}ÑõøAêqUø¬ž�;ˆçz´8°:À½ÍÔñÊÄx‘rjcérª†©Q'iü�þwÐÎ ”�>`Éû´,’qâÕI¸•è+†ÙPê�: ™&Eaí¢kq d­S¥¥'Î6nx0¬ÛÂ%EôŒÒJ—Ù0 53�;ñïAªzr%¥œ÷TÅýò¥ �£QA‡ê¤ Lþa¹�Ò®fŽÅw²À�Ü©ðìhpƒ7ña2#ì:,öïHÏâúZA8w@Y1P+Êro8vóHSø�&/´Ëü\Û`�î=²¡r)ÅBƒl\”ê2Ô®6¨¿ñþ–Ø)éJ‡‰ ÀŽë�r>¡2”«Z«z:”üEÕ®Á~Ù't_«k'äÙê­! ^,ôw2¯¸‹‘‚ÅmíQøŠ Ô…ržñ*—T$ϾäZÈt×ˉ䕗ví¬�×…ŒGX¼°ÅK)¿)èÝ0|D„��Á>òÅõÙ¡ñŒ iËÍ>ÂØà”é™ßß@�Ù‚T°�ùAè*/[öH‘ªŽ¸ƒ=qÀ ЄçðkD6v¢~ûf}hjX6v^;¾ Z‡¯3ü³IŸ†\•t8±�Ž€%~@øjx—üp1L“\ÿ‚ÿ@ô†¤t¦Á—'¬„� 쵂ÉñR3J$‡!xYŸÎÎW âx¸ª\RŽ$BBæóáet5ÊÊì1fÀ[±¹HÙF®.—¾F‡Ö¼¼LÓh&¶a:RèÞPþ&j$NïLüj0ÌÜP⠚ɘ$ðæö²8 ùJSÈ«L,G.øyýu=ÜD´êÜ’ã][?:¨B£:`€¹‚ ÇÒ@Qh·ˆX Y´{† Vº‚z»G3I�öy†^OÒ3*ò]Âéq7~Ó«Ý+,̓2§÷Êèš·ÙÀïþ†BæÊ—…•™6=èìŽãJ1¼ï¼‹\BC™æ£š]>?]'ðFNìí.ª ö"ð%C~ä«+z‰O>“ÖV¥'v+Ï›vŸ¥À°âÊÆ µ™Î,,(„D¡m²+2 †ûÃÁõ|þŒ50]/@²]¯…Nøsÿ¶4¬`ÝáØâýYUå`¸hÇÌYpÁ6—gnRœ³CMe‰ö¡£…K\su}Õ~†ñçþ%NñÝù\ҖΤe! Ùñ뺢/bÈÙŒ6«þ¦ŠâNþt”/ÑU&æþx‘?úâéK 0éÏ27ëøW—àaS#b|™»ŸiÊá¾`¾©{Â(ó� M¹öjvžœôØ45VmÔA^d�’ÂÇ!½q¤>÷Æ ÜZ•LŸâýí‰-¬Ýf$%Cƒ£ †®| G\(Pj£=k·Rq*è®¶Wáî£�héŸt/kãp†ç¤c~Ðý>ˆÄÚx >5síጪŔ›7�ÌEZj3^qóßaÂjå7QÓGª{8wÄ":¤UÓ�AÁ)䄿ù}ôC¯Êš¶ÓòÝìÿ»©LÝôžœ¹G£ÇÀ}W]5Íÿu.c=“Y�Õ,)µY¸‹Ò€e©,åƒ`ñ bTTñ†�`o®Îyçz6æL†ŽþÙRømʉ¦®P�$뤓ZÄ€3–È„ìêßâv;6ú'‚IIfb5SܰŸyøæY)tXú¨DÊàÆÐŠx\kyÞôÞ`ðωSNÅgõÈ‡Ûæî=ŽûÌVä’JîÑž#°PE‹ÇFW°1‚·µîð9[è¹í`%=#�’£U7uW¶Ìj��ÁŒ\)ñ†‹ÒÞ�°õ6öp`·õ¯¥ÈSø^@Ê?ýÅkÚ?� Rt¿sÔe|õ]›^»]x¯‚Ô‡U>Uháâª]Lt«™í¤ª«�ÙËp)Ã,®ÊCB?OÉHìžh] G¢ÅŽ�s%²�Š 9¢MàÏD‘Ãø/ȵµ”=L#¢Œ¶ã¤[Ô³pòÅ´~«÷ª@ˆ)WÜéFÍÏ6ôëÓœ« ¤ÒÄÊcœí‚N@X¹.u¯©’¼XV•äß]Š”DäïË/€£óoÞúsèj* ³X:R»‹™¤7Il¬W²lüEÏÂ9™lGßò8t Ì· ʤ~á(;â/¤ö^M€–Èð7CªEñ-ñ—æ/žx®48ªh;¦âMÌÕò|3Yñ‰¨å¿¾ªY3Òæ£¥qX! y<ŽcœÕEPg ëÕí�å R3#ùóã〸QŸJ¾j<#Þ ýŒ¦û"CàÎ]\~XÏ“ëÊNh“xc 3¡`pâq@A!7 ÙHï{Ó°-{[~ÆWXà…õVaÝjOeáÝ�h«!ãT=G8O“R'õ;×yà¥ØèÙ�¹Ý)H@&ú‹ï{ª«qj\RßV"ávº�O,Ȧ]ÉP!cœŽAÞ�ùƒÎÍpB¬œ¥rËð‹†ˆÿÞ¸"̃4ªó«»TG²co""ÍtÆ/ �ÑùÂÊà"�ïIbïß?ø,(‰=& �*²¨�åyþ(Òc˜RP¹ b—³ä�Ç8SC2)+³½oà÷Ƥòöm™Ófÿl³]»ˆÒÏ�³lˆæç]¡ÑnL·aeØ’¥jÜbï!:ì^š– »p@zØÙ‘ãÔ§ƒ·%ÓMü>ìI·”RBH ûU_#kMåWÙ w:rg/–°US׿»N\T.Ó¦†¦}(¿¹;jjeüêA¼kI‡Ö{•PvÛœƒ‚'Pñ±_ÖÓrÀTö5ÿw8»JS^~æ×Á(ø‘7ï�ô«ßØ{ÉЕ‹[ÑÑ×kˆù&Â)ÌEza§Š$—>W¢‹Âð¡{� îò— èÐX`+×_|�l8�ù¥œ:ÇÇY?‚¿^Ú•T ÊëT±*”qò.óÐCeÛü§!”ñf®fÎ’ä¼ÎVº¨±S¡Ô@±e‚[¹xÿT›½‘ÝU¡v»B6¯—¤D®ûúådÙ·¸/cÖ’~A¾šéW\ü'Œ×U±©Åi¦dw𕤚�åR­ãÖ Ž þÎVëlª9fA½—‹PWsŽˆÉÛNèën�@ì/î¢S=ª Z�¹ˆ~LŠˆÍOõÚæ:â´¤ë\CÀÉŒ' bÔrÏ2à¥ÜýUؤ<áížD…ûÇ¢;ÛÔEaá�«…ò‡f¿Xª@êéÌ7uR+×%šØ°*Ø|õìf¼Òq!¸ó;ËâªOµÉm¥6'-[0¢ü�³¡²J‘®x GopöùYÀY€ko@j�Ã…ÊXïA •Tnö�ú-MhBo²XmùÒ€F†» àâÇÂH Ep˹Ê@ì”T³µÚ«“jÁïJ¹ÎíLR^  LÉWß—§èé»ö@�°ÿåÜ‚:ø ð »w”:á®Ú5ó6ÔM/‡Oa¥´¥/Þ)X½ÙpfË7|oÙFá¢Ê4Ì•}(&ž«b¸« Ø1hrC> í;<¢´ùM¯Žã�†F½¶·ñRÉ:żoý˜g1×éò‘³�‚Ñë­7„†+eöKpô*S!·¹A0¹}©ÔØ’1weèÁ°°ì•\º�ÒVVxZXY†,Ñ´ù¶ÎеíDQåfIÀ*éP}ÛÜíe?Ýæ—7)¸ØelÈèÒ{�¼á¡¿·w"%7ÁàFŽŽºÈis=ä%KWTc¸�ÔD)¿®JòЪøiH5QF�ÎawX¨níPÐß{ú>èÀ ¹x¥0W¼Ã¶-*=žs�ñ+9ñÃ%_/!$6B¼b«cg ­´´JÊì¼c�11äM⢟ ñP¿¸ê`¼¤Ê»Ø¡“rÊЯÒú7cê…Ùº Å\¨�º÷å2œÿÍ ýŠF0½Œ×%XÎoasˆKÃhýõ§vè®.L 3·MÓ–tJ4:Xë‹F+§qH 6I¼‹m«JX[ƒA*ž’ ´T’a ™J–tAsN<«"š*Öv`0 A%¼�ÁTâŠüÞ+ýïÀ 7Xï|›mp%‚�$•,}Ê]ÃG~Ñ2}!pL¤jÒ÷‹•éžJ¹}’©ÞoJçöЈÅÁšÑ¥ÞuÊü½îòçU?•à#�‰ˆ |Pñ¾Z|ìØ2ȬxpúYÌý�æ—ÉÃÑ-È$�¨’-üñªf£ióæšxDø‘¾B”c¦p�0^.w¢´´¬?$ ŸA_À‡Î€ÙÇê¼:¾~Ou�Ÿç ×ÄT¹üB.ñ€ì�󊕃…;–™ß䉸/–¶¦®³íT"Z¼ ]®ê_²ž¹>ú8‹—_å4‚Ú‚ @cºË×(á>-hà‹lCÙ{Z¢‘on© N¥G„¸>KNç¶;cÙÑàI±4´KòñF¿t�i"-qjj Ï—E­�q�³8[})ÄŠ$1<�0ŒkBpÊ"5OšºÅqÚ˜žéWo9E¿˜`EŸ„¼¶¥ï‡êkV°®<œ÷òx›²d%i±¾N„´VÜ”—w©ÏŒ^/s-zò1ƒ»0Ö¨"ÒÌϣ¥ué0‰•T"˜ó>‘J$‘ôÏÃdÍѹOŽVM){‚±•J‰�YQ5½¸ŸR}ÒH¥,u‡ –×UöV ìQ¯…ÂÅ8�’FD^†!>L‹ƒúr¤Hjˆgñ„ eô’ώˇ \3#03a�$âüÑÒ™i)¥æcN@KÍÆÉÓì‡YyêlE”Æmè¿ÛuŽ¿r\9:Æç%ªú„œÞDº¢ ‡àÉcÝÌrƒ¸ç´=¶˜­º$”�AÝÔ£?¦ ˜-)VÌ QÈEÌ-8 ééžJ­5Aÿy)¥Ø<9�VB…›sP#ó?Í7óE®‚ ‰Rÿ(ñþË!lmbW ¸óùù9…œ¥[0 ±Š‰7@äÆ"“ûÆ÷Æâld`Š �ÿ»jPïQRœÔ ‡ÍÙ¤"ç�_�¶€í!â3RЙEoÎôïææ,“¬)'¦<ýÅÊdýØÞožÚ÷ÎöDù/³e�@òm,Æ@ 3_ïOI Çáöél¶Jš§Ãv§>f… |žüÆå”2r‘Jz–°ó‰‡è d‹ª�ÞiGユ½Q†©@B¿‡'ÄQíºA;ÏDKgåa ›FCŠ¢•JË7{>¢ÈC™v/béTÀ84 `¶°À±/v’EùÚ³š 0­l€îêàîÖoÜ=ªð™bµ¤ àWjT ºw0\K\}©¦s¬Uq¨9ÛöÎìm—M�ú _×ß¡_”²ƒñò&=ZgD¡<Ò †Kßõ�ï±É¾|̨¡ßçà™~׳ð«répOH‚ã¿Ü¬Ær6T›õÓÀ´  •3X%3¤,g}Ò«`Ž_Lq¢r&Âr_™‡#HG›²æ8¹}¿5qÙ"yÝç½Í%¥©K§‚îáÐFUŸ�ÿfD R/YäS³x=rc­%rŠ'ªÜ·? p/t¢&•÷¬ YòÚ d².þå�n<Ä+;c¦·HxE™ ã¹Â`â 6£�]·ÐnKVS6zVDz´}–d£«ìœ‹=Â!:_ xäFU©Óf0š$ðA$”Ö/ÎÞLy:ÁBñÝq0× dr‚ шk¢ü.À¼45©‰Y{©Ø>eUcá$°È4' ºÚÏŽUãTåGEX Æ”Ç׊¡dЊîÔ-pöã’©1¨�z©¹úµˆ_Ø)y\díP³_‘í{jû¹î‡x¥C u5Öí_Vêò±Ð;T}Ý‘‹~jç¼gÎ4ͳ!Á”°,ÚØóv/CÈÉg|€“ÜB•ËïÇTÁêØ?þCÏÕK¸A©S4VH[p AÁKžÇe ßO`²´ö¢¡²�p´�éÛûÌÄ äzŽù�óµ‰�SÅCÖb:Ñç–å½>Ì6ˆ)”¶ÇiØT‹rÍ{êåÃkb¹·#hFIß!{ ›x‹€l�~šÍ¯F2‡Vþsÿ‹™C 6šÏVÓö ì8Ÿø�â¦ÎB ã¯ßëMk‰Ìƒ¸…vÕÇК×è‹§}ðu�šÙo–sœª¼A<ÏÒÒíæË?�›”ÝâgËØìYº�¿xå±|Š4htáÊÌEW’òTÅ‚Å;  óÆ÷÷§Ôu€‘ÛŠj´æu�+f®‚TŠÀŠ˜3°ÞŽn Ð €•ËBŒ_G…šú> ( Þ íßòe9„›ZC$Ú˜%Ç«s/ ŠJJXœÆ½=Š¿ÿCê2TM±aŒuem¨Óò†C�ën\f’¶ˆcæbÝ–Vt¯Ëz6¡Ø!cÁEÝf–ÜÞcQ ©;æÙJ¬ô攵.™ôI�tä&ƒ)@(ÖÅûp×ÿª*ö½ÁaÅ* ¾vûO(¦v‘î¥_[&ŠâºbYÇÑy„ýÙ1™j¶�uz—Ø’@(ýÑà–‘ò.­/µ~<ûz¡#{9{ƒA ™23Û!r½£í Ðl¡@©ø2¬7½Z@;6Vð”7ÑÆïÕÔ*�(%ssÔó¤:ˆXÞ6z¿ÅøÚüö?nxU°U.B˜P ²»6â|¥«‘kç$›?�ýõa‰Zs(ÃùŸOåƒ�Žš �°0Õyp !£@0+53•pÅD}QsÁéµ<$™�^UÈL|j]ŽÐ;*™ äfÓÞ¥Y™m22¦AÚFbr“#xs %�!WçE W!æ4;÷9IGûR5ÛJI5ç€%ð¯²P„ÿ㾓“�8Vøú+¿©X'+ Uºˆn+ ;/$ˆV§“Öb‡O¤v ¼Ê”¸œ:`ÀYËÓnèþ0i×’LIÑPBfþ·+“@qŸº÷{®ÌÅÅüVEy(²:¨¼¹X€ê«„Ì^þ’+´åYkç×24û6ÄØÝÃg)i[—\VÍ t ‘¸9p'?*²,½>k݆å9æ*P¤üD'5õ¨|D¥u„VlÔ§åÌ>ßXñä5Ò÷ä—Ù6`î½�®rbŽEMÿ†5Ä™ '‰|6ï�íAtÏW*0Á§ßv¹qß±ŠáALå.î›Èš~èäÛ7Ò ïõ•#.‰6'FqÍaè6CCãw|ñ¶kþ�ÿ('¼ Y-mØ™€ŸÈÜœj‹Ö?™òšÞë  .Æ}¤€œFñÑ LJR(N›:Iz.ÉÈç6„ìÑb‚?X=ÏŹùɾt@ƒ«ÔnÄÊß@¾Ë`݇W”™Tf¥šíz"Ò�AÐ-·×Oy�feó'Z®3KØ™õŸPàév_—Ù’Zû,cÿþÝü×nÃÛþDglâ³ WS%Í îÌÎÄhF uE ¾`áyŽ¡EJ„N0¸Ì={MR þN·ÆóÁÌQ58s3ûöåq‹˜é‹‘CýØÅ<ÜÞ’ç�´\]8q1e¥ÎÇiziÆÐXüýÙ¨Þ"†©>(fŸöZÚ 'pqµ’-äçG7agÌ­C/pgâ:ºÑ“§•¥b¯éß*WþÅpLå¥k¢œx�ùèøÄæ­[‚&عɴ>'{â—T—¼R,6Xƒ¡ÛДï�wƒb„€�ÙåÚ…¿ïm„z\Ö…5ò:ëÉ!*¹g½|¿‡·˜õX{ö\Jµ}…ÔÌäØRY�/Í÷åYãj\‹>aä׿Þ^¯�Žð»Üýú·8^'ArŒSF]!'ó†%ý_µ½¥SNÁxªà §uœ}€ÔvceË.~ð>”k¢—œÏÝ6¼·Œª²¤-lJó³Ît.fû�ÝWìû <4äê{‹u › }AœÅoIË¥ëm¸s¹zž‚È£Á|Öç½�Hõâ¾Ãîs%MÔv¡n–&i—eÞàU÷@Q•šÙ”ûßÕvF›P¦e‡ã‹ÇôÔ�Œcu@é³7ŠYty}ÔáàŸoÏ1\—îǾ :í$Yª(×ø·HþÉÝfßЪ¡svahÏÛóüòÍÈžŽ{%�èr”®ÓèE0\=ôÿÑöõ€}¦\ýäÁNâĦD9/,ÚŸ�|‹Z†áñêŸhÈC¾ó}‚¹’…^<“²G)GµÖÝ쀭NeŒW¯¡%JØ�X¦åý^ÍÚ'¿{;ù¯â=åƒá– î‘i'Æ~.‚QQª„=­" s¥ûy×P=gƒ¢ ‹ÌuƒÎsh- ¥<ï—­X·˜Ç�™¡aUe±ê¯/¦½kO|2‘³&¾|ß „·Ã½O¶Î"M_\÷Šée—+iüJQï¬â´¡.|ŒAÞ rþàÈê°£ºØhJCÈ­i�OfðENú{ÚCå=âè'n}G�î,C`FDôÓ)õŽª^<ñu¶ç¾³ qZö¢½êIú<Ý«M×hð« ¡sòÇ @<ÆMÃ)/Þl}•Að3Û“ªYìëŸ}G6û.Hq곩ÉãuCòû.&ŸÜiª™T$�²â !¶óÝ$ÿAvïÊ¿M ?«E“Ÿ¤lUî¬!<{Oܲú¿Ž±�÷ßaç³D/3‚‡ØPåï[Ù6þ¥©ëŒ?ƒ½Ø·‹_›î»­‘µCiŒ”ÔHòÅ' U™ãÒðŒæR¯�ŒÄ¬y{¥«ËþElPh#.ÄTðç8òŒþ3| ²PÚ_AE‚6›xÂe‘„fŽ.91ªàÔhÖÒ‚_O$ÍÿSÙ° ókÀ8ö’6¦ZÄD ü�È<öRç;�g] )¹…l•ó²'qἺÄE?ÌôÐÀÀª,£Yœ²nÜvè§³ôÇ|û�a ÿAOÔ€€kvl9³Ú�|ÝÌú%QbÆw�iR/ô/ìuµž0bá„\” K‘(Z!p½�X.Ôô@ M úŽëÜ �U\„0à=+þí¬¶åBÎÄEй uϩօ.\‰~áê‘t2s×¶Âäè¸ÇT@Ñ¥w‰™á`Å­Ö<Àøú¨—#Œ£sÁªÇcÖ±8ü°W�M*C,`¿ÇáÑfêhw刪C¸[=¦Ê9ó"îA±ß øz1Ðü”Ìšb½i]ÃŒI™bŽHÌÕ–Õw}ÜAK :}ÎÖ÷€`6NhÁ|´:å�Þï4"¸W{Mô–Ÿ÷åæþkÇÇéôôZ‰÷t©ÌÕÞl%ÓZçÓú5Ej3F—¨£ Ô_CòmÝ w®¿�¡.7÷-ꌙbÅsbõ( `„E2r™‹ÅêtG{­’ñôÚgôÿzB@üðJ¢:–§ZFÃh1îYž÷ᯅìt4Ž7TO÷ÑKš‘y‹hà Þ3¶‚« 2Œq~ )=Åa,½QˆYá(a(V˜¸ü¿›àüþ2€CÞÛú =ÕIª] éèín ÏxΗò>‰¡A¯‘E.;UêHSxD6±ËyÅq­ÔÆ|�É›Œ&%Y8�%à™=ªŸ|[°jó.t‰×¡ïíâôïBÓ 0#ËO>!YøºšíbÛô„ü-2¾ÊЪã3£(â'¿‡˜#?9ZF3l×ÔóiìpÎîiÛQæ³DŕЅ o¸Wœ�šœ&]"T¿ˆkæìtuÂ^¿s´¬BÎKš]<ÎæúA"¹œí¡$C·sUGäb¨$îækÙ¹ÃA.ž¶fçyöMå‹dòoîŽ Ø!Vƒá¯¾© �ÿº¨ÿ6`$äèÍÿÏ .Ÿ5Ëè²¾763--þ¥…Õ!ð¦ 0A*YFwVõ©±„ ˜K)‡¹;ÛÛ5òS.~¿—e ,¢ÿ�hA6Íòñxfo–’G×bOmº"Æô9uQ > %Xâ÷UÈÜü¨;Q$]Žg^Ñ  -ßyT«``x¡£ùo²·ÝGHÔªÈÒ©IÌj¦„f~)õQ 5ªv1Y¨&{©N|'—ÏõdžÃåMÞ)V¨’Ì0Œ  +0k+åÙ€ ƒI±¿Ï»ØO§ý/_òV)Ð9 0ÄÕ Úˆç˜Œ{d+Yß®&¤§Á's‚ÍiVåR®™eÍS¿s,"«Ïçn-¬3·Ú�›¦ÐPŸÉÛ¢CŠ'd€+÷¡>7ÄHh>åcè%�uT¿ÎO"�íÄ·ô,7káQÞ;°p{7›ÃzçŒtZG+ëkja(«-eßнýª>awÙ_[n�œÒ{¤¸þK�š…¾â0|ÛPÚëÓÝh;Ê‘a0˜ö¾œ>ùõŽ S €™~czo<“"íº88aZب‡àxÎUê;Ã¥†…¿×„¸*5î#Nqq»‚\‚¾ûb“Íüg/#pQ|ñU5 Ïb­w"¨zÖg!÷›ó®¾/�xülÏð)çá#ëô�ê{Á?ùÞþpZ¾†#ÞšŒûùçŸz›7¤u`B�"©³ ü𦡖»‚&†>�;ÿÄ8Æ­_óè17Þd×·PÙ—n'3žwrÇü­GÙ ¶ï3a¨¯j‘5Òù˜?u<ç¦X5Ëíh·ÎñÝ_~LqõøYÉžû '&»{Á=¾.=)!QÄ(³´G©imƒ­Ì rE§ØÈªK³&ûλCâ¶þé»[�Q2Wc+Hºòô¼�­u!a±R*TL™•î@ÉÙÝY¾æhÿ)rA–°äÖ;‹“Ð’?Þ–g•5@TCc׃“&ÒôÜ�ÖGÕʹ •WùØõEK, R@¯ÙïB  Yb>Oá;§X6»Q@T´< sè¯e¦'Ä¡ó9ÖÔ(jŒôkÔ0·�†¬'{¨ÐÕöÏ*ã.,Jr¸%"£ª_ÔK„ü|þÚoÎÒoNYH»“Õ`º4IJ鹨õyˆú} «£`îa»Å¶¾L»BÀ­ÅŠ[¾áÕ Š„/ô:<™±õ ¼ÐË¸×øŽhy7"ï%’š4¤  ZÕŽœ™+®�ÖrË©q”_b!@U÷¢Ç?Ÿ�­QùwÖtX0¿J›dzay7¯5ök.ïqqÙbg�,–:KU°m.Š?~ar�â��·µëòB3Üyp¾rãZ—д]ˆ­sk”pl-s&ôx°?´ÜUÐ0ÄT¨ß¡ ¬|FÿMu ‹+²àоû¡Q!“Ǣ§Ç�‰®k”!®Fx³PŒ?eƒ=1ø†$ÿo×Ï3p@2ˆZ‰pÚê€+ÝÞC(úIò®üG’¥û1x“÷ÛׇðdX—,Iì `�1G=@n¶ÆØãr Â-pËŒ‹OŸ\”�‡K3¶[ÀåÖ $Ýñ%@¨`pd´2ùhDè`ÄFÖã߯Ÿ§­Í­�í€sV×IŽÿ rÐLåÏnAMȩبi^ª2U%¶ 6Ndq?—žêXÙè<¡éyΊ—`æ¨AĦX§MK+V�Í�€ ë$2Ÿ—[L E†Nr:M„–çÀXÖ¼N£~³ë²Óf࿯Ö=.a@o®Bþ:Ý¢(EÁôfoÊ-µ‹^ZñÚ† œé9Úâû'Ô*9¾CrM0³]Hú…bÿ–áÿLÌZÿ»ßr|KuZ+obvÒØ1lù:G"¼yßY dm~0¥¹¢d+eÇ$æ_»�5UÛðöfÚ gèÛB/c'š vcÊq¬C’ÛNw�ºÀżRÉÍ*ü|ÏbÅz9 _\™èÆ684Kš’¨Ä/LC—ó¾î_z}—ð:R•%µGHVÒð\WìÔŸÌU!>Â:�PÅÕƒéž0î9ùy† ƒÞèÖ\k…Z§³óyŽâ’ú|àX×*s¿ Ë?¬øQ£Ðö!(üÜf¨‡_ †¸˜“cbâ·IaDÎÔºã~ãôUƒ�‰È®yW G%xÈ•�ªg_ÒÏŸ5"UG+�µ1B\ëQy]›½=f_±ègp€ )[µ7d[a%½{*ÅwҔ˯…¥ûkcw‹«S0ú#‡÷#±ÞtPÆ=¿Ñ:­Š˜¾P�ðÉ‹h£.ðü3V” —§5ËyP¦J¤ÛíÕöÿ3¬EùÒ|ly싿ɉUM �T&Õ]h¡J‚}~}Æd×£F´r‹iÓŸwyõB£-KR›>Û-“—yùÚyc«¸—ÿbù>z®…ºÐ ÍùwP]žqÐg‘„~Έ¿»´ßWñ›‡˜¼‰�'“\#{e† î2ƒ±Œ½ëaù’È<Ë#yu§RëèBÒFr«üdMKœ?•\‡e~㺫Ñ!ÌÁ¦L޹|˜î4O©¿h2ÍèDqêf`ä°pÓŽ(ŽÐ€6ä¹[¾œA! ü8…X6RÁX[‘’Š+PQÛnØ^ó"iöùu÷¼ÖË­CõZɬ—µ°K“>”œ‘Ù°íÿ_²bÊ~i$Ä)Ê8„!¼'Ef÷M¯¾ˆIžFo¢Pš‹ü]¦‹ÃΓÂõW–V¼O†x",ϲӈ×V56©Æ~·,á•‹'[„Ið ~I®³îßE¢ì\»Ô81BdÞ`¸óŒK‡óà…µKSä‚Fƒ»}O…b¢�ݾ˜žÆA—ÄMêjŒä 3‚3í5íB+Åhk,p&x°Pó/&ã^ÓV#j½®µÕü³û¬8Þ.c}¡/UpÞVú‹êä§¶…z(ƒ Y÷hÜ`ua²†è§h™<˜“"ô ûdËâXxh-õ…ã¤ÒÉ!ÄÉ“Wƒêî#RBhÀqïSŠ“!ÚOŒ¬"�|ÖC§ÀÄóÍ/ñnÐÿ…ô.y@¤@›ëºßùt¤b¶#Û»6°™’‚†a]¦Í�lþ�‚Zø÷m8�éC€�“ÞGÛª%”®d.pÃ35'AIùKô€ö×y#J€,F‡°k†  lc PÛ·©“$ËÞFc2;,ª�·«3üÜKÄõ¸ni™QIaõº3-•ÃhšâËÞ l’jU £TŠòå:qϸâ0_¶ ò¿´rŒzk !¨£ �žëìc5»ù„—¿u:¢&N“g7noÕ&G7 :î ‰B«Ã½}oÃmãÄ^«|Þ%sdy2ûl”~4h4r¼]6¨øéóм‰9BÄz9µ‹™¤9x·=u dÁX×V0ü§P–UP®î¦`Á¸ÿ>‰ž5 TòÌœ3ŠqeÌ 2Ž3'­:™Ÿymè\‰Ìß›X%Y-%v@U9™ê¶|R(Efw\³_Mm7.T�½@�éõZàþ°]¬(.ñ�Ã= $0Ë}eÿ±ÇïkÞH×ZNg�/ÿÓ¯!�Ç\Ú­tíÿWj^l3•íʸhýK$BÉ£YŸ�KÛ}P,—moEÐÀDn˜~:ÆÜë†#Ì– #9ÖI ý¶è\Ûa†²¼0Q$•Qc / %%.ÎJ¦ó]¶˜þÀin¼«í¥-*]ø±Yñ— CÚݸmüÛ°¬`ëDßgƒé$ÜÚºÛädJH8Þ¸YZ¤I»œe¯`"1„uᖠņßÙ}~4Ðxou;¸EZ�”]ÜÔò®*N’¤2}Ö禥%çSÊ„ðiüi¡‘ÀNŠ�¸š8úß^ÿÎÆ?(4ËÃöÛÛ ‰W¨+Ù=�eBßëOñšÆ ÓF·uŠÔoAï,KÀú¸ñ¡¦+õWCv��°\S©ç JÁñ;ȒЈÒ@#-Z(Ö¯ÍÊ5¾Jï£ ¶Z]¡7ÍÒãÉ,f3É$§ÂДӠÿ©9i”s†y•£6ceccomp-4.3.1/docs/images/trace_seize.webp000066400000000000000000001513661526046660400205260ustar00rootroot00000000000000RIFFîÒWEBPVP8 âÒ°£�*3Ï>m2•H$"¢!¥óЀ ‰gnöÁ!“L‡ÿ#icÞú�ìÞ�¼{Ö§¾¾¥ç'¹N¬ò³ó�×üÙÿwý�÷úØú�÷ßRŸí¿s½ÂgÿŸêúúÝŸsïïµ>â?c?n¾?¤†ÿÛìíþçÿǸG÷Ÿ÷?þýÀÿŸÿ˜ÿ·ìáÿS÷oÿÿÉö?ù_¾_?¶¿ÿ¿ô{€üöÁþÿë­Â•ÿTþÇû æ[ôÏìŸÝ?c¿°þÍ{Sø¯ËhþÝþ+ü¿öïþŸí¾§¾[þ“ûÏ�¿2þý¿ù/óÄÿû ÷�ìÿá?ßsýíøCûïöÿÝñ�þWûgøïñÿä?ãvùüƒùWø?ìßâÿåuôñÿOý/sn©þ‹ý¿ú¯`_Tþyþ—üø�ü_æý»ýSü_÷_Èÿ�ÿ0þÕþoû×ù¯üßàÿþÿþ…þ_ûgï7ø�ÿÿøþÝÿ-ÿ—ýïÿ£å?ØÿáÿðüÃû‡üßò¿î?g¾‘¿£ÿÁþOýGì·¸ÏÌÎÿÞÿ?þ×ösìùö?øÿáÏ÷ÿ3ÿÿÿÿ7;~‡—½pz¼º$­y$ññw—\+_¾çß$ÃR:öD)'ÓÎPCKhF y+رô�¯…†½1ô|ö#Óa•Àõ\g]Cñ7Å;ãÔ ´>™•=÷ñOš”ö\zÝ¡øu¼šWÔGÔi|¸hë9ݱ=û3îGr;‘ÜŽäw#¹ÈíÒøu™™1Þ¶óMÖÚuGs4ÔOohÊ„ÖþBd3B+É/›  k—•jDÑ‘Ávüë÷Èà–š6x„9ÀM¢˜šó½ì¥êwë�PµØÜ$›*:'Ÿ‰É¯˜ÓVïà€ö+T—>þÊóž¨Z—1µ&¥Q9Éz•¨2Þ��šôZöP: ‰¼Ï(ó€Éб^¬Å®È {Sö}4;??kÖ…6b�¹TC鑪ú�”l£eNxHðž=?é|°^,¸·Õü¹nDz[pà¾(’¹Àîút‡yÔ¦¦Âw#¹ÈîGr;‘Ý[V– ÙùÂ?Ò܉½ü ÃVMA�”ï¦,>O•ó[áéqéòÙÕu�w 0£zá ž+ât-`L*.‘Bøÿù²Îa›§!zvFÎÚe¬í¬×7b(ÚºjÐÉnµ*ŒvOfkð|yXÿ‘ ¿t.~J¨Y‡Ö›Éø,†'¬wøöVã1Z·<Ù¸`x¸a£Ömi®ÒwðÔ2MCí�$À”%s­Ò“n~SÕÛµ³ v]¥e£M LŠ@Ù9Låùœ¹Iä˜�îñá&³½Žâi‘ªú�”l£eO—i‘ªú�”l áÿB™óû­ÚýB0;«ä¨ÀŽáù`h�/»Æ°½6ŽÀû° hý;ÖÆ® ¢®´ â~ç¥à˜v¿åŒQUñ¤À¹Y®{LŠâXŸÍô.eûøc�'R_S@Õ‡ Ÿ�/Òs Íÿ,åèdïî3Å\´Éš§ô»p�Vl«æH¼F¹Ñ©¶ðнj®lРk#Jòv«3ɲz½µ[ �y¦rq�A”v:†¦ÞF–bC¿ËØ/tÔ -nŸ*æ”y«é ~0Þ±`úo,k[o׈„¤ !�‡¨ÜŽäOwKûã©?Ûx)5älTy*ÕD©1÷h5‡ê(ãþzà²Í]4 4,©ÕP,Ka=ë®ÅÂGmƒ˜‡àï_Qÿ“�‘s¢Q5ªèójˆu0t;ÍQ‡ƒïœÐ¾B‰ZçyW�˜ÑîQ¨åÐ[×O¤/e®& ä.íWº”ÚùOšgɸ ¾áþ;•†“Qж!©µà¶îÕ ^ ’Â@Ý(¸Ë&˜ñg¸]7ÒœœÎ{óG±~’›?gBÞ±2’wöB!Uc÷^ÊO8›ž7^:Pä þñ‡D‹`û<†E„çÏ þbŸ;�õy;.ù)ƒq:2vI¢eæ}Ѩ)õÐupè#¦zý‚1äÞqr!ZRí25_7Yde‘õ•P Ó,m-ÎdþÊWÊÊÀ|(µÂ¶»ÄuÚß@þÃE=BKцdœýeµ2ç_·Ï¿»Ÿ^Š.”‘ôl£e(ÙFÊ6Q²�”l£eVÜ«¡X§Údj¾ ´¶‚÷o•Çêó“zPt­HÕ— "q^©ë o‡VñëbKÀ–ÚÊW‚�ÃÎ$RíZƒï™$—@W‹×Qv(·*ˆ}25_Q²�”xŒAþܪ!ôÈÕu$O*9�!ê i*ÒŠãV¶#¨-R>(8“Lg—®¨ù¯ÆØ×¸iX(¶ŽÅ4oÂ¥O¦SIÍL„ñ�wýç¹ãÿ¡îk1ÂG:½9~ܪ!ôË’%‘/D,(P“Ibg!š@27¯ôÔf´pSk”ڵZz7 Û<\\Ç”8MØ%‡²\à‡¦É|�YºHn4Ä”Ió@Å"Ä^F"KýI~Ì‚ûœmNì“?`�€È"_�о9†¿æ²’›$-š=YÛ_÷ë®F¨ˆ§êÒô©ÕkoY2Ÿ�n”ìÕQ]Ì Æõ.B¨Óñª˜œ Ät�pÙ¤œ[èÆËõoÉȶã½En×ç6æ.7…8&c‰ÔÊ5’Ö àä¢*ˆ�Êí䢵Vì²’e!qâÞOX õD ´t‘Ä]ú¿@[q#B?�š”wõšhjîGr;“;öv ÁÔëæå娲ðãr×5Ÿõ+ãv�©™É¸¼öÕˆ5@x¿Ð Zù˜£=ì €ÎÚ; ÆÅ¥Ãhqµ%Z†r;ƒˆÞ' :قѧ¨:—‰{ö‘ÁVÑÙEØ®§ÖQ[ÏØ4f!5šÂþ¿Á ¥Ã¼4U¥[-‡üL¹áIii¤®gÆvÇ#©¡üË2Ák·<%*œ„Ñ�ŽO¿Á*zMYÄE:À¤·LHðcæáÞPY‚?·•,5 ùIn¾‚[wßdÑD`; Ï Wx©¡‚7®Ëæzþ±p'–·Ø,€¥} Aþܪ¥@=Œý²uQ–Qï+%@ÿ¾Úñ™›r¨}CƒôÐð8Ž¡{�B‰Þ”þ­gÓÆÜ¥*V]ôŤY}è‰È¬ogx’í÷:G%f~Ma™î÷¹3޼1rÎþ|¸=ª c—¤s£¡8ÎFH}¶ ô­PJN‡CÛ!%{wààáÿJ÷=lÇ‘¾3(lÇŒ½s8·¼w·‘“bêîÑæ‹ú@iÁTÿš`áܯ+\À3ôÆqQ4ºMÁ#º“qMQ*—¥*!ôÈôÆÁ›þvêÓ®äw#¹Èãü ŒÂS`³qžµ�®�…|KUÍ5QÌÍè`Z™Þ| oZ_ "ž˜î¸ßp—­0’ žÛù`T b†=vz£ª¬„.‚F0]’@”sQeðv¨®ð–nÏ«lþÏ› ÐË;º;#âQ\qR~G;þ£›Ú?gsl½±Ãºv]6€üEëN©)ó»’¯#¨?z(Ö«a œÐúá‹6T1Z!M4_^Ï p‰Çc�.ôû-_XßBpñSFc¤Ù±@X›SÐÉ2‰GI#Àô›pÔwB8¥Úy@—25_Q´çnUúdj¾£e&¢YÝ6Jxùéõ�$Óº¦4ýòx�ùáh{ U¯xhBè� ô) óyFó;YTŒt=6Ý%(}]Ëù Q3;pZ€Ãð´ ‘-.œa»cR!cy™�¾±ˆ× Rtï uÛ�–ŽaSè#Ôæá¯!¿Ê‹K×É©×i U«Ët�Ùï CwŠ�:uåݵ<å@› 00é$ëVµÕL�Å¡ˆ?Û•D>™œAa–Þ\¨æn6ØpáˆÏ1‘õº Ÿ$Œ‹Ã5Ô�@Œ÷}›Gì“´’Î$lÈÕ…±Oi(ˆOÈVëHŠ‘räˆêåð8Õ‡�UOÓS;Ãå·>ÅTµGô¬Œ8\di2~ö úÊ‘-ÔˆK· {öÈî](_¬å€¶üâè�6i’æÊ$ ëDOÆeÿ±¢žOw‘Ö9¶o'2»°[¼QAJ6UmÊ¢L�WÔl£NÁü–‹­U÷ÇKMG‘úŒ×ïÄÔ,AÃÜ™(93Úò3zváK­WŸ:ã”dN”Qú<݆¿GGTK刕Ô*éý‡*+Mv“‡Ðrɱ{Ôª]‡ÜÀ§>ŸÍÞHBYD¿œÊ)µ3¡d¹ <áÀ?w²•XŠRv°§ŽÇæQÍòIZ|s›ÎÎ_ÿ¯s†ß‡;ë-GjÈ™¥*”£Xª-wæÇoÈ6ÚTæ‡1MÍäÑ÷«7.øž1Dcd:õs{GÎú¡Ô2].t”?Û¶ £e(ÙFÊ6T[Y36¨áüy›>@7yÓãÂÃ?–GE˧žù,‰°J–·mQ¿Õ^\« h$[0mœ¦?Åki´OhЃÀÝQ Q]T®§¦Èw¿O%\ÊãÂ+˜ëW8>d‡ú«þâ3ƒëææ»oÍòEKð—«á µüûgª9Rjš\æéÚ7ÖlÏŒÙ8wË€+¦‰J„’±céî#oz+AÉé�ß7ÐÄíÊ¢L¾ÈîGr;‘ÜŽäu;¹îÇkÆâ7DÉG_®ì“ìwÎØ|f0gó­ÐÔç§&îzyÓ3j¢3·d®_vy‰.“Ù]FÖë�Õç›´iðÂìñHïpáAb߀dâTµm:²YöT\íb…ÝOK7꿳�ñ1jˆ§Ç­—±XsòåèÅ^• t<±oÜlû(ÎcUzÆÈ u‡¥>Ò™Äá“hˆ UÍCý¹TCé‘®Ä1ûr¨‡Ó#UÒ­ƒêw¿ë³ßïv¼ü7fQzÉ™%Ñg¼ì}Zœ¶šäqžþѯøÇý¼ÆçŒÿMm�æË§Â(q‚ üZér˜þÀ£*ÓáÚã~èe‡T\bàþÃu“�•2‚âýútmdô &z "ˆØ´ôþ6Nù-Ë} ò¿¡½¶ �äíÏòúÞúÈÕ}¸ùmD&Tù¡h4µ•õÜŽäw#»Wi‘ªú�”l£dýËË9Ñ\a¼+þB;¡;£÷šžŠ¸ÇœoøÃ(B;2H£�Ý,!¬0�`mj´úÈõ²ŸJà$gý/AZ‰ cǃň¦'x)a¨°è6œ†ÉYÚ. ]™=¼àts2�W´PšãV>ÎùÚ@yÒ�·ìŒ ¦ÞŠgN­�I�{ Ç:èϵö*øRÀ÷>?ùz–ž¡¬¸Ú*·CˆwI>|÷ 9¿-ňàg¡°=à›DR;þaÂwæK¡Âøÿj¾£e(ÙGˆÄíÊ¢L�WÌ— ¶} ¼dm¼b or·�¯f¿N.xzIVÕ5¾~Žé"uô¶=L&ÉaNE'É+¬a¤2[â©p©6Ês£e~*@Þ¬ÎÑHéxó´¬l@|°Ò›Úp@f½Ù)aÒ‰àá!h #‰´ÈÕ}FÊ6Qâ1ûr¨‡Ó#Uó€�"è+€èGFѱôÆŠâ3`„ºlë·Ú~Þ:Çú«óÇ«Œs±"Ÿé#5îw•ÞQÝÓQdÁž®)ó9PZ “¿QG @·�ÖGïÀ+PTlPÜï…ÂÃöÒ€�.è~K,aï–#56¥Ã(XNœö{"Ðk:5ä8h~«Oƒ›ãužq­N¹ÈîGr;‘Ü�™�¦F«ê6Q²�ƒç¶Èuf6LûB ò„|¨ˆ¾é#ј P–Zü�Ãì¹2 ÉQÿkÿlž± Q—ms.Ÿ¿Æèe¯D5:7ÝÀ{ųÂ] ™ DÙѲ•¶«™¯¨ÙAÀléIÖâ5¨*œv®jH;a”$¡ÐÄk|$ꆜ›É\AûöàCðD¦‰^ÑݥƴK–+#ˆ}25_Q²�”xŒAþܪ!ôÈÕtåí™ÌëÑ ± ‡1—™è#xQœ®÷#Özâ‰ÅƒhˆÎ|¡>âà4Ç åÃVØtGr;‘ÜŽäw#¹ÈîGÌÇÓ#Uõ(ÙF‡:]õóƒÏÀÒbZ\ñprÜá�öbê%¡¼ù¹¼hàWôÏ«‡}WÀZíMq¶ × ž`*6:_bU . �öõ`ýë5úî$ä"�MFÊ6Q²�”l£e(ÙGˆÄíÊ¢L�WL¬�è$*ØÅH5Ç�|Ã畯KiXSIÈqÖUÕL��ö ÷É&sôZ�u­tÅðâë[%Í*œºÿb¡“ñAΓb§ VI )êi,¶zÅ¢ûðrT0`âU€œšþæa¦ ëŠÈôÔl£e(ÙFÊ6Q²��Y|õÊ¢L�WÔlŸ@þTLoV¦/¯Ñ|ºS€!‘Û!õ ýÅúùkøf¨NË )¨ð0#Ggõö^a7ñÒ”�‹ZþeŒ$‘b1yE8 ݲ£ËÞ9ëfV¦§ÊXgÖp™¼äÿ+[¬6NdòrtþWuóÄL±à/ê†äS½iô%ÛÍPpd ì.Ø—3¦‰(}æSâ®Uýº+aýim<Âf�Ä×&òì ‘Êý<Þš [†}×öæ9ÙƒŠ8ê\­‰MVùè­œ®?û×£“yLDúpÕ¯’ ½¤Êuˆüs£èM¨�‚M+xþ¼ŠPP4Y‡½Ì”#ðF&Ûv¯�â³R‚VU@ÝLÇ*—w ÓZyê�‚‰ `Ü0¬ÁíÐrŽ-cJG;:Y´¢ðL«}A¨ïøb¦zb!6®¹|b)+Èø7ÕÍ%wrcÔ¹¦^C�øáÜ#ôGÀZÃÕ�Óz%%‚ׯ¦°”D ƒzMâ:Pµ/Ùsù'™ ZÉ`ÿÞð]=^ñB¦êÂ_y.õ^“HÍWÝÄò=¯‰_Ušó¤ý¥*?ìfÿš«~çG„¿Y)“’oºgãÝÅrHNȈ¿¨¯RÊ-™ÕÏQGŒ³3ªº–*o*õVµ™«¬y!àe±CÞøÔ¾V/Ø×Ø÷¼�;E rÿùiÃGôÁÒ:d„£äx¥ŽJµ‡…o…§o=ß\I<fÑÒÝ?hÐÓ÷¼`ø:w?k�èI­‡¸ošàx9Ñ<+Æ)ç‹>ÿÀ¡ <ç­´kÙÇ¿'_‚-GF¥æ0%J£�dðAM([În 5 8¶/ÿ9eäcöQÁ¹ËoBóÂæÚ‘‰©!x "¸-`Ô j²ÔFŠÜKnás2¾{­/?ƒèýN¤Z_VË®–#$CÕð­ú#Sw5UÒ~îÌ®ýL2^«ñÅìÆ‹¤ºVÎÿå‡ÚˆEë·837ʧu¼{*éUYsn $›pqiLrF¸íµB9=yX”ŒÃé9AõJÂþ ÷�OYÑüIߪç*üÜ\‘¶ÎGdýb{¥ºˆd�~J/DÉ\©*} z$1”¤„¼4ûç�U]Dý&ÛËÖ~Qìg¬›ubÔâg&ðjQÿ ñ£Ü¾ª'yÜ ]%'Ó…Å…(¢Z·ã¯¢ ÔÒ³2XÑüCw‘Z0ûõƒð[ƒP²dÞL”˜É;=·Í¾p«©i4�3Y®LEˆë“ŒÕ6kþ•¬e¿Ü6„k’³e��)†~.§—¶¯y xµ±V«Y˜¿‚?ºe�€¥\Rs/eˆbÁ^�nÞ¼Þ…ku˜!zVZ€IåìtôqÌPœ3¥8x®©Ú$–Ž.�"ªªØ›à\q² V¢Ýú9™wŠŸo�}ç‡z†ܰJé¿ÚVPòÌHîÂÆ·"ÓØŠ¯Î«UÑ#�1%<äè £10�C§ÃÉ�ÍÔHø4´¡ók¥ …T_`~eíj 4~Éb'püÆiaðp ÉNŠ&3Ü?€q På5)lÒÙf}üç;½°·Ftâ³çG<†”Då­Æ‹céZ߸ç<�¶|ö€mG?Ü,z°tm;C”hÇÞ)æLNF3Ø'Q1þJ/ÖI£”r#ùüÑqìhZ \C…ê!ë‡#ư‡1�í_˜Ýh׿Ù{šyï5I1ù|^¯¤q¬çqÜ–Y±Òs!AóÎzÔ±büœ· ÔðH#¶0÷26Åý\;²¡o6˜Ó\üÐõ“xlQz0E›ï‚\÷؈$4îþe²�?ÕÓ+šå™µ¤À v×À=Êó\÷Qš®*ôK¦iéR„8‡•œ’û¸TR…«+ ;mT€hêw2ŠºÆuŸHDô@üLB'(ÅžùÚ5¢‹\>° §ÞC(š«àÄ\Ÿu–]£›|Ä/�AÀ!�OˎиoݲvJ©XH.<'9mM¿”-0î\×·½H‹Ã’ÿ›ûU·—Xzöz­;Ú: [–háeå’yÔý§GÚ �áØ©®V,Ôàs¢À¯�¥åfŒ¤µ«[³‘=χˆŒ…³úåXÜéL€H^¸›Ójìq€n·„9œÃÖGUŸaš½¼l_IÓaSñTÒ%hn —óàSÕ)øÄ }~Œ½˜‡»§l *uóÛùsz:ôº.ROKôŠe+ çüÀÚ™‚8?“G!ܱX÷|éÃòÕ(èT³ÄÒ}Ž1 ’Þâ­Ø%©šP U¸©@>ÿ¹má”´ªŠgt -C|;Gt¬DgG)“ÃÏ©!]Èzå¶—¹‹ –)@(}ÀÍxOZ¹9*Z@ÜBù>*ÊA˜Y�Äž™HÇd3%öÉDKñ�‡p:¢Ô/E¸u CÎê†V»™)eÑÇɉ§lÜÍŒ„íH–müÒò¥’ÈÂßkü ¥mùþ³’} â¬ÿ^jçYë�N‡‹Á…dJqL¦móŸßqpj)š™b8¶MÏ4>ŸÉúÿQ¢¯z«ªD(ƒ-H4&W^)êS¡mN_•cæ…$ewį–ÿF3ÄúÏaR*�%W°Ë‹ÜÞWC€=Tcð8§­¦:” qeH†i0ËË8M‡óÞiÍF˜SØ fíÆg©‰ :&qK.åÈ1t6‰jûª«Æäc$šã4P¾ÐV³WÀ²H{†4"Ê·Bú …ÏÛâMŸæËÄù˜ö»c…˜™‘ 8óèñd;h¹bYl‰rÁ…K‹>Û,%‰)Tk¢æ—»N̯úñÕB>–e¸æ”Ó+L6‡oÖ–�]Q CŽöCmjÌÆ/Gpóˆ©A:ÿ'�«´Ò\Øÿg½ôª½Æp¾b[�øù·¾ÃœhÓYƒSj þ(sbmFõ�Z²P¬>ÈaÅ|;7¼0F¸Ñén¥ùÛ»®¥´*^¬,°·‚=x° Ëu™ƒÇPO­Ú�<:]..”ØžíвQà…ÞB xÅ Ê×·_¥Þ¯ÜªŽ'¡3Ä¥½…bÂyÍú]½É±É;µ½DÕ}¸]‡ÆÜ|<|ù¤Þ´F�ö».ü'äÕgqFݹÓ¨çÌ0sur‘“NO8ùíèšÛ}ˆ+³Ñó¾%�Jú’ À”š7›x>?sþ ÉOà Ÿ[ï5tØÊMÜœíjQ7hò¯´GPZ=—ˆÍ” ôÔèO×…˜ãèïp¤‰ð¼"Ÿ\%,¢~:ÜÓ‰Gž�4�Êr:“3ûÂtŽš\´ØÀ�s{÷ºÅ�ZŸvŽ$kBgʯñw×o®*N+NY–6”°e  4ض§gÑ9·�ø²Ú~lÑÎòY8Gb¾›OŸ•ã6´H¼AºŒÔ5ƒ_ìAœç·®“ÎÖSŽ}$õ@z:÷¸¡ÕUx„2^¼4¥ �UŒ!²J8Õ±ó#£ÿÅfô?ü®ÙWQ$ºÐê¶Œ72ë9ÖÂWWÖúÀ«`q´V4>ôûb²ÌPÊMZcÜfdT¶äë;¦Þï[érõ¡ó’QÌ#Dïþ”Ë%ö„eZò s0‹é&Ÿå°ùq?ã4„-]™�^�#D/ƒÿ{ÈÒ7BU¿ VY~žáOâ_¿5Ð'ŠYÔ/¦úíî°’·¸Ûû#ÈtÔêg»`ªüÊÁ¦7Éš~K?k½{h|¶0ì¢ÀJ9þc¤Ú^bÒÇ;ŒC½úš�‚ÑÂmðì°®ŸEHŸŸb 7ù嶺�Û¸%)0‘G"nÆ,у!ö åh¨Î" ˆÎ[Íñl,xxÚ�¯Ý�"1ÖÖ­«Aì]ÐóÿÀaKu蚦ÉÎ2ß$=ƬÓÛhY(×ó¥sõÒ#›Í#jéÍ)R–;Q…KA1»‰u÷Ÿc' /Eu Q?a#E[ËŒä6 4M£Ô†p¼íü[~¢¬¥c(+>Œø »Ù‹¤3”FÒæ’ø†w5«!¡Å­‰°z:z–Oº6¾?Eã3þ”«9¤¦_«fõ.)Ÿ¦@‚¢�`�`ë^ˆ“n°Áp¿LRô± ™6?(ÃÐpÕW@—ÏØà|0aÄ;H}¼*ó3Ùæn”[DÝІRD҆ȅϔ㷙› #ãÐ9qÛlT¶ÊºÇTëSeYO€†´�Ü´ÝK‹~“>‰�–�•‚j±ü\çŒ�(êgWÃ…K<þ òr÷ðx% Â!!Þ¢¨ñ~n½JS4“¿ò²iÜÛíÅÄëigÛ…^ÁXúY»[!žý|8Óôî…ÚxÜúXXµÿ=C$ö îx†‰Ý¡üþŽØ®e~Z#i�2;}L8•Cö¬§¯�+ÏU?Åp™He�®qR)81m-:¶X‡‡;S4_øæi×ðn°r-ì`¾t6H-V­¶Ç“PWv•A8â²á)Ìæ\LžÐÀÇÊ�+ž[’í×>CÏ™dÇ ~�÷6>�/Hºx†3˧®ÕvnƒÊ6jŽ‘žD °ÕÚ>2‹zg ù˜ DÜr^ó�ìÐsÆÓCHð›6Ó«)¦íLíÅ'ŠÓWÃ[…­ˆÙòÝ\ é#•í®;r/ôÝ ÁÏa›Þþ�|†Ñ­¾jÆø2KhÈPb’ ¬•ˆ^‚ŽéÌV»Aþ²�Ø&/�ÎuüмIZH#vW[¼yâ�Oaè ‰<Ô6+ïøT”ˆvŽ”ƒêäz&?ÃTQ§àŸo¶ÊR<`Šü— ó@¾0±Ÿ³wf_`m‡}Ñ«—¢vÃÄ‘\¾ÆyX°z¶œÆH2Ñ~cÚ�£W¼=Ï[eI‘Y16“Ï…Å4GK²`ó£LŽ$õ+ ´íKçîžrýã Š¡ÃÌ4í’Ãc¤³f鬬r)*çHY»Èü‡L FžtŽkö±3ʼn'TµWÅ£u°˜3Gª4eCŸÎ0Ò½,¢NÆe�‹Ä°ÛÏŽÍL"tˆ¬)4y9cz¥ØUÙE&TëõS„Y$­j½š“UÖ�7æ0UÈ ÿoTQ�'‚<è‰"‹/ÂÆútpu®Ã%0ÍŸ?ú4F¶‹øÝRô z�7ˆ¢í•#¨D‰KGç>é÷ø{îfz;ªíæS`.˜ëxÏW1pW¸clV ˆ�7±Nà›�ñ娢~?�T¥hX¹ ú[(pÞ à_¯¢6 ô?nœR³�\÷Œ±f1EKP vpŽÝÆ8ˆ +:­{‡‚ˆ9°�®ßŸKúýfr™À,8²KέÐ8—™ã�ŒmóÖZ4|Î\¶£o<ɇFî.t+ÌÍX~Î ˆïòÈ×R2$c{ˆ Òߡ󿤻’oŒ\Ç"¿dοÌäÊ´(>Êu�ˆçR¡› ’G qfâažÇ‹ƒi ‘)Ýb£dø©�¨ò[¼‹ðú}’·t‘ªæñ��(ŠâköOýb„NË¥ÞÛ˜ZveGF6j®›ŸÓw+×@“ 6\�QÚ[k·õ? ûRk ’2úÕ|@åI+çü²‘/ðÿª7£Xû­IåÄ_ºmªÏ…È£hQmz`?…édÛß– Å]}�%šµ�þ<Ÿ‰YXŠÜr•éû×8\ÌòÞ�4¸ÿàÂßÍX §‹f·HcŸg£tËm%ÄÀïœÿǤ�Ÿr"«|=lRø‡%ô…F¦ƒ ðgéCE¼zˆ\M+Hgö¦€,œýʵµ×²°pìó38ó0<¿¶ú° ÷ˆ ]Á6Dß7ýŒÔ]ŸÓè| §E¤ÜÑðøê3 9IŸaJr oí\—±%¦È·ÔÞœ5z†¬íG3¸à8Gl{~¸#4uý[»†JM7oN:½¿Ž/{åB“P]ꦙêôl›‘J!S"ˆ 4.ˆD{UÊ*lôµêÞn-CJŽà�@ Ž’úÔeUöûú¿ª++(ø|^�k9wÚÖ6zÍ‚yX9]­›±ÖÂò 5™àÚ§õmÍâ)Ñj"(n¨û�o hâV�þï°wEN­V™ÐŠ^x ²_Þ0–˜»Šš×÷ûY•©Ï *T�ω§¼Ö?b4cw«fÑêãÙ6 A:$Þñ;\SÞ±øf3.uRZ“Ëð8™¨ÈÉÇÙ1|bâ ëð.žoxËCšPo�§Àõ$šôsÛ§\ñdß^VJ+%˜P³}zéÍrIÙVsF»êç.¹­K¼.³HìóÀÀ~-ü oÐõ$Ï18Éf&‚ÆAÚÂtËë.—³AA É�ˆ�¼º';fŸÀê1Bwª¤>:ÚføH¬ƒ›‚’ÃÔ&k&+1Ð!ìBŸ9�OÖ;•9¦uÛvüwuÿZ„䕊dR†Nëpóh§ýÒQ?b0k¶ëIUƒ!ȳ-A�5ïËÈ…�Á�»uÖε^.!Š Š&/½@?ŒXH˾�æÌTÁ¹LÊ%×ÐÂ$¥/I&¹jmš¸â;Û®Áý$ÍhE9Ƴ RhëÆ©‰ÖØÂ¤µLVb�3ê=’ü (-$¯M[�µ=š€lciœQ’“û½|vC—’PM'DØ�°3Xà±¥X;Ô®}ê°ÝC…ÆÖ½…Θ\ûä\$äè'¬·F”B]C’ç*”èsv.ù•³¨ÂJ°�¥)œ![¦8ý+ç·2Vc1Õ& ¤ˆìrBõ­#¨Í)°æ3˜(µ&r­Ã®@eb ð\‰kéüo”쫃»È ´”HL¬(ZÉÑâÛ�¤GÜÚX€š0©“-„žÎö‰4�K½X£9BËN 4Ü—|ªø5ñ>pv82AG2ÍÉÆ»ü­*=@l—Š9ÞØR*T1·$|R4waöÒBC-­}ãÁš¹Kµg •à_º§ÓÆYÞ{G+‰ká>òKÚÝÄ?©:ŒI@‡úøb×tÅ”Ëu þ0ã;ÿ>„h5(qÇ•Õfä*&÷¤2ÈXÎzˆ™áíØ7\µH sHÖ­+sYòÈü&¤7‚ÎF^s. ’*ïÕ©§)ÖcÙ¶ÇûÏñQIçè®hº7ÀHÖšâÔcÍ—5çÚ«]ϸ£2VʾË/E ¡y¥'ªIÒö^“W½#sÔèT®<;ÌqÒBv™&"š½—žÅCÏXI¸zµüýjKNN2À¸MÆÏ¯b§¹?\ç 9®¾ÀÔµñ9›¡m(ÌIž‚�M%ç¼_ÿ¼!“Ü6¦°\'Q·»jÖl¼A m0}Az•^§CØN.½šâ"hÜãædµa x²†®ÿ$üc|޳[$�¼„”Z”¤Å ] HéÁùìЇ]È!Ân ½ÛP1õçÏ÷¡<"†ûq²TÁTxÕðÐ?*SæHÒZr°rÁy“ùðo.%TRœ¯ \¯®Þå�¶¦˜$= &œ~�Âj,—vªÅT% šªuêÇ-4¾Åtèðþ~ÈŽ¶È04½»>;Cœ—´Ó4e �¾Å;I¨öÁ·¥‘PŠŽ+p·vÉ!i¿d3}8Ž9ð÷¹Â*³QŽ!‘A;ùïúØ‹80F W›:û|÷Q¬Šƒ·ŠBî/ü_³�êwa—>ý;’GÐ}ée§ô¶rÓɶüt.båüæùx…ôÁ±©]=_VW{ÍM»½J*ê7ðhÛ�ø¨L?zƒ¦Ýèÿ… žÿ €Ëà¹ÎÙ“c…VkQ ‡ <þ� á_€Tv‹ëP¸Îo`/i.š2xßÁ6gž™ÕxuRèjG³Èt."Eà­�ó®<¸)¥Ænwì£ÊƒS=œÖ·7ñYÇÏû#Jï@YŠ1Ü4r`³ø•®OÃMCÜ ü/ÑS 3~åÀ¨W½oÈ ºÌ¿Sw`¾e¢An�¡~+G&Ù2p#M]�$ÿ.K¼_+bÈÅ_jPíöû_ˆ©–ê­}w|óE›R¬³"ýͫڙš›Ñ¨%UúyÏÞ%Nô=jfÙ`\(¾iŒfÊÔWiÇD80u 4¹URŽ»Ë Ó‹�Ïy…Z¸å0>ÞáwbY°m .S~½nÄGH¸Œ3)ý�µgÖ?;oпE:Á¬bÜ`† ÝÌ}óâTøTº:•Ñàs>쥲àgèpöÈÃK~:`�ñâIC” ¯Óà ]Yem’ËÏa(²˜z��¸žœµ’3Ræg®°iÓñÄ8‹)¹áe‘ }îÎÏ÷«Ñ i…¾$WQä«a�ž«[ˆ'£“k±ÂC"ů9ÆðSðØ(üµ2„3^¡Æ®G|MUD;Ràú‡šÐùæ×Ÿ-9¬56þ+Mb z"ßåÓï·E3e CaJî%Äq/꺯�ä�U¨çEŸ3¯^Eôø F¹ ÀÇ+‘Øõ…ÌÑå¶¾JpÅ„þÃÈaRhE¤ßÌÖ˜²Öiœîyý ›€í‘í2ÁÝ ‰4æ¥5ÌÑiÙÌ�nq©O K[”·ÉÑ)L ¥‰”¤µè�ª§y¥,W!¹SmECÅî“$€"ví£qI\9=ÐH]ˆ<@7ŪÔç ýqÛäôsª½¡ŠÅ ¢�ZJ¿‘Šº°ýi*·•íO?1œôëÂ@§ Ø0o�ÅáÔAU3ö”»ÈŠÎNðÁ”û¸|VŹo›PN÷ñóH~ÓMºI'œ1­�Âöô)ƒðžEغó±áévšÇ™ÆZ·CLÈ#Ó°P5©%21ÐßžÝqÞÚãémÎé2o—fŒî€$Kö�„ ò·?{ }ê/P–o‘qj­B[[�:šòX¨Á¼UÜQw8öÿ�ÃæKo+EÙV•ƒôY‰ÿ’�I—»y§n§V׋•kÏ*x:±í[1J;x4þÊÍ"šHåš——wí®q˜@ëêõëÇl>¼ŒÐŽ)Ú´›AV%ÔÌÄR‰mž"Á½Ï0¶ÒÙ –kžNÉŸ@Êù¾ Ãð€M�lÈDë�Yw?™ã›¤¦bEë5¦4Ñ�Y?V©û)Ü?` «%æ·Á ¦¿„¿)aÚn$•Š6ë|ª³_ŸÔUqYD¸]×1ÝJxàûÒ�³�6=@I[<Ïò¦}{u�”³iôS]éò_˪*XÝæWmàÕ¤¸ÊçÄ%OÊ)ÔG’r"²× u?ft'`UǴĉ¼6#l,í•�zÌOíˆmw_âÍ•k–ÔØËúb—G4òel€“{@ˆ¼„ë¸â-�ª*‹)h�QjÅå—á?Á}w:±Ú¦7fdSY­Ü.d>»±é+©ˆúúèŽrU%×íõ¯*t¸ü±m}aË&¡.ÛG2A{=wþÁ"« !!¶5]®hgÆ.ÿ¿�;‚2Ûµ'¯UiUzHCõÞ”w°„þ€R”ˆ”ŒRùˆðƒ Á9>/\7ÉyPŒ˜&éù@)ý8qþÌÕÍ‘a‰z(äìºÎ{§ZÈ“ïÝÚ$Íîjö$~•Sôକú“�k¯‘œ �¼RîY$½Ö�Õ¹Ò< Ý?ðw'Xãžöø¡´}MI‹»°ŸøA�\Q£Öýç"]¼ÒœVá+m‹/!UŸ]¶ºzÝQ &Ö�¦�¬¨�ÅWÍs.ß…°nCðÂ)^KM=Ø?‚̳™€¦Wu‹Záß!t™»’;C¢}Ý ZÇA°¼½R0rR²Ã,zt\«l*éÖ‚^ßK�-ŠWÿæ:¶Âbìýã9úì}&XeŸÞá-ƒ²OÝŸB')nëv3Kïµò6&Æ‹iÀÈÆÔd–©âÄüÂÈg:3™H�yv)u!ý®ï±¶ÐôNß-TDä:Ѧ†R>Û(ÚBAŠ+Òj¾Î”/žÛÇ9œB3ôzRqîž+õ™¡”kÂð’¸ÌQj`.óÓÔà - ÞdG<^ÏNØÞIéØFŽ�‡¿¦�0µ¡Æ{ïWèÖ9äª~ïf¾_Ñ¢7¯U M¼x!ïEñP}4×Õ““Tßz°óJ„¨Krÿ·ìEÑhNmh(9?'½ñÃhbâÓ÷6¤»±Ußáh†Lµ° Ì~ßõ@~ï`3X�QßµD3S)ÛÐy¶×bÉz�oÄRü#€ƒ[xñAk{º-˜LuŠò�¨æöº*õuK:8Ÿ³¸þqæ©Qÿ™0‰a!ª*—f>V½pGS’)mƒ«1¯Ê|H�¬†¼Ôžw.¸‡D09²1í#dhR®±ÞÍ¢EÐ' ² ÿvÒ«*·³\ÀK,\´ø�Ž”™`‘>0ÒÌÅ"JR²å!Ð�}7— à\š0zˆù…´BèÓžÂÏãÛÈr€jÂh©_5®¬W¼—M¼* w �%s˜¿¨›.uš=£†ì*kó0‘)m‹"SŠGUÍX<€Ô'ÔUåd‚wÑÆ  M¼”%#›Üûýÿ+ºM“+Rx÷ êæ]olR‡.U—»¯d´î‚ÕWÿaÔ·ß´L›cÿóï�Ñÿz$¶Ñ%è!·L3Á�è¿��Ó³…yÀ3Äf›¾�KCâÁ4àݵ“coŒ¨Æ¶çÆú€À|ÒA&' ×$¹èòké•]~ ²î*«Zø² – ª>ɽøiòѨ÷‰£@5µ¾†)p½SÑÇFñü—£åÚPr¾TÉm'hØaõ�ÜîìýÉã�©óìñ¯ú›·¼ÐYÃ_á^Z…Šb²m©ýÞ§ï¡bô?éÆÌáý ð¿‘ò$`Âó°âýc·,�`0â±¾˜êÝÞ¨øÃæìŽ `N(-ÅsÎöô9±½õ//uV[ìuŸ¡ë«VËl‚¿OfV è×O`î3³F¼ë”‡î¥ª`A™³Ü(Aš<µvÃö°.‚›™c­Cç8ÍZSŸÇsûa„Ìù˜¤Eb})½ã#‰Óp�kÝ*xw�>IG–)þÙÄÃI Úuµ8ΈŸÍ_$C(9}/¸Ù’sxNà©ÀÝÑW4"ÚI˱?¦=ûʰ»ËFJe|ù�¾l+dÕ™׬öÛ¶ßÌÆ€4_L;%±E%ûÁ·ñt³îñóКiîÄüˆÊˆ;äAf ·×Q!©ç6¤‚qù »Áž¥&à©Òð’-etF óbpÖWõ*~‰��›¼àÇÏfG ÅúüR¸Â“¯²ˆ:Ä*+û®áެ€³Áaún5¥±5~*ÞO3ÅåØ7´OÍsIp;}mÕÀŽw <ÀR}Êbjlµ6ÑÃt,ÝBÒÙ(<¡¾üT‚§†ö8<òΖ8d Za­®W²×NÝp»<\é|™Âõö¬ù•Ö‘;ö:†QÔ„ x­« (Ø G 8Ñ7ñZv°ëe=uH&¸¡ p툅d¸—¶ùhãìë8?>ˇ�ZªÈBµ”=�hôŽ[€äÞÙð¥Äó+¯m¯íöwŠ›szò‹(žà*ï­$_º Ùöï�¬q®þi){ÏŽ�:ÜÏ¡*�골ȘVÂ’Cqø »êéÈ6çäyÙ­Š eÚ”«¿‘yLoú …zD¥9y|öZqPƒÓõ`—‰~4æ_ -PÝ >i”5ÅŒù"K=$žN©Z"°_³·à¸Õ®Fñõq¡¹a"7 6ùÄˈ¨ð[•Ú�D�µý»M1wgš"?|�K^j y¿ ,£‡|¨»©i» †þªJÑ�Ú({þF´ÏRx"¨Í¬ŠKï~©&b#—Âe"¹Îx•ÉÇóî‹{ l6y·(5¬>fâ·@#=*á †&šô¯RY¾#Q¥ãi_~)<§[˜¦§Ë³Nð »ÀƒŠâëL±F•¥pùãpðx[L¡,äÒ+¨„(ñeÒÙóü¾ )'°–ÜÖȰüÒ–M¤è½—‚Sû/ãØ–µÿæggØ�¹ D'T„-ذû>ÿ§0ú³j(éB²óêVâu­|Vôðwû¯†ÑÅQðÅ ¡¿£AxÞȃô�&ŽêËÀí39*¼¦ôŒ¤T. ï—�Ø.ˆŠÖá7Ú°ëŠÁsºÓÉn�«9鋳¨Á;ä&?ihto Íe θ[N!ÕíJ½7Dºu䢥ϵ§�-uaïV݉áàÊ;R*ÌBÈŒÌ ßÜI>°ŒIñÙ\ÁB@}–Úé¾¶ ÓˆEåÅ ¬™©ã#–@‘°¾„ÂrL»ñ;û� ÓÒ3ÿÌ0¼îÒÝÑ:>Ù vWÿƒÛ9Ó®BˆTõyMò�_û€[‚‘,C¢ÕcÔ¦™ eC¬uzI:à–{Ëî ÖÌÑ¥2í@ÕKcs‘]4ăö+´+ó:XcÞ¹Åó(ÃiqÄ›’7ÏöP,Ë!É3`(¦_<py”|¹¿ùÜÛ9pµîÒ@ß-}vcE4/}ØB”¯Qü‰ô�`´=’SmH? »°ª¼ÑÐ)ûc>GËùÉn­…˜Œ=„`LžlgÒõË.âlˆê<¹¹×= xÄ÷™[9zGË= ÂÆÁ7FrJ€þJ‡³CPÀ­FW¦´æâ!iŽÍPðõDû‡Î¾0þh£Ê¨ºØGû¸û?ê¸Èö"õ˜�Ù=÷œ¨EW–žÚµ0á�Ua¬b_|MvlP’þøO© k±èÛþ™øÎ>éÈú4Àü TW6.Ã+Ù?êð_—–§M¢~œ1zö Ý0�õL¢|°ÁŸ|G »¶¾Ï~{Œ—s%uN –ÔÐÕõX=rœù«7 d5éÆÍ "'9Ü`’ƒ•—F.óhÌ} ò½ôsÛAÊ1zgÇD{‚d.ãýÇeH ÛŸjñäÓVYÜVeÃo°¨®g öª)ûvL�I5¤p`{Çþ0“1D£¾ap¡ôW¯>ãÁjgÂ0ô-,E›NJèḛ̈A"Çú)øEºùŠOg®´�¦ô§BàqóÃ2?&û¸Ñœ¹qÑ� +ÜÅТ¹Ê‚ù)t�D쇻°±O––ß)~i2WX#ôÞëDÍÒ5'—ï)!Z•i]‹'ñÙÇpòH�·aÚb£%ŒdˆZ=¢þ„�Ú¤˜)ð 4y««~7e¾ òŽ¡å©8†j?1B¢ RVyÔ$<ü-5=ÒÆy"àõ>½Ñl}Ñß«NR‘T¤·ó!™nÞjæï†¨ú:èÎ&NùUË„e̓ ø€ÚAEyà13Ç~3ÜKû?áHMß[Wy^<{¤Ž¦²ÝpfÒþ¿û,Z>Œ¹ ‚¬ÇX¡1𿲿‘ÒWcÓakmµÎ>÷ÃãÄX‡CdlŒ £DÏÇóŒ´Ï/S¨M8ö¾õŠ´ÐšÃ’l.WRô"õû‚din¶íõÂÉmµ�ž¼AD^ëÉ% %¸ß*éKœaúç&±ç¬Ì^°ñ£¼´Ú§Ám.Œ´yÌt{‘²ª£5j«›¦ÂŒÀäSú¤ÇÕzá Â[¦]N(¦³î%2蹡µwÂK°�ÿSÎÑ]9�ð{ŒÈj¢µhÝ\ÃóqGz³ÐAûþÿƒX¬ü™î#ž|Î:¬Š¢¶Û”“¾†V$ :Ž`Ìè ;·ÿºÙöÀU[³¤1K®†d¬«�_ú­›L«N`|NÒ{ñRd�©L@ÓbõTªJ׆M$¿1)ûÍÕ@&Û!îv:äs8\™ez(GüI-94ê*´íâv¸Bøù’<»€…0¸ †¯PEa€Wã¹ ïùØÓšP9fôÑ7W.m¥È¢0dÔÕBº¸!…uA·Äñ®©&'ÄöN¬Ó Òü/½ÆËh5Iõê$ CÖ¶.ª6°g‰R/’NoÒ�þ—j=ÓÅ9³‚uCË»^y…îDˆôgûS<º�‰9/¸4¹U¨Ïæºt?cªÝÞÑc2Ͻ?Y ,TÜWˆ47®êÁ‘œ<7£ê+…µ¤…¶ÞõT˜ÊŒúDg�¶/¤FŽB›ÙUAZ.8v ›±¸¼¡&,ÒàRVý¹T‹7Žôu+Ÿâ.ÔÖ®¢Xù[QIH”L ‰$ÛˆŠR}Cõ2Ê©ðYsË `‰®aC~Òó<ß}ÓjáY�ËHrEùß®=]Š�æN:ª§CoŒº$̬ ækÛTBšÚ¸åJ±`,÷Ão*_ÐcǨ/XïÇצI±Á—ÿ¬²­B"Üa9û�tX„®¼ˆQ?d!–þÌ­Á�{H¹YæÐ/ÿ§!p l,l½sE$°c=ÆëZQ[Go{îg9`X¾…³)ú‡1>¯—ÓÎÁQ†šæISè>]E´ã ôðÍ  ×]½]nɯ¨5è± 8¤„-”b[í‰i÷ÐYP�Š�ÃÄ öH?�lÝòdÓ° qµï]ð#Ýw}Žª5“ó8 ÃŽéZÐ`ÜEÔkfšl½�Ýb9@@{&Õå2õu“ÿSƒØØ\†¯x$é$©5H—ÿCÝÀpi4¸Y Íý ›®%‘ýš�uò”ͯk¯è›îDŒ'å£ÂE ë|äâ`D®ËN“ÇW?ÒQÏš\×i¿ú¨�²í>Bù ¾³½­u�Ÿ>ÅW˜½Ð D HfÍm VæöIæ-„'6€.4ß³ñ§4ðr@$Hw˪å3G'Žíòô&Š5¡»¿R鯷#·ôL�ÌÝg@Ô^'Kß�“À�4`gd´| øÙÒÃ)å­§f‡|ð�èî ØRÔdˆ�KøÚÜ!€OS†ýI€–>jûÏpÖÊ®m¾ï¦fIÄòï“?e„ƒ¾µ’øIª?Ä%h/yCŸ9 0² ùxo\ó �Ù¶'%RŠaÛ6¤”Ɇrhqps͵JµÂr•§Ð£Pö8ØÓO ÅB.[ãí:y_îÐóˆ1Î+g—¾Ú•ùg–A1æL”&X4É“¹7y?“y£=‚V5·�‡�¾@²�ûgä kÁž=i6kijöçº@;9«ï¬{ˆCL=À¾z¶F$Ä8Ò •ìZ ´•üßÒK‹šM´ßð;,b“vÖrË(ø ôïè¿íotzaÓ#_Š˜0Má±e […Qâ,cÝæR�ïÅÓ¶;Çj¹ÓÙj¶Á_ð�b:æz–©Ë�é\¶÷ǯýŠ£±L±=¿"Vcl¢xUðwÂÝ…{®çT°Ïè~ /™§ía9G¤[WYþ�ŠR†Á¡´ÉÔÏ+ëíog‘«ÍožC(MìÚ/†Ê6š·Lu“ò„1˜ôÿœÏ`ÕpøKÎC)ì�³ã%ü~Brü›¡Oí½íU¢K.vǹã|Ë®9 øÀ4˜¹À*ñꡪ5­À«u3žðèn"‡©X�&ŒT¹#sSX›-ÁÒ`l$J¦•àv—ª­êUúÔß±éDçKsJ‘Õ+Ñ<ä6ÆBøpÓÒíž~}P³ó-RVÚ }³©d;x«ŠÿÅà2Ì÷*’ãBÉé‹X^Â"Ø�6ÕÕ z$x½PFI ÞØ#_OÄâg/¾^Â�ÿ­cðLÉj›P€†ègÜh|ö[ƒJF Ã+ü—‘‘‰Ït= È»ÌÜ>6ö1͵PY¾eO«|ä1Is÷,rBOM9Ëþ€x’k·h"ô`Sâ÷Ò«®LíEµ™AÉv˜,b_xŸVKU#ðä°\ÜvχÕxmÁÌn”u +‚q6©N!h%*þsfK®kÊ@Gþ}½SaˆƒfŸ÷?dA±4K¡]À-6ÚÀZðÇ��úƒ{Xpü^ S]©øé}S<ìÛºlm“½t¸Ï�èR•Õ礈âRÏŠ™%l(Ê”zè¼¾^â(s²´,ëÉÊü;¯ç>,¥{e67]¸çÕfØìðD¶êºò�)õÝ |Vë¥Ùoa¹ª$|pþé»Ç˜LülꚤÁ,®…�k‚ºÚÞd‡<Æ‹9�ç,h'VfÌ•À®qepN¹Ë¸a½s¬Ü�L¨~¬4E0B©¥F\ZË“Á’w è©>I`&x?½�‚)dbBYäñð=5º�ê22ª~‘œR«°ö 7f:ààª.êÇf^NJBcc±SÝøqâ¯avž�PS„k§Õ£Ù±� CÉF›ˆ™?K¦’’Т¸cKÁ§žüð¥Áè{&¦ø~𼧩ΖãiaËxé :vÊZ™d¤rWÎ ò‹Õ¾Ò';w8¥¢-ÔEhšч4w¥xÜ4p1y›­iS›nÝ®ùG~n¸@Èl?pس&Ã*6¬Flë‘÷WU®g$nÙ ªzË,³å{0Tôþ »Í€ÙIÙ\/b—yGä™ ²ndVsàÊ„†Wf?iÝoÿñ/U@7ø“söŠpòØè—¥,húÐ ²9-/½g›v‚²!ÏI#fu %9K²P{�[9=&Î'±OkS ¾ˆö ‘.TI±jãMþi£�-�Çb¢Jy¤U¢í´x¦×Ÿ7Ð|í4z£àÏÖ1Äñ„ZªÏ°8õ››ï;ó&Ö²?IéÕâ”Æ´óš«@Å$V(/u×&Ùt¢JhÀä?ÞJ�vÄcΗږ$�(¨“³’䇋·ÜíÜ”ã4½ÕÅMà(Ö“%p·ß»ä;”$¥ÉKêM†zI��í½.C‡ˆÂ! WY¾$Þ# ²HH=+�Güè¬G¢]¶[¨¶fÉ õ®tý.霋óÅÀ¬d¸Ë¦Ë•0_ÌRV ^™F�K/réar™¨£Ø5åóÌ‘Ï!Ö+$=¤ÞÆ �¼4é´�–�êåy—>(`ÝFÛ©êÀ6Ï.FLªeúŸDHM/ ò¹¡|Ð0¹6K)•š …NÇ3Qóÿ$pסWÉüIŽ”L G!®CTTÔ,ª þÁ¤®q7P`›jG h¨¦ÉÄn_~†ètÊZéó’«Ì£ ñ»æXµÓÏ�Λ=•¬`úÒÔ6ìþ9F— Néx+°¿Y\rD~µçÛy;«ø‡Ýí"A!»Èx ¯[ÖîFÂýªº5ðk¾B�&X+Ô ~åè±-w#³Ü>FÉÅñõvDMó6ñ.hœi"dù’�%üY®ÙpB¯wR¦5“¢vçð°äÑí¹:ô3†ˆ‹ÿi÷åpñÊOtâî¬éä—Èxæ–‹91!E&‡!D=gf5�xú$—Ï{V6»˜ õMÐrNÛi}fû÷u9$uÎ3ë2é†6˜‰Êb±Çó&i²ã÷Âß2R;SÙþ}…õÄÖpäÅÒ«ö¬X¬Œ?æVyÕýå!.�/Ø´žG-ócÅ&OteæE®ì¾N¯�Zl«q»UôÒîi gÍyŠ%ô¬ß` î˜ðêsÌ�8XXã¸Ù˜Bf—a÷·ejŒ‚vµ1$ãŠ7Eϵ_ØÌQgVT‰ü�R«ÀhK}ÓwÀ¡^c1RK° = tì¥Ø Òz;•e:$ÎUùËA£(„ÖJÈŸ„²þ·YŽmš�Ütþ¬÷ª0GÜô¡o2Ι Y>J¦¸«ÇklNóÅó '3Z"µV ;t”° =ž¡�`~TÏ"ùçÑ�먋V@R…j?žŠõ°öˆ³eA+³õ.ge’&žWÀ(sq�ž3ö-žÚGÞíx1‡Öª×$.c¶!}î¤NŸ:ÍI0ß,­à“§÷ i[. ˆœÑ”£ÞࢠްˆÔQœ‘—Xu¹$üD¢÷äÕ*™VžŠ’;.§g:e¿¡«©|ž3ê¾™ü‹œ‘§–�—Ù +5ëÝ©·`-É®-µb3r ˜²µh’46c�ÛEÀðïÅ{¡2–ãäbínA½ÕμÂ4G©iÙ‚¿&kˆÈú%o;Äjg,‹pæJñ<à|sò)ç?Gàù%\¦ ¹dv�0à *”ÿ‚(”¬¯²Ò[F·!b˜þ’ós%f×GßÁ<¥ïHE糿i‡s{ÜP(Hù€ ®ÐM.Ýu¡™(sΙrÀ~N:sS‰3ë}³m�* ø ÕŠ�0n=¿É~ÔU[ÖCN[+x°ùåj“-¾ÕT�á0‡‘S5µ­ôߌ�Ì­ù¥cÙ�Ž!‰Kªy'šŸƒážÁî ·+ø`á lwGßyy�³È^�%ËcyèM¶Ð® �tá׫¸Ð‚Â$ÑY¾‹4Ùlïê´e¦Ft·ˆþ¾Ó´’ú(ñ«& s�9µd8gûÇ´kSy΃82qÑ|(Ouú‰zŠ}ràväá’ñ$ÊŸ{�Tæ“Âu!w0»îc15—›çÙKhÅžtzø¼õrû’§æîx_ÃY÷I‡Êý’ŠŒRâ}+…J÷”ü-¹œ&¢>LŽ {„[õûeÈW%Å<Ñè;PÁ²“ C<õÝ„ À¢”*~A½Aòé4üšã(_0X².â3yßKŽöL¢¶V¥ˆôêDÇóȯ+yžJàFïäx:R,(“r¯VÊ«"u|a[zLÄÈA–΋ ª‰aÀäFÙá1ËL�.,?r�üu8¸[‰Å Wù‹…û¢V¯.IµL]ˆ¡|1EÊt|JÅZc<)\� \§¸‰u®ø‹ LæsšD�ÐVíÆ�—oZAýOû…Š,?œ÷7üâKåO2^êdzGjðQ¸"ÐëgÝzêåÇAUÔŸ�Lði±2¿~+FÐ=ã¦õ—Š,}~“ìDt÷7ÿÀð±Î¹NÜWã7œ'ü ÅŠ©ÝuFW FÝ ¸ùÿPé­D;8<„Ð$¤pQ¼²;Ãorï¦:C«|Ïç)ʱ`è@ÈÃP,àú¹ámQ_¥°´E,š 0²µ‰Ÿ_j¶·@@òM½wìq÷-8ÒÕ IrH`zÖOG|Zo4ªžë·ø”tfx® ÆFD ôÆ–\­ 4u¨ò€g0÷n™ÚïŸOö=ã›|?ÊÐo‚Ïp )¤®ÁÅ�Üf2ªV˜Û‡36¼l°n{ÜK69ÆX»ø®ãÓ}?~MŒ .LÐþT±(óˆ¦í¤ €wLi…‚RçïÇêC"÷‹œ Û`AkÇ2unK6’VnƒOì4öM¡Ìß9ƒëfwî�[‘£9}f‚±.¼y¹¯åƒÚ¿.c�Yaëìã[�Æ´ÍËÒê)ç‡ÇkuW/7`í]Qê»záU–JœW½Ê½ÛâúI» :Ù0íæÖfûî4-ÿ·vIÚ޶ݪ~Ñ�Þ™¶Xè¹-ÜhbË:Ë¥ìYc…p§FÐT«%í�rñ_HS!Ló¯´CKÜÉÆkº€Yýì+±<~8bAÅ·€z€¿ô!pöªÚopÕÌ]ÐeY~¡v–_,ؘˆSjhþ¤©ºdpÀð5¤þœAš�<€Dó¡å*Juø`L7±ýÞ1ñÁ G‡7© ‡çº,õv‡Š—ýT}6ï�6èºÐø¸ëpA›ÍÈ �Z–=¸tå„>dšÒ•K(@” %±FI†uÉÔ“6ö&ZhOÂ’¿*ÎÊâh¢â8`L›ëäÚõa˜ïNêaÅWd‰�ŽÇíQ½¸ÙC´eÜWú†Ýj‚E®~ ±MyWÿoÉCo¸Õ‹Ê Ÿ‘p�9¬óã¯1#‡æS )þñvðnVÀ—Þß2Š˜^÷,ñ­F;ÏZ?#â4ô`0nƒwÙ|Z×F+F*\ùÊ Å©lÜnPb·Vjo˜:Lï –DYrÐþæÿ©™�γ¦tµ�Ož¦yˆ÷ü¿ÀW'S ˜AÕ’÷u½“ÉWÏè0À¶:ÿSï;U¹„è·LyÂw!x¹+Å$c�8þÁCC‚)™»ôÀ©ˆ¬+Q¢“&ñmø-D×ÔÚNE7t6ôKþ¨A ÁŽ_ˆŠx–Üèæÿ‘0ã±;¬øGŸ�PͶ>÷Bk†ÀÞl\È3:eÉ]5|u„åbK¸ñÈ~‚ðŽ1ñÌܽˆ°l†J‹>Ä“t%)’w‚Z¶šeºj; ßàÆÁ«?YÛ,²° ûÉ*Ge½•ØfCV�üÚê‰Y±)Gm@ˆ�MDˆ$ÿ¢aÇ'Ú52?}—ÿ܇%Ég®¸Ýj�É%‘ç¿ã L»á4tF›5سö1xáUW©áû;™ °‚U¸±e”¾Â\#þT¸<ß*Ñ+¨8R?‘[{u2ÞÝv7ÏBo£ðÄŸ”!¶W|æUo²ê­,»4Xëô)˜ùðÒ þlâÁFD[¹? ÆC²\e$c ”Þjôd‹Ö­”šjkNÜc�¢ÿ:æßëm6·ßéX~óĨÇEyaœ‰ô�P2M`2Û„r<üÏx’VVŸº04˜[C«mɦUø²~Ûn·ñhÒ¨L #�–;¤y´Ã„zþ“ Åd«iÛ2ÑÊôm‚Áù–DjôNæ1bW-ðÜà´oƒ®Ü8ïu™éÖN†:QVšôAIí�¦ÔìAÏ{aJ¦)ØÏuì-Ÿînn ”´Í~*e‘Nqe6!3Â\R·8CxVJ“ OÙ—M[®˜�nŸu_µØ¬Fšò6â³^N4ŽÁž~)vôWôijà¤çi³-¬¤YO½Do™"gBõkˆh¸ˆGYÛobîÊÅêgmìÊ¢íƒ3 ÕÐ6j$¨áª¶ÿÓŒüýe–÷ƒ0 ‹S6®Ï¥®¶Øj@ÇhŠûÒ�ÙM/]Ý-Å0¾DÊÈ*À™%�ûZá¶Û‹ãX÷(a=F“ \†ðŽ¢%K(æ‚ÏúÖ(&&¹P†?a^­†ÞÖ4ÞÆ40îÿ|G“U ¹:œ²."®�;™©¬ã<§±è)çÌ=žjms¾¢¼$UG+ň[Í”Òço±§ô})ÔÄ ´í³Ö ø§†$÷2o?[WîgÖ©ä=PljÖrX66ˆÛ݇ªÃ³€3Qj½÷ŽŠ“² >ê½ÝÌ]n,~¢‹dñ‡´„�bxu:5-õàLåg0¸@' 8¡¹9€ £Á%RA€€–/ž°TP€HölÉ%Ы€�UoN{`ä÷–š ÎÏVCÚøXËcép8××ú]*­ùÇ‹zOÝfW�Ûcx¼¾(·Ì5cÐýmâYÛŠ=a' —lU>¿! Äב_Óº ®5Ë¡v;�¶dè¥`yæhëù'ÞˆÝ{¡uáœÄ&®Í}„TýVü¸ŒP3ì“ hbe0-Ú0ŒM (ÆŠ%¯áîo”�½îN±—³Pûw„Bª§zw�i»·.Nâ¤Ê*ÕáŒøÆ@�CÎü ÿ‚mQ`ß�4#�—Ћ+¬7|Û±4€®É˜Î šéÓþ&T©ÄÃ�©}û‹‰7à B¬‰]Œ.KfÞScÁÜ„BKð´ŠŽÁ8eÂKs–Œçàãnè}î½FŸÖa’‚[ rý`«˜µ>æä–ŸúÔš¸È‚U­ãk‚_l’?ù´Ëbç˜Çæ§rŠÁW9ý¢l‚ÁÍ*%j&@�¶†n’ÁŒSúK™/k œÝï'61B2Îrjz+v¯:‘2�ôÅ÷ˆ+¼rÿ6¢h1[©c‡Þlj.lÀJ·Íðš•qT ,¤(#èhS ¿ï�ϯb±´òV”'n@Š$b!Îc£Üx‘)¹p#â,bj�QVĽºÍüÔpY7 kµ™LüO"AÖX�Š÷—ÀÄïίò±dzdþÇΨ±äŽ&ZždËý"*„n@ZáCxÃGÌõ¡;tîëAûƒa?y&‹¥ÜPCرózOwrA>3À³«€ìÄ“vËÿ¿Ÿ ÐÔs]0RúÉ÷r#rô¿SÜž˜´¡�Ùæ±“xÛ<‘wØjóŠwfAÁâæ¬ˆà.)tðßphw-ÙUéñ†è›ãÞ¹ù/�Œ¯†a£�Íõ“ï_À°¹1�ÿî¯ØõÌthh€Ð�aVÉOÓ8À þ’2 !íÅz#¡©åtFiBÁ�ìK ù¸’·ÞBBzÙWÒ€s ¢D+)9qì> âIÖ¦üЃ¡gßàhè;r„p- Ÿ´4m}FŒN„u˜,¼˜Rı-�jž¯5„y£3'FÇ\e»�68‹4ÆLÙ³ÅM˜V*и®æôvç65@%£–7ÎWàƒ�SÙ7‚/æ#D+~<|(�­MÃr€?}‡‹öå“DªJ'“ )Gg�ŒE*¿Sõà�âl(Þ p¢pöëÕȿـ=ø±žND¥TzÐe%.hÎÁ�‘:¾:D�|#Ö½)ƒ ÓùãåºÒ7¡ÐGÒBXO*·% ¸IiL0Î*#2^-¥á—Yú~“O6ŸTúÌ>›Hç�¶rÕ¨f uÑ®@«õW¦E…ˆ¶Ær€$T¼©*"M3‘Rù&j¿àbßæ1è£\wû†¹·x)ê�5!åÇÞ6Ô6œß€ž¡}ý†ã H‚>„š 5[ôŒ²«ëûzÆßò^rÁïBÔdfæG½�XÑXg@Á’ qÁI£”ƒ[Œó8¶M2¶}‚ðÉÑDà_DÚW$‹ì:BP°<ž9’7šÐ#À˜€Hüþ‚¶ Ò§rKe&¾‹]ê_á‘5]Õlx¤ÝÉ´>DòyŠÿ4¤Ú{0û†?„óãó­­ë•~kމÕ[”`QŽ�×¹/}°=¼D>òXÄàêIŒ4t ¡ÃŠ…Ôµ ²„”ï�A…?ß~¢.´È±C^+sJ­¹=UµsÊÄnFa¡8á4X“ÉŽ‰”ªÄDš¹ñ«™h|¼ÌåýøåŽ#ᚈ{–�`�Êû„ÈßpÈøU™jĈ§¾=¹íbÖ» y=Qh'oN]€�du¿sÀNîªý„äUᢓÛ?ÄkE#/A¨{hô@ k—×â2£`ŠK^ð…ÁH®FGͧnG�ÈüÜ›0vÕü´¢š²ÊQ'dD³æ,`Rá ª ÿŒå¹h–Ê$4~DOUÙçMA"hFµY@ëxó&¾h'[V•vѨ*SE]œó[µv®²ä90ÖÑ6beË�c£ŒÕ¾zø&¶5)–} Ãéí‡@º˜©Ð�þ4G ¤|ÓQÜ¥U}TâP­énA‚ÍM²,[_`ÚÊ|6É�£*-k¦ž�j'·û)kOQÙ·x’�™Ùφä½:ïýÄÿ3ަ¢w— úÿ*¶4öÜÒóÕ·ÿqÍæW!f£Y Å;¢LtnÏô NQy�0-㑊16ÞAšr´$s{ØÅIÔ-½Bu³§GÔAN¤s^Œ-ºO?¢° «‚©#çãŽ$ÜmI;9[$ÔzG_mÉs`Éx'PuÞŸÐM˜§ï„ô|ïé•G˜î�%ú=©š•·g0·ËB4YdŠ×ì |’4Ìt{3~p#Õ,%œ¸žsÇPXa®Œ÷TB6#O3Ã…º�wZ ¿ ¨ŽCº‚G{„ÍRn~¥‡î8xówóËî0C^ó¨ –¡À?�Å©•ô�5žcÜ-±�B[ `'hFඬ«W¿©�ÝQª8빡<�šºÇa]§’ç‚"1O¼³ê¸×ò2ûAÎV¿³îyØ.YSšÆùCx=ŤÎ);\Δ×lˆõ l·wo°HYݸ£7kzá�ÀÖ¿Kai í]YzV"=±¸×ÛèGôÀlYGo).=ºß«Ç�s E9a‘c‘Î*³×.ΦZU�ÏcÇÙ¬�v_I±ˆ¤-R µ³B¸ž�f>°UE· ã¿=^/Ë×¢QÕLzìÅ6C®PíIõ{„c‹#ù˳&ºƒ .éLYÝËEtUž²™„~îLuþ�0x'’E£¦¾t1DŽe¹}þ¯hº˜öæðîÙ'+~2ìÚŸƒB f &tL‘¬«‰Ý ¢ÅnS>&¯vÜÝÓ€·QÒ�Q[´0{hR鬦Mg¾qÛº‹]“dS ´˜T(,J!Zšã³£ºz‡ŒªÈ NßÍæ×20>ÝëèÌÕb3åë[o‘òºyާ#ôësNß™pvXÉ |®Ï‹r7ç.´~Цqb¹× þ«8µP!ͼ–�^…\ØÅÓÅÇùŠw‘?#g±G£°Ã?$žHíheÚÀ± 3zÂuá×tþ䂹"^§V¢$}L$o®½N?ÎíÅ@ª5PÐ;ðëõ6žÕÊÎÊûæk�·SìIèɘ�.ù:Gò¸û{[×gi°ÃáÓg}‘’g¢·}ê­‘ŸVqL4< ˆ%èÖ‹Îw…ä½�ý(Í©mhÿñp/a@h8¹rž4Nª>™ßÃh#YÁÉ‹ åX’_€6üá·Exn?übgfªÂK�Yö¹}åžûMuøÔdYðö,†»†Õ]W< Ú§mB¨êƒíå$ÈQ*2D^qö-Y ´nIŠé5ïŠ †òšˆt¯ü–$ùT‚WÀÂÝ:JAe00°*~,£t8l�F¥É xÙ,1ÎwtÀ�u£ª8" +¾l<­t€½§¡˧n+j·¬×~DKZå6f�]¹…äÓÍ‹çƒ$[aw•Rö TŽ·ô&3cÚ€z™Ðªø�ü‡÷>”2›k~™«oÝ!ªÔw h5Ø?Ý  9CÐLcšfÁ㌃½ÙLqÝ\¡¯`UØ_21"r#­a�®ò£"ÞTÑûŸÆ–?Ú,�déÏp!n3�βØÒÁ,@,Ê Gªl|Šñ³äÙ[jØå64l•ŒÒ¸ZºÅ?±¤�é™Fì¼þÏrnQ€ƒŽ*¶?+}­;õ$Á�Óë:ómĉÛËçhw�ú¾ªêf…˜w¿I¤Üæ÷VLZö¤!%Ò™¨׿Þk÷Y £HÁtXËkmX2ô‹'ñiª�΋ß(⟲*-Þ7­eôE; è]î:`aÈhÛÅlxib�Ü”§6©Éÿ‚|Q ñ8�Òåí.;…°Ö¶:ÇnæÔcÕ½bÖÒ;Ë…Ã7=êý<˜Å˜Fúa»ñ3¿ç¨Équi¤"®gfœ;øÆy˜*ÓF”ò‚�ÂR –òjhù3r|ü1Ú´Ž~\ƒSà^Õ¡+Å�w87ÿSšßÝTûñÅž††9Õ¸´¦³«X;ûÜâHâ¸-øò?§|�oàm@Ó•¿ ·cÚmOi ò%€lµ(‡ |@zÜgØ“ð\Æ3x£'%§ ?…Ž ­©ûX´f1lB‡æGQŸ¡,NºÒhjc­Þ»8ÞŒ”!$–йþЯX,uò»GçÊù6€F¨ÐÇý@.šÊÈÛoºñ—~/ ö¬ßý²êk^¢b°©ˆ`�7Þ:¢¿n@ÐÙ�tÚWoâ6¨6“­¶wµpÓ8&!#§Yñ¸°{ˆ…±&ÙÚÐiSõ„œ™×Y ÷Ò‡BS Ô ˆÀ‡×¬ù{¶ZWZº{Ö¾ ÜÔÉ—:OÎjûÝѰž)£Œ‚P�ÔÓ»müYÐŒ–Œ•úëD÷}`’·‡¿e4"?Ô±ƒ–+wÙ¸Þ|䌈¤pB1Ù…M¿°¨EîâÅ[s‚Ö뱇Þ3!kª$¯èvçá¢Õ[% b®;Qv²±s�€#ÖQƒàrú [ÖMëQJa°|-YjkŸ¯²Æ ×í÷UYYL?¾Ç%l'Ê€Ø{¹üLÒ€Ü?º¨™3ÍÂäíŒró= y–’B¼±S—?ǵ€üùOVûûCƒ)9å?c@3›a—­àÉŸ£ âc¨OÿÆ€¿Ñ^oá9®Ù:"&t8ã$è’Æ”Ê<ÿý§OÈ�}ÞK G¾D•§-.é5:Më­˜ÝäƒM"£ë&q'1=v°÷½&ÑbL,*D3sXä,Å6œDcóÜâSÓ<c?�åË­gKaGb�}±!�‡Î‡}Zpurüb—Í6ç§ cí#�z(žæß0g'8C­•†éçì¡M\¤å‚u†´¿9ÅÄÒ%ü!ží´Ÿ§‹ßº”ë#,"¨ª· ',ü¼’\®i #L•h\9‘˜ÄmëæU“ö/ÄëL"xxÍD²ü:.’6ÅòÀd*"eT¸;X­ž.ÛxÁM�¤™vCî¹&A-'2ÛÀ6ç;r¡/Òf&Þ�ÛL´=òØÍYD“ê{öàÏ$ËG\°!Ë#œyDÔ;€¯¿æòSPR}Þ8³Ñ¿ûåÜ3©ç ðx=³A!Öö¥|ò×*ôóYÌjþ:x_™moFmˆÙ×1©ýa‘J½žQ¨?S‘9(k˜ñäZ.&¥x^è0å“�2BHvôxf'ŸkPUo†kØGY™¯§ãFÞÓ´¥ýï•ÛC¯ ¥Ýô,Õ;;¹—Û,F�£4òÉjÁ»”¦×B€ùY8F¯ç�zôÊóㄇÚö­P¼�¹üÞ_û€¸Å9)Ïà ­£¯q®L3’mô¯”ÜÁ±ÈâÑžE�÷üO¼ jé.†&�Yt7t"ZÄBf [œ†*E†æ¾´•1×àyR„@ô? ûDƒ²¡[-–y¶ÿÁ‰b™àwaç}Qpß­�EГr¸§µžjÓýãJÊíHôV^Þ Ø-)ÆÃ�#!×µwÔþ¶Ó$|¦ùÊUw_Í×CßИZ]HHõmPÉÝûÆ÷Þ`"VüÿÛ�´lÆì[Œ8÷„Zϼ_sÆ¿ ÅlúBj[•ü_·«›b#Öa/ŸéÈ÷0Õ¤•HÀIˆXI *¾ºü,";4�Þ„Äñ(25Íau™§l |3T5ÃTGÞ\ÚÏr  ‚Ñ¿ˆÝHÕx Ú$` jÐÎR�öè�"âYv,ܹLÝ*éão×Jaæ«ÝÂÇ1zÜ›¿Æ~+î‹€JxÕ*@˜´,†÷“ñÁ ºr‹èÌóÙJÁ<ù ™‚*ڶ؃!2§ÛÁæ)Xó…jçâºäw£²Ÿ%€j® õ'ÆÛ“}àW0»åHwüBÏRü‘küfÒhàÀ%ôGÜcä LlPûžŒxPœü•JŽöe‚¥Y¬§Ñ�DðØf0©-³”º|û,áxêT*�K@ŸðP–‰ÛÔÜ!½¨¬¸YõJ�J×e…ʿƣH}¯æþÁÞÁ ¸pþ]kýy¯«ñ«ƒô4,6iÁË£ˆ“¸ÊP±ð~eÅí5vnfšê•Ú^@²•ïŽpT/fV~ÛqoBgY+ÇáFÉßjÇz«ç©¢Gû%ÿ"zèé½Òп¢nØ ½_©ï}…pïâÓDÊŸ =jâL&/O#ÚÚJø‹Îì³Æ)»XÝw—ûôžÒz”Z J`ò@ó�fªs„aÀØsäo > [·öÝ3%\çlr\ßÝØþ,Èv~SÌõ¶rù"ýÂfø¼G¹ºL@”‹, ¬Œ²{¥PD{–-MYâw¹#÷h·Ê´é:Œ4(Œ"ÅúˆžS¾ëŸÛ”ĺ¥zðK•Šv™4AEÚxg„í^zr“CrCYœ‡Ç²Ù=“Ù8—º�‚0±rB�þIU<ÜZzøïº„ ŠEÁc¥ÛÏ>îå¡9QÀ®+ Çz¶q™át̰ h¤^jô×,;$=“WÆvÒ5¹œÐõ#a¢RÆ”Ô 9¿4‰ÔD£WÜðü¼4Ó8áåASÇ›Î�ä{ ëh›è;d£±">¼û.òL„²31_ÎjJxOÄÃÙhqN!%#?ýN§£Œ.� ¹Æ¸Ip*õ\†;3U"1°  !»‰œ¤™ªø¦'Å‘©üŠÓúŠáéõ´Éœ=— yñŒê¼,JŠ)e:¯lâÆ!÷Æt¨—§¥ÆÿúÓÈ÷{âc¯Ñ´†²¹ÌY ¤–�ð•-Bú¯GâEö>YÁµU!H!Ëýì©ÚLi¶âkC€š§x˜B›ÿÃ�#ªŸo†@ V¹ôªÓvAppÉg³|Û+ÈžF¥ ¯å„Ì2+§ ƒ6GÙ �ïܹáKˆ<*nÛnC)õº ù|ÞY¸Î-5DjqÆk×n¹ê˜ÿ¢J aÇéEQƒ¡gHÉ ÉôߨmYÄ•4Ü�¿ÐcÀ �Ü×*`þ_·>�±×uòîTo`•(¼b5dJ°å4ãÖ°n±ƒÿŒß×%阱›! ¹q['Ù°–À~øRž5Q–ɸ9·ƒƒ"¯c,¯¨÷øíÙ„A3PUÅÒ@­�qC”šc¨MA¤¤"Ë…êoi!‡÷~ì=¨#CÊ-cÓ‰¸~KSʳ‚#Õç7p eç^ƒäZ‡Ê¾ŽRƒr{¼ /°ëDᡃÌY8� ©*z‡´4z…c)däp/ëÚúìÆVÒ˜*ÎßÔ«ˆåÕ~MÄÖÕö"’7ÝëwEþ½oy!$3­õk@U/cs­àv²^v¤Ç¦Žá“ü½‹‚e÷´¼U‚·LÞß< ¬ *BúÖe�‘ âÊÿXÀ>‡¼†‹��8¶ÖìÉF��”¹¥Û£ö¤mãUt‘ËÞyP´d`Bd8.E�Ñû# >…q­™?'’?ŠØLª%}~Épœ03âÙ‹ «`ôK¨ØÀ­ø´ïÌÄÆè¼n a�o�xOÈu‚ÅÎcDâñ²!x¢_b‰÷¬>Aö^x3–ÎÌá4‹áÏ7f†:ª€È—©aÃ%Ž¯Ñ sÐô3² lŽdgé o£O«€æímÌ‘ÎMb…|F´ÎˆÐk+ ´8|eÃVs5öÏüJ lˆ(.…MÎ{ 8n¶#ËöEÕØè–ú;+˜ÞBÏâ+“vé…iû¿ž¿÷x"¿Ã”ÊðØÖDy°Öþ|}�«,µßïú"Iæâ%“ùÌÅn¸Ù~í­Ôh&�¹Ÿ ®†Î¬£îÑkÙ{" ×òÆôë~Î�m²Û¤l/΢*àù,b×r}Ù³ÆJë}N¤ÇÊ¢r”.áæõâ¿Ur Õü)FÝ÷l²…HJ&時—æéÑîÛ”�.�-˜¬Þ2}u\ƒÑß�¬Yd^4zUÈ©7CéóXt¨Ó?d4ĦNΩÿZ¡çÆX1— Ž?¨^Óût|ÿo‡:6»ö€N&2ÁÁÉ-y@ß��]íûÏy;þäߪwù²Wmä0Kë|xDÑ‘s-çôë:¢¡ë"î1—¯ðîÜdåãù'KvDlœiP5¢…™ðó t¿‘w¦�ïdäUzVi2K ‹‡‹¾ý¦½´™¿2¢™ÅªÆÈ•œˆSÈt™˜ŸÉÎïì—jOâ¤MQÔ;UY£W Jb¬Ìجz\¼VÚ’ô—IÆŽ¡¼bØ$—Õ ˜‰)ObÑ¡U€bŽÍyZ¥ý'ô˜0 Îy"¸<ÌîÚßN5™ó»:ž @WÛÝAÊ[÷¾‘é-jÃßU÷§�¦2éPƬ„2:}ÑMëÉ€�jY ƒe·1-„újÒY&)*çië7·%C*”�!%. DFg’mñÚö0Œ‚ŠÚð«M.}þ¯™§¾êJY|¼¢'„‘6Ù §Œ"²ÜZÝTà»b¯˜ß±¤&@7°‚/Š0‰âæßkGì>:la ©¸A9ÄR6ñû=Œše¡.lÞ\Ç+¿§nx©ïŠÛ%žo¼¡—Ï!œ�R¶ËË‘ú s²3ÞPfCÌüÕU£ë¼W±½åâ´ºNL¦ÙþÍJý^B¨•ø™wu‚@³tÌ ƒú�žø“#2ïŒM¶Òpýå§àì+»bMíÑ™Ý8˜>pM‰#›%ˆô‘¤õÂl„« .¦2ámX Y§ˆµ9ò¼naÆû$vÜ�º’„¶ŽOÔÁÉ|§xø®R ê¾eí{•Ì…þz#ïÏhcnºÌƒ¦þ2з¸ðúÕKÅR�åÞT}Æ{ zF¼CZ¢f'¯XÊøÛ¨C½ç0êþëk²±Õ�èÒÓÇ¢ÆJt Aƒ„WùÈ>Ðþœ\çë€ØKõErmáqë‡#8߯è¾Ìc¨�ôÔ &”M »û.Üh/ÛÒqLäž=j™|KÄÀHÕ7?�˹ҙtwÂ@췦Ќೠó4`¤z÷!¥ªFž•¸LÕÆz5ÙÆ˜oYÂöj úÓ߀²Ä`qèL?—d6Ñ€U¡½‚¯B„¶†¬ö:™jÔ‚\=�0Ž˜1„Ï ý8iEàðZ=ì¡v�ÝHeúܸ Æ -Ó›!$f¿A•A¯”bµJÓÓ”äe<¥z/2 ˆq@÷z2<3’A_%þdY€==Ò†¯ùÅC Æß¨‚ž±Fç ²'BËæø×áZ‰äƒÎyÖó<•´G Šd„–�íPd.Q V;ç}µ>uãÄ�¨¬¢ZH~?�m&9¥M^w¼­õ"ïH¶Þæf�­5Þ¶ÃÂ`R0A’ ªùûeU˜$Á4éEtƒnóô¦€æ(A;IZš@U;MVéÿzá>CŸ,Bi|'X#¡•jH-�¤Ô¸_6½#dã鬈N*‹ûŒü nHÓ<�,Ò‹ð¥Ñ*¾Q�夌ˆ·¯guâµ2‹DZûw:¬×êpè\ z‘>*žÇ<¤›_Â,<Íîõ”åt£þƒ^¼e$Úk32–xof†)t†(‡€oÉàÜÉnÊÐ纰ó#õK¢ÑçN¤nªw4Ó2±ôÄ#�ÌnGQ)²- mµy¢Ç�T$w)×Iz³N‹©ó£BE1ŒöÁöÏÞën–rivLÑ?ê—Ó\ýåYÚS)† ˆ…îÆ¾Õ¢+‘±àúxXDK¦0÷Uµyˆü€¦mŒ—Ñ ŸdBÇË;Íä˜Ú¢q€fÁµ"ÀmÞìW vQÚh¤”·n®;®nÉ'$„Â^Wÿ\çé fÅÒÓ’oߺþŽÕF‘»m�²îü'.’i‚ýõ¹±¬ p�¹Íó—bŸ ¿EèQ¼Pv½ŒÖ(×ø_å[irßHb¤žr´zllÍŒ2°[›¯�/Ú‰ ”‹ÊÒ—®hp/!Úkà±ðSåGÜÿÿó‘D|® )4^Åq2d-„|[Ÿ‡gøŒ@Avÿ“Êà“ä­þèÁ•éÔÃ:¬§†gy‰üdÑ­X«ÛVx¢h¬y _‡r+�?ù€@Z|Cð%©30¨LtKý3—iŠÅ�¾Æ·å Úªùù÷{Ýo…|æ3ÚP¾V{Ú‰)w§ ðIùBÆ3�ÿ$ËmT"¨ý GY�ö†ÇŸ'5W!¬ˆ³>%ÜmÌç˱NcÉUó›«x „�½d M¾² ‹?oµùµKMŸ¯|W/jðü±†ý<>?l«Œp2ª“ö#ž «K—á€4ôÐU›Sj°]¨nD�ÏðŠºÍ1õÔEÑ•Mtå�@›žþPVN¡d‡LÎ*áK]3(uŠÂÞAðNvØ£L¦îÕ �`—‡ ,L~Á�Æó&@·ïœ5cˆ°(áÜÑ5Ø��¹”ߦP�.˜Œeaðv}–‚¹XÊCóÜA+õìXb·[2=&°óL¡Y†òÖpŠ6¬XÄ+�OeQîûQ>è¦U’ rÑ84-ÂÿO«U3¯ß'T•Å9,½á«Sëy“o¡×Z×£¤ònп!ŠÆH¸-t¿]Šï}ËŽPô£dY<Új˜@ÆvJ³2¶½–C“–#ÚÝúc„s4 ð™šKg« P�š?á|5o¼ÂÞ‹¸‹q0-lE~�`¦·¬óÆjËm.[Ô”‚‚|ÚlãF†Di@�Mï⎮dPª½¯ŸÂÇyg!Ü1;XùõíãX�;Pʼn• JÉ"iÁp¥TÞIU—|oÿ:ß”²’ÕaA!xm¦ðEkÌà g)¡ð; ü Eß G9.BýÊù\ßét ¡8s‘7?1*ä�½°Tcž•í¨øXnYs&�|¾aáØ®‚äÂöVÃÛ=7¯R†Ž{ü >|ªKHD›©,ÅËHÙp´`c…†M {bxÝ ;øù£¾tò�ÞA+Bëy“1½¿AâDPÓLKÚÞÔ¶“¡8‚LyOë¼~TÑaÝæ�¢µŸ§:Åé:‘eÇ)O ¤ Éù[�On~jÀ`/zo�:…[‘Óbãõij-šî8›_GWH@<‚r@NÈˆÚØú&OW›#2mÒýŒý�¼s{0¨�]ÝÎñÛ°G_àòô9Y¾I&ÈËR.,ˆŒ¾�vÜ255x% ¤$í#òqWF‹·g6+íÍÕµ§o̬{w-c¡‡ÒëV r¥ Èá w#hPM¦Êw‰.ðÃu8`B±4ºåÞh->lÊö.ÊÆUd~g®‹÷ñIæf( åürŽÒS%ʳw=Qæ×t�|}_¦½AòÍŽÆq1 G7[SVÿ%-‚Λ1PÎRcˆ�ÚÝ‘³¸¡+4ÔvBƒð}ïï¡D'1åVç .Û$Y„ rNTYЋµC˜¶ ˆÀµ,÷½2\¤ÛÁ<ø~P@%qþŸ#m…öÍCBp �2¼ÌÄJÁ,^ o¬Ìç’©îTöÿ‘7SëQØ“Ö ë nèÅâºe7ÉÎÁ¦œßüuNÒ‡"¹ÝÇ/êOê#Jå‰{%'5"ö½“sE2« êµÝ‚/Ë#?[-çé²o›b³nΓÿÁp]ݺžb½vÂ>A`]­þ\ñt³h¿ùQŸÀŸxÞ$Á"¹ßSU)lä�­¿èù™øÔ#̪—õ)·D9 EdÑ�õ°ú]YÉZ „¹óYzŸdíAv�zM2¦îX„.‹J1]òÔVZÉu«ù–Ñ5 {@›È¥¶fÛu± ²»Ã6ßKZhȳòymÊ~á”1ô(ª�ŸÅ– æi«f@&ç ·–¿ë÷ÏgAIu3¿Â�í"’$â0@-5YºߢF¨¿D¡ŠMÐøÔ(ÊKõN>yö§úêºc>àzœˆŠ�y—Îo•ߥºZâèûv?ŸÍÐb#Š{:) ƒó‚³«�–pàëTŠghµÃRªû¿}³«Û«mñò ÙØõc�C Õd–áô³¦ÖA¹(çÒ¼^I›YÚI­>Œby°h?šjEŒàë!†m sbm·ç¯ ŸF(9ˆÛNŸ”éÃÂI~Ë9V¾DÆÃ:rû¯â|�¯ èÁb÷Nò,¬+F¡½g•ö�Áí×Ü&�(9ü°!æAo²Ð�~°8”öص†«ª9¿Š×!zG s§ …n¨/Ïôz2Š CíÃÉvŽGà«•,hXÎîÓjýi�‘eΪ…>Þ*—�ýAlx˜×�~%I<¹aµéXaœ©j,úFõ Öƒ¯ õE×úìî§X)é+,?C¸ññV—Ißp’ÙÌ�¼UʘåeÊJÇKDñÀ¥¢ l9çÏ(]˜â“Obm^Êáfù]ªw ÈÛù뮫r÷^ð0'D„žQZq’VP¤Ð˜„QÏ£/¹MwËÈñ°üú/ºGÞ‰àV¼ ‘O�NöäºÞŽXÊá»Ï‡U—eþ×ѹEt H"ÿY’hœô#ÇÔ_âÙ¬žèAa„­Õ®êDñˆ2¬œ«ÞX/<™GoeÁöâ@Ð�1GûÅ0î_Ö¸µ9Ì ÆôãgÜø„â)êoù·\[p~¡‚Ñr:Ñ Äpû¥1«¦Z¤¸ÄÆÚ¹š†ö [õPE �Ð m•¥ÂÆå2lÁÞJ ®¯~�‘WE�MÒ¬€kúbHZÎHòG¨+½Œ¤¯mÍùë“$†`¯-sô¸s)v€çœ!ç˜úŒÓcü‘�+Âà.{°Ja¦g` ´±-»ÍMœÒ‡sçG�\ò»"Fé&âð�ñÿsj„CÊ©�8ÅHñ*3IS À®§•±ˆðÅ¡®Q0 ÑTsÀZ6¦“ó  âyÃ|6ŠyÃ?Õ׃yýŠ-k{˜"pç'vˆO’%7F˜ö–ΞVg°5„L–´ùTÆçÕg�àlÛÇ‘ž.íâ¡vÆ€ÄmÆÕ@P1õ`‹¥6ˆáÇOhÍÓ€ÚÀžIОÝ- ~Ð{GýØ Páú�ÚkÁ_víj>Ê^͹ª|dºÎwŠ“ýl‹¬öÈy5>“:ú8ʶµnK²ueS[Âÿ9R|]öV¤ÐHWØz—eÀ‹¤žUb§I´¯ŒÝ—p (ö²æ+ˆL4~¯#̧è+Ä}ãN‰š4¬­µ# 4¦4…ˆGªC°RKZ�X÷¼mÌ hÏ�÷–‡f ÀK•£¿P T_1ù Ÿas§`ëy4®ˆ_S-€Ò†LN§7�wé m*"µàÿõ¾´YuLqÓeÖgª>0àMR¬´+²6@=ñY[áùPll7R·‘!dàB¼ÏÂÑËú¯Æ ‰�µn§dšÒç;ÆÈøèÂ1ªÙ¸d‚kè a½«@A–—¦ ìnxÄ/RqÖ-À6XZuVäïe_{ì Ù«!'=R ìÌY¸ÑÊ+ƒï¦Qµ~£¡èç�ö×j(—T“ί”*½$r…‹úyX°¹YgR¹W[¾ (WM?J•WsqÉŠ÷Ø�´°.òó*Qž_7N[ìÎ #¬H4î¯6W†îНµù)wø&¸çæÖeá±Ð&˜G¿¤²`—gáù‘c$òB‡Ÿ»“Î,ÀóXΚ†Nv)J€s�ÑôRÐz·@øLvõã§ÎÏ&¦ª(m‰ÓÕsäLQ¦x­Y¶+JÒ X*æê@ùŽú‰�dG,‘Õ iöY¶< œŸeÊü´á¬#ð +"#ã(ðï¬GHê:”–áÖ†l_v^NÁæNÔÌmˆõH*ÃÖ $â½§D'xðF〯Ʌò>ì&ç�åŒ&,�ÚÂ>�}G]ýo|6Ë#SÞã[ꛤ®Ã§ éÌBÓb‡À-x$°‰ÒÊì’V[Jx]Å„í§ñÅ~~â z@D¶»$ (RAMê�(°&Ó�ud =HÚù;iˆî¦õMsÃÇv&˜�‰æìb{–#ÎNKš�Ê™º¿… [JT;¼ú¹œ6ù]Ä'Á \rJµcåî ¶ ÿH߆ù)X¼«½¹6]$>/w‹ O…Úœï"ì`TR9œtSµ_âˆáã ädIC0_Ï ¥Ô6;Í)S·(Ô°ßOÁ‹|muÁo뾈1n}Goš"=Ø´4oiÈ„ö \nïOØ‚¢ÈAøý0ƒl²G_“(…s°Z|1ÀDw‰›ÍÇÀ§ÑÄ!ï2_ƒÂ©ò¸µöO¼e8„å¶ŒcÿèÒ6Üë``rŽJK®ŽÑÜá_]ê¡8ûcuÛ};s¼¶L>_î†ä’½¼P®Â¤€�Áoâó± sd¤’化Y€¤õ:¦ÝΡr�¯ˆ±O˲z�¾ ¨Ô/ÁÿÑ£6‘èœÙÚ· wy4Ÿd剹IúÅߺ“«ÿþ�ï%Åi[€n:ŠÑw'°Õ›÷'…Áï2Ÿ%N¬XQ[“4⇶~©¶Üƒ ð\i<«@"¼ð‡_!üù 4X?ØT¿Æì—”ºÍÛ¸Y8&+�\æÌOª|^È6ÎŪ0dø%ñ#D mr±úcß‚ÓS|`ÕöMKããh§�ù_Á䯓‘ìfSþÚçÖ‚ÂÁmDK(D•¹O†ßö×G{×̪6/Ô8µ&ß•AÛö7³¦6xÕ‹øŠ`3 ž WcÇDÏO{£Œ˜Kþ’c‰T?‰„Ä]¨ ™ÊS¤YºÓ1÷[‚9D%°!4�‘XÉí8X…Ã2?§v®¨Êæ&7FiJŸ�pÚA‚å EMºýÓ…W¼r?‰”ºì®ÍCLÚŠÔ ŒÇÑ-\íãU>å ¥ße1X(÷¡Li<ÂúCòr̹ùv-¾5åÓß­-[S�5ˆ¤1¢ÎÿÕT5”á6 ÿ¿f�œ; eÏ÷6e¸ý:î>`ŠEä=8mlOšš#ŇJîËèM­a-S“’6ÂG­+÷mÂAŒã1Ánñú}Œy7€×7À0æÈBÛÙÇÓŸðœdþ¬¦ �c¤JÅÅÁ2JŒà8èW�K1ü¯E›%³î¾9îÆ�ò¦œÖ¹8R1Â(é‘ì"‰âº°¤È ùæ.7§ú‚ÉkN>Š×Æt!ÐâSÝœ%´ú�¾ ϶—ê˜ríòø/FÝ"G�àÃýÄom}5ÿv*òWíÂ_‹à4?h1¨Mç– °ð²pÇnyQÇBÓEŸÌÉ&Qcõ´P÷ø{#aYû�ïLh@&�=ŸCôéÕ>%±¬—æk§¬A�3ùБøiŽ•W�«Ó¬x)€Lúa#³¸¬gÛ ÆwרgpGžÚlj]@z^Nžm�'’š$áÃàA…à¬mŽ¥mç ’½c«½Œ™P{Í+4ìfü –|Œ0²v‡¦5Îñ'°dË×D%æ ×�½ö[Ž ™vZ—gj¥ZŽ 3 Š:Ñëà¥b9 ³ú¿„}ŠQ(jëÍÉáÀ׿㯾±Dù!ÐÚßÅóD{Ž@Ò=‹¦¨Çtæy_Ò›Î>¹ŽR• H’e¯òáÚ#Ž=3í7 $Î>ˆ‚ÔgŒ1þ­w’_&oÅÿ�ælÆqße®Go¸Z2ýIt>+JN A¡½×�� .>àí.m:°£I¡žOë­Û §ÌÙ{'u íôý&\ -é6náÁÛN‡´ñîmÝ€&qº÷Ó0¦Cо�Ujøño_}ÀóÕ2ÞÕ”Ñ5Ø­äCû”O3›TÇM˜L¤X`pWK8rT ^žË-DŒóæÝ=‚圕×MMXeâÔs1£Ë5vEÛ”7WvbÉš%ö$‹þ¾Ø SÏ�xÖrÅ!…ÐÑý-n¦¤¥´Õ_¿DÀè'Y9Ãl;‡MÐé$0`/•üÓÿÂì y‚B®öPþfÌgüŒƒ¥$4NŸ JòÆ®u¹1åO˜Ä3áûcñúÌÅÝZE,m4rïÊ‘|• Iü•(º¹…�x‘Áðÿ¯‘†ËŽÖëÝ.ûé®o¿ïzLéÂÆŽtBõŠèLÃehd3�ùÞÈ•½ù'ïãÔ¥ë2� J¬m' ¯ßí=ЀÁUð;{ïžc÷©µþ-*²Ù*$þö%ôÜÞžD9ë˜�ü _ºs°¥õQ¹Çc@À8Ç�e¦FFÿŒZt–ƒ–·Ï‹e0²–½ÆÞhKí ªÙ‹0�=ó´«¼:>>ÊìïšàGò&{¦ö* :M–Qtž‘>»7¿ò7¹ùInˆ mM²µG¤f¼õX¥„»! ï=ŽUŒÎ·šXå0Óד}¤E&¦©ËùÅ*àÛùÛt"“½.“ya«¯úÙ£ƒvæ›'°¹fÃ�ÖÒùT,á^9Þ.F,´#éM™ãdñ²ÕUÙêgfK1¬�ž¢°Bòáz!÷ÏE° X%­bJÔÒ_$÷¹>è÷žo]l'8Œø¤´øì hUÓwĘȩE½Qð©Lãh+ÀX™ÚË¿‚°UÜ�JŽÅ±ZtDqÉ 8ºÑT¨y…Ô«w¸Ñe9-§AA`IrG:‡1¯-Ww„Ã躱)ÇÈR†¨šjëojøzO®k¼4öTZšÒÙ½ÕÒ`¨>�½ `5` «„v]°ÓCâL*ðûd¥8²�KK‚hÑPMÑñ1,4ªªK�´Òäyc£`”‰Èï´2aq×å b�Gn×ïÍJ¥ myí6•¬K=ô;µûˆ ^Àx?K,[ï¥OšÇ¶UMÌû[»•¹„hyëx‰noQtÿ8>ï³Ïáš±vNDSÁ-Çx£yÝÅ\òb¤Š Ÿ%ϸò8¿QÌt›MˆLò=*ƶ¸ \¾^åô§ü•Žûv¼‹†j†Aj)Ùy9UCà!k’rµfØó58ä{T ,o¬Mmæ¨ êP%ÌÎÖŸÊ Ï3¤µzs ÕX†²¦!7Û0ªæ!»³<ÝH }*ÎŽjUµÌ 0:±¯¯0?b4A�WchaA� &vX- ƒ’“j欯- ‰dw`n»1t†mû „,>s–Ô8¤nµÒû:Gh%«1ÿíª´±kd2Ã"—âŒðèKÙG3kØSoÈ]›:÷�ÍbÙ`æ©?Ā׫ATÌÒv¹„17…%Êô³õ^�ÀÚfûz]¢­h�¤Û—›ÙÓÆö#å@ðDH6Yq©;_¶rÏAH¦´m`k¦ò•Z)¶‘º?„£e ‹~F?`oð |ò9?Hç ÿâ‰m€¿éP×tŠ‚Y^ª†¿h~oÐoA.-QAÝÞÙ5} ó~ú‚Ó‰"ǰL9\(Aõ´íï´l¶É¸üœ,–²ËÐo:û÷o³cŽþÅÅ(Cî$÷g¿éM‹iáŠ÷ç‚6Ï.Tv~�áÔo;{ûÔíNÙ wS%{ÃÅͰ®‚›D>"¥î;­k¾«þYs‹¦é”½÷™›Ø×ÈÞøzÔø`#²Ú¬"ZKí òpOùJlH½n†ô ÃâòBˆZäÿ1²8¿>(]ùÖ&¿‡Æé©ã˜}û§E=rýB2ÛPL•ÀT\4 4ß+vMÐÏeý—XÐC$¢¿X-vg@—6QxàSY²þâÍ™š5H{™½™`mrØá7í>z¹žɦFQçE {ƒYÞ{¿Á(Ç7~ÓIËø�‹Ì™…ÍååFù>µR°æåuƒš>°ìèþÙÁ‰üÉÂÐz<ŽHc~ýœžh³jOÛ’hïªôºÝ�ì.+9žƒ$P­úJß&!@C's4émÒ¢h‘sÊ-“»Ö#ûº¡M¢…mÉZ wüCã¹îøÃ…Þº÷¨3ÃRT}ŽæÄ/IËÉóÏ^©ˆ½èq]úi�ñéðÏ?†ÌY” Üï5vlI+gqÒ9uþ Yº(Ó_€$ÇM?ë åO"nS.ÕÆº®€PÃU¯Õ#fàYêI’¡˜ÔZx\ôQ Yu,ëʘd¥�'üxóœ†ø~_¹6F7Ý;6åOW†Û,f‘™ŸßBR{S&‰§Ï€µpJpM÷ u\â€8 „Û¨�Y´°ÖÑfwü³,¤`,ÄïT³ó¡ËXƒí…Ëü¼Pã”1 #^Tý/„½ Z?;~<š!)öå³ò­,Õ#g4ê¨A1ó?Ä ¥Ù»ƒ´ûëŠûyÝN²-FŒ«E¿žæ4ˆðñ"'4¸ó*üP}$¾Ø%«»¾)Ý8Œ�’³¤#L0Æf6ÄX™ â˜ORþïj$#[5f›.÷~Ò">=í—ÆÖÏ#§?ó!7å7Tó)Ú÷“ªΚÇÝ€‹áÿÏøN”/5ÖMD•ÝO!Ý�þ³7æ�ß܉=Ï,!ß3R3j‘Ú­øÜzA„!¶ÄwE‚nNÅg©ïA3ô¥“°üCnÃSµÌ¨75׉q6D› ç Ú™)É‘�¾‡=þR„äLâ¬1\¬5­nä#ßL¥¿cêæÝÛÌe<Ïlõ’©dçŽ$ƒ5°%2ªõ†¿Ðâå%ËÄYÎðwëü©Ó³Ñ pÖz�Hod€‘—õUBë`X³|†O�`îË¥#èÔLàØ2ß{ûefŒ"=z%L†wÐ.2ºú± ­Fª´Ïüʳ;%ͽKë)Gmhï¾»ÁyŒ€�}-ŒŠG½Úò–ŠÜíßÝÓ}Mõ­çXÍsl©&d¡=Xa4�¶ƉŽË³ÿ‚ܨ*¬Ø‡Êvñä’’.ÿݶ,[LiN ã™»§jÒì=ñùuÖ{oÛoÊÿùÎSøo2JkBéÚ1ê߯qñHæ&yµ¾õ¬¸*Ç’Éw_k ©†ße…P­(á+bž^‚¶ó¯·•‚5Ï#ÛŸn¤÷]Qѱ)¦Ìq?<‘l_âÝí·þÆ3žÿéÁTO�øú˜?†+¤B÷­×7ºH [+Ê8~ÒýÕŸÈë??‰Gü”;t¦ >V©UU¾“� Ÿâ7÷bS Èì@ñÅÈåÖ×`šx•.Dù™¸âiPd^E&J<î(& ^ü¥kû3¹›òm¥ØKy3 C.®J£ºdAºþ$þÓ–*æ9ë W?+ =ÛÊÉ( ;Q¤ÏÓ2yõûo®[á1%ÿ¤?ƒåâVýÀ°K§sØ»„ì1Mì,Á¬ª%…îÆß+‘ùKûU„�ñÛSIøT'~ˆõQ70xu(c÷¦%¼«Géñ%é:- ~Ž;m´TöŠãÚÝÃÒGIUMxÜ\ÿÁïw¾€A”ÿŽåãE-O¿L¤Ö´± Ô‘ö/ÑBdU½õâŽ,0WE·s8í�aðoGq¤²µÌ²VͪV9¶ç�Ú#Ê>�ƒ°êÊ, Ÿÿ(OÍÜX’&‡‹ÙæíVÚœ¤4AGƒÎóÀQýòÃáßÙµˆvlCÈô•É8úÙ¶º2~®§1aÀDV-WuxmoGâwõÂŒ×â›±<g‡ *ZZ�Š¡Ì`Ùkµ™Ó²/°Ïµ%/ÞA, è¨X·Qp�õFÅÛ¢IÎþä¬ò“Õ¦¥~S-,;°d«0ËßöÊÙ]v%ÊÊaÒ(Ûª>Mñö‹¡€%Úã±%yQ'ïÖxݕʵ„b]ŸMÕ­ÃD%±5á¬�bø¤/gû;%ʻջ«­XÁ9AÛkrPýrM¯]]�ójõÖƒöƒRäÊ!lNù]¦µZEu)�ø¾:×ǎѨ¦<ˆÄb7í‰òíËàƒ ùŽõGw ®6ðÙ50åKŒÏCO\z)a¿Täíîxß}KB4IY8ÑÁ)& ñ@³ŒŠB–I@RS^¨Q¥c›nxÝ¢2S¹¥Ò”�$ׯ|} xáDäX*ŒMÕr ™*Žaµ]‹HB‡a"éhöëȧdÖ>À$õ}öBö›l¼ª%QN´ãç�ÝÆ�åu\¶qz×AA}‰äCéÅ^Èõˆ�XnKŸªcš×eý5××=›R[’ž¼«�‚£e­z¬Ö2^¼ï‹º¥5JƒÎ“Û Š…Þ¿ª3vLMÎ0)…¤ÛŽ¥ûPôÔw�~«x$ܰ’}¥òhˆ—Ö‚!¨ÐK*þá£år«ßøD-2î9Æ9ôVe ½9Ý™OæÞ±ð¿èI§cðmŽ€Â)á éᤸ{ÉÊʤô£2wmÉÌQq,ä~í#=Æ{Ðf‡?½y¶ ‚é##«æ§\ä±G¡¢nœ¦T[ßà(˜)%–0-Äeóm} ÚŹ&G§&ÿt“}MÖEóMdàHÆçI³Ë7ÂC{ëÈTé¢&˜”©)ÈÂÁiîÊ0'±2Q�Fõÿæ o–`&]úèÅÙh†õ ›ÓT]!ù/½[ éƒÁÿ«¶øCO´%O�(š§îq¥ä'ˆñN:ñv5Ä%sòCj ,�!ö:žÍ}NL–øpjÍËãö×´Û} œ}¯`ž©ó�&²9ÍŸ¾g¡²—ŠÇ?šøOP�ެ‚ÚÍâïd2ž^㹪ŸÂT—ÔZlm�‘2¿çÈÆûâÜD�ý]ÔG°õÜ$…+gþîl22É(Ø¥KÈA¦GiüÚŒ0å¥ëK»85£³—Œ!5T­‡òª[ÿXTÐçår¨€´FèÌãž¶=ûgxGþÀ/ö¦Eæ|ñ‰¬Gç¼ÚbpshñΫpáè=�QNÂ^Ò Høo!2…ßÇ`_ÚRÚ«¦¦U3O #'.%€�9þ™1�+T–ÙèèÞ4´#<øûòo–ªóD´ÁP€ ˬʆ.*ðĘUBœ)Þ ž½&'…ù*ðc ‘ÑÚ€@9å%¶îPÃeøS耢Ô,~íÆr,"9c%µ(í�‰]þ`(;±ÆmÍÊ®â$Ây’S(�N�ìKêX8Òõ²wQpËå¹—õ["äÌR‡\ݶ•ÎDÍ›HJ: è6˜5"‰ã�Û)ƪ4:½Ê.Ñð¢¼)ŠZ M…¡ ©¯óðÂ$‰ØîumÎv[Öä¯]ýÓ·™@CaóÀ¾Vu9y[k:jÃTG!CNñ•�1Óäà•·`¯ÅWýôyó¨5óš7ЪüŸ™Y‚ü¿¨dƒ�šûÝ0›8v¡žTÎ�ófPç/u$wÃQÀÏx)R-³,N„*U”~š3T/Tºôf× ÊlÞ¨/ª}\?ïõ…ø+Ó°['zÎ6Z!2P{DRP™M¦eˤ"/Æ¢]*×rDÊ€nCÉWq øžÜï;JUEÁQ]à³®²/­wSØ ¿†«N/uëM¡âzgs“y+;ü®08�M+·L–>xÆý‚û¤#� Ü9ãZTÀ™ôAå#Uiýaû¹0mvˆëáù�jzbP0ZÕ îÆŸ˜¶«Ew­Ï z•Øü«ñæ»SJb‹â ÿ€ Õ^hn»Í•æ3Ü%Sýv*câˆ\0…6 ÀVŒ€˜óqÖØ¶�ýÿù€x@:£ û#€ƒøÜÓ†QM‹ô/éšÒNeÝoî×1ëV·�½½_ëýŠÔ+�@-Ÿ“sÄì]  H\áÁcn rÎL!âØÃºµÑê©™Õ¨�y™¶-TÛåq‰aÝ8=zçmÏMÑ”e-&æ­DמXª«žO—oÌ“¦¾Ïñ“³˜1ï"9RG�ÄËzÇSüMêô:¿´-n«6°œÁ‘ÉN¡XAdnZ’1Þ Q] n}Ãå£oo‹_´üÿ“°ìFu±Æqyn¯#ÂÌó®zàÉIÉÓÁ¹1B…£Ø»Ñ^—QtO$ë ¯ð.JOpÝ�=,ê5º¬QdEå[Ç‚CèÔßUuºH<¨“ÎË*É­Ék~< Ééè–äþ67v<Ú’lOXÚÝ—}Ž™›âJ”*�_ñ‹ÎáZD‰J‡¦µÔøÑÑáç�tH¼œòáîþ(ÅŽ®(®f’?j�à�µÅK¬0{³¬¼ç^oû©¹«D‘5ç–)îÛäyû©-™º„ºÃƒ4Ök¹§Þ ¤þÅ«õn¯À¹ x¬¹’î ‰œÞFdrÇe{ÖzTõw¹æ~ËߣW^º·:¾ú ÙÆ= f§*�,lUúö³i/Ö�öÇ}èYêLíQ?ìZIRlƒFW,c¿I¦þy*þo@lñÉ {U·ÁŒ÷,¦Y{¿LåLF®°½AÿËR®RbÛ¶ÆŽãZy»nìÒü)ÌÓs_’VUPJŠGô×Ç"?rªi4û°vc¨œÎ%(¨ˆ/°GHˆ;fp�Ž¿öÎWÅó;Coxk>d3Ïë)À£Ž¥œFH'×l5†ïÒM’ óIGßG'z"q£`%‰÷BrîÈUÔêéÖqü¢[PûL[ x& ígÚ©ðs”' <"Ód¸I¨�çO©ÆÌk­Ga2µöºÁç|÷àËy¨µ©C²P�qïoŒèôï °ü1H ‹6WìÒ¾¾:ÊGDõð‡é®ËøC¶È¨¼(EÑУsçJ ¾ @ÖM^…“´dDvÏKÃNn¸`ž!|‹IóeU\E¶{ì||Csºug?([®ó–™(Õ‡‚zTnæµýúD—-ɺGûµDs^±nÐWj\³;Þê3^8ÕUåì¸0Ä¡  $BùFP‘{¹>K6tðÄHcèsÞmå(”® ì¾Çšß#xÄè6Ù“uñ´þ6[÷{GÆ£Ì!òZ9`�z߃®û8@˜W>ÍúWþŽëm¬¼vK¹¦ê‚2M˜«ÕJºRB׫]hÛh‚ gâ_«"íönÛë¤=¢Tã~§ó`;Y`hL@®|d)?[Û)‚Fñ6TÞ}kÞÓ«eÚò|žúkâa€˜íÛ$[òšqÛÂò@Hîh&˜ÐÏY�µè°0"¯CcŒ 8Ù© ‚l¡ê°)¬J|™² ¦èpŠ�ªÖ9;�€«‘vì_áQí.Êh«ÐNb]w�/_7s!¯šò‡ØŸm¼¦Nr¹ÅÆ�œb=²õää¢1a»‚"ž1HÖ.ZŽ�y6Wç@z�>óÔ$³ì¶È#„cÑs­ûW:5>`f[ (næÀ®,ò©m�ÎÔd7&5õKͤ£ß÷hä3ŠýM�k¬d@s¤VÚ�ŸA>dC¹š®¸înäÍ÷©K<5fã2:íu¥Müó齈6`AÂ.Š…:!rèX¦€“‡Ñ{à³Ê…ÿ¶5­§d‚òÙFM�Ò£*_Ýo0Hç‰2êV¹ÊÚ/”žAi«oûOO�Áb¡íèV$ü¥ª ûskî�rp˜�£©-%Š@ªùCX®i1غýÝ\èk;DûpóË�¹TX‡‹”°¦»!A³H�¼ŒZxòëÕ¶ûqŽ´nCš‘ 3Àv�¶J@ÌËèI i l0€ÚˆxW½@^p1èÄhQnØe‡>ÌÕÃgí8Ôs&ñ�7îê=axý�mø˜ƒu�ÞÁ n 6¬¥R úLîrC¼¸uê#ÚT³Pð3A0�tªØãŠºÈ×ÿC:Ú<½ùçþ |–¿††¾Ê¢,ó$šºóa}Ü�ºŠ¾þILò5UK/}Þ-:Ȩ usé.9Ë€ñ£±3¤êBøýHéN5èâ×ȦN�ò*tG«pûÁ¢çBŒh—ôù¿(9c„cØ Ñžž}Ýž bFŽ�˨×,æ(‰E)¡¸^>ëeô¸»«Ò¾(H•Œ³‚7Êg\c“Y™çÅ´ \hEot™‰Åô[(ÃËs¿ÈÚã+c¿Ä¢.:®x(¼/j H»Ä¦w�‰6µvèé]©}2wŠÌðÖ³2<¬sUdÀÂ6Ê“DœbíÑý`«Šp}øÍÙ£c]àÉjÑ¿oQøw¯»ô+ËQ|G'ô)Y'oaθÈväëDç>ŨR”Œoä6–—~ǯßÕÒÖ`§î…g �8 ”TŽm´ˆÃVŸˆ1©P f±2‡µ ÖJ÷‚3øÂs;P~^G¦�eqT Kª&)DÏÝÄãÆ_6Xúš晣ü‡š6o—¡$ïdòÄ:^s:H}6Qå& À¬â”.��•ST…p)Ò~„G˜ &WÛÂC}Ýf<ècxùeç,G˜y‚^ âº�þ}.©¶ -W|K“’p¶Hr�ÓU,!PÑ®Ÿæ:Þȹ¶êŽ•w@Z”Yõo}ár0~‹9Iˆ­E2÷£RéåúïHø–fŠÅ0eñZbFeã!þÊ33Û hr@µ \°Ï€ Ù3–_ ûPMYÝî(FÉÎOݶYf�¶;áÐÿ÷¬(ùg¥Z~‰ÝÏ&J�–7�TfÅ—õáþ–¡æÿ_=vhrqZ|Œ¶€ŒN ‘D�K™* åʘë8ÆêØ`& ]ש˜)ÆF[ÑŠ[Ò šž”ÏÀZøôá&)§…'BpŠ�éUùóÅ»&b(,Œœs®‹>él-Z"DðÓþõƒ—Åű©-ÆA®R…¦û%>€Íûšv Lx¶ÅDˆìSB_U§Ò{‡(Çrݤ޵œiÀÄHæ¶xˆüº|äí(e8³Ë,?#þ`ËÉTÅòm96›ëg±ÌºÛ2MƒâmÇ`Dn6¢²ˆAïB³ƒ}XF2ƒ,áx½�^ø•[Úæî¹R¥±Žö×iº's/ì´ÕaBÎÓ%ùÖ�i¯¾�z¦vÒïè”:¤`hõ'ŸèÇ¥w1ò�_p ºÕT�J{î3k¥¿ê´'É��JµfÙ'u1çZ|§Í/Ol:ôaBdä~)r„.Æ^­Ø €÷-/š5§˜p΃Ê›Nq\9"×¼†×W°Ñ‡,¦B…Þ›©ºð7\Ý¥IîX;Ó¡â~Rr}à 1®ÁûštòmFÏ¢‹W^Lžø¾2¢ì4:w39Ö©Bùr@jN÷Â"Q‘ÒË6IœÄŸÅ;Xhæç°ùn™ù/»{ˆ*Yr|Œ)C/¼Ü h�ͤÉûšPŠ?è+�Ö ÍëJe¬KÎe[yóÊ>ƒ‡�ì(ÚP¦7`?FÚü¡O_›ýÅä='}™š ˆS|”ÇØ)Ì×f"U³Õn83ß­ÛÞ²;j˜yøîí7«ûŠÙô1>Ú¯§]á "SÐÇËy|ʵO‡:ÕJ‚*b#ž ûƒC›Ö!Öš>·“ô’bJ¯)À¾Ž¤oOgQFX-¿>Qç" çI%ŒÁA;61‹i<µË°-³2y�P ¼vÅ~Ƕ éX©év��m7©Ý.J›ÆàŸ�µ|m „ ;m·ÜúÌB�p÷;âù-Bf™Úx'ÊBŸPIê’ŒÑNWàî'^ôµ ÌBÏ䟳éyÆv²ß_X5>”íöÖÚôá¹æCˆ9¾"a™œäôކ&¶±é‘‰‰Æ8“ivŽª��ª9T݇Î;¾Òí;àÙãy^£6è§A¾[�@™hÒ°Ú¥ùw/á4‡S�SÏ{R´?QÁåúºuŠ* q»HßãV¬O[2YäÓÂ45^¸÷�†|Oxn¿(S§R6-w> G简¿7*¾¼ÈW{î�¸ –·«°pé 1 ߇Z•Sœ�-5[àHS©€{§äLÔ"æcšyÈ/+P¨F´<,_Êà;;¤ü©¾½½�Z‘ï/ѹ²Ñ�ÆG«FfÛV5ZÉV1x�ÚŽ'™@hf317=ÀV_Çu„Ô€F Êãd“~yÍŠˆ8 ¦ß]±ã>ú©J@H¼MDâvê;G£`ß:&Kdø«3ÿ¡~Òƒ†á¸hf|ðƉVPæ;üØÔñ�;�U�‰«KŠ•Ó�Žo¹·�Ѹa âZ7p•­IêÌj“º­ÔÉgÏNyGÜ`¥»oB7¨ÌÔë£O6¥ÚË5�®\R;ÛÛØs¼I [M®™ôC£µñ¢IAú|]N'éÃüÝ`N@THÌr9øxøÀôAµú gµ\ãÔ’œIo�0å^‘c Ó·kï]KŒÎg~½¢' f…³ªJÌÞ D[9*<ú¾:Ò‹F,o©7m*ÇZÝØkU0ýÀhU§Ð’‹v}AŠNa‰°þš@�ó2 fŘþŽz4¦èjöØûÂ�Q4ŠÃGaaÚ4þ … cKÒ JW™[~"ÌçÂt�¼ÙTžù(ÂC0‘ ²’�s(y�Ž~–ÕÄÉhGTß#„9Ú8C¨bà€0tB˜­_k–×-ÿ < ì!¤¦iÚ&� e¶^8ù"�¿Ú4tÄ®ãÞ§ÌŽæÒ‡]ÁŒ_t&.ÐXøèÁ(ë„�˜sHÓB”¿eZáØ%Âð‡W.q¿bÑ~.ƒ_páW€áXÆ+.c*Ýc®;ÇtöêŽNp îpêŸmUnþ1Ö§TGß]£ðÆ—�/Yf@cçk"-(êQ ~”¿å€¾ÊÁ}¬¯¦Cœøu¡Rt-æpå\Íèâ48h˜Ýk½u3?Y®Haì ëš›5ù’ðìßMï@5õmزwÀÞL¹]b¤ÌÙæ'q@Ûͨ,  jlSB¼‚{©Ïб)¥ ðž ªð›çåèD¿¿RjTõwn}GàF䜱Й;†Ê_€Tÿ ¯‘äqË+'^à·â¢ùË–;-´­DŠÐ[yä‚‘O.Í�yí¿ƒ«vÌ:&Z­\© Ù°„5ëú³=¹?ˆèxÛ+eiË8,€ãG0Ôln#@Ь#(¡@mì¥ Î÷ª¬*é®×§rÀí‚Ç@£¬xŠ9;¿�Ù­_#Mဃјï¦F~˜nçšÃjë#ó'ñ‚÷fYZ8‘˜r?Á%×Q—¢Q‚ÂfU¼ào=wø¯é�ˆˆ:�D)h Í8;9ãñ¬8¬ñÔ2\jµP m€ëv¦æ ׆¬Ó¡kˆUëïçë®ÔqÄŒ˜¡…›Âi§œÞîVvJiªíwâ^˜ž†Ø;ùZÚ¬¤2=ð_+¾]R&ÃGÜ¥Ú ™"…À¹«ï£úZLŠ]"”½H÷ƒSæ¿%˜b àx²(ûc�ôû…Û¨L÷J)o®Ô̈́ʋ7Ct0Rµ(ÿÇá®ú HE5î Xv„„--�ˆè$Wòå}ŠÍ˸íT×E‹ËìyݽaM¢/}‚qÝšVªæÿRWswŽÁ]@LûËf•”·ï;=�” 6í1º•e”ïøª‹ø 6ØaÀY‰û z‚6A±ˆ°ãÏ®FÒ; G# ÿ9îBÊ$.CåËà\ÉÍ,O°¨˜C¼k0a&7ý’iÉTúòeâ×mI:"8ÝJ¬©\¦i"Mø,¾j¾Âý )´a!KÃ1§ éJ·²ö]ºG¥Kzl�ªpŽ<@"4"òs9Ǻ}ïL'­ÌåÖ±VŠþkD’mZ6ÿkäÈ6yåªòĽu� 4·'g)<(Õ³¿èp°ÉAZ&ôžHÜÔ§Æq¦e¤£’YÈ9µñô)3<9­^¬UˆfÔ‘V˜þS‚œ‹��^ø&žfù óy°ßõïºËÖynk)©£)M#<ŠH<^ ±ÅÿÔ¸Œ.[à=º8³¥ú¡õ/E 0¤sò‰šùöùPþc(ç¯Oey¯½;m.e˜wg"æ¡?· T jóLF²ób "›�ÀõcQ]Ô è6‹:Ò¥Ñ`«a= âw¼ñeEf¾.LãHl•%–9Iâ8èw×QEËqd!‰óÁº ©^|qüê–b¾)¹z Þõöêré l%TÙb òÃÿ(ŸìO-nªÚ­òY�×(DgÚþü±Vñ¤„»ã¼c‰/âZï†~¥yÊ)ͶEuš:Œ_]vÂõd|9d’¯d"·Ž(k™uòGÌQwÆ—00’Ò£- K1WGè`à L `o™[â†Ç·ÈÅ'ñщö&È7pà²H¶Ðx îgñ,J–©´Dù¯.WtQ?™³dg,'œ&úC÷–ø1ˆU*‡rÈ5}Q$¤FÎ…~ÝIöfͬêXù™ÓcE,fѶ²ªçúûIë7ÿ°syQu2â‚›2ç/M=Å¢ðäÓW4 j Êø**ó­|�išµ¼VF2¥ê‰�Öâw§ÕØâR’Y4×Þß*Þæ�òü äïÖ‰û;È˰,W;)¯íÒm, m¥ÈÁ,y]Ï'!é3”ðG?HfL?£@[v' }ñÞrRràêè¡}þ"íTÕ‚F1¶vº»/_³™Eà*%O×ÕgÀ©`‹|K¤iíËv—d­ºÚÏ`QÜxõë¬Üt†^ÅÝ¥â©»Éøqe¶ cÍq«7¾{`šýXœ”xд+”º7‹¦Õ©ÈÐ}ócAí¯OcÇÈh}¤çQÝÞhO2çûùιè€$û Ö‘#%¾mHj¿Ò-”IoAԣ¹„lÐqtjáBH¨Ë©’ãµµ�vIl¾gçk|‚u§¶¾ÆC4tô3—¥Â.Ž¿ô-P$ɨsRÒ••A du(1søêûì�'€“Œp„ NbýLˆL}�TáBÃÈUKšìê3•î)“]û›Þn|.±rŽ=Ðõ_ŸFc½‚‰ê•SϬ�ÍØƒš=Ô4Ì_^järŽÅ Bcê'/óP[–E;Bì“W0b®æ—¢h¶s \´ŸëMQ€ºÂ+IÂç{3kÖ?ä˜I‹…TÒmºÕ ƒ•x�¢KÏ(ƒ‚4‰MÝhßߨP°™¯Š ~6 æê›�:cKŽ!êæSS2Cc¡û‹�ɇ%¼¬‘‡ô1DÍCVŒßðo%Üç¶ù§,ri$³ÊÙñZž îÇš9«–åLò2–vTl±18ŸsËÖËóævW q… =\;û0M´µa$¶MYEÌŠ»ðVøiŠttÉ[‡µÊ LçÜÙe†šå“e0§5ºñë¶uãYÚµ>äEÆ"lË ¡_ˆ~îk&Â>¦èvú¾ª7uÔ>/g£Á T#°4·¹q¿ûH[;KƒÊ‰[pÒDèIsÇ&˜\)t7má @:zûéw�€l[°èò2\ °Œ«W²8ñDʼ�_Q¬sJ`<>ê¬ü¨é‡_ÔKW;JòÔºç§ï¤ïÕ¯‘³áˆ|©í&àáôøIâ3÷‰j߯¥u €3Äð›oÿÆŽó·Ÿ;˜Ž,e´ÅÏh"òH™=�¿¾“àØÛŠÜ È»‡#[ |a¾Zï¢EéÚfæI†/bBæºa¢M@Š€Ý››hnzA::œ·5~Û ú]WŽ´ â*Þc¯8Â�ÜfJ.¢ËàÏÃ4ÓÎö&K%Šjc†­ò^XÜΪÖÄŠõ¢³ŽAêÕ™à%z±Åù“¥“RñkÑ7òú9/°¥»g¿p¡‰ß‹r5�Շ웄æªÌySÒ@bÏ>aaÙŸøQÙ ¿¼7u$LSRô*9ø+pNO/pÇ¡PaEð¢ó~t<“±§D‹Ó´ÍÌ•,Ó—²4"#ñÖÚ4kN7«¯Jx'Cáx³i|»u4«K�[ÌuàíêánøÊ&žÝù–R ‚ï·Xèô¶©BÌ�Æ}Ïb¡9ªFÚCÞ|Øð7’`‡~Ÿn|)V{`þdͦ9öOz…#@DGH’´DH*/…ù&D—Mh�Òž] Ìêˆ�ÿw�Á 0qÍ)õ\ ÁÛ å5 å¼Qò"!Ä<7¡¹�P X™U¶Ù«·`�ðšï.&•g¼0‡µ/z1w@ìr¦$Dò£\Ø+¹3„aíCT¨«2 Ò/ô ɬÎf ¶r‚p¨¸·ÅE£‰ ü›“ÑzŠùNrPr»“ÿÏ üôóã¨�BUѬ#”þf+q›†þ-±3§îÙÏ{oá«Í!YÅÕ ‚�åùúXä7â«£ÐB¼z¯ó^ ÂÊtãÖÞE,hl˜¡°/s�Î^®P&}\ߌ�ü§ œ·iü�´7ìòªàdŸQÔº Õ8›Ü4H�îRMEÏ­½Ù"”Ï“fŽ3n°?ü¿b®·�ÀÛ#(¢ \‘Ç¿§ë¸ÆÏë�§@ŒÈï5q´Z‡Å)ù-À«I›‡¶—¹ü;(¹*`;Í ÖŽC0wí$¿¬ý£TDðWq ̣c'¦&ˆXw r]72�‰»Ø’m÷uáëOÍ‹ÔÔÿ0ûÊšaD_^í?øÆcD@ŠIu­E‘WË“[ËjŒr»�—›ËæƒÝR}…ÅBÅP#‚äìÖ‘„d5©gP¹ê¾óçÓS&9t‚…@5Û¿Qá·|"¾³ïÁ'ELã®96ù±då«Ê/§{éþe}v9qõ^µðfÀ‘¤¨qqgŸ£7'uÓåŽT§+ÊþC¨ ‚)T°u€¿ ÏUé=re´ÓY‹k{ãH¹yØüË=�Fô1å»þ/-%* ÈÜ,Ó²±‘P=]˜n.³HÌm?’N÷³ö²–l!бe¬YùŠP?Å¥‡¿wœ±»jÀzüöÏØÆØêÝï‹çØ‹ ò+J®W±`æ|é¦ÜV2îæ›¶et/�ér V*V0G±`墨Fža弜üèû“ɯì®L˜‚P£ Aê|Ð%”Rƒ‰{tÝûǯÂXPÒ`Eù}ÞÙ1ê,ÉvOnRöË/cgl©Š«„2Ð�„›�˜AN )“§fÝb@s÷©-Ó7›>O01&h»Ö”µ‘œø!4öÎpÝÀV¡¡¹1lk uËÎ×o|Ö4£ ï/®>uX qèS2ܼñÅ*D·|ÏäZ÷첈ñ£BázWü&q/Ç4AÓYæ ¡ƒ}µ'²éÿ/ãz´ÎÕRdB“ú'Ñ).C؆½+å2 ÇW¬‹t™5YsMtŒu–†›ùóЍäy}DX$äìè…;ϲ.ˆKM‚xÚï7:´7ð†¯høæéÃÙëXZdã­ÃBÖð¼²Ï…â3–jK¡qåQ~�ìö[©Ûñæ+a~­Lui�íl” :åNÆ+ U²ØFö‡‡î§?Bã'‹þÂydt�À)�Bü´Åñ6ÊgÏA§ÿ\IO¿É¡è˜ß\%®œ™y|P§_[jBRÆ� @ÿ0�ï<â˜Þå•c‡ë‚Â&§ÿЬ}ÚÕ“Õ€Nl!×¥ñýƒ¶�xh^Mµz=u×Å:v)¹ý ‹[_kÙ Û=ÅbMsÈò ­[EnÍù:‚ï ·y›§n|jR3kŽqv»êYÔ°�Q×8åÎ \ºŸºÖ¤5ÌR×Dz9ˆ·è2W*\­LõîPSN¶z"—s)ê.‹pñC:µQ¶äÏ;üÅóùý½ æ(vƒ…(ÓŸ;Yë$1ßGV‚ñ®š¦µßñeÁ6M\û‡ªiKY¿—M Kn.ãS’)ZC|,«ä¤Ñ„I¥nø\UŒ< &ƒõ8ÐwévoOƒÅ‰£i3|åò<’ʬƒ{ò®Hš0”K ]œôB쀹(²ÃÇ`fg‘�$1å&_œðç´&%‡Îàçðpç»dN È teZòƧB€€Lð=oÓv_hð»N8:MlÝÜ/ –å­èQ¾jq…M ©M{W§@ï :�yWMÑN)zæjŠgµj=•ñ}³Ë»ê“ŽÂ˜ühþd©ûwà[`ºÊ‡]^IlõÁ÷9é:~°6�ðYîX¬z=°®Ä÷»Ì_�OJ’~Á/Žu=ŸA¡Öd#Yq¸Û�*‰‘‚ÐNÂõq^NÐ4�ÝÕŽuDªi‡¬™Ì©`k2…#MiVâ]¯Ü=ÇcŸ¶Ç²iúàFK‰Z‰P°©p¾ ¾YÌ&�I÷¤ÒñÁ®ÁÎ "ºA‚15¬hl”lË4sˆŸX¡à–J*÷Ëßù¨Æ/ �ü·•®'Œ³ïZQ‡™¨›©§:Öðmõ“óš� íjý³bùò;°ò]˜©¨™ƒL‹ðMp¦¶ûR' 3 ÝmÀ˜Œ×Áþ%üÊð0©u �&îá…ø¢Ë‰ÏEø¦bUÝû¸}¶ñpœ¬6N;Ò¾w ú°o•å$ä F‰ë^zg&ðòn9[H{NÝ�×D½‘]R±‰üí…ð3L=ÝŽDª�ŸÉae` ³Ë“¥k±ÜN@#cÁFý>/?ù ž«LÈR ˆÍw bßxrËÏôÿÞY³ Œ‡™¾Å÷{é;^Ücœ/šÒñ×°S§Ì±ã˜¤*K‡ÐPJ àC ¯B[ºÁŒ˜;¶ž&fm]ƒöÿèyÇ.š*¿K/k¨YF9Ç�‘ÿG9'‰é³ý ØŽåU €ÇLÝØ—Ò¸çíCFÔϧ‰'WAo(×Z‚F¥  ¥LÁº‡“:·‡�ͺ¡/‹�ô×OG“ÞË…ÄðÞôÂ1O;ß>mãë,¾Gì§�Ëg“²ÎB—`H6„!ÊJ §´Á+XYý4QÃL”¾Á¢÷N¡²>¸g¹ýÆ*ª€™é*GŸ=�°ÜË{f$ÎFñ~OÓÉ/E^ؼFÀâHj,´y±}�’Ñ-¬iÿÍÏÕ“-‰ðÖO:ãDbô²0V f7äÛż[êbpw£¦YäÚï•B—#olÖl—…M,ŽØe'¾«î4Šßg àceccomp-4.3.1/docs/po/000077500000000000000000000000001526046660400145075ustar00rootroot00000000000000ceccomp-4.3.1/docs/po/ceccomp.pot000066400000000000000000000777431526046660400166660ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2026-08-22 20:10+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: Title = #: ceccomp.adoc:1 #, no-wrap msgid "ceccomp(1)" msgstr "" #. type: Plain text #: ceccomp.adoc:3 msgid "dbgbgtf ; RocketDev " msgstr "" #. type: Title == #: ceccomp.adoc:11 #, no-wrap msgid "NAME" msgstr "" #. type: Plain text #: ceccomp.adoc:14 msgid "ceccomp - A tool to analyze seccomp filters" msgstr "" #. type: Title == #: ceccomp.adoc:15 #, no-wrap msgid "SYNOPSIS" msgstr "" #. type: Plain text #: ceccomp.adoc:20 #, no-wrap msgid "" " usage: ceccomp [FILE] " "[-q|--quiet]\n" " [-f|--format FMT] [-a|--arch ARCH] [-p|--pid PID] " "[-s|--seize]\n" " [-o|--output FILE] [-c|--color WHEN] ...\n" msgstr "" #. type: Title == #: ceccomp.adoc:21 #, no-wrap msgid "CONCEPT" msgstr "" #. type: Plain text #: ceccomp.adoc:26 msgid "" "Kernel use BPF filters to limit syscall rules, applied via `seccomp` or " "`prctl` syscall. For example, down below is a simple filter to block " "`execve` syscall in hex format:" msgstr "" #. type: Plain text #: ceccomp.adoc:31 #, no-wrap msgid "" " 1: 20 00 00 00 00 00 00 00 $A = $syscall_nr\n" " 2: 15 00 00 01 3b 00 00 00 if ($A != execve) goto 4\n" " 3: 06 00 00 00 00 00 00 00 return KILL\n" " 4: 06 00 00 00 00 00 ff 7f return ALLOW\n" msgstr "" #. type: Plain text #: ceccomp.adoc:35 msgid "" "The part presented in hex is what kernel received, and `ceccomp` take it to " "disassemble back to human readable text. For instance the *lineno* in the " "left and *statement* in the right." msgstr "" #. type: Plain text #: ceccomp.adoc:38 msgid "" "Later I'll use _TEXT_ in short for BPF human readable text, and use _RAW_ in " "short for BPF raw format, please keep that in mind." msgstr "" #. type: Title == #: ceccomp.adoc:39 #, no-wrap msgid "DESCRIPTION" msgstr "" #. type: Plain text #: ceccomp.adoc:44 msgid "" "`ceccomp` have 5 main functions, basically it's a C version of " "`seccomp-tools`, however, there are some breaking changes you need to know, " "which will be highlighted in each subcommand section." msgstr "" #. type: Title === #: ceccomp.adoc:45 #, no-wrap msgid "asm - ASSEMBLE" msgstr "" #. type: Plain text #: ceccomp.adoc:48 #, no-wrap msgid " ceccomp asm [-c WHEN] [-a ARCH] [-f FMT] [TEXT]\n" msgstr "" #. type: Plain text #: ceccomp.adoc:51 msgid "" "Assemble _TEXT_ to _RAW_. Use it to embed hand written filter rules into C " "code or to see the original code of some _TEXT_." msgstr "" #. type: Labeled list #: ceccomp.adoc:52 ceccomp.adoc:104 ceccomp.adoc:153 ceccomp.adoc:203 #: ceccomp.adoc:329 #, no-wrap msgid "-c, --color *WHEN*" msgstr "" #. type: Plain text #: ceccomp.adoc:56 msgid "" "Determines when to display warnings and errors in color. If the value is " "_auto_, ceccomp will display color when the output target is a \"tty\". Can " "be _auto_, _never_ or _always_. The default value is _auto_." msgstr "" #. type: Labeled list #: ceccomp.adoc:57 ceccomp.adoc:108 ceccomp.adoc:168 #, no-wrap msgid "-a, --arch *ARCH*" msgstr "" #. type: Plain text #: ceccomp.adoc:62 msgid "" "Set to any architecture libseccomp supports. Will be used to determine the " "actual syscall number behind the name (for example, on x86_64, you could " "write `\"execve\"` instead of `59` like the basic example above). Your " "system arch will be taken if not set via `uname`. The default value on your " "system is {ARCH}." msgstr "" #. type: Labeled list #: ceccomp.adoc:63 #, no-wrap msgid "-f, --format *FMT*" msgstr "" #. type: Plain text #: ceccomp.adoc:67 msgid "" "Determines how `ceccomp` produces binary-format bpf code. Can be _hexfmt_, " "_hexline_, _raw_ or _c-macro_. You could find sample output in <> " "section. The default value is _hexline_." msgstr "" #. type: Labeled list #: ceccomp.adoc:68 ceccomp.adoc:171 #, no-wrap msgid "*TEXT*" msgstr "" #. type: Plain text #: ceccomp.adoc:71 msgid "" "Take a optional filename to determine which file containing _TEXT_ will be " "assembled. Will read from _stdin_ if not set. `-` is treated as _stdin_." msgstr "" #. type: Plain text #: ceccomp.adoc:74 msgid "" "The assembly syntax was changed greatly since _version 4.0_, please checkout " "grammar reference below!" msgstr "" #. type: Plain text #: ceccomp.adoc:77 msgid "" "Please check out <> section to see how to write a " "rule by hand. Some examples will be displayed in <> section." msgstr "" #. type: Plain text #: ceccomp.adoc:81 msgid "" "Since _version 4.0_, endianness is considered. If target endianness *ARCH* " "is different from machine endianness, the filters will be reversed (CODE and " "K) before outputting." msgstr "" #. type: Plain text #: ceccomp.adoc:84 msgid "" "Since _version 4.3_, a new *FMT* _c-macro_ is added to port seccomp rules to " "other architectures easily." msgstr "" #. type: Table #: ceccomp.adoc:95 #, no-wrap msgid "" "|Command|Difference\n" "\n" "|`seccomp-tools asm`\n" "|Use its own grammar to assemble, a bit script like; can assemble invalid " "_TEXT_\n" "which will be rejected by kernel\n" "\n" "|`ceccomp asm`\n" "|You can just take `disasm` output to `asm`, no new grammar is needed to " "learn;\n" "take `stdin` as input by default\n" msgstr "" #. type: Title === #: ceccomp.adoc:97 #, no-wrap msgid "disasm - DISASSEMBLE" msgstr "" #. type: Plain text #: ceccomp.adoc:100 #, no-wrap msgid " ceccomp disasm [-c WHEN] [-a ARCH] [-e] [RAW]\n" msgstr "" #. type: Plain text #: ceccomp.adoc:103 msgid "" "Disassemble _RAW_ to _TEXT_. Use it to see what does a filter do if you " "could not access filter via `trace` and have to manually extract the filter " "out." msgstr "" #. type: Plain text #: ceccomp.adoc:107 msgid "" "Argument description can be found in <> section. `disasm` " "may print more text in color including syntax highlighting for _TEXT_." msgstr "" #. type: Plain text #: ceccomp.adoc:113 msgid "" "Set to any architecture libseccomp supports. Will be used to determine how " "filtered syscall number in _RAW_ filter is translated to syscall name (for " "example, on x86_64, the number `0x3b` is translated to `execve` if is " "comparing syscall_nr, see the basic example above). The default value on " "your system is {ARCH}." msgstr "" #. type: Labeled list #: ceccomp.adoc:114 #, no-wrap msgid "-e, --ebpf" msgstr "" #. type: Plain text #: ceccomp.adoc:119 msgid "" "Treat _RAW_ as eBPF insn bytes instead of cBPF filter bytes. This flag is " "designed to test whether eBPF-to-cBPF conversion is working or not. To use " "this function, please dump installed eBPF insns migrated from seccomp " "filters in a process via eBPF or a kernel module. Any input not generated by " "kernel may lead to undefined behavior." msgstr "" #. type: Labeled list #: ceccomp.adoc:120 #, no-wrap msgid "*RAW*" msgstr "" #. type: Plain text #: ceccomp.adoc:123 msgid "" "A binary file with raw BPF codes. Takes _stdin_ as input if not set. Treat " "`-` as _stdin_. The file is arch-revelent, so it may not be portable on " "different archs." msgstr "" #. type: Plain text #: ceccomp.adoc:127 msgid "" "Since _version 4.0_, endianness is considered. If target endianness *ARCH* " "is different from machine endianness, the filters will be reversed (CODE and " "K) before decoding." msgstr "" #. type: Plain text #: ceccomp.adoc:132 msgid "" "ceccomp will try to resolve syscall number under an arch ONLY IF that at " "that line, arch can be determined. On foreign arch (not equal to the arch " "you set), the foreign arch will be prepended to syscall name. You may notice " "that in some cases, seccomp-tools is able to resolve the name while ceccomp " "is not, that may be intended as the arch is not determined." msgstr "" #. type: Table #: ceccomp.adoc:142 #, no-wrap msgid "" "|Command|Difference\n" "\n" "|`seccomp-tools disasm`\n" "|Disassembles in its format; never check if the filter is valid\n" "\n" "|`ceccomp disasm`\n" "|Disassembles in ceccomp format, and takes `stdin` as input by default; " "check arch strictly\n" "and always display foreign arch name\n" msgstr "" #. type: Title === #: ceccomp.adoc:144 #, no-wrap msgid "emu - EMULATE" msgstr "" #. type: Plain text #: ceccomp.adoc:147 #, no-wrap msgid "" " ceccomp emu [-c WHEN] [-a ARCH] [-q] TEXT SYSCALL_NAME/SYSCALL_NR " "[ARGS[0] ARGS[1] ... ARGS[5] PC]\n" msgstr "" #. type: Plain text #: ceccomp.adoc:152 msgid "" "Emulate what will happen if `syscall(SYSCALL_NR, ARGS[0], ARGS[1], ..., " "ARGS[5])` from `PC` is called following rules described in _TEXT_. Use it to " "see the result without actually running it in program or you don't want to " "examine the filter rule manually. This subcommand can be used to " "automatically examining a filter." msgstr "" #. type: Plain text #: ceccomp.adoc:156 msgid "" "Argument description can be found in <> section. `emu` may " "print more text in color including syntax highlighting for _TEXT_ and " "skipped statements." msgstr "" #. type: Labeled list #: ceccomp.adoc:157 #, no-wrap msgid "*SYSCALL_NAME/SYSCALL_NR*" msgstr "" #. type: Plain text #: ceccomp.adoc:162 msgid "" "If you set *SYSCALL_NAME* (like `execve`), it will be translated to " "*SYSCALL_NR* under *ARCH* first. Or else set *SYSCALL_NR* directly (like " "`59`). Then the nr will be tested against the bpf filter to see the result " "of that syscall. This argument is NOT optional." msgstr "" #. type: Labeled list #: ceccomp.adoc:163 #, no-wrap msgid "*ARGS[0-5]* and *PC*" msgstr "" #. type: Plain text #: ceccomp.adoc:167 msgid "" "Register values when calling syscall. For example, on x86_64, these are " "equivalent to `rdi`, `rsi`, `rdx`, `r10`, `r8`, `r9` and `rip`. Their " "default value is 0." msgstr "" #. type: Plain text #: ceccomp.adoc:170 ceccomp.adoc:331 msgid "Argument description can be found in <> section." msgstr "" #. type: Plain text #: ceccomp.adoc:175 msgid "" "Take a filename to determine which file containing _TEXT_ rule will be " "tested. Note that filename CAN NOT be ignored as ceccomp can not determine " "if a positional argument is syscall or filename. Use `-` to refer to " "_stdin_." msgstr "" #. type: Labeled list #: ceccomp.adoc:176 ceccomp.adoc:229 #, no-wrap msgid "-q, --quiet" msgstr "" #. type: Plain text #: ceccomp.adoc:179 msgid "" "Only print the eval result of the filter. For example, if last statement " "emulated is `return KILL`, then `KILL` is printed." msgstr "" #. type: Table #: ceccomp.adoc:189 #, no-wrap msgid "" "|Command|Difference\n" "\n" "|`seccomp-tools emu`\n" "|Take a _RAW_ as input\n" "\n" "|`ceccomp emu`\n" "|Take a _TEXT_ as input and take `stdin` as input by default; set *PC* is\n" "possible\n" msgstr "" #. type: Title === #: ceccomp.adoc:191 #, no-wrap msgid "trace - TRACE FILTER IN RUNTIME" msgstr "" #. type: Plain text #: ceccomp.adoc:195 #, no-wrap msgid "" " ceccomp trace [-c WHEN] [-q] [-o FILE] PROGRAM [program-args]\n" " [-c WHEN] [-q] -p PID [-s]\n" msgstr "" #. type: Plain text #: ceccomp.adoc:202 msgid "" "The first line captures filters *PROGRAM* loads in runtime by tracing it; " "the second line extract seccomp filters from *PID*, or trace *PID* to " "capture subsequent seccomp filters; once fetched filters, print them in " "_TEXT_. You can only choose one of the two formats above. Use this if " "running the program is the simplest way to fetch bpf filters or a program " "with seccomp filters installed is waiting for input." msgstr "" #. type: Plain text #: ceccomp.adoc:206 msgid "" "Argument description can be found in <> section. `trace` may " "print more text in color including syntax highlighting for _TEXT_." msgstr "" #. type: Labeled list #: ceccomp.adoc:207 #, no-wrap msgid "-o, --output *FILE*" msgstr "" #. type: Plain text #: ceccomp.adoc:212 msgid "" "May be useful when *PROGRAM* produces quite a lot output in _stderr_. " "`ceccomp` allow user to close _stdin_ and _stdout_ to limit *PROGRAM* input " "and output, so `ceccomp` use _stderr_ to print messages when running " "*PROGRAM*, set *FILE* if you want to see _TEXT_ in some other file. Treat " "`-` as _stdout_." msgstr "" #. type: Labeled list #: ceccomp.adoc:213 #, no-wrap msgid "*PROGRAM*" msgstr "" #. type: Plain text #: ceccomp.adoc:216 msgid "" "Set to the program you want to run, and *program-args* are its arguments " "just like running shell command `exec PROGRAM program-args`." msgstr "" #. type: Labeled list #: ceccomp.adoc:217 ceccomp.adoc:332 #, no-wrap msgid "-p, --pid *PID*" msgstr "" #. type: Plain text #: ceccomp.adoc:223 msgid "" "Set to the pid you want to inspect. *PID* is conflict with *PROGRAM*; you " "could either run a program dynamically or examine a pid in one command. " "Without `-s` flag, trace pid will try to extract seccomp filter in *PID* via " "`ptrace(PTRACE_SECCOMP_GET_FILTER)`, which may not be available in some " "systems. The pid here is actually process (thread) id, you can trace a " "thread or process." msgstr "" #. type: Labeled list #: ceccomp.adoc:224 #, no-wrap msgid "-s, --seize" msgstr "" #. type: Plain text #: ceccomp.adoc:228 msgid "" "*ONLY AVAILABLE FOR TRACE PID MODE.* Set this flag will override trace pid " "behavior to attach to *PID* and keep tracing for seccomp filter loading like " "trace prog mode. _This flag was introduced in version 4.0._" msgstr "" #. type: Plain text #: ceccomp.adoc:232 msgid "" "Set to suppress the extra *[INFO]* prints when detect process forking, " "exiting or seccomp filter loading. _This flag was introduced in version " "4.0._" msgstr "" #. type: Plain text #: ceccomp.adoc:236 msgid "" "To extract filters from *PID*, `CAP_SYS_ADMIN` is needed (without `-s` flag) " "and `CAP_SYS_PTRACE` may also be needed, the easiest way to acquire them is " "calling `ceccomp` with `sudo`." msgstr "" #. type: Plain text #: ceccomp.adoc:240 msgid "" "Since _version 3.1_, multiple process tracing is introduced, and when tracee " "forking/resolving/exiting, an extra INFO message is printed. You can discard " "it by running command like `ceccomp trace -q PROG 2>/dev/null`." msgstr "" #. type: Plain text #: ceccomp.adoc:243 msgid "" "Since _version 4.2_, `dump` sub command is added as an alias of `trace`, to " "keep compatibility with `seccomp-tools`." msgstr "" #. type: Table #: ceccomp.adoc:256 #, no-wrap msgid "" "|Command|Difference\n" "\n" "|`seccomp-tools dump`\n" "|Setting output format is possible; each filter can be output to a " "different\n" "file; killing *PROGRAM* once *LIMIT* times of filters loaded; wrapping " "*PROGRAM*\n" "in `sh -c`\n" "\n" "|`ceccomp trace` or `ceccomp dump`\n" "|All filters are output to a single file; never kill *PROGRAM*; *PROGRAM* " "is\n" "launched directly, so `./` is not needed; explicitly print when forking;\n" "able to attach to pid for dynamic seccomp filter capturing\n" msgstr "" #. type: Title === #: ceccomp.adoc:258 #, no-wrap msgid "probe - TEST COMMON SYSCALLS INSTANTLY" msgstr "" #. type: Plain text #: ceccomp.adoc:261 #, no-wrap msgid " ceccomp probe [-c WHEN] [-o FILE] [-q] PROGRAM [program-args]\n" msgstr "" #. type: Plain text #: ceccomp.adoc:265 msgid "" "Run *PROGRAM* with *program-args* to captures *FIRST* seccomp filter, and " "then kill all children. Use it when a quick check against a program is " "needed, and detect potential seccomp rule issues." msgstr "" #. type: Plain text #: ceccomp.adoc:267 msgid "" "All argument descriptions can be found in <> section." msgstr "" #. type: Plain text #: ceccomp.adoc:271 msgid "" "The output for this subcommand is the emulating result of common syscalls " "like `execve`, `open` and so on. If the filter itself is not capable of " "blocking syscalls, you could know that with a glance." msgstr "" #. type: Plain text #: ceccomp.adoc:274 msgid "" "Typical output for this subcommand is described below, more detailed example " "could be found in <> section." msgstr "" #. type: Plain text #: ceccomp.adoc:286 #, no-wrap msgid "" " open -> ALLOW\n" " read -> ALLOW\n" " write -> ALLOW\n" " execve -> KILL\n" " execveat -> KILL\n" " mmap -> ALLOW\n" " mprotect -> ALLOW\n" " openat -> ALLOW\n" " sendfile -> ALLOW\n" " ptrace -> ERRNO(1)\n" " fork -> ALLOW\n" msgstr "" #. type: Plain text #: ceccomp.adoc:288 msgid "`seccomp-tools` don't have this subcommand." msgstr "" #. type: Title === #: ceccomp.adoc:289 #, no-wrap msgid "capture - CAPTURE FILTERS WITH EBPF" msgstr "" #. type: Plain text #: ceccomp.adoc:292 #, no-wrap msgid " ceccomp capture [-c WHEN] [-p PID]\n" msgstr "" #. type: Plain text #: ceccomp.adoc:300 msgid "" "Capture seccomp filters in global scope if *PID* not set. The eBPF program " "will trace `seccomp_check_filter` kernel function, reliably intercepting " "seccomp filters that the kernel will load, WITHOUT race conditions compared " "to <>. This function is named \"global " "capture\" below. Linux 5.15 is the lowest recommended kernel version to run " "this function on _x86_64_, other architecture may require higher kernel " "version to run this function." msgstr "" #. type: Plain text #: ceccomp.adoc:310 msgid "" "If *PID* is set, an eBPF program to extract installed seccomp filters in the " "corresponding process (actually thread) will be installed. Note that inside " "kernel, `pid` is referred thread id and `tgid` is referred to process id. " "The eBPF program directly pulls eBPF insns migrated from original seccomp " "filters out and converts them back to perform <>. " "This function does not require `CONFIG_CHECKPOINT_RESTORE` kernel config, " "and is functional even if `ceccomp` itself is under seccomp. This function " "is named \"capture pid\" below. Linux 6.2 is the lowest kernel version to " "run this function, as `bpf_task_from_pid` was introduced then." msgstr "" #. type: Plain text #: ceccomp.adoc:316 msgid "" "When the kernel migrates seccomp filters, the conversion from cBPF to eBPF " "is lossy because several distinct cBPF instructions can be mapped to the " "same eBPF instruction sequence. As a result, the output from \"capture pid\" " "may not be identical to the original seccomp filter, even though it is " "functionally equivalent." msgstr "" #. type: Plain text #: ceccomp.adoc:322 msgid "" "Currently, compat task detection is only supported on _x86_64_ and " "_aarch64_. With this feature, `ceccomp` can identify whether a task is " "native (64-bit task on 64-bit kernel) or \"compatible\" (32-bit task on " "64-bit kernel), so that `ceccomp` can pass the correct architecture token to " "libseccomp to query syscall name in captured seccomp filters." msgstr "" #. type: Plain text #: ceccomp.adoc:328 msgid "" "Note that eBPF utilizes asynchronous ring buffer to send back data to " "user-mode process, so if lots of seccomp filters are loaded at the same " "time, the buffer may run out and you need to see detailed errors via " "`bpftool prog trace`. Since we can't send the errors back through full ring " "buffer, those overflowed filters are actually invisible to users without " "reading kernel messages." msgstr "" #. type: Plain text #: ceccomp.adoc:334 msgid "Which *process* (thread) to extract seccomp filter insns from." msgstr "" #. type: Plain text #: ceccomp.adoc:338 msgid "" "All *PID* presented in either \"global capture\" or \"capture pid\" are " "*INITIAL NAMESPACE PID*, not PID in current namespace. It's recommended that " "only run `ceccomp capture` in initial namespace." msgstr "" #. type: Plain text #: ceccomp.adoc:341 msgid "" "This module is optional, you can opt it out during configuration. This " "module require libbpf to work." msgstr "" #. type: Plain text #: ceccomp.adoc:343 msgid "This subcommand was introduced in _version 4.3_." msgstr "" #. type: Title == #: ceccomp.adoc:344 #, no-wrap msgid "TEXT GRAMMAR REFERENCE" msgstr "" #. type: Plain text #: ceccomp.adoc:351 msgid "" "The grammar changed greatly since _version 4.0_ as we refactored lexer for " "better human readability. The wrapper now prefixed by `#` as it's a comment " "now. And _line_ is replaced by _label_, so now lexer depends on label " "declaration to decide where to jump, instead of lineno in _TEXT_ file." msgstr "" #. type: Plain text #: ceccomp.adoc:356 msgid "" "A valid _TEXT_ format is described in EBNF-like declaration here: " "https://github.com/ceccomp/ceccomp/issues/17#issuecomment-3610531705 . If " "you have no interest to know what EBNF is, please keep reading for examples." msgstr "" #. type: Plain text #: ceccomp.adoc:358 msgid "BPF ops which are not described below are banned by kernel." msgstr "" #. type: Title === #: ceccomp.adoc:359 #, no-wrap msgid "Comment and Label" msgstr "" #. type: Plain text #: ceccomp.adoc:363 msgid "" "`ceccomp disasm` displays a lot of things, but some of them are optional for " "asm." msgstr "" #. type: Plain text #: ceccomp.adoc:368 #, no-wrap msgid "" " #Label CODE JT JF K\n" " #---------------------------------\n" " L0001: 0x06 0x00 0x00 0x7fff0000 return ALLOW\n" " #---------------------------------\n" msgstr "" #. type: Plain text #: ceccomp.adoc:370 msgid "Any text after `#` will be discarded by asm like some script languages." msgstr "" #. type: Plain text #: ceccomp.adoc:372 msgid "Empty lines are accepted." msgstr "" #. type: Plain text #: ceccomp.adoc:380 msgid "" "Label declaration is an identifier at the beginning of line and suffixed by " "`:` like `L0001`. An identifier is a string starts with alpha and contains " "with only alphanumeric characters and underscore `_`. Label is only " "necessary if it's the destination of `goto`, these redundant labels added by " "disasm are for readability. E.g. in `if ($A == 0) goto somewhere`, " "`somewhere` is a label and must be declared after the statement. Label " "declaration can take a line separately, or be put in front of statement." msgstr "" #. type: Plain text #: ceccomp.adoc:383 msgid "" "The `CODE`, `JT`, `JF` and `K` value generated by disasm will be discarded " "by asm, asm only parse the effective statement after `K`." msgstr "" #. type: Plain text #: ceccomp.adoc:388 msgid "" "There are some slight difference between `ceccomp disasm` and `seccomp-tools " "disasm`, down below is a general example. And some statements are different, " "so don't pipe seccomp-tools output to ceccomp blindly." msgstr "" #. type: Plain text #: ceccomp.adoc:392 #, no-wrap msgid "" " line CODE JT JF K\n" " =================================\n" " 0000: 0x06 0x00 0x00 0x7fff0000 return ALLOW\n" msgstr "" #. type: Title === #: ceccomp.adoc:393 #, no-wrap msgid "Assignment" msgstr "" #. type: Plain text #: ceccomp.adoc:397 msgid "" "`A` can be set to seccomp attributes directly. But `X` can not be assigned " "with seccomp attributes directly due to kernel limit." msgstr "" #. type: Plain text #: ceccomp.adoc:400 #, no-wrap msgid "" " $A = $arch\n" " $A = $syscall_nr\n" msgstr "" #. type: Plain text #: ceccomp.adoc:402 msgid "" "To assign `A` with those 64-bit long fields, `low_` or `high_` prefix is " "needed." msgstr "" #. type: Plain text #: ceccomp.adoc:410 #, no-wrap msgid "" " $A = $low_pc\n" " $A = $high_pc\n" " $A = $low_args[0]\n" " $A = $high_args[0]\n" " ...\n" " $A = $low_args[5]\n" " $A = $high_args[5]\n" msgstr "" #. type: Plain text #: ceccomp.adoc:413 msgid "" "A special attribute is `sizeof(struct seccomp_data)`, that can be assigned " "to `A` or `X` directly." msgstr "" #. type: Plain text #: ceccomp.adoc:416 #, no-wrap msgid "" " $A = $scmp_data_len\n" " $X = $scmp_data_len\n" msgstr "" #. type: Plain text #: ceccomp.adoc:420 msgid "" "Temporary memory is 32-bit, to access them, you could use hex or dec as " "index. Both `A` and `X` is assignable. Assigning immediate values to `A` or " "`X` accepts any format of number if you imply the correct base by \"0x\" or " "\"0b\"." msgstr "" #. type: Plain text #: ceccomp.adoc:428 #, no-wrap msgid "" " $X = $mem[0]\n" " $A = $mem[0xf]\n" " $A = $mem[15] # both hex and dec index are OK\n" " $A = 0\n" " $X = 0x3b\n" " $A = 0b1111\n" " $A = 0333\n" msgstr "" #. type: Plain text #: ceccomp.adoc:431 msgid "" "You could also assign `X` to `A` or in the reverse order. Assign `X` or `A` " "to temporary memory is definitely okay." msgstr "" #. type: Plain text #: ceccomp.adoc:436 #, no-wrap msgid "" " $A = $X\n" " $X = $A\n" " $mem[3] = $X\n" " $mem[0x4] = $A\n" msgstr "" #. type: Title === #: ceccomp.adoc:437 #, no-wrap msgid "Arithmetic Operations" msgstr "" #. type: Plain text #: ceccomp.adoc:440 msgid "Various operations can be applied to `A`." msgstr "" #. type: Plain text #: ceccomp.adoc:447 #, no-wrap msgid "" " $A += 30\n" " $A -= 4\n" " $A *= 9\n" " $A /= 1\n" " $A &= 7\n" " $A >>= 6\n" msgstr "" #. type: Plain text #: ceccomp.adoc:449 msgid "The right value can be `X`." msgstr "" #. type: Plain text #: ceccomp.adoc:454 #, no-wrap msgid "" " $A &= $X\n" " $A |= $X\n" " $A ^= $X\n" " $A <<= $X\n" msgstr "" #. type: Plain text #: ceccomp.adoc:456 msgid "And there is a way to negativate `A`." msgstr "" #. type: Plain text #: ceccomp.adoc:458 #, no-wrap msgid " $A = -$A\n" msgstr "" #. type: Title === #: ceccomp.adoc:459 #, no-wrap msgid "Jump Downwards If ..." msgstr "" #. type: Plain text #: ceccomp.adoc:462 msgid "Unconditional jump:" msgstr "" #. type: Plain text #: ceccomp.adoc:464 #, no-wrap msgid " goto L3\n" msgstr "" #. type: Plain text #: ceccomp.adoc:466 msgid "Jump if:" msgstr "" #. type: Plain text #: ceccomp.adoc:472 #, no-wrap msgid "" " if ($A == execve) goto L3\n" " if ($A != 1234) goto L4\n" " if ($A & $X) goto L5\n" " if !($A & 7) goto L6\n" " if ($A <= $X) goto L7\n" msgstr "" #. type: Plain text #: ceccomp.adoc:474 msgid "If true jump to ... if false jump to...:" msgstr "" #. type: Plain text #: ceccomp.adoc:477 #, no-wrap msgid "" " if ($A > $X) goto L3, else goto L4\n" " if ($A >= 4567) goto L5, else goto L6\n" msgstr "" #. type: Plain text #: ceccomp.adoc:484 msgid "" "ONLY in conditions, you CAN replace number with syscall name or arch name. " "In example above, `0x3b` is replaced by `execve`. All the syscall name will " "be resolved to syscall number under your selected arch. If you want to " "resolve a syscall name in foreign arch (not equal to your selected arch), " "please prepend a arch and dot. For example, your arch is x86_64, and you are " "writing _aarch64_ rules, then please write like:" msgstr "" #. type: Plain text #: ceccomp.adoc:486 #, no-wrap msgid " if ($A == aarch64.read) goto 5\n" msgstr "" #. type: Plain text #: ceccomp.adoc:489 msgid "" "Note that if you manually set arch to _aarch64_ with `-a aarch64`, you can " "omit `aarch64.` in statement." msgstr "" #. type: Title === #: ceccomp.adoc:490 #, no-wrap msgid "Return Code" msgstr "" #. type: Plain text #: ceccomp.adoc:493 msgid "Return value of register `A`:" msgstr "" #. type: Plain text #: ceccomp.adoc:495 #, no-wrap msgid " return $A\n" msgstr "" #. type: Plain text #: ceccomp.adoc:499 msgid "" "Or return a immediate value, with extra field in `()`. Actions including " "`TRACE`, `TRAP` and `ERRNO` accept an extra field, without `()`, they are " "treated as `action(0)`." msgstr "" #. type: Plain text #: ceccomp.adoc:509 #, no-wrap msgid "" " return 0x13371337\n" " return KILL\n" " return KILL_PROCESS\n" " return TRAP(123)\n" " return ERRNO(0)\n" " return TRACE\n" " return TRACE(3)\n" " return LOG\n" " return NOTIFY\n" msgstr "" #. type: Title === #: ceccomp.adoc:510 #, no-wrap msgid "Short Example" msgstr "" #. type: Plain text #: ceccomp.adoc:514 msgid "" "The following _TEXT_ is valid for asm, which blocks `execve` and `execveat` " "for amd64 syscalls:" msgstr "" #. type: Plain text #: ceccomp.adoc:520 #, no-wrap msgid "" " $A = $syscall_nr\n" " if ($A == execve) goto forbid\n" " if ($A == execveat) goto forbid\n" " return ALLOW\n" " forbid: return KILL\n" msgstr "" #. type: Title == #: ceccomp.adoc:521 #, no-wrap msgid "RESTRICTIONS" msgstr "" #. type: Plain text #: ceccomp.adoc:524 msgid "Ceccomp asm put some restrictions on _TEXT_ for better performance." msgstr "" #. type: Plain text #: ceccomp.adoc:526 msgid "`'\\0'` must not be found in _TEXT_ since it's a text file." msgstr "" #. type: Plain text #: ceccomp.adoc:527 msgid "A line must be shorter than 384 *bytes*." msgstr "" #. type: Plain text #: ceccomp.adoc:528 msgid "A _TEXT_ file must have less than 16384 lines." msgstr "" #. type: Plain text #: ceccomp.adoc:529 msgid "A _TEXT_ file must be smaller than 4 MiB." msgstr "" #. type: Plain text #: ceccomp.adoc:532 msgid "" "And for both asm and disasm, effective statements (that can be encoded or " "decoded into BPF) must be less or equal than 4096, this is enforced by " "kernel." msgstr "" #. type: Plain text #: ceccomp.adoc:535 msgid "" "A fun fact about ceccomp asm: any basic ANSI color in _TEXT_ file, e.g., " "`\\x1b[31m`, will be discarded when processing." msgstr "" #. type: Title == #: ceccomp.adoc:536 #, no-wrap msgid "EXAMPLES" msgstr "" #. type: Plain text #: ceccomp.adoc:541 msgid "" "Manpage can not display images, so please check out html version of this " "page to see examples." msgstr "" #. type: Title === #: ceccomp.adoc:544 #, no-wrap msgid "asm example" msgstr "" #. type: Target for macro image #: ceccomp.adoc:545 #, no-wrap msgid "asm.webp" msgstr "" #. type: Title === #: ceccomp.adoc:546 #, no-wrap msgid "disasm example" msgstr "" #. type: Target for macro image #: ceccomp.adoc:547 #, no-wrap msgid "disasm.webp" msgstr "" #. type: Title === #: ceccomp.adoc:548 #, no-wrap msgid "emu example" msgstr "" #. type: Target for macro image #: ceccomp.adoc:549 #, no-wrap msgid "emu.webp" msgstr "" #. type: Title === #: ceccomp.adoc:550 #, no-wrap msgid "trace example" msgstr "" #. type: Plain text #: ceccomp.adoc:552 msgid "Running program:" msgstr "" #. type: Target for macro image #: ceccomp.adoc:553 #, no-wrap msgid "trace.webp" msgstr "" #. type: Plain text #: ceccomp.adoc:556 msgid "If set `-o FILE`:" msgstr "" #. type: Target for macro image #: ceccomp.adoc:557 #, no-wrap msgid "output_trick.webp" msgstr "" #. type: Plain text #: ceccomp.adoc:560 msgid "Trace pid mode:" msgstr "" #. type: Target for macro image #: ceccomp.adoc:561 #, no-wrap msgid "trace_pid.webp" msgstr "" #. type: Plain text #: ceccomp.adoc:564 msgid "Seize pid mode:" msgstr "" #. type: Target for macro image #: ceccomp.adoc:565 #, no-wrap msgid "trace_seize.webp" msgstr "" #. type: Plain text #: ceccomp.adoc:568 msgid "Completion for pid mode is available under zsh:" msgstr "" #. type: Target for macro image #: ceccomp.adoc:569 #, no-wrap msgid "trace_completion.webp" msgstr "" #. type: Title === #: ceccomp.adoc:571 #, no-wrap msgid "probe example" msgstr "" #. type: Target for macro image #: ceccomp.adoc:572 #, no-wrap msgid "probe.webp" msgstr "" #. type: Title === #: ceccomp.adoc:574 #, no-wrap msgid "capture example" msgstr "" #. type: Plain text #: ceccomp.adoc:576 msgid "Globally capture:" msgstr "" #. type: Target for macro image #: ceccomp.adoc:577 #, no-wrap msgid "capture.webp" msgstr "" #. type: Plain text #: ceccomp.adoc:580 msgid "Capture filters in a process:" msgstr "" #. type: Target for macro image #: ceccomp.adoc:581 #, no-wrap msgid "capture_pid.webp" msgstr "" #. type: Title == #: ceccomp.adoc:584 #, no-wrap msgid "REPO" msgstr "" #. type: Plain text #: ceccomp.adoc:588 msgid "" "Visit https://github.com/ceccomp/ceccomp to find the code. Pull Requests " "and Issues are welcome!" msgstr "" #. type: Plain text #: ceccomp.adoc:589 msgid "Copyright (C) 2025-present, distributed under GPLv3 or later." msgstr "" ceccomp-4.3.1/docs/po/zh_CN.po000066400000000000000000001510151526046660400160530ustar00rootroot00000000000000# Chinese translations for PACKAGE package # Copyright (C) 2026 Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # Automatically generated, 2026. # msgid "" msgstr "" "Project-Id-Version: ceccomp docs\n" "POT-Creation-Date: 2026-08-22 20:10+0800\n" "PO-Revision-Date: 2026-08-22 20:12+0800\n" "Last-Translator: Rocket Ma \n" "Language-Team: RocketDev\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.9\n" #. type: Title = #: ceccomp.adoc:1 #, no-wrap msgid "ceccomp(1)" msgstr "ceccomp(1)" #. type: Plain text #: ceccomp.adoc:3 msgid "dbgbgtf ; RocketDev " msgstr "" "dbgbgtf ; RocketDev " #. type: Title == #: ceccomp.adoc:11 #, no-wrap msgid "NAME" msgstr "å��ç§°" #. type: Plain text #: ceccomp.adoc:14 msgid "ceccomp - A tool to analyze seccomp filters" msgstr "ceccomp - 一个分æž�安全计算 (seccomp) 过滤器的工具" #. type: Title == #: ceccomp.adoc:15 #, no-wrap msgid "SYNOPSIS" msgstr "大纲" #. type: Plain text #: ceccomp.adoc:20 #, no-wrap msgid "" " usage: ceccomp [FILE] [-q|--quiet]\n" " [-f|--format FMT] [-a|--arch ARCH] [-p|--pid PID] [-s|--seize]\n" " [-o|--output FILE] [-c|--color WHEN] ...\n" msgstr "" " usage: ceccomp [FILE] [-q|--quiet]\n" " [-f|--format FMT] [-a|--arch ARCH] [-p|--pid PID] [-s|--seize]\n" " [-o|--output FILE] [-c|--color WHEN] ...\n" #. type: Title == #: ceccomp.adoc:21 #, no-wrap msgid "CONCEPT" msgstr "概念" #. type: Plain text #: ceccomp.adoc:26 msgid "" "Kernel use BPF filters to limit syscall rules, applied via `seccomp` or " "`prctl` syscall. For example, down below is a simple filter to block " "`execve` syscall in hex format:" msgstr "" "内核使用BPF过滤器æ�¥é™�制系统调用规则,并使用 `seccomp` å’Œ `prctl` 两个系统调用" "æ�¥å®‰è£…过滤器。以下是一个以å��六进制表示的é™�制 `execve` 系统调用的简å�•过滤器:" #. type: Plain text #: ceccomp.adoc:31 #, no-wrap msgid "" " 1: 20 00 00 00 00 00 00 00 $A = $syscall_nr\n" " 2: 15 00 00 01 3b 00 00 00 if ($A != execve) goto 4\n" " 3: 06 00 00 00 00 00 00 00 return KILL\n" " 4: 06 00 00 00 00 00 ff 7f return ALLOW\n" msgstr "" " 1: 20 00 00 00 00 00 00 00 $A = $syscall_nr\n" " 2: 15 00 00 01 3b 00 00 00 if ($A != execve) goto 4\n" " 3: 06 00 00 00 00 00 00 00 return KILL\n" " 4: 06 00 00 00 00 00 ff 7f return ALLOW\n" #. type: Plain text #: ceccomp.adoc:35 msgid "" "The part presented in hex is what kernel received, and `ceccomp` take it to " "disassemble back to human readable text. For instance the *lineno* in the " "left and *statement* in the right." msgstr "" "以上å��六进制的部分就是内核收到的过滤器,而 `ceccomp` 负责把它拿æ�¥å��汇编为人类" "å�¯è¯»çš„æ–‡æœ¬ã€‚\n" "例如左侧的 *行å�·* å’Œå�³ä¾§çš„ *伪代ç �* 。" #. type: Plain text #: ceccomp.adoc:38 msgid "" "Later I'll use _TEXT_ in short for BPF human readable text, and use _RAW_ in " "short for BPF raw format, please keep that in mind." msgstr "" "之å�Žæˆ‘会使用 _TEXT_ 作为BPF过滤器人类å�¯è¯»æ–‡æœ¬ï¼ˆä¼ªä»£ç �)的缩写,\n" "使用 _RAW_ 作为BPF过滤器原始格å¼�的缩写,请记ä½�这个约定。" #. type: Title == #: ceccomp.adoc:39 #, no-wrap msgid "DESCRIPTION" msgstr "æ��è¿°" #. type: Plain text #: ceccomp.adoc:44 msgid "" "`ceccomp` have 5 main functions, basically it's a C version of `seccomp-" "tools`, however, there are some breaking changes you need to know, which " "will be highlighted in each subcommand section." msgstr "" "`ceccomp` 有5个主è¦�的功能,它基本上是C版本的 `seccomp-tools` ,然而,\n" "有一些ä¸�å�Œçš„地方你需è¦�知é�“,它们会在在æ¯�个å­�命令的章节中被注明。" #. type: Title === #: ceccomp.adoc:45 #, no-wrap msgid "asm - ASSEMBLE" msgstr "asm - 汇编" #. type: Plain text #: ceccomp.adoc:48 #, no-wrap msgid " ceccomp asm [-c WHEN] [-a ARCH] [-f FMT] [TEXT]\n" msgstr " ceccomp asm [-c WHEN] [-a ARCH] [-f FMT] [TEXT]\n" #. type: Plain text #: ceccomp.adoc:51 msgid "" "Assemble _TEXT_ to _RAW_. Use it to embed hand written filter rules into C " "code or to see the original code of some _TEXT_." msgstr "" "å°† _TEXT_ 汇编为 _RAW_ 。适用于将手写的过滤器规则嵌入到C代ç �中,\n" "或希望观察一些 _TEXT_ 对应的原始字节ç �。" #. type: Labeled list #: ceccomp.adoc:52 ceccomp.adoc:104 ceccomp.adoc:153 ceccomp.adoc:203 #: ceccomp.adoc:329 #, no-wrap msgid "-c, --color *WHEN*" msgstr "-c, --color *WHEN*" #. type: Plain text #: ceccomp.adoc:56 msgid "" "Determines when to display warnings and errors in color. If the value is " "_auto_, ceccomp will display color when the output target is a \"tty\". Can " "be _auto_, _never_ or _always_. The default value is _auto_." msgstr "" "决定了 `ceccomp` 何时输出有颜色的文本。当设置为 _auto_ 时, `ceccomp`\n" "会在输出目标是一个“ttyâ€�时打å�°é¢œè‰²ã€‚å�¯ä»¥æ˜¯ _auto_ ã€� _never_ 或者 " "_always_ 。\n" "默认值是 _auto_ 。" #. type: Labeled list #: ceccomp.adoc:57 ceccomp.adoc:108 ceccomp.adoc:168 #, no-wrap msgid "-a, --arch *ARCH*" msgstr "-a, --arch *ARCH*" #. type: Plain text #: ceccomp.adoc:62 msgid "" "Set to any architecture libseccomp supports. Will be used to determine the " "actual syscall number behind the name (for example, on x86_64, you could " "write `\"execve\"` instead of `59` like the basic example above). Your " "system arch will be taken if not set via `uname`. The default value on your " "system is {ARCH}." msgstr "" "å�¯ä»¥è®¾ç½®ä¸ºä»»ä½• libseccomp 支æŒ�的架构。它将被用于决定系统调用å��称对应的系统调" "用å�·ã€‚\n" "例如,在 x86_64 上,就åƒ�上é�¢çš„基本示例,你å�¯ä»¥å†™ `\"execve\"` 而ä¸�是数字 " "`59`\n" "指代系统调用å�·ã€‚如果ä¸�设置这个å�‚数,则通过 `uname` æ��å�–当å‰�系统的架构。\n" "你的系统上的默认值是 {ARCH} 。" #. type: Labeled list #: ceccomp.adoc:63 #, no-wrap msgid "-f, --format *FMT*" msgstr "-f, --format *FMT*" #. type: Plain text #: ceccomp.adoc:67 msgid "" "Determines how `ceccomp` produces binary-format bpf code. Can be _hexfmt_, " "_hexline_, _raw_ or _c-macro_. You could find sample output in <> " "section. The default value is _hexline_." msgstr "" "决定了 `ceccomp` 如何输出二进制格å¼�çš„ BPF 字节ç �。å�¯ä»¥æ˜¯ _hexfmt_ã€�" "_hexline_ã€�_raw_ 或者 _c-macro_。你å�¯ä»¥åœ¨ <> 节中找到示例输出。" "默认值是 _hexline_。" #. type: Labeled list #: ceccomp.adoc:68 ceccomp.adoc:171 #, no-wrap msgid "*TEXT*" msgstr "*TEXT*" #. type: Plain text #: ceccomp.adoc:71 msgid "" "Take a optional filename to determine which file containing _TEXT_ will be " "assembled. Will read from _stdin_ if not set. `-` is treated as _stdin_." msgstr "" "一个å�¯é€‰çš„æ–‡ä»¶å��,其中存放了需è¦�被汇编的 _TEXT_ 。ä¸�设置则从 _标准输入_ 中读" "å�–。`-` 被视作 _标准输入_。" #. type: Plain text #: ceccomp.adoc:74 msgid "" "The assembly syntax was changed greatly since _version 4.0_, please checkout " "grammar reference below!" msgstr "_4.0 版本_ 大幅修改了汇编的语法,请查阅下é�¢çš„语法å�‚考ï¼�" #. type: Plain text #: ceccomp.adoc:77 msgid "" "Please check out <> section to see how to write a " "rule by hand. Some examples will be displayed in <> section." msgstr "" "查看 <> 一节å�¯ä»¥æ‰¾åˆ°å¦‚何手写规则。一些示例会在 <> 一节中展示。" #. type: Plain text #: ceccomp.adoc:81 msgid "" "Since _version 4.0_, endianness is considered. If target endianness *ARCH* " "is different from machine endianness, the filters will be reversed (CODE and " "K) before outputting." msgstr "" "从 _4.0 版本_ 开始考虑端åº�。如果目标架构 *ARCH* 的端åº�与机器端åº�ä¸�å�Œï¼Œåˆ™ä¼šåœ¨" "输出å‰�å��转过滤器(CODE å’Œ K)。" #. type: Plain text #: ceccomp.adoc:84 msgid "" "Since _version 4.3_, a new *FMT* _c-macro_ is added to port seccomp rules to " "other architectures easily." msgstr "" "从 _4.3 版本_ 开始,新的 *FMT* _c-macro_ 被加入用以轻æ�¾å°† seccomp 规则移æ¤�到" "其他架构上。" #. type: Table #: ceccomp.adoc:95 #, no-wrap msgid "" "|Command|Difference\n" "\n" "|`seccomp-tools asm`\n" "|Use its own grammar to assemble, a bit script like; can assemble invalid _TEXT_\n" "which will be rejected by kernel\n" "\n" "|`ceccomp asm`\n" "|You can just take `disasm` output to `asm`, no new grammar is needed to learn;\n" "take `stdin` as input by default\n" msgstr "" "|命令|差别\n" "\n" "|`seccomp-tools asm`\n" "|使用它自己的语法汇编,有点åƒ�脚本;å�¯ä»¥æ±‡ç¼–会被内核拒ç»�的错误 _TEXT_\n" "\n" "|`ceccomp asm`\n" "|ä½ å�¯ä»¥ç›´æŽ¥æ‹¿ç�€ `disasm` 的输出æ�¥æ±‡ç¼–,ä¸�需è¦�学习新语法;默认使用 _标准输入_ 作为输入\n" #. type: Title === #: ceccomp.adoc:97 #, no-wrap msgid "disasm - DISASSEMBLE" msgstr "disasm - å��汇编" #. type: Plain text #: ceccomp.adoc:100 #, no-wrap msgid " ceccomp disasm [-c WHEN] [-a ARCH] [-e] [RAW]\n" msgstr " ceccomp disasm [-c WHEN] [-a ARCH] [-e] [RAW]\n" #. type: Plain text #: ceccomp.adoc:103 msgid "" "Disassemble _RAW_ to _TEXT_. Use it to see what does a filter do if you " "could not access filter via `trace` and have to manually extract the filter " "out." msgstr "" "å��汇编 _RAW_ 为 _TEXT_ 。适用于当你无法使用 `trace` 看到过滤器时,必须手动æ��" "å�–过滤器,\n" "ç„¶å�Žæ£€æŸ¥å…¶å�«ä¹‰ã€‚" #. type: Plain text #: ceccomp.adoc:107 msgid "" "Argument description can be found in <> section. `disasm` " "may print more text in color including syntax highlighting for _TEXT_." msgstr "" "å�‚æ•°æ��è¿°å�¯ä»¥åœ¨ <> 一节中找到。 `disasm` å�¯èƒ½ä¼šæ‰“å�°æ›´å¤šæœ‰é¢œè‰²çš„æ–‡" "本,包括针对\n" "_TEXT_ 的语法高亮。" #. type: Plain text #: ceccomp.adoc:113 msgid "" "Set to any architecture libseccomp supports. Will be used to determine how " "filtered syscall number in _RAW_ filter is translated to syscall name (for " "example, on x86_64, the number `0x3b` is translated to `execve` if is " "comparing syscall_nr, see the basic example above). The default value on " "your system is {ARCH}." msgstr "" "å�¯ä»¥è®¾ç½®ä¸ºä»»ä½• libseccomp 支æŒ�的架构。它将被用于决定 _RAW_ 中的系统调用å�·å¦‚何" "被翻译为系统调用å��。\n" "例如,在 x86_64 上,在比较系统调用å�·æ—¶ï¼Œæ•°å­— `0x3b` 将被翻译为 `execve` ,å�¯" "以看上é�¢çš„基本示例。\n" "你的系统上的默认值是 {ARCH} 。" #. type: Labeled list #: ceccomp.adoc:114 #, no-wrap msgid "-e, --ebpf" msgstr "-e, --ebpf" #. type: Plain text #: ceccomp.adoc:119 msgid "" "Treat _RAW_ as eBPF insn bytes instead of cBPF filter bytes. This flag is " "designed to test whether eBPF-to-cBPF conversion is working or not. To use " "this function, please dump installed eBPF insns migrated from seccomp " "filters in a process via eBPF or a kernel module. Any input not generated by " "kernel may lead to undefined behavior." msgstr "" "认为 _RAW_ 是 eBPF 指令字节而é�ž cBPF 过滤器字节。这个标志被设计用于测试 eBPF " "到 cBPF 的转æ�¢æ˜¯å�¦æ­£å¸¸å·¥ä½œã€‚è¦�使用这个功能,请使用 eBPF 或内核模å�—导出进程内" "安装的从 seccomp 过滤器转æ�¢è¿‡æ�¥çš„ eBPF 指令。任何ä¸�是由内核生æˆ�的输入都å�¯èƒ½äº§" "生未定义行为。" #. type: Labeled list #: ceccomp.adoc:120 #, no-wrap msgid "*RAW*" msgstr "*RAW*" #. type: Plain text #: ceccomp.adoc:123 msgid "" "A binary file with raw BPF codes. Takes _stdin_ as input if not set. Treat `-" "` as _stdin_. The file is arch-revelent, so it may not be portable on " "different archs." msgstr "" "包å�«åŽŸå§‹ BPF 代ç �的二进制文件。如果ä¸�设置则将 _标准输入_ 作为输入。`-` 被视" "作 _标准输入_。这个文件是与架构有关的,所以它在ä¸�å�Œæž¶æž„之间å�¯èƒ½ä¸�是通用的。" #. type: Plain text #: ceccomp.adoc:127 msgid "" "Since _version 4.0_, endianness is considered. If target endianness *ARCH* " "is different from machine endianness, the filters will be reversed (CODE and " "K) before decoding." msgstr "" "从 _4.0 版本_ 开始考虑端åº�。如果目标架构 *ARCH* 的端åº�与机器端åº�ä¸�å�Œï¼Œåˆ™ä¼šåœ¨" "è§£ç �å‰�å��转过滤器(CODE å’Œ K)。" #. type: Plain text #: ceccomp.adoc:132 msgid "" "ceccomp will try to resolve syscall number under an arch ONLY IF that at " "that line, arch can be determined. On foreign arch (not equal to the arch " "you set), the foreign arch will be prepended to syscall name. You may notice " "that in some cases, seccomp-tools is able to resolve the name while ceccomp " "is not, that may be intended as the arch is not determined." msgstr "" "当且仅当在æŸ�一行的架构å�¯ä»¥è¢«ç¡®å®šæ—¶ï¼Œceccomp æ‰�会å°�试用那个架构解æž�那个系统调" "用å�·ã€‚\n" "如果是外部架构(ä¸�等于你设置的架构),它会被附加到系统调用å��å‰�。你å�¯èƒ½ä¼šæ³¨æ„�" "到在一些情况下,\n" "seccomp-tools 能解æž�一些系统调用å��,而 ceccomp ä¸�能,这å�¯èƒ½æ˜¯å› ä¸ºæ­¤æ—¶æž¶æž„ä¸�能" "被确定。" #. type: Table #: ceccomp.adoc:142 #, no-wrap msgid "" "|Command|Difference\n" "\n" "|`seccomp-tools disasm`\n" "|Disassembles in its format; never check if the filter is valid\n" "\n" "|`ceccomp disasm`\n" "|Disassembles in ceccomp format, and takes `stdin` as input by default; check arch strictly\n" "and always display foreign arch name\n" msgstr "" "|命令|差别\n" "\n" "|`seccomp-tools disasm`\n" "|用它自己的语法å��汇编;永远ä¸�会检查 _RAW_ 是å�¦å�ˆæ³•\n" "\n" "|`ceccomp disasm`\n" "|用 ceccomp 语法å��汇编,并且默认将 _标准输入_ 作为输入;严格检查架构,\n" "并且永远打å�°å¤–部架构å��\n" #. type: Title === #: ceccomp.adoc:144 #, no-wrap msgid "emu - EMULATE" msgstr "emu - 模拟" #. type: Plain text #: ceccomp.adoc:147 #, no-wrap msgid " ceccomp emu [-c WHEN] [-a ARCH] [-q] TEXT SYSCALL_NAME/SYSCALL_NR [ARGS[0] ARGS[1] ... ARGS[5] PC]\n" msgstr " ceccomp emu [-c WHEN] [-a ARCH] [-q] TEXT SYSCALL_NAME/SYSCALL_NR [ARGS[0] ARGS[1] ... ARGS[5] PC]\n" #. type: Plain text #: ceccomp.adoc:152 msgid "" "Emulate what will happen if `syscall(SYSCALL_NR, ARGS[0], ARGS[1], ..., " "ARGS[5])` from `PC` is called following rules described in _TEXT_. Use it to " "see the result without actually running it in program or you don't want to " "examine the filter rule manually. This subcommand can be used to " "automatically examining a filter." msgstr "" "按照 _TEXT_ 中æ��述的规则,模拟从 `PC` 调用 `syscall(SYSCALL_NR, ARGS[0], " "ARGS[1], ..., ARGS[5])`\n" "的结果。适用于在ä¸�实际è¿�行程åº�或ä¸�想手动检查规则时,查看触å�‘系统调用的结" "果。\n" "这个å­�命令适å�ˆç”¨æ�¥è‡ªåŠ¨æ£€æµ‹ä¸€ä¸ªè¿‡æ»¤å™¨ã€‚" #. type: Plain text #: ceccomp.adoc:156 msgid "" "Argument description can be found in <> section. `emu` may " "print more text in color including syntax highlighting for _TEXT_ and " "skipped statements." msgstr "" "å�‚æ•°æ��è¿°å�¯ä»¥åœ¨ <> 一节中找到。 `emu` å�¯èƒ½ä¼šæ‰“å�°æ›´å¤šæœ‰é¢œè‰²çš„æ–‡æœ¬ï¼Œ" "包括针对\n" "_TEXT_ 的语法高亮以å�Šè·³è¿‡çš„伪代ç �。" #. type: Labeled list #: ceccomp.adoc:157 #, no-wrap msgid "*SYSCALL_NAME/SYSCALL_NR*" msgstr "*SYSCALL_NAME/SYSCALL_NR*" #. type: Plain text #: ceccomp.adoc:162 msgid "" "If you set *SYSCALL_NAME* (like `execve`), it will be translated to " "*SYSCALL_NR* under *ARCH* first. Or else set *SYSCALL_NR* directly (like " "`59`). Then the nr will be tested against the bpf filter to see the result " "of that syscall. This argument is NOT optional." msgstr "" "如果你设置了 *SYSCALL_NAME* (比如 `execve` ),那么它会基于 *ARCH* 先被翻译" "为对应的\n" "*SYSCALL_NR* 。或者你å�¯ä»¥ç›´æŽ¥è®¾ç½® *SYSCALL_NR* (例如 `59` )。然å�Žä¼šæµ‹è¯•这个" "系统调用å�·ç»�过\n" "BPF 过滤器处ç�†å�Žçš„输出并打å�°å‡ºæ�¥ã€‚这个å�‚数是必填的。" #. type: Labeled list #: ceccomp.adoc:163 #, no-wrap msgid "*ARGS[0-5]* and *PC*" msgstr "*ARGS[0-5]* å’Œ *PC*" #. type: Plain text #: ceccomp.adoc:167 msgid "" "Register values when calling syscall. For example, on x86_64, these are " "equivalent to `rdi`, `rsi`, `rdx`, `r10`, `r8`, `r9` and `rip`. Their " "default value is 0." msgstr "" "当调用系统调用时对应寄存器的值。例如,在 x86_64 上,它们分别对应了\n" "`rdi` ã€� `rsi` ã€� `rdx` ã€� `r10` ã€� `r8` ã€� `r9` å’Œ `rip` 。它们的默认值都是" "0。" #. type: Plain text #: ceccomp.adoc:170 ceccomp.adoc:331 msgid "Argument description can be found in <> section." msgstr "å�‚æ•°æ��è¿°å�¯ä»¥åœ¨ <> 一节中找到。" #. type: Plain text #: ceccomp.adoc:175 msgid "" "Take a filename to determine which file containing _TEXT_ rule will be " "tested. Note that filename CAN NOT be ignored as ceccomp can not determine " "if a positional argument is syscall or filename. Use `-` to refer to _stdin_." msgstr "" "一个文件å��,其中存放了需è¦�被测试的 _TEXT_ 规则。注æ„�文件å�� ä¸�能 被忽略,因为 " "ceccomp 无法判断一个ä½�ç½®å�‚数是系统调用å�·è¿˜æ˜¯æ–‡ä»¶å��。使用 `-` å�¯ä»¥æŒ‡ä»£ _标准输" "å…¥_。" #. type: Labeled list #: ceccomp.adoc:176 ceccomp.adoc:229 #, no-wrap msgid "-q, --quiet" msgstr "-q, --quiet" #. type: Plain text #: ceccomp.adoc:179 msgid "" "Only print the eval result of the filter. For example, if last statement " "emulated is `return KILL`, then `KILL` is printed." msgstr "" "å�ªæ‰“å�°è¿‡æ»¤å™¨çš„æ¨¡æ‹Ÿç»“果。例如,最å�Žä¸€è¡Œæ¨¡æ‹Ÿçš„伪代ç �是 `return KILL`,那么将会" "打å�° `KILL`。" #. type: Table #: ceccomp.adoc:189 #, no-wrap msgid "" "|Command|Difference\n" "\n" "|`seccomp-tools emu`\n" "|Take a _RAW_ as input\n" "\n" "|`ceccomp emu`\n" "|Take a _TEXT_ as input and take `stdin` as input by default; set *PC* is\n" "possible\n" msgstr "" "|命令|差别\n" "\n" "|`seccomp-tools emu`\n" "|用 _RAW_ 作为输入\n" "\n" "|`ceccomp emu`\n" "|用 _TEXT_ 作为输入,并默认将 _标准输入_ 作为输入;å�¯ä»¥è®¾ç½® *PC*\n" #. type: Title === #: ceccomp.adoc:191 #, no-wrap msgid "trace - TRACE FILTER IN RUNTIME" msgstr "trace - è¿�行时æ�•获过滤器" #. type: Plain text #: ceccomp.adoc:195 #, no-wrap msgid "" " ceccomp trace [-c WHEN] [-q] [-o FILE] PROGRAM [program-args]\n" " [-c WHEN] [-q] -p PID [-s]\n" msgstr "" " ceccomp trace [-c WHEN] [-o FILE] PROGRAM [program-args]\n" " [-c WHEN] -p PID [-s]\n" #. type: Plain text #: ceccomp.adoc:202 msgid "" "The first line captures filters *PROGRAM* loads in runtime by tracing it; " "the second line extract seccomp filters from *PID*, or trace *PID* to " "capture subsequent seccomp filters; once fetched filters, print them in " "_TEXT_. You can only choose one of the two formats above. Use this if " "running the program is the simplest way to fetch bpf filters or a program " "with seccomp filters installed is waiting for input." msgstr "" "使用第一行的命令å�¯ä»¥åˆ©ç”¨è°ƒè¯•在 *PROGRAM* è¿�行中加载过滤器时动æ€�æ�•获过滤器;\n" "第二行的命令å�¯ä»¥ä»Ž *PID* 对应的进程中æ��å�–出 seccomp 过滤器,或通过调试 *PID* " "æ�•获å�Žç»­çš„ seccomp 过滤器;一旦æ�•获到了过滤器,\n" "将会以 _TEXT_ 的格å¼�将它打å�°å‡ºæ�¥ã€‚ä½ å�¯ä»¥ä»Žä¸¤ä¸ªæ ¼å¼�中选择一个使用。\n" "适用于è¿�行一个程åº�是æ�•获BPF过滤器最简å�•的方å¼�或者一个安装了 seccomp\n" "过滤器的程åº�正在等待输入。" #. type: Plain text #: ceccomp.adoc:206 msgid "" "Argument description can be found in <> section. `trace` may " "print more text in color including syntax highlighting for _TEXT_." msgstr "" "å�‚æ•°æ��è¿°å�¯ä»¥åœ¨ <> 一节中找到。 `trace` å�¯èƒ½ä¼šæ‰“å�°æ›´å¤šæœ‰é¢œè‰²çš„æ–‡" "本,包括针对\n" "_TEXT_ 的语法高亮。" #. type: Labeled list #: ceccomp.adoc:207 #, no-wrap msgid "-o, --output *FILE*" msgstr "-o, --output *FILE*" #. type: Plain text #: ceccomp.adoc:212 msgid "" "May be useful when *PROGRAM* produces quite a lot output in _stderr_. " "`ceccomp` allow user to close _stdin_ and _stdout_ to limit *PROGRAM* input " "and output, so `ceccomp` use _stderr_ to print messages when running " "*PROGRAM*, set *FILE* if you want to see _TEXT_ in some other file. Treat `-" "` as _stdout_." msgstr "" "当 *PROGRAM* 会产生很多输出到 _标准错误_ æ—¶å�¯èƒ½å¾ˆæœ‰ç”¨ã€‚ `ceccomp` å…�许用户关" "é—­\n" "_标准输入_ å’Œ _标准输出_ æ�¥é™�制 *PROGRAM* 的输入和输出,所以 当è¿�行\n" "*PROGRAM* æ—¶ `ceccomp` 使用 _标准错误_ æ�¥æ‰“å�°æ¶ˆæ�¯ã€‚如果你想在别的文件中看è§�\n" "_TEXT_ çš„è¯�请设置 *FILE* 。`-` 被视作 _标准输出_。" #. type: Labeled list #: ceccomp.adoc:213 #, no-wrap msgid "*PROGRAM*" msgstr "*PROGRAM*" #. type: Plain text #: ceccomp.adoc:216 msgid "" "Set to the program you want to run, and *program-args* are its arguments " "just like running shell command `exec PROGRAM program-args`." msgstr "" "设置为你想è¿�行的程åº�,并且 *program-args* 将作为它的å�‚数,\n" "å°±åƒ�è¿�行 shell 命令 `exec PROGRAM program-args` 。" #. type: Labeled list #: ceccomp.adoc:217 ceccomp.adoc:332 #, no-wrap msgid "-p, --pid *PID*" msgstr "-p, --pid *PID*" #. type: Plain text #: ceccomp.adoc:223 msgid "" "Set to the pid you want to inspect. *PID* is conflict with *PROGRAM*; you " "could either run a program dynamically or examine a pid in one command. " "Without `-s` flag, trace pid will try to extract seccomp filter in *PID* via " "`ptrace(PTRACE_SECCOMP_GET_FILTER)`, which may not be available in some " "systems. The pid here is actually process (thread) id, you can trace a " "thread or process." msgstr "" "设置为你想检查的 pid。 *PID* å’Œ *PROGRAM* 相冲çª�;你å�ªèƒ½åœ¨ä¸€æ�¡å‘½ä»¤ä¸­åЍæ€�è¿�行" "一个程åº�,或者检查一个 pid。没有 `-s` 标志,trace pid 会å°�试使用 " "`ptrace(PTRACE_SECCOMP_GET_FILTER)` 从 *PID* 中æ��å�– seccomp 过滤器,这个æ“�作" "在一些系统上å�¯èƒ½ä¸�å�¯ç”¨ã€‚这里的 pid 其实是进程(线程)ID,你å�¯ä»¥è¿½è¸ªä¸€ä¸ªçº¿ç¨‹æˆ–" "进程。" #. type: Labeled list #: ceccomp.adoc:224 #, no-wrap msgid "-s, --seize" msgstr "-s, --seize" #. type: Plain text #: ceccomp.adoc:228 msgid "" "*ONLY AVAILABLE FOR TRACE PID MODE.* Set this flag will override trace pid " "behavior to attach to *PID* and keep tracing for seccomp filter loading like " "trace prog mode. _This flag was introduced in version 4.0._" msgstr "" "*å�ªé€‚用于 TRACE PID 模å¼�。* 设置这个标志将会覆盖 trace pid 的行为为åƒ� trace " "prog 模å¼�一样把调试器挂到 *PID* 上并æŒ�续跟踪 seccomp 过滤器的加载。_这个标志" "引入于 4.0 版本。_" #. type: Plain text #: ceccomp.adoc:232 msgid "" "Set to suppress the extra *[INFO]* prints when detect process forking, " "exiting or seccomp filter loading. _This flag was introduced in version 4.0._" msgstr "" "设置这个标志将会在检测到进程分å�‰ã€�退出或加载 seccomp 过滤器时抑制多余的 " "*[INFO]* 输出。 _这个标志引入于 4.0 版本。_" #. type: Plain text #: ceccomp.adoc:236 msgid "" "To extract filters from *PID*, `CAP_SYS_ADMIN` is needed (without `-s` " "flag) and `CAP_SYS_PTRACE` may also be needed, the easiest way to acquire " "them is calling `ceccomp` with `sudo`." msgstr "" "è¦�想从 *PID* 中æ��å�–过滤器,你需è¦� `CAP_SYS_ADMIN` (没有 `-s` 标志),å�Œæ—¶è¿˜" "å�¯èƒ½éœ€è¦�\n" "`CAP_SYS_PTRACE` ,最简å�•的获å�–它们的方法是用 `sudo` è¿�行 `ceccomp` 。" #. type: Plain text #: ceccomp.adoc:240 msgid "" "Since _version 3.1_, multiple process tracing is introduced, and when tracee " "forking/resolving/exiting, an extra INFO message is printed. You can discard " "it by running command like `ceccomp trace -q PROG 2>/dev/null`." msgstr "" "从 _3.1 版本_ 开始引入了多进程支æŒ�,并且当被调试进程 fork/resolve/exit\n" "时,将会打å�°ä¸€æ�¡é¢�外的 INFO ä¿¡æ�¯ã€‚ä½ å�¯ä»¥ä½¿ç”¨åƒ� `ceccomp trace -q PROG 2>/dev/" "null`\n" "这样的命令丢弃它。" #. type: Plain text #: ceccomp.adoc:243 msgid "" "Since _version 4.2_, `dump` sub command is added as an alias of `trace`, to " "keep compatibility with `seccomp-tools`." msgstr "" "从 _4.2 版本_ 开始 `dump` å­�命令作为 `trace` 的别å��被加入,用以ä¿�æŒ�å’Œ " "`seccomp-tools` 的兼容性。" #. type: Table #: ceccomp.adoc:256 #, no-wrap msgid "" "|Command|Difference\n" "\n" "|`seccomp-tools dump`\n" "|Setting output format is possible; each filter can be output to a different\n" "file; killing *PROGRAM* once *LIMIT* times of filters loaded; wrapping *PROGRAM*\n" "in `sh -c`\n" "\n" "|`ceccomp trace` or `ceccomp dump`\n" "|All filters are output to a single file; never kill *PROGRAM*; *PROGRAM* is\n" "launched directly, so `./` is not needed; explicitly print when forking;\n" "able to attach to pid for dynamic seccomp filter capturing\n" msgstr "" "|命令|差别\n" "\n" "|`seccomp-tools dump`\n" "|å�¯ä»¥è®¾ç½®è¾“出格å¼�ï¼›æ¯�一个过滤器å�¯ä»¥è¾“出到ä¸�å�Œçš„æ–‡ä»¶ï¼›å½“ *PROGRAM*\n" "加载了 *LIMIT* 个过滤器å�Žå°±æ�€æ­»ç¨‹åº�;将 *PROGRAM* 包装在 `sh -c` 中è¿�行\n" "\n" "|`ceccomp trace` 或 `ceccomp dump`\n" "|所有过滤器被输出到å�Œä¸€ä¸ªæ–‡ä»¶ï¼›æ°¸è¿œä¸�会æ�€æ­» *PROGRAM* ï¼› *PROGRAM* 是直接被执行的,\n" "所以ä¸�需è¦� `./` ;当 fork 时,显å¼�打å�°äº‹ä»¶ï¼›èƒ½å¤Ÿé™„加调试器到 pid 上动æ€�æ�•æ�‰ seccomp 过滤器\n" #. type: Title === #: ceccomp.adoc:258 #, no-wrap msgid "probe - TEST COMMON SYSCALLS INSTANTLY" msgstr "probe - 快速测试常è§�的系统调用" #. type: Plain text #: ceccomp.adoc:261 #, no-wrap msgid " ceccomp probe [-c WHEN] [-o FILE] [-q] PROGRAM [program-args]\n" msgstr " ceccomp probe [-c WHEN] [-o FILE] [-q] PROGRAM [program-args]\n" #. type: Plain text #: ceccomp.adoc:265 msgid "" "Run *PROGRAM* with *program-args* to captures *FIRST* seccomp filter, and " "then kill all children. Use it when a quick check against a program is " "needed, and detect potential seccomp rule issues." msgstr "" "以 *program-args* 为å�‚æ•°è¿�行 *PROGRAM* æ�¥æ�•获 *第一个* seccomp 过滤器,\n" "ç„¶å�Žæ�€æ­»æ‰€æœ‰å­�进程。适用于快速测试一个程åº�的规则并检测潜在的 seccomp\n" "规则问题。" #. type: Plain text #: ceccomp.adoc:267 msgid "" "All argument descriptions can be found in <> section." msgstr "所有å�‚æ•°æ��述都å�¯ä»¥åœ¨ <> 一节中找到。" #. type: Plain text #: ceccomp.adoc:271 msgid "" "The output for this subcommand is the emulating result of common syscalls " "like `execve`, `open` and so on. If the filter itself is not capable of " "blocking syscalls, you could know that with a glance." msgstr "" "这个å­�命令的输出是一系列常è§�的系统调用的模拟结果,例如 `execve` ã€� `open` " "等。\n" "如果过滤器本身并ä¸�能阻拦系统调用,那你一眼就能看出æ�¥ã€‚" #. type: Plain text #: ceccomp.adoc:274 msgid "" "Typical output for this subcommand is described below, more detailed example " "could be found in <> section." msgstr "" "这个å­�命令的典型输出如下所示,更多完整的实例å�¯ä»¥åœ¨ <> 一节中找" "到。" #. type: Plain text #: ceccomp.adoc:286 #, no-wrap msgid "" " open -> ALLOW\n" " read -> ALLOW\n" " write -> ALLOW\n" " execve -> KILL\n" " execveat -> KILL\n" " mmap -> ALLOW\n" " mprotect -> ALLOW\n" " openat -> ALLOW\n" " sendfile -> ALLOW\n" " ptrace -> ERRNO(1)\n" " fork -> ALLOW\n" msgstr "" " open -> ALLOW\n" " read -> ALLOW\n" " write -> ALLOW\n" " execve -> KILL\n" " execveat -> KILL\n" " mmap -> ALLOW\n" " mprotect -> ALLOW\n" " openat -> ALLOW\n" " sendfile -> ALLOW\n" " ptrace -> ERRNO(1)\n" " fork -> ALLOW\n" #. type: Plain text #: ceccomp.adoc:288 msgid "`seccomp-tools` don't have this subcommand." msgstr "`seccomp-tools` 没有等价的å­�命令。" #. type: Title === #: ceccomp.adoc:289 #, no-wrap msgid "capture - CAPTURE FILTERS WITH EBPF" msgstr "capture - 用 eBPF æ�•获过滤器" #. type: Plain text #: ceccomp.adoc:292 #, no-wrap msgid " ceccomp capture [-c WHEN] [-p PID]\n" msgstr " ceccomp capture [-c WHEN] [-p PID]\n" #. type: Plain text #: ceccomp.adoc:300 msgid "" "Capture seccomp filters in global scope if *PID* not set. The eBPF program " "will trace `seccomp_check_filter` kernel function, reliably intercepting " "seccomp filters that the kernel will load, WITHOUT race conditions compared " "to <>. This function is named \"global " "capture\" below. Linux 5.15 is the lowest recommended kernel version to run " "this function on _x86_64_, other architecture may require higher kernel " "version to run this function." msgstr "" "未设置 *PID* 时在全局范围内æ�•获 seccomp 过滤器。eBPF 程åº�将追踪 " "`seccomp_check_filter` 内核函数,å�¯é� åœ°æ‹¦æˆªå†…核将加载的 seccomp 过滤器,而相" "比 <> 没有æ�¡ä»¶ç«žäº‰çš„风险。这个功能在下方被称为“全局" "æ�•获â€�。在 _x86_64_ 上,Linux 5.15 是è¿�行该功能的最低推è��内核版本。" #. type: Plain text #: ceccomp.adoc:310 msgid "" "If *PID* is set, an eBPF program to extract installed seccomp filters in the " "corresponding process (actually thread) will be installed. Note that inside " "kernel, `pid` is referred thread id and `tgid` is referred to process id. " "The eBPF program directly pulls eBPF insns migrated from original seccomp " "filters out and converts them back to perform <>. " "This function does not require `CONFIG_CHECKPOINT_RESTORE` kernel config, " "and is functional even if `ceccomp` itself is under seccomp. This function " "is named \"capture pid\" below. Linux 6.2 is the lowest kernel version to " "run this function, as `bpf_task_from_pid` was introduced then." msgstr "" "当设置了 *PID* 时,将安装用æ�¥ä»Žå¯¹åº”进程(其实是线程)中æ��å�–已安装过的 " "seccomp 过滤器的 eBPF 程åº�。注æ„�在内核中,`pid` 指线程 id,而 `tgid` 指进程 " "id。eBPF 程åº�会直接把由原始 seccomp 过滤器转æ�¢å�Žçš„ eBPF 指令抽å�–出æ�¥å¹¶è½¬æ�¢å›ž" "去,用以执行 <>。这个功能ä¸�需è¦� `CONFIG_CHECKPOINT_RESTORE` " "内核é…�置,甚至在 `ceccomp` 处在 seccomp 状æ€�æ—¶ä»�能工作。这个功能在下方被称为" "“æ�•获 PIDâ€�。Linux 6.2 是è¿�行该功能的最低内核版本,因为这时 " "`bpf_task_from_pid` 函数æ‰�被引入。" #. type: Plain text #: ceccomp.adoc:316 msgid "" "When the kernel migrates seccomp filters, the conversion from cBPF to eBPF " "is lossy because several distinct cBPF instructions can be mapped to the " "same eBPF instruction sequence. As a result, the output from \"capture pid\" " "may not be identical to the original seccomp filter, even though it is " "functionally equivalent." msgstr "" "当内核è¿�ç§» seccomp 过滤器时,由于一些ä¸�å�Œçš„ cBPF 指令会被映射到相å�Œçš„ eBPF 指" "令åº�列,因此从 cBPF 到 eBPF 的转æ�¢æ˜¯æœ‰æ�Ÿçš„。结果是“æ�•获 PIDâ€�的输出å�¯èƒ½å’ŒåŽŸå§‹" "çš„ seccomp 过滤器并ä¸�一致,尽管它们在功能上是等价的。" #. type: Plain text #: ceccomp.adoc:322 msgid "" "Currently, compat task detection is only supported on _x86_64_ and " "_aarch64_. With this feature, `ceccomp` can identify whether a task is " "native (64-bit task on 64-bit kernel) or \"compatible\" (32-bit task on 64-" "bit kernel), so that `ceccomp` can pass the correct architecture token to " "libseccomp to query syscall name in captured seccomp filters." msgstr "" "ç›®å‰�,compat task 检测å�ªæ”¯æŒ� _x86_64_ å’Œ _aarch64_。 这个功能å…�许 `ceccomp` " "识别一个任务是原生的 (64 ä½�内核上的 64 ä½�任务),还是“兼容的â€� (64 ä½�内核上的 " "32 ä½�任务),由此 `ceccomp` æ‰�能把正确的架构标识传给 libseccomp æ�¥æŸ¥è¯¢æ�•获到" "çš„ seccomp 过滤器中的系统调用的å��字。" #. type: Plain text #: ceccomp.adoc:328 msgid "" "Note that eBPF utilizes asynchronous ring buffer to send back data to user-" "mode process, so if lots of seccomp filters are loaded at the same time, the " "buffer may run out and you need to see detailed errors via `bpftool prog " "trace`. Since we can't send the errors back through full ring buffer, those " "overflowed filters are actually invisible to users without reading kernel " "messages." msgstr "" "注æ„� eBPF 利用异步环形缓冲区æ�¥å�‘用户æ€�进程å�‘回数æ�®ï¼Œæ‰€ä»¥å¦‚æžœå�Œæ—¶åŠ è½½äº†å¥½å¤š " "seccomp 过滤器,缓冲区å�¯èƒ½ä¼šè€—尽并且您需è¦�è¿�行 `bpftool prog trace` æ�¥çœ‹åˆ°è¯¦" "细错误。由于我们ä¸�能将错误通过满的缓冲区å�‘回æ�¥ï¼Œå› æ­¤é‚£äº›æº¢å‡ºçš„过滤器对没有阅" "读内核消æ�¯çš„用户æ�¥è¯´å®žé™…上是ä¸�å�¯è§�的。" #. type: Plain text #: ceccomp.adoc:334 msgid "Which *process* (thread) to extract seccomp filter insns from." msgstr "从哪个 *进程* (线程) 中æ��å�– seccomp 过滤器指令。" #. type: Plain text #: ceccomp.adoc:338 msgid "" "All *PID* presented in either \"global capture\" or \"capture pid\" are " "*INITIAL NAMESPACE PID*, not PID in current namespace. It's recommended that " "only run `ceccomp capture` in initial namespace." msgstr "" "所有出现在“全局æ�•获â€�或“æ�•获 PIDâ€�中的 *PID* 是 *åˆ�始命å��空间 PID*,而ä¸�是当å‰�" "命å��空间中的 PID。推è��å�ªåœ¨åˆ�始命å��空间中è¿�行 `ceccomp capture`。" #. type: Plain text #: ceccomp.adoc:341 msgid "" "This module is optional, you can opt it out during configuration. This " "module require libbpf to work." msgstr "此模å�—是å�¯é€‰çš„,您å�¯ä»¥åœ¨é…�置阶段将其ç¦�用。此模å�—需è¦� libbpf æ‰�能工作。" #. type: Plain text #: ceccomp.adoc:343 msgid "This subcommand was introduced in _version 4.3_." msgstr "æ­¤å­�命令在 _4.3 版本_ 中被引入。" #. type: Title == #: ceccomp.adoc:344 #, no-wrap msgid "TEXT GRAMMAR REFERENCE" msgstr "TEXT 语法å�‚考" #. type: Plain text #: ceccomp.adoc:351 msgid "" "The grammar changed greatly since _version 4.0_ as we refactored lexer for " "better human readability. The wrapper now prefixed by `#` as it's a comment " "now. And _line_ is replaced by _label_, so now lexer depends on label " "declaration to decide where to jump, instead of lineno in _TEXT_ file." msgstr "" "_4.0 版本_ æ��高了è¯�法分æž�器代ç �çš„å�¯è¯»æ€§ï¼Œä¼´éš�ç�€å¤§å¹…修改的语法。å‰�缀为 `#` çš„" "行现在是注释了。å�Œæ—¶ _行å�·_ 被替æ�¢ä¸º _标签_,现在è¯�法分æž�器根æ�®æ ‡ç­¾å®šä¹‰æ�¥å†³å®š" "跳转到哪里,而ä¸�是根æ�® _TEXT_ 文件中的行å�·ã€‚" #. type: Plain text #: ceccomp.adoc:356 msgid "" "A valid _TEXT_ format is described in EBNF-like declaration here: https://" "github.com/ceccomp/ceccomp/issues/17#issuecomment-3610531705 . If you have " "no interest to know what EBNF is, please keep reading for examples." msgstr "" "这里有正确的 _TEXT_ æ ¼å¼�,以类 EBNF 语法æ��述:https://github.com/ceccomp/" "ceccomp/issues/17#issuecomment-3610531705 。\n" "没兴趣了解 EBNF?请继续阅读以下的例å­�。" #. type: Plain text #: ceccomp.adoc:358 msgid "BPF ops which are not described below are banned by kernel." msgstr "其余未æ��述到的BPFæ“�作都被内核ç¦�止了。" #. type: Title === #: ceccomp.adoc:359 #, no-wrap msgid "Comment and Label" msgstr "注释与标签" #. type: Plain text #: ceccomp.adoc:363 msgid "" "`ceccomp disasm` displays a lot of things, but some of them are optional for " "asm." msgstr "`ceccomp disasm` 展示了很多东西,但对于 asm æ�¥è¯´æœ‰äº›æ˜¯å�¯é€‰çš„。" #. type: Plain text #: ceccomp.adoc:368 #, no-wrap msgid "" " #Label CODE JT JF K\n" " #---------------------------------\n" " L0001: 0x06 0x00 0x00 0x7fff0000 return ALLOW\n" " #---------------------------------\n" msgstr "" " #Label CODE JT JF K\n" " #---------------------------------\n" " L0001: 0x06 0x00 0x00 0x7fff0000 return ALLOW\n" " #---------------------------------\n" "\n" #. type: Plain text #: ceccomp.adoc:370 msgid "Any text after `#` will be discarded by asm like some script languages." msgstr "任何在 `#` 之å�Žçš„æ–‡æœ¬å°†è¢« asm 丢弃,就åƒ�一些脚本语言一样。" #. type: Plain text #: ceccomp.adoc:372 msgid "Empty lines are accepted." msgstr "å…�许空行。" #. type: Plain text #: ceccomp.adoc:380 msgid "" "Label declaration is an identifier at the beginning of line and suffixed by " "`:` like `L0001`. An identifier is a string starts with alpha and contains " "with only alphanumeric characters and underscore `_`. Label is only " "necessary if it's the destination of `goto`, these redundant labels added by " "disasm are for readability. E.g. in `if ($A == 0) goto somewhere`, " "`somewhere` is a label and must be declared after the statement. Label " "declaration can take a line separately, or be put in front of statement." msgstr "" "标签声明是一个从行首开始并以 `:` 结尾的标识符,例如 `L0001`。标识符是一个以字" "æ¯�为首,中间å�ªåŒ…å�«å­—æ¯�ã€�数字和下划线 `_` 的字符串。标签å�ªåœ¨å®ƒæ˜¯ `goto` 的目标" "æ—¶æ‰�是必è¦�的,由 disasm 添加的多余的标签知识为了å�¯è¯»æ€§ã€‚例如在 `if ($A == 0) " "goto somewhere` 中,`somewhere` 是一个标签并且必须在这行伪代ç �å�Žå£°æ˜Žã€‚标签声" "明å�¯ä»¥å�•独å� æ�®ä¸€è¡Œï¼Œä¹Ÿå�¯ä»¥æ”¾ç½®åœ¨ä¼ªä»£ç �çš„å‰�é�¢ã€‚" #. type: Plain text #: ceccomp.adoc:383 msgid "" "The `CODE`, `JT`, `JF` and `K` value generated by disasm will be discarded " "by asm, asm only parse the effective statement after `K`." msgstr "" "ç”± disasm 生æˆ�çš„ `CODE`ã€�`JT`ã€�`JF` å’Œ `K` 值会被 asm 丢弃,asm 之解æž� `K` 之" "å�Žçš„æœ‰æ•ˆä¼ªä»£ç �。" #. type: Plain text #: ceccomp.adoc:388 msgid "" "There are some slight difference between `ceccomp disasm` and `seccomp-tools " "disasm`, down below is a general example. And some statements are different, " "so don't pipe seccomp-tools output to ceccomp blindly." msgstr "" "`ceccomp disasm` å’Œ `seccomp-tools disasm` 的输出之间有很多细微的差别,\n" "以下是一个典型的输出示例。å�Œæ—¶æœ‰äº›ä¼ªä»£ç �是ä¸�å�Œçš„,所以ä¸�è¦�盲目将 seccomp-" "tools\n" "的输出管é�“ç»™ ceccomp。" #. type: Plain text #: ceccomp.adoc:392 #, no-wrap msgid "" " line CODE JT JF K\n" " =================================\n" " 0000: 0x06 0x00 0x00 0x7fff0000 return ALLOW\n" msgstr "" " line CODE JT JF K\n" " =================================\n" " 0000: 0x06 0x00 0x00 0x7fff0000 return ALLOW\n" #. type: Title === #: ceccomp.adoc:393 #, no-wrap msgid "Assignment" msgstr "赋值" #. type: Plain text #: ceccomp.adoc:397 msgid "" "`A` can be set to seccomp attributes directly. But `X` can not be assigned " "with seccomp attributes directly due to kernel limit." msgstr "" "`A` å�¯ä»¥ç›´æŽ¥èµ‹å€¼ä¸º seccomp 属性。由于内核é™�制, `X` ä¸�能直接赋值为 seccomp 属" "性。" #. type: Plain text #: ceccomp.adoc:400 #, no-wrap msgid "" " $A = $arch\n" " $A = $syscall_nr\n" msgstr "" " $A = $arch\n" " $A = $syscall_nr\n" #. type: Plain text #: ceccomp.adoc:402 msgid "" "To assign `A` with those 64-bit long fields, `low_` or `high_` prefix is " "needed." msgstr "è¦�ç»™ `A` 赋值为这些64ä½�长的字段,必须使用 `low_` 或者 `high_` çš„å‰�缀。" #. type: Plain text #: ceccomp.adoc:410 #, no-wrap msgid "" " $A = $low_pc\n" " $A = $high_pc\n" " $A = $low_args[0]\n" " $A = $high_args[0]\n" " ...\n" " $A = $low_args[5]\n" " $A = $high_args[5]\n" msgstr "" " $A = $low_pc\n" " $A = $high_pc\n" " $A = $low_args[0]\n" " $A = $high_args[0]\n" " ...\n" " $A = $low_args[5]\n" " $A = $high_args[5]\n" #. type: Plain text #: ceccomp.adoc:413 msgid "" "A special attribute is `sizeof(struct seccomp_data)`, that can be assigned " "to `A` or `X` directly." msgstr "" "一个特殊的属性是 `sizeof(struct seccomp_data)` ,它å�¯ä»¥ç›´æŽ¥èµ‹å€¼ç»™ `A` 或 " "`X` 。" #. type: Plain text #: ceccomp.adoc:416 #, no-wrap msgid "" " $A = $scmp_data_len\n" " $X = $scmp_data_len\n" msgstr "" " $A = $scmp_data_len\n" " $X = $scmp_data_len\n" #. type: Plain text #: ceccomp.adoc:420 msgid "" "Temporary memory is 32-bit, to access them, you could use hex or dec as " "index. Both `A` and `X` is assignable. Assigning immediate values to `A` or " "`X` accepts any format of number if you imply the correct base by \"0x\" or " "\"0b\"." msgstr "" "临时内存是32ä½�的,è¦�想访问它们,你å�¯ä»¥ä½¿ç”¨å��六进制或者å��进制的索引。\n" "`A` å’Œ `X` 都是å�¯èµ‹å€¼çš„。给 `A` 或 `X` 赋值为立å�³æ•°æŽ¥å�—ä»»æ„�æ ¼å¼�的数字,å�ªè¦�ä½ " "使用 \"0x\" 或者 \"0b\" ç­‰å‰�缀正确表达数字是几进制的。" #. type: Plain text #: ceccomp.adoc:428 #, no-wrap msgid "" " $X = $mem[0]\n" " $A = $mem[0xf]\n" " $A = $mem[15] # both hex and dec index are OK\n" " $A = 0\n" " $X = 0x3b\n" " $A = 0b1111\n" " $A = 0333\n" msgstr "" " $X = $mem[0]\n" " $A = $mem[0xf]\n" " $A = $mem[15] # both hex and dec index are OK\n" " $A = 0\n" " $X = 0x3b\n" " $A = 0b1111\n" " $A = 0333\n" #. type: Plain text #: ceccomp.adoc:431 msgid "" "You could also assign `X` to `A` or in the reverse order. Assign `X` or `A` " "to temporary memory is definitely okay." msgstr "" "你还å�¯ä»¥å°† `X` 赋值给 `A` 或者å��过æ�¥ã€‚å°† `X` 或 `A` 赋值给临时内存当然å�¯ä»¥ã€‚" #. type: Plain text #: ceccomp.adoc:436 #, no-wrap msgid "" " $A = $X\n" " $X = $A\n" " $mem[3] = $X\n" " $mem[0x4] = $A\n" msgstr "" " $A = $X\n" " $X = $A\n" " $mem[3] = $X\n" " $mem[0x4] = $A\n" #. type: Title === #: ceccomp.adoc:437 #, no-wrap msgid "Arithmetic Operations" msgstr "æ•°å­¦è¿�ç®—" #. type: Plain text #: ceccomp.adoc:440 msgid "Various operations can be applied to `A`." msgstr "ä½ å�¯ä»¥ä»¥å¤šç§�æ–¹å¼�æ“�作 `A` 。" #. type: Plain text #: ceccomp.adoc:447 #, no-wrap msgid "" " $A += 30\n" " $A -= 4\n" " $A *= 9\n" " $A /= 1\n" " $A &= 7\n" " $A >>= 6\n" msgstr "" " $A += 30\n" " $A -= 4\n" " $A *= 9\n" " $A /= 1\n" " $A &= 7\n" " $A >>= 6\n" #. type: Plain text #: ceccomp.adoc:449 msgid "The right value can be `X`." msgstr "å�³å€¼ä¹Ÿå�¯ä»¥æ˜¯ `X` 。" #. type: Plain text #: ceccomp.adoc:454 #, no-wrap msgid "" " $A &= $X\n" " $A |= $X\n" " $A ^= $X\n" " $A <<= $X\n" msgstr "" " $A &= $X\n" " $A |= $X\n" " $A ^= $X\n" " $A <<= $X\n" #. type: Plain text #: ceccomp.adoc:456 msgid "And there is a way to negativate `A`." msgstr "想è¦�对 `A` å�–å��å�¯ä»¥è¿™ä¹ˆå�šã€‚" #. type: Plain text #: ceccomp.adoc:458 #, no-wrap msgid " $A = -$A\n" msgstr " $A = -$A\n" #. type: Title === #: ceccomp.adoc:459 #, no-wrap msgid "Jump Downwards If ..." msgstr "当...æ—¶å�‘下跳转" #. type: Plain text #: ceccomp.adoc:462 msgid "Unconditional jump:" msgstr "æ— æ�¡ä»¶è·³è½¬ï¼š" #. type: Plain text #: ceccomp.adoc:464 #, no-wrap msgid " goto L3\n" msgstr " goto L3\n" #. type: Plain text #: ceccomp.adoc:466 msgid "Jump if:" msgstr "当...跳转:" #. type: Plain text #: ceccomp.adoc:472 #, no-wrap msgid "" " if ($A == execve) goto L3\n" " if ($A != 1234) goto L4\n" " if ($A & $X) goto L5\n" " if !($A & 7) goto L6\n" " if ($A <= $X) goto L7\n" msgstr "" " if ($A == execve) goto L3\n" " if ($A != 1234) goto L4\n" " if ($A & $X) goto L5\n" " if !($A & 7) goto L6\n" " if ($A <= $X) goto L7\n" #. type: Plain text #: ceccomp.adoc:474 msgid "If true jump to ... if false jump to...:" msgstr "当æ�¡ä»¶ä¸ºçœŸæ—¶è·³è½¬åˆ°...,æ�¡ä»¶ä¸ºå�‡æ—¶è·³è½¬åˆ°...:" #. type: Plain text #: ceccomp.adoc:477 #, no-wrap msgid "" " if ($A > $X) goto L3, else goto L4\n" " if ($A >= 4567) goto L5, else goto L6\n" msgstr "" " if ($A > $X) goto L3, else goto L4\n" " if ($A >= 4567) goto L5, else goto L6\n" #. type: Plain text #: ceccomp.adoc:484 msgid "" "ONLY in conditions, you CAN replace number with syscall name or arch name. " "In example above, `0x3b` is replaced by `execve`. All the syscall name will " "be resolved to syscall number under your selected arch. If you want to " "resolve a syscall name in foreign arch (not equal to your selected arch), " "please prepend a arch and dot. For example, your arch is x86_64, and you are " "writing _aarch64_ rules, then please write like:" msgstr "" "*å�ªæœ‰* 在å�šæ�¡ä»¶åˆ¤æ–­æ—¶ï¼Œä½ æ‰�能将数字替æ�¢ä¸ºç³»ç»Ÿè°ƒç”¨å�·æˆ–æž¶æž„å��。在以上的例å­�" "中, `0x3b`\n" "被 `execve` 替æ�¢ã€‚所有系统调用å��将会以你设置的架构解æž�为系统调用å�·ã€‚\n" "如果你希望解æž�外部架构(ä¸�等于你设置的架构)的系统调用å��,\n" "请在å‰�é�¢é™„加架构å��和一个点。例如,你设置的架构是 x86_64,并且你正在写\n" "_aarch64_ 架构的规则,请这样写:" #. type: Plain text #: ceccomp.adoc:486 #, no-wrap msgid " if ($A == aarch64.read) goto 5\n" msgstr " if ($A == aarch64.read) goto 5\n" #. type: Plain text #: ceccomp.adoc:489 msgid "" "Note that if you manually set arch to _aarch64_ with `-a aarch64`, you can " "omit `aarch64.` in statement." msgstr "" "注æ„�当你手动使用 `-a aarch64` 将架构设置为 _aarch64_ 时,\n" "ä½ å�¯ä»¥åœ¨ä¼ªä»£ç �中忽略 `aarch64.` 。" #. type: Title === #: ceccomp.adoc:490 #, no-wrap msgid "Return Code" msgstr "返回ç �" #. type: Plain text #: ceccomp.adoc:493 msgid "Return value of register `A`:" msgstr "返回寄存器 `A` 的值:" #. type: Plain text #: ceccomp.adoc:495 #, no-wrap msgid " return $A\n" msgstr " return $A\n" #. type: Plain text #: ceccomp.adoc:499 msgid "" "Or return a immediate value, with extra field in `()`. Actions including " "`TRACE`, `TRAP` and `ERRNO` accept an extra field, without `()`, they are " "treated as `action(0)`." msgstr "" "或者返回一个立å�³æ•°ï¼Œå¤šä½™çš„字段放在 `()` 里。 `TRACE` ã€� `TRAP` å’Œ `ERRNO`\n" "接å�—一个é¢�外的字段,如果没有 `()` ,它们将被视为 `行为(0)` 。" #. type: Plain text #: ceccomp.adoc:509 #, no-wrap msgid "" " return 0x13371337\n" " return KILL\n" " return KILL_PROCESS\n" " return TRAP(123)\n" " return ERRNO(0)\n" " return TRACE\n" " return TRACE(3)\n" " return LOG\n" " return NOTIFY\n" msgstr "" " return 0x13371337\n" " return KILL\n" " return KILL_PROCESS\n" " return TRAP(123)\n" " return ERRNO(0)\n" " return TRACE\n" " return TRACE(3)\n" " return LOG\n" " return NOTIFY\n" #. type: Title === #: ceccomp.adoc:510 #, no-wrap msgid "Short Example" msgstr "简短的例å­�" #. type: Plain text #: ceccomp.adoc:514 msgid "" "The following _TEXT_ is valid for asm, which blocks `execve` and `execveat` " "for amd64 syscalls:" msgstr "" "下é�¢çš„ _TEXT_ 对与 asm æ�¥è¯´æ˜¯æ­£ç¡®çš„,这段 _TEXT_ 阻止了 amd64 çš„ `execve` å’Œ " "`execveat` 系统调用:" #. type: Plain text #: ceccomp.adoc:520 #, no-wrap msgid "" " $A = $syscall_nr\n" " if ($A == execve) goto forbid\n" " if ($A == execveat) goto forbid\n" " return ALLOW\n" " forbid: return KILL\n" msgstr "" " $A = $syscall_nr\n" " if ($A == execve) goto forbid\n" " if ($A == execveat) goto forbid\n" " return ALLOW\n" " forbid: return KILL\n" #. type: Title == #: ceccomp.adoc:521 #, no-wrap msgid "RESTRICTIONS" msgstr "é™�制" #. type: Plain text #: ceccomp.adoc:524 msgid "Ceccomp asm put some restrictions on _TEXT_ for better performance." msgstr "为了更好的性能,Ceccomp asm 对 _TEXT_ 有一些é™�制。" #. type: Plain text #: ceccomp.adoc:526 msgid "`'\\0'` must not be found in _TEXT_ since it's a text file." msgstr "由于 _TEXT_ 是个文本文件,`'\\0'` ä¸�能出现在 _TEXT_ 中。" #. type: Plain text #: ceccomp.adoc:527 msgid "A line must be shorter than 384 *bytes*." msgstr "一行必须短于 384 *字节*。" #. type: Plain text #: ceccomp.adoc:528 msgid "A _TEXT_ file must have less than 16384 lines." msgstr "一个 _TEXT_ 文件必须短于 16384 行。" #. type: Plain text #: ceccomp.adoc:529 msgid "A _TEXT_ file must be smaller than 4 MiB." msgstr "一个 _TEXT_ 文件必须å°�于 4 MiB。" #. type: Plain text #: ceccomp.adoc:532 msgid "" "And for both asm and disasm, effective statements (that can be encoded or " "decoded into BPF) must be less or equal than 4096, this is enforced by " "kernel." msgstr "" "并且对于 asm å’Œ disasm æ�¥è¯´ï¼Œæœ‰æ•ˆçš„伪代ç �(能被编ç �或解ç �为 BPF 的)必须少于" "等于 4096 æ�¡ï¼Œè¿™æ˜¯å†…核规定的。" #. type: Plain text #: ceccomp.adoc:535 msgid "" "A fun fact about ceccomp asm: any basic ANSI color in _TEXT_ file, e.g., " "`\\x1b[31m`, will be discarded when processing." msgstr "" "一个关于 ceccomp asm 有趣的知识:任何在 _TEXT_ 文件中基本的 ANSI 颜色,例如 " "`\\x1b[31m`,会在处ç�†æ—¶è¢«ä¸¢å¼ƒã€‚" #. type: Title == #: ceccomp.adoc:536 #, no-wrap msgid "EXAMPLES" msgstr "ceccomp 示例" #. type: Plain text #: ceccomp.adoc:541 msgid "" "Manpage can not display images, so please check out html version of this " "page to see examples." msgstr "手册ä¸�能显示图片,因此如果想看示例请å�‚阅html版本。" #. type: Title === #: ceccomp.adoc:544 #, no-wrap msgid "asm example" msgstr "asm 示例" #. type: Target for macro image #: ceccomp.adoc:545 #, no-wrap msgid "asm.webp" msgstr "asm.webp" #. type: Title === #: ceccomp.adoc:546 #, no-wrap msgid "disasm example" msgstr "disasm 示例" #. type: Target for macro image #: ceccomp.adoc:547 #, no-wrap msgid "disasm.webp" msgstr "disasm.webp" #. type: Title === #: ceccomp.adoc:548 #, no-wrap msgid "emu example" msgstr "emu 示例" #. type: Target for macro image #: ceccomp.adoc:549 #, no-wrap msgid "emu.webp" msgstr "emu.webp" #. type: Title === #: ceccomp.adoc:550 #, no-wrap msgid "trace example" msgstr "trace 示例" #. type: Plain text #: ceccomp.adoc:552 msgid "Running program:" msgstr "è¿�行程åº�:" #. type: Target for macro image #: ceccomp.adoc:553 #, no-wrap msgid "trace.webp" msgstr "trace.webp" #. type: Plain text #: ceccomp.adoc:556 msgid "If set `-o FILE`:" msgstr "如果设置了 `-o FILE` :" #. type: Target for macro image #: ceccomp.adoc:557 #, no-wrap msgid "output_trick.webp" msgstr "output_trick.webp" #. type: Plain text #: ceccomp.adoc:560 msgid "Trace pid mode:" msgstr "PID 模å¼�:" #. type: Target for macro image #: ceccomp.adoc:561 #, no-wrap msgid "trace_pid.webp" msgstr "trace_pid.webp" #. type: Plain text #: ceccomp.adoc:564 msgid "Seize pid mode:" msgstr "跟踪 PID 模å¼�:" #. type: Target for macro image #: ceccomp.adoc:565 #, no-wrap msgid "trace_seize.webp" msgstr "trace_seize.webp" #. type: Plain text #: ceccomp.adoc:568 msgid "Completion for pid mode is available under zsh:" msgstr "zsh下PID模å¼�å�¯ä»¥ä½¿ç”¨è¡¥å…¨ï¼š" #. type: Target for macro image #: ceccomp.adoc:569 #, no-wrap msgid "trace_completion.webp" msgstr "trace_completion.webp" #. type: Title === #: ceccomp.adoc:571 #, no-wrap msgid "probe example" msgstr "probe 示例" #. type: Target for macro image #: ceccomp.adoc:572 #, no-wrap msgid "probe.webp" msgstr "probe.webp" #. type: Title === #: ceccomp.adoc:574 #, no-wrap msgid "capture example" msgstr "capture 示例" #. type: Plain text #: ceccomp.adoc:576 msgid "Globally capture:" msgstr "全局æ�•获:" #. type: Target for macro image #: ceccomp.adoc:577 #, no-wrap msgid "capture.webp" msgstr "capture.webp" #. type: Plain text #: ceccomp.adoc:580 msgid "Capture filters in a process:" msgstr "æ�•获进程中的过滤器:" #. type: Target for macro image #: ceccomp.adoc:581 #, no-wrap msgid "capture_pid.webp" msgstr "capture_pid.webp" #. type: Title == #: ceccomp.adoc:584 #, no-wrap msgid "REPO" msgstr "仓库" #. type: Plain text #: ceccomp.adoc:588 msgid "" "Visit https://github.com/ceccomp/ceccomp to find the code. Pull Requests " "and Issues are welcome!" msgstr "" "在 https://github.com/ceccomp/ceccomp å�¯ä»¥æ‰¾åˆ°æº�代ç �。\n" "欢迎æ��交 Pull Requests å’Œ Issues ï¼�" #. type: Plain text #: ceccomp.adoc:589 msgid "Copyright (C) 2025-present, distributed under GPLv3 or later." msgstr "Copyright (C) 2025-现在,基于 GPLv3 或更新版本分å�‘。" #, no-wrap #~ msgid "RAW" #~ msgstr "RAW" #, no-wrap #~ msgid "WHEN" #~ msgstr "WHEN" #, no-wrap #~ msgid "ARCH" #~ msgstr "ARCH" #, no-wrap #~ msgid "FMT" #~ msgstr "FMT" #, no-wrap #~ msgid "FILE" #~ msgstr "FILE" #, no-wrap #~ msgid "PID" #~ msgstr "PID" ceccomp-4.3.1/docs/po4a.cfg000066400000000000000000000001121526046660400154070ustar00rootroot00000000000000[po_directory] po/ [type: asciidoc] ceccomp.adoc $lang:ceccomp.$lang.adoc ceccomp-4.3.1/docs/readme-po/000077500000000000000000000000001526046660400157425ustar00rootroot00000000000000ceccomp-4.3.1/docs/readme-po/readme.pot000066400000000000000000000240211526046660400177220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE # Copyright (C) YEAR Free Software Foundation, Inc. # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2026-08-22 02:34+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. type: Title # #: ../README.md:1 #, markdown-text, no-wrap msgid "" "Ceccomp " msgstr "" #. type: Plain text #: ../README.md:4 #, markdown-text msgid "→ Read this in [简体中文](README.zh_CN.md) â†�" msgstr "" #. type: Plain text #: ../README.md:7 #, markdown-text msgid "" "C reimplementation of `seccomp-tools` with advanced features. We basically " "pronounce ceccomp in \"C-comp\" (/siË�ˈkÉ’mp/) or \"seccomp\" (/ˈsÉ›k.kÉ’mp/)." msgstr "" #. type: Title ## #: ../README.md:8 #, markdown-text, no-wrap msgid "Features" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":gear: Robust assembler and disassembler" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":blue_book: Complete documentation" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":1234: Various architecture support powered by libseccomp" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":globe_with_meridians: Multi-language support" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":feather: Minimum build dependencies for core binary" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":paintbrush: Enhanced syntax highlighting" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":100: Informational error messages" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":shell: Powerful Zshell completion" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":no_entry_sign: Pure C without LLM-generated garbage" msgstr "" #. type: Bullet: '- ' #: ../README.md:20 #, markdown-text msgid ":bee: Advanced function powered by eBPF" msgstr "" #. type: Title ## #: ../README.md:21 #, markdown-text, no-wrap msgid "Doc & Screenshots" msgstr "" #. type: Plain text #: ../README.md:24 #, markdown-text msgid "[English Version](docs/ceccomp.adoc) | [中文文档](docs/ceccomp.zh_CN.adoc)" msgstr "" #. type: Title ## #: ../README.md:25 #, markdown-text, no-wrap msgid "Install" msgstr "" #. type: Plain text #: ../README.md:29 #, markdown-text, no-wrap msgid "" "> [!IMPORTANT]\n" "> This software requires features from Linux, so kernels other than Linux " "are not supported.\n" msgstr "" #. type: Bullet: '- ' #: ../README.md:31 #, markdown-text msgid "Arch Linux users:" msgstr "" #. type: Plain text #: ../README.md:35 #, markdown-text, no-wrap msgid "" " ceccomp is available in official extra repo now:\n" " " "[![Arch](https://repology.org/badge/version-for-repo/arch/ceccomp.svg?header=Arch%20Linux%20extra)](https://repology.org/project/ceccomp/versions)\n" " [![Manjaro " "Stable](https://repology.org/badge/version-for-repo/manjaro_stable/ceccomp.svg?header=Manjaro%20Stable)](https://repology.org/project/ceccomp/versions)\n" msgstr "" #. type: Bullet: '- ' #: ../README.md:37 #, markdown-text msgid "Debian, Ubuntu or Kali users:" msgstr "" #. type: Plain text #: ../README.md:39 #, markdown-text, no-wrap msgid " ceccomp is available with `apt` now if you are using distros below:\n" msgstr "" #. type: Plain text #: ../README.md:45 #, markdown-text, no-wrap msgid "" " [![Debian " "testing](https://repology.org/badge/version-for-repo/debian_14/ceccomp.svg?header=Debian%20testing)](https://repology.org/project/ceccomp/versions)\n" " [![Debian " "unstable](https://repology.org/badge/version-for-repo/debian_unstable/ceccomp.svg?header=Debian%20unstable)](https://repology.org/project/ceccomp/versions)\n" " [![Ubuntu " "26.04](https://repology.org/badge/version-for-repo/ubuntu_26_04/ceccomp.svg?header=Ubuntu%2026.04)](https://repology.org/project/ceccomp/versions)\n" " [![Ubuntu " "26.10](https://repology.org/badge/version-for-repo/ubuntu_26_10/ceccomp.svg?header=Ubuntu%2026.10)](https://repology.org/project/ceccomp/versions)\n" " [![Kali " "Linux](https://repology.org/badge/version-for-repo/kali_rolling/ceccomp.svg?header=Kali%20Linux)](https://repology.org/project/ceccomp/versions)\n" msgstr "" #. type: Bullet: '- ' #: ../README.md:47 #, markdown-text msgid "NixOS users:" msgstr "" #. type: Plain text #: ../README.md:50 #, markdown-text, no-wrap msgid "" " @tesuji helps us submit a PR at NixOS, but it's blocked as " "currently... If you\n" " like our software, please :+1: in NixOS/nixpkgs#462592 to help ceccomp " "into nixpkgs!\n" msgstr "" #. type: Bullet: '- ' #: ../README.md:52 #, markdown-text msgid "Other Linux distros:" msgstr "" #. type: Plain text #: ../README.md:54 #, markdown-text, no-wrap msgid "" " Sorry, you may need to install ceccomp manually. Please follow " "instructions below.\n" msgstr "" #. type: Title # #: ../README.md:55 #, markdown-text, no-wrap msgid "Build" msgstr "" #. type: Bullet: '- ' #: ../README.md:58 #, markdown-text msgid "Stable installation:" msgstr "" #. type: Plain text #: ../README.md:66 #, markdown-text, no-wrap msgid "" " Clone the whole repo, then run `./configure`. Dependencies will be " "detected automatically,\n" " please keep an eye on the output since components are automatically " "disabled if not available.\n" " For documentation generation, you need `asciidoctor`. For multi-language " "support, you need\n" " `gettext` package. For eBPF support, you need `libbpf`, `bpftool` and a " "bpf C compiler,\n" " `clang` with `llvm` package or `gcc-bpf>=15`. You could use " "`--without-doc`, `--without-i18n`\n" " and `--without-ebpf` to disable them explicitly.\n" " Please run `./configure --help` for more details.\n" msgstr "" #. type: Plain text #: ../README.md:75 #, markdown-text, no-wrap msgid "" " ```sh\n" " git clone https://github.com/ceccomp/ceccomp.git\n" " cd Ceccomp\n" " ./configure\n" " ./configure # run this again if Makefile is not generated\n" " make\n" " make install # install at /usr/local/bin\n" " ```\n" msgstr "" #. type: Bullet: '- ' #: ../README.md:77 #, markdown-text msgid "Testing installation:" msgstr "" #. type: Plain text #: ../README.md:79 #, markdown-text, no-wrap msgid " Clone the whole repo, and then run `./configure --devmode`.\n" msgstr "" #. type: Plain text #: ../README.md:86 #, markdown-text, no-wrap msgid "" " ```sh\n" " git clone https://github.com/ceccomp/ceccomp.git\n" " cd Ceccomp\n" " ./configure --devmode\n" " make\n" " ```\n" msgstr "" #. type: Plain text #: ../README.md:93 #, markdown-text, no-wrap msgid "" "> [!NOTE]\n" "> To build this project or enable some features, the lowest denpendency " "version\n" "> baselines are:\n" "> * Linux >= 5.3, libseccomp >= 2.5.0 (functions excluding capture)\n" "> * Linux >= 5.11, libbpf >= 0.6.0 (global capture, only x86_64 " "guaranteed)\n" "> * Linux >= 6.2, libbpf >= 0.6.0 (capture pid)\n" msgstr "" #. type: Title ## #: ../README.md:94 #, markdown-text, no-wrap msgid "Run Test" msgstr "" #. type: Plain text #: ../README.md:98 #, markdown-text msgid "" "Run configure and make, then invoke `pytest test` from repo root. Trace pid " "case will be skipped if no CAP_SYS_ADMIN. If you find some checks failed, " "please submit an issue to report your case." msgstr "" #. type: Plain text #: ../README.md:101 #, markdown-text msgid "" "To run the test, you need 2 extra packages: `pkgconf` (required by " "`pkg-config`) and `python-pytest` (required by `pytest`)." msgstr "" #. type: Title ## #: ../README.md:102 #, markdown-text, no-wrap msgid "CheatSheet" msgstr "" #. type: Plain text #: ../README.md:105 #, markdown-text, no-wrap msgid "" "\"image\"\n" msgstr "" #. type: Title ## #: ../README.md:106 #, markdown-text, no-wrap msgid "Credits" msgstr "" #. type: Bullet: '- ' #: ../README.md:115 #, markdown-text msgid "" "[libseccomp](https://github.com/seccomp/libseccomp): The library to support " "syscall lookups" msgstr "" #. type: Bullet: '- ' #: ../README.md:115 #, markdown-text msgid "" "[libbpf](https://docs.kernel.org/bpf/libbpf/libbpf_overview.html): The " "library to support eBPF functions" msgstr "" #. type: Bullet: '- ' #: ../README.md:115 #, markdown-text msgid "" "[seccomp-tools](https://github.com/david942j/seccomp-tools): The tool in " "Ruby inspires us to write ceccomp" msgstr "" #. type: Bullet: '- ' #: ../README.md:115 #, markdown-text msgid "" "[Bootswatch](https://bootswatch.com/slate/): Provides awesome css for html " "doc under MIT" msgstr "" #. type: Bullet: '- ' #: ../README.md:115 #, markdown-text msgid "[Linux kernel](https://github.com/torvalds/linux): Port some bpf checks" msgstr "" #. type: Bullet: '- ' #: ../README.md:115 #, markdown-text msgid "" "[Verstable](https://github.com/JacksonAllan/Verstable): High-performance " "hash table implementation in C" msgstr "" #. type: Bullet: '- ' #: ../README.md:115 #, markdown-text msgid "" "[a5hash](https://github.com/avaneev/a5hash): High-performance hash " "implementation for short strings in C" msgstr "" #. type: Plain text #: ../README.md:117 #, markdown-text msgid "" "Any Issue or PR are welcome! :heart: Please read " "[CONTRIBUTING.md](CONTRIBUTING.md) for details." msgstr "" #. type: Title ## #: ../README.md:118 #, markdown-text, no-wrap msgid "License" msgstr "" #. type: Plain text #: ../README.md:120 #, markdown-text msgid "" "Copyright (C) 2025-present, ceccomp contributors, distributed under GNU " "General Public License v3.0 or Later" msgstr "" ceccomp-4.3.1/docs/readme-po/zh_CN.po000066400000000000000000000355041526046660400173120ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: \n" "POT-Creation-Date: 2026-08-22 02:34+0800\n" "PO-Revision-Date: \n" "Last-Translator: Rocket Ma \n" "Language-Team: \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.9\n" #. type: Title # #: ../README.md:1 #, no-wrap msgid "Ceccomp \"ceccomp" msgstr "Ceccomp \"ceccomp" #. type: Plain text #: ../README.md:4 msgid "→ Read this in [简体中文](README.zh_CN.md) â†�" msgstr "→ 用 [English](README.md) 阅读文档 â†�" #. type: Plain text #: ../README.md:7 msgid "C reimplementation of `seccomp-tools` with advanced features. We basically pronounce ceccomp in \"C-comp\" (/siË�ˈkÉ’mp/) or \"seccomp\" (/ˈsÉ›k.kÉ’mp/)." msgstr "具有高级功能的对于 `seccomp-tools` çš„ C 语言é‡�新实现。我们基本上把 ceccomp 读作 “C-compâ€� (/siË�ˈkÉ’mp/) 或者 “seccompâ€� (/ˈsÉ›k.kÉ’mp/)。" #. type: Title ## #: ../README.md:8 #, no-wrap msgid "Features" msgstr "功能" #. type: Bullet: '- ' #: ../README.md:20 msgid ":gear: Robust assembler and disassembler" msgstr ":gear: å�¥å£®çš„æ±‡ç¼–器和å��汇编器" #. type: Bullet: '- ' #: ../README.md:20 msgid ":blue_book: Complete documentation" msgstr ":blue_book: 完善的文档" #. type: Bullet: '- ' #: ../README.md:20 msgid ":1234: Various architecture support powered by libseccomp" msgstr ":1234: ç”± libseccomp 驱动的多架构支æŒ�" #. type: Bullet: '- ' #: ../README.md:20 msgid ":globe_with_meridians: Multi-language support" msgstr ":globe_with_meridians: 多语言支æŒ�" #. type: Bullet: '- ' #: ../README.md:20 msgid ":feather: Minimum build dependencies for core binary" msgstr ":feather: 构建核心二进制的ä¾�赖很少" #. type: Bullet: '- ' #: ../README.md:20 msgid ":paintbrush: Enhanced syntax highlighting" msgstr ":paintbrush: 更好的语法高亮" #. type: Bullet: '- ' #: ../README.md:20 msgid ":100: Informational error messages" msgstr ":100: 详实的错误信æ�¯" #. type: Bullet: '- ' #: ../README.md:20 msgid ":shell: Powerful Zshell completion" msgstr ":shell: 强大的 Zshell 补全脚本" #. type: Bullet: '- ' #: ../README.md:20 msgid ":no_entry_sign: Pure C without LLM-generated garbage" msgstr ":no_entry_sign: 纯 C 编写,没有 LLM 垃圾" #. type: Bullet: '- ' #: ../README.md:20 msgid ":bee: Advanced function powered by eBPF" msgstr ":bee: ç”± eBPF 驱动的高级功能" #. type: Title ## #: ../README.md:21 #, no-wrap msgid "Doc & Screenshots" msgstr "文档 & 截图" #. type: Plain text #: ../README.md:24 msgid "[English Version](docs/ceccomp.adoc) | [中文文档](docs/ceccomp.zh_CN.adoc)" msgstr "[English Version](docs/ceccomp.adoc) | [中文文档](docs/ceccomp.zh_CN.adoc)" #. type: Title ## #: ../README.md:25 #, no-wrap msgid "Install" msgstr "安装" #. type: Plain text #: ../README.md:29 #, no-wrap msgid "" "> [!IMPORTANT]\n" "> This software requires features from Linux, so kernels other than Linux are not supported.\n" msgstr "" "> [!IMPORTANT]\n" "> 本软件è¦�求一些 Linux 的特性,因此é�ž Linux 的内核ä¸�å�—支æŒ�。\n" #. type: Bullet: '- ' #: ../README.md:31 msgid "Arch Linux users:" msgstr "Arch Linux 用户:" #. type: Plain text #: ../README.md:35 #, no-wrap msgid "" " ceccomp is available in official extra repo now:\n" " [![Arch](https://repology.org/badge/version-for-repo/arch/ceccomp.svg?header=Arch%20Linux%20extra)](https://repology.org/project/ceccomp/versions)\n" " [![Manjaro Stable](https://repology.org/badge/version-for-repo/manjaro_stable/ceccomp.svg?header=Manjaro%20Stable)](https://repology.org/project/ceccomp/versions)\n" msgstr "" " ceccomp 已在官方 extra 仓库å�¯ç”¨ï¼š\n" " [![Arch](https://repology.org/badge/version-for-repo/arch/ceccomp.svg?header=Arch%20Linux%20extra)](https://repology.org/project/ceccomp/versions)\n" " [![Manjaro Stable](https://repology.org/badge/version-for-repo/manjaro_stable/ceccomp.svg?header=Manjaro%20Stable)](https://repology.org/project/ceccomp/versions)\n" #. type: Bullet: '- ' #: ../README.md:37 msgid "Debian, Ubuntu or Kali users:" msgstr "Debian, Ubuntu 或 Kali 用户:" #. type: Plain text #: ../README.md:39 #, no-wrap msgid " ceccomp is available with `apt` now if you are using distros below:\n" msgstr " 如果您在使用如下å�‘行版,那么 ceccomp å�¯ä»¥ä½¿ç”¨ `apt` 获å�–:\n" #. type: Plain text #: ../README.md:45 #, no-wrap msgid "" " [![Debian testing](https://repology.org/badge/version-for-repo/debian_14/ceccomp.svg?header=Debian%20testing)](https://repology.org/project/ceccomp/versions)\n" " [![Debian unstable](https://repology.org/badge/version-for-repo/debian_unstable/ceccomp.svg?header=Debian%20unstable)](https://repology.org/project/ceccomp/versions)\n" " [![Ubuntu 26.04](https://repology.org/badge/version-for-repo/ubuntu_26_04/ceccomp.svg?header=Ubuntu%2026.04)](https://repology.org/project/ceccomp/versions)\n" " [![Ubuntu 26.10](https://repology.org/badge/version-for-repo/ubuntu_26_10/ceccomp.svg?header=Ubuntu%2026.10)](https://repology.org/project/ceccomp/versions)\n" " [![Kali Linux](https://repology.org/badge/version-for-repo/kali_rolling/ceccomp.svg?header=Kali%20Linux)](https://repology.org/project/ceccomp/versions)\n" msgstr "" " [![Debian testing](https://repology.org/badge/version-for-repo/debian_14/ceccomp.svg?header=Debian%20testing)](https://repology.org/project/ceccomp/versions)\n" " [![Debian unstable](https://repology.org/badge/version-for-repo/debian_unstable/ceccomp.svg?header=Debian%20unstable)](https://repology.org/project/ceccomp/versions)\n" " [![Ubuntu 26.04](https://repology.org/badge/version-for-repo/ubuntu_26_04/ceccomp.svg?header=Ubuntu%2026.04)](https://repology.org/project/ceccomp/versions)\n" " [![Ubuntu 26.10](https://repology.org/badge/version-for-repo/ubuntu_26_10/ceccomp.svg?header=Ubuntu%2026.10)](https://repology.org/project/ceccomp/versions)\n" " [![Kali Linux](https://repology.org/badge/version-for-repo/kali_rolling/ceccomp.svg?header=Kali%20Linux)](https://repology.org/project/ceccomp/versions)\n" #. type: Bullet: '- ' #: ../README.md:47 msgid "NixOS users:" msgstr "NixOS 用户:" #. type: Plain text #: ../README.md:50 #, no-wrap msgid "" " @tesuji helps us submit a PR at NixOS, but it's blocked as currently... If you\n" " like our software, please :+1: in NixOS/nixpkgs#462592 to help ceccomp into nixpkgs!\n" msgstr "" " @tesuji 帮我们在 NixOS æ��交了一个 PR,但是目å‰�进度å�œæ»žä¸�å‰�...\n" " 如果您喜欢我们的软件,请在 NixOS/nixpkgs#462592 :+1: æ�¥å¸®åŠ© ceccomp 进入 nixpkgsï¼�\n" #. type: Bullet: '- ' #: ../README.md:52 msgid "Other Linux distros:" msgstr "å…¶ä»– Linux å�‘行版:" #. type: Plain text #: ../README.md:54 #, no-wrap msgid " Sorry, you may need to install ceccomp manually. Please follow instructions below.\n" msgstr " 抱歉,您需è¦�手动安装 ceccomp。请按照以下说明æ“�作。\n" #. type: Title # #: ../README.md:55 #, no-wrap msgid "Build" msgstr "构建" #. type: Bullet: '- ' #: ../README.md:58 msgid "Stable installation:" msgstr "稳定版安装:" #. type: Plain text #: ../README.md:66 #, no-wrap msgid "" " Clone the whole repo, then run `./configure`. Dependencies will be detected automatically,\n" " please keep an eye on the output since components are automatically disabled if not available.\n" " For documentation generation, you need `asciidoctor`. For multi-language support, you need\n" " `gettext` package. For eBPF support, you need `libbpf`, `bpftool` and a bpf C compiler,\n" " `clang` with `llvm` package or `gcc-bpf>=15`. You could use `--without-doc`, `--without-i18n`\n" " and `--without-ebpf` to disable them explicitly.\n" " Please run `./configure --help` for more details.\n" msgstr "" " 克隆整个仓库,然å�Žè¿�行 `./configure`。ä¾�赖会被自动检测,请å°�心输出结果,\n" " 因为组件ä¸�å�¯ç”¨æ—¶ä¼šè¢«è‡ªåЍç¦�用。è¦�生æˆ�文档,您需è¦� `asciidoctor`,è¦�å�¯ç”¨å¤šè¯­è¨€æ”¯æŒ�,\n" " 您需è¦� `gettext` 软件包。è¦�å�¯ç”¨ eBPF 支æŒ�,您需è¦� `libbpf`, `bpftool` 以å�Šä¸€ä¸ª BPF C 编译器,\n" " 如 `clang` 加上 `llvm` 软件包或 `gcc-bpf>=15`。您å�¯ä»¥ä½¿ç”¨\n" " `--without-doc`, `--without-i18n` å’Œ `--without-ebpf` 标志æ�¥æ˜¾å¼�ç¦�用它们。\n" " 请è¿�行 `./configure --help` 查看详情。\n" #. type: Plain text #: ../README.md:75 #, no-wrap msgid "" " ```sh\n" " git clone https://github.com/ceccomp/ceccomp.git\n" " cd Ceccomp\n" " ./configure\n" " ./configure # run this again if Makefile is not generated\n" " make\n" " make install # install at /usr/local/bin\n" " ```\n" msgstr "" " ```sh\n" " git clone https://github.com/ceccomp/ceccomp.git\n" " cd Ceccomp\n" " ./configure\n" " ./configure # 如果 Makefile 没有生æˆ�å°±å†�è¿�行一次\n" " make\n" " make install # 安装在 /usr/local/bin\n" " ```\n" #. type: Bullet: '- ' #: ../README.md:77 msgid "Testing installation:" msgstr "测试版安装:" #. type: Plain text #: ../README.md:79 #, no-wrap msgid " Clone the whole repo, and then run `./configure --devmode`.\n" msgstr " 克隆完整仓库,然å�Žè¿�行 `./configure --devmode`。\n" #. type: Plain text #: ../README.md:86 #, no-wrap msgid "" " ```sh\n" " git clone https://github.com/ceccomp/ceccomp.git\n" " cd Ceccomp\n" " ./configure --devmode\n" " make\n" " ```\n" msgstr "" " ```sh\n" " git clone https://github.com/ceccomp/ceccomp.git\n" " cd Ceccomp\n" " ./configure --devmode\n" " make\n" " ```\n" #. type: Plain text #: ../README.md:93 #, no-wrap msgid "" "> [!NOTE]\n" "> To build this project or enable some features, the lowest denpendency version\n" "> baselines are:\n" "> * Linux >= 5.3, libseccomp >= 2.5.0 (functions excluding capture)\n" "> * Linux >= 5.11, libbpf >= 0.6.0 (global capture, only x86_64 guaranteed)\n" "> * Linux >= 6.2, libbpf >= 0.6.0 (capture pid)\n" msgstr "" "> [!NOTE]\n" "> è¦�想构建这个项目或å�¯ç”¨æŸ�些特性,最低的ä¾�赖版本基线是:\n" "> * Linux >= 5.3, libseccomp >= 2.5.0 (除了 capture 以外的功能)\n" "> * Linux >= 5.11, libbpf >= 0.6.0 (全局æ�•获,å�ªä¿�è¯� x86_64)\n" "> * Linux >= 6.2, libbpf >= 0.6.0 (æ�•获 PID)\n" #. type: Title ## #: ../README.md:94 #, no-wrap msgid "Run Test" msgstr "è¿�行测试" #. type: Plain text #: ../README.md:98 msgid "" "Run configure and make, then invoke `pytest test` from repo root. Trace pid case will be skipped if no CAP_SYS_ADMIN. If you find some checks failed, please submit an " "issue to report your case." msgstr "" "è¿�行 configure å�Ž make,然å�Žå†�项目根目录下è¿�行 `pytest test`。如果没有 CAP_SYS_ADMIN,追踪 pid 的测试案例会被跳过。如果您å�‘现一些测试失败了,请开一个 issue 并上报您的案" "例。" #. type: Plain text #: ../README.md:101 msgid "To run the test, you need 2 extra packages: `pkgconf` (required by `pkg-config`) and `python-pytest` (required by `pytest`)." msgstr "è¦�想è¿�行测试,您需è¦� 2 个é¢�外的软件包: `pkgconf` (被 `pkg-config` 需è¦�) å’Œ `python-pytest` (被 `pytest` 需è¦�)。" #. type: Title ## #: ../README.md:102 #, no-wrap msgid "CheatSheet" msgstr "速览表" #. type: Plain text #: ../README.md:105 #, no-wrap msgid "\"image\"\n" msgstr "\"image\"\n" #. type: Title ## #: ../README.md:106 #, no-wrap msgid "Credits" msgstr "致谢" #. type: Bullet: '- ' #: ../README.md:115 msgid "[libseccomp](https://github.com/seccomp/libseccomp): The library to support syscall lookups" msgstr "[libseccomp](https://github.com/seccomp/libseccomp): 用于支æŒ�系统调用查询的软件库" #. type: Bullet: '- ' #: ../README.md:115 msgid "[libbpf](https://docs.kernel.org/bpf/libbpf/libbpf_overview.html): The library to support eBPF functions" msgstr "[libbpf](https://docs.kernel.org/bpf/libbpf/libbpf_overview.html): 用æ�¥æ”¯æŒ� eBPF 功能的软件库" #. type: Bullet: '- ' #: ../README.md:115 msgid "[seccomp-tools](https://github.com/david942j/seccomp-tools): The tool in Ruby inspires us to write ceccomp" msgstr "[seccomp-tools](https://github.com/david942j/seccomp-tools): å�¯å�‘我们编写 ceccomp çš„ Ruby 工具" #. type: Bullet: '- ' #: ../README.md:115 msgid "[Bootswatch](https://bootswatch.com/slate/): Provides awesome css for html doc under MIT" msgstr "[Bootswatch](https://bootswatch.com/slate/): æ��供了基于 MIT å��议的用于 html 文档的精美 CSS" #. type: Bullet: '- ' #: ../README.md:115 msgid "[Linux kernel](https://github.com/torvalds/linux): Port some bpf checks" msgstr "[Linux kernel](https://github.com/torvalds/linux): ç§»æ¤�了一些 BPF 的检查" #. type: Bullet: '- ' #: ../README.md:115 msgid "[Verstable](https://github.com/JacksonAllan/Verstable): High-performance hash table implementation in C" msgstr "[Verstable](https://github.com/JacksonAllan/Verstable): C 语言高性能哈希表实现" #. type: Bullet: '- ' #: ../README.md:115 msgid "[a5hash](https://github.com/avaneev/a5hash): High-performance hash implementation for short strings in C" msgstr "[a5hash](https://github.com/avaneev/a5hash): C 语言高性能短字符串哈希实现" #. type: Plain text #: ../README.md:117 msgid "Any Issue or PR are welcome! :heart: Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details." msgstr "欢迎任何 issue 或 PRï¼� :heart: 详情请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)。" #. type: Title ## #: ../README.md:118 #, no-wrap msgid "License" msgstr "许å�¯è¯�" #. type: Plain text #: ../README.md:120 msgid "Copyright (C) 2025-present, ceccomp contributors, distributed under GNU General Public License v3.0 or Later" msgstr "Copyright (C) 2025-现在,ceccomp 贡献者,按 GNU General Public License v3.0 or Later 分å�‘" #, no-wrap #~ msgid "Ceccomp" #~ msgstr "Ceccomp" #~ msgid "A tool to analyze seccomp filters like `seccomp-tools`, written in C" #~ msgstr "用 C é‡�写的,类似 `seccomp-tools` 的用于分æž� seccomp 过滤器的工具" #, no-wrap #~ msgid "" #~ " Clone the whole repo, then run `./configure`. Add `--without-doc` flag if you don't have `asciidoctor`,\n" #~ " and add `--without-i18n` flag if you don't have `gettext` package.\n" #~ msgstr "" #~ " 克隆完整仓库,然å�Žè¿�行 `./configure`。如果您没有 `asciidoctor`, 请添加 `--without-doc` 标志,\n" #~ " 如果您没有 `gettext` 包,请添加 `--without-i18n` 标志。\n" ceccomp-4.3.1/docs/readme.cfg000066400000000000000000000001371526046660400160100ustar00rootroot00000000000000[po_directory] readme-po/ [type: text] ../README.md $lang:../README.$lang.md opt:"-o markdown" ceccomp-4.3.1/ebpf/000077500000000000000000000000001526046660400140555ustar00rootroot00000000000000ceccomp-4.3.1/ebpf/capture.bpf.c000066400000000000000000000107421526046660400164360ustar00rootroot00000000000000#include "utils/ebpf_logger.h" #include "utils/ebpf_share.h" #include #include #include #include struct { __uint (type, BPF_MAP_TYPE_RINGBUF); __uint (max_entries, 0x100000); } scmp_events SEC (".maps"); struct { __uint (type, BPF_MAP_TYPE_HASH); __uint (max_entries, 16); __type (key, pid_t); __type (value, ebpf_prog); } unverified_filters SEC (".maps"); struct { __uint (type, BPF_MAP_TYPE_ARRAY); __uint (max_entries, 1); __type (key, pid_t); __type (value, ebpf_prog); } tmp_buf SEC (".maps"); SEC ("fentry/seccomp_check_filter") int BPF_PROG (seccomp_check_filter_entry, struct sock_filter *filter, unsigned int flen) { uint32_t pid = bpf_get_current_pid_tgid (); uint32_t zero = 0; ebpf_prog *tmp; bool tmp_cond; EBPF_IF_PID (!(tmp = bpf_map_lookup_elem (&tmp_buf, &zero)), pid) return 0; EBPF_IF_PID (bpf_map_update_elem (&unverified_filters, &pid, tmp, BPF_ANY) < 0, pid) return 0; ebpf_prog *unverified; EBPF_IF_PID (!(unverified = bpf_map_lookup_elem (&unverified_filters, &pid)), pid) return 0; unverified->flen = flen; // This shouldn't happen. Just ignore this anyway uint32_t read_size = (uint16_t)(flen * sizeof (struct sock_filter)); EBPF_IF_PID (read_size > BPF_MAXINSNS * sizeof (struct sock_filter), pid) return 0; EBPF_IF_PID (bpf_core_read (unverified->filters, read_size & 0xffff, filter) < 0, pid) EBPF_LOG_IF_PID (bpf_map_delete_elem (&unverified_filters, &pid) < 0, pid); return 0; } #define SECCOMP_SET_MODE_STRICT 0 #define SECCOMP_SET_MODE_FILTER 1 #define SECCOMP_GET_ACTION_AVAIL 2 #define SECCOMP_GET_NOTIF_SIZES 3 static inline int strict_mode (long ret, global_event *event) { if (ret != 0) { bpf_ringbuf_discard (event, 0); return 0; } bpf_ringbuf_submit (event, 0); return 0; } // caller called `prog = bpf_map_lookup_elem(&unverified_filters, &pid)` // So unverified_filters[pid] is not empty // we can use EBPF_LOG_IF_PID(bpf_map_delete_elem) static inline int filter_mode (long ret, uint32_t flags, pid_t pid, global_event *event, ebpf_prog *prog) { bool tmp_cond; if (!load_success (ret, flags)) goto failed; #if defined(__aarch64__) struct task_struct *task = bpf_get_current_task_btf (); unsigned long tflags; EBPF_IF_PID (BPF_CORE_READ_INTO (&tflags, task, thread_info.flags) < 0, pid) goto failed; event->ebpf_arch = COMPAT_ARCH (tflags); #elif defined(__x86_64__) struct task_struct *task = bpf_get_current_task_btf (); uint32_t status; EBPF_IF_PID (BPF_CORE_READ_INTO (&status, task, thread_info.status) < 0, pid) goto failed; event->ebpf_arch = COMPAT_ARCH (status); #else event->ebpf_arch = PROC_ARCH_OTHERS; #endif EBPF_IF_PID (bpf_get_current_comm (event->comm, sizeof (event->comm)) < 0, pid) goto failed; EBPF_IF_PID (bpf_core_read (&event->prog, sizeof (ebpf_prog), prog) < 0, pid) goto failed; bpf_ringbuf_submit (event, 0); EBPF_LOG_IF_PID (bpf_map_delete_elem (&unverified_filters, &pid) < 0, pid); return 0; failed: bpf_ringbuf_discard (event, 0); EBPF_LOG_IF_PID (bpf_map_delete_elem (&unverified_filters, &pid) < 0, pid); return 0; } SEC ("fexit/do_seccomp") int BPF_PROG (seccomp_ret, uint32_t op, uint32_t flags, void *uargs, long ret) { (void)flags; (void)uargs; uint32_t pid = bpf_get_current_pid_tgid (); if (op == SECCOMP_GET_ACTION_AVAIL || op == SECCOMP_GET_NOTIF_SIZES) return 0; if (op != SECCOMP_SET_MODE_STRICT && op != SECCOMP_SET_MODE_FILTER) return 0; global_event *event; ebpf_prog *prog; bool tmp_cond; // If kernel drop filter before seccomp_check_filter, // unverified_filters[pid] should be empty. // bpf_map_lookup_elem would fail, and this is expected prog = bpf_map_lookup_elem (&unverified_filters, &pid); EBPF_IF_PID (!(event = bpf_ringbuf_reserve (&scmp_events, sizeof (global_event), 0)), pid) { if (prog) EBPF_LOG_IF_PID ((bpf_map_delete_elem (&unverified_filters, &pid)) < 0, pid); return 0; } event->pid = pid; event->op = op; if (op == SECCOMP_SET_MODE_STRICT) return strict_mode (ret, event); if (prog) filter_mode (ret, flags, pid, event, prog); else bpf_ringbuf_discard (event, 0); return 0; } char LICENSE[] SEC ("license") = "GPL"; ceccomp-4.3.1/ebpf/capture_pid.bpf.c000066400000000000000000000113101526046660400172620ustar00rootroot00000000000000#include "utils/ebpf_logger.h" #include "utils/ebpf_share.h" #include #include #include #include extern struct task_struct *bpf_task_from_pid (s32 pid) __weak __ksym; extern void bpf_task_release (struct task_struct *p) __weak __ksym; struct { __uint (type, BPF_MAP_TYPE_RINGBUF); __uint (max_entries, 0x400000); } scmp_events SEC (".maps"); struct { __uint (type, BPF_MAP_TYPE_ARRAY); __uint (max_entries, 1); __type (key, uint32_t); __type (value, pid_config); } scmp_config SEC (".maps"); typedef struct { pid_event_status status; struct bpf_prog *prog; uint32_t filter_count; uint32_t flen; ebpf_arch arch; } dump_ctx; static long dump_chunk (uint32_t chunk_index, void *data) { dump_ctx *ctx = data; uint32_t chunk_start_offset = chunk_index * CHUNK_INSN_SIZE; uint32_t remaining_insns = ctx->flen - chunk_start_offset; if (remaining_insns <= CHUNK_INSN_SIZE) ctx->status = PROG_DONE; else { ctx->status = CHUNK_DONE; remaining_insns = CHUNK_INSN_SIZE; } pid_event *event; bool tmp_cond; EBPF_IF (!(event = bpf_ringbuf_reserve (&scmp_events, sizeof (*event), 0))) return 1; event->ebpf_arch = ctx->arch; event->status = ctx->status; event->prog.flen = remaining_insns; event->flen_total = ctx->flen; event->filter_count = ctx->filter_count; uint16_t leftover = remaining_insns * sizeof (struct bpf_insn); // we need to pass verifier leftover = leftover > CHUNK_SIZE ? CHUNK_SIZE : leftover; const void *insnsi = (const void *)ctx->prog + bpf_core_field_offset (struct bpf_prog, insnsi) + chunk_start_offset * sizeof (struct bpf_insn); EBPF_IF (bpf_core_read (event->prog.filters, leftover, insnsi) < 0) { event->status = PROG_ABORTED; bpf_ringbuf_submit (event, 0); return 1; } bpf_ringbuf_submit (event, 0); return 0; } SEC ("fentry/do_seccomp") int BPF_PROG (capture_pid, uint32_t op, uint32_t flags, void *uargs) { (void)op; (void)flags; (void)uargs; uint32_t zero = 0; bool tmp_cond; pid_t trigger_pid = bpf_get_current_pid_tgid (); pid_config *config = bpf_map_lookup_elem (&scmp_config, &zero); EBPF_IF (config == NULL || config->trigger_pid != trigger_pid) return 0; struct task_struct *task; pid_event_status event_status = ALL_DONE; EBPF_IF (!(task = bpf_task_from_pid (config->target_pid))) { event_status = PID_NOT_FOUND; goto end_null; } struct seccomp_filter *filter = NULL; EBPF_IF (BPF_CORE_READ_INTO (&filter, task, seccomp.filter) < 0) { event_status = TASK_ABORTED; goto end; } uint32_t filter_count = 0; EBPF_IF (BPF_CORE_READ_INTO (&filter_count, task, seccomp.filter_count) < 0) { event_status = TASK_ABORTED; goto end; } ebpf_arch arch; #if defined(__aarch64__) unsigned long tflags; EBPF_IF (BPF_CORE_READ_INTO (&tflags, task, thread_info.flags) < 0) { event_status = TASK_ABORTED; goto end; } arch = COMPAT_ARCH (tflags); #elif defined(__x86_64__) uint32_t status; EBPF_IF (BPF_CORE_READ_INTO (&status, task, thread_info.status) < 0) { event_status = TASK_ABORTED; goto end; } arch = COMPAT_ARCH (status); #else arch = PROC_ARCH_OTHERS; #endif for (uint32_t prog_index = 0; filter != NULL && prog_index < 32; prog_index++) { struct seccomp_filter *next; uint32_t flen; struct bpf_prog *prog; EBPF_IF (BPF_CORE_READ_INTO (&prog, filter, prog) < 0) goto next; // This shouldn't happen, but it's necessary for ebpf loader EBPF_IF (prog == NULL) goto next; EBPF_IF (BPF_CORE_READ_INTO (&flen, prog, len) < 0) goto next; dump_ctx ctx = { .prog = prog, .flen = flen, .arch = arch, .filter_count = filter_count }; uint32_t loop_times = (ctx.flen + CHUNK_INSN_SIZE - 1) / CHUNK_INSN_SIZE; EBPF_IF (bpf_loop (loop_times, dump_chunk, &ctx, 0) != loop_times) goto next; next: EBPF_IF (BPF_CORE_READ_INTO (&next, filter, prev) < 0) { event_status = TASK_ABORTED; break; } filter = next; } end: bpf_task_release (task); pid_event *event; end_null: EBPF_IF (!(event = bpf_ringbuf_reserve (&scmp_events, sizeof (*event), 0))) return 0; event->filter_count = 0; if (event_status == TASK_ABORTED) event->status = TASK_ABORTED; else if (event_status == PID_NOT_FOUND) event->status = PID_NOT_FOUND; else if (filter != NULL) event->status = TRUNCATED; else event->status = ALL_DONE; bpf_ringbuf_submit (event, 0); return 0; } char LICENSE[] SEC ("license") = "GPL"; ceccomp-4.3.1/include/000077500000000000000000000000001526046660400145645ustar00rootroot00000000000000ceccomp-4.3.1/include/asm.h000066400000000000000000000002461526046660400155170ustar00rootroot00000000000000#ifndef ASM_H #define ASM_H #include "utils/parse_args.h" #include extern void assemble (FILE *fp, uint32_t scmp_arch, print_mode_t print_mode); #endif ceccomp-4.3.1/include/attributes.h000066400000000000000000000006701526046660400171260ustar00rootroot00000000000000#ifndef ATTRIBUTES_H #define ATTRIBUTES_H #define AttrConst __attribute__ ((const)) #define AttrPure __attribute__ ((pure)) #define AttrNoReturn __attribute__ ((noreturn)) #define AttrNoInline __attribute__ ((noinline)) #define AttrPrintf(sidx, vidx) __attribute__ ((format (printf, sidx, vidx))) #define AttrPacked __attribute__ ((packed)) #define AttrMalloc __attribute__ ((malloc)) #define AttrDtor __attribute__ ((destructor)) #endif ceccomp-4.3.1/include/capture.h000066400000000000000000000002121526046660400163730ustar00rootroot00000000000000#ifndef CAPTURE #define CAPTURE #include #include extern void capture (pid_t pid, uint32_t scmp_arch); #endif ceccomp-4.3.1/include/config.h.in000066400000000000000000000005531526046660400166120ustar00rootroot00000000000000#ifndef CONFIG_H #define CONFIG_H #define CECCOMP_VERSION "@@VERSION@@" #define CECCOMP_TAG_TIME "@@TAG_TIME@@" #define CECCOMP_BUILDER "@@BUILDER@@" #define EBPF_SUPPORT @@EBPF_ON@@ #ifndef LOCALEDIR @@LOCALEDIR@@ #endif #include "i18n.h" #define M_VERSION_FORMAT _ ("ceccomp %s\nTagged on %s\nBuilt by %s\n") #define M_DEPENDENCY _ ("Dependencies:\n") #endif ceccomp-4.3.1/include/decoder/000077500000000000000000000000001526046660400161715ustar00rootroot00000000000000ceccomp-4.3.1/include/decoder/check_prog.h000066400000000000000000000002331526046660400204440ustar00rootroot00000000000000#ifndef CHECK_PROG_H #define CHECK_PROG_H #include "main.h" #include #include extern bool check_prog (const fprog *prog); #endif ceccomp-4.3.1/include/decoder/decoder.h000066400000000000000000000010371526046660400177500ustar00rootroot00000000000000#ifndef DECODER_H #define DECODER_H #include "lexical/parser.h" #include "lexical/token.h" #include "main.h" #include "utils/vector.h" #include #include /** * prog: filters read from input * v: initialized statement vector for decoded statements * trustful: filters extracted from kernel don't need check as kernel did that * Returns true if found any error */ extern bool decode_filters (const fprog *prog, vector_t *v, bool trustful); extern token_type decode_return_k (obj_t *ret_obj, uint32_t k); #endif ceccomp-4.3.1/include/decoder/formatter.h000066400000000000000000000010551526046660400203460ustar00rootroot00000000000000#ifndef FORMATTER_H #define FORMATTER_H #include "attributes.h" #include "lexical/parser.h" #include #define DEFAULT_LABEL "L%04d" typedef void (*print_fn) (const obj_t *obj); typedef struct { print_fn handler; char *color; } obj_print_t; extern void extern_obj_printer (FILE *output_fp, const obj_t *obj); extern AttrPrintf (2, 3) void print_as_comment (FILE *output_fp, const char *comment_fmt, ...); extern void print_statement (FILE *output_fp, const statement_t *statement); #endif ceccomp-4.3.1/include/disasm.h000066400000000000000000000007171526046660400162220ustar00rootroot00000000000000#ifndef DISASM_H #define DISASM_H #include "main.h" #include #include #include #include extern void print_prog (uint32_t scmp_arch, const fprog *prog, pid_t pid, FILE *output_fp, bool trustful); extern void disasm (FILE *fp, uint32_t scmp_arch, bool ebpf); extern filter *g_filters; // return true if success or initialized extern bool init_global_filters (uint32_t insn_count); #endif ceccomp-4.3.1/include/emu.h000066400000000000000000000004211526046660400155200ustar00rootroot00000000000000#ifndef EMU_H #define EMU_H #include "utils/parse_args.h" #include "utils/vector.h" extern void emulate_v (vector_t *text_v, vector_t *code_ptr_v, const emu_arg_t *emu_arg, FILE *output_fp); extern void emulate (const emu_arg_t *emu_arg); #endif ceccomp-4.3.1/include/help.h000066400000000000000000000106421526046660400156700ustar00rootroot00000000000000#ifndef HELP_H #define HELP_H #include "i18n.h" #define M_CECCOMP_USAGE _ ("Usage: ceccomp \n") #define ASM_HINT "ceccomp asm [ -c WHEN ] [ -a ARCH ] [ -f FMT ] [ text ]" #define DISASM_HINT "ceccomp disasm [ -c WHEN ] [ -a ARCH ] [ -e ] [ raw ]" #define EMU_HINT \ "ceccomp emu [ -c WHEN ] [ -a ARCH ] [ -q ] text syscall_nr [ " \ "args[0-5] ip ]" #define PROBE_HINT \ "ceccomp probe [ -c WHEN ] [ -o FILE ] [ -q ] PROGRAM [ program-args ]" #define TRACE_HINT \ "ceccomp trace [ -c WHEN ] [ -o FILE ] [ -q ] PROGRAM [ program-args ]\n" \ " [ -c WHEN ] [ -s ] [ -q ] -p PID" #define CAPTURE_HINT "ceccomp capture [ -c WHEN ] [ -p PID ]" #define HELP_HINT "ceccomp help" #define VERSION_HINT "ceccomp version" #define M_SUBCMD_HINT \ _ ("asm -- Assemble bpf text to raw bytes\n" \ "capture -- Install eBPF prog to capture all seccomp filters " \ "during installation or extract installed filters in a process\n" \ "disasm -- Disassemble raw bytes to bpf text\n" \ "emu -- Emulate bpf program with given syscall and bpf text\n" \ "help -- Display ceccomp help information\n" \ "probe -- Trace the program for the first filter and emulate " \ "common syscalls\n" \ "trace (dump) -- Run program or trace pid, extract bpf filter and then " \ "print to text\n" \ "version -- Display ceccomp version\n") #define M_OPTION_HINT \ _ ("Options:\n" \ "-a, --arch (x86_64|aarch64|...) Which architecture to resolve " \ "syscall_nr, read or write bytestream by the byteorder of arch, " \ "default as your arch\n" \ \ "-c, --color (auto|always|never) When to print in color, default as " \ "auto\n" \ \ "-e, --ebpf Treat input as eBPF-migrated filter " \ "bytes\n" \ \ "-f, --fmt (hexline|hexfmt|raw) Output format, default as hexline\n" \ \ "-o, --output file Print to file to avoid mixing " \ "ceccomp output and tracee program output, default as stderr\n" \ \ "-p, --pid task_id Extract bpf filters from process (or " \ "thread) and print with bpf text form; CAP_SYS_ADMIN is needed to " \ "work\n" \ \ "-q, --quiet Print emulate result only " \ "or suppress the process info message in trace and probe\n" \ \ "-s, --seize Follow process to trace load-filter " \ "operation\n" \ "\n" \ "syscall_nr System call number or name (e.g. " \ "0|read)\n" \ "args[0-5], ip args and ip (instruction pointer) " \ "used for emulation, default as 0\n" \ "raw, text File with BPF RAW or BPF TEXT, see " \ "docs for detail, default as stdin\n") #endif ceccomp-4.3.1/include/i18n.h000066400000000000000000000003541526046660400155160ustar00rootroot00000000000000#ifndef CONFIG_H #include "config.h" #endif #ifndef I18N_H #define I18N_H #include extern locale_t lc_c; #ifdef LOCALEDIR #include #define _(string) gettext (string) #else #define _(string) string #endif #endif ceccomp-4.3.1/include/lexical/000077500000000000000000000000001526046660400162055ustar00rootroot00000000000000ceccomp-4.3.1/include/lexical/parser.h000066400000000000000000000043001526046660400176470ustar00rootroot00000000000000#ifndef PARSER_H #define PARSER_H #include "attributes.h" #include "main.h" #include "token.h" #include "utils/hash.h" #include "utils/vector.h" #include #include typedef struct { hkey_t key; uint16_t code_nr; // when key.string != NULL, key stores the label string } label_t; typedef struct { token_type type; uint32_t data; string_t literal; // store idx for MEM | ATTR_LOWARG | ATTR_HIGHARG // store value for NUMBER | TRAP | TRACE | ERRNO } obj_t; typedef struct { obj_t left_var; token_type operator; obj_t right_var; // if operator is NEGATIVE, then it should be A EQUAL NEGATIVE A // but EQUAL is skipped } assign_line_t; typedef enum AttrPacked { CMP_NUMBER = 0, CMP_ARCH = 1, CMP_SYSCALL = 2, CMP_ARCH_SYSCALL = 3, } comparator_t; typedef struct { // token_t if; // jump_line_t must starts with if, so skip it bool if_bang; // if match '!' before jump_condition bool if_condition; // does condition exists // if true, jt and jf both uint16_t // else jt is uint32_t, jf is ignored comparator_t cmptype; // var A; // jump always compare A with something else, so skip it token_type comparator; obj_t cmpobj; label_t jt; label_t jf; // pc += (jump_condition ? jt : jf) + 1 // pc += jt + 1 } jump_line_t; typedef struct { // token_type return // return_line_t must have return, so skip it obj_t ret_obj; obj_t real_obj; // only used in emu quiet } return_line_t; typedef void *empty_line_t; typedef void *eof_line_t; typedef struct { char *error_start; const char *error_msg; } error_line_t; typedef enum { ASSIGN_LINE, JUMP_LINE, RETURN_LINE, EMPTY_LINE, EOF_LINE, ERROR_LINE, } expr_type; typedef struct { expr_type type; string_t label_decl; uint16_t text_nr; uint16_t code_nr; char *line_start; int16_t comment; uint16_t line_len; union { assign_line_t assign_line; jump_line_t jump_line; return_line_t return_line; empty_line_t empty_line; eof_line_t eof_line; error_line_t error_line; }; } statement_t; extern void init_parser (uint32_t scmp_arch); // see vector.h for vector details extern void parser (vector_t *text_v, vector_t *code_ptr_v); #endif ceccomp-4.3.1/include/lexical/scanner.h000066400000000000000000000005021526046660400200040ustar00rootroot00000000000000#ifndef SCANNER_H #define SCANNER_H #include "token.h" #include struct scanner_t { char *token_start; char *current_char; uint16_t line_nr; }; typedef struct scanner_t scanner_t; typedef struct token_t token_t; extern void init_scanner (char *start); extern void scan_token (token_t *token); #endif ceccomp-4.3.1/include/lexical/token.h000066400000000000000000000032111526046660400174730ustar00rootroot00000000000000#ifndef TOKEN_H #define TOKEN_H #include "main.h" #include #include // clang-format off // many things rely on the enum order, be careful when modify this typedef enum { ARCH_X86, ARCH_I686, ARCH_X86_64, ARCH_X32, ARCH_AARCH64, ARCH_ARMV8L, ARCH_ARMV7L, ARCH_ARM, ARCH_LOONGARCH64, ARCH_M68K, ARCH_MIPSEL64N32, ARCH_MIPSEL64, ARCH_MIPSEL, ARCH_MIPS64N32, ARCH_MIPS64, ARCH_MIPS, ARCH_PARISC64, ARCH_PARISC, ARCH_PPC64LE, ARCH_PPC64, ARCH_PPC, ARCH_S390X, ARCH_S390, ARCH_RISCV64, ARCH_SH4, ARCH_SHEB, ARCH_SH, KILL_PROC, KILL, ALLOW, NOTIFY, LOG, TRACE, TRAP, ERRNO, RETURN, IF, GOTO, ELSE, COMMA, A, X, MEM, ATTR_LEN, ATTR_SYSCALL, ATTR_ARCH, ATTR_LOWPC, ATTR_HIGHPC, ATTR_LOWARG, ATTR_HIGHARG, DOT, LEFT_BRACKET, RIGHT_BRACKET, LEFT_PAREN, RIGHT_PAREN, ADD_TO, SUB_TO, MULTI_TO, DIVIDE_TO, LSH_TO, RSH_TO, AND_TO, OR_TO, XOR_TO, EQUAL_EQUAL, BANG_EQUAL, GREATER_EQUAL, GREATER_THAN, LESS_EQUAL, LESS_THAN, AND, EQUAL, NEGATIVE, BANG, NUMBER, IDENTIFIER, UNKNOWN, COMMENT, EOL, TOKEN_EOF, LABEL_DECL, OVERFLOW_NUMBER, // IDENTIFIER includes SYSCALL, LABEL // LABEL_DECL = (IDENTIFIER + ':') } token_type; // clang-format on struct token_t { token_type type; char *token_start; uint16_t token_len; uint16_t line_nr; uint32_t data; // data is for NUMBER }; extern const string_t token_pairs[]; typedef struct scanner_t scanner_t; typedef struct token_t token_t; void init_token (token_t *token, const scanner_t *scanner, token_type type); void init_token_data (token_t *token, const scanner_t *scanner, token_type type, uint32_t data); #endif ceccomp-4.3.1/include/lib/000077500000000000000000000000001526046660400153325ustar00rootroot00000000000000ceccomp-4.3.1/include/lib/a5hash-5.25.h000066400000000000000000000501201526046660400172410ustar00rootroot00000000000000/** * @file a5hash.h * * @version 5.25 * * @brief The header file for the "a5hash" 64-bit hash function, "a5hash32" * 32-bit hash function, "a5hash128" 128-bit hash function, and "a5rand" * 64-bit PRNG. * * The source code is written in ISO C99, with full C++ compliance enabled * conditionally and automatically when compiled with a C++ compiler. * * Description is available at https://github.com/avaneev/a5hash * * Email: aleksey.vaneev@gmail.com or info@voxengo.com * * LICENSE: * * Copyright (c) 2025 Aleksey Vaneev * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef A5HASH_INCLUDED #define A5HASH_INCLUDED #define A5HASH_VER_STR "5.25" ///< A5HASH source code version string. /** * @def A5HASH_NS_CUSTOM * @brief If this macro is defined externally, all symbols will be placed into * the C++ namespace specified by this macro and will not be exported to the * global namespace. WARNING: if the macro's value is empty, the symbols will * be placed into the global namespace anyway. */ /** * @def A5HASH_U64_C( x ) * @brief Macro that defines a numeric value as unsigned 64-bit value. * * @param x Value. */ /** * @def A5HASH_NOEX * @brief Macro that defines the "noexcept" function specifier for C++ * environment. */ /** * @def A5HASH_NULL * @brief Macro that defines "nullptr" value, for C++ guidelines compliance. */ /** * @def A5HASH_NS * @brief Macro that defines the actual implementation namespace in C++ * environment, with export of relevant symbols to the global namespace * (if @ref A5HASH_NS_CUSTOM is undefined). */ #if defined( __cplusplus ) #include #if __cplusplus >= 201103L #include #define A5HASH_U64_C( x ) UINT64_C( x ) #define A5HASH_NOEX noexcept #define A5HASH_NULL nullptr #else // __cplusplus >= 201103L #include #define A5HASH_U64_C( x ) (uint64_t) x #define A5HASH_NOEX throw() #define A5HASH_NULL NULL #endif // __cplusplus >= 201103L #if defined( A5HASH_NS_CUSTOM ) #define A5HASH_NS A5HASH_NS_CUSTOM #else // defined( A5HASH_NS_CUSTOM ) #define A5HASH_NS a5hash_impl #endif // defined( A5HASH_NS_CUSTOM ) #else // defined( __cplusplus ) #include #include #define A5HASH_U64_C( x ) (uint64_t) x #define A5HASH_NOEX #define A5HASH_NULL NULL #endif // defined( __cplusplus ) #if defined( _MSC_VER ) #include #endif // defined( _MSC_VER ) #define A5HASH_VAL10 A5HASH_U64_C( 0xAAAAAAAAAAAAAAAA ) ///< `10` bit-pairs. #define A5HASH_VAL01 A5HASH_U64_C( 0x5555555555555555 ) ///< `01` bit-pairs. /** * @def A5HASH_ICC_GCC * @brief Macro that denotes the use of ICC classic compiler with GCC-style * built-in functions. */ #if defined( __INTEL_COMPILER ) && __INTEL_COMPILER >= 1300 && \ !defined( _MSC_VER ) #define A5HASH_ICC_GCC #endif // ICC check /** * @def A5HASH_GCC_BUILTINS * @brief Macro that denotes availability of GCC-style built-in functions. */ #if defined( __GNUC__ ) || defined( __clang__ ) || \ defined( __IBMC__ ) || defined( __IBMCPP__ ) || defined( A5HASH_ICC_GCC ) #define A5HASH_GCC_BUILTINS #endif // GCC built-ins check /** * @def A5HASH_BMI2 * @brief Macro that denotes availability of the `mulx` intrinsic * (MSVC-compatible compilers only). */ #if defined( _MSC_VER ) #if defined( __BMI2__ ) || ( !defined( A5HASH_GCC_BUILTINS ) && \ defined( _M_AMD64 ) && defined( __AVX2__ ) && \ ( defined( __INTEL_COMPILER ) || _MSC_VER >= 1900 )) #include #define A5HASH_BMI2 #else // BMI2 #include #endif // BMI2 #endif // defined( _MSC_VER ) /** * @def A5HASH_STATIC * @brief Macro that defines a function as "static". */ #if ( defined( __cplusplus ) && __cplusplus >= 201703L ) || \ ( defined( __STDC_VERSION__ ) && __STDC_VERSION__ >= 202311L ) #define A5HASH_STATIC [[maybe_unused]] static #elif defined( A5HASH_GCC_BUILTINS ) #define A5HASH_STATIC static __attribute__((unused)) #else // defined( A5HASH_GCC_BUILTINS ) #define A5HASH_STATIC static #endif // defined( A5HASH_GCC_BUILTINS ) /** * @def A5HASH_INLINE * @brief Macro that defines a function as inlinable at the compiler's * discretion. */ #define A5HASH_INLINE A5HASH_STATIC inline /** * @def A5HASH_INLINE_F * @brief Macro to force code inlining. */ #if defined( __LP64__ ) || defined( _LP64 ) || \ !( SIZE_MAX <= 0xFFFFFFFFU ) || ( defined( UINTPTR_MAX ) && \ !( UINTPTR_MAX <= 0xFFFFFFFFU )) || defined( __x86_64__ ) || \ defined( __aarch64__ ) || defined( _M_AMD64 ) || defined( _M_ARM64 ) #if defined( A5HASH_GCC_BUILTINS ) #define A5HASH_INLINE_F A5HASH_INLINE __attribute__((always_inline)) #elif defined( _MSC_VER ) #define A5HASH_INLINE_F A5HASH_STATIC __forceinline #endif // defined( _MSC_VER ) #endif // 64-bit platform check #if !defined( A5HASH_INLINE_F ) #define A5HASH_INLINE_F A5HASH_INLINE #endif // !defined( A5HASH_INLINE_F ) #if defined( A5HASH_NS ) namespace A5HASH_NS { using std :: memcpy; using std :: size_t; #if __cplusplus >= 201103L using std :: uint32_t; using std :: uint64_t; using uint8_t = unsigned char; ///< For C++ type aliasing compliance. #endif // __cplusplus >= 201103L #endif // defined( A5HASH_NS ) /** * @{ * @brief Load unsigned value of the specific bit size from memory. * * @param p Load address. */ A5HASH_INLINE_F uint32_t a5hash_lu32( const uint8_t* const p ) A5HASH_NOEX { uint32_t v; memcpy( &v, p, 4 ); return( v ); } A5HASH_INLINE_F uint64_t a5hash_lu64( const uint8_t* const p ) A5HASH_NOEX { uint64_t v; memcpy( &v, p, 8 ); return( v ); } /** @} */ /** * @brief 64-bit by 64-bit unsigned multiplication producing a 128-bit result. * * @param u Multiplier 1. * @param v Multiplier 2. * @param[out] rl The lower half of the 128-bit result. * @param[out] rh The upper half of the 128-bit result. */ A5HASH_INLINE_F void a5hash_umul128( const uint64_t u, const uint64_t v, uint64_t* const rl, uint64_t* const rh ) A5HASH_NOEX { #if defined( A5HASH_BMI2 ) *rl = _mulx_u64( u, v, rh ); #elif defined( _MSC_VER ) && ( defined( _M_ARM64 ) || defined( _M_ARM64EC ) || \ ( defined( __INTEL_COMPILER ) && defined( _M_AMD64 ))) *rl = u * v; *rh = __umulh( u, v ); #elif defined( _MSC_VER ) && ( defined( _M_AMD64 ) || defined( _M_IA64 )) *rl = _umul128( u, v, rh ); #elif defined( __SIZEOF_INT128__ ) || \ ( defined( A5HASH_ICC_GCC ) && defined( __x86_64__ )) __uint128_t r = u; r *= v; *rl = (uint64_t) r; *rh = (uint64_t) ( r >> 64 ); #elif ( defined( __IBMC__ ) || defined( __IBMCPP__ )) && defined( __LP64__ ) *rl = u * v; *rh = __mulhdu( u, v ); #else // defined( __IBMC__ ) // _umul128() code for 32-bit systems, adapted from Hacker's Delight, // Henry S. Warren, Jr. *rl = u * v; const uint32_t u0 = (uint32_t) u; const uint32_t v0 = (uint32_t) v; const uint64_t w0 = (uint64_t) u0 * v0; const uint32_t u1 = (uint32_t) ( u >> 32 ); const uint32_t v1 = (uint32_t) ( v >> 32 ); const uint64_t t = (uint64_t) u1 * v0 + (uint32_t) ( w0 >> 32 ); const uint64_t w1 = (uint64_t) u0 * v1 + (uint32_t) t; *rh = (uint64_t) u1 * v1 + (uint32_t) ( w1 >> 32 ) + (uint32_t) ( t >> 32 ); #endif // defined( __IBMC__ ) } /** * @brief A5HASH 64-bit hash function. * * Produces and returns a 64-bit hash value (digest) of the specified message, * string, or binary data block. Designed for string/small key data hash-map * and hash-table uses. * * @param Msg0 The message to produce a hash from. The alignment of this * pointer is unimportant. It is valid to pass 0 when `MsgLen` equals 0. * @param MsgLen Message length, in bytes, can be zero. * @param UseSeed An optional value to use instead of the default seed (0). * This value can have any number of significant bits and any statistical * quality. * @return 64-bit hash of the input data. */ A5HASH_INLINE_F uint64_t a5hash( const void* const Msg0, size_t MsgLen, const uint64_t UseSeed ) A5HASH_NOEX { const uint8_t* Msg = (const uint8_t*) Msg0; uint64_t val01 = A5HASH_VAL01; uint64_t val10 = A5HASH_VAL10; // The seeds are initialized to mantissa bits of PI. uint64_t Seed1 = A5HASH_U64_C( 0x243F6A8885A308D3 ) ^ MsgLen; uint64_t Seed2 = A5HASH_U64_C( 0x452821E638D01377 ) ^ MsgLen; a5hash_umul128( Seed2 ^ ( UseSeed & val10 ), Seed1 ^ ( UseSeed & val01 ), &Seed1, &Seed2 ); if( MsgLen > 16 ) { val01 ^= Seed1; val10 ^= Seed2; do { a5hash_umul128( (uint64_t) a5hash_lu32( Msg ) << 32 ^ a5hash_lu32( Msg + 4 ) ^ Seed1, (uint64_t) a5hash_lu32( Msg + 8 ) << 32 ^ a5hash_lu32( Msg + 12 ) ^ Seed2, &Seed1, &Seed2 ); MsgLen -= 16; Msg += 16; Seed1 += val01; Seed2 += val10; } while( MsgLen > 16 ); } if( MsgLen == 0 ) { goto _fin; } if( MsgLen > 3 ) { const uint8_t* Msg4; size_t mo; Msg4 = Msg + MsgLen - 4; mo = MsgLen >> 3; Seed1 ^= (uint64_t) a5hash_lu32( Msg ) << 32 | a5hash_lu32( Msg4 ); Seed2 ^= (uint64_t) a5hash_lu32( Msg + mo * 4 ) << 32 | a5hash_lu32( Msg4 - mo * 4 ); _fin: a5hash_umul128( Seed1, Seed2, &Seed1, &Seed2 ); a5hash_umul128( val01 ^ Seed1, Seed2, &Seed1, &Seed2 ); return( Seed1 ^ Seed2 ); } else { Seed1 ^= Msg[ 0 ]; if( --MsgLen != 0 ) { Seed1 ^= (uint64_t) Msg[ 1 ] << 8; if( --MsgLen != 0 ) { Seed1 ^= (uint64_t) Msg[ 2 ] << 16; } } goto _fin; } } /** * @brief 32-bit by 32-bit unsigned multiplication producing a 64-bit result. * * @param u Multiplier 1. * @param v Multiplier 2. * @param[out] rl The lower half of the 64-bit result. * @param[out] rh The upper half of the 64-bit result. */ A5HASH_INLINE_F void a5hash_umul64( const uint32_t u, const uint32_t v, uint32_t* const rl, uint32_t* const rh ) A5HASH_NOEX { const uint64_t r = (uint64_t) u * v; *rl = (uint32_t) r; *rh = (uint32_t) ( r >> 32 ); } /** * @brief A5HASH 32-bit hash function. * * Produces and returns a 32-bit hash value (digest) of the specified message, * string, or binary data block. Designed for string/small key data hash-map * and hash-table uses. * * This function works natively on 32-bit platforms and avoids the performance * penalty of 64-bit arithmetic. * * @param Msg0 The message to produce a hash from. The alignment of this * pointer is unimportant. It is valid to pass 0 when `MsgLen` equals 0. * @param MsgLen Message length, in bytes, can be zero. * @param UseSeed An optional value to use instead of the default seed (0). * This value can have any number of significant bits and any statistical * quality. * @return 32-bit hash of the input data. */ A5HASH_INLINE_F uint32_t a5hash32( const void* const Msg0, size_t MsgLen, const uint32_t UseSeed ) A5HASH_NOEX { const uint8_t* Msg = (const uint8_t*) Msg0; uint32_t val01 = (uint32_t) A5HASH_VAL01; uint32_t val10 = (uint32_t) A5HASH_VAL10; // The seeds are initialized to mantissa bits of PI. uint32_t Seed1 = 0x243F6A88 ^ (uint32_t) MsgLen; uint32_t Seed2 = 0x85A308D3 ^ (uint32_t) MsgLen; uint32_t Seed3, Seed4; uint32_t a, b, c, d; #if SIZE_MAX <= 0xFFFFFFFFU Seed3 = 0xFB0BD3EA; Seed4 = 0x0F58FD47; #else // SIZE_MAX <= 0xFFFFFFFFU a5hash_umul64( (uint32_t) ( MsgLen >> 32 ) ^ 0x452821E6, (uint32_t) ( MsgLen >> 32 ) ^ 0x38D01377, &Seed3, &Seed4 ); #endif // SIZE_MAX <= 0xFFFFFFFFU a5hash_umul64( Seed2 ^ ( UseSeed & val10 ), Seed1 ^ ( UseSeed & val01 ), &Seed1, &Seed2 ); if( MsgLen < 17 ) { if( MsgLen > 3 ) { const uint8_t* const Msg4 = Msg + MsgLen - 4; size_t mo; a = a5hash_lu32( Msg ); b = a5hash_lu32( Msg4 ); if( MsgLen < 9 ) { goto _fin; } mo = MsgLen >> 3; c = a5hash_lu32( Msg + mo * 4 ); d = a5hash_lu32( Msg4 - mo * 4 ); } else { a = 0; b = 0; if( MsgLen != 0 ) { a = Msg[ 0 ]; if( MsgLen != 1 ) { a |= (uint32_t) Msg[ 1 ] << 8; if( MsgLen != 2 ) { a |= (uint32_t) Msg[ 2 ] << 16; } } } goto _fin; } } else { val01 ^= Seed1; val10 ^= Seed2; do { const uint32_t s1 = Seed1; const uint32_t s4 = Seed4; a5hash_umul64( a5hash_lu32( Msg ) + Seed1, a5hash_lu32( Msg + 4 ) + Seed2, &Seed1, &Seed2 ); a5hash_umul64( a5hash_lu32( Msg + 8 ) + Seed3, a5hash_lu32( Msg + 12 ) + Seed4, &Seed3, &Seed4 ); MsgLen -= 16; Msg += 16; Seed1 += val01; Seed2 += s4; Seed3 += s1; Seed4 += val10; } while( MsgLen > 16 ); a = a5hash_lu32( Msg + MsgLen - 8 ); b = a5hash_lu32( Msg + MsgLen - 4 ); if( MsgLen < 9 ) { goto _fin; } c = a5hash_lu32( Msg + MsgLen - 16 ); d = a5hash_lu32( Msg + MsgLen - 12 ); } a5hash_umul64( c + Seed3, d + Seed4, &Seed3, &Seed4 ); _fin: Seed1 ^= Seed3; Seed2 ^= Seed4; a5hash_umul64( a + Seed1, b + Seed2, &Seed1, &Seed2 ); a5hash_umul64( val01 ^ Seed1, Seed2, &a, &b ); return( a ^ b ); } /** * @brief A5HASH 128-bit hash function. * * Produces and returns a 128-bit hash value (digest) of the specified * message, string, or binary data block. Designed for string/small key data * hash-map and hash-table uses. * * @param Msg0 The message to produce a hash from. The alignment of this * pointer is unimportant. It is valid to pass 0 when `MsgLen` equals 0. * @param MsgLen Message length, in bytes, can be zero. * @param UseSeed An optional value to use instead of the default seed (0). * This value can have any number of significant bits and any statistical * quality. * @param[out] rh Pointer to 64-bit variable that receives upper 64 bits of * 128-bit hash. The alignment of this pointer is unimportant. Can be 0. * @return Lower 64 bits of 128-bit hash of the input data. */ A5HASH_INLINE uint64_t a5hash128( const void* const Msg0, size_t MsgLen, const uint64_t UseSeed, void* const rh ) A5HASH_NOEX { const uint8_t* Msg = (const uint8_t*) Msg0; uint64_t val01 = A5HASH_VAL01; uint64_t val10 = A5HASH_VAL10; // The seeds are initialized to mantissa bits of PI. uint64_t Seed1 = A5HASH_U64_C( 0x243F6A8885A308D3 ) ^ MsgLen; uint64_t Seed2 = A5HASH_U64_C( 0x452821E638D01377 ) ^ MsgLen; uint64_t Seed3 = A5HASH_U64_C( 0xA4093822299F31D0 ); uint64_t Seed4 = A5HASH_U64_C( 0xC0AC29B7C97C50DD ); uint64_t a, b, c, d; a5hash_umul128( Seed2 ^ ( UseSeed & val10 ), Seed1 ^ ( UseSeed & val01 ), &Seed1, &Seed2 ); if( MsgLen < 17 ) { if( MsgLen > 3 ) { const uint8_t* Msg4; size_t mo; Msg4 = Msg + MsgLen - 4; mo = MsgLen >> 3; a = (uint64_t) a5hash_lu32( Msg ) << 32 | a5hash_lu32( Msg4 ); b = (uint64_t) a5hash_lu32( Msg + mo * 4 ) << 32 | a5hash_lu32( Msg4 - mo * 4 ); _fin16: a5hash_umul128( a + Seed1, b + Seed2, &Seed1, &Seed2 ); a5hash_umul128( val01 ^ Seed1, Seed2, &a, &b ); a ^= b; if( rh != A5HASH_NULL ) { a5hash_umul128( Seed1 ^ Seed3, Seed2 ^ Seed4, &Seed3, &Seed4 ); Seed3 ^= Seed4; memcpy( rh, &Seed3, 8 ); } return( a ); } else { a = 0; b = 0; if( MsgLen != 0 ) { a = Msg[ 0 ]; if( --MsgLen != 0 ) { a |= (uint64_t) Msg[ 1 ] << 8; if( --MsgLen != 0 ) { a |= (uint64_t) Msg[ 2 ] << 16; } } } goto _fin16; } } if( MsgLen < 33 ) { a = (uint64_t) a5hash_lu32( Msg ) << 32 | a5hash_lu32( Msg + 4 ); b = (uint64_t) a5hash_lu32( Msg + 8 ) << 32 | a5hash_lu32( Msg + 12 ); c = (uint64_t) a5hash_lu32( Msg + MsgLen - 16 ) << 32 | a5hash_lu32( Msg + MsgLen - 12 ); d = (uint64_t) a5hash_lu32( Msg + MsgLen - 8 ) << 32 | a5hash_lu32( Msg + MsgLen - 4 ); _fin_m: a5hash_umul128( c + Seed3, d + Seed4, &Seed3, &Seed4 ); _fin: Seed1 ^= Seed3; Seed2 ^= Seed4; a5hash_umul128( a + Seed1, b + Seed2, &Seed1, &Seed2 ); a5hash_umul128( val01 ^ Seed1, Seed2, &a, &b ); a ^= b; if( rh != A5HASH_NULL ) { a5hash_umul128( Seed1 ^ Seed3, Seed2 ^ Seed4, &Seed3, &Seed4 ); Seed3 ^= Seed4; memcpy( rh, &Seed3, 8 ); } return( a ); } else { val01 ^= Seed1; val10 ^= Seed2; if( MsgLen > 64 ) { uint64_t Seed5 = A5HASH_U64_C( 0x082EFA98EC4E6C89 ); uint64_t Seed6 = A5HASH_U64_C( 0x3F84D5B5B5470917 ); uint64_t Seed7 = A5HASH_U64_C( 0x13198A2E03707344 ); uint64_t Seed8 = A5HASH_U64_C( 0xBE5466CF34E90C6C ); do { const uint64_t s1 = Seed1; const uint64_t s3 = Seed3; const uint64_t s5 = Seed5; a5hash_umul128( a5hash_lu64( Msg ) + Seed1, a5hash_lu64( Msg + 32 ) + Seed2, &Seed1, &Seed2 ); Seed1 += val01; Seed2 += Seed8; a5hash_umul128( a5hash_lu64( Msg + 8 ) + Seed3, a5hash_lu64( Msg + 40 ) + Seed4, &Seed3, &Seed4 ); Seed3 += s1; Seed4 += val10; a5hash_umul128( a5hash_lu64( Msg + 16 ) + Seed5, a5hash_lu64( Msg + 48 ) + Seed6, &Seed5, &Seed6 ); a5hash_umul128( a5hash_lu64( Msg + 24 ) + Seed7, a5hash_lu64( Msg + 56 ) + Seed8, &Seed7, &Seed8 ); MsgLen -= 64; Msg += 64; Seed5 += s3; Seed6 += val10; Seed7 += s5; Seed8 += val10; } while( MsgLen > 64 ); Seed1 ^= Seed5; Seed2 ^= Seed6; Seed3 ^= Seed7; Seed4 ^= Seed8; if( MsgLen > 32 ) { goto _tail32; } } else { uint64_t s1; _tail32: s1 = Seed1; a5hash_umul128( a5hash_lu64( Msg ) + Seed1, a5hash_lu64( Msg + 8 ) + Seed2, &Seed1, &Seed2 ); Seed1 += val01; Seed2 += Seed4; a5hash_umul128( a5hash_lu64( Msg + 16 ) + Seed3, a5hash_lu64( Msg + 24 ) + Seed4, &Seed3, &Seed4 ); MsgLen -= 32; Msg += 32; Seed3 += s1; Seed4 += val10; } a = a5hash_lu64( Msg + MsgLen - 16 ); b = a5hash_lu64( Msg + MsgLen - 8 ); if( MsgLen < 17 ) { goto _fin; } c = a5hash_lu64( Msg + MsgLen - 32 ); d = a5hash_lu64( Msg + MsgLen - 24 ); goto _fin_m; } } /** * @brief A5RAND 64-bit pseudo-random number generator. * * A simple, reliable, self-starting, yet efficient PRNG with a 2^64 period. * 0.50 cycles/byte performance. It self-starts in 4 iterations, which is the * suggested "warm-up" period before using its output when seeds are * initialized with an arbitrary value. If initialized with high-quality, * uniformly random value (e.g., from the operating system's entropy or a * hash function's output), the PRNG output is valid from the start. * * @param[in,out] Seed1 Seed value 1. Can be initialized to any value * (even 0). Should not be used as the PRNG value. * @param[in,out] Seed2 Seed value 2. Must be initialized to the same value as * `Seed1`. Should not be used as the PRNG value. * @return The next uniformly random 64-bit value. */ A5HASH_INLINE_F uint64_t a5rand( uint64_t* const Seed1, uint64_t* const Seed2 ) A5HASH_NOEX { uint64_t s1 = *Seed1; uint64_t s2 = *Seed2; a5hash_umul128( s1 + A5HASH_VAL01, s2 + A5HASH_VAL10, &s1, &s2 ); *Seed1 = s1; *Seed2 = s2; return( s1 ^ s2 ); } #if defined( A5HASH_NS ) } // namespace A5HASH_NS #if !defined( A5HASH_NS_CUSTOM ) namespace { using A5HASH_NS :: a5hash_umul128; using A5HASH_NS :: a5hash; using A5HASH_NS :: a5hash32; using A5HASH_NS :: a5hash128; using A5HASH_NS :: a5rand; } // namespace #endif // !defined( A5HASH_NS_CUSTOM ) #endif // defined( A5HASH_NS ) // Defines for Doxygen. #if !defined( A5HASH_NS_CUSTOM ) #define A5HASH_NS_CUSTOM #endif // !defined( A5HASH_NS_CUSTOM ) #undef A5HASH_NS_CUSTOM #undef A5HASH_U64_C #undef A5HASH_NOEX #undef A5HASH_NULL #undef A5HASH_VAL10 #undef A5HASH_VAL01 #undef A5HASH_ICC_GCC #undef A5HASH_GCC_BUILTINS #undef A5HASH_BMI2 #undef A5HASH_STATIC #undef A5HASH_INLINE #undef A5HASH_INLINE_F #endif // A5HASH_INCLUDED ceccomp-4.3.1/include/lib/verstable-2.2.1.h000066400000000000000000002451311526046660400201360ustar00rootroot00000000000000/*------------------------------------------------- VERSTABLE v2.2.1 --------------------------------------------------- Verstable is a C99-compatible, open-addressing hash table using quadratic probing and the following additions: * All keys that hash (i.e. "belong") to the same bucket (their "home bucket") are linked together by an 11-bit integer specifying the quadratic displacement, relative to that bucket, of the next key in the chain. * If a chain of keys exists for a given bucket, then it always begins at that bucket. To maintain this policy, a 1-bit flag is used to mark whether the key occupying a bucket belongs there. When inserting a new key, if the bucket it belongs to is occupied by a key that does not belong there, then the occupying key is evicted and the new key takes the bucket. * A 4-bit fragment of each key's hash code is also stored. * The aforementioned metadata associated with each bucket (the 4-bit hash fragment, the 1-bit flag, and the 11-bit link to the next key in the chain) are stored together in a uint16_t array rather than in the bucket alongside the key and (optionally) the value. One way to conceptualize this scheme is as a chained hash table in which overflowing keys are stored not in separate memory allocations but in otherwise unused buckets. In this regard, it shares similarities with Malte Skarupke's Bytell hash table (https://www.youtube.com/watch?v=M2fKMP47slQ) and traditional "coalesced hashing". Advantages of this scheme include: * Fast lookups impervious to load factor: If the table contains any key belonging to the lookup key's home bucket, then that bucket contains the first in a traversable chain of all keys belonging to it. Hence, only the home bucket and other buckets containing keys belonging to it are ever probed. Moreover, the stored hash fragments allow skipping most non-matching keys in the chain without accessing the actual buckets array or calling the (potentially expensive) key comparison function. * Fast insertions: Insertions are faster than they are in other schemes that move keys around (e.g. Robin Hood) because they only move, at most, one existing key. * Fast, tombstone-free deletions: Deletions, which usually require tombstones in quadratic-probing hash tables, are tombstone-free and only move, at most, one existing key. * Fast iteration: The separate metadata array allows keys in sparsely populated tables to be found without incurring the frequent cache misses that would result from traversing the buckets array. Usage example: +---------------------------------------------------------+----------------------------------------------------------+ | Using the generic macro API (C11 and later): | Using the prefixed functions API (C99 and later): | +---------------------------------------------------------+----------------------------------------------------------+ | #include | #include | | | | | // Instantiating a set template. | // Instantiating a set template. | | #define NAME int_set | #define NAME int_set | | #define KEY_TY int | #define KEY_TY int | | #include "verstable.h" | #define HASH_FN vt_hash_integer | | | #define CMPR_FN vt_cmpr_integer | | // Instantiating a map template. | #include "verstable.h" | | #define NAME int_int_map | | | #define KEY_TY int | // Instantiating a map template. | | #define VAL_TY int | #define NAME int_int_map | | #include "verstable.h" | #define KEY_TY int | | | #define VAL_TY int | | int main( void ) | #define HASH_FN vt_hash_integer | | { | #define CMPR_FN vt_cmpr_integer | | // Set. | #include "verstable.h" | | | | | int_set our_set; | int main( void ) | | vt_init( &our_set ); | { | | | // Set. | | // Inserting keys. | | | for( int i = 0; i < 10; ++i ) | int_set our_set; | | { | int_set_init( &our_set ); | | int_set_itr itr = vt_insert( &our_set, i ); | | | if( vt_is_end( itr ) ) | // Inserting keys. | | { | for( int i = 0; i < 10; ++i ) | | // Out of memory, so abort. | { | | vt_cleanup( &our_set ); | int_set_itr itr = | | return 1; | int_set_insert( &our_set, i ); | | } | if( int_set_is_end( itr ) ) | | } | { | | | // Out of memory, so abort. | | // Erasing keys. | int_set_cleanup( &our_set ); | | for( int i = 0; i < 10; i += 3 ) | return 1; | | vt_erase( &our_set, i ); | } | | | } | | // Retrieving keys. | | | for( int i = 0; i < 10; ++i ) | // Erasing keys. | | { | for( int i = 0; i < 10; i += 3 ) | | int_set_itr itr = vt_get( &our_set, i ); | int_set_erase( &our_set, i ); | | if( !vt_is_end( itr ) ) | | | printf( "%d ", itr.data->key ); | // Retrieving keys. | | } | for( int i = 0; i < 10; ++i ) | | // Printed: 1 2 4 5 7 8 | { | | | int_set_itr itr = int_set_get( &our_set, i ); | | // Iteration. | if( !int_set_is_end( itr ) ) | | for( | printf( "%d ", itr.data->key ); | | int_set_itr itr = vt_first( &our_set ); | } | | !vt_is_end( itr ); | // Printed: 1 2 4 5 7 8 | | itr = vt_next( itr ) | | | ) | // Iteration. | | printf( "%d ", itr.data->key ); | for( | | // Printed: 2 4 7 1 5 8 | int_set_itr itr = | | | int_set_first( &our_set ); | | vt_cleanup( &our_set ); | !int_set_is_end( itr ); | | | itr = int_set_next( itr ) | | // Map. | ) | | | printf( "%d ", itr.data->key ); | | int_int_map our_map; | // Printed: 2 4 7 1 5 8 | | vt_init( &our_map ); | | | | int_set_cleanup( &our_set ); | | // Inserting keys and values. | | | for( int i = 0; i < 10; ++i ) | // Map. | | { | | | int_int_map_itr itr = | int_int_map our_map; | | vt_insert( &our_map, i, i + 1 ); | int_int_map_init( &our_map ); | | if( vt_is_end( itr ) ) | | | { | // Inserting keys and values. | | // Out of memory, so abort. | for( int i = 0; i < 10; ++i ) | | vt_cleanup( &our_map ); | { | | return 1; | int_int_map_itr itr = | | } | int_int_map_insert( &our_map, i, i + 1 ); | | } | if( int_int_map_is_end( itr ) ) | | | { | | // Erasing keys and values. | // Out of memory, so abort. | | for( int i = 0; i < 10; i += 3 ) | int_int_map_cleanup( &our_map ); | | vt_erase( &our_map, i ); | return 1; | | | } | | // Retrieving keys and values. | } | | for( int i = 0; i < 10; ++i ) | | | { | // Erasing keys and values. | | int_int_map_itr itr = vt_get( &our_map, i ); | for( int i = 0; i < 10; i += 3 ) | | if( !vt_is_end( itr ) ) | int_int_map_erase( &our_map, i ); | | printf( | | | "%d:%d ", | // Retrieving keys and values. | | itr.data->key, | for( int i = 0; i < 10; ++i ) | | itr.data->val | { | | ); | int_int_map_itr itr = | | } | int_int_map_get( &our_map, i ); | | // Printed: 1:2 2:3 4:5 5:6 7:8 8:9 | if( !int_int_map_is_end( itr ) ) | | | printf( | | // Iteration. | "%d:%d ", | | for( | itr.data->key, | | int_int_map_itr itr = vt_first( &our_map ); | itr.data->val | | !vt_is_end( itr ); | ); | | itr = vt_next( itr ) | } | | ) | // Printed: 1:2 2:3 4:5 5:6 7:8 8:9 | | printf( | | | "%d:%d ", | // Iteration. | | itr.data->key, | for( | | itr.data->val | int_int_map_itr itr = | | ); | int_int_map_first( &our_map ); | | // Printed: 2:3 4:5 7:8 1:2 5:6 8:9 | !int_int_map_is_end( itr ); | | | itr = int_int_map_next( itr ) | | vt_cleanup( &our_map ); | ) | | } | printf( | | | "%d:%d ", | | | itr.data->key, | | | itr.data->val | | | ); | | | // Printed: 2:3 4:5 7:8 1:2 5:6 8:9 | | | | | | int_int_map_cleanup( &our_map ); | | | } | | | | +---------------------------------------------------------+----------------------------------------------------------+ API: Instantiating a hash table template: Create a new hash table type in the following manner: #define NAME #define KEY_TY #include "verstable.h" The NAME macro specifies the name of hash table type that the library will declare, the prefix for the functions associated with it, and the prefix for the associated iterator type. The KEY_TY macro specifies the key type. In C99, it is also always necessary to define HASH_FN and CMPR_FN (see below) before including the header. The following macros may also be defined before including the header: #define VAL_TY The type of the value associated with each key. If this macro is defined, the hash table acts as a map associating keys with values. Otherwise, it acts as a set containing only keys. #define HASH_FN The name of the existing function used to hash each key. The function should have the signature uint64_t ( KEY_TY key ) and return a 64-bit hash code. For best performance, the hash function should provide a high level of entropy across all bits. There are two default hash functions: vt_hash_integer for all integer types up to 64 bits in size, and vt_hash_string for NULL-terminated strings (i.e. char *). When KEY_TY is one of such types and the compiler is in C11 mode or later, HASH_FN may be left undefined, in which case the appropriate default function is inferred from KEY_TY. Otherwise, HASH_FN must be defined. #define CMPR_FN The name of the existing function used to compare two keys. The function should have the signature bool ( KEY_TY key_1, KEY_TY key_2 ) and return true if the two keys are equal. There are two default comparison functions: vt_cmpr_integer for all integer types up to 64 bits in size, and vt_cmpr_string for NULL-terminated strings (i.e. char *). As with the default hash functions, in C11 or later the appropriate default comparison function is inferred if KEY_TY is one of such types and CMPR_FN is left undefined. Otherwise, CMPR_FN must be defined. #define MAX_LOAD The floating-point load factor at which the hash table automatically doubles the size of its internal buckets array. The default is 0.9, i.e. 90%. #define KEY_DTOR_FN The name of the existing destructor function, with the signature void ( KEY_TY key ), called on a key when it is erased from the table or replaced by a newly inserted key. The API functions that may call the key destructor are NAME_insert, NAME_erase, NAME_erase_itr, NAME_clear, and NAME_cleanup. #define VAL_DTOR_FN The name of the existing destructor function, with the signature void ( VAL_TY val ), called on a value when it is erased from the table or replaced by a newly inserted value. The API functions that may call the value destructor are NAME_insert, NAME_erase, NAME_erase_itr, NAME_clear, and NAME_cleanup. #define CTX_TY The type of the hash table type's ctx (context) member. This member only exists if CTX_TY was defined. It is intended to be used in conjunction with MALLOC_FN and FREE_FN (see below). #define MALLOC_FN The name of the existing function used to allocate memory. If CTX_TY was defined, the signature should be void *( size_t size, CTX_TY *ctx ), where size is the number of bytes to allocate and ctx points to the table's ctx member. Otherwise, the signature should be void *( size_t size ). The default wraps stdlib.h's malloc. #define FREE_FN The name of the existing function used to free memory. If CTX_TY was defined, the signature should be void ( void *ptr, size_t size, CTX_TY *ctx ), where ptr points to the memory to free, size is the number of bytes that were allocated, and ctx points to the table's ctx member. Otherwise, the signature should be void ( void *ptr, size_t size ). The default wraps stdlib.h's free. #define HEADER_MODE #define IMPLEMENTATION_MODE By default, all hash table functions are defined as static inline functions, the intent being that a given hash table template should be instantiated once per translation unit; for best performance, this is the recommended way to use the library. However, it is also possible to separate the struct definitions and function declarations from the function definitions such that one implementation can be shared across all translation units (as in a traditional header and source file pair). In that case, instantiate a template wherever it is needed by defining HEADER_MODE, along with only NAME, KEY_TY, and (optionally) VAL_TY, CTX_TY, and header guards, and including the library, e.g.: #ifndef INT_INT_MAP_H #define INT_INT_MAP_H #define NAME int_int_map #define KEY_TY int #define VAL_TY int #define HEADER_MODE #include "verstable.h" #endif In one source file, define IMPLEMENTATION_MODE, along with NAME, KEY_TY, and any of the aforementioned optional macros, and include the library, e.g.: #define NAME int_int_map #define KEY_TY int #define VAL_TY int #define HASH_FN vt_hash_integer // C99. #define CMPR_FN vt_cmpr_integer // C99. #define MAX_LOAD 0.8 #define IMPLEMENTATION_MODE #include "verstable.h" Including the library automatically undefines all the aforementioned macros after they have been used to instantiate the template. Functions: The functions associated with a hash table type are all prefixed with the name the user supplied via the NAME macro. In C11 and later, the generic "vt_"-prefixed macros may be used to automatically select the correct version of the specified function based on the arguments. void NAME_init( NAME *table ) void NAME_init( NAME *table, CTX_TY ctx ) // C11 generic macro: vt_init. Initializes the table for use. If CTX_TY was defined, ctx sets the table's ctx member. bool NAME_init_clone( NAME *table, NAME *source ) bool NAME_init_clone( NAME *table, NAME *source, CTX_TY ctx ) // C11 generic macro: vt_init_clone. Initializes the table as a shallow copy of the specified source table. If CTX_TY was defined, ctx sets the table's ctx member. Returns false in the case of memory allocation failure. size_t NAME_size( NAME *table ) // C11 generic macro: vt_size. Returns the number of keys currently in the table. size_t NAME_bucket_count( NAME *table ) // C11 generic macro: vt_bucket_count. Returns the table's current bucket count. NAME_itr NAME_insert( NAME *table, KEY_TY key ) NAME_itr NAME_insert( NAME *table, KEY_TY key, VAL_TY val ) // C11 generic macro: vt_insert. Inserts the specified key (and value, if VAL_TY was defined) into the hash table. If the same key already exists, then the new key (and value) replaces the existing key (and value). Returns an iterator to the new key, or an end iterator in the case of memory allocation failure. NAME_itr NAME_get_or_insert( NAME *table, KEY_TY key ) NAME_itr NAME_get_or_insert( NAME *table, KEY_TY key, VAL_TY val ) // C11 generic macro: vt_get_or_insert. Inserts the specified key (and value, if VAL_TY was defined) if it does not already exist in the table. Returns an iterator to the new key if it was inserted, or an iterator to the existing key, or an end iterator if the key did not exist but the new key could not be inserted because of memory allocation failure. Determine whether the key was inserted by comparing the table's size before and after the call. NAME_itr NAME_get( NAME *table, KEY_TY key ) // C11 generic macro: vt_get. Returns a iterator to the specified key, or an end iterator if no such key exists. bool NAME_erase( NAME *table, KEY_TY key ) // C11 generic macro: vt_erase. Erases the specified key (and associated value, if VAL_TY was defined), if it exists. Returns true if a key was erased. NAME_itr NAME_erase_itr( NAME *table, NAME_itr itr ) // C11 generic macro: vt_erase_itr. Erases the key (and associated value, if VAL_TY was defined) pointed to by the specified iterator. Returns an iterator to the next key in the table, or an end iterator if the erased key was the last one. bool NAME_reserve( NAME *table, size_t size ) // C11 generic macro: vt_reserve. Ensures that the bucket count is large enough to support the specified key count (i.e. size) without rehashing. Returns false if unsuccessful due to memory allocation failure. bool NAME_shrink( NAME *table ) // C11 generic macro: vt_shrink. Shrinks the bucket count to best accommodate the current size. Returns false if unsuccessful due to memory allocation failure. NAME_itr NAME_first( NAME *table ) // C11 generic macro: vt_first. Returns an iterator to the first key in the table, or an end iterator if the table is empty. bool NAME_is_end( NAME_itr itr ) // C11 generic macro: vt_is_end. Returns true if the iterator is an end iterator. NAME_itr NAME_next( NAME_itr itr ) // C11 generic macro: vt_next. Returns an iterator to the key after the one pointed to by the specified iterator, or an end iterator if the specified iterator points to the last key in the table. void NAME_clear( NAME *table ) // C11 generic macro: vt_clear. Erases all keys (and values, if VAL_TY was defined) in the table. void NAME_cleanup( NAME *table ) // C11 generic macro: vt_cleanup. Erases all keys (and values, if VAL_TY was defined) in the table, frees all memory associated with it, and initializes it for reuse. Iterators: Access the key (and value, if VAL_TY was defined) that an iterator points to using the NAME_itr struct's data member: itr.data->key itr.data->val Functions that may insert new keys (NAME_insert and NAME_get_or_insert), erase keys (NAME_erase and NAME_erase_itr), or reallocate the internal bucket array (NAME_reserve and NAME_shrink) invalidate all existing iterators. To delete keys during iteration and resume iterating, use the return value of NAME_erase_itr. Version history: 06/05/2025 2.2.1: Fixed incorrect signature of NAME_is_end in documentation. 18/04/2025 2.2.0: Added const qualifier to the table parameter of NAME_size, NAME_bucket_count, NAME_get, and NAME_first and to the source parameter of NAME_init_clone. Added default support for const char * strings. Added support for -Wextra. Replaced FNV-1a with Wyhash as the default string hash function. 18/06/2024 2.1.1: Fixed a bug affecting iteration on big-endian platforms under MSVC. 27/05/2024 2.1.0: Replaced the Murmur3 mixer with the fast-hash mixer as the default integer hash function. Fixed a bug that could theoretically cause a crash on rehash (triggerable in testing using NAME_shrink with a maximum load factor significantly higher than 1.0). 06/02/2024 2.0.0: Improved custom allocator support by introducing the CTX_TY option and allowing user-supplied free functions to receive the allocation size. Improved documentation. Introduced various optimizations, including storing the buckets-array size mask instead of the bucket count, eliminating empty-table checks, combining the buckets memory and metadata memory into one allocation, and adding branch prediction macros. Fixed a bug that caused a key to be used after destruction during erasure. 12/12/2023 1.0.0: Initial release. License (MIT): Copyright (c) 2023-2025 Jackson L. Allan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*--------------------------------------------------------------------------------------------------------------------*/ /* Common header section */ /*--------------------------------------------------------------------------------------------------------------------*/ #ifndef VERSTABLE_H #define VERSTABLE_H #include #include #include #include #include #include // Two-way concatenation macro. #define VT_CAT_( a, b ) a##b #define VT_CAT( a, b ) VT_CAT_( a, b ) // Branch optimization macros. #ifdef __GNUC__ #define VT_LIKELY( expression ) __builtin_expect( (bool)( expression ), true ) #define VT_UNLIKELY( expression ) __builtin_expect( (bool)( expression ), false ) #else #define VT_LIKELY( expression ) ( expression ) #define VT_UNLIKELY( expression ) ( expression ) #endif // Masks for manipulating and extracting data from a bucket's uint16_t metadatum. #define VT_EMPTY 0x0000 #define VT_HASH_FRAG_MASK 0xF000 // 0b1111000000000000. #define VT_IN_HOME_BUCKET_MASK 0x0800 // 0b0000100000000000. #define VT_DISPLACEMENT_MASK 0x07FF // 0b0000011111111111, also denotes the displacement limit. Set to VT_LOAD to 1.0 // to test proper handling of encroachment on the displacement limit during // inserts. // Extracts a hash fragment from a uint64_t hash code. // We take the highest four bits so that keys that map (via modulo) to the same bucket have distinct hash fragments. static inline uint16_t vt_hashfrag( uint64_t hash ) { return ( hash >> 48 ) & VT_HASH_FRAG_MASK; } // Standard quadratic probing formula that guarantees that all buckets are visited when the bucket count is a power of // two (at least in theory, because the displacement limit could terminate the search early when the bucket count is // high). static inline size_t vt_quadratic( uint16_t displacement ) { return ( (size_t)displacement * displacement + displacement ) / 2; } #define VT_MIN_NONZERO_BUCKET_COUNT 8 // Must be a power of two. // Function to find the left-most non-zero uint16_t in a uint64_t. // This function is used when we scan four buckets at a time while iterating and relies on compiler intrinsics wherever // possible. #if defined( __GNUC__ ) && ULLONG_MAX == 0xFFFFFFFFFFFFFFFF static inline int vt_first_nonzero_uint16( uint64_t val ) { const uint16_t endian_checker = 0x0001; if( *(const char *)&endian_checker ) // Little-endian (the compiler will optimize away the check at -O1 and above). return __builtin_ctzll( val ) / 16; return __builtin_clzll( val ) / 16; } #elif defined( _MSC_VER ) && ( defined( _M_X64 ) || defined( _M_ARM64 ) ) #include #pragma intrinsic(_BitScanForward64) #pragma intrinsic(_BitScanReverse64) static inline int vt_first_nonzero_uint16( uint64_t val ) { unsigned long result; const uint16_t endian_checker = 0x0001; if( *(const char *)&endian_checker ) _BitScanForward64( &result, val ); else { _BitScanReverse64( &result, val ); result = 63 - result; } return result / 16; } #else static inline int vt_first_nonzero_uint16( uint64_t val ) { int result = 0; uint32_t half; memcpy( &half, &val, sizeof( uint32_t ) ); if( !half ) result += 2; uint16_t quarter; memcpy( &quarter, (char *)&val + result * sizeof( uint16_t ), sizeof( uint16_t ) ); if( !quarter ) result += 1; return result; } #endif // When the bucket count is zero, setting the metadata pointer to point to a VT_EMPTY placeholder, rather than NULL, // allows us to avoid checking for a zero bucket count during insertion and lookup. static const uint16_t vt_empty_placeholder_metadatum = VT_EMPTY; // Default hash and comparison functions. // Fast-hash, as described by https://jonkagstrom.com/bit-mixer-construction and // https://code.google.com/archive/p/fast-hash. // In testing, this hash function provided slightly better performance than the Murmur3 mixer. static inline uint64_t vt_hash_integer( uint64_t key ) { key ^= key >> 23; key *= 0x2127599bf4325c37ull; key ^= key >> 47; return key; } // For hashing strings, we use the public-domain Wyhash // (https://github.com/wangyi-fudan/wyhash) with the following modifications: // * We use a fixed seed and secret (the defaults suggested in the Wyhash repository). // * We do not handle endianness, so the result will differ depending on the platform. // * We omit the code optimized for 32-bit platforms. static inline void vt_wymum( uint64_t *a, uint64_t *b ) { #if defined( __SIZEOF_INT128__ ) __uint128_t r = *a; r *= *b; *a = (uint64_t)r; *b = (uint64_t)( r >> 64 ); #elif defined( _MSC_VER ) && defined( _M_X64 ) *a = _umul128( *a, *b, b ); #else uint64_t ha = *a >> 32; uint64_t hb = *b >> 32; uint64_t la = (uint32_t)*a; uint64_t lb = (uint32_t)*b; uint64_t rh = ha * hb; uint64_t rm0 = ha * lb; uint64_t rm1 = hb * la; uint64_t rl = la * lb; uint64_t t = rl + ( rm0 << 32 ); uint64_t c = t < rl; uint64_t lo = t + ( rm1 << 32 ); c += lo < t; uint64_t hi = rh + ( rm0 >> 32 ) + ( rm1 >> 32 ) + c; *a = lo; *b = hi; #endif } static inline uint64_t vt_wymix( uint64_t a, uint64_t b ) { vt_wymum( &a, &b ); return a ^ b; } static inline uint64_t vt_wyr8( const unsigned char *p ) { uint64_t v; memcpy( &v, p, 8 ); return v; } static inline uint64_t vt_wyr4( const unsigned char *p ) { uint32_t v; memcpy( &v, p, 4 ); return v; } static inline uint64_t vt_wyr3( const unsigned char *p, size_t k ) { return ( ( (uint64_t)p[ 0 ] ) << 16 ) | ( ( (uint64_t)p[ k >> 1 ] ) << 8 ) | p[ k - 1 ]; } static inline size_t vt_wyhash( const void *key, size_t len ) { const unsigned char *p = (const unsigned char *)key; uint64_t seed = 0xca813bf4c7abf0a9ull; uint64_t a; uint64_t b; if( VT_LIKELY( len <= 16 ) ) { if( VT_LIKELY( len >= 4 ) ) { a = ( vt_wyr4( p ) << 32 ) | vt_wyr4( p + ( ( len >> 3 ) << 2 ) ); b = ( vt_wyr4( p + len - 4 ) << 32 ) | vt_wyr4( p + len - 4 - ( ( len >> 3 ) << 2 ) ); } else if( VT_LIKELY( len > 0 ) ) { a = vt_wyr3( p, len ); b = 0; } else { a = 0; b = 0; } } else { size_t i = len; if( VT_UNLIKELY( i >= 48 ) ) { uint64_t see1 = seed; uint64_t see2 = seed; do{ seed = vt_wymix( vt_wyr8( p ) ^ 0x8bb84b93962eacc9ull, vt_wyr8( p + 8 ) ^ seed ); see1 = vt_wymix( vt_wyr8( p + 16 ) ^ 0x4b33a62ed433d4a3ull, vt_wyr8( p + 24 ) ^ see1 ); see2 = vt_wymix( vt_wyr8( p + 32 ) ^ 0x4d5a2da51de1aa47ull, vt_wyr8( p + 40 ) ^ see2 ); p += 48; i -= 48; } while( VT_LIKELY( i >= 48 ) ); seed ^= see1 ^ see2; } while( VT_UNLIKELY( i > 16 ) ) { seed = vt_wymix( vt_wyr8( p ) ^ 0x8bb84b93962eacc9ull, vt_wyr8( p + 8 ) ^ seed ); i -= 16; p += 16; } a = vt_wyr8( p + i - 16 ); b = vt_wyr8( p + i - 8 ); } a ^= 0x8bb84b93962eacc9ull; b ^= seed; vt_wymum( &a, &b ); return (size_t)vt_wymix( a ^ 0x2d358dccaa6c78a5ull ^ len, b ^ 0x8bb84b93962eacc9ull ); } static inline uint64_t vt_hash_string( const char *key ) { return vt_wyhash( key, strlen( key ) ); } static inline bool vt_cmpr_integer( uint64_t key_1, uint64_t key_2 ) { return key_1 == key_2; } static inline bool vt_cmpr_string( const char *key_1, const char *key_2 ) { return strcmp( key_1, key_2 ) == 0; } // Default allocation and free functions. static inline void *vt_malloc( size_t size ) { return malloc( size ); } static inline void vt_free( void *ptr, size_t size ) { (void)size; free( ptr ); } static inline void *vt_malloc_with_ctx( size_t size, void *ctx ) { (void)ctx; return malloc( size ); } static inline void vt_free_with_ctx( void *ptr, size_t size, void *ctx ) { (void)size; (void)ctx; free( ptr ); } // The rest of the common header section pertains to the C11 generic macro API. // This interface is based on the extendible-_Generic mechanism documented in detail at // https://github.com/JacksonAllan/CC/blob/main/articles/Better_C_Generics_Part_1_The_Extendible_Generic.md. // In summary, instantiating a template also defines wrappers for the template's types and functions with names in the // pattern of vt_table_NNNN and vt_init_NNNN, where NNNN is an automatically generated integer unique to the template // instance in the current translation unit. // These wrappers plug into _Generic-based API macros, which use preprocessor magic to automatically generate _Generic // slots for every existing template instance. #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined( VT_NO_C11_GENERIC_API ) // Octal counter that supports up to 511 hash table templates. #define VT_TEMPLATE_COUNT_D1 0 // Digit 1, i.e. least significant digit. #define VT_TEMPLATE_COUNT_D2 0 #define VT_TEMPLATE_COUNT_D3 0 // Four-way concatenation macro. #define VT_CAT_4_( a, b, c, d ) a##b##c##d #define VT_CAT_4( a, b, c, d ) VT_CAT_4_( a, b, c, d ) // Provides the current value of the counter as a three-digit octal number preceded by 0. #define VT_TEMPLATE_COUNT VT_CAT_4( 0, VT_TEMPLATE_COUNT_D3, VT_TEMPLATE_COUNT_D2, VT_TEMPLATE_COUNT_D1 ) // _Generic-slot generation macros. #define VT_GENERIC_SLOT( ty, fn, n ) , VT_CAT( ty, n ): VT_CAT( fn, n ) #define VT_R1_0( ty, fn, d3, d2 ) #define VT_R1_1( ty, fn, d3, d2 ) VT_GENERIC_SLOT( ty, fn, VT_CAT_4( 0, d3, d2, 0 ) ) #define VT_R1_2( ty, fn, d3, d2 ) VT_GENERIC_SLOT( ty, fn, VT_CAT_4( 0, d3, d2, 1 ) ) VT_R1_1( ty, fn, d3, d2 ) #define VT_R1_3( ty, fn, d3, d2 ) VT_GENERIC_SLOT( ty, fn, VT_CAT_4( 0, d3, d2, 2 ) ) VT_R1_2( ty, fn, d3, d2 ) #define VT_R1_4( ty, fn, d3, d2 ) VT_GENERIC_SLOT( ty, fn, VT_CAT_4( 0, d3, d2, 3 ) ) VT_R1_3( ty, fn, d3, d2 ) #define VT_R1_5( ty, fn, d3, d2 ) VT_GENERIC_SLOT( ty, fn, VT_CAT_4( 0, d3, d2, 4 ) ) VT_R1_4( ty, fn, d3, d2 ) #define VT_R1_6( ty, fn, d3, d2 ) VT_GENERIC_SLOT( ty, fn, VT_CAT_4( 0, d3, d2, 5 ) ) VT_R1_5( ty, fn, d3, d2 ) #define VT_R1_7( ty, fn, d3, d2 ) VT_GENERIC_SLOT( ty, fn, VT_CAT_4( 0, d3, d2, 6 ) ) VT_R1_6( ty, fn, d3, d2 ) #define VT_R1_8( ty, fn, d3, d2 ) VT_GENERIC_SLOT( ty, fn, VT_CAT_4( 0, d3, d2, 7 ) ) VT_R1_7( ty, fn, d3, d2 ) #define VT_R2_0( ty, fn, d3 ) #define VT_R2_1( ty, fn, d3 ) VT_R1_8( ty, fn, d3, 0 ) #define VT_R2_2( ty, fn, d3 ) VT_R1_8( ty, fn, d3, 1 ) VT_R2_1( ty, fn, d3 ) #define VT_R2_3( ty, fn, d3 ) VT_R1_8( ty, fn, d3, 2 ) VT_R2_2( ty, fn, d3 ) #define VT_R2_4( ty, fn, d3 ) VT_R1_8( ty, fn, d3, 3 ) VT_R2_3( ty, fn, d3 ) #define VT_R2_5( ty, fn, d3 ) VT_R1_8( ty, fn, d3, 4 ) VT_R2_4( ty, fn, d3 ) #define VT_R2_6( ty, fn, d3 ) VT_R1_8( ty, fn, d3, 5 ) VT_R2_5( ty, fn, d3 ) #define VT_R2_7( ty, fn, d3 ) VT_R1_8( ty, fn, d3, 6 ) VT_R2_6( ty, fn, d3 ) #define VT_R2_8( ty, fn, d3 ) VT_R1_8( ty, fn, d3, 7 ) VT_R2_7( ty, fn, d3 ) #define VT_R3_0( ty, fn ) #define VT_R3_1( ty, fn ) VT_R2_8( ty, fn, 0 ) #define VT_R3_2( ty, fn ) VT_R2_8( ty, fn, 1 ) VT_R3_1( ty, fn ) #define VT_R3_3( ty, fn ) VT_R2_8( ty, fn, 2 ) VT_R3_2( ty, fn ) #define VT_R3_4( ty, fn ) VT_R2_8( ty, fn, 3 ) VT_R3_3( ty, fn ) #define VT_R3_5( ty, fn ) VT_R2_8( ty, fn, 4 ) VT_R3_4( ty, fn ) #define VT_R3_6( ty, fn ) VT_R2_8( ty, fn, 5 ) VT_R3_5( ty, fn ) #define VT_R3_7( ty, fn ) VT_R2_8( ty, fn, 6 ) VT_R3_6( ty, fn ) #define VT_GENERIC_SLOTS( ty, fn ) \ VT_CAT( VT_R1_, VT_TEMPLATE_COUNT_D1 )( ty, fn, VT_TEMPLATE_COUNT_D3, VT_TEMPLATE_COUNT_D2 ) \ VT_CAT( VT_R2_, VT_TEMPLATE_COUNT_D2 )( ty, fn, VT_TEMPLATE_COUNT_D3 ) \ VT_CAT( VT_R3_, VT_TEMPLATE_COUNT_D3 )( ty, fn ) \ // Actual generic API macros. // vt_init must be handled as a special case because it could take one or two arguments, depending on whether CTX_TY // was defined. #define VT_ARG_3( _1, _2, _3, ... ) _3 #define vt_init( ... ) VT_ARG_3( __VA_ARGS__, vt_init_with_ctx, vt_init_without_ctx, )( __VA_ARGS__ ) #define vt_init_without_ctx( table ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_init_ ) )( table ) #define vt_init_with_ctx( table, ... ) _Generic( *( table ) \ VT_GENERIC_SLOTS( vt_table_, vt_init_ ) \ )( table, __VA_ARGS__ ) \ #define vt_init_clone( table, ... ) _Generic( *( table ) \ VT_GENERIC_SLOTS( vt_table_, vt_init_clone_ ) \ )( table, __VA_ARGS__ ) \ #define vt_size( table )_Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_size_ ) )( table ) #define vt_bucket_count( table ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_bucket_count_ ) )( table ) #define vt_is_end( itr ) _Generic( itr VT_GENERIC_SLOTS( vt_table_itr_, vt_is_end_ ) )( itr ) #define vt_insert( table, ... ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_insert_ ) )( table, __VA_ARGS__ ) #define vt_get_or_insert( table, ... ) _Generic( *( table ) \ VT_GENERIC_SLOTS( vt_table_, vt_get_or_insert_ ) \ )( table, __VA_ARGS__ ) \ #define vt_get( table, ... ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_get_ ) )( table, __VA_ARGS__ ) #define vt_erase( table, ... ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_erase_ ) )( table, __VA_ARGS__ ) #define vt_next( itr ) _Generic( itr VT_GENERIC_SLOTS( vt_table_itr_, vt_next_ ) )( itr ) #define vt_erase_itr( table, ... ) _Generic( *( table ) \ VT_GENERIC_SLOTS( vt_table_, vt_erase_itr_ ) \ )( table, __VA_ARGS__ ) \ #define vt_reserve( table, ... ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_reserve_ ) )( table, __VA_ARGS__ ) #define vt_shrink( table ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_shrink_ ) )( table ) #define vt_first( table ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_first_ ) )( table ) #define vt_clear( table ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_clear_ ) )( table ) #define vt_cleanup( table ) _Generic( *( table ) VT_GENERIC_SLOTS( vt_table_, vt_cleanup_ ) )( table ) #endif #endif /*--------------------------------------------------------------------------------------------------------------------*/ /* Prefixed structs */ /*--------------------------------------------------------------------------------------------------------------------*/ #ifndef IMPLEMENTATION_MODE typedef struct { KEY_TY key; #ifdef VAL_TY VAL_TY val; #endif } VT_CAT( NAME, _bucket ); typedef struct { VT_CAT( NAME, _bucket ) *data; uint16_t *metadatum; uint16_t *metadata_end; // Iterators carry an internal end pointer so that NAME_is_end does not need the table to be // passed in as an argument. // This also allows for the zero-bucket-count check to occur once in NAME_first, rather than // repeatedly in NAME_is_end. size_t home_bucket; // SIZE_MAX if home bucket is unknown. } VT_CAT( NAME, _itr ); typedef struct { size_t key_count; size_t buckets_mask; // Rather than storing the bucket count directly, we store the bit mask used to reduce a hash // code or displacement-derived bucket index to the buckets array, i.e. the bucket count minus // one. // Consequently, a zero bucket count (i.e. when .metadata points to the placeholder) constitutes // a special case, represented by all bits unset (i.e. zero). VT_CAT( NAME, _bucket ) *buckets; uint16_t *metadata; // As described above, each metadatum consists of a 4-bit hash-code fragment (X), a 1-bit flag // indicating whether the key in this bucket begins a chain associated with the bucket (Y), and // an 11-bit value indicating the quadratic displacement of the next key in the chain (Z): // XXXXYZZZZZZZZZZZ. #ifdef CTX_TY CTX_TY ctx; #endif } NAME; #endif /*--------------------------------------------------------------------------------------------------------------------*/ /* Function prototypes */ /*--------------------------------------------------------------------------------------------------------------------*/ #if defined( HEADER_MODE ) || defined( IMPLEMENTATION_MODE ) #define VT_API_FN_QUALIFIERS #else #define VT_API_FN_QUALIFIERS static inline #endif #ifndef IMPLEMENTATION_MODE VT_API_FN_QUALIFIERS void VT_CAT( NAME, _init )( NAME * #ifdef CTX_TY , CTX_TY #endif ); VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _init_clone )( NAME *, const NAME * #ifdef CTX_TY , CTX_TY #endif ); VT_API_FN_QUALIFIERS size_t VT_CAT( NAME, _size )( const NAME * ); VT_API_FN_QUALIFIERS size_t VT_CAT( NAME, _bucket_count )( const NAME * ); VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _is_end )( VT_CAT( NAME, _itr ) ); VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _insert )( NAME *, KEY_TY #ifdef VAL_TY , VAL_TY #endif ); VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _get_or_insert )( NAME *, KEY_TY #ifdef VAL_TY , VAL_TY #endif ); VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _get )( const NAME *table, KEY_TY key ); VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _erase )( NAME *, KEY_TY ); VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _next )( VT_CAT( NAME, _itr ) ); VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _reserve )( NAME *, size_t ); VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _shrink )( NAME * ); VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _first )( const NAME * ); VT_API_FN_QUALIFIERS void VT_CAT( NAME, _clear )( NAME * ); VT_API_FN_QUALIFIERS void VT_CAT( NAME, _cleanup )( NAME * ); // Not an API function, but must be prototyped anyway because it is called by the inline NAME_erase_itr below. VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _erase_itr_raw ) ( NAME *, VT_CAT( NAME, _itr ) ); // Erases the key pointed to by itr and returns an iterator to the next key in the table. // This function must be inlined to ensure that the compiler optimizes away the NAME_fast_forward call if the returned // iterator is discarded. #ifdef __GNUC__ static inline __attribute__((always_inline)) #elif defined( _MSC_VER ) static __forceinline #else static inline #endif VT_CAT( NAME, _itr ) VT_CAT( NAME, _erase_itr )( NAME *table, VT_CAT( NAME, _itr ) itr ) { if( VT_CAT( NAME, _erase_itr_raw )( table, itr ) ) return VT_CAT( NAME, _next )( itr ); return itr; } #endif /*--------------------------------------------------------------------------------------------------------------------*/ /* Function implementations */ /*--------------------------------------------------------------------------------------------------------------------*/ #ifndef HEADER_MODE // Default settings. #ifndef MAX_LOAD #define MAX_LOAD 0.9 #endif #ifndef MALLOC_FN #ifdef CTX_TY #define MALLOC_FN vt_malloc_with_ctx #else #define MALLOC_FN vt_malloc #endif #endif #ifndef FREE_FN #ifdef CTX_TY #define FREE_FN vt_free_with_ctx #else #define FREE_FN vt_free #endif #endif #ifndef HASH_FN #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #ifdef _MSC_VER // In MSVC, the compound literal in the _Generic triggers a warning about unused local variables at /W4. #define HASH_FN \ _Pragma( "warning( push )" ) \ _Pragma( "warning( disable: 4189 )" ) \ _Generic( ( KEY_TY ){ 0 }, char *: vt_hash_string, const char*: vt_hash_string, default: vt_hash_integer ) \ _Pragma( "warning( pop )" ) #else #define HASH_FN _Generic( ( KEY_TY ){ 0 }, \ char *: vt_hash_string, \ const char*: vt_hash_string, \ default: vt_hash_integer \ ) #endif #else #error Hash function inference is only available in C11 and later. In C99, you need to define HASH_FN manually to \ vt_hash_integer, vt_hash_string, or your own custom function with the signature uint64_t ( KEY_TY ). #endif #endif #ifndef CMPR_FN #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #ifdef _MSC_VER #define CMPR_FN \ _Pragma( "warning( push )" ) \ _Pragma( "warning( disable: 4189 )" ) \ _Generic( ( KEY_TY ){ 0 }, char *: vt_cmpr_string, const char*: vt_cmpr_string, default: vt_cmpr_integer ) \ _Pragma( "warning( pop )" ) #else #define CMPR_FN _Generic( ( KEY_TY ){ 0 }, \ char *: vt_cmpr_string, \ const char*: vt_cmpr_string, \ default: vt_cmpr_integer \ ) #endif #else #error Comparison function inference is only available in C11 and later. In C99, you need to define CMPR_FN manually \ to vt_cmpr_integer, vt_cmpr_string, or your own custom function with the signature bool ( KEY_TY, KEY_TY ). #endif #endif VT_API_FN_QUALIFIERS void VT_CAT( NAME, _init )( NAME *table #ifdef CTX_TY , CTX_TY ctx #endif ) { table->key_count = 0; table->buckets_mask = 0x0000000000000000ull; table->buckets = NULL; table->metadata = (uint16_t *)&vt_empty_placeholder_metadatum; #ifdef CTX_TY table->ctx = ctx; #endif } // For efficiency, especially in the case of a small table, the buckets array and metadata share the same dynamic memory // allocation: // +-----------------------------+-----+----------------+--------+ // | Buckets | Pad | Metadata | Excess | // +-----------------------------+-----+----------------+--------+ // Any allocated metadata array requires four excess elements to ensure that iteration functions, which read four // metadata at a time, never read beyond the end of it. // This function returns the offset of the beginning of the metadata, i.e. the size of the buckets array plus the // (usually zero) padding. // It assumes that the bucket count is not zero. static inline size_t VT_CAT( NAME, _metadata_offset )( NAME *table ) { // Use sizeof, rather than alignof, for C99 compatibility. return ( ( ( table->buckets_mask + 1 ) * sizeof( VT_CAT( NAME, _bucket ) ) + sizeof( uint16_t ) - 1 ) / sizeof( uint16_t ) ) * sizeof( uint16_t ); } // Returns the total allocation size, including the buckets array, padding, metadata, and excess metadata. // As above, this function assumes that the bucket count is not zero. static inline size_t VT_CAT( NAME, _total_alloc_size )( NAME *table ) { return VT_CAT( NAME, _metadata_offset )( table ) + ( table->buckets_mask + 1 + 4 ) * sizeof( uint16_t ); } VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _init_clone )( NAME *table, const NAME *source #ifdef CTX_TY , CTX_TY ctx #endif ) { table->key_count = source->key_count; table->buckets_mask = source->buckets_mask; #ifdef CTX_TY table->ctx = ctx; #endif if( !source->buckets_mask ) { table->metadata = (uint16_t *)&vt_empty_placeholder_metadatum; table->buckets = NULL; return true; } void *allocation = MALLOC_FN( VT_CAT( NAME, _total_alloc_size )( table ) #ifdef CTX_TY , &table->ctx #endif ); if( VT_UNLIKELY( !allocation ) ) return false; table->buckets = (VT_CAT( NAME, _bucket ) *)allocation; table->metadata = (uint16_t *)( (unsigned char *)allocation + VT_CAT( NAME, _metadata_offset )( table ) ); memcpy( allocation, source->buckets, VT_CAT( NAME, _total_alloc_size )( table ) ); return true; } VT_API_FN_QUALIFIERS size_t VT_CAT( NAME, _size )( const NAME *table ) { return table->key_count; } VT_API_FN_QUALIFIERS size_t VT_CAT( NAME, _bucket_count )( const NAME *table ) { // If the bucket count is zero, buckets_mask will be zero, not the bucket count minus one. // We account for this special case by adding (bool)buckets_mask rather than one. return table->buckets_mask + (bool)table->buckets_mask; } VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _is_end )( VT_CAT( NAME, _itr ) itr ) { return itr.metadatum == itr.metadata_end; } // Finds the earliest empty bucket in which a key belonging to home_bucket can be placed, assuming that home_bucket // is already occupied. // The reason to begin the search at home_bucket, rather than the end of the existing chain, is that keys deleted from // other chains might have freed up buckets that could fall in this chain before the final key. // Returns true if an empty bucket within the range of the displacement limit was found, in which case the final two // pointer arguments contain the index of the empty bucket and its quadratic displacement from home_bucket. static inline bool VT_CAT( NAME, _find_first_empty )( NAME *table, size_t home_bucket, size_t *empty, uint16_t *displacement ) { *displacement = 1; size_t linear_dispacement = 1; while( true ) { *empty = ( home_bucket + linear_dispacement ) & table->buckets_mask; if( table->metadata[ *empty ] == VT_EMPTY ) return true; if( VT_UNLIKELY( ++*displacement == VT_DISPLACEMENT_MASK ) ) return false; linear_dispacement += *displacement; } } // Finds the key in the chain beginning in home_bucket after which to link a new key with displacement_to_empty // quadratic displacement and returns the index of the bucket containing that key. // Although the new key could simply be linked to the end of the chain, keeping the chain ordered by displacement // theoretically improves cache locality during lookups. static inline size_t VT_CAT( NAME, _find_insert_location_in_chain )( NAME *table, size_t home_bucket, uint16_t displacement_to_empty ) { size_t candidate = home_bucket; while( true ) { uint16_t displacement = table->metadata[ candidate ] & VT_DISPLACEMENT_MASK; if( displacement > displacement_to_empty ) return candidate; candidate = ( home_bucket + vt_quadratic( displacement ) ) & table->buckets_mask; } } // Frees up a bucket occupied by a key not belonging there so that a new key belonging there can be placed there as the // beginning of a new chain. // This requires: // * Finding the previous key in the chain to which the occupying key belongs by rehashing it and then traversing the // chain. // * Disconnecting the key from the chain. // * Finding the appropriate empty bucket to which to move the key. // * Moving the key (and value) data to the empty bucket. // * Re-linking the key to the chain. // Returns true if the eviction succeeded, or false if no empty bucket to which to evict the occupying key could be // found within the displacement limit. static inline bool VT_CAT( NAME, _evict )( NAME *table, size_t bucket ) { // Find the previous key in chain. size_t home_bucket = HASH_FN( table->buckets[ bucket ].key ) & table->buckets_mask; size_t prev = home_bucket; while( true ) { size_t next = ( home_bucket + vt_quadratic( table->metadata[ prev ] & VT_DISPLACEMENT_MASK ) ) & table->buckets_mask; if( next == bucket ) break; prev = next; } // Disconnect the key from chain. table->metadata[ prev ] = ( table->metadata[ prev ] & ~VT_DISPLACEMENT_MASK ) | ( table->metadata[ bucket ] & VT_DISPLACEMENT_MASK ); // Find the empty bucket to which to move the key. size_t empty; uint16_t displacement; if( VT_UNLIKELY( !VT_CAT( NAME, _find_first_empty )( table, home_bucket, &empty, &displacement ) ) ) return false; // Find the key in the chain after which to link the moved key. prev = VT_CAT( NAME, _find_insert_location_in_chain )( table, home_bucket, displacement ); // Move the key (and value) data. table->buckets[ empty ] = table->buckets[ bucket ]; // Re-link the key to the chain from its new bucket. table->metadata[ empty ] = ( table->metadata[ bucket ] & VT_HASH_FRAG_MASK ) | ( table->metadata[ prev ] & VT_DISPLACEMENT_MASK ); table->metadata[ prev ] = ( table->metadata[ prev ] & ~VT_DISPLACEMENT_MASK ) | displacement; return true; } // Returns an end iterator, i.e. any iterator for which .metadatum == .metadata_end. // This function just cleans up the library code in functions that return an end iterator as a failure indicator. static inline VT_CAT( NAME, _itr ) VT_CAT( NAME, _end_itr )( void ) { VT_CAT( NAME, _itr ) itr = { NULL, NULL, NULL, 0 }; return itr; } // Inserts a key, optionally replacing the existing key if it already exists. // There are two main cases that must be handled: // * If the key's home bucket is empty or occupied by a key that does not belong there, then the key is inserted there, // evicting the occupying key if there is one. // * Otherwise, the chain of keys beginning at the home bucket is (if unique is false) traversed in search of a matching // key. // If none is found, then the new key is inserted at the earliest available bucket, per quadratic probing from the // home bucket, and then linked to the chain in a manner that maintains its quadratic order. // The unique argument tells the function whether to skip searching for the key before inserting it (on rehashing, this // step is unnecessary). // The replace argument tells the function whether to replace an existing key. // If replace is true, the function returns an iterator to the inserted key, or an end iterator if the key was not // inserted because of the maximum load factor or displacement limit constraints. // If replace is false, then the return value is as described above, except that if the key already exists, the function // returns an iterator to the existing key. static inline VT_CAT( NAME, _itr ) VT_CAT( NAME, _insert_raw )( NAME *table, KEY_TY key, #ifdef VAL_TY VAL_TY *val, #endif bool unique, bool replace ) { uint64_t hash = HASH_FN( key ); uint16_t hashfrag = vt_hashfrag( hash ); size_t home_bucket = hash & table->buckets_mask; // Case 1: The home bucket is empty or contains a key that doesn't belong there. // This case also implicitly handles the case of a zero bucket count, since home_bucket will be zero and metadata[ 0 ] // will be the empty placeholder. // In that scenario, the zero buckets_mask triggers the below load-factor check. if( !( table->metadata[ home_bucket ] & VT_IN_HOME_BUCKET_MASK ) ) { if( // Load-factor check. VT_UNLIKELY( table->key_count + 1 > VT_CAT( NAME, _bucket_count )( table ) * MAX_LOAD ) || // Vacate the home bucket if it contains a key. ( table->metadata[ home_bucket ] != VT_EMPTY && VT_UNLIKELY( !VT_CAT( NAME, _evict )( table, home_bucket ) ) ) ) return VT_CAT( NAME, _end_itr )(); table->buckets[ home_bucket ].key = key; #ifdef VAL_TY table->buckets[ home_bucket ].val = *val; #endif table->metadata[ home_bucket ] = hashfrag | VT_IN_HOME_BUCKET_MASK | VT_DISPLACEMENT_MASK; ++table->key_count; VT_CAT( NAME, _itr ) itr = { table->buckets + home_bucket, table->metadata + home_bucket, table->metadata + table->buckets_mask + 1, // Iteration stopper (i.e. the first of the four excess metadata). home_bucket }; return itr; } // Case 2: The home bucket contains the beginning of a chain. // Optionally, check the existing chain. if( !unique ) { size_t bucket = home_bucket; while( true ) { if( ( table->metadata[ bucket ] & VT_HASH_FRAG_MASK ) == hashfrag && VT_LIKELY( CMPR_FN( table->buckets[ bucket ].key, key ) ) ) { if( replace ) { #ifdef KEY_DTOR_FN KEY_DTOR_FN( table->buckets[ bucket ].key ); #endif table->buckets[ bucket ].key = key; #ifdef VAL_TY #ifdef VAL_DTOR_FN VAL_DTOR_FN( table->buckets[ bucket ].val ); #endif table->buckets[ bucket ].val = *val; #endif } VT_CAT( NAME, _itr ) itr = { table->buckets + bucket, table->metadata + bucket, table->metadata + table->buckets_mask + 1, home_bucket }; return itr; } uint16_t displacement = table->metadata[ bucket ] & VT_DISPLACEMENT_MASK; if( displacement == VT_DISPLACEMENT_MASK ) break; bucket = ( home_bucket + vt_quadratic( displacement ) ) & table->buckets_mask; } } size_t empty; uint16_t displacement; if( VT_UNLIKELY( // Load-factor check. table->key_count + 1 > VT_CAT( NAME, _bucket_count )( table ) * MAX_LOAD || // Find the earliest empty bucket, per quadratic probing. !VT_CAT( NAME, _find_first_empty )( table, home_bucket, &empty, &displacement ) ) ) return VT_CAT( NAME, _end_itr )(); // Insert the new key (and value) in the empty bucket and link it to the chain. size_t prev = VT_CAT( NAME, _find_insert_location_in_chain )( table, home_bucket, displacement ); table->buckets[ empty ].key = key; #ifdef VAL_TY table->buckets[ empty ].val = *val; #endif table->metadata[ empty ] = hashfrag | ( table->metadata[ prev ] & VT_DISPLACEMENT_MASK ); table->metadata[ prev ] = ( table->metadata[ prev ] & ~VT_DISPLACEMENT_MASK ) | displacement; ++table->key_count; VT_CAT( NAME, _itr ) itr = { table->buckets + empty, table->metadata + empty, table->metadata + table->buckets_mask + 1, home_bucket }; return itr; } // Resizes the bucket array. // This function assumes that bucket_count is a power of two and large enough to accommodate all keys without violating // the maximum load factor. // Returns false in the case of allocation failure. // As this function is called very rarely in _insert and _get_or_insert, ideally it should not be inlined into those // functions. // In testing, the no-inline approach showed a performance benefit when inserting existing keys (i.e. replacing). #ifdef __GNUC__ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wattributes" // Silence warning about combining noinline with static inline. __attribute__((noinline)) static inline #elif defined( _MSC_VER ) __declspec(noinline) static inline #else static inline #endif bool VT_CAT( NAME, _rehash )( NAME *table, size_t bucket_count ) { // The attempt to resize the bucket array and rehash the keys must occur inside a loop that incrementally doubles the // target bucket count because a failure could theoretically occur at any load factor due to the displacement limit. while( true ) { NAME new_table = { 0, bucket_count - 1, NULL, NULL #ifdef CTX_TY , table->ctx #endif }; void *allocation = MALLOC_FN( VT_CAT( NAME, _total_alloc_size )( &new_table ) #ifdef CTX_TY , &new_table.ctx #endif ); if( VT_UNLIKELY( !allocation ) ) return false; new_table.buckets = (VT_CAT( NAME, _bucket ) *)allocation; new_table.metadata = (uint16_t *)( (unsigned char *)allocation + VT_CAT( NAME, _metadata_offset )( &new_table ) ); memset( new_table.metadata, 0x00, ( bucket_count + 4 ) * sizeof( uint16_t ) ); // Iteration stopper at the end of the actual metadata array (i.e. the first of the four excess metadata). new_table.metadata[ bucket_count ] = 0x01; for( size_t bucket = 0; bucket < VT_CAT( NAME, _bucket_count )( table ); ++bucket ) if( table->metadata[ bucket ] != VT_EMPTY ) { VT_CAT( NAME, _itr ) itr = VT_CAT( NAME, _insert_raw )( &new_table, table->buckets[ bucket ].key, #ifdef VAL_TY &table->buckets[ bucket ].val, #endif true, false ); if( VT_UNLIKELY( VT_CAT( NAME, _is_end )( itr ) ) ) break; } // If a key could not be reinserted due to the displacement limit, double the bucket count and retry. if( VT_UNLIKELY( new_table.key_count < table->key_count ) ) { FREE_FN( new_table.buckets, VT_CAT( NAME, _total_alloc_size )( &new_table ) #ifdef CTX_TY , &new_table.ctx #endif ); bucket_count *= 2; continue; } if( table->buckets_mask ) FREE_FN( table->buckets, VT_CAT( NAME, _total_alloc_size )( table ) #ifdef CTX_TY , &table->ctx #endif ); *table = new_table; return true; } } #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // Inserts a key, replacing the existing key if it already exists. // This function wraps insert_raw in a loop that handles growing and rehashing the table if a new key cannot be inserted // because of the maximum load factor or displacement limit constraints. // Returns an iterator to the inserted key, or an end iterator in the case of allocation failure. VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _insert )( NAME *table, KEY_TY key #ifdef VAL_TY , VAL_TY val #endif ) { while( true ) { VT_CAT( NAME, _itr ) itr = VT_CAT( NAME, _insert_raw )( table, key, #ifdef VAL_TY &val, #endif false, true ); if( // Lookup succeeded, in which case itr points to the found key. VT_LIKELY( !VT_CAT( NAME, _is_end )( itr ) ) || // Lookup failed and rehash also fails, in which case itr is an end iterator. VT_UNLIKELY( !VT_CAT( NAME, _rehash )( table, table->buckets_mask ? VT_CAT( NAME, _bucket_count )( table ) * 2 : VT_MIN_NONZERO_BUCKET_COUNT ) ) ) return itr; } } // Same as NAME_insert, except that if the key already exists, no insertion occurs and the function returns an iterator // to the existing key. VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _get_or_insert )( NAME *table, KEY_TY key #ifdef VAL_TY , VAL_TY val #endif ) { while( true ) { VT_CAT( NAME, _itr ) itr = VT_CAT( NAME, _insert_raw )( table, key, #ifdef VAL_TY &val, #endif false, false ); if( // Lookup succeeded, in which case itr points to the found key. VT_LIKELY( !VT_CAT( NAME, _is_end )( itr ) ) || // Lookup failed and rehash also fails, in which case itr is an end iterator. VT_UNLIKELY( !VT_CAT( NAME, _rehash )( table, table->buckets_mask ? VT_CAT( NAME, _bucket_count )( table ) * 2 : VT_MIN_NONZERO_BUCKET_COUNT ) ) ) return itr; } } // Returns an iterator pointing to the specified key, or an end iterator if the key does not exist. VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _get )( const NAME *table, KEY_TY key ) { uint64_t hash = HASH_FN( key ); size_t home_bucket = hash & table->buckets_mask; // If the home bucket is empty or contains a key that does not belong there, then our key does not exist. // This check also implicitly handles the case of a zero bucket count, since home_bucket will be zero and // metadata[ 0 ] will be the empty placeholder. if( !( table->metadata[ home_bucket ] & VT_IN_HOME_BUCKET_MASK ) ) return VT_CAT( NAME, _end_itr )(); // Traverse the chain of keys belonging to the home bucket. uint16_t hashfrag = vt_hashfrag( hash ); size_t bucket = home_bucket; while( true ) { if( ( table->metadata[ bucket ] & VT_HASH_FRAG_MASK ) == hashfrag && VT_LIKELY( CMPR_FN( table->buckets[ bucket ].key, key ) ) ) { VT_CAT( NAME, _itr ) itr = { table->buckets + bucket, table->metadata + bucket, table->metadata + table->buckets_mask + 1, home_bucket }; return itr; } uint16_t displacement = table->metadata[ bucket ] & VT_DISPLACEMENT_MASK; if( displacement == VT_DISPLACEMENT_MASK ) return VT_CAT( NAME, _end_itr )(); bucket = ( home_bucket + vt_quadratic( displacement ) ) & table->buckets_mask; } } // Erases the key pointed to by the specified iterator. // The erasure always occurs at the end of the chain to which the key belongs. // If the key to be erased is not the last in the chain, it is swapped with the last so that erasure occurs at the end. // This helps keep a chain's keys close to their home bucket for the sake of cache locality. // Returns true if, in the case of iteration from first to end, NAME_next should now be called on the iterator to find // the next key. // This return value is necessary because at the iterator location, the erasure could result in an empty bucket, a // bucket containing a moved key already visited during the iteration, or a bucket containing a moved key not yet // visited. VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _erase_itr_raw )( NAME *table, VT_CAT( NAME, _itr ) itr ) { --table->key_count; size_t itr_bucket = itr.metadatum - table->metadata; // For now, we only call the value's destructor because the key may need to be hashed below to determine the home // bucket. #ifdef VAL_DTOR_FN VAL_DTOR_FN( table->buckets[ itr_bucket ].val ); #endif // Case 1: The key is the only one in its chain, so just remove it. if( table->metadata[ itr_bucket ] & VT_IN_HOME_BUCKET_MASK && ( table->metadata[ itr_bucket ] & VT_DISPLACEMENT_MASK ) == VT_DISPLACEMENT_MASK ) { #ifdef KEY_DTOR_FN KEY_DTOR_FN( table->buckets[ itr_bucket ].key ); #endif table->metadata[ itr_bucket ] = VT_EMPTY; return true; } // Case 2 and 3 require that we know the key's home bucket, which the iterator may not have recorded. if( itr.home_bucket == SIZE_MAX ) { if( table->metadata[ itr_bucket ] & VT_IN_HOME_BUCKET_MASK ) itr.home_bucket = itr_bucket; else itr.home_bucket = HASH_FN( table->buckets[ itr_bucket ].key ) & table->buckets_mask; } // The key can now be safely destructed for cases 2 and 3. #ifdef KEY_DTOR_FN KEY_DTOR_FN( table->buckets[ itr_bucket ].key ); #endif // Case 2: The key is the last in a multi-key chain. // Traverse the chain from the beginning and find the penultimate key. // Then disconnect the key and erase. if( ( table->metadata[ itr_bucket ] & VT_DISPLACEMENT_MASK ) == VT_DISPLACEMENT_MASK ) { size_t bucket = itr.home_bucket; while( true ) { uint16_t displacement = table->metadata[ bucket ] & VT_DISPLACEMENT_MASK; size_t next = ( itr.home_bucket + vt_quadratic( displacement ) ) & table->buckets_mask; if( next == itr_bucket ) { table->metadata[ bucket ] |= VT_DISPLACEMENT_MASK; table->metadata[ itr_bucket ] = VT_EMPTY; return true; } bucket = next; } } // Case 3: The chain has multiple keys, and the key is not the last one. // Traverse the chain from the key to be erased and find the last and penultimate keys. // Disconnect the last key from the chain, and swap it with the key to erase. size_t bucket = itr_bucket; while( true ) { size_t prev = bucket; bucket = ( itr.home_bucket + vt_quadratic( table->metadata[ bucket ] & VT_DISPLACEMENT_MASK ) ) & table->buckets_mask; if( ( table->metadata[ bucket ] & VT_DISPLACEMENT_MASK ) == VT_DISPLACEMENT_MASK ) { table->buckets[ itr_bucket ] = table->buckets[ bucket ]; table->metadata[ itr_bucket ] = ( table->metadata[ itr_bucket ] & ~VT_HASH_FRAG_MASK ) | ( table->metadata[ bucket ] & VT_HASH_FRAG_MASK ); table->metadata[ prev ] |= VT_DISPLACEMENT_MASK; table->metadata[ bucket ] = VT_EMPTY; // Whether the iterator should be advanced depends on whether the key moved to the iterator bucket came from // before or after that bucket. // In the former case, the iteration would already have hit the moved key, so the iterator should still be // advanced. if( bucket > itr_bucket ) return false; return true; } } } // Erases the specified key, if it exists. // Returns true if a key was erased. VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _erase )( NAME *table, KEY_TY key ) { VT_CAT( NAME, _itr ) itr = VT_CAT( NAME, _get)( table, key ); if( VT_CAT( NAME, _is_end )( itr ) ) return false; VT_CAT( NAME, _erase_itr_raw )( table, itr ); return true; } // Finds the first occupied bucket at or after the bucket pointed to by itr. // This function scans four buckets at a time, ideally using intrinsics. static inline void VT_CAT( NAME, _fast_forward )( VT_CAT( NAME, _itr ) *itr ) { while( true ) { uint64_t metadata; memcpy( &metadata, itr->metadatum, sizeof( uint64_t ) ); if( metadata ) { int offset = vt_first_nonzero_uint16( metadata ); itr->data += offset; itr->metadatum += offset; itr->home_bucket = SIZE_MAX; return; } itr->data += 4; itr->metadatum += 4; } } VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _next )( VT_CAT( NAME, _itr ) itr ) { ++itr.data; ++itr.metadatum; VT_CAT( NAME, _fast_forward )( &itr ); return itr; } // Returns the minimum bucket count required to accommodate a certain number of keys, which is governed by the maximum // load factor. static inline size_t VT_CAT( NAME, _min_bucket_count_for_size )( size_t size ) { if( size == 0 ) return 0; // Round up to a power of two. size_t bucket_count = VT_MIN_NONZERO_BUCKET_COUNT; while( size > bucket_count * MAX_LOAD ) bucket_count *= 2; return bucket_count; } VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _reserve )( NAME *table, size_t size ) { size_t bucket_count = VT_CAT( NAME, _min_bucket_count_for_size )( size ); if( bucket_count <= VT_CAT( NAME, _bucket_count )( table ) ) return true; return VT_CAT( NAME, _rehash )( table, bucket_count ); } VT_API_FN_QUALIFIERS bool VT_CAT( NAME, _shrink )( NAME *table ) { size_t bucket_count = VT_CAT( NAME, _min_bucket_count_for_size )( table->key_count ); if( bucket_count == VT_CAT( NAME, _bucket_count )( table ) ) // Shrink unnecessary. return true; if( bucket_count == 0 ) { FREE_FN( table->buckets, VT_CAT( NAME, _total_alloc_size )( table ) #ifdef CTX_TY , &table->ctx #endif ); table->buckets_mask = 0x0000000000000000ull; table->metadata = (uint16_t *)&vt_empty_placeholder_metadatum; return true; } return VT_CAT( NAME, _rehash )( table, bucket_count ); } VT_API_FN_QUALIFIERS VT_CAT( NAME, _itr ) VT_CAT( NAME, _first )( const NAME *table ) { if( !table->key_count ) return VT_CAT( NAME, _end_itr )(); VT_CAT( NAME, _itr ) itr = { table->buckets, table->metadata, table->metadata + table->buckets_mask + 1, SIZE_MAX }; VT_CAT( NAME, _fast_forward )( &itr ); return itr; } VT_API_FN_QUALIFIERS void VT_CAT( NAME, _clear )( NAME *table ) { if( !table->key_count ) return; for( size_t i = 0; i < VT_CAT( NAME, _bucket_count )( table ); ++i ) { if( table->metadata[ i ] != VT_EMPTY ) { #ifdef KEY_DTOR_FN KEY_DTOR_FN( table->buckets[ i ].key ); #endif #ifdef VAL_DTOR_FN VAL_DTOR_FN( table->buckets[ i ].val ); #endif } table->metadata[ i ] = VT_EMPTY; } table->key_count = 0; } VT_API_FN_QUALIFIERS void VT_CAT( NAME, _cleanup )( NAME *table ) { if( !table->buckets_mask ) return; #if defined( KEY_DTOR_FN ) || defined( VAL_DTOR_FN ) VT_CAT( NAME, _clear )( table ); #endif FREE_FN( table->buckets, VT_CAT( NAME, _total_alloc_size )( table ) #ifdef CTX_TY , &table->ctx #endif ); VT_CAT( NAME, _init )( table #ifdef CTX_TY , table->ctx #endif ); } #endif /*--------------------------------------------------------------------------------------------------------------------*/ /* Wrapper types and functions for the C11 generic API */ /*--------------------------------------------------------------------------------------------------------------------*/ #if defined(__STDC_VERSION__) && \ __STDC_VERSION__ >= 201112L && \ !defined( IMPLEMENTATION_MODE ) && \ !defined( VT_NO_C11_GENERIC_API ) \ typedef NAME VT_CAT( vt_table_, VT_TEMPLATE_COUNT ); typedef VT_CAT( NAME, _itr ) VT_CAT( vt_table_itr_, VT_TEMPLATE_COUNT ); static inline void VT_CAT( vt_init_, VT_TEMPLATE_COUNT )( NAME *table #ifdef CTX_TY , CTX_TY ctx #endif ) { VT_CAT( NAME, _init )( table #ifdef CTX_TY , ctx #endif ); } static inline bool VT_CAT( vt_init_clone_, VT_TEMPLATE_COUNT )( NAME *table, const NAME* source #ifdef CTX_TY , CTX_TY ctx #endif ) { return VT_CAT( NAME, _init_clone )( table, source #ifdef CTX_TY , ctx #endif ); } static inline size_t VT_CAT( vt_size_, VT_TEMPLATE_COUNT )( const NAME *table ) { return VT_CAT( NAME, _size )( table ); } static inline size_t VT_CAT( vt_bucket_count_, VT_TEMPLATE_COUNT )( const NAME *table ) { return VT_CAT( NAME, _bucket_count )( table ); } static inline bool VT_CAT( vt_is_end_, VT_TEMPLATE_COUNT )( VT_CAT( NAME, _itr ) itr ) { return VT_CAT( NAME, _is_end )( itr ); } static inline VT_CAT( NAME, _itr ) VT_CAT( vt_insert_, VT_TEMPLATE_COUNT )( NAME *table, KEY_TY key #ifdef VAL_TY , VAL_TY val #endif ) { return VT_CAT( NAME, _insert )( table, key #ifdef VAL_TY , val #endif ); } static inline VT_CAT( NAME, _itr ) VT_CAT( vt_get_or_insert_, VT_TEMPLATE_COUNT )( NAME *table, KEY_TY key #ifdef VAL_TY , VAL_TY val #endif ) { return VT_CAT( NAME, _get_or_insert )( table, key #ifdef VAL_TY , val #endif ); } static inline VT_CAT( NAME, _itr ) VT_CAT( vt_get_, VT_TEMPLATE_COUNT )( const NAME *table, KEY_TY key ) { return VT_CAT( NAME, _get )( table, key ); } static inline bool VT_CAT( vt_erase_, VT_TEMPLATE_COUNT )( NAME *table, KEY_TY key ) { return VT_CAT( NAME, _erase )( table, key ); } static inline VT_CAT( NAME, _itr ) VT_CAT( vt_next_, VT_TEMPLATE_COUNT )( VT_CAT( NAME, _itr ) itr ) { return VT_CAT( NAME, _next )( itr ); } static inline VT_CAT( NAME, _itr ) VT_CAT( vt_erase_itr_, VT_TEMPLATE_COUNT )( NAME *table, VT_CAT( NAME, _itr ) itr ) { return VT_CAT( NAME, _erase_itr )( table, itr ); } static inline bool VT_CAT( vt_reserve_, VT_TEMPLATE_COUNT )( NAME *table, size_t bucket_count ) { return VT_CAT( NAME, _reserve )( table, bucket_count ); } static inline bool VT_CAT( vt_shrink_, VT_TEMPLATE_COUNT )( NAME *table ) { return VT_CAT( NAME, _shrink )( table ); } static inline VT_CAT( NAME, _itr ) VT_CAT( vt_first_, VT_TEMPLATE_COUNT )( const NAME *table ) { return VT_CAT( NAME, _first )( table ); } static inline void VT_CAT( vt_clear_, VT_TEMPLATE_COUNT )( NAME *table ) { VT_CAT( NAME, _clear )( table ); } static inline void VT_CAT( vt_cleanup_, VT_TEMPLATE_COUNT )( NAME *table ) { VT_CAT( NAME, _cleanup )( table ); } // Increment the template counter. #if VT_TEMPLATE_COUNT_D1 == 0 #undef VT_TEMPLATE_COUNT_D1 #define VT_TEMPLATE_COUNT_D1 1 #elif VT_TEMPLATE_COUNT_D1 == 1 #undef VT_TEMPLATE_COUNT_D1 #define VT_TEMPLATE_COUNT_D1 2 #elif VT_TEMPLATE_COUNT_D1 == 2 #undef VT_TEMPLATE_COUNT_D1 #define VT_TEMPLATE_COUNT_D1 3 #elif VT_TEMPLATE_COUNT_D1 == 3 #undef VT_TEMPLATE_COUNT_D1 #define VT_TEMPLATE_COUNT_D1 4 #elif VT_TEMPLATE_COUNT_D1 == 4 #undef VT_TEMPLATE_COUNT_D1 #define VT_TEMPLATE_COUNT_D1 5 #elif VT_TEMPLATE_COUNT_D1 == 5 #undef VT_TEMPLATE_COUNT_D1 #define VT_TEMPLATE_COUNT_D1 6 #elif VT_TEMPLATE_COUNT_D1 == 6 #undef VT_TEMPLATE_COUNT_D1 #define VT_TEMPLATE_COUNT_D1 7 #elif VT_TEMPLATE_COUNT_D1 == 7 #undef VT_TEMPLATE_COUNT_D1 #define VT_TEMPLATE_COUNT_D1 0 #if VT_TEMPLATE_COUNT_D2 == 0 #undef VT_TEMPLATE_COUNT_D2 #define VT_TEMPLATE_COUNT_D2 1 #elif VT_TEMPLATE_COUNT_D2 == 1 #undef VT_TEMPLATE_COUNT_D2 #define VT_TEMPLATE_COUNT_D2 2 #elif VT_TEMPLATE_COUNT_D2 == 2 #undef VT_TEMPLATE_COUNT_D2 #define VT_TEMPLATE_COUNT_D2 3 #elif VT_TEMPLATE_COUNT_D2 == 3 #undef VT_TEMPLATE_COUNT_D2 #define VT_TEMPLATE_COUNT_D2 4 #elif VT_TEMPLATE_COUNT_D2 == 4 #undef VT_TEMPLATE_COUNT_D2 #define VT_TEMPLATE_COUNT_D2 5 #elif VT_TEMPLATE_COUNT_D2 == 5 #undef VT_TEMPLATE_COUNT_D2 #define VT_TEMPLATE_COUNT_D2 6 #elif VT_TEMPLATE_COUNT_D2 == 6 #undef VT_TEMPLATE_COUNT_D2 #define VT_TEMPLATE_COUNT_D2 7 #elif VT_TEMPLATE_COUNT_D2 == 7 #undef VT_TEMPLATE_COUNT_D2 #define VT_TEMPLATE_COUNT_D2 0 #if VT_TEMPLATE_COUNT_D3 == 0 #undef VT_TEMPLATE_COUNT_D3 #define VT_TEMPLATE_COUNT_D3 1 #elif VT_TEMPLATE_COUNT_D3 == 1 #undef VT_TEMPLATE_COUNT_D3 #define VT_TEMPLATE_COUNT_D3 2 #elif VT_TEMPLATE_COUNT_D3 == 2 #undef VT_TEMPLATE_COUNT_D3 #define VT_TEMPLATE_COUNT_D3 3 #elif VT_TEMPLATE_COUNT_D3 == 3 #undef VT_TEMPLATE_COUNT_D3 #define VT_TEMPLATE_COUNT_D3 4 #elif VT_TEMPLATE_COUNT_D3 == 4 #undef VT_TEMPLATE_COUNT_D3 #define VT_TEMPLATE_COUNT_D3 5 #elif VT_TEMPLATE_COUNT_D3 == 5 #undef VT_TEMPLATE_COUNT_D3 #define VT_TEMPLATE_COUNT_D3 6 #elif VT_TEMPLATE_COUNT_D3 == 6 #undef VT_TEMPLATE_COUNT_D3 #define VT_TEMPLATE_COUNT_D3 7 #elif VT_TEMPLATE_COUNT_D3 == 7 #error Sorry, the number of template instances is limited to 511. Define VT_NO_C11_GENERIC_API globally and use the \ C99 prefixed function API to circumvent this restriction. #endif #endif #endif #endif #undef NAME #undef KEY_TY #undef VAL_TY #undef HASH_FN #undef CMPR_FN #undef MAX_LOAD #undef KEY_DTOR_FN #undef VAL_DTOR_FN #undef CTX_TY #undef MALLOC_FN #undef FREE_FN #undef HEADER_MODE #undef IMPLEMENTATION_MODE #undef VT_API_FN_QUALIFIERS ceccomp-4.3.1/include/main.h000066400000000000000000000015241526046660400156630ustar00rootroot00000000000000#ifndef MAIN_H #define MAIN_H // clang-format off #include #include #include #include #include #include #include #include // clang-format on typedef struct sock_fprog fprog; typedef struct sock_filter filter; typedef struct seccomp_data seccomp_data; typedef struct ptrace_syscall_info syscall_info; typedef struct { const char *start; uint32_t len; } string_t; #define STARTWITH(str, token) (!strncmp (str, token, strlen (token))) #define LIKELY(x) __builtin_expect (!!(x), 1) #define UNLIKELY(x) __builtin_expect (!!(x), 0) #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0])) #define LITERAL_STRLEN(str) (ARRAY_SIZE (str) - 1) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif ceccomp-4.3.1/include/probe.h000066400000000000000000000002441526046660400160440ustar00rootroot00000000000000#ifndef PROBE_H #define PROBE_H #include #include #include extern void probe (char *const argv[], FILE *fp, bool quiet); #endif ceccomp-4.3.1/include/resolver/000077500000000000000000000000001526046660400164255ustar00rootroot00000000000000ceccomp-4.3.1/include/resolver/render.h000066400000000000000000000002251526046660400200540ustar00rootroot00000000000000#ifndef RENDER_H #define RENDER_H #include "utils/vector.h" #include extern void render (vector_t *v_code, uint32_t scmp_arch); #endif ceccomp-4.3.1/include/resolver/resolver.h000066400000000000000000000004671526046660400204460ustar00rootroot00000000000000#ifndef RESOLVER_H #define RESOLVER_H #include "utils/vector.h" #include #include #define _SCMP_ACT_TRAP(x) (SCMP_ACT_TRAP | ((x) & 0x0000ffffU)) // see vector.h for vector details // return false if ok, return true if error occurs extern bool resolver (vector_t *code_ptr_v); #endif ceccomp-4.3.1/include/trace.h000066400000000000000000000006151526046660400160350ustar00rootroot00000000000000#ifndef TRACE_H #define TRACE_H #include #include #include #include typedef struct user_regs_struct regs; typedef struct ptrace_syscall_info syscall_info; extern uint32_t program_trace (char *const argv[], FILE *output_fp, bool quiet, bool oneshot); extern void pid_trace (int pid, bool seize, bool quiet); #endif ceccomp-4.3.1/include/utils/000077500000000000000000000000001526046660400157245ustar00rootroot00000000000000ceccomp-4.3.1/include/utils/arch_trans.h000066400000000000000000000012061526046660400202200ustar00rootroot00000000000000#ifndef ARCH_TRANS_H #define ARCH_TRANS_H #include "attributes.h" #include "lexical/token.h" #include "main.h" #include #include #include extern AttrPure uint32_t internal_arch_to_scmp_arch (uint32_t internal_arch); extern AttrPure uint32_t scmp_arch_to_internal_arch (uint32_t scmp_arch); extern AttrPure uint32_t str_to_scmp_arch (const char *str, bool strict); extern AttrPure token_type str_to_internal_arch (const char *str, bool strict); extern AttrPure const string_t *scmp_arch_to_internal_str (uint32_t scmp_arch); extern AttrPure const char *scmp_arch_to_scmp_str (uint32_t scmp_arch); #endif ceccomp-4.3.1/include/utils/bpf_trans.h000066400000000000000000000022011526046660400200460ustar00rootroot00000000000000#ifndef BPF_TRANS_H #define BPF_TRANS_H #include #include #include #include #include /* ebpf2cbpf: translate from migrated eBPF seccomp filters back to cBPF form. * Warning: eBPF migration is not strictly reversable, this function can't * fully recover original filters. * * ebpfs: Binary migrated seccomp filters captured from kernel with eBPF. * Note that some insns may be modified when processing (if constant * blinding is present), so no const modifier. * ebpf_len: The amount of migrated filters. * cbpf_buf: The buffer to put recovered cBPF filters. Should be at least as * large as ebpfs. * trustful: Whether the eBPF bytes are extracted directly from kernel, not * from user input. * * Returns -1 if unexpected instruction details spotted, warnings are printed * in the funtion. Returns the amount of recovered cBPF filters if successfully * recovered. */ extern long ebpf2cbpf (struct bpf_insn *restrict ebpfs, uint32_t ebpf_len, struct sock_filter *restrict cbpf_buf, bool trustful); #endif ceccomp-4.3.1/include/utils/color.h000066400000000000000000000024001526046660400172070ustar00rootroot00000000000000#ifndef COLOR_H #define COLOR_H #include "parse_args.h" #include #include extern bool color_enable; extern bool log_color_enable; extern void set_color (color_mode_t color, FILE *output); extern void push_color (bool enable); extern void pop_color (void); #define CLR "\x1b[0m" #define REDCLR "\x1b[31m" #define GREENCLR "\x1b[32m" #define YELLOWCLR "\x1b[33m" #define BLUECLR "\x1b[34m" #define CYANCLR "\x1b[36m" #define PURPLECLR "\x1b[95m" #define LIGHTCLR "\x1b[90m" #define BRIGHT_YELLOWCLR "\x1b[93m" #define BRIGHT_BLUECLR "\x1b[94m" #define BRIGHT_CYANCLR "\x1b[96m" #define RED(str) ((color_enable) ? (REDCLR str CLR) : str) #define GREEN(str) ((color_enable) ? (GREENCLR str CLR) : str) #define YELLOW(str) ((color_enable) ? (YELLOWCLR str CLR) : str) #define BRIGHT_YELLOW(str) ((color_enable) ? (BRIGHT_YELLOWCLR str CLR) : str) #define BLUE(str) ((color_enable) ? (BLUECLR str CLR) : str) #define BRIGHT_BLUE(str) ((color_enable) ? (BRIGHT_BLUECLR str CLR) : str) #define CYAN(str) ((color_enable) ? (CYANCLR str CLR) : str) #define BRIGHT_CYAN(str) ((color_enable) ? (BRIGHT_CYANCLR str CLR) : str) #define PURPLE(str) ((color_enable) ? (PURPLECLR str CLR) : str) #define LIGHT(str) ((color_enable) ? (LIGHTCLR str CLR) : str) #endif ceccomp-4.3.1/include/utils/ebpf_logger.h000066400000000000000000000022641526046660400203540ustar00rootroot00000000000000#ifndef EBPF_LOGGER_H #define EBPF_LOGGER_H #define EBPF_STRINGIFY_IMPL(x) #x #define EBPF_STRINGIFY(x) EBPF_STRINGIFY_IMPL (x) #define EBPF_AT __FILE__ ":" EBPF_STRINGIFY (__LINE__) ": " #define EBPF_IF(cond) \ if ((tmp_cond = (cond))) \ bpf_printk (EBPF_AT "Unexpected " #cond); \ if (tmp_cond) #define EBPF_IF_PID(cond, pid) \ if ((tmp_cond = (cond))) \ bpf_printk (EBPF_AT "Unexpected " #cond " in process %d", pid); \ if (tmp_cond) #define EBPF_LOG_IF_PID(cond, pid) \ do \ { \ if (cond) \ bpf_printk (EBPF_AT "Unexpected " #cond " in process %d", pid); \ } \ while (0) #endif ceccomp-4.3.1/include/utils/ebpf_share.h000066400000000000000000000045371526046660400202040ustar00rootroot00000000000000#ifndef EBPF_SHARE_H #define EBPF_SHARE_H #ifndef _NO_VMLINUX_ #include #else #include #include #endif #include "attributes.h" #ifndef BPF_MAXINSNS #define BPF_MAXINSNS 4096 #endif typedef struct { unsigned short flen; struct sock_filter filters[BPF_MAXINSNS]; } ebpf_prog; typedef enum { CHUNK_DONE, PROG_DONE, PROG_ABORTED, TRUNCATED, TASK_ABORTED, ALL_DONE, PID_NOT_FOUND } pid_event_status; typedef struct { pid_event_status status; uint32_t ebpf_arch; uint32_t flen_total; uint32_t filter_count; ebpf_prog prog; } pid_event; typedef struct { uint32_t ebpf_arch; char comm[16]; uint32_t op; pid_t pid; ebpf_prog prog; } global_event; typedef enum { PROC_ARCH_X64, PROC_ARCH_X86, PROC_ARCH_ARM, PROC_ARCH_AARCH64, PROC_ARCH_OTHERS, } ebpf_arch; typedef struct { pid_t target_pid; pid_t trigger_pid; } pid_config; #if defined(__aarch64__) #define TIF_32BIT 22 #define COMPAT_ARCH(tflags) \ (((tflags) & (1 << TIF_32BIT)) ? PROC_ARCH_ARM : PROC_ARCH_AARCH64) #elif defined(__x86_64__) #define TS_COMPAT 2 #define COMPAT_ARCH(status) \ (((status) & TS_COMPAT) ? PROC_ARCH_X86 : PROC_ARCH_X64) #endif #define CHUNK_SIZE (4096 * sizeof (struct bpf_insn)) #define CHUNK_INSN_SIZE (CHUNK_SIZE / sizeof (struct bpf_insn)) // success conditions: // NEW_LISTENER && !TSYNC -> ret >= 0 // TSYNC && !NEW_LISTENER -> ret == 0 // !TSYNC && !NEW_LISTENER -> ret == 0 // TSYNC && NEW_LISTENER && TSYNC_ESRCH -> ret >= 0 // TSYNC && NEW_LISTENER && !TSYNC_ESRCH <- EINVAL AttrConst static inline bool load_success (long ret, uint32_t flags) { #define SECCOMP_FILTER_FLAG_TSYNC (1UL << 0) #define SECCOMP_FILTER_FLAG_NEW_LISTENER (1UL << 3) #define SECCOMP_FILTER_FLAG_TSYNC_ESRCH (1UL << 4) if (ret < 0) return false; if (ret == 0) return true; // ret > 0 if (!(flags & SECCOMP_FILTER_FLAG_NEW_LISTENER)) return false; // ret > 0 and flags & SECCOMP_FILTER_FLAG_NEW_LISTENER if (!(flags & SECCOMP_FILTER_FLAG_TSYNC)) return true; // ret > 0 and flags & SECCOMP_FILTER_FLAG_NEW_LISTENER // and flags & SECCOMP_FILTER_FLAG_TSYNC if (flags & SECCOMP_FILTER_FLAG_TSYNC_ESRCH) return true; return false; } #endif ceccomp-4.3.1/include/utils/error.h000066400000000000000000000251201526046660400172260ustar00rootroot00000000000000#ifndef ERROR_H #define ERROR_H #include "i18n.h" #define M_UNSUPPORTED_ARCH _ ("Architecture name %s is not supported") // probe #define M_PROBE_TERMINATED _ ("Found errors when assembling BPF from trace") #define M_REQUEST_TMPFILE_FAILED _ ("Failed to request a temporary file: %s") // emu #define M_EMU_TERMINATED \ _ ("Found errors when assembling text before emulating") #define M_INPUT_SYS_NR _ ("Please input syscall_nr (syscall name or number)") #define M_INVALID_SYSNR _ ("Invalid syscall_nr") // asm #define M_ASM_TERMINATED _ ("Found errors when assembling") #define M_STATEMENT_OVERFLOW _ ("Input file has more than 4096 statements!") // disasm #define M_DISASM_TERMINATED _ ("Found fatal errors when disassembling") #define M_NO_FILTER _ ("The input is empty") #define M_TOO_LARGE_INPUT \ _ ("The input is larger than 4096 filters! Perhaps inputting a wrong " \ "file?") #define M_INPUT_HAS_LEFTOVER \ _ ("%u byte(s) at the end of input could not fit into a filter") // trace #define M_START_TRACING _ ("Start tracing process %d") #define M_PEEKDATA_FAILED_ADR _ ("Peekdata failed at %p") #define M_EXECV_ERR _ ("Failed to execute new program") #define M_PROCESS_FORK _ ("Process %d spawned a new pid %d") #define M_PROCESS_EXIT _ ("Process %d exited") #define M_PID_BPF_SECCOMP _ ("Process %d invoked seccomp (%s, %s, &prog)") #define M_PID_BPF_PRCTL \ _ ("Process %d invoked prctl (PR_SET_SECCOMP, %s, &prog)") #define M_PID_BPF_LOAD_FAIL _ ("Process %d failed to load seccomp filter: %s") #define M_BPF_FAIL_UNKNOWN _ ("Unknown reason") #define M_PROCFS_NOT_ACCESSIBLE _ ("Procfs not accessible, unable to perform") #define M_NOT_AN_CBPF _ ("Found unresolvable non-classic BPF, skipping") #define M_SEIZING_KERNEL_THREAD _ ("Kernel thread can not be seized") #define M_NO_FILTER_FOUND _ ("No seccomp filters found in process %d") #define M_TARGET_TRACED_BY \ _ ("Target process is already being traced by process %d") #define M_FOUND_STRICT_MODE \ _ ("Process %d loaded strict seccomp mode, which only allows read, " \ "write, exit_group and sigreturn!") #define M_UNKNOWN_GETFILTER_ERR _ ("Unknown error when get filter: %s") #define M_UNKNOWN_SEIZE_ERR _ ("Unknown error when seizing process: %s") #define M_SEIZE_NONEXIST_PROC _ ("The process to seize does not exist") // no translation due to terms #define ACTION_GET_FILTER "ptrace get seccomp filters" #define ACTION_PTRACE_SEIZE "ptrace seizing" #define M_TRACE_UNDER_ATTACK \ _ ("Unexpected race condition detected when reading seccomp filters, " \ "please consider use capture subcommand") #define M_FAILED_SEIZE_CHILD \ _ ("Can not trace child process %d, probably because it is being traced") #define M_CAP_SYS_PTRACE_OR_KTHREAD \ _ ("perhaps seizing kthread or lacking CAP_SYS_PTRACE") #define M_REQUIRE_CAP_SYS_ADMIN \ _ ("Run with CAP_SYS_ADMIN capability to fetch seccomp filters") #define M_REQUIRE_CAP_SYS_PTRACE \ _ ("Run with CAP_SYS_PTRACE capability to seize a foreign process") #define M_CANNOT_WORK_FROM_32_TO_64 \ _ ("32-bit tracer can not ptrace 64-bit tracee") #define M_TRACEE_ARCH_NOT_SUPPORTED \ _ ("libseccomp does not support the tracee's arch (%#x)") #define M_CAP_SYS_ADMIN_OR_IN_SECCOMP \ _ ("perhaps lacking CAP_SYS_ADMIN or ceccomp is in seccomp mode") #define M_GET_FILTER_UNSUPPORTED \ _ ("PTRACE_GET_SECCOMP_FILTER is not supported on your system") #define M_CECCOMP_IN_SECCOMP \ _ ("Ceccomp is in seccomp mode, fetching seccomp filters of other process " \ "is not permitted") #define M_GET_FILTER_UNSUPPORTED_OR_NO_FILTER \ _ ("perhaps PTRACE_GET_SECCOMP_FILTER is not supported or no seccomp " \ "filter in target process") // parse_args #define M_INVALID_COLOR_MODE _ ("Invalid color mode") #define M_INVALID_ASM_FMT _ ("Invalid asm format") #define M_INVALID_NUMBER _ ("Invalid number") #define M_UNABLE_OPEN_FILE _ ("Unable to open file %s: %s") // read_source #define M_READ_FAIL _ ("Reading input failed: %s") #define M_FOUND_SUS_ZERO \ _ ("Found '\\0' at file offset %lu, perhaps it's not a text file?") #define M_FOUND_SUS_NO_LF \ _ ("No line break in source file, perhaps it's not a text file?") #define M_FOUND_SUS_LINE \ _ ("Line %u has more than %u bytes, perhaps the input is not a text file?") #define M_FILE_TOO_LARGE _ ("The input file is greater than 4 MiB!") #define M_LINES_TOO_MANY \ _ ("Found more than 16384 lines of text, perhaps it's not for ceccomp?") // hash #define M_CANNOT_FIND_LABEL _ ("Can not find label declaration") // parser #define M_UNEXPECT_TOKEN _ ("Unexpected token") #define M_DUPLICATED_LABEL _ ("Found duplicated label declaration") #define M_NUMBER_OVERFLOW _ ("Input number exceeds 32-bit range") #define M_EXPECT_OPERATOR _ ("Expect operator") #define M_EXPECT_RIGHT_VAR _ ("Expect rvalue") #define M_EXPECT_RETURN_VAL _ ("Expect return value") #define M_EXPECT_NUMBER _ ("Expect number") #define M_EXPECT_PAREN _ ("Expect parenthesis") #define M_EXPECT_BRACKET _ ("Expect bracket") #define M_EXPECT_COMPARTOR _ ("Expect comparator") #define M_EXPECT_LABEL _ ("Expect label") #define M_EXPECT_SYSCALL _ ("Expect valid syscall name") #define M_EXPECT_ARCH \ _ ("Architecture token does not match any libseccomp arch, perhaps system " \ "libseccomp is too old") // EXPECT_SYSCALL also use in resolver #define M_EXPECT_GOTO _ ("Expect 'goto'") #define M_EXPECT_A _ ("Expect '$A'") #define M_EXPECT_ELSE _ ("Expect 'else'") // resolver and check_prog #define M_RIGHT_SHOULD_BE_A _ ("Rvalue should be '$A'") #define M_RIGHT_CAN_NOT_BE_A _ ("Rvalue can not be '$A'") #define M_RIGHT_CAN_NOT_BE_X _ ("Rvalue can not be '$X'") #define M_RIGHT_SHOULD_BE_A_OR_X _ ("Rvalue should be '$A' or '$X'") #define M_RIGHT_SHOULD_BE_X_OR_NUM _ ("Rvalue should be '$X' or number") #define M_OPERATOR_SHOULD_BE_EQUAL _ ("Operator should be '='") #define M_LEFT_SHOULD_BE_A _ ("Lvalue should be '$A'") #define M_INVALID_ATTR_LOAD \ _ ("seccomp_data load offset must be 4-byte aligned") #define M_ATTR_OFFSET_OVERFLOW \ _ ("seccomp_data load offset greater than the struct") #define M_ARGS_IDX_OUT_OF_RANGE _ ("Args index out of range (0-5)") #define M_MEM_IDX_OUT_OF_RANGE _ ("Mem index out of range (0-15)") #define M_UNINITIALIZED_MEM _ ("Accessing uninitialized mem") #define M_ALU_DIV_BY_ZERO _ ("Dividing by zero") #define M_ALU_SH_OUT_OF_RANGE _ ("Left or right shifting more than 32 bits") #define M_RET_DATA_OVERFLOW _ ("Data carried by return motion exceeds 0xffff") #define M_JT_TOO_FAR _ ("JT is larger than 0xff") #define M_JT_MUST_BE_POSITIVE _ ("JT must be positive") #define M_JF_TOO_FAR _ ("JF is larger than 0xff") #define M_JF_MUST_BE_POSITIVE _ ("JF must be positive") #define M_JT_INVALID_TAG _ ("JT out of filters") #define M_JF_INVALID_TAG _ ("JF out of filters") #define M_JA_OUT_OF_FILTERS _ ("JA out of filters") #define M_JA_MUST_BE_POSITIVE _ ("JA must be positive") #define M_MUST_END_WITH_RET _ ("BPF filters must end with return") #define M_NO_VALID_CODE _ ("The input does not contain any valid statement") #define M_INVALID_OPERATION _ ("Invalid or unknown operation") // capture #define M_UNEXPECTED_EBPF_INSN \ _ ("Unexpected bpf_insn (#%u) in kernel migrated eBPF (assertion failed " \ "at %s#L%d: %s), please open an issue and upload your eBPF case") #define M_SAVE_EBPF_SUCCEEDED \ _ ("Your eBPF case has been saved in %s (binary file)") #define M_SAVE_EBPF_FAILED _ ("Failed to save your eBPF case due to %s") #define M_EBPF_INPUT_ERROR \ _ ("#%u: Input eBPF insn does not meet assertion at %s#L%d: %s\n%s") #define M_FAILED_EBPF_CONVERSION _ ("Failed to convert eBPF back to cBPF") #define M_PROCESS_HAS_FILTER_COUNT _ ("Process %d has %d seccomp filter(s)") #define M_UNKNOWN_PROG_ABORTED \ _ ("eBPF program failed to locate seccomp filters, %s") #define M_UNKNOWN_TASK_ABORTED \ _ ("eBPF program failed to retrieve seccomp filter in a task, %s") #define M_PID_NOT_FOUND _ ("Process %d does not exist") #define M_CAPTURE_PID_HELP _ ("please run 'bpftool prog trace' for details.") #define M_PROG_TRUNCATED \ _ ("Too many seccomp filters (> 32) in a task! The rest are truncated.") #define M_FAILED_OPEN_LOAD _ ("Failed to open or load eBPF prog %s") #define M_FAILED_UPDATE_MAP _ ("Failed to update eBPF map") #define M_FAILED_CREATE_RINGBUF _ ("Failed to create ring buffer") #define M_FAILED_ATTACH _ ("Failed to attach eBPF prog") #define M_CAPTURE_EBPF_IN_TASK \ _ ("Capturing new seccomp filter in process %d (%s)") #define M_CAPTURE_DISABLED \ _ ("Capture is disabled during configuration, probably due to absence of " \ "libbpf. You may rebuild it with libbpf support.") #define M_EBPF_NOT_CAPABLE \ _ ("Loading eBPF program require CAP_SYS_ADMIN || (CAP_BPF && " \ "CAP_PERFMON), you may rerun ceccomp with sudo.") #define M_LINUX_NO_TASK_FROM_PID \ _ ("Your kernel (%d.%d) is so old that task_from_pid is not available.") #define M_CAPTURE_POLL_FAIL _ ("Did not receive any message from eBPF!") #define M_CAPTURE_POLL_ERROR \ _ ("Did not receive any message from eBPF, due to %s") #endif ceccomp-4.3.1/include/utils/hash.h000066400000000000000000000005621526046660400170230ustar00rootroot00000000000000#ifndef HASH_H #define HASH_H #include "main.h" #include #include typedef string_t hkey_t; // return 0 if successfully inserted; -1 for ENOMEM; 1 for duplicated key extern int insert_key (const hkey_t *key, uint16_t line_nr); extern uint16_t find_key (const hkey_t *key); extern void init_table (void); extern void free_table (void); #endif ceccomp-4.3.1/include/utils/logger.h000066400000000000000000000017121526046660400173550ustar00rootroot00000000000000#ifndef LOGGER_H #define LOGGER_H #include "attributes.h" #include #include #include typedef enum { LV_DEBUG = 0, LV_INFO = 1, LV_WARN = 2, LV_ERROR = 3, } print_level_t; // clang-format off AttrNoInline AttrPrintf(3, 4) void info_print (print_level_t lv, const char *caller_func, const char *fmt, ...); AttrNoReturn AttrNoInline AttrPrintf(2, 3) void error_print (const char *caller_func, const char *fmt, ...); // clang-format on int ceccomp_vprint (bool from_external, print_level_t lv, const char *caller_func, const char *fmt, va_list args); #ifdef DEBUG #define debug(fmt, ...) info_print (LV_DEBUG, __func__, fmt, __VA_ARGS__) #else #define debug(fmt, ...) ; #endif // !DEBUG #define info(fmt, ...) info_print (LV_INFO, __func__, fmt, __VA_ARGS__) #define warn(fmt, ...) info_print (LV_WARN, __func__, fmt, __VA_ARGS__) #define error(fmt, ...) error_print (__func__, fmt, __VA_ARGS__) #endif ceccomp-4.3.1/include/utils/parse_args.h000066400000000000000000000026141526046660400202260ustar00rootroot00000000000000#ifndef PARSEARGS_H #define PARSEARGS_H #include #include #include #include typedef enum { ASM_MODE, CAPTURE_MODE, DISASM_MODE, EMU_MODE, TRACE_MODE, PROBE_MODE, HELP_MODE, VERSION_MODE, HELP_ABNORMAL, } subcommand_t; typedef enum { HEXLINE, HEXFMT, RAW, C_MACRO, } print_mode_t; typedef enum { ALWAYS, AUTO, NEVER, } color_mode_t; typedef struct { uint32_t scmp_arch; print_mode_t mode; FILE *text_file; } asm_arg_t; typedef struct { uint32_t scmp_arch; bool ebpf; FILE *raw_file; } disasm_arg_t; typedef struct { uint32_t scmp_arch; bool quiet; FILE *text_file; const char *sys_name; uint64_t args[6]; uint64_t ip; } emu_arg_t; typedef struct { FILE *output_file; bool quiet; uint32_t prog_idx; } probe_arg_t; typedef enum { UNDECIDED, TRACE_PROG, TRACE_PID, } trace_mode_t; typedef struct { trace_mode_t mode; bool quiet; FILE *output_file; uint32_t prog_idx; pid_t pid; bool seize; } trace_arg_t; typedef struct { pid_t pid; uint32_t scmp_arch; } capture_arg_t; typedef struct { subcommand_t cmd; color_mode_t when; asm_arg_t *asm_arg; disasm_arg_t *disasm_arg; emu_arg_t *emu_arg; probe_arg_t *probe_arg; trace_arg_t *trace_arg; capture_arg_t *capture_arg; } ceccomp_arg_t; extern error_t parse_opt (int key, char *arg, struct argp_state *state); #endif ceccomp-4.3.1/include/utils/proc_status.h000066400000000000000000000011701526046660400204420ustar00rootroot00000000000000#ifndef PROCSTATUS_H #define PROCSTATUS_H #include "config.h" #include #define PROCFS_ERROR -1 typedef enum { STATUS_NONE = 0, STATUS_STRICT_MODE = 1, STATUS_FILTER_MODE = 2, } seccomp_mode; typedef enum { STATUS_NOT_KTHREAD = 0, STATUS_KTHREAD = 1, } kthread_mode; extern seccomp_mode get_proc_seccomp (pid_t pid); extern kthread_mode is_proc_kthread (pid_t pid); extern pid_t get_tracer_pid (pid_t pid); extern int may_be_listener_fd (int pid, long rax); #if EBPF_SUPPORT == 1 // return -1 if failed to read /proc, return 1 if capable, 0 if not capable extern int have_bpf_cap (void); #endif #endif ceccomp-4.3.1/include/utils/read_source.h000066400000000000000000000004051526046660400203670ustar00rootroot00000000000000#ifndef READ_SOURCE_H #define READ_SOURCE_H #include // read file at once, the pointer is all fixed extern unsigned init_source (FILE *read_fp); // return NULL to indicate EOF extern char *next_line (void); extern void free_source (void); #endif ceccomp-4.3.1/include/utils/reverse_endian.h000066400000000000000000000014251526046660400210700ustar00rootroot00000000000000#ifndef REVERSE_ENDIAN_H #define REVERSE_ENDIAN_H #include "attributes.h" #include "main.h" #include #include #include #include #include AttrConst static inline bool need_reverse_endian (uint32_t target_scmp_arch) { #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ return (target_scmp_arch & __AUDIT_ARCH_LE); #else return !(target_scmp_arch & __AUDIT_ARCH_LE); #endif } static inline void reverse_endian (filter *f) { f->code = bswap_16 (f->code); f->k = bswap_32 (f->k); } static inline void reverse_ebpf_endian (struct bpf_insn *insn) { insn->off = bswap_16 (insn->off); insn->imm = bswap_32 (insn->imm); uint8_t tmp_reg = insn->dst_reg; insn->dst_reg = insn->src_reg; insn->src_reg = tmp_reg; } #endif ceccomp-4.3.1/include/utils/str_pile.h000066400000000000000000000011161526046660400177150ustar00rootroot00000000000000#ifndef STRING_PILE_H #define STRING_PILE_H #include "main.h" #include #include /** * Initialize string pile with init_size to mmap. init_size will be aligned up * to 0x1000. * Returns if mmap succeeded. */ extern bool init_pile (size_t init_size); /** * Slice some mmap memory to store syscall name. * sysname: syscall name string. NULL-terminated. * arch: a token from token_pairs. if not NULL, store "arch.sysname", else * "sysname". */ extern string_t persist_object (const char *sysname, const string_t *arch); extern void free_pile (void); #endif ceccomp-4.3.1/include/utils/valid_insns.h000066400000000000000000000007511526046660400204110ustar00rootroot00000000000000#ifndef VALID_INSNS_H #define VALID_INSNS_H #include "attributes.h" #include #define MAX_VALID_INSN 172 /* A map maps insn code to index in insn_names. The size of the array is * exactly `MAX_VALID_INSN + 1`. If a insn code is valid, the corresponding * index is non-zero. */ extern const uint8_t insn_name_map[]; /* Convert insn code like BPF_ST to "BPF_ST". Assume `insn_code` is valid in * seccomp checks. */ AttrPure const char *get_insn_name (int insn_code); #endif ceccomp-4.3.1/include/utils/vector.h000066400000000000000000000014111526046660400173740ustar00rootroot00000000000000#ifndef VECTOR_H #define VECTOR_H #include #include // A vector store statement ordered by code_nr // A vector stores statement_t ptr ordered by text_nr // code_nr and text_nr both starts from 1 // statement at index 0 should be ignored // eof_lines won't be in the vector typedef struct { uint32_t count; uint32_t capacity; size_t elem_size; void *data; } vector_t; extern void *reallocate (void *p, size_t new_size); // set initial_capcity to 0 to let vector grow itself extern void init_vector (vector_t *v, size_t elem_size, size_t initial_capcity); extern void free_vector (vector_t *v); extern void *push_vector (vector_t *v, const void *elem); extern void *get_vector (vector_t *v, uint32_t idx); #endif ceccomp-4.3.1/include/x-macro/000077500000000000000000000000001526046660400161325ustar00rootroot00000000000000ceccomp-4.3.1/include/x-macro/arch_table.h000066400000000000000000000020021526046660400203610ustar00rootroot00000000000000#ifndef X #include #define X(int_arch, scmp_arch) #define FALLBACK_X(int_arch) #endif X (ARCH_X86, SCMP_ARCH_X86) X (ARCH_X86_64, SCMP_ARCH_X86_64) X (ARCH_X32, SCMP_ARCH_X32) X (ARCH_AARCH64, SCMP_ARCH_AARCH64) X (ARCH_ARM, SCMP_ARCH_ARM) #if SCMP_VER_MAJOR >= 2 && SCMP_VER_MINOR >= 6 X (ARCH_LOONGARCH64, SCMP_ARCH_LOONGARCH64) X (ARCH_M68K, SCMP_ARCH_M68K) X (ARCH_SH, SCMP_ARCH_SH) X (ARCH_SHEB, SCMP_ARCH_SHEB) #else FALLBACK_X (ARCH_LOONGARCH64) FALLBACK_X (ARCH_M68K) FALLBACK_X (ARCH_SH) FALLBACK_X (ARCH_SHEB) #endif X (ARCH_MIPSEL64N32, SCMP_ARCH_MIPSEL64N32) X (ARCH_MIPSEL64, SCMP_ARCH_MIPSEL64) X (ARCH_MIPSEL, SCMP_ARCH_MIPSEL) X (ARCH_MIPS64N32, SCMP_ARCH_MIPS64N32) X (ARCH_MIPS64, SCMP_ARCH_MIPS64) X (ARCH_MIPS, SCMP_ARCH_MIPS) X (ARCH_PARISC64, SCMP_ARCH_PARISC64) X (ARCH_PARISC, SCMP_ARCH_PARISC) X (ARCH_PPC64LE, SCMP_ARCH_PPC64LE) X (ARCH_PPC64, SCMP_ARCH_PPC64) X (ARCH_PPC, SCMP_ARCH_PPC) X (ARCH_S390X, SCMP_ARCH_S390X) X (ARCH_S390, SCMP_ARCH_S390) X (ARCH_RISCV64, SCMP_ARCH_RISCV64) ceccomp-4.3.1/include/x-macro/valid_codes.h000066400000000000000000000025741526046660400205670ustar00rootroot00000000000000#ifndef X #include #define X(idx, val) #endif /* REF https://elixir.bootlin.com/linux/v7.1.2/source/kernel/seccomp.c#L278 */ X (1, BPF_LD | BPF_W | BPF_ABS) X (2, BPF_LD | BPF_W | BPF_LEN) X (3, BPF_LDX | BPF_W | BPF_LEN) X (4, BPF_RET | BPF_K) X (5, BPF_RET | BPF_A) X (6, BPF_ALU | BPF_ADD | BPF_K) X (7, BPF_ALU | BPF_ADD | BPF_X) X (8, BPF_ALU | BPF_SUB | BPF_K) X (9, BPF_ALU | BPF_SUB | BPF_X) X (10, BPF_ALU | BPF_MUL | BPF_K) X (11, BPF_ALU | BPF_MUL | BPF_X) X (12, BPF_ALU | BPF_DIV | BPF_K) X (13, BPF_ALU | BPF_DIV | BPF_X) X (14, BPF_ALU | BPF_AND | BPF_K) X (15, BPF_ALU | BPF_AND | BPF_X) X (16, BPF_ALU | BPF_OR | BPF_K) X (17, BPF_ALU | BPF_OR | BPF_X) X (18, BPF_ALU | BPF_XOR | BPF_K) X (19, BPF_ALU | BPF_XOR | BPF_X) X (20, BPF_ALU | BPF_LSH | BPF_K) X (21, BPF_ALU | BPF_LSH | BPF_X) X (22, BPF_ALU | BPF_RSH | BPF_K) X (23, BPF_ALU | BPF_RSH | BPF_X) X (24, BPF_ALU | BPF_NEG) X (25, BPF_LD | BPF_IMM) X (26, BPF_LDX | BPF_IMM) X (27, BPF_MISC | BPF_TAX) X (28, BPF_MISC | BPF_TXA) X (29, BPF_LD | BPF_MEM) X (30, BPF_LDX | BPF_MEM) X (31, BPF_ST) X (32, BPF_STX) X (33, BPF_JMP | BPF_JA) X (34, BPF_JMP | BPF_JEQ | BPF_K) X (35, BPF_JMP | BPF_JEQ | BPF_X) X (36, BPF_JMP | BPF_JGE | BPF_K) X (37, BPF_JMP | BPF_JGE | BPF_X) X (38, BPF_JMP | BPF_JGT | BPF_K) X (39, BPF_JMP | BPF_JGT | BPF_X) X (40, BPF_JMP | BPF_JSET | BPF_K) X (41, BPF_JMP | BPF_JSET | BPF_X) ceccomp-4.3.1/po/000077500000000000000000000000001526046660400135575ustar00rootroot00000000000000ceccomp-4.3.1/po/Makefile000066400000000000000000000013431526046660400152200ustar00rootroot00000000000000GREEN := $(shell printf '\033[32m') RESET := $(shell printf '\033[0m') ECHO_NOPROG = printf " $(1)\t$(2)\n" INC_DIR := ../include SRC_DIR := ../src INC_SRCS := $(shell find $(INC_DIR) -name '*.h' | LC_ALL=C sort) C_SRCS := $(shell find $(SRC_DIR) -name '*.c' -or -name '*.s' | LC_ALL=C sort) SOURCES_LIST := SOURCES.txt POT_FILE := ceccomp.pot PO_ZHCN := zh_CN.po all: $(PO_ZHCN) $Q$(call ECHO_NOPROG,$(GREEN)UPDATED,po$(RESET)) $(SOURCES_LIST): $(INC_SRCS) $(C_SRCS) $Q$(call ECHO_NOPROG,TR,$@) $Qecho $^ | tr ' ' '\n' > $@ $(POT_FILE): $(SOURCES_LIST) $Q$(call ECHO_NOPROG,XGETTEXT,$@) $Qxgettext -k_ -o $@ -f $< $(PO_ZHCN): $(POT_FILE) $Q$(call ECHO_NOPROG,MSGMERGE,$@) $Qmsgmerge --previous --update $@ $< 2> /dev/null ceccomp-4.3.1/po/ceccomp.pot000066400000000000000000000324011526046660400157140ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-08-22 19:35+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../include/config.h:12 #, c-format msgid "" "ceccomp %s\n" "Tagged on %s\n" "Built by %s\n" msgstr "" #: ../include/config.h:13 msgid "Dependencies:\n" msgstr "" #: ../include/help.h:5 msgid "Usage: ceccomp \n" msgstr "" #: ../include/help.h:27 msgid "" "asm -- Assemble bpf text to raw bytes\n" "capture -- Install eBPF prog to capture all seccomp filters during " "installation or extract installed filters in a process\n" "disasm -- Disassemble raw bytes to bpf text\n" "emu -- Emulate bpf program with given syscall and bpf text\n" "help -- Display ceccomp help information\n" "probe -- Trace the program for the first filter and emulate common " "syscalls\n" "trace (dump) -- Run program or trace pid, extract bpf filter and then print " "to text\n" "version -- Display ceccomp version\n" msgstr "" #: ../include/help.h:40 msgid "" "Options:\n" "-a, --arch (x86_64|aarch64|...) Which architecture to resolve syscall_nr, " "read or write bytestream by the byteorder of arch, default as your arch\n" "-c, --color (auto|always|never) When to print in color, default as auto\n" "-e, --ebpf Treat input as eBPF-migrated filter bytes\n" "-f, --fmt (hexline|hexfmt|raw) Output format, default as hexline\n" "-o, --output file Print to file to avoid mixing ceccomp " "output and tracee program output, default as stderr\n" "-p, --pid task_id Extract bpf filters from process (or " "thread) and print with bpf text form; CAP_SYS_ADMIN is needed to work\n" "-q, --quiet Print emulate result only or suppress the " "process info message in trace and probe\n" "-s, --seize Follow process to trace load-filter " "operation\n" "\n" "syscall_nr System call number or name (e.g. 0|read)\n" "args[0-5], ip args and ip (instruction pointer) used for " "emulation, default as 0\n" "raw, text File with BPF RAW or BPF TEXT, see docs for " "detail, default as stdin\n" msgstr "" #: ../include/utils/error.h:6 #, c-format msgid "Architecture name %s is not supported" msgstr "" #: ../include/utils/error.h:8 msgid "Found errors when assembling BPF from trace" msgstr "" #: ../include/utils/error.h:9 #, c-format msgid "Failed to request a temporary file: %s" msgstr "" #: ../include/utils/error.h:13 msgid "Found errors when assembling text before emulating" msgstr "" #: ../include/utils/error.h:14 msgid "Please input syscall_nr (syscall name or number)" msgstr "" #: ../include/utils/error.h:15 msgid "Invalid syscall_nr" msgstr "" #: ../include/utils/error.h:18 msgid "Found errors when assembling" msgstr "" #: ../include/utils/error.h:19 msgid "Input file has more than 4096 statements!" msgstr "" #: ../include/utils/error.h:22 msgid "Found fatal errors when disassembling" msgstr "" #: ../include/utils/error.h:23 msgid "The input is empty" msgstr "" #: ../include/utils/error.h:25 msgid "The input is larger than 4096 filters! Perhaps inputting a wrong file?" msgstr "" #: ../include/utils/error.h:28 #, c-format msgid "%u byte(s) at the end of input could not fit into a filter" msgstr "" #: ../include/utils/error.h:31 #, c-format msgid "Start tracing process %d" msgstr "" #: ../include/utils/error.h:32 #, c-format msgid "Peekdata failed at %p" msgstr "" #: ../include/utils/error.h:33 msgid "Failed to execute new program" msgstr "" #: ../include/utils/error.h:34 #, c-format msgid "Process %d spawned a new pid %d" msgstr "" #: ../include/utils/error.h:35 #, c-format msgid "Process %d exited" msgstr "" #: ../include/utils/error.h:36 #, c-format msgid "Process %d invoked seccomp (%s, %s, &prog)" msgstr "" #: ../include/utils/error.h:38 #, c-format msgid "Process %d invoked prctl (PR_SET_SECCOMP, %s, &prog)" msgstr "" #: ../include/utils/error.h:39 #, c-format msgid "Process %d failed to load seccomp filter: %s" msgstr "" #: ../include/utils/error.h:40 msgid "Unknown reason" msgstr "" #: ../include/utils/error.h:41 msgid "Procfs not accessible, unable to perform" msgstr "" #: ../include/utils/error.h:42 msgid "Found unresolvable non-classic BPF, skipping" msgstr "" #: ../include/utils/error.h:43 msgid "Kernel thread can not be seized" msgstr "" #: ../include/utils/error.h:44 #, c-format msgid "No seccomp filters found in process %d" msgstr "" #: ../include/utils/error.h:46 #, c-format msgid "Target process is already being traced by process %d" msgstr "" #: ../include/utils/error.h:48 #, c-format msgid "" "Process %d loaded strict seccomp mode, which only allows read, write, " "exit_group and sigreturn!" msgstr "" #: ../include/utils/error.h:50 #, c-format msgid "Unknown error when get filter: %s" msgstr "" #: ../include/utils/error.h:51 #, c-format msgid "Unknown error when seizing process: %s" msgstr "" #: ../include/utils/error.h:52 msgid "The process to seize does not exist" msgstr "" #: ../include/utils/error.h:57 msgid "" "Unexpected race condition detected when reading seccomp filters, please " "consider use capture subcommand" msgstr "" #: ../include/utils/error.h:60 #, c-format msgid "Can not trace child process %d, probably because it is being traced" msgstr "" #: ../include/utils/error.h:63 msgid "perhaps seizing kthread or lacking CAP_SYS_PTRACE" msgstr "" #: ../include/utils/error.h:65 msgid "Run with CAP_SYS_ADMIN capability to fetch seccomp filters" msgstr "" #: ../include/utils/error.h:67 msgid "Run with CAP_SYS_PTRACE capability to seize a foreign process" msgstr "" #: ../include/utils/error.h:69 msgid "32-bit tracer can not ptrace 64-bit tracee" msgstr "" #: ../include/utils/error.h:71 #, c-format msgid "libseccomp does not support the tracee's arch (%#x)" msgstr "" #: ../include/utils/error.h:73 msgid "perhaps lacking CAP_SYS_ADMIN or ceccomp is in seccomp mode" msgstr "" #: ../include/utils/error.h:75 msgid "PTRACE_GET_SECCOMP_FILTER is not supported on your system" msgstr "" #: ../include/utils/error.h:77 msgid "" "Ceccomp is in seccomp mode, fetching seccomp filters of other process is not " "permitted" msgstr "" #: ../include/utils/error.h:80 msgid "" "perhaps PTRACE_GET_SECCOMP_FILTER is not supported or no seccomp filter in " "target process" msgstr "" #: ../include/utils/error.h:84 msgid "Invalid color mode" msgstr "" #: ../include/utils/error.h:85 msgid "Invalid asm format" msgstr "" #: ../include/utils/error.h:86 msgid "Invalid number" msgstr "" #: ../include/utils/error.h:87 #, c-format msgid "Unable to open file %s: %s" msgstr "" #: ../include/utils/error.h:90 #, c-format msgid "Reading input failed: %s" msgstr "" #: ../include/utils/error.h:92 #, c-format msgid "Found '\\0' at file offset %lu, perhaps it's not a text file?" msgstr "" #: ../include/utils/error.h:94 msgid "No line break in source file, perhaps it's not a text file?" msgstr "" #: ../include/utils/error.h:96 #, c-format msgid "Line %u has more than %u bytes, perhaps the input is not a text file?" msgstr "" #: ../include/utils/error.h:97 msgid "The input file is greater than 4 MiB!" msgstr "" #: ../include/utils/error.h:99 msgid "Found more than 16384 lines of text, perhaps it's not for ceccomp?" msgstr "" #: ../include/utils/error.h:102 msgid "Can not find label declaration" msgstr "" #: ../include/utils/error.h:105 msgid "Unexpected token" msgstr "" #: ../include/utils/error.h:106 msgid "Found duplicated label declaration" msgstr "" #: ../include/utils/error.h:107 msgid "Input number exceeds 32-bit range" msgstr "" #: ../include/utils/error.h:109 msgid "Expect operator" msgstr "" #: ../include/utils/error.h:110 msgid "Expect rvalue" msgstr "" #: ../include/utils/error.h:111 msgid "Expect return value" msgstr "" #: ../include/utils/error.h:113 msgid "Expect number" msgstr "" #: ../include/utils/error.h:114 msgid "Expect parenthesis" msgstr "" #: ../include/utils/error.h:115 msgid "Expect bracket" msgstr "" #: ../include/utils/error.h:116 msgid "Expect comparator" msgstr "" #: ../include/utils/error.h:117 msgid "Expect label" msgstr "" #: ../include/utils/error.h:118 msgid "Expect valid syscall name" msgstr "" #: ../include/utils/error.h:120 msgid "" "Architecture token does not match any libseccomp arch, perhaps system " "libseccomp is too old" msgstr "" #: ../include/utils/error.h:124 msgid "Expect 'goto'" msgstr "" #: ../include/utils/error.h:125 msgid "Expect '$A'" msgstr "" #: ../include/utils/error.h:126 msgid "Expect 'else'" msgstr "" #: ../include/utils/error.h:129 msgid "Rvalue should be '$A'" msgstr "" #: ../include/utils/error.h:130 msgid "Rvalue can not be '$A'" msgstr "" #: ../include/utils/error.h:131 msgid "Rvalue can not be '$X'" msgstr "" #: ../include/utils/error.h:133 msgid "Rvalue should be '$A' or '$X'" msgstr "" #: ../include/utils/error.h:134 msgid "Rvalue should be '$X' or number" msgstr "" #: ../include/utils/error.h:135 msgid "Operator should be '='" msgstr "" #: ../include/utils/error.h:136 msgid "Lvalue should be '$A'" msgstr "" #: ../include/utils/error.h:138 msgid "seccomp_data load offset must be 4-byte aligned" msgstr "" #: ../include/utils/error.h:140 msgid "seccomp_data load offset greater than the struct" msgstr "" #: ../include/utils/error.h:142 msgid "Args index out of range (0-5)" msgstr "" #: ../include/utils/error.h:143 msgid "Mem index out of range (0-15)" msgstr "" #: ../include/utils/error.h:144 msgid "Accessing uninitialized mem" msgstr "" #: ../include/utils/error.h:145 msgid "Dividing by zero" msgstr "" #: ../include/utils/error.h:146 msgid "Left or right shifting more than 32 bits" msgstr "" #: ../include/utils/error.h:148 msgid "Data carried by return motion exceeds 0xffff" msgstr "" #: ../include/utils/error.h:149 msgid "JT is larger than 0xff" msgstr "" #: ../include/utils/error.h:150 msgid "JT must be positive" msgstr "" #: ../include/utils/error.h:151 msgid "JF is larger than 0xff" msgstr "" #: ../include/utils/error.h:152 msgid "JF must be positive" msgstr "" #: ../include/utils/error.h:153 msgid "JT out of filters" msgstr "" #: ../include/utils/error.h:154 msgid "JF out of filters" msgstr "" #: ../include/utils/error.h:155 msgid "JA out of filters" msgstr "" #: ../include/utils/error.h:156 msgid "JA must be positive" msgstr "" #: ../include/utils/error.h:158 msgid "BPF filters must end with return" msgstr "" #: ../include/utils/error.h:159 msgid "The input does not contain any valid statement" msgstr "" #: ../include/utils/error.h:161 msgid "Invalid or unknown operation" msgstr "" #: ../include/utils/error.h:165 #, c-format msgid "" "Unexpected bpf_insn (#%u) in kernel migrated eBPF (assertion failed at " "%s#L%d: %s), please open an issue and upload your eBPF case" msgstr "" #: ../include/utils/error.h:168 #, c-format msgid "Your eBPF case has been saved in %s (binary file)" msgstr "" #: ../include/utils/error.h:169 #, c-format msgid "Failed to save your eBPF case due to %s" msgstr "" #: ../include/utils/error.h:171 #, c-format msgid "" "#%u: Input eBPF insn does not meet assertion at %s#L%d: %s\n" "%s" msgstr "" #: ../include/utils/error.h:172 msgid "Failed to convert eBPF back to cBPF" msgstr "" #: ../include/utils/error.h:173 #, c-format msgid "Process %d has %d seccomp filter(s)" msgstr "" #: ../include/utils/error.h:175 #, c-format msgid "eBPF program failed to locate seccomp filters, %s" msgstr "" #: ../include/utils/error.h:177 #, c-format msgid "eBPF program failed to retrieve seccomp filter in a task, %s" msgstr "" #: ../include/utils/error.h:178 #, c-format msgid "Process %d does not exist" msgstr "" #: ../include/utils/error.h:179 msgid "please run 'bpftool prog trace' for details." msgstr "" #: ../include/utils/error.h:181 msgid "Too many seccomp filters (> 32) in a task! The rest are truncated." msgstr "" #: ../include/utils/error.h:182 #, c-format msgid "Failed to open or load eBPF prog %s" msgstr "" #: ../include/utils/error.h:183 msgid "Failed to update eBPF map" msgstr "" #: ../include/utils/error.h:184 msgid "Failed to create ring buffer" msgstr "" #: ../include/utils/error.h:185 msgid "Failed to attach eBPF prog" msgstr "" #: ../include/utils/error.h:187 #, c-format msgid "Capturing new seccomp filter in process %d (%s)" msgstr "" #: ../include/utils/error.h:189 msgid "" "Capture is disabled during configuration, probably due to absence of libbpf. " "You may rebuild it with libbpf support." msgstr "" #: ../include/utils/error.h:192 msgid "" "Loading eBPF program require CAP_SYS_ADMIN || (CAP_BPF && CAP_PERFMON), you " "may rerun ceccomp with sudo." msgstr "" #: ../include/utils/error.h:195 #, c-format msgid "Your kernel (%d.%d) is so old that task_from_pid is not available." msgstr "" #: ../include/utils/error.h:196 msgid "Did not receive any message from eBPF!" msgstr "" #: ../include/utils/error.h:198 #, c-format msgid "Did not receive any message from eBPF, due to %s" msgstr "" ceccomp-4.3.1/po/zh_CN.po000066400000000000000000000477511526046660400151360ustar00rootroot00000000000000# localization for ceccomp in Chinese simplified. # Copyright (C) 2025-present ceccomp contributors # This file is distributed under the same license as the ceccomp package. # SPDX-FileCopyrightText: 2025 dbgbgtf 1 # # SPDX-FileCopyrightText: 2025-2026 RocketDev msgid "" msgstr "" "Project-Id-Version: ceccomp 4.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-08-22 19:35+0800\n" "PO-Revision-Date: 2026-08-22 19:35+0800\n" "Last-Translator: Rocket Ma \n" "Language-Team: Chinese \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.9\n" #: ../include/config.h:12 #, c-format msgid "" "ceccomp %s\n" "Tagged on %s\n" "Built by %s\n" msgstr "" "ceccomp %s\n" "在 %s å�‘布\n" "ç”± %s 构建\n" #: ../include/config.h:13 msgid "Dependencies:\n" msgstr "ä¾�赖:\n" #: ../include/help.h:5 msgid "Usage: ceccomp \n" msgstr "用法: ceccomp <å­�命令> <å�‚æ•°> <选项>\n" #: ../include/help.h:27 msgid "" "asm -- Assemble bpf text to raw bytes\n" "capture -- Install eBPF prog to capture all seccomp filters during " "installation or extract installed filters in a process\n" "disasm -- Disassemble raw bytes to bpf text\n" "emu -- Emulate bpf program with given syscall and bpf text\n" "help -- Display ceccomp help information\n" "probe -- Trace the program for the first filter and emulate common " "syscalls\n" "trace (dump) -- Run program or trace pid, extract bpf filter and then print " "to text\n" "version -- Display ceccomp version\n" msgstr "" "asm -- 把 bpf text 编译为 raw bytes\n" "capture -- 安装 eBPF 程åº�以在 seccomp 过滤器安装时将其全部æ�•获或从进程中" "æ��å�–安装过的过滤器\n" "disasm -- 把 raw bytes 编译为 bpf text\n" "emu -- 在给定的 syscall å’Œ bpf text 下模拟 bpf 程åº�的结果\n" "help -- 显示帮助信æ�¯\n" "probe -- trace 程åº�,对程åº�中出现的第一个 filter 模拟常è§�çš„ syscall\n" "trace (dump) -- è¿�行程åº�或追踪指定 pid,æ��å�– bpf 过滤器,并打å�° text 结果\n" "version -- 显示 ceccomp 版本\n" "\n" #: ../include/help.h:40 msgid "" "Options:\n" "-a, --arch (x86_64|aarch64|...) Which architecture to resolve syscall_nr, " "read or write bytestream by the byteorder of arch, default as your arch\n" "-c, --color (auto|always|never) When to print in color, default as auto\n" "-e, --ebpf Treat input as eBPF-migrated filter bytes\n" "-f, --fmt (hexline|hexfmt|raw) Output format, default as hexline\n" "-o, --output file Print to file to avoid mixing ceccomp " "output and tracee program output, default as stderr\n" "-p, --pid task_id Extract bpf filters from process (or " "thread) and print with bpf text form; CAP_SYS_ADMIN is needed to work\n" "-q, --quiet Print emulate result only or suppress the " "process info message in trace and probe\n" "-s, --seize Follow process to trace load-filter " "operation\n" "\n" "syscall_nr System call number or name (e.g. 0|read)\n" "args[0-5], ip args and ip (instruction pointer) used for " "emulation, default as 0\n" "raw, text File with BPF RAW or BPF TEXT, see docs for " "detail, default as stdin\n" msgstr "" "选项:\n" "-a, --arch (x86_64|aarch64|...) 选择哪一个架构æ�¥è§£æž� syscall_nr,默认为你的" "æž¶æž„\n" "-c, --color (auto|always|never) 指定何时使用彩色输出, 默认为 auto\n" "-e, --ebpf 视输入为已转æ�¢ä¸º eBPF çš„ seccomp 过滤器字" "节\n" "-f, --fmt (hexline|hexfmt|raw) 输出格å¼�, 默认为 hexline\n" "-o, --output file 将结果打å�°åˆ°æ–‡ä»¶æ�¥é�¿å…�æ··æ·† ceccomp 输出和 " "tracee 程åº�输出,默认打å�°è‡³ stderr\n" "-p, --pid task_id 从进程中æ��å�– bpf 过滤器,并打å�°ä¸º text æ ¼" "å¼�; 需è¦� CAP_SYS_ADMIN æ�¥è¿�作\n" "-q, --quiet å�ªæ‰“å�° emulate 结果或在 trace å’Œ probe 时抑" "制进程的 INFO 消æ�¯\n" "-s, --seize 追踪进程以分æž�加载过滤器的æ“�作\n" "\n" "syscall_nr 系统调用å�·æˆ–系统调用å�� (示例 0|read)\n" "args[0-5], ip 用æ�¥æ¨¡æ‹Ÿçš„系统调用的å�‚æ•°å’Œ ip (instruction " "pointer),默认为 0\n" "raw, text raw 或 text 文件,默认为 stdin。更多细节请查" "阅文档\n" #: ../include/utils/error.h:6 #, c-format msgid "Architecture name %s is not supported" msgstr "ä¸�支æŒ�å��为 %s 的架构" #: ../include/utils/error.h:8 msgid "Found errors when assembling BPF from trace" msgstr "当汇编从 trace å�–å¾—çš„ BPF æ—¶å�‘现错误" #: ../include/utils/error.h:9 #, c-format msgid "Failed to request a temporary file: %s" msgstr "无法申请临时文件:%s" #: ../include/utils/error.h:13 msgid "Found errors when assembling text before emulating" msgstr "在模拟å‰�汇编 text æ—¶å�‘现错误" #: ../include/utils/error.h:14 msgid "Please input syscall_nr (syscall name or number)" msgstr "请输入 syscall_nr(syscall å��字或数字)" #: ../include/utils/error.h:15 msgid "Invalid syscall_nr" msgstr "无效的系统调用å�·" #: ../include/utils/error.h:18 msgid "Found errors when assembling" msgstr "汇编时å�‘现错误" #: ../include/utils/error.h:19 msgid "Input file has more than 4096 statements!" msgstr "输入包å�«è¶…过 4096 行伪代ç �ï¼�" #: ../include/utils/error.h:22 msgid "Found fatal errors when disassembling" msgstr "å��汇编时å�‘现致命错误" #: ../include/utils/error.h:23 msgid "The input is empty" msgstr "输入为空" #: ../include/utils/error.h:25 msgid "The input is larger than 4096 filters! Perhaps inputting a wrong file?" msgstr "输入大å°�超过了 4096 个过滤器的大å°�ï¼�å�¯èƒ½è¾“入了错误的文件?" #: ../include/utils/error.h:28 #, c-format msgid "%u byte(s) at the end of input could not fit into a filter" msgstr "输入末尾的 %u 个字节无法放入一个过滤器中" #: ../include/utils/error.h:31 #, c-format msgid "Start tracing process %d" msgstr "开始追踪进程 %d" #: ../include/utils/error.h:32 #, c-format msgid "Peekdata failed at %p" msgstr "无法在 %p peekdata" #: ../include/utils/error.h:33 msgid "Failed to execute new program" msgstr "无法执行新程åº�" #: ../include/utils/error.h:34 #, c-format msgid "Process %d spawned a new pid %d" msgstr "进程 %d 派生了新进程 %d" #: ../include/utils/error.h:35 #, c-format msgid "Process %d exited" msgstr "进程 %d 退出" #: ../include/utils/error.h:36 #, c-format msgid "Process %d invoked seccomp (%s, %s, &prog)" msgstr "进程 %d 执行了 seccomp (%s, %s, &prog)" #: ../include/utils/error.h:38 #, c-format msgid "Process %d invoked prctl (PR_SET_SECCOMP, %s, &prog)" msgstr "进程 %d 执行了 prctl (PR_SET_SECCOMP, %s, &prog)" #: ../include/utils/error.h:39 #, c-format msgid "Process %d failed to load seccomp filter: %s" msgstr "进程 %d 加载 seccomp 过滤器失败:%s" #: ../include/utils/error.h:40 msgid "Unknown reason" msgstr "未知的原因" #: ../include/utils/error.h:41 msgid "Procfs not accessible, unable to perform" msgstr "Procfs 无法访问,无法执行" #: ../include/utils/error.h:42 msgid "Found unresolvable non-classic BPF, skipping" msgstr "å�‘现无法解æž�çš„é�žç»�å…¸ BPF,跳过" #: ../include/utils/error.h:43 msgid "Kernel thread can not be seized" msgstr "内核线程ä¸�能被附加" #: ../include/utils/error.h:44 #, c-format msgid "No seccomp filters found in process %d" msgstr "在进程 %d 中没有找到 seccomp 过滤器" #: ../include/utils/error.h:46 #, c-format msgid "Target process is already being traced by process %d" msgstr "目标进程已ç»�被进程 %d 追踪" #: ../include/utils/error.h:48 #, c-format msgid "" "Process %d loaded strict seccomp mode, which only allows read, write, " "exit_group and sigreturn!" msgstr "" "进程 %d 加载了严格 seccomp 模å¼�,å�ªæœ‰ read, write, exit_group å’Œ sigreturn 被" "å…�许ï¼�" #: ../include/utils/error.h:50 #, c-format msgid "Unknown error when get filter: %s" msgstr "在 get filter æ—¶å�‘生未知错误:%s" #: ../include/utils/error.h:51 #, c-format msgid "Unknown error when seizing process: %s" msgstr "在附加到进程时å�‘生未知错误:%s" #: ../include/utils/error.h:52 msgid "The process to seize does not exist" msgstr "è¦�附加的进程ä¸�存在" #: ../include/utils/error.h:57 msgid "" "Unexpected race condition detected when reading seccomp filters, please " "consider use capture subcommand" msgstr "" "在读å�– seccomp 过滤器时检测到æ„�料之外的æ�¡ä»¶ç«žäº‰ï¼Œè¯·è€ƒè™‘使用 capture å­�命令" #: ../include/utils/error.h:60 #, c-format msgid "Can not trace child process %d, probably because it is being traced" msgstr "无法追踪å­�进程 %d,å�¯èƒ½æ˜¯å› ä¸ºå…¶æ­£åœ¨è¢«è¿½è¸ª" #: ../include/utils/error.h:63 msgid "perhaps seizing kthread or lacking CAP_SYS_PTRACE" msgstr "å�¯èƒ½æ­£åœ¨é™„加到内核线程或缺少 CAP_SYS_PTRACE æ�ƒèƒ½" #: ../include/utils/error.h:65 msgid "Run with CAP_SYS_ADMIN capability to fetch seccomp filters" msgstr "以 CAP_SYS_ADMIN æ�ƒèƒ½è¿�行æ�¥èŽ·å�– seccomp 过滤器" #: ../include/utils/error.h:67 msgid "Run with CAP_SYS_PTRACE capability to seize a foreign process" msgstr "以 CAP_SYS_PTRACE æ�ƒèƒ½è¿�行æ�¥é™„加到一个外部进程" #: ../include/utils/error.h:69 msgid "32-bit tracer can not ptrace 64-bit tracee" msgstr "32 ä½� tracer 无法 ptrace 64 ä½� tracee" #: ../include/utils/error.h:71 #, c-format msgid "libseccomp does not support the tracee's arch (%#x)" msgstr "libseccomp ä¸�支æŒ� tracee 的架构 (%#x)" #: ../include/utils/error.h:73 msgid "perhaps lacking CAP_SYS_ADMIN or ceccomp is in seccomp mode" msgstr "å�¯èƒ½ç¼ºå°‘ CAP_SYS_ADMIN æ�ƒèƒ½æˆ– ceccomp 处于 seccomp 模å¼�" #: ../include/utils/error.h:75 msgid "PTRACE_GET_SECCOMP_FILTER is not supported on your system" msgstr "PTRACE_SECCOMP_GET_FILTER 在您的系统上ä¸�支æŒ�" #: ../include/utils/error.h:77 msgid "" "Ceccomp is in seccomp mode, fetching seccomp filters of other process is not " "permitted" msgstr "Ceccomp 处在 seccomp 模å¼�,ä¸�å…�许获å�–其他进程的 seccomp 过滤器" #: ../include/utils/error.h:80 msgid "" "perhaps PTRACE_GET_SECCOMP_FILTER is not supported or no seccomp filter in " "target process" msgstr "" "å�¯èƒ½ PTRACE_SECCOMP_GET_FILTER 在您的系统上ä¸�支æŒ�或目标进程没有 seccomp 过滤" "器" #: ../include/utils/error.h:84 msgid "Invalid color mode" msgstr "无效的颜色模å¼�" #: ../include/utils/error.h:85 msgid "Invalid asm format" msgstr "无效的 asm æ ¼å¼�å�‚æ•°" #: ../include/utils/error.h:86 msgid "Invalid number" msgstr "无效的数字" #: ../include/utils/error.h:87 #, c-format msgid "Unable to open file %s: %s" msgstr "无法打开文件 %s: %s" #: ../include/utils/error.h:90 #, c-format msgid "Reading input failed: %s" msgstr "读å�–输入失败:%s" #: ../include/utils/error.h:92 #, c-format msgid "Found '\\0' at file offset %lu, perhaps it's not a text file?" msgstr "在文件å��ç§» %lu 处å�‘现 '\\0',å�¯èƒ½ä¸�是一个文本文件?" #: ../include/utils/error.h:94 msgid "No line break in source file, perhaps it's not a text file?" msgstr "没有在æº�文件中找到æ�¢è¡Œç¬¦ï¼Œå�¯èƒ½ä¸�是一个文本文件?" #: ../include/utils/error.h:96 #, c-format msgid "Line %u has more than %u bytes, perhaps the input is not a text file?" msgstr "第 %u 行上有超过 %u 个字节,å�¯èƒ½è¾“å…¥ä¸�是一个文本文件?" #: ../include/utils/error.h:97 msgid "The input file is greater than 4 MiB!" msgstr "输入的文件超过了 4 MiBï¼�" #: ../include/utils/error.h:99 msgid "Found more than 16384 lines of text, perhaps it's not for ceccomp?" msgstr "文件中包å�«è¶…过 16384 行,å�¯èƒ½å®ƒä¸�是给 ceccomp 用的?" #: ../include/utils/error.h:102 msgid "Can not find label declaration" msgstr "无法找到标签声明" #: ../include/utils/error.h:105 msgid "Unexpected token" msgstr "æ„�料之外的 token" #: ../include/utils/error.h:106 msgid "Found duplicated label declaration" msgstr "å�‘现é‡�å¤�的标签声明" #: ../include/utils/error.h:107 msgid "Input number exceeds 32-bit range" msgstr "输入的数字超过了 32 ä½�的范围" #: ../include/utils/error.h:109 msgid "Expect operator" msgstr "期待一个æ“�作符" #: ../include/utils/error.h:110 msgid "Expect rvalue" msgstr "期待一个å�³å€¼" #: ../include/utils/error.h:111 msgid "Expect return value" msgstr "期待一个 return 值" #: ../include/utils/error.h:113 msgid "Expect number" msgstr "期待一个数字" #: ../include/utils/error.h:114 msgid "Expect parenthesis" msgstr "期待一个å°�括å�·" #: ../include/utils/error.h:115 msgid "Expect bracket" msgstr "期待一个中括å�·" #: ../include/utils/error.h:116 msgid "Expect comparator" msgstr "期待一个比较符" #: ../include/utils/error.h:117 msgid "Expect label" msgstr "期待一个标签" #: ../include/utils/error.h:118 msgid "Expect valid syscall name" msgstr "期待一个系统调用å��ç§°" #: ../include/utils/error.h:120 msgid "" "Architecture token does not match any libseccomp arch, perhaps system " "libseccomp is too old" msgstr "" "æž¶æž„ token 没有匹é…�到任何 libseccomp 支æŒ�的架构,å�¯èƒ½æ˜¯å› ä¸ºç³»ç»Ÿ libseccomp 太" "è€�了" #: ../include/utils/error.h:124 msgid "Expect 'goto'" msgstr "期待一个 'goto'" #: ../include/utils/error.h:125 msgid "Expect '$A'" msgstr "期待一个 '$A'" #: ../include/utils/error.h:126 msgid "Expect 'else'" msgstr "期待一个 'else'" #: ../include/utils/error.h:129 msgid "Rvalue should be '$A'" msgstr "å�³å€¼åº”该为 '$A'" #: ../include/utils/error.h:130 msgid "Rvalue can not be '$A'" msgstr "å�³å€¼ä¸�能为 '$A'" #: ../include/utils/error.h:131 msgid "Rvalue can not be '$X'" msgstr "å�³å€¼ä¸�能为 '$X'" #: ../include/utils/error.h:133 msgid "Rvalue should be '$A' or '$X'" msgstr "å�³å€¼åº”该为 '$A' 或 '$X'" #: ../include/utils/error.h:134 msgid "Rvalue should be '$X' or number" msgstr "å�³å€¼åº”该为 '$X' 或数字" #: ../include/utils/error.h:135 msgid "Operator should be '='" msgstr "æ“�作符应该为 '='" #: ../include/utils/error.h:136 msgid "Lvalue should be '$A'" msgstr "左值应该为 '$A'" #: ../include/utils/error.h:138 msgid "seccomp_data load offset must be 4-byte aligned" msgstr "seccomp_data 加载å��移必须对é½�到 4 字节" #: ../include/utils/error.h:140 msgid "seccomp_data load offset greater than the struct" msgstr "seccomp_data 加载å��移超过了结构体本身的大å°�" #: ../include/utils/error.h:142 msgid "Args index out of range (0-5)" msgstr "访问 args 索引超出范围 (0-5)" #: ../include/utils/error.h:143 msgid "Mem index out of range (0-15)" msgstr "访问 mem 索引超出范围 (0-5)" #: ../include/utils/error.h:144 msgid "Accessing uninitialized mem" msgstr "å°�试访问未åˆ�始化的 mem" #: ../include/utils/error.h:145 msgid "Dividing by zero" msgstr "除以零" #: ../include/utils/error.h:146 msgid "Left or right shifting more than 32 bits" msgstr "左移或å�³ç§»è¶…过 32 ä½�" #: ../include/utils/error.h:148 msgid "Data carried by return motion exceeds 0xffff" msgstr "return 动作æ�ºå¸¦çš„ data 超过了 0xffff" #: ../include/utils/error.h:149 msgid "JT is larger than 0xff" msgstr "JT 大于了 0xff" #: ../include/utils/error.h:150 msgid "JT must be positive" msgstr "JT 必须是正数" #: ../include/utils/error.h:151 msgid "JF is larger than 0xff" msgstr "JF 大于了 0xff" #: ../include/utils/error.h:152 msgid "JF must be positive" msgstr "JF 必须是正数" #: ../include/utils/error.h:153 msgid "JT out of filters" msgstr "JT 超出 BPF 长度" #: ../include/utils/error.h:154 msgid "JF out of filters" msgstr "JF 超出 BPF 长度" #: ../include/utils/error.h:155 msgid "JA out of filters" msgstr "跳转结果超出 BPF 长度" #: ../include/utils/error.h:156 msgid "JA must be positive" msgstr "JA 必须是正数" #: ../include/utils/error.h:158 msgid "BPF filters must end with return" msgstr "BPF 过滤器必须以 return 结尾" #: ../include/utils/error.h:159 msgid "The input does not contain any valid statement" msgstr "输入ä¸�包å�«ä»»ä½•有效的伪代ç �" #: ../include/utils/error.h:161 msgid "Invalid or unknown operation" msgstr "无效或未知的æ“�作符" #: ../include/utils/error.h:165 #, c-format msgid "" "Unexpected bpf_insn (#%u) in kernel migrated eBPF (assertion failed at " "%s#L%d: %s), please open an issue and upload your eBPF case" msgstr "" "在内核转æ�¢çš„ eBPF 中å�‘现了æ„�料之外的 bpf_insn (#%u) (断言失败于 %s#L%d: %s)," "请开一个 issue 并上传您的 eBPF 案例" #: ../include/utils/error.h:168 #, c-format msgid "Your eBPF case has been saved in %s (binary file)" msgstr "您的 eBPF 案例已ä¿�存到 %s (二进制文件)" #: ../include/utils/error.h:169 #, c-format msgid "Failed to save your eBPF case due to %s" msgstr "由于 %s,无法ä¿�存您的 eBPF 案例" #: ../include/utils/error.h:171 #, c-format msgid "" "#%u: Input eBPF insn does not meet assertion at %s#L%d: %s\n" "%s" msgstr "" "#%u: 输入的 eBPF 指令无法满足ä½�于 %s#L%d: %s 的断言\n" "%s" #: ../include/utils/error.h:172 msgid "Failed to convert eBPF back to cBPF" msgstr "无法把 eBPF 转æ�¢å›ž cBPF" #: ../include/utils/error.h:173 #, c-format msgid "Process %d has %d seccomp filter(s)" msgstr "进程 %d 有 %d 个 seccomp 过滤器" #: ../include/utils/error.h:175 #, c-format msgid "eBPF program failed to locate seccomp filters, %s" msgstr "eBPF 程åº�无法定ä½� seccomp 过滤器,%s" #: ../include/utils/error.h:177 #, c-format msgid "eBPF program failed to retrieve seccomp filter in a task, %s" msgstr "eBPF 程åº�无法从 task 中å�–å¾— seccomp 过滤器,%s" #: ../include/utils/error.h:178 #, c-format msgid "Process %d does not exist" msgstr "进程 %d ä¸�存在" #: ../include/utils/error.h:179 msgid "please run 'bpftool prog trace' for details." msgstr "请è¿�行 'bpftool prog trace' 以获å�–详情。" #: ../include/utils/error.h:181 msgid "Too many seccomp filters (> 32) in a task! The rest are truncated." msgstr "Task 里的 seccomp 过滤器太多了 (> 32)ï¼�剩下的将被截断。" #: ../include/utils/error.h:182 #, c-format msgid "Failed to open or load eBPF prog %s" msgstr "无法打开或加载 eBPF 程åº� %s" #: ../include/utils/error.h:183 msgid "Failed to update eBPF map" msgstr "无法更新 eBPF map" #: ../include/utils/error.h:184 msgid "Failed to create ring buffer" msgstr "无法创建环形缓冲区" #: ../include/utils/error.h:185 msgid "Failed to attach eBPF prog" msgstr "无法附加到 eBPF 程åº�" #: ../include/utils/error.h:187 #, c-format msgid "Capturing new seccomp filter in process %d (%s)" msgstr "在进程 %d (%s) 中æ�•获新 seccomp 过滤器" #: ../include/utils/error.h:189 msgid "" "Capture is disabled during configuration, probably due to absence of libbpf. " "You may rebuild it with libbpf support." msgstr "" "æ�•获功能在é…�置过程中被ç¦�用,å�¯èƒ½æ˜¯å› ä¸ºç¼ºå°‘ libbpf。您需è¦�在有 libbpf 支æŒ�下é‡�" "新编译 ceccomp。" #: ../include/utils/error.h:192 msgid "" "Loading eBPF program require CAP_SYS_ADMIN || (CAP_BPF && CAP_PERFMON), you " "may rerun ceccomp with sudo." msgstr "" "加载 eBPF 程åº�需è¦� CAP_SYS_ADMIN || (CAP_BPF && CAP_PERFMON),您å�¯èƒ½éœ€è¦�用 " "sudo é‡�æ–°è¿�行 ceccomp。" #: ../include/utils/error.h:195 #, c-format msgid "Your kernel (%d.%d) is so old that task_from_pid is not available." msgstr "您的内核 (%d.%d) 太è€�,以致 task_from_pid ä¸�å�¯ç”¨ã€‚" #: ../include/utils/error.h:196 msgid "Did not receive any message from eBPF!" msgstr "未从 eBPF 接收到任何消æ�¯ï¼�" #: ../include/utils/error.h:198 #, c-format msgid "Did not receive any message from eBPF, due to %s" msgstr "由于 %s,未从 eBPF 接收到任何消æ�¯" #~ msgid "" #~ "please read output from /sys/kernel/debug/tracing/trace_pipe for details." #~ msgstr "请从 /sys/kernel/debug/tracing/trace_pipe 读å�–详细输出" ceccomp-4.3.1/py-temp/000077500000000000000000000000001526046660400145345ustar00rootroot00000000000000ceccomp-4.3.1/py-temp/ceccomp/000077500000000000000000000000001526046660400161455ustar00rootroot00000000000000ceccomp-4.3.1/py-temp/ceccomp/__init__.py000066400000000000000000000004271526046660400202610ustar00rootroot00000000000000import os import sys from pathlib import Path import stat def main(): bin_path = Path(__file__).parent / "ceccomp" os.chmod(bin_path, os.stat(bin_path).st_mode | stat.S_IEXEC) os.execv(bin_path, [str(bin_path)] + sys.argv[1:]) if __name__ == "__main__": main() ceccomp-4.3.1/py-temp/pyproject.toml000066400000000000000000000006671526046660400174610ustar00rootroot00000000000000[build-system] requires = ["setuptools>=69"] build-backend = "setuptools.build_meta" [project] name = "ceccomp" version = "3.5" description = "A C-based seccomp analysis tool" authors = [{name = "dbgbgtf", email = "dudududumaxver@outlook.com"}] license = "GPL-3.0-or-later" scripts = { "ceccomp" = "ceccomp:main"} [tool.setuptools] packages = ["ceccomp"] include-package-data = true [tool.setuptools.package-data] ceccomp = ["ceccomp"] ceccomp-4.3.1/pytest.ini000066400000000000000000000000501526046660400151650ustar00rootroot00000000000000[pytest] addopts = -rx testpaths = test ceccomp-4.3.1/scripts/000077500000000000000000000000001526046660400146305ustar00rootroot00000000000000ceccomp-4.3.1/scripts/check-version.hook000077500000000000000000000020231526046660400202520ustar00rootroot00000000000000#!/bin/bash COMMIT_MSG_FILE="$1" if [[ $COMMIT_MSG_FILE == "install" ]]; then ln -sf ../../scripts/$(basename $0) .git/hooks/commit-msg echo "commit-msg hook installed" exit 0 fi VERSION_REGEX='\b[0-9]+\.[0-9]+\b' print_highlight() { echo -e "\x1b[33m$1\x1b[0m" >&2 } if grep -qE "$VERSION_REGEX" "$COMMIT_MSG_FILE"; then print_highlight "========================================" print_highlight "Version update detected!" print_highlight "Please check if updated configure" print_highlight "========================================" print_highlight python3 scripts/complete-url.py --check > /dev/null action_req=$? if [ $action_req -eq 1 ]; then print_highlight "========================================" print_highlight "There are raw reference to issues/pulls in CHANGELOG!" print_highlight "Please run scripts/complete-url.py to format" print_highlight "========================================" print_highlight exit 1 fi fi exit 0 ceccomp-4.3.1/scripts/complete-url.py000066400000000000000000000056631526046660400176240ustar00rootroot00000000000000#!/usr/bin/python3 import re import sys import os CHANGELOG = 'CHANGELOG.md' DEFAULT_REPO = 'ceccomp/ceccomp' # match 3 raw ref case:#123, !456, user/repo#789, user/repo!456 pattern = re.compile(r'(?:\s+)((?:[\w.-]+/[\w.-]+)?[#!]\d+)$') # match '@username ' user_pat = re.compile(r'@([a-zA-Z0-9_-]+) ') def convert(token: str) -> str: """Convert raw ref to URL""" repo = DEFAULT_REPO if '#' in token: if '/' in token.split('#')[0]: repo, number = token.split('#', 1) else: number = token[1:] return f'https://github.com/{repo}/issues/{number}' if '!' in token: if '/' in token.split('!')[0]: repo, number = token.split('!', 1) else: number = token[1:] return f'https://github.com/{repo}/pulls/{number}' assert False, f'Token {token} does not match any case, what the hack?' def flush_refs(output_lines: list[str], refs: dict[str, str], need_lf: bool): """Write refs at the end of paragraph""" if refs: if need_lf: output_lines.append('\n') # terminate list output_lines.extend(f'[{token}]: {url}\n' for token, url in refs.items()) refs.clear() def main(): if not os.path.isdir('.git'): print('Please goto repo root first', file=sys.stderr) sys.exit(2) is_check = len(sys.argv) > 1 and sys.argv[1] == '--check' has_match = False with open(CHANGELOG) as f: lines = f.readlines() refs = {} # token:url output_lines = [] has_old_ref = False for lineno, line in enumerate(lines, start=1): if line.startswith('##'): flush_refs(output_lines, refs, not has_old_ref) has_old_ref = False elif line.startswith('['): has_old_ref = True # look for @user in line, NOT AT LINE END! mu = user_pat.search(line) if mu: user = mu.group(1) url = f'https://github.com/{user}' refs[f'@{user}'] = url line = line.replace(mu.group(0), f':heart: [@{user}] ') if is_check: print(f'[line {lineno}] found: {user}') has_match = True m = pattern.search(line) if m: token = m.group(1) url = convert(token) refs[token] = url new_line = line[: m.start(1)].rstrip() + f' :link: [{token}]\n' if is_check: print(f'[line {lineno}] found: {token}') has_match = True else: output_lines.append(new_line) elif not is_check: output_lines.append(line) # flush at EOF flush_refs(output_lines, refs, not has_old_ref) if not is_check: with open(CHANGELOG, 'w') as f: f.writelines(output_lines) # set exit code to 1 when see convertible ref in check mode if is_check and has_match: sys.exit(1) if __name__ == '__main__': main() ceccomp-4.3.1/scripts/compress-images.sh000077500000000000000000000002201526046660400202570ustar00rootroot00000000000000#!/bin/sh magick mogrify -format webp -resize 70% -quality 80 -define webp:method=6 -alpha remove -define webp:lossless=false docs/images/*.png ceccomp-4.3.1/scripts/find-unused-macros.sh000077500000000000000000000017771526046660400207060ustar00rootroot00000000000000#!/bin/bash macros=($(grep -P '(?<=^#define )[A-Z0-9_]+' -ohr include --exclude-dir=lib/ | sort | uniq)) echo "Collected ${#macros[@]} macros from include" not_found=() for macro in "${macros[@]}"; do grep -E "\b$macro\b" -r src -r ebpf &>/dev/null if [ $? -ne 0 ]; then not_found+=("$macro") fi done echo "Found $((${#macros[@]} - ${#not_found[@]})) macro reference in src" if [ ${#not_found[@]} -eq 0 ]; then echo "All macros found" exit 0 fi unused=() for macro in "${not_found[@]}"; do cnt=$(grep -E "\b$macro\b" -ohr include --exclude-dir=lib/ --exclude-dir=ebpf/ 2>/dev/null | wc -l) if [ $cnt -eq 1 ]; then unused+=("$macro") fi done echo "Found $((${#not_found[@]} - ${#unused[@]})) macro reference in include" if [ ${#unused[@]} -eq 0 ]; then echo "All macros found" exit 0 fi echo "Found ${#unused[@]} macros unused!" for macro in "${unused[@]}"; do grep -E "\b$macro\b" -nr include --exclude-dir=lib/ --exclude-dir=ebpf/ --color=auto done exit 1 ceccomp-4.3.1/scripts/release-changelog.py000066400000000000000000000022601526046660400205470ustar00rootroot00000000000000#!/usr/bin/python3 import sys import re CHANGELOG = 'CHANGELOG.md' if len(sys.argv) < 2: print(f'Usage: python {sys.argv[0]} ', file=sys.stderr) sys.exit(1) tag = sys.argv[1] if not re.match(r'v\d+\.\d+(\.\d+)?', tag): print(f'The tag {tag} does not match the rule vX.X or vX.X.X', file=sys.stderr) sys.exit(1) version = tag[1:] print(f'Locating version {version} in {CHANGELOG}', file=sys.stderr) pattern_version = re.compile(rf'^##\s*{re.escape(version)}\s*') pattern_header = re.compile(r'^##\s*') lines = None try: with open(CHANGELOG) as f: lines = f.readlines() except OSError as e: print(f'Failed to read file {CHANGELOG}: {e}') sys.exit(1) capturing = False for line in lines: if not capturing: # mark if found the target version section if pattern_version.match(line.strip()): capturing = True else: # print the whole line if the line is not next version section if pattern_header.match(line.strip()): break print(line, end='') # already containing a '\n' if not capturing: # no match print(f'No match version section for {version}', file=sys.stderr) sys.exit(1) ceccomp-4.3.1/scripts/update-bpf.sh000077500000000000000000000012341526046660400172160ustar00rootroot00000000000000#!/bin/bash override_bpf() { ./build/ceccomp asm -c always -f raw $1 > $2 2>&1 } # for txt in test/text/*; do # bpf=${txt/text/bpf} # bpf=${bpf}.bpf # override_bpf $txt $bpf # done override_text() { ./build/ceccomp disasm -c always $1 > $2 2>&1 } for bpf in test/bpf/*; do txt=${bpf%.bpf} txt=${txt/bpf/text} override_text $bpf $txt done override_emu() { ./build/ceccomp emu -c always $1 $2 1 2 3 4 5 6 > $3 2>&1 } for text in test/text/*; do emu_result=${text/text/emu_result} override_emu $text open $emu_result.open override_emu $text pipe $emu_result.pipe override_emu $text accept $emu_result.accept done ceccomp-4.3.1/scripts/upload-pypi.sh000077500000000000000000000030311526046660400174270ustar00rootroot00000000000000#!/bin/bash set -e # 通用构建函数 build_and_upload() { BUILD_TARGET=$1 WHEEL_TAG=$2 echo "===== 构建架构:($BUILD_TARGET) =====" ./configure \ --debug-level=0 \ --enable-static \ --without-i18n \ --without-doc \ --packager=pip \ --build=${BUILD_TARGET} make clean make mv build/ceccomp py-temp/ceccomp/ cd py-temp python -m build --wheel oldfile=$(ls dist/ceccomp-*-py3-none-any.whl | head -n 1) newfile="${oldfile/any/${WHEEL_TAG}}" mv "$oldfile" "$newfile" twine upload "$newfile" --repository ceccomp rm -rf dist/ build/ ceccomp.egg-info/ wheelhouse/ ceccomp/ceccomp cd .. } build_x86_64() { build_and_upload "x86_64-linux-gnu" "manylinux1_x86_64" } build_i386() { build_and_upload "i386-linux-gnu" "manylinux1_i686" } build_aarch64() { build_and_upload "aarch64-linux-gnu" "manylinux2014_aarch64" } build_armhf() { build_and_upload "arm-linux-gnueabihf" "manylinux2014_armv7l" } build_riscv64() { build_and_upload "riscv64-linux-gnu" "manylinux_2_31_riscv64" } # æ ¹æ�®å�‚数选择执行 case "$1" in x86_64) build_x86_64;; i386) build_i386;; aarch64) build_aarch64;; armhf) build_armhf;; riscv64) build_riscv64;; all) build_x86_64 build_i386 build_aarch64 build_armhf build_riscv64 ;; *) echo "用法: $0 {x86_64|i386|aarch64|armhf|riscv64|all}" exit 1 ;; esac ceccomp-4.3.1/src/000077500000000000000000000000001526046660400137305ustar00rootroot00000000000000ceccomp-4.3.1/src/asm.c000066400000000000000000000315241526046660400146610ustar00rootroot00000000000000#include "asm.h" #include "attributes.h" #include "lexical/parser.h" #include "lexical/scanner.h" #include "lexical/token.h" #include "main.h" #include "resolver/resolver.h" #include "utils/arch_trans.h" #include "utils/error.h" #include "utils/logger.h" #include "utils/parse_args.h" #include "utils/read_source.h" #include "utils/reverse_endian.h" #include "utils/valid_insns.h" #include "utils/vector.h" #include #include #include #include #include #include #include #include #include #include #define BASE_retvals(value) ((value) - KILL_PROC) static uint32_t retvals[] = { [BASE_retvals (KILL_PROC)] = SCMP_ACT_KILL_PROCESS, [BASE_retvals (KILL)] = SCMP_ACT_KILL, [BASE_retvals (ALLOW)] = SCMP_ACT_ALLOW, [BASE_retvals (NOTIFY)] = SCMP_ACT_NOTIFY, [BASE_retvals (LOG)] = SCMP_ACT_LOG, [BASE_retvals (TRACE)] = SCMP_ACT_TRACE (0), [BASE_retvals (TRAP)] = _SCMP_ACT_TRAP (0), [BASE_retvals (ERRNO)] = SCMP_ACT_ERRNO (0), }; AttrPure static filter return_line (const return_line_t *return_line) { filter f = { .code = BPF_RET, .jf = 0, .jt = 0, .k = 0 }; if (return_line->ret_obj.type == A) { f.code |= BPF_A; return f; } f.code |= BPF_K; if (return_line->ret_obj.type == NUMBER) f.k = return_line->ret_obj.data; else // KILL, KILL_PROC, ALLOW, NOTIFY, LOG has data = 0 f.k = retvals[BASE_retvals (return_line->ret_obj.type)] | return_line->ret_obj.data; return f; } #undef BASE_retvals #define BASE_operator(value) ((value) - ADD_TO) static const uint32_t operator_table[] = { [BASE_operator (ADD_TO)] = BPF_ADD, [BASE_operator (SUB_TO)] = BPF_SUB, [BASE_operator (MULTI_TO)] = BPF_MUL, [BASE_operator (DIVIDE_TO)] = BPF_DIV, [BASE_operator (LSH_TO)] = BPF_LSH, [BASE_operator (RSH_TO)] = BPF_RSH, [BASE_operator (AND_TO)] = BPF_AND, [BASE_operator (OR_TO)] = BPF_OR, [BASE_operator (XOR_TO)] = BPF_XOR, }; AttrPure static filter alu_line (const assign_line_t *assign_line) { filter f = { .code = BPF_ALU, .jf = 0, .jt = 0, .k = 0 }; f.code |= operator_table[BASE_operator (assign_line->operator)]; if (assign_line->right_var.type == X) f.code |= BPF_X; else if (assign_line->right_var.type == NUMBER) { f.code |= BPF_K; f.k = assign_line->right_var.data; } return f; } #undef BASE_operator AttrConst static filter negative_line (void) { filter f = { .code = BPF_ALU | BPF_NEG, .jf = 0, .jt = 0, .k = 0 }; return f; } AttrPure static filter st_stx_line (const assign_line_t *assign_line) { filter f = { .code = 0, .jf = 0, .jt = 0, .k = 0 }; f.k = assign_line->left_var.data; if (assign_line->right_var.type == A) f.code |= BPF_ST; else if (assign_line->right_var.type == X) f.code |= BPF_STX; return f; } AttrPure static filter ldx_line (const assign_line_t *assign_line) { filter f = { .code = 0, .jf = 0, .jt = 0, .k = 0 }; if (assign_line->right_var.type == A) { f.code |= BPF_MISC | BPF_TAX; return f; } if (assign_line->right_var.type == NUMBER) f.code |= BPF_LDX | BPF_IMM; else if (assign_line->right_var.type == MEM) f.code |= BPF_LDX | BPF_MEM; else if (assign_line->right_var.type == ATTR_LEN) f.code |= BPF_LDX | BPF_LEN; else assert (!"right_var is neither NUM, MEM nor ATTR_LEN"); f.k = assign_line->right_var.data; return f; } #define BASE_off(value) ((value) - ATTR_SYSCALL) static const uint32_t offset_table[] = { [BASE_off (ATTR_SYSCALL)] = offsetof (seccomp_data, nr), [BASE_off (ATTR_ARCH)] = offsetof (seccomp_data, arch), [BASE_off (ATTR_LOWPC)] = offsetof (seccomp_data, instruction_pointer), [BASE_off (ATTR_HIGHPC)] = offsetof (seccomp_data, instruction_pointer) + 4, [BASE_off (ATTR_LOWARG)] = offsetof (seccomp_data, args), [BASE_off (ATTR_HIGHARG)] = offsetof (seccomp_data, args) + 4, }; AttrPure static uint32_t offset_abs (const obj_t *obj) { uint32_t offset = offset_table[BASE_off (obj->type)]; if (obj->type == ATTR_LOWARG || obj->type == ATTR_HIGHARG) offset += obj->data * sizeof (uint64_t); return offset; } #undef BASE_off AttrPure static filter ld_line (const assign_line_t *assign_line) { filter f = { .code = 0, .jf = 0, .jt = 0, .k = 0 }; if (assign_line->right_var.type == X) f.code |= BPF_MISC | BPF_TXA; else if (assign_line->right_var.type == ATTR_LEN) f.code |= BPF_LD | BPF_LEN; else if (assign_line->right_var.type == NUMBER) { f.code |= BPF_LD | BPF_IMM; f.k = assign_line->right_var.data; } else if (assign_line->right_var.type == MEM) { f.code |= BPF_LD | BPF_MEM; f.k = assign_line->right_var.data; } else { f.code |= BPF_LD | BPF_W | BPF_ABS; f.k = offset_abs (&assign_line->right_var); } return f; } AttrPure static filter assign_line (const assign_line_t *assign_line) { if (assign_line->operator >= ADD_TO && assign_line->operator <= XOR_TO) return alu_line (assign_line); if (assign_line->operator == NEGATIVE) return negative_line (); if (assign_line->left_var.type == MEM) return st_stx_line (assign_line); if (assign_line->left_var.type == X) return ldx_line (assign_line); assert (assign_line->left_var.type == A); return ld_line (assign_line); } static void reverse_jf_jt (jump_line_t *jump_line) { label_t tmp = jump_line->jt; jump_line->jt = jump_line->jf; jump_line->jf = tmp; } #define BASE_comparator(value) ((value) - EQUAL_EQUAL) static const uint32_t comparator_table[] = { [BASE_comparator (EQUAL_EQUAL)] = BPF_JEQ, [BASE_comparator (BANG_EQUAL)] = BPF_JEQ, [BASE_comparator (GREATER_EQUAL)] = BPF_JGE, [BASE_comparator (LESS_THAN)] = BPF_JGE, [BASE_comparator (GREATER_THAN)] = BPF_JGT, [BASE_comparator (LESS_EQUAL)] = BPF_JGT, [BASE_comparator (AND)] = BPF_JSET, }; static filter jump_line (jump_line_t *jump_line) { filter f = { .code = BPF_JMP, .jf = 0, .jt = 0, .k = 0 }; if (!jump_line->if_condition) { f.code |= BPF_JA; f.k |= jump_line->jt.code_nr; return f; } bool sym_reverse = false; token_type comparator = jump_line->comparator; if (comparator == BANG_EQUAL || comparator == LESS_EQUAL || comparator == LESS_THAN) sym_reverse = true; f.code |= comparator_table[BASE_comparator (jump_line->comparator)]; if (sym_reverse ^ jump_line->if_bang) reverse_jf_jt (jump_line); f.jt = jump_line->jt.code_nr; f.jf = jump_line->jf.code_nr; if (jump_line->cmpobj.type == X) f.code |= BPF_X; else if (jump_line->cmpobj.type == NUMBER) { f.code |= BPF_K; f.k = jump_line->cmpobj.data; } return f; } #undef BASE_comparator static filter asm_statement (statement_t *statement) { if (statement->type == RETURN_LINE) return return_line (&statement->return_line); if (statement->type == ASSIGN_LINE) return assign_line (&statement->assign_line); if (statement->type == JUMP_LINE) return jump_line (&statement->jump_line); assert (0); } typedef void (*fmt_handler) (filter *f, void *arg); static void hexify (uint8_t ch, char buf[2]) { #define HEX_CODE "0123456789abcdef" buf[0] = HEX_CODE[ch >> 4]; buf[1] = HEX_CODE[ch & 0xf]; } #define HEXFMT_TEMPLATE "\"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\",\n" #define HEXFMT_TEMPLATE_LEN LITERAL_STRLEN (HEXFMT_TEMPLATE) static void hexfmt_handle (filter *ft, void *template) { uint8_t *f = (uint8_t *)ft; for (unsigned i = 0; i < 8; i++) hexify (f[i], (char *)template + 3 + 4 * i); fwrite (template, 1, HEXFMT_TEMPLATE_LEN, stdout); } #define HEXLINE_TEMPLATE "\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00" #define HEXLINE_TEMPLATE_LEN LITERAL_STRLEN (HEXLINE_TEMPLATE) static void hexline_handle (filter *ft, void *template) { uint8_t *f = (uint8_t *)ft; for (unsigned i = 0; i < 8; i++) hexify (f[i], (char *)template + 2 + 4 * i); fwrite (template, 1, HEXLINE_TEMPLATE_LEN, stdout); } static void raw_handle (filter *f, void *template) { (void)template; fwrite (f, 1, sizeof (*f), stdout); } static void c_macro_handle (filter *f, void *arg) { statement_t *stmt = (statement_t *)arg; const char *code_str = get_insn_name (f->code); if (BPF_CLASS (f->code) == BPF_JMP) { comparator_t cmptype = stmt->jump_line.cmptype; if (cmptype == CMP_NUMBER || cmptype == CMP_ARCH_SYSCALL) // we explicitly ignore CMP_ARCH_SYSCALL as it can not be converted // into something like SYS_read or SCMP_ARCH_X86_64 fprintf (stdout, "BPF_JUMP(%s, %#x, %hhu, %hhu),\n", code_str, f->k, f->jt, f->jf); else if (cmptype == CMP_SYSCALL) fprintf (stdout, "BPF_JUMP(%s, SYS_%.*s, %hhu, %hhu),\n", code_str, stmt->jump_line.cmpobj.literal.len, stmt->jump_line.cmpobj.literal.start, f->jt, f->jf); else if (cmptype == CMP_ARCH) fprintf (stdout, "BPF_JUMP(%s, %s, %hhu, %hhu),\n", code_str, scmp_arch_to_scmp_str (f->k), f->jt, f->jf); else assert (!"Unexpected cmptype"); return; } // BPF_STMT if (f->code == (BPF_LD | BPF_W | BPF_ABS)) { const char *member; // offsetof (struct seccomp_data, arch) is excluded char *extra_off = f->k & 4 && f->k != 4 ? " + 4" : ""; switch (f->k >> 2) { // clang-format off case 0: member = "nr"; break; case 1: member = "arch"; break; case 2: case 3: member = "instruction_pointer"; break; case 4: case 5: member = "args[0]"; break; case 6: case 7: member = "args[1]"; break; case 8: case 9: member = "args[2]"; break; case 10: case 11: member = "args[3]"; break; case 12: case 13: member = "args[4]"; break; case 14: case 15: member = "args[5]"; break; default: assert(!"Unexpected filter->k"); // clang-format on } fprintf (stdout, "BPF_STMT(%s, offsetof(struct seccomp_data, %s)%s),\n", code_str, member, extra_off); return; } else if (f->code == (BPF_RET | BPF_K)) { const char *macro = NULL; switch (f->k) { // clang-format off #define DATALESS_CASE(value) case value: macro = #value; break // clang-format on DATALESS_CASE (SECCOMP_RET_KILL); DATALESS_CASE (SECCOMP_RET_KILL_PROCESS); DATALESS_CASE (SECCOMP_RET_ALLOW); DATALESS_CASE (SECCOMP_RET_LOG); DATALESS_CASE (SECCOMP_RET_USER_NOTIF); } if (macro) { fprintf (stdout, "BPF_STMT(%s, %s),\n", code_str, macro); return; } switch (f->k & SECCOMP_RET_ACTION) { // clang-format off #define DATAFUL_CASE(value) case value: macro = #value; break // clang-format on DATAFUL_CASE (SECCOMP_RET_TRACE); DATAFUL_CASE (SECCOMP_RET_TRAP); DATAFUL_CASE (SECCOMP_RET_ERRNO); } if (macro) { fprintf (stdout, "BPF_STMT(%s, %s | %#x),\n", code_str, macro, f->k & SECCOMP_RET_DATA); return; } } fprintf (stdout, "BPF_STMT(%s, %#x),\n", code_str, f->k); } static fmt_handler set_print_fmt (print_mode_t print_mode, char *template) { switch (print_mode) { case HEXFMT: memcpy (template, HEXFMT_TEMPLATE, HEXFMT_TEMPLATE_LEN + 1); return hexfmt_handle; case HEXLINE: memcpy (template, HEXLINE_TEMPLATE, HEXLINE_TEMPLATE_LEN + 1); return hexline_handle; case RAW: *template = '\0'; // for debugging, don't hurt performance return raw_handle; case C_MACRO: *template = '\0'; return c_macro_handle; default: assert (!"Unknown fmt printer"); } } void assemble (FILE *fp, uint32_t scmp_arch, print_mode_t print_mode) { size_t lines = init_source (fp) + 1; init_scanner (next_line ()); init_parser (scmp_arch); init_table (); vector_t text_v; vector_t code_ptr_v; init_vector (&text_v, sizeof (statement_t), lines); init_vector (&code_ptr_v, sizeof (statement_t *), MIN (lines, BPF_MAXINSNS + 1)); parser (&text_v, &code_ptr_v); if (resolver (&code_ptr_v)) error ("%s", M_ASM_TERMINATED); // if ERROR_LINE exists, then exits char fmt_template[64]; fmt_handler handle = set_print_fmt (print_mode, fmt_template); bool reverse = need_reverse_endian (scmp_arch) && print_mode != C_MACRO; for (uint32_t i = 1; i < code_ptr_v.count; i++) { statement_t **ptr = get_vector (&code_ptr_v, i); filter f = asm_statement (*ptr); if (reverse) reverse_endian (&f); handle (&f, print_mode != C_MACRO ? (void *)fmt_template : (void *)*ptr); } if (print_mode == HEXLINE) putc ('\n', stdout); free_table (); free_source (); free_vector (&text_v); free_vector (&code_ptr_v); } ceccomp-4.3.1/src/capture.c000066400000000000000000000176401526046660400155470ustar00rootroot00000000000000#include "attributes.h" #include "config.h" #include "utils/proc_status.h" #include #include #include #include #if EBPF_SUPPORT == 1 #define _NO_VMLINUX_ #include "capture.h" #include "disasm.h" #include "ebpf/capture.skel.h" #include "ebpf/capture_pid.skel.h" #include "main.h" #include "utils/bpf_trans.h" #include "utils/ebpf_share.h" #include #include #include #include #include #include #include #include #include #include #include #include #endif #include "utils/error.h" #include "utils/logger.h" #if EBPF_SUPPORT == 1 static int libbpf_msg_dispatcher (enum libbpf_print_level level, const char *fmt, va_list ap) { switch (level) { case LIBBPF_WARN: return ceccomp_vprint (true, LV_WARN, NULL, fmt, ap); case LIBBPF_INFO: return ceccomp_vprint (true, LV_INFO, NULL, fmt, ap); case LIBBPF_DEBUG: #ifdef DEBUG return ceccomp_vprint (true, LV_DEBUG, NULL, fmt, ap); #else return 0; #endif default: assert (!"Unexpected libbpf_print_level"); } } static bool linux_have_task_from_pid (int *restrict major, int *restrict minor) { struct utsname uts; assert (!uname (&uts)); char *end = NULL; *major = strtoul (uts.release, &end, 10); assert (*end == '.'); *minor = strtoul (end + 1, &end, 10); return *major > 6 || (*major == 6 && *minor >= 2); } typedef struct { FILE *fp; uint32_t scmp_arch; } global_event_ctx; typedef struct { pid_event event; uint32_t flen; uint32_t scmp_arch; pid_t target_pid; struct bpf_insn *ebpf_insns; } pid_event_ctx; AttrConst static uint32_t trans_ebpf_arch (ebpf_arch arch, uint32_t scmp_arch) { switch (arch) { #if defined(__x86_64__) case PROC_ARCH_X86: return SCMP_ARCH_X86; case PROC_ARCH_X64: return SCMP_ARCH_X86_64; #elif defined(__aarch64__) case PROC_ARCH_ARM: return SCMP_ARCH_ARM; case PROC_ARCH_AARCH64: return SCMP_ARCH_AARCH64; #else case PROC_ARCH_OTHERS: #endif default: return scmp_arch; } } static void do_ebpf_disasm (const pid_event_ctx *c, uint32_t default_scmp_arch) { #ifdef EXPORT #include #include // FOR DEBUGGING PURPOSE: directly export ebpf insn bytes char path[] = "XXXXXX.bin"; int fd = mkstemps (path, 4); fchmod (fd, 0666); FILE *f = fdopen (fd, "wb"); fwrite (c->ebpf_insns, sizeof (filter), c->flen, f); fclose (f); info ("Writing to %s", path); #endif filter *cbpf_buf = malloc (c->flen * sizeof (filter)); assert (cbpf_buf); int32_t cbpf_len = ebpf2cbpf (c->ebpf_insns, c->flen, cbpf_buf, true); if (UNLIKELY (cbpf_len == -1)) error ("%s", M_FAILED_EBPF_CONVERSION); fprog prog = { .len = cbpf_len, .filter = cbpf_buf }; uint32_t scmp_arch = trans_ebpf_arch (c->event.ebpf_arch, default_scmp_arch); print_prog (scmp_arch, &prog, 0, stdout, true); free (cbpf_buf); } static int on_pid_events (void *ctx, void *data, size_t size) { (void)size; pid_event *event = data; pid_event_ctx *c = ctx; static uint32_t insn_offset = 0; static bool count_printed = false; if (event->status == PID_NOT_FOUND) error (M_PID_NOT_FOUND, c->target_pid); if (!count_printed) { info (M_PROCESS_HAS_FILTER_COUNT, c->target_pid, event->filter_count); count_printed = true; } switch (event->status) { case CHUNK_DONE: case PROG_DONE: if (c->ebpf_insns == NULL) c->ebpf_insns = malloc (event->flen_total * sizeof (struct bpf_insn)); assert (c->ebpf_insns); memcpy (c->ebpf_insns + insn_offset, event->prog.filters, event->prog.flen * sizeof (struct bpf_insn)); insn_offset += event->prog.flen; if (event->status == CHUNK_DONE) break; c->event.ebpf_arch = event->ebpf_arch; c->flen = event->flen_total; do_ebpf_disasm (c, c->scmp_arch); // fall through // do some disasm here case PROG_ABORTED: if (event->status == PROG_ABORTED) warn (M_UNKNOWN_PROG_ABORTED, M_CAPTURE_PID_HELP); // reset everything insn_offset = 0; free (c->ebpf_insns); c->ebpf_insns = NULL; break; case TRUNCATED: case TASK_ABORTED: case ALL_DONE: c->event.status = event->status; if (event->status == TRUNCATED) warn ("%s", M_PROG_TRUNCATED); else if (event->status == TASK_ABORTED) warn (M_UNKNOWN_TASK_ABORTED, M_CAPTURE_PID_HELP); break; default: assert (!"Unexpected status received from ebpf"); break; } return 0; } static void capture_pid (pid_t pid, uint32_t scmp_arch) { struct capture_pid_bpf *skel; struct ring_buffer *rb; pid_event_ctx ctx = { .ebpf_insns = NULL, .scmp_arch = scmp_arch, .target_pid = pid }; int32_t err = 0; uint32_t zero = 0; pid_config config = { .target_pid = pid, .trigger_pid = getpid () }; skel = capture_pid_bpf__open_and_load (); if (!skel) { int major, minor; if (have_bpf_cap () == 0) error ("%s", M_EBPF_NOT_CAPABLE); if (!linux_have_task_from_pid (&major, &minor)) error (M_LINUX_NO_TASK_FROM_PID, major, minor); error (M_FAILED_OPEN_LOAD, __func__); } err = bpf_map_update_elem (bpf_map__fd (skel->maps.scmp_config), &zero, &config, BPF_ANY); if (err == -1) error ("%s", M_FAILED_UPDATE_MAP); rb = ring_buffer__new (bpf_map__fd (skel->maps.scmp_events), on_pid_events, &ctx, NULL); if (!rb) error ("%s", M_FAILED_CREATE_RINGBUF); err = capture_pid_bpf__attach (skel); if (err < 0) error ("%s", M_FAILED_ATTACH); uint32_t action = SECCOMP_RET_ALLOW; syscall (SYS_seccomp, SECCOMP_GET_ACTION_AVAIL, 0, &action); int rc; while ((ctx.event.status != ALL_DONE && ctx.event.status != TRUNCATED && ctx.event.status != TASK_ABORTED)) if ((rc = ring_buffer__poll (rb, 3000)) <= 0) { if (rc) error (M_CAPTURE_POLL_ERROR, strerror (-rc)); else error ("%s", M_CAPTURE_POLL_FAIL); } ring_buffer__free (rb); capture_pid_bpf__destroy (skel); } static int on_events (void *ctx, void *data, size_t size) { (void)size; global_event *event = data; global_event_ctx *c = ctx; if (event->op == SECCOMP_SET_MODE_STRICT) { warn (M_FOUND_STRICT_MODE, event->pid); return 0; } // event->op == SECCOMP_SET_MODE_FILTER info (M_CAPTURE_EBPF_IN_TASK, event->pid, event->comm); fprog prog = { .len = event->prog.flen, .filter = event->prog.filters }; c->scmp_arch = trans_ebpf_arch (event->ebpf_arch, c->scmp_arch); print_prog (c->scmp_arch, &prog, event->pid, c->fp, true); return 0; } static void global_capture (uint32_t scmp_arch) { struct capture_bpf *skel; struct ring_buffer *rb; global_event_ctx ctx = { .fp = stdout, .scmp_arch = scmp_arch }; int32_t err; skel = capture_bpf__open_and_load (); if (!skel) { if (have_bpf_cap () == 0) // explicitly ignore broken /proc and enough caps error ("%s", M_EBPF_NOT_CAPABLE); error (M_FAILED_OPEN_LOAD, __func__); } rb = ring_buffer__new (bpf_map__fd (skel->maps.scmp_events), on_events, &ctx, NULL); if (!rb) error ("%s", M_FAILED_CREATE_RINGBUF); err = capture_bpf__attach (skel); if (err < 0) error ("%s", M_FAILED_ATTACH); int rc; while ((rc = ring_buffer__poll (rb, -1)) >= 0) ; ring_buffer__free (rb); capture_bpf__destroy (skel); error (M_CAPTURE_POLL_ERROR, strerror (-rc)); } void capture (pid_t pid, uint32_t scmp_arch) { libbpf_set_print (libbpf_msg_dispatcher); if (pid != 0) capture_pid (pid, scmp_arch); else global_capture (scmp_arch); } #else // EBPF_SUPPORT == 0 void capture (pid_t pid, uint32_t scmp_arch) { (void)pid, (void)scmp_arch; error ("%s", M_CAPTURE_DISABLED); } #endif ceccomp-4.3.1/src/ceccomp.c000066400000000000000000000140471526046660400155130ustar00rootroot00000000000000#include "asm.h" #include "attributes.h" #include "capture.h" #include "config.h" #include "disasm.h" #include "emu.h" #include "help.h" #include "main.h" #include "probe.h" #include "trace.h" #include "utils/color.h" #include "utils/parse_args.h" #include #include #include #include #include #include #include #include #include #include static asm_arg_t asm_arg; static disasm_arg_t disasm_arg; static emu_arg_t emu_arg; static probe_arg_t probe_arg; static trace_arg_t trace_arg; static capture_arg_t capture_arg; static ceccomp_arg_t args = { .cmd = HELP_ABNORMAL, .asm_arg = &asm_arg, .disasm_arg = &disasm_arg, .emu_arg = &emu_arg, .probe_arg = &probe_arg, .trace_arg = &trace_arg, .capture_arg = &capture_arg }; static const struct argp_option options[] = { { "quiet", 'q', NULL, 0, NULL, 0 }, { "color", 'c', "COLOR", 0, NULL, 0 }, { "ebpf", 'e', NULL, 0, NULL, 0 }, { "output", 'o', "OUTPUT", 0, NULL, 0 }, { "arch", 'a', "ARCH", 0, NULL, 0 }, { "pid", 'p', "PID", 0, NULL, 0 }, { "fmt", 'f', "FMT", 0, NULL, 0 }, { "seize", 's', NULL, 0, NULL, 0 }, { "help", 'h', NULL, 0, NULL, 0 }, { "usage", 'u', NULL, 0, NULL, 0 }, { 0 }, }; static void init_args (ceccomp_arg_t *args) { const char *no_color = getenv ("NO_COLOR"); if (no_color != NULL && no_color[0] != '\0') args->when = NEVER; else args->when = AUTO; set_color (args->when, stderr); uint32_t local_arch = seccomp_arch_native (); args->asm_arg->scmp_arch = local_arch; args->asm_arg->mode = HEXLINE; args->asm_arg->text_file = stdin; args->disasm_arg->scmp_arch = local_arch; args->disasm_arg->ebpf = false; args->disasm_arg->raw_file = stdin; args->emu_arg->scmp_arch = local_arch; args->emu_arg->text_file = stdin; for (uint32_t i = 0; i <= 5; i++) args->emu_arg->args[i] = 0; args->emu_arg->ip = 0; args->emu_arg->quiet = false; args->emu_arg->sys_name = NULL; args->probe_arg->output_file = stderr; args->probe_arg->prog_idx = 0; args->trace_arg->mode = UNDECIDED; args->trace_arg->output_file = stderr; args->trace_arg->pid = 0; args->trace_arg->prog_idx = 0; args->trace_arg->quiet = false; args->trace_arg->seize = false; args->capture_arg->pid = 0; args->capture_arg->scmp_arch = local_arch; } AttrNoReturn static void help (int exit_code) { printf ("%s", M_CECCOMP_USAGE); putchar ('\n'); printf ("%s\n", ASM_HINT); printf ("%s\n", DISASM_HINT); printf ("%s\n", EMU_HINT); printf ("%s\n", PROBE_HINT); printf ("%s\n", TRACE_HINT); printf ("%s\n", CAPTURE_HINT); printf ("%s\n", HELP_HINT); printf ("%s\n", VERSION_HINT); printf ("\n%s\n", M_SUBCMD_HINT); printf ("\n%s\n", M_OPTION_HINT); exit (exit_code); } AttrNoReturn static void version (void) { printf (M_VERSION_FORMAT, CECCOMP_VERSION, CECCOMP_TAG_TIME, CECCOMP_BUILDER); printf ("%s", M_DEPENDENCY); char buf[32]; const struct scmp_version *ver = seccomp_version (); #define OFF LITERAL_STRLEN (GREENCLR) int ver_strlen = snprintf (buf + OFF, sizeof (buf) - OFF - sizeof (CLR), "v%u.%u.%u", ver->major, ver->minor, ver->micro); char *ver_str; if (color_enable) { memcpy (buf, GREENCLR, OFF); memcpy (buf + OFF + ver_strlen, CLR, sizeof (CLR)); ver_str = buf; } else ver_str = buf + OFF; #undef OFF printf ("libseccomp (%s)\n", ver_str); #if EBPF_SUPPORT == 1 #include printf ("libbpf (%s%s%s)\n", color_enable ? GREENCLR : "", libbpf_version_string (), color_enable ? CLR : ""); #else printf ("libbpf (%s%c%s)\n", color_enable ? REDCLR : "", '-', color_enable ? CLR : ""); #endif exit (0); } int main (int argc, char *argv[]) { lc_c = newlocale (LC_ALL_MASK, "C", NULL); #ifdef LOCALEDIR setlocale (LC_ALL, ""); bindtextdomain ("ceccomp", LOCALEDIR); textdomain ("ceccomp"); #endif #ifdef DEBUG setbuf (stdin, NULL); setbuf (stdout, NULL); setbuf (stderr, NULL); #else setvbuf (stderr, NULL, _IOLBF, BUFSIZ); #endif init_args (&args); static struct argp argp = { options, parse_opt, NULL, NULL, NULL, NULL, NULL }; argp_parse (&argp, argc, argv, ARGP_IN_ORDER, 0, &args); if (args.cmd == TRACE_MODE && trace_arg.mode == TRACE_PROG) set_color (args.when, trace_arg.output_file); else if (args.cmd == PROBE_MODE) set_color (args.when, probe_arg.output_file); else set_color (args.when, stdout); switch (args.cmd) { case ASM_MODE: assemble (asm_arg.text_file, asm_arg.scmp_arch, asm_arg.mode); break; case CAPTURE_MODE: capture (capture_arg.pid, capture_arg.scmp_arch); break; case DISASM_MODE: disasm (disasm_arg.raw_file, disasm_arg.scmp_arch, disasm_arg.ebpf); break; case EMU_MODE: if (emu_arg.sys_name == NULL) goto incomplete_command; emulate (&emu_arg); break; case TRACE_MODE: if (trace_arg.mode == TRACE_PID) { pid_trace (trace_arg.pid, trace_arg.seize, trace_arg.quiet); } else if (trace_arg.mode == TRACE_PROG) { if (trace_arg.prog_idx == 0) goto incomplete_command; program_trace (&argv[trace_arg.prog_idx], trace_arg.output_file, trace_arg.quiet, false); } else { assert (trace_arg.mode == UNDECIDED); goto incomplete_command; } break; case PROBE_MODE: if (probe_arg.prog_idx == 0) goto incomplete_command; probe (&argv[probe_arg.prog_idx], probe_arg.output_file, probe_arg.quiet); break; case HELP_MODE: help (0); break; case HELP_ABNORMAL: incomplete_command: help (1); break; case VERSION_MODE: version (); break; default: assert (!"unknown mode"); } return 0; } ceccomp-4.3.1/src/decoder/000077500000000000000000000000001526046660400153355ustar00rootroot00000000000000ceccomp-4.3.1/src/decoder/check_prog.c000066400000000000000000000132751526046660400176150ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0-or-later /** * This part of code are adapted from Linux kernel, * source files are: net/core/filter.c and kernel/seccomp.c * * Thanks to following authors and their commit time: * * 2012 Will Drewry * 2004-2005 Andrea Arcangeli * 2011-2014 PLUMgrid, http://plumgrid.com * Jay Schulist * Alexei Starovoitov * Daniel Borkmann * Andi Kleen * Kris Katterjohn */ #include "decoder/check_prog.h" #include "main.h" #include "utils/error.h" #include "utils/logger.h" #include "utils/valid_insns.h" #include "utils/vector.h" #include #include #include #include #include #include #include static uint16_t *masks, mem_valid = 0; static uint32_t fatal_count = 0; static uint32_t error_count = 0; typedef enum { CODE_ERR, JT_ERR, JF_ERR, K_ERR, NONE, } err_idx; uint32_t err_len[] = { [CODE_ERR] = 0, [JT_ERR] = LITERAL_STRLEN ("CODE:0x1234 "), [JF_ERR] = LITERAL_STRLEN ("CODE:0x1234 JT:0x56"), [K_ERR] = LITERAL_STRLEN ("CODE:0x1234 JF:0x56 JT:0x78 "), [NONE] = LITERAL_STRLEN ("CODE:0x1234 JF:0x56 JF:0x78 K:0x9abcdef0"), }; #define SPRINTF_CAT(...) print += sprintf (print, __VA_ARGS__) static void report_error (filter f, uint32_t filter_idx, err_idx idx, bool fatal, const char *err_msg) { if (fatal) fatal_count++; else error_count++; char buf[0x400]; char *print = buf; SPRINTF_CAT ("#%u: %s\n", filter_idx, err_msg); SPRINTF_CAT ("CODE:0x%04x JT:0x%02x JF:0x%02x K:0x%08x\n", f.code, f.jt, f.jf, f.k); if (idx == NONE) { memset (print, '~', err_len[NONE]); print[err_len[idx]] = '\0'; } else { memset (print, ' ', err_len[idx]); print[err_len[idx]] = '^'; print[err_len[idx] + 1] = '\0'; } warn ("%s", buf); } #define REPORT(err_idx, fatal, err_msg) \ do \ { \ report_error (f, pc + 1, err_idx, fatal, err_msg); \ return; \ } \ while (0) #define FATAL true // return true means stop check static void check_filter (const filter *fptr, uint32_t pc, uint32_t flen) { filter f = fptr[pc]; uint16_t code = f.code; uint32_t k = f.k; if (code > MAX_VALID_INSN || !insn_name_map[code]) REPORT (NONE, FATAL, M_INVALID_OPERATION); switch (code) { case BPF_LD | BPF_W | BPF_ABS: f.code = BPF_LDX | BPF_W | BPF_ABS; if (k >= sizeof (struct seccomp_data)) REPORT (K_ERR, FATAL, M_ATTR_OFFSET_OVERFLOW); else if (k & 3) REPORT (K_ERR, FATAL, M_INVALID_ATTR_LOAD); return; case BPF_LD | BPF_W | BPF_LEN: // f.code = BPF_LD | BPF_IMM; // f.k = sizeof (struct seccomp_data); return; case BPF_LDX | BPF_W | BPF_LEN: // f.code = BPF_LDX | BPF_IMM; // f.k = sizeof (struct seccomp_data); return; case BPF_ALU | BPF_DIV | BPF_K: if (f.k == 0) REPORT (K_ERR, !FATAL, M_ALU_DIV_BY_ZERO); return; case BPF_ALU | BPF_LSH | BPF_K: case BPF_ALU | BPF_RSH | BPF_K: if (f.k >= 32) REPORT (K_ERR, !FATAL, M_ALU_SH_OUT_OF_RANGE); return; case BPF_LD | BPF_MEM: case BPF_LDX | BPF_MEM: if (f.k >= BPF_MEMWORDS) REPORT (K_ERR, !FATAL, M_MEM_IDX_OUT_OF_RANGE); if (!(mem_valid & (1 << fptr[pc].k))) REPORT (K_ERR, !FATAL, M_UNINITIALIZED_MEM); return; case BPF_ST: case BPF_STX: if (f.k >= BPF_MEMWORDS) REPORT (K_ERR, !FATAL, M_MEM_IDX_OUT_OF_RANGE); mem_valid |= (1 << fptr[pc].k); return; case BPF_JMP | BPF_JA: if (f.k >= (uint32_t)(flen - pc - 1)) REPORT (K_ERR, !FATAL, M_JA_OUT_OF_FILTERS); masks[pc + 1 + fptr[pc].k] &= mem_valid; mem_valid = ~0; return; case BPF_JMP | BPF_JEQ | BPF_K: case BPF_JMP | BPF_JEQ | BPF_X: case BPF_JMP | BPF_JGE | BPF_K: case BPF_JMP | BPF_JGE | BPF_X: case BPF_JMP | BPF_JGT | BPF_K: case BPF_JMP | BPF_JGT | BPF_X: case BPF_JMP | BPF_JSET | BPF_K: case BPF_JMP | BPF_JSET | BPF_X: if (pc + f.jt + 1 >= flen) REPORT (JT_ERR, !FATAL, M_JT_INVALID_TAG); if (pc + f.jf + 1 >= flen) REPORT (JF_ERR, !FATAL, M_JF_INVALID_TAG); masks[pc + 1 + fptr[pc].jt] &= mem_valid; masks[pc + 1 + fptr[pc].jf] &= mem_valid; mem_valid = ~0; return; } } bool check_prog (const fprog *prog) { masks = reallocate (NULL, sizeof (*masks) * prog->len); memset (masks, 0xff, sizeof (*masks) * prog->len); mem_valid = 0; for (uint16_t i = 0; i < prog->len; i++) { check_filter (prog->filter, i, prog->len); // if fatal_count > 5, stop disasm immediately // perhaps a wrong file? if (fatal_count > 5) goto complete; } filter last = prog->filter[prog->len - 1]; uint16_t last_code = last.code; if ((last_code != (BPF_RET | BPF_A)) && (last_code != (BPF_RET | BPF_K))) { report_error (last, prog->len, NONE, !FATAL, M_MUST_END_WITH_RET); goto complete; } complete: reallocate (masks, 0x0); // if fatal_error occurs, stop disasm if (fatal_count) error ("%s", M_DISASM_TERMINATED); // some error might cause mem overflow in render // if error_count != 0, skip render return (bool)error_count; } ceccomp-4.3.1/src/decoder/decoder.c000066400000000000000000000173461526046660400171210ustar00rootroot00000000000000#include "decoder/decoder.h" #include "decoder/check_prog.h" #include "lexical/parser.h" #include "lexical/token.h" #include "main.h" #include "resolver/resolver.h" #include "utils/vector.h" #include #include #include #include #include #include #include #include #include #define RSH2(value) ((value) >> 2) #define RSH4(value) ((value) >> 4) static const token_type abs_table[] = { [RSH2 (offsetof (seccomp_data, nr))] = ATTR_SYSCALL, [RSH2 (offsetof (seccomp_data, arch))] = ATTR_ARCH, [RSH2 (offsetof (seccomp_data, instruction_pointer))] = ATTR_LOWPC, [RSH2 (offsetof (seccomp_data, instruction_pointer) + 4)] = ATTR_HIGHPC, [RSH2 (offsetof (seccomp_data, args[0]))] = ATTR_LOWARG, [RSH2 (offsetof (seccomp_data, args[0]) + 4)] = ATTR_HIGHARG, [RSH2 (offsetof (seccomp_data, args[1]))] = ATTR_LOWARG, [RSH2 (offsetof (seccomp_data, args[1]) + 4)] = ATTR_HIGHARG, [RSH2 (offsetof (seccomp_data, args[2]))] = ATTR_LOWARG, [RSH2 (offsetof (seccomp_data, args[2]) + 4)] = ATTR_HIGHARG, [RSH2 (offsetof (seccomp_data, args[3]))] = ATTR_LOWARG, [RSH2 (offsetof (seccomp_data, args[3]) + 4)] = ATTR_HIGHARG, [RSH2 (offsetof (seccomp_data, args[4]))] = ATTR_LOWARG, [RSH2 (offsetof (seccomp_data, args[4]) + 4)] = ATTR_HIGHARG, [RSH2 (offsetof (seccomp_data, args[5]))] = ATTR_LOWARG, [RSH2 (offsetof (seccomp_data, args[5]) + 4)] = ATTR_HIGHARG, }; #define SCMP_DATA_LEN_STR "# 0x40" static void ld_ldx_line (filter f, statement_t *statement) { statement->type = ASSIGN_LINE; assign_line_t *assign_line = &statement->assign_line; assign_line->left_var.type = (BPF_CLASS (f.code) == BPF_LD) ? A : X; assign_line->operator = EQUAL; obj_t *right = &assign_line->right_var; switch (BPF_MODE (f.code)) { case BPF_IMM: right->type = NUMBER; right->data = f.k; return; case BPF_MEM: right->type = MEM; right->data = f.k; return; case BPF_ABS: right->type = abs_table[RSH2 (f.k)]; if (right->type == ATTR_LOWARG || right->type == ATTR_HIGHARG) right->data = (f.k - offsetof (seccomp_data, args[0])) / 0x8; return; case BPF_LEN: right->type = ATTR_LEN; statement->line_start = SCMP_DATA_LEN_STR; statement->comment = 0; statement->line_len = LITERAL_STRLEN (SCMP_DATA_LEN_STR); static_assert (sizeof (seccomp_data) == 0x40, "struct seccomp_data should be 0x40 bytes large"); return; default: assert (!"Unknown BPF_MODE for ld or ldx"); } } static void st_stx_line (filter f, statement_t *statement) { statement->type = ASSIGN_LINE; assign_line_t *assign_line = &statement->assign_line; assign_line->left_var.type = MEM; assign_line->left_var.data = f.k; assign_line->operator = EQUAL; assign_line->right_var.type = (BPF_CLASS (f.code) == BPF_ST) ? A : X; } static const token_type operator_table[] = { [RSH4 (BPF_ADD)] = ADD_TO, [RSH4 (BPF_SUB)] = SUB_TO, [RSH4 (BPF_MUL)] = MULTI_TO, [RSH4 (BPF_DIV)] = DIVIDE_TO, [RSH4 (BPF_OR)] = OR_TO, [RSH4 (BPF_AND)] = AND_TO, [RSH4 (BPF_LSH)] = LSH_TO, [RSH4 (BPF_RSH)] = RSH_TO, [RSH4 (BPF_NEG)] = NEGATIVE, [RSH4 (BPF_XOR)] = XOR_TO, }; static void alu_line (filter f, statement_t *statement) { statement->type = ASSIGN_LINE; assign_line_t *assign_line = &statement->assign_line; assign_line->left_var.type = A; assign_line->operator = operator_table[RSH4 (BPF_OP (f.code))]; if (BPF_SRC (f.code) == BPF_X) assign_line->right_var.type = X; else if (assign_line->operator == NEGATIVE) assign_line->right_var.type = A; else { assign_line->right_var.type = NUMBER; assign_line->right_var.data = f.k; } } static const token_type comparator_table[] = { [RSH4 (BPF_JEQ)] = EQUAL_EQUAL, [RSH4 (BPF_JGT)] = GREATER_THAN, [RSH4 (BPF_JGE)] = GREATER_EQUAL, [RSH4 (BPF_JSET)] = AND, }; static const token_type reverse_table[] = { [RSH4 (BPF_JEQ)] = BANG_EQUAL, [RSH4 (BPF_JGT)] = LESS_EQUAL, [RSH4 (BPF_JGE)] = LESS_THAN, }; static void condition (filter f, token_type *comparator, obj_t *cmpobj, bool *if_bang) { uint32_t op = BPF_OP (f.code); if ((!*if_bang) || op == BPF_JSET) *comparator = comparator_table[RSH4 (op)]; else { *comparator = reverse_table[RSH4 (op)]; *if_bang = false; } if (BPF_SRC (f.code) == BPF_X) cmpobj->type = X; else { cmpobj->type = NUMBER; cmpobj->data = f.k; } } static void jump_line (filter f, statement_t *statement) { statement->type = JUMP_LINE; jump_line_t *jump_line = &statement->jump_line; if (BPF_OP (f.code) == BPF_JA) { jump_line->if_bang = false; jump_line->if_condition = false; jump_line->jt.code_nr = f.k; return; } jump_line->if_condition = true; if (f.jt == 0 && f.jf != 0) { jump_line->if_bang = true; jump_line->jf.code_nr = f.jt; jump_line->jt.code_nr = f.jf; } else { jump_line->jt.code_nr = f.jt; jump_line->jf.code_nr = f.jf; } condition (f, &jump_line->comparator, &jump_line->cmpobj, &jump_line->if_bang); } token_type decode_return_k (obj_t *ret_obj, uint32_t k) { token_type tk; switch (k & SECCOMP_RET_ACTION_FULL) { case SCMP_ACT_KILL_PROCESS: tk = KILL_PROC; break; case SCMP_ACT_KILL: tk = KILL; break; case SCMP_ACT_ALLOW: tk = ALLOW; break; case SCMP_ACT_LOG: tk = LOG; break; case SCMP_ACT_NOTIFY: tk = NOTIFY; break; case SCMP_ACT_TRACE (0): ret_obj->data = k & SECCOMP_RET_DATA; tk = TRACE; break; case _SCMP_ACT_TRAP (0): ret_obj->data = k & SECCOMP_RET_DATA; tk = TRAP; break; case SCMP_ACT_ERRNO (0): ret_obj->data = k & SECCOMP_RET_DATA; tk = ERRNO; break; default: ret_obj->data = k; tk = NUMBER; } ret_obj->type = tk; return tk == NUMBER ? KILL_PROC : tk; } static void return_line (filter f, statement_t *statement) { statement->type = RETURN_LINE; return_line_t *return_line = &statement->return_line; if (BPF_RVAL (f.code) == BPF_A) return_line->ret_obj.type = A; else decode_return_k (&return_line->ret_obj, f.k); } static void misc_line (filter f, statement_t *statement) { statement->type = ASSIGN_LINE; assign_line_t *assign_line = &statement->assign_line; assign_line->operator = EQUAL; if (BPF_MISCOP (f.code) == BPF_TAX) { assign_line->left_var.type = X; assign_line->right_var.type = A; } else { assign_line->left_var.type = A; assign_line->right_var.type = X; } } static void decode_filter (filter f, statement_t *statement) { switch (BPF_CLASS (f.code)) { case BPF_LD: case BPF_LDX: ld_ldx_line (f, statement); return; case BPF_ST: case BPF_STX: st_stx_line (f, statement); return; case BPF_ALU: alu_line (f, statement); break; case BPF_JMP: jump_line (f, statement); break; case BPF_RET: return_line (f, statement); break; case BPF_MISC: misc_line (f, statement); break; } } bool decode_filters (const fprog *prog, vector_t *v, bool trustful) { // make sure all filter are valid // give warning about fatal and normal errors bool error = trustful ? false : check_prog (prog); statement_t statement = { 0 }; push_vector (v, &statement); // skip 1 element for (uint32_t i = 0; i < prog->len; i++) { memset (&statement, '\0', sizeof (statement_t)); statement.text_nr = i + 1; statement.code_nr = i + 1; decode_filter (prog->filter[i], &statement); push_vector (v, &statement); } return error; } ceccomp-4.3.1/src/decoder/formatter.c000066400000000000000000000132121526046660400175030ustar00rootroot00000000000000#include "decoder/formatter.h" #include "lexical/parser.h" #include "lexical/token.h" #include "main.h" #include "utils/color.h" #include #include #include #include #include FILE *fp; static void print_num (const obj_t *tk) { if (tk->literal.start != NULL) fwrite (tk->literal.start, 1, tk->literal.len, fp); else fprintf (fp, "0x%x", tk->data); } static void print_str (const obj_t *tk) { fwrite (token_pairs[tk->type].start, 1, token_pairs[tk->type].len, fp); } static void print_identifier (const obj_t *tk) { fwrite (tk->literal.start, 1, tk->literal.len, fp); } static void print_dec_bracket (const obj_t *tk) { fwrite (token_pairs[tk->type].start, 1, token_pairs[tk->type].len, fp); fprintf (fp, "[%u]", tk->data); } static void print_hex_bracket (const obj_t *tk) { fwrite (token_pairs[tk->type].start, 1, token_pairs[tk->type].len, fp); fprintf (fp, "[0x%x]", tk->data); } static void print_paren (const obj_t *tk) { fwrite (token_pairs[tk->type].start, 1, token_pairs[tk->type].len, fp); fprintf (fp, "(%u)", tk->data); } static const obj_print_t obj_print[] = { [A] = { print_str, BRIGHT_YELLOWCLR }, [X] = { print_str, BRIGHT_YELLOWCLR }, [MEM] = { print_hex_bracket, BRIGHT_YELLOWCLR }, [ATTR_LOWARG] = { print_dec_bracket, BRIGHT_BLUECLR }, [ATTR_HIGHARG] = { print_dec_bracket, BRIGHT_BLUECLR }, [ATTR_SYSCALL] = { print_str, BRIGHT_BLUECLR }, [ATTR_ARCH] = { print_str, BRIGHT_BLUECLR }, [ATTR_LOWPC] = { print_str, BRIGHT_BLUECLR }, [ATTR_HIGHPC] = { print_str, BRIGHT_BLUECLR }, [ATTR_LEN] = { print_str, BRIGHT_BLUECLR }, [IDENTIFIER] = { print_identifier, BRIGHT_CYANCLR }, [NUMBER] = { print_num, BRIGHT_CYANCLR }, [KILL_PROC] = { print_str, REDCLR }, [KILL] = { print_str, REDCLR }, [ALLOW] = { print_str, GREENCLR }, [NOTIFY] = { print_str, YELLOWCLR }, [LOG] = { print_str, YELLOWCLR }, [TRACE] = { print_paren, YELLOWCLR }, [TRAP] = { print_paren, YELLOWCLR }, [ERRNO] = { print_paren, REDCLR }, }; static void obj_printer (const obj_t *obj) { if (color_enable) fprintf (fp, "%s", obj_print[obj->type].color); obj_print[obj->type].handler (obj); if (color_enable) fprintf (fp, "%s", CLR); } void extern_obj_printer (FILE *output_fp, const obj_t *obj) { fp = output_fp; obj_printer (obj); } static inline void print_token_pair (token_type type) { fwrite (token_pairs[type].start, 1, token_pairs[type].len, fp); } static void assign_line (const statement_t *statement) { const assign_line_t *line = &statement->assign_line; const obj_t *left = &line->left_var; const obj_t *right = &line->right_var; obj_printer (left); fputc (' ', fp); if (line->operator == NEGATIVE) fprintf (fp, "= -"); else { print_token_pair (line->operator); fputc (' ', fp); } obj_printer (right); } static inline void print_label (const label_t *label, uint16_t pc) { if (label->key.start == NULL) fprintf (fp, DEFAULT_LABEL, pc + label->code_nr + 1); else fwrite (label->key.start, 1, label->key.len, fp); } static void print_ja (const statement_t *statement) { print_token_pair (GOTO); fputc (' ', fp); print_label (&statement->jump_line.jt, statement->code_nr); } static void jump_line (const statement_t *statement) { const jump_line_t *line = &statement->jump_line; if (!line->if_condition) { print_ja (statement); return; } print_token_pair (IF); fputc (' ', fp); if (line->if_bang) print_token_pair (BANG); print_token_pair (LEFT_PAREN); obj_t obj_A = { .type = A, .data = 0 }; obj_printer (&obj_A); fputc (' ', fp); print_token_pair (line->comparator); fputc (' ', fp); obj_printer (&line->cmpobj); print_token_pair (RIGHT_PAREN); fputc (' ', fp); print_token_pair (GOTO); fputc (' ', fp); print_label (&line->jt, statement->code_nr); if (line->jf.code_nr == 0) return; print_token_pair (COMMA); fputc (' ', fp); print_token_pair (ELSE); fputc (' ', fp); print_token_pair (GOTO); fputc (' ', fp); print_label (&line->jf, statement->code_nr); } static void return_line (const statement_t *statement) { print_token_pair (RETURN); fputc (' ', fp); obj_printer (&statement->return_line.ret_obj); } static void print_comment (const statement_t *statement) { if (statement->comment == -1) return; const char *comment_start = statement->line_start + statement->comment; uint16_t comment_len = statement->line_len - statement->comment; if (comment_len == 0) return; if (statement->type != EMPTY_LINE) fputc (' ', fp); // prepend a ' ' if a effective line (return 1 # aa) if (color_enable) fwrite (LIGHTCLR, 1, LITERAL_STRLEN (LIGHTCLR), fp); fwrite (comment_start, 1, comment_len, fp); if (color_enable) fwrite (CLR, 1, LITERAL_STRLEN (CLR), fp); } void print_as_comment (FILE *output_fp, const char *comment_fmt, ...) { fp = output_fp; va_list args; va_start (args, comment_fmt); char buf[0x400]; buf[0] = '#'; statement_t statement = { .type = EMPTY_LINE, .line_start = buf, .comment = 0 }; statement.line_len = vsnprintf (buf + 1, 0x3ff, comment_fmt, args) + 1; print_comment (&statement); fputc ('\n', fp); va_end (args); } void print_statement (FILE *output_fp, const statement_t *statement) { fp = output_fp; switch (statement->type) { case ASSIGN_LINE: assign_line (statement); break; case JUMP_LINE: jump_line (statement); break; case RETURN_LINE: return_line (statement); break; case EMPTY_LINE: break; case ERROR_LINE: case EOF_LINE: assert (0); } print_comment (statement); fputc ('\n', fp); } ceccomp-4.3.1/src/disasm.c000066400000000000000000000150321526046660400153550ustar00rootroot00000000000000#include "attributes.h" #define _GNU_SOURCE #include "decoder/decoder.h" #include "decoder/formatter.h" #include "disasm.h" #include "lexical/parser.h" #include "main.h" #include "resolver/render.h" #include "utils/bpf_trans.h" #include "utils/error.h" #include "utils/logger.h" #include "utils/reverse_endian.h" #include "utils/str_pile.h" #include "utils/vector.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include filter *g_filters; static uint32_t g_sz; bool init_global_filters (uint32_t insn_count) { if (g_filters) return true; g_sz = (sizeof (filter) * (insn_count + 1) + 0xfff) & ~0xfff; void *map = mmap (NULL, g_sz, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); if (map == MAP_FAILED) return false; #ifdef PR_SET_VMA prctl (PR_SET_VMA, PR_SET_VMA_ANON_NAME, map, g_sz, "global filters"); #endif g_filters = map; return true; } AttrDtor static void free_global_filters (void) { if (g_filters) munmap (g_filters, g_sz); } static uint32_t read_filters (filter *filters, FILE *from) { uint32_t todo = sizeof (filter) * (BPF_MAXINSNS + 1); uint8_t *ptr = (uint8_t *)filters; int fd = fileno (from); assert (fd != -1); while (todo) { long rc = read (fd, ptr, todo); if (rc == -1) error (M_READ_FAIL, strerror (errno)); if (rc == 0) break; ptr += rc; todo -= rc; } if (!todo) error ("%s", M_TOO_LARGE_INPUT); uint32_t leftover = ((size_t)ptr - (size_t)filters) & 7; if (leftover) warn (M_INPUT_HAS_LEFTOVER, leftover); return (ptr - (uint8_t *)filters) >> 3; } #define BLK_SIZE 0x2000 // Returned bpf_insn pointer requested with mmap, release it later! AttrMalloc static struct bpf_insn * read_insns (FILE *from, uint32_t *count, uint32_t *map_sizep) { void *base; uint32_t offset = 0, map_size = BLK_SIZE, todo = BLK_SIZE; int fd = fileno (from); assert (fd != -1); base = mmap (NULL, map_size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); if (base == MAP_FAILED) return NULL; while (true) { long rc = read (fd, (uint8_t *)base + offset, todo); if (UNLIKELY (rc == -1)) error (M_READ_FAIL, strerror (errno)); if (rc == 0) break; offset += rc; todo -= rc; if (todo == 0) { // read BLK_SIZE? enlarge buffer if some more bytes to read #define LOCAL_REMAP(size) \ do \ { \ void *old_base = base; \ base = mremap (base, map_size, map_size + size, MREMAP_MAYMOVE); \ if (UNLIKELY (base == MAP_FAILED)) \ { \ munmap (old_base, map_size); \ return NULL; \ } \ map_size += size; \ } \ while (0) LOCAL_REMAP (BLK_SIZE); todo = BLK_SIZE; } } uint32_t leftover = offset % sizeof (struct bpf_insn); if (leftover) { warn (M_INPUT_HAS_LEFTOVER, leftover); offset -= leftover; memset ((uint8_t *)base + offset, 0, leftover); } // allocate some safe area to r/w if (map_size - offset < 0x50) LOCAL_REMAP (0x1000); #ifdef PR_SET_VMA prctl (PR_SET_VMA, PR_SET_VMA_ANON_NAME, base, map_size, "user eBPF insns"); #endif *count = offset / sizeof (struct bpf_insn); *map_sizep = map_size; return base; } void print_prog (uint32_t scmp_arch, const fprog *prog, pid_t pid, FILE *output_fp, bool trustful) { vector_t v; // str pile for syscall names assert (prog->len); assert (init_pile (prog->len * 40 /* statistical choice */)); init_vector (&v, sizeof (statement_t), prog->len + 1); // check_prog in decode_filters might decect some errors // render might mem overflow, so skip render if (!decode_filters (prog, &v, trustful)) render (&v, scmp_arch); print_as_comment (output_fp, "Label CODE JT JF K"); static const char separator[] = "---------------------------------"; if (pid == 0) print_as_comment (output_fp, separator); else { char pid_text[8]; // linux max pid: 4,194,304 uint32_t text_len = snprintf (pid_text, sizeof (pid_text), "%d", pid); print_as_comment (output_fp, "PID=%.*s %.*s", text_len, pid_text, (int)LITERAL_STRLEN (separator) - 5 - text_len, separator); } filter *filters = prog->filter; // give compiler some hint for (uint32_t i = 1; i < v.count; i++) { filter f = filters[i - 1]; fprintf (output_fp, " " DEFAULT_LABEL ": 0x%02x 0x%02x 0x%02x 0x%08x ", i, f.code, f.jt, f.jf, f.k); print_statement (output_fp, get_vector (&v, i)); } print_as_comment (output_fp, separator); fflush (output_fp); free_vector (&v); free_pile (); } void disasm (FILE *fp, uint32_t scmp_arch, bool ebpf) { fprog prog; if (ebpf) { uint32_t count = 0, map_size; struct bpf_insn *insns = read_insns (fp, &count, &map_size); assert (insns); if (count == 0) goto no_filter; if (need_reverse_endian (scmp_arch)) for (uint32_t i = 0; i < count; i++) reverse_ebpf_endian (insns + i); assert (init_global_filters (count)); long filter_len = ebpf2cbpf (insns, count, g_filters, false); assert (filter_len >= 0); prog.len = filter_len; munmap (insns, map_size); } else { assert (init_global_filters (BPF_MAXINSNS)); prog.len = read_filters (g_filters, fp); if (need_reverse_endian (scmp_arch)) for (uint32_t i = 0; i < prog.len; i++) reverse_endian ((filter *)g_filters + i); } prog.filter = g_filters; if (prog.len == 0) { no_filter: warn ("%s", M_NO_FILTER); return; } print_prog (scmp_arch, &prog, 0, stdout, false); } ceccomp-4.3.1/src/emu.c000066400000000000000000000247171526046660400146750ustar00rootroot00000000000000#include "emu.h" #include "decoder/decoder.h" #include "decoder/formatter.h" #include "lexical/parser.h" #include "lexical/scanner.h" #include "lexical/token.h" #include "main.h" #include "resolver/resolver.h" #include "utils/color.h" #include "utils/error.h" #include "utils/logger.h" #include "utils/parse_args.h" #include "utils/read_source.h" #include "utils/vector.h" #include #include #include #include #include #include #include #include #include #include static uint32_t A_reg = 0; static uint32_t X_reg = 0; static uint32_t mem[BPF_MEMWORDS] = { 0 }; static uint32_t syscall_nr = 0; static uint32_t scmp_arch = 0; static uint32_t low_pc = 0; static uint32_t high_pc = 0; static uint32_t low_args[6] = { 0 }; static uint32_t high_args[6] = { 0 }; static uint32_t scmp_data_len = sizeof (seccomp_data); #define BASE_vars(value) ((value) - A) static uint32_t *vars[] = { [BASE_vars (A)] = &A_reg, [BASE_vars (X)] = &X_reg, [BASE_vars (MEM)] = mem, [BASE_vars (ATTR_SYSCALL)] = &syscall_nr, [BASE_vars (ATTR_ARCH)] = &scmp_arch, [BASE_vars (ATTR_LOWPC)] = &low_pc, [BASE_vars (ATTR_HIGHPC)] = &high_pc, [BASE_vars (ATTR_LOWARG)] = low_args, [BASE_vars (ATTR_HIGHARG)] = high_args, [BASE_vars (ATTR_LEN)] = &scmp_data_len, }; #define DO_OPERATE(operator) (*left operator (*right)) // true if interrupted ($A / $X && $X == 0) static bool assign_line (assign_line_t *line) { token_type left_type = line->left_var.type; uint32_t *left = vars[BASE_vars (left_type)]; token_type right_type = line->right_var.type; uint32_t *right; if (right_type == NUMBER) right = &line->right_var.data; else right = vars[BASE_vars (right_type)]; if (right_type == ATTR_LOWARG || right_type == ATTR_HIGHARG || right_type == MEM) right += line->right_var.data; else if (left_type == MEM) left += line->left_var.data; switch (line->operator) { case ADD_TO: DO_OPERATE (+=); break; case SUB_TO: DO_OPERATE (-=); break; case MULTI_TO: DO_OPERATE (*=); break; case DIVIDE_TO: if (*right != 0) DO_OPERATE (/=); else return true; break; case LSH_TO: *right = *right & 0x1f; DO_OPERATE (<<=); break; case RSH_TO: *right = *right & 0x1f; DO_OPERATE (>>=); break; case AND_TO: DO_OPERATE (&=); break; case OR_TO: DO_OPERATE (|=); break; case XOR_TO: DO_OPERATE (^=); break; case EQUAL: DO_OPERATE (=); break; case NEGATIVE: DO_OPERATE (= -); break; default: assert (!"Unknown alu operation"); } return false; } #define DO_COMPARE(comparator) (bool)(A_reg comparator right) static const label_t * jump_line (const jump_line_t *line) { const label_t *jt = &line->jt; const label_t *jf = &line->jf; if (!line->if_condition) return jt; bool cond_true = false; if (line->if_bang) cond_true = true; uint32_t right = 0; if (line->cmpobj.type == X) right = X_reg; else right = line->cmpobj.data; switch (line->comparator) { case EQUAL_EQUAL: cond_true ^= DO_COMPARE (==); break; case BANG_EQUAL: cond_true ^= DO_COMPARE (!=); break; case GREATER_EQUAL: cond_true ^= DO_COMPARE (>=); break; case GREATER_THAN: cond_true ^= DO_COMPARE (>); break; case LESS_EQUAL: cond_true ^= DO_COMPARE (<=); break; case LESS_THAN: cond_true ^= DO_COMPARE (<); break; case AND: cond_true ^= DO_COMPARE (&); break; default: assert (!"Unknown comparator"); } return (cond_true ? jt : jf); } /** * Process return line if return $A or return NUMBER. Sets real_ret to * resolved plain result like KILL; returns a valid string if statement * need to add a comment. */ static void return_line (statement_t *statement, bool quiet) { static char formatted_val[0x28]; obj_t *ret_obj = &statement->return_line.ret_obj; obj_t *real_obj = &statement->return_line.real_obj; int sz; const string_t *tkstr; // append addtional return value comment for // return $A and return NUMBER if (ret_obj->type == A) { real_obj->type = decode_return_k (real_obj, A_reg); tkstr = &token_pairs[real_obj->type]; sz = snprintf (formatted_val, 0x28, "# $A = %#x, %.*s", A_reg, tkstr->len, tkstr->start); } else if (ret_obj->type == NUMBER) { real_obj->type = decode_return_k (real_obj, ret_obj->data); tkstr = &token_pairs[real_obj->type]; sz = snprintf (formatted_val, 0x28, "# %.*s", tkstr->len, tkstr->start); } else { // do nothing if ret_obj has KILL/ALLOW/TRACE type real_obj->type = ret_obj->type; real_obj->data = ret_obj->data; return; } register token_type tk = real_obj->type; if (tk == TRACE || tk == TRAP || tk == ERRNO) sz += snprintf (formatted_val + sz, 0x28 - sz, "(%u)", real_obj->data); assert (sz); if (!quiet) { statement->line_start = formatted_val; statement->line_len = sz; statement->comment = 0; } return; } static uint32_t code_nr_to_text_nr (vector_t *text_v, vector_t *code_ptr_v, const statement_t *cur, const label_t *jmp) { if (jmp->key.len == 0) // if ... goto xxx; false case -> jmp.code_nr is NULL return cur->text_nr + 1; statement_t **ptr = get_vector (code_ptr_v, cur->code_nr + jmp->code_nr + 1); uint32_t text_nr = (*ptr)->text_nr; statement_t *statement; string_t *label_decl; uint32_t cur_line_nr = cur->text_nr; // compiler hint while (text_nr > cur_line_nr) { statement = get_vector (text_v, text_nr); label_decl = &statement->label_decl; if ((label_decl->start) && (label_decl->len == jmp->key.len) && (!strncmp (label_decl->start, jmp->key.start, jmp->key.len))) break; text_nr--; } assert (text_nr != cur_line_nr); // should find a tag to jump to return text_nr; } static void print_label_decl (const statement_t *statement) { const string_t *label_decl = &statement->label_decl; if (label_decl->start) { fwrite (label_decl->start, 1, label_decl->len, stdout); fputc (':', stdout); fputc (' ', stdout); } } static void emulate_printer (const statement_t *statement, bool is_skipped, bool quiet) { if (quiet) return; bool global_color = color_enable; if (is_skipped && global_color) { fwrite (LIGHTCLR, 1, LITERAL_STRLEN (LIGHTCLR), stdout); push_color (false); } print_label_decl (statement); print_statement (stdout, statement); if (is_skipped && global_color) { pop_color (); fwrite (CLR, 1, LITERAL_STRLEN (CLR), stdout); } } static statement_t * emulator (vector_t *text_v, vector_t *code_ptr_v, bool quiet) { uint32_t read_idx = 1; uint32_t exec_idx = 1; const label_t *jmp; statement_t *statement = NULL; for (; read_idx < text_v->count; read_idx++) { statement = get_vector (text_v, read_idx); if (read_idx < exec_idx) { emulate_printer (statement, true, quiet); continue; } exec_idx++; switch (statement->type) { case ASSIGN_LINE: if (assign_line (&statement->assign_line)) goto out; break; case JUMP_LINE: jmp = jump_line (&statement->jump_line); exec_idx = code_nr_to_text_nr (text_v, code_ptr_v, statement, jmp); break; case RETURN_LINE: return_line (statement, quiet); goto out; case EMPTY_LINE: break; case EOF_LINE: case ERROR_LINE: assert (!"Emulating EOF/ERROR line??"); } emulate_printer (statement, false, quiet); } out: assert (statement); assert (statement->type == RETURN_LINE || statement->type == ASSIGN_LINE); return statement; } static void init_attr (const emu_arg_t *emu_arg) { A_reg = 0; X_reg = 0; // mem must be written first to be read, so skip clearing them if (emu_arg->sys_name == NULL) error ("%s", M_INPUT_SYS_NR); syscall_nr = seccomp_syscall_resolve_name_arch (emu_arg->scmp_arch, emu_arg->sys_name); if ((int32_t)syscall_nr == __NR_SCMP_ERROR) { char *end; uint64_t tmp = strtoull (emu_arg->sys_name, &end, 0); if (*end != '\0' || (uint32_t)tmp != tmp) error ("%s", M_INVALID_SYSNR); syscall_nr = tmp; } scmp_arch = emu_arg->scmp_arch; low_pc = emu_arg->ip & UINT32_MAX; high_pc = emu_arg->ip >> 32; for (uint32_t i = 0; i < 6; i++) { low_args[i] = emu_arg->args[i] & UINT32_MAX; high_args[i] = emu_arg->args[i] >> 32; } } void emulate_v (vector_t *text_v, vector_t *code_ptr_v, const emu_arg_t *emu_arg, FILE *output_fp) { init_attr (emu_arg); statement_t *last = emulator (text_v, code_ptr_v, emu_arg->quiet); bool fpe = last->type == ASSIGN_LINE; uint32_t line_left = text_v->count - 1 - last->text_nr; if (!emu_arg->quiet) { #define FPE_ERR_STR "# $X == 0, returning 0 (KILL) on FPE" if (UNLIKELY (fpe)) { last->line_start = FPE_ERR_STR; last->comment = 0; last->line_len = LITERAL_STRLEN (FPE_ERR_STR); } emulate_printer (last, false, emu_arg->quiet); if (UNLIKELY (fpe)) last->comment = -1; #undef FPE_ERR_STR if (line_left) print_as_comment (output_fp, "... %u line(s) skipped", line_left); } else { if (fpe) { obj_t fpe_obj = { .type = KILL }; extern_obj_printer (output_fp, &fpe_obj); } else extern_obj_printer (output_fp, &last->return_line.real_obj); fputc ('\n', output_fp); } } void emulate (const emu_arg_t *emu_arg) { size_t lines = init_source (emu_arg->text_file) + 1; init_scanner (next_line ()); init_parser (emu_arg->scmp_arch); init_table (); vector_t text_v; vector_t code_ptr_v; init_vector (&text_v, sizeof (statement_t), lines); init_vector (&code_ptr_v, sizeof (statement_t *), MIN (lines, BPF_MAXINSNS + 1)); parser (&text_v, &code_ptr_v); if (resolver (&code_ptr_v)) error ("%s", M_EMU_TERMINATED); // if ERROR_LINE exists, then exits emulate_v (&text_v, &code_ptr_v, emu_arg, stdout); free_table (); free_source (); free_vector (&text_v); free_vector (&code_ptr_v); } ceccomp-4.3.1/src/lexical/000077500000000000000000000000001526046660400153515ustar00rootroot00000000000000ceccomp-4.3.1/src/lexical/parser.c000066400000000000000000000247631526046660400170250ustar00rootroot00000000000000#include "lexical/parser.h" #include "lexical/scanner.h" #include "lexical/token.h" #include "main.h" #include "utils/arch_trans.h" #include "utils/error.h" #include "utils/hash.h" #include "utils/logger.h" #include "utils/vector.h" #include #include #include #include #include typedef struct { uint16_t text_nr; uint16_t code_nr; token_t previous; token_t current; token_t next; } parse_t; static parse_t parse = { .text_nr = 0, .code_nr = 0 }; static statement_t *local; static uint32_t local_arch; static jmp_buf g_env; static void error_at (token_t token, const char *err_msg); static void advance (void) { parse.previous = parse.current; parse.current = parse.next; scan_token (&parse.next); } static bool peek (token_type expected) { return expected == parse.next.type; } static bool peek_from_to (token_type from, token_type to) { return parse.next.type >= from && parse.next.type <= to; } static bool match (token_type expected) { if (!peek (expected)) return false; advance (); return true; } static bool match_number (void) { if (LIKELY (peek (NUMBER))) return advance (), true; if (peek (OVERFLOW_NUMBER)) error_at (parse.next, M_NUMBER_OVERFLOW); return false; } static bool match_from_to (token_type expected_start, token_type expected_end) { if (!peek_from_to (expected_start, expected_end)) return false; advance (); return true; } static void error_at (token_t token, const char *err_msg) { // sync to the nextline while (!(match (EOL) || peek (TOKEN_EOF))) advance (); local->type = ERROR_LINE; local->line_len = parse.current.token_start - local->line_start; local->error_line.error_start = token.token_start; local->error_line.error_msg = err_msg; longjmp (g_env, 1); } // paren_num can be ignored, default as 0 static uint32_t paren_num (void) { if (!match (LEFT_PAREN)) return 0; if (!match_number ()) error_at (parse.next, M_EXPECT_NUMBER); if (!match (RIGHT_PAREN)) error_at (parse.next, M_EXPECT_PAREN); return parse.previous.data; } // but bracket_num can not be ignored static uint32_t bracket_num (void) { if (!match (LEFT_BRACKET)) error_at (parse.next, M_EXPECT_BRACKET); if (!match_number ()) error_at (parse.next, M_EXPECT_NUMBER); if (!match (RIGHT_BRACKET)) error_at (parse.next, M_EXPECT_BRACKET); return parse.previous.data; } static void empty_line (void) { local->type = EMPTY_LINE; parse.code_nr--; // empty_line doesn't count return; } static void eof_line (void) { local->type = EOF_LINE; return; } static void return_line (void) { local->type = RETURN_LINE; obj_t *obj = &local->return_line.ret_obj; obj->literal.start = parse.next.token_start; if (match_from_to (TRACE, ERRNO)) { obj->type = parse.current.type; obj->data = paren_num (); } else if (match_number ()) { obj->type = NUMBER; obj->data = parse.current.data; } else if (match_from_to (KILL_PROC, LOG) || match (A)) obj->type = parse.current.type; else error_at (parse.next, M_EXPECT_RETURN_VAL); obj->literal.len = parse.current.token_start + parse.current.token_len - obj->literal.start; // some obj consume more than one token like TRACE(0xf) } static void label (label_t *label) { if (!match (IDENTIFIER)) error_at (parse.next, M_EXPECT_LABEL); label->key.start = parse.current.token_start; label->key.len = parse.current.token_len; } static uint32_t resolve_name_arch (uint32_t arch_token, token_t *sys_token) { char *sysname = sys_token->token_start; char *strend = sys_token->token_start + sys_token->token_len; char save = *strend; *strend = '\0'; uint32_t sys_nr = seccomp_syscall_resolve_name_arch (arch_token, sysname); *strend = save; return sys_nr; } static void compare_obj (obj_t *obj, comparator_t *cmptype) { obj->literal.start = parse.next.token_start; obj->literal.len = parse.next.token_len; if (match (X)) { obj->type = parse.current.type; return; } obj->type = NUMBER; if (match_number ()) { obj->data = parse.current.data; return; } if (match (IDENTIFIER)) { obj->data = resolve_name_arch (local_arch, &parse.current); if (obj->data == (uint32_t)-1) error_at (parse.current, M_EXPECT_SYSCALL); *cmptype = CMP_SYSCALL; return; } // read if (!match_from_to (ARCH_X86, ARCH_SH)) error_at (parse.next, M_UNEXPECT_TOKEN); if (!match (DOT)) { obj->data = internal_arch_to_scmp_arch (parse.current.type); if (UNLIKELY (obj->data == (uint32_t)-1)) // libseccomp does not support input arch?? error_at (parse.current, M_EXPECT_ARCH); *cmptype = CMP_ARCH; return; } // i386 if (!peek (IDENTIFIER)) error_at (parse.next, M_EXPECT_SYSCALL); uint32_t scmp_arch = internal_arch_to_scmp_arch (parse.previous.type); if (UNLIKELY (scmp_arch == (uint32_t)-1)) // libseccomp does not support input arch?? error_at (parse.previous, M_EXPECT_ARCH); obj->data = resolve_name_arch (scmp_arch, &parse.next); if (obj->data == (uint32_t)-1) error_at (parse.next, M_EXPECT_SYSCALL); *cmptype = CMP_ARCH_SYSCALL; obj->literal.len += parse.next.token_len + 1; // +1 is for dot advance (); // i386.read } static void condition (jump_line_t *jump_line) { jump_line->if_condition = true; if (match (BANG)) jump_line->if_bang = true; if (!match (LEFT_PAREN)) error_at (parse.next, M_EXPECT_PAREN); if (!match (A)) error_at (parse.next, M_EXPECT_A); if (!match_from_to (EQUAL_EQUAL, AND)) error_at (parse.next, M_EXPECT_COMPARTOR); jump_line->comparator = parse.current.type; compare_obj (&jump_line->cmpobj, &jump_line->cmptype); if (!match (RIGHT_PAREN)) error_at (parse.next, M_EXPECT_PAREN); } static void ja_line (void) { local->type = JUMP_LINE; jump_line_t *jump_line = &local->jump_line; jump_line->if_condition = false; label (&jump_line->jt); } static void jump_line (void) { local->type = JUMP_LINE; jump_line_t *jump_line = &local->jump_line; condition (jump_line); if (!match (GOTO)) error_at (parse.next, M_EXPECT_GOTO); label (&jump_line->jt); jump_line->jf.key.start = NULL; // jf default as zero if (!match (COMMA)) return; // probably this jump_line has no jf if (!match (ELSE)) error_at (parse.next, M_EXPECT_ELSE); if (!match (GOTO)) error_at (parse.next, M_EXPECT_GOTO); label (&jump_line->jf); } static void left (obj_t *obj) { obj->type = parse.current.type; // expression checked for us, it must be A X MEM here obj->literal.start = parse.current.token_start; if (parse.current.type == MEM) obj->data = bracket_num (); obj->literal.len = parse.current.token_start + parse.current.token_len - obj->literal.start; // some obj consume more than one token like mem[0xf] } static void right (obj_t *obj) { obj->literal.start = parse.next.token_start; if (match (A) || match (X) || match_from_to (ATTR_LEN, ATTR_HIGHPC)) obj->type = parse.current.type; else if (match (MEM) || match (ATTR_LOWARG) || match (ATTR_HIGHARG)) { obj->type = parse.current.type; obj->data = bracket_num (); } else if (match_number ()) { obj->type = parse.current.type; obj->data = parse.current.data; } else error_at (parse.next, M_EXPECT_RIGHT_VAR); obj->literal.len = parse.current.token_start + parse.current.token_len - obj->literal.start; // some obj consume more than one token like mem[0xf] } static void assign_line (void) { local->type = ASSIGN_LINE; assign_line_t *assign_line = &local->assign_line; left (&assign_line->left_var); if (match_from_to (ADD_TO, XOR_TO)) assign_line->operator = parse.current.type; else if (match (EQUAL)) { // if we match NEGATIVE, use NEGATIVE to overwrite operator // else use EQUAL as operator match (NEGATIVE); assign_line->operator = parse.current.type; } else error_at (parse.next, M_EXPECT_OPERATOR); right (&assign_line->right_var); } static void expression (void) { if (peek (EOL) || peek (COMMENT)) empty_line (); else if (peek (TOKEN_EOF)) eof_line (); else if (UNLIKELY (parse.code_nr > BPF_MAXINSNS)) error ("%s", M_STATEMENT_OVERFLOW); else if (match (RETURN)) return_line (); else if (match (IF)) jump_line (); else if (match (GOTO)) ja_line (); else if (match_from_to (A, MEM)) assign_line (); else error_at (parse.next, M_UNEXPECT_TOKEN); if (match (COMMENT)) local->comment = parse.current.token_start - local->line_start; else local->comment = -1; if (match (EOL)) local->line_len = parse.current.token_start - local->line_start; else if (peek (TOKEN_EOF)) local->line_len = parse.next.token_start - local->line_start; else error_at (parse.next, M_UNEXPECT_TOKEN); } static void label_decl (string_t *label_decl) { if (!match (LABEL_DECL)) return; label_decl->start = parse.current.token_start; label_decl->len = parse.current.token_len - 1; // ignore the ':' character if (insert_key (label_decl, parse.code_nr) == 1) error_at (parse.current, M_DUPLICATED_LABEL); // ignore our disasm useless output uint32_t count = 0; while (match_number () && count < 4) count++; } static void parse_line (statement_t *statement) { local = statement; memset (local, 0, sizeof (statement_t)); parse.text_nr++; parse.code_nr++; // if statement turns out to be empty_line, code_line--; local->code_nr = parse.code_nr; local->text_nr = parse.text_nr; local->label_decl.start = NULL; // label_decl.string default as NULL local->line_start = parse.next.token_start; if (setjmp (g_env) == 1) return; label_decl (&statement->label_decl); expression (); return; } void init_parser (uint32_t scmp_arch) { advance (); local_arch = scmp_arch; } void parser (vector_t *text_v, vector_t *code_ptr_v) { statement_t statement = { 0 }; statement_t *ptr = &statement; push_vector (text_v, &statement); push_vector (code_ptr_v, &ptr); while (true) { parse_line (&statement); if (statement.type == EOF_LINE) break; push_vector (text_v, &statement); } // we have to do it after text vector finish // because text vector might reallocate for (uint32_t i = 1; i < text_v->count; i++) { ptr = get_vector (text_v, i); if (ptr->type == EMPTY_LINE) continue; push_vector (code_ptr_v, &ptr); } } ceccomp-4.3.1/src/lexical/scanner.c000066400000000000000000000171421526046660400171530ustar00rootroot00000000000000#include "lexical/scanner.h" #include "attributes.h" #include "config.h" #include "lexical/token.h" #include "main.h" #include "utils/arch_trans.h" #include "utils/read_source.h" #include #include #include #include #include #include #include #include #include static scanner_t scanner; static uint8_t unknown_count = 0; #define INIT_TOKEN(type) \ do \ { \ init_token (token, &scanner, type); \ return; \ } \ while (0) #define INIT_TOKEN_DATA(type, data) \ do \ { \ init_token_data (token, &scanner, type, data); \ return; \ } \ while (0) #define INIT_TOKEN_ADV1(type) \ do \ { \ advance (1); \ INIT_TOKEN (type); \ } \ while (0) AttrPure static inline bool isidentifier (char c) { return isalnum_l (c, lc_c) || c == '_'; } static char peek (uint32_t offset) { return scanner.current_char[offset]; } static void advance (uint16_t advance_len) { scanner.current_char += advance_len; } static bool match_offset (char expected, uint32_t offset) { if (peek (offset) != expected) return false; advance (offset + 1); return true; } static bool match (char expected) { return match_offset (expected, 0); } static bool match_token (token_type tk) { register string_t token = token_pairs[tk]; if (strncmp (token.start, scanner.current_char, token.len)) return false; if (UNLIKELY (isidentifier (peek (token.len)))) return false; advance (token.len); return true; } // from and to all included static token_type match_token_range (token_type from, token_type to) { for (uint32_t i = from; i <= to; i++) if (match_token (i)) return i; return UNKNOWN; } static void reset_to_nextline (token_t *token) { init_token (token, &scanner, EOL); // if nextline == NULL, it means we meet_eof char *nextline = next_line (); scanner.token_start = nextline; scanner.current_char = scanner.token_start; scanner.line_nr++; } void init_scanner (char *start) { scanner.token_start = start; scanner.current_char = start; scanner.line_nr = 1; } void scan_token (token_t *token) { // if scanner.token_start == NULL, we meet_eof if (scanner.token_start == NULL) INIT_TOKEN (TOKEN_EOF); // skip spaces while (isspace_l (peek (0), lc_c) && peek (0) != '\n') advance (1); // sync scanner.token_start = scanner.current_char; // COMMENT if (match ('#')) { while (peek (0) != '\n') advance (1); INIT_TOKEN (COMMENT); } // EOL if (match ('\n')) { reset_to_nextline (token); return; } char cur_char = peek (0); if (islower_l (cur_char, lc_c)) { token_type tk = match_token_range (RETURN, ELSE); if (tk != UNKNOWN) INIT_TOKEN (tk); tk = str_to_internal_arch (scanner.current_char, false); if (tk != UNKNOWN && !isidentifier (peek (token_pairs[tk].len))) { advance (token_pairs[tk].len); INIT_TOKEN (tk); } } else if (isupper_l (cur_char, lc_c)) { token_type tk = match_token_range (KILL_PROC, ERRNO); if (tk != UNKNOWN) INIT_TOKEN (tk); } else if (ispunct_l (cur_char, lc_c)) { switch (cur_char) { case '$': if (match_offset ('A', 1)) INIT_TOKEN (A); if (match_offset ('X', 1)) INIT_TOKEN (X); token_type tk = match_token_range (MEM, ATTR_HIGHARG); if (tk != UNKNOWN) INIT_TOKEN (tk); break; case ',': INIT_TOKEN_ADV1 (COMMA); case '.': INIT_TOKEN_ADV1 (DOT); case '[': INIT_TOKEN_ADV1 (LEFT_BRACKET); case ']': INIT_TOKEN_ADV1 (RIGHT_BRACKET); case '(': INIT_TOKEN_ADV1 (LEFT_PAREN); case ')': INIT_TOKEN_ADV1 (RIGHT_PAREN); case '+': if (match_offset ('=', 1)) INIT_TOKEN (ADD_TO); break; case '-': if (match_offset ('=', 1)) INIT_TOKEN (SUB_TO); INIT_TOKEN_ADV1 (NEGATIVE); case '*': if (match_offset ('=', 1)) INIT_TOKEN (MULTI_TO); break; case '/': if (match_offset ('=', 1)) INIT_TOKEN (DIVIDE_TO); break; case '<': if (match_offset ('=', 1)) INIT_TOKEN (LESS_EQUAL); if (peek (1) == '<' && match_offset ('=', 2)) INIT_TOKEN (LSH_TO); INIT_TOKEN_ADV1 (LESS_THAN); case '>': if (match_offset ('=', 1)) INIT_TOKEN (GREATER_EQUAL); if (peek (1) == '>' && match_offset ('=', 2)) INIT_TOKEN (RSH_TO); INIT_TOKEN_ADV1 (GREATER_THAN); case '&': if (match_offset ('=', 1)) INIT_TOKEN (AND_TO); INIT_TOKEN_ADV1 (AND); case '|': if (match_offset ('=', 1)) INIT_TOKEN (OR_TO); break; case '^': if (match_offset ('=', 1)) INIT_TOKEN (XOR_TO); break; case '!': if (match_offset ('=', 1)) INIT_TOKEN (BANG_EQUAL); INIT_TOKEN_ADV1 (BANG); case '=': if (match_offset ('=', 1)) INIT_TOKEN (EQUAL_EQUAL); INIT_TOKEN_ADV1 (EQUAL); } goto unknown; } // LABEL_DECL : IDENTIFIER // IDENTIFIER include SYSCALL and label // We don't want hash the SYSCALL, so leave it later if (isalpha_l (peek (0), lc_c)) { do advance (1); while (isidentifier (peek (0))); INIT_TOKEN (match (':') ? LABEL_DECL : IDENTIFIER); } // NUMBER if (isdigit_l (peek (0), lc_c)) { char *end; unsigned long num = strtoul (scanner.token_start, &end, 0); if (scanner.token_start == end) goto unknown; #if __SIZEOF_POINTER__ == 8 static_assert (sizeof (unsigned long) == 8, "64-bit machine has 32-bit long?"); if ((uint32_t)num != num) INIT_TOKEN_ADV1 (OVERFLOW_NUMBER); #else #include static_assert (sizeof (unsigned long) == 4, "long is not 32-bit on 32-bit machine?"); if (num == ULONG_MAX && errno == ERANGE) INIT_TOKEN_ADV1 (OVERFLOW_NUMBER); #endif scanner.current_char = end; INIT_TOKEN_DATA (NUMBER, (uint32_t)num); } unknown: // perhaps that's a wrong file? tell parser to stop using EOF if (unknown_count > 5) INIT_TOKEN (TOKEN_EOF); unknown_count += 1; advance (1); INIT_TOKEN (UNKNOWN); } ceccomp-4.3.1/src/lexical/token.c000066400000000000000000000062561526046660400166460ustar00rootroot00000000000000#include "lexical/token.h" #include "lexical/scanner.h" #include "main.h" #include #include #define DEFTK(token) { token, LITERAL_STRLEN (token) } // clang-format off const string_t token_pairs[] = { [ARCH_X86] = DEFTK ("i386"), [ARCH_I686] = DEFTK ("i686"), [ARCH_X86_64] = DEFTK ("x86_64"), [ARCH_X32] = DEFTK ("x32"), [ARCH_AARCH64] = DEFTK ("aarch64"), [ARCH_ARMV8L] = DEFTK("armv8l"), [ARCH_ARMV7L] = DEFTK("armv7l"), [ARCH_ARM] = DEFTK ("arm"), [ARCH_LOONGARCH64] = DEFTK ("loongarch64"), [ARCH_M68K] = DEFTK ("m68k"), [ARCH_MIPSEL64N32] = DEFTK ("mipsel64n32"), [ARCH_MIPSEL64] = DEFTK ("mipsel64"), [ARCH_MIPSEL] = DEFTK ("mipsel"), [ARCH_MIPS64N32] = DEFTK ("mips64n32"), [ARCH_MIPS64] = DEFTK ("mips64"), [ARCH_MIPS] = DEFTK ("mips"), [ARCH_PARISC64] = DEFTK ("parisc64"), [ARCH_PARISC] = DEFTK ("parisc"), [ARCH_PPC64LE] = DEFTK ("ppc64le"), [ARCH_PPC64] = DEFTK ("ppc64"), [ARCH_PPC] = DEFTK ("ppc"), [ARCH_S390X] = DEFTK ("s390x"), [ARCH_S390] = DEFTK ("s390"), [ARCH_RISCV64] = DEFTK ("riscv64"), [ARCH_SH4] = DEFTK ("sh4"), [ARCH_SHEB] = DEFTK ("sheb"), [ARCH_SH] = DEFTK ("sh"), [KILL_PROC] = DEFTK ("KILL_PROCESS"), [KILL] = DEFTK ("KILL"), [ALLOW] = DEFTK ("ALLOW"), [NOTIFY] = DEFTK ("NOTIFY"), [LOG] = DEFTK ("LOG"), [TRACE] = DEFTK ("TRACE"), [TRAP] = DEFTK ("TRAP"), [ERRNO] = DEFTK ("ERRNO"), [RETURN] = DEFTK ("return"), [IF] = DEFTK ("if"), [GOTO] = DEFTK ("goto"), [ELSE] = DEFTK ("else"), [COMMA] = DEFTK (","), [A] = DEFTK ("$A"), [X] = DEFTK ("$X"), [MEM] = DEFTK ("$mem"), [ATTR_LEN] = DEFTK ("$scmp_data_len"), [ATTR_SYSCALL] = DEFTK ("$syscall_nr"), [ATTR_ARCH] = DEFTK ("$arch"), [ATTR_LOWPC] = DEFTK ("$low_pc"), [ATTR_HIGHPC] = DEFTK ("$high_pc"), [ATTR_LOWARG] = DEFTK ("$low_args"), [ATTR_HIGHARG] = DEFTK ("$high_args"), [DOT] = DEFTK ("."), [LEFT_BRACKET] = DEFTK ("["), [RIGHT_BRACKET] = DEFTK ("]"), [LEFT_PAREN] = DEFTK ("("), [RIGHT_PAREN] = DEFTK (")"), [ADD_TO] = DEFTK ("+="), [SUB_TO] = DEFTK ("-="), [MULTI_TO] = DEFTK ("*="), [DIVIDE_TO] = DEFTK ("/="), [LSH_TO] = DEFTK ("<<="), [RSH_TO] = DEFTK (">>="), [AND_TO] = DEFTK ("&="), [OR_TO] = DEFTK ("|="), [XOR_TO] = DEFTK ("^="), [EQUAL_EQUAL] = DEFTK ("=="), [BANG_EQUAL] = DEFTK ("!="), [GREATER_EQUAL] = DEFTK (">="), [GREATER_THAN] = DEFTK (">"), [LESS_EQUAL] = DEFTK ("<="), [LESS_THAN] = DEFTK ("<"), [AND] = DEFTK ("&"), [EQUAL] = DEFTK ("="), [NEGATIVE] = DEFTK ("-"), [BANG] = DEFTK ("!"), [NUMBER] = DEFTK ("number"), [IDENTIFIER] = DEFTK ("identifier"), [UNKNOWN] = DEFTK ("unknown"), [COMMENT] = DEFTK ("#"), [EOL] = DEFTK ("line_end"), [TOKEN_EOF] = DEFTK ("eof"), [LABEL_DECL] = DEFTK ("label_decl"), [OVERFLOW_NUMBER] = DEFTK("ERANGE"), // label_decl ::= IDENTIFIER + DEFTK(":") }; // clang-format on void init_token (token_t *token, const scanner_t *scanner, token_type type) { token->type = type; token->token_start = scanner->token_start; token->token_len = scanner->current_char - scanner->token_start; token->line_nr = scanner->line_nr; } void init_token_data (token_t *token, const scanner_t *scanner, token_type type, uint32_t data) { init_token (token, scanner, type); token->data = data; } ceccomp-4.3.1/src/probe.c000066400000000000000000000044061526046660400152070ustar00rootroot00000000000000#include "probe.h" #include "emu.h" #include "lexical/parser.h" #include "lexical/scanner.h" #include "main.h" #include "resolver/resolver.h" #include "trace.h" #include "utils/error.h" #include "utils/logger.h" #include "utils/parse_args.h" #include "utils/read_source.h" #include "utils/vector.h" #include #include #include #include #include #include #include #include #include #include static const char *to_test_list[] = { "open", "openat", "read", "write", "execve", "execveat", "mmap", "mprotect", "sendfile", "ptrace", "fork" }; static uint32_t fetch_text_from_trace (FILE **text, char *const argv[], bool quiet) { *text = tmpfile (); if (*text == NULL) error (M_REQUEST_TMPFILE_FAILED, strerror (errno)); fcntl (fileno (*text), F_SETFD, FD_CLOEXEC); uint32_t scmp_arch = program_trace (argv, *text, quiet, true); fflush (*text); fseek (*text, 0, SEEK_SET); return scmp_arch; } static void init_emu_arg (emu_arg_t *emu_arg, FILE *text, uint32_t scmp_arch) { for (uint32_t i = 0; i < 6; i++) emu_arg->args[i] = 0; emu_arg->quiet = true; emu_arg->text_file = text; emu_arg->scmp_arch = scmp_arch; emu_arg->ip = 0; } void probe (char *const argv[], FILE *output_fp, bool quiet) { FILE *text; emu_arg_t emu_arg; uint32_t scmp_arch; scmp_arch = fetch_text_from_trace (&text, argv, quiet); init_emu_arg (&emu_arg, text, scmp_arch); vector_t text_v; vector_t code_ptr_v; size_t lines = init_source (text) + 1; init_scanner (next_line ()); init_parser (scmp_arch); init_table (); init_vector (&text_v, sizeof (statement_t), lines); init_vector (&code_ptr_v, sizeof (statement_t *), MIN (lines, BPF_MAXINSNS + 1)); parser (&text_v, &code_ptr_v); if (resolver (&code_ptr_v)) error ("%s", M_PROBE_TERMINATED); // if ERROR_LINE exists, then exits for (size_t i = 0; i < ARRAY_SIZE (to_test_list); i++) { fprintf (output_fp, "%-10s-> ", to_test_list[i]); emu_arg.sys_name = to_test_list[i]; emulate_v (&text_v, &code_ptr_v, &emu_arg, output_fp); } free_table (); free_source (); free_vector (&text_v); free_vector (&code_ptr_v); fclose (text); } ceccomp-4.3.1/src/resolver/000077500000000000000000000000001526046660400155715ustar00rootroot00000000000000ceccomp-4.3.1/src/resolver/render.c000066400000000000000000000123021526046660400172120ustar00rootroot00000000000000#include "resolver/render.h" #include "attributes.h" #include "lexical/parser.h" #include "lexical/token.h" #include "main.h" #include "utils/arch_trans.h" #include "utils/str_pile.h" #include "utils/vector.h" #include #include #include #include #include #include #include #include typedef enum AttrPacked { NONE = 0, // 0b00 ARCH = 1, // 0b01 SYSNR = 2, // 0b10 MIXED = 3, // 0b11 } stat_t; typedef struct { stat_t A_stat; stat_t X_stat; stat_t mem_stat[BPF_MEMWORDS]; uint32_t arch; } stat_ctx_t; static stat_ctx_t *list; static statement_t *local; static uint32_t default_arch; #define FORCE true static void set_stat (stat_t *dest, stat_t src, bool force) { if (force || *dest == NONE) *dest = src; else if (*dest != src) *dest = MIXED; // if *dest != src, we give up tracing. } // same as set_stat static void set_arch (uint32_t dest_idx, uint32_t src) { if (list[dest_idx].arch == NONE) list[dest_idx].arch = src; else if (list[dest_idx].arch != src) list[dest_idx].arch = MIXED; } static void set_ctx (uint32_t dest_idx, uint32_t src_idx, bool force) { set_stat (&list[dest_idx].A_stat, list[src_idx].A_stat, force); set_stat (&list[dest_idx].X_stat, list[src_idx].X_stat, force); for (uint32_t i = 0; i < BPF_MEMWORDS; i++) set_stat (&list[dest_idx].mem_stat[i], list[src_idx].mem_stat[i], force); } static void assign_line (const assign_line_t *assign_line, stat_ctx_t *ctx) { const obj_t *left = &assign_line->left_var; const obj_t *right = &assign_line->right_var; token_type op = assign_line->operator; stat_t *left_stat; stat_t right_stat; if (left->type == A) left_stat = &ctx->A_stat; else if (left->type == X) left_stat = &ctx->X_stat; else if (left->type == MEM) left_stat = &ctx->mem_stat[left->data]; else assert (!"Unknown left value type"); if (op != EQUAL) right_stat = MIXED; else if (right->type == ATTR_SYSCALL) right_stat = SYSNR; else if (right->type == ATTR_ARCH) right_stat = ARCH; else if (right->type == A) right_stat = ctx->A_stat; else if (right->type == X) right_stat = ctx->X_stat; else if (right->type == MEM) right_stat = ctx->mem_stat[right->data]; else right_stat = MIXED; set_stat (left_stat, right_stat, FORCE); } static void try_resolve_arch (obj_t *cmpobj) { const string_t *arch_str = scmp_arch_to_internal_str (cmpobj->data); if (arch_str == NULL) return; cmpobj->type = IDENTIFIER; cmpobj->literal = *arch_str; } static void try_resolve_sysnr (obj_t *cmpobj) { uint32_t cur_arch = list[local->code_nr].arch; if (cur_arch == NONE) return; char *sys_name = seccomp_syscall_resolve_num_arch (cur_arch, cmpobj->data); if (sys_name == NULL) return; cmpobj->type = IDENTIFIER; const string_t *arch_str = NULL; if (cur_arch != default_arch) arch_str = scmp_arch_to_internal_str (cur_arch); cmpobj->literal = persist_object (sys_name, arch_str); free (sys_name); } static void jump_line (jump_line_t *jump_line) { if (!jump_line->if_condition) { // ja line uint32_t pc = local->code_nr; uint32_t jt = pc + jump_line->jt.code_nr + 1; set_ctx (jt, pc, !FORCE); set_arch (jt, list[pc].arch); return; } uint32_t pc = local->code_nr; uint32_t abs_jt = pc + jump_line->jt.code_nr + 1; uint32_t abs_jf = pc + jump_line->jf.code_nr + 1; token_type cmp_op = jump_line->comparator; uint32_t cmp_data = jump_line->cmpobj.data; set_ctx (abs_jt, pc, !FORCE); set_ctx (abs_jf, pc, !FORCE); // It's hard and unnessary to handle other comparators // So just set_arch when comparator is EQUAL_EQUAL if (list[pc].A_stat != ARCH) { set_arch (abs_jt, list[pc].arch); set_arch (abs_jf, list[pc].arch); } else if (cmp_op == EQUAL_EQUAL || cmp_op == BANG_EQUAL) { set_arch ((cmp_op == EQUAL_EQUAL) ? abs_jt : abs_jf, cmp_data); set_arch ((cmp_op == EQUAL_EQUAL) ? abs_jf : abs_jt, MIXED); } obj_t *cmpobj = &jump_line->cmpobj; if (list[pc].A_stat == ARCH) try_resolve_arch (cmpobj); else if (list[pc].A_stat == SYSNR) try_resolve_sysnr (cmpobj); } static void render_statement (statement_t *statement) { local = statement; switch (local->type) { case ASSIGN_LINE: assign_line (&local->assign_line, &list[local->code_nr]); set_ctx (local->code_nr + 1, local->code_nr, !FORCE); set_arch (local->code_nr + 1, list[local->code_nr].arch); break; case JUMP_LINE: jump_line (&local->jump_line); break; case RETURN_LINE: break; case EMPTY_LINE: case EOF_LINE: case ERROR_LINE: assert (!"type shouldn't be EMPTY, EOF or ERROR"); default: assert (!"Unknown type"); } } void render (vector_t *v, uint32_t scmp_arch) { default_arch = scmp_arch; uint32_t list_len = sizeof (stat_ctx_t) * (v->count + 1); // statement code_nr starts from 1 list = reallocate (NULL, list_len); memset (list, NONE, list_len); // set default_arch in list[1] list[1].arch = scmp_arch; for (uint32_t i = 1; i < v->count; i++) render_statement (get_vector (v, i)); reallocate (list, 0); } ceccomp-4.3.1/src/resolver/resolver.c000066400000000000000000000204121526046660400175750ustar00rootroot00000000000000#include "resolver/resolver.h" #include "attributes.h" #include "lexical/parser.h" #include "lexical/token.h" #include "utils/error.h" #include "utils/hash.h" #include "utils/logger.h" #include "utils/vector.h" #include #include #include #include #include #include static bool has_error; static statement_t *local; static uint16_t *masks, mem_valid = 0; static uint16_t bpf_len = 0; #define REPORT_ERROR(error_msg) \ do \ { \ report_error (error_msg); \ return; \ } \ while (0) #define SPRINTF_CAT(...) print += sprintf (print, __VA_ARGS__) static void report_error (const char *error_msg) { has_error = true; char buf[0x400]; char *print = buf; SPRINTF_CAT ("%hu:-: %s\n", local->text_nr, error_msg); // During the resolution phase, errors do not have a clear starting point // errors in this stage indicate a semantic error in an entire line of code. SPRINTF_CAT ("%.*s\n", local->line_len, local->line_start); // line_len shouldn't include a '\n' memset (print, '~', local->line_len); print[local->line_len] = '\0'; // warn will print a '\n' warn ("%s", buf); } AttrConst static bool match_from_to (token_type type, token_type from, token_type to) { return type >= from && type <= to; } static void error_line (void) { has_error = true; char buf[0x400]; char *print = buf; const error_line_t *error_line = &local->error_line; uint16_t err_len = error_line->error_start - local->line_start; SPRINTF_CAT ("%hu:%hu: %s\n", local->text_nr, err_len + 1, error_line->error_msg); SPRINTF_CAT ("%.*s\n", local->line_len, local->line_start); // line_len shouldn't include a '\n' memset (print, ' ', err_len); print[err_len] = '^'; print[err_len + 1] = '\0'; // warn will print a '\n' warn ("%s", buf); } #undef SPRINTF_CAT #define IS_ARG_OUT_RANGE(obj) is_out_range (obj, 5) #define IS_MEM_OUT_RANGE(obj) is_out_range (obj, 15) AttrPure static bool is_out_range (const obj_t *obj, uint32_t max_idx) { return obj->data > max_idx; } static void assign_A (const assign_line_t *assign_line) { token_type operator = assign_line->operator; const obj_t *right = &assign_line->right_var; if (operator == NEGATIVE) { if (right->type != A) REPORT_ERROR (M_RIGHT_SHOULD_BE_A); return; } else if (match_from_to (operator, ADD_TO, XOR_TO)) { if (right->type != X && right->type != NUMBER) REPORT_ERROR (M_RIGHT_SHOULD_BE_X_OR_NUM); if (operator == DIVIDE_TO && right->type == NUMBER && right->data == 0) REPORT_ERROR (M_ALU_DIV_BY_ZERO); // clang-format off if (match_from_to (operator, LSH_TO, RSH_TO) && right->type == NUMBER && right->data >= 32) // clang-format on REPORT_ERROR (M_ALU_SH_OUT_OF_RANGE); return; } assert (operator == EQUAL); if (right->type == A) REPORT_ERROR (M_RIGHT_CAN_NOT_BE_A); else if ((right->type == ATTR_LOWARG || right->type == ATTR_HIGHARG) && IS_ARG_OUT_RANGE (right)) REPORT_ERROR (M_ARGS_IDX_OUT_OF_RANGE); else if (right->type == MEM) { if (IS_MEM_OUT_RANGE (right)) REPORT_ERROR (M_MEM_IDX_OUT_OF_RANGE); if (!(mem_valid & (1 << right->data))) REPORT_ERROR (M_UNINITIALIZED_MEM); } } static void assign_X (const assign_line_t *assign_line) { const token_type *operator = &assign_line->operator; const obj_t *right = &assign_line->right_var; if (*operator != EQUAL) REPORT_ERROR (M_OPERATOR_SHOULD_BE_EQUAL); if (match_from_to (right->type, ATTR_SYSCALL, ATTR_HIGHARG)) REPORT_ERROR (M_LEFT_SHOULD_BE_A); else if (right->type == X) REPORT_ERROR (M_RIGHT_CAN_NOT_BE_X); else if ((right->type == ATTR_LOWARG || right->type == ATTR_HIGHARG) && IS_ARG_OUT_RANGE (right)) REPORT_ERROR (M_ARGS_IDX_OUT_OF_RANGE); else if (right->type == MEM) { if (IS_MEM_OUT_RANGE (right)) REPORT_ERROR (M_MEM_IDX_OUT_OF_RANGE); if (!(mem_valid & (1 << right->data))) REPORT_ERROR (M_UNINITIALIZED_MEM); } } static void assign_MEM (const assign_line_t *assign_line) { const obj_t *left = &assign_line->left_var; token_type operator = assign_line->operator; const obj_t *right = &assign_line->right_var; if (operator != EQUAL) REPORT_ERROR (M_OPERATOR_SHOULD_BE_EQUAL); if (IS_MEM_OUT_RANGE (left)) REPORT_ERROR (M_MEM_IDX_OUT_OF_RANGE); if (right->type != A && right->type != X) REPORT_ERROR (M_RIGHT_SHOULD_BE_A_OR_X); mem_valid |= (1 << left->data); } static void assign_line (void) { const assign_line_t *assign_line = &local->assign_line; if (assign_line->left_var.type == A) assign_A (assign_line); else if (assign_line->left_var.type == X) assign_X (assign_line); else if (assign_line->left_var.type == MEM) assign_MEM (assign_line); } static void set_jt_jf (label_t *label, uint32_t code_nr) { label->code_nr = code_nr - local->code_nr - 1; } static void jump_line (void) { jump_line_t *jump_line = &local->jump_line; if (!jump_line->if_condition) { uint32_t jt = find_key (&jump_line->jt.key); if (jt == (uint16_t)-1) REPORT_ERROR (M_CANNOT_FIND_LABEL); else if (jt > bpf_len) REPORT_ERROR (M_JA_OUT_OF_FILTERS); set_jt_jf (&jump_line->jt, jt); if ((int16_t)jump_line->jt.code_nr < 0) REPORT_ERROR (M_JA_MUST_BE_POSITIVE); masks[jt] &= mem_valid; mem_valid = ~0; return; } uint32_t jt = find_key (&jump_line->jt.key); if (jt == (uint16_t)-1) REPORT_ERROR (M_CANNOT_FIND_LABEL); set_jt_jf (&jump_line->jt, jt); if ((int16_t)jump_line->jt.code_nr < 0) REPORT_ERROR (M_JT_MUST_BE_POSITIVE); if (jump_line->jt.code_nr > UINT8_MAX) REPORT_ERROR (M_JT_TOO_FAR); if (jt > bpf_len) REPORT_ERROR (M_JT_INVALID_TAG); uint32_t jf; if (jump_line->jf.key.start == NULL) jf = local->code_nr + 1; else { jf = find_key (&jump_line->jf.key); if (jf == (uint16_t)-1) REPORT_ERROR (M_CANNOT_FIND_LABEL); } set_jt_jf (&jump_line->jf, jf); jf = local->code_nr + jump_line->jf.code_nr + 1; if ((int16_t)jump_line->jf.code_nr < 0) REPORT_ERROR (M_JF_MUST_BE_POSITIVE); if (jump_line->jf.code_nr > UINT8_MAX) REPORT_ERROR (M_JF_TOO_FAR); if (jf > bpf_len) REPORT_ERROR (M_JF_INVALID_TAG); masks[jt] &= mem_valid; masks[jf] &= mem_valid; mem_valid = ~0; } static void return_line (void) { const return_line_t *return_line = &local->return_line; token_type ret_type = return_line->ret_obj.type; if (ret_type == A || ret_type == NUMBER) return; if ((ret_type == TRACE || ret_type == TRAP || ret_type == ERRNO) && return_line->ret_obj.data > 0xffff) REPORT_ERROR (M_RET_DATA_OVERFLOW); // Don't assume the ret_obj.data == zero when not used } static void resolve_statement (statement_t *statement) { local = statement; switch (local->type) { case ERROR_LINE: error_line (); return; case ASSIGN_LINE: assign_line (); return; case JUMP_LINE: jump_line (); return; case RETURN_LINE: return_line (); return; // nothing need to be done for these line case EMPTY_LINE: case EOF_LINE: assert (!"Resolving EMPTY_LINE/EOF_LINE??"); } } bool resolver (vector_t *code_ptr_v) { has_error = false; masks = reallocate (NULL, sizeof (*masks) * (code_ptr_v->count)); memset (masks, 0xff, sizeof (*masks) * (code_ptr_v->count)); mem_valid = 0; bpf_len = code_ptr_v->count - 1; if (bpf_len == 0) error ("%s", M_NO_VALID_CODE); for (uint32_t i = 1; i < code_ptr_v->count; i++) { mem_valid &= masks[i]; statement_t **ptr = get_vector (code_ptr_v, i); resolve_statement (*ptr); } statement_t **last = get_vector (code_ptr_v, code_ptr_v->count - 1); if ((*last)->type != RETURN_LINE) report_error (M_MUST_END_WITH_RET); reallocate (masks, 0x0); return has_error; } ceccomp-4.3.1/src/trace.c000066400000000000000000000344121526046660400151760ustar00rootroot00000000000000#include "trace.h" #include "attributes.h" #include "disasm.h" #include "main.h" #include "utils/error.h" #include "utils/logger.h" #include #define _NO_VMLINUX_ #include "utils/ebpf_share.h" #include "utils/proc_status.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LOAD_FAIL 7 #define LOAD_ELSE 8 #ifndef SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV #define SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV (1UL << 5) #endif #define SECCOMP_FLAG_LIST(X) \ X (SECCOMP_FILTER_FLAG_TSYNC) \ X (SECCOMP_FILTER_FLAG_LOG) \ X (SECCOMP_FILTER_FLAG_SPEC_ALLOW) \ X (SECCOMP_FILTER_FLAG_NEW_LISTENER) \ X (SECCOMP_FILTER_FLAG_TSYNC_ESRCH) \ X (SECCOMP_FILTER_FLAG_WAIT_KILLABLE_RECV) struct flag_name { uint32_t bit; uint32_t namelen; const char *name; }; #define FLAG_ENTRY(x) { x, LITERAL_STRLEN (#x), #x }, static const struct flag_name seccomp_flags[] = { SECCOMP_FLAG_LIST (FLAG_ENTRY) }; #undef FLAG_ENTRY #undef SECCOMP_FLAG_LIST #define MACRO_STR(x) #x static uint64_t seccomp_nr; static uint64_t prctl_nr; static uint32_t saved_arch = -1; static long check_scmp_mode (const syscall_info *info, int pid, long *rval) { long seccomp_mode = LOAD_ELSE; uint64_t nr = info->entry.nr; uint64_t arg0 = info->entry.args[0]; uint64_t arg1 = info->entry.args[1]; uint32_t flags; if (nr == seccomp_nr && (arg0 == SECCOMP_SET_MODE_FILTER || arg0 == SECCOMP_SET_MODE_STRICT)) { seccomp_mode = arg0; flags = arg1; } else if (nr == prctl_nr && arg0 == PR_SET_SECCOMP) { // prctl use different macros // transfer it to seccomp macros if (arg1 == SECCOMP_MODE_STRICT) arg1 = SECCOMP_SET_MODE_STRICT; else if (arg1 == SECCOMP_MODE_FILTER) arg1 = SECCOMP_SET_MODE_FILTER; else return LOAD_ELSE; seccomp_mode = arg1; // prctl doesn't have seccomp flags flags = 0; } else return LOAD_ELSE; // get seccomp_mode // prctl (PR_SET_SECCOMP, seccomp_mode, &prog); // seccomp (seccomp_mode, flags, &prog); syscall_info exit_info; ptrace (PTRACE_SYSCALL, pid, 0, 0); waitpid (pid, NULL, 0); ptrace (PTRACE_GET_SYSCALL_INFO, pid, sizeof (syscall_info), &exit_info); assert (exit_info.op == PTRACE_SYSCALL_INFO_EXIT); *rval = exit_info.exit.rval; bool succeed = load_success (*rval, flags); if ((flags & SECCOMP_FILTER_FLAG_NEW_LISTENER) && (flags & SECCOMP_FILTER_FLAG_TSYNC) && (flags & SECCOMP_FILTER_FLAG_TSYNC_ESRCH)) succeed = may_be_listener_fd (pid, *rval); else if ((flags & SECCOMP_FILTER_FLAG_NEW_LISTENER) && !(flags & SECCOMP_FILTER_FLAG_TSYNC)) succeed = may_be_listener_fd (pid, *rval); if (succeed) return seccomp_mode; return LOAD_FAIL; } static size_t peek_data_check (pid_t pid, const size_t *addr) { errno = 0; size_t result = ptrace (PTRACE_PEEKDATA, pid, addr, 0); if (result == (size_t)-1 && errno != 0) error (M_PEEKDATA_FAILED_ADR, (void *)addr); return result; } static void dump_filter (const syscall_info *info, int pid, fprog *prog) { size_t *filters = (size_t *)prog->filter; // args2 is the prog addrs uint64_t args2 = info->entry.args[2]; uint32_t offset = offsetof (fprog, filter); bool is_local_64 = (sizeof (void *) == 8); bool is_target_64 = info->arch & __AUDIT_ARCH_64BIT; if (UNLIKELY (is_local_64 && !is_target_64)) offset /= 2; else if (UNLIKELY (!is_local_64 && is_target_64)) error ("%s", M_CANNOT_WORK_FROM_32_TO_64); size_t word = peek_data_check (pid, (size_t *)(size_t)info->entry.args[2]); // kernel ensure prog->len is not 0 memcpy (&prog->len, &word, sizeof (prog->len)); if (UNLIKELY (prog->len == 0 || prog->len > BPF_MAXINSNS)) error ("%s", M_TRACE_UNDER_ATTACK); word = peek_data_check (pid, (size_t *)((size_t)args2 + offset)); size_t *filter_adr = NULL; if (UNLIKELY (is_local_64 && !is_target_64)) memcpy (&filter_adr, &word, 4); else filter_adr = (size_t *)word; // use size_t so that it can work in both 64 and 32 bits for (int i = 0; i * sizeof (size_t) < prog->len * sizeof (filter); i++) filters[i] = peek_data_check (pid, &((size_t *)filter_adr)[i]); } static void mode_filter (const syscall_info *info, int pid, fprog *prog, FILE *output_fp) { if (UNLIKELY (!g_filters)) assert (init_global_filters (BPF_MAXINSNS)); prog->filter = g_filters; dump_filter (info, pid, prog); print_prog (info->arch, prog, pid, output_fp, true); } AttrNoReturn static void child (char *const argv[], int efd) { eventfd_t fail = 2; // allow parent to trace us prctl (PR_SET_DUMPABLE, 1); eventfd_read (efd, &fail); // SHOULD GET SEIZED HERE close (efd); if (UNLIKELY (fail == 2)) // SEIZE child failed exit (1); int err = execv (argv[0], argv); if (err) error ("%s %s: %s", M_EXECV_ERR, argv[0], strerror (errno)); assert (!"exec should either succeed or fail with `error`"); } // return true if handled fork static bool handle_fork (pid_t pid, int status, bool quiet) { uint64_t new_pid; switch ((status >> 16) & 0xffff) { case PTRACE_EVENT_FORK: case PTRACE_EVENT_VFORK: case PTRACE_EVENT_CLONE: // tracee parent send these 3 event to tracer ptrace (PTRACE_GETEVENTMSG, pid, NULL, &new_pid); if (!quiet) info (M_PROCESS_FORK, pid, (pid_t)new_pid); // fall through case PTRACE_EVENT_STOP: // tracee child send this flag to tracer (PTRACE_SEIZE) return true; default: return false; } } static void info_parse (const syscall_info *info, pid_t pid) { // prctl (PR_SET_SECCOMP, seccomp_mode, &prog); // seccomp (seccomp_mode, flags, &prog); uint32_t flag = info->entry.args[1]; uint32_t nr = info->entry.nr; if (nr == prctl_nr) { info (M_PID_BPF_PRCTL, pid, MACRO_STR (SECCOMP_MODE_FILTER)); return; } bool not_first = false; char flag_buf[0x100]; uint32_t offset = 0; size_t slen; memcpy (flag_buf, "0", sizeof ("0")); for (uint32_t i = 0; i < ARRAY_SIZE (seccomp_flags); i++) { if (!(seccomp_flags[i].bit & flag)) continue; if (not_first) { memcpy (flag_buf + offset, " | ", 3); offset += 3; slen = seccomp_flags[i].namelen; memcpy (flag_buf + offset, seccomp_flags[i].name, slen + 1); // \0 offset += slen; } else { slen = seccomp_flags[i].namelen; memcpy (flag_buf, seccomp_flags[i].name, slen + 1); // \0 offset = slen; not_first = true; } } info (M_PID_BPF_SECCOMP, pid, MACRO_STR (SECCOMP_SET_MODE_FILTER), flag_buf); } static bool handle_syscall (pid_t pid, FILE *output_fp, bool quiet, bool oneshot) { syscall_info info; fprog prog; long seccomp_mode; long rval; ptrace (PTRACE_GET_SYSCALL_INFO, pid, sizeof (info), &info); if (info.op != PTRACE_SYSCALL_INFO_ENTRY) return false; if (info.arch != saved_arch) { saved_arch = info.arch; seccomp_nr = seccomp_syscall_resolve_name_arch (saved_arch, "seccomp"); prctl_nr = seccomp_syscall_resolve_name_arch (saved_arch, "prctl"); // every arch has prctl, so if prctl has no nr, seccomp has no nr, either if (prctl_nr == (uint64_t)__NR_SCMP_ERROR) error (M_TRACEE_ARCH_NOT_SUPPORTED, saved_arch); } seccomp_mode = check_scmp_mode (&info, pid, &rval); if (!quiet) { if (seccomp_mode == LOAD_FAIL) if (rval > 0) warn (M_PID_BPF_LOAD_FAIL, pid, M_BPF_FAIL_UNKNOWN); else warn (M_PID_BPF_LOAD_FAIL, pid, strerror (-rval)); else if (seccomp_mode == SECCOMP_SET_MODE_FILTER) info_parse (&info, pid); } if (seccomp_mode == SECCOMP_SET_MODE_STRICT) warn (M_FOUND_STRICT_MODE, pid); else if (seccomp_mode == SECCOMP_SET_MODE_FILTER) mode_filter (&info, pid, &prog, output_fp); if (!oneshot || seccomp_mode == LOAD_FAIL || seccomp_mode == LOAD_ELSE) return false; return true; } // clang-format off #define PTRACE_FLAGS \ PTRACE_O_TRACESYSGOOD | PTRACE_O_TRACEFORK \ | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE // clang-format on static uint32_t parent (pid_t child_pid, FILE *output_fp, uint32_t extra_flags, bool quiet, bool oneshot, int efd) { int status; long rc; if (!(rc = ptrace (PTRACE_SEIZE, child_pid, 0, PTRACE_FLAGS | extra_flags))) rc = ptrace (PTRACE_INTERRUPT, child_pid, 0, 0); if (efd >= 0) { // old TRACEME path, use 2 to represent failure eventfd_write (efd, rc == 0 ? 1 : 2); close (efd); } if (rc) return -1; waitpid (child_pid, &status, 0); if (!quiet) // write info when we truly start tracing so that // script can continue interacting correctly info (M_START_TRACING, child_pid); ptrace (PTRACE_SYSCALL, child_pid, 0, 0); while (1) { pid_t pid = waitpid (-1, &status, __WALL); if (pid == -1) { if (errno == ECHILD) exit (0); continue; } if (WIFEXITED (status) || WIFSIGNALED (status)) { if (!quiet) info (M_PROCESS_EXIT, pid); continue; } if (WIFCONTINUED (status)) continue; int sig = WSTOPSIG (status); if (sig == (SIGTRAP | 0x80)) { if (handle_syscall (pid, output_fp, quiet, oneshot)) return saved_arch; ptrace (PTRACE_SYSCALL, pid, 0, 0); } else if (sig == SIGTRAP && handle_fork (pid, status, quiet)) ptrace (PTRACE_SYSCALL, pid, 0, 0); else if (((status >> 16) & 0xffff) == PTRACE_EVENT_STOP) // process group-stop ptrace (PTRACE_LISTEN, pid, 0, 0); else // any other sig, or a real SIGTRAP ptrace (PTRACE_SYSCALL, pid, 0, sig); } } AttrNoReturn static void exit_on_sig (int signo) { // flush files when recved normal signals exit (signo); } uint32_t program_trace (char *const argv[], FILE *output_fp, bool quiet, bool oneshot) { signal (SIGINT, exit_on_sig); signal (SIGTERM, exit_on_sig); int efd = eventfd (0, 0); int pid = fork (); assert (efd >= 0 && pid >= 0); if (pid == 0) child (argv, efd); else { uint32_t token = parent (pid, output_fp, PTRACE_O_EXITKILL, quiet, oneshot, efd); if (UNLIKELY (token == (uint32_t)-1)) error (M_FAILED_SEIZE_CHILD, pid); return token; } } static void einval_get_filter (pid_t pid) { seccomp_mode mode = get_proc_seccomp (pid); if ((int)mode == PROCFS_ERROR) error ("%s %s, %s", M_PROCFS_NOT_ACCESSIBLE, ACTION_GET_FILTER, M_GET_FILTER_UNSUPPORTED_OR_NO_FILTER); if (mode == STATUS_STRICT_MODE) { warn (M_FOUND_STRICT_MODE, pid); exit (0); } else if (mode == STATUS_FILTER_MODE) error ("%s", M_GET_FILTER_UNSUPPORTED); // if mode == STATUS_NONE, return to print "no filters found" } AttrNoReturn static void eacces_get_filter (pid_t pid) { seccomp_mode mode = get_proc_seccomp (pid); if ((int)mode == PROCFS_ERROR) error ("%s %s, %s", M_PROCFS_NOT_ACCESSIBLE, ACTION_GET_FILTER, M_CAP_SYS_ADMIN_OR_IN_SECCOMP); if (mode == STATUS_NONE) error ("%s", M_REQUIRE_CAP_SYS_ADMIN); else error ("%s", M_CECCOMP_IN_SECCOMP); } // return true means continue // else break static bool error_get_filter (pid_t pid, int err) { switch (err) { case ENOENT: return false; case EINVAL: einval_get_filter (pid); return false; case EACCES: eacces_get_filter (getpid ()); case EMEDIUMTYPE: warn ("%s", M_NOT_AN_CBPF); return true; default: error (M_UNKNOWN_GETFILTER_ERR, strerror (err)); } } AttrNoReturn static void eperm_seize (pid_t pid) { // seizing a thread in the same thread group may cause EPERM // but that will probably not happen kthread_mode mode = is_proc_kthread (pid); if ((int)mode == PROCFS_ERROR) error ("%s %s, %s", M_PROCFS_NOT_ACCESSIBLE, ACTION_PTRACE_SEIZE, M_CAP_SYS_PTRACE_OR_KTHREAD); if (mode == STATUS_KTHREAD) error ("%s", M_SEIZING_KERNEL_THREAD); pid_t tracer = get_tracer_pid (pid); assert (tracer != PROCFS_ERROR); if (tracer) error (M_TARGET_TRACED_BY, tracer); else error ("%s", M_REQUIRE_CAP_SYS_PTRACE); // seize needs CAP_SYS_PTRACE // get_filter needs CAP_SYS_ADMIN } static void error_seize (pid_t pid, int err) { switch (err) { case EPERM: eperm_seize (pid); case ESRCH: error ("%s", M_SEIZE_NONEXIST_PROC); default: error (M_UNKNOWN_SEIZE_ERR, strerror (err)); } } static void pid_seize (int pid, bool quiet) { signal (SIGINT, exit_on_sig); signal (SIGTERM, exit_on_sig); if (parent (pid, stdout, 0, quiet, false, -1) == (uint32_t)-1) error_seize (pid, errno); } void pid_trace (int pid, bool seize, bool quiet) { fprog prog; assert (init_global_filters (BPF_MAXINSNS)); prog.filter = g_filters; int prog_idx = 0; if (seize) { pid_seize (pid, quiet); return; } if (ptrace (PTRACE_SEIZE, pid, 0, 0) != 0) error_seize (pid, errno); ptrace (PTRACE_INTERRUPT, pid, 0, 0); waitpid (pid, NULL, 0); syscall_info info; ptrace (PTRACE_GET_SYSCALL_INFO, pid, sizeof (info), &info); uint32_t scmp_arch = info.arch; while (true) { prog.len = ptrace (PTRACE_SECCOMP_GET_FILTER, pid, prog_idx, prog.filter); if (prog.len != (unsigned short)-1) { print_prog (scmp_arch, &prog, pid, stdout, true); prog_idx++; continue; } if (!error_get_filter (pid, errno)) break; } if (prog_idx == 0) info (M_NO_FILTER_FOUND, pid); ptrace (PTRACE_DETACH, pid, 0, 0); } ceccomp-4.3.1/src/utils/000077500000000000000000000000001526046660400150705ustar00rootroot00000000000000ceccomp-4.3.1/src/utils/arch_trans.c000066400000000000000000000071671526046660400173730ustar00rootroot00000000000000#include "utils/arch_trans.h" #include "attributes.h" #include "lexical/token.h" #include #include #include #include static const uint32_t arch_pairs[] = { // [ARCH_X86] = SCMP_ARCH_X86 #define X(int_arch, scmp_arch) [int_arch] = scmp_arch, #define FALLBACK_X(int_arch) [int_arch] = -1, #include "x-macro/arch_table.h" #undef X #undef FALLBACK_X [ARCH_I686] = SCMP_ARCH_X86, [ARCH_ARMV7L] = SCMP_ARCH_ARM, [ARCH_ARMV8L] = SCMP_ARCH_ARM, #if SCMP_VER_MAJOR >= 2 && SCMP_VER_MINOR >= 6 [ARCH_SH4] = SCMP_ARCH_SH, #else [ARCH_SH4] = -1, #endif }; AttrPure uint32_t internal_arch_to_scmp_arch (uint32_t internal_arch) { // ARCH_X86 = 0, so (arch >= ARCH_X86) is always true; if (internal_arch <= ARCH_SH) return arch_pairs[internal_arch]; return -1; } AttrPure uint32_t scmp_arch_to_internal_arch (uint32_t scmp_arch) { switch (scmp_arch) { // case SCMP_ARCH_X86: return ARCH_X86 // clang-format off #define X(int_arch, _scmp_arch) case _scmp_arch: return int_arch; #define FALLBACK_X(int_arch) #include "x-macro/arch_table.h" #undef X #undef FALLBACK_X // clang-format on } return -1; } // match ending \0 #define MAYBE_MATCH_ARCH(arch, ext) \ if (!strncmp (str, token_pairs[arch].start, token_pairs[arch].len + ext)) \ return arch; AttrPure token_type str_to_internal_arch (const char *str, bool strict) { int ext = strict ? 1 : 0; switch (*str) { case 'i': MAYBE_MATCH_ARCH (ARCH_X86, ext); MAYBE_MATCH_ARCH (ARCH_I686, ext); break; case 'x': MAYBE_MATCH_ARCH (ARCH_X86_64, ext); MAYBE_MATCH_ARCH (ARCH_X32, ext); break; case 'a': MAYBE_MATCH_ARCH (ARCH_AARCH64, ext); MAYBE_MATCH_ARCH (ARCH_ARMV8L, ext) MAYBE_MATCH_ARCH (ARCH_ARMV7L, ext) MAYBE_MATCH_ARCH (ARCH_ARM, ext); break; case 'l': MAYBE_MATCH_ARCH (ARCH_LOONGARCH64, ext); break; case 'm': MAYBE_MATCH_ARCH (ARCH_M68K, ext); MAYBE_MATCH_ARCH (ARCH_MIPSEL64N32, ext); MAYBE_MATCH_ARCH (ARCH_MIPSEL64, ext); MAYBE_MATCH_ARCH (ARCH_MIPSEL, ext); MAYBE_MATCH_ARCH (ARCH_MIPS64N32, ext); MAYBE_MATCH_ARCH (ARCH_MIPS64, ext); MAYBE_MATCH_ARCH (ARCH_MIPS, ext); break; case 'p': MAYBE_MATCH_ARCH (ARCH_PARISC64, ext); MAYBE_MATCH_ARCH (ARCH_PARISC, ext); MAYBE_MATCH_ARCH (ARCH_PPC64LE, ext); MAYBE_MATCH_ARCH (ARCH_PPC64, ext); MAYBE_MATCH_ARCH (ARCH_PPC, ext); break; case 's': MAYBE_MATCH_ARCH (ARCH_S390X, ext); MAYBE_MATCH_ARCH (ARCH_S390, ext); MAYBE_MATCH_ARCH (ARCH_SH4, ext); MAYBE_MATCH_ARCH (ARCH_SHEB, ext); MAYBE_MATCH_ARCH (ARCH_SH, ext); break; case 'r': MAYBE_MATCH_ARCH (ARCH_RISCV64, ext); break; } return UNKNOWN; } AttrPure uint32_t str_to_scmp_arch (const char *str, bool strict) { token_type tk = str_to_internal_arch (str, strict); if (tk == UNKNOWN) return -1; return internal_arch_to_scmp_arch (tk); } AttrPure const string_t * scmp_arch_to_internal_str (uint32_t scmp_arch) { int32_t idx = scmp_arch_to_internal_arch (scmp_arch); if (idx == -1) return NULL; return &token_pairs[idx]; } AttrPure const char * scmp_arch_to_scmp_str (uint32_t scmp_arch) { switch (scmp_arch) { // case SCMP_ARCH_X86: return "SCMP_ARCH_X86"; // clang-format off #define X(int_arch, _scmp_arch) case _scmp_arch: return #_scmp_arch; #define FALLBACK_X(int_arch) #include "x-macro/arch_table.h" #undef X #undef FALLBACK_X // clang-format on } assert (!"Unexpected unknown scmp_arch"); } ceccomp-4.3.1/src/utils/bpf_trans.c000066400000000000000000000421361526046660400172200ustar00rootroot00000000000000#include "main.h" #include "utils/error.h" #include "utils/logger.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* References: * FUNC bpf_convert_filter (ebpf 2 cbpf without const blinding) * https://elixir.bootlin.com/linux/v7.1.1/source/net/core/filter.c#L580 * FUNC bpf_jit_blind_insn (const blind after bpf_convert_filter) * https://elixir.bootlin.com/linux/v7.1.1/source/kernel/bpf/core.c#L1293 * FUNC seccomp_check_filter (valid cbpf insns) * https://elixir.bootlin.com/linux/v7.1.1/source/kernel/seccomp.c#L278 * MACROS * https://elixir.bootlin.com/linux/v7.1.1/source/include/linux/filter.h */ /* Some internal APIs in kernel which is not exposed in user APIs */ #define BPF_REG_CTX BPF_REG_6 #define BPF_REG_FP BPF_REG_10 #define BPF_REG_A BPF_REG_0 #define BPF_REG_X BPF_REG_7 #define BPF_REG_TMP BPF_REG_2 #define BPF_REG_AX __MAX_BPF_REG #define CBPF_STMT(code, k) (struct sock_filter){ (code), 0, 0, (k) }; #define CBPF_JMP(code, k, jt, jf) (struct sock_filter){ (code), jt, jf, (k) }; static jmp_buf restore; static int err_line_no; static const char *err_str; #define ASSERT_JMP(cond) \ do \ { \ if (UNLIKELY (!(cond))) \ { \ err_line_no = __LINE__; \ err_str = #cond; \ longjmp (restore, 1); \ } \ } \ while (0) typedef struct { // the filter is put `fold` insns ahead, it's sync with ebpf uint8_t fold : 3; // tracks branch to extinguish explicit JA or RETURN A uint8_t targeted : 1; } InsnFlag; // if set means insns that need to be deleted static uint32_t *bitmap; static InsnFlag *flags; typedef enum { NOT_CHECK, CHECK_DIV_X, CHECK_CMP_LARGE_K, CHECK_RET_K, } check_path; /* Note about the relationship between ebpfp and flag: flag always keep sync * with the insn to WRITE while ebpfp always keep sync with the insn to READ, * so (ebpfp - ebpfs) may not equal (flag - flags). But * (ebpfp - ebpfs == flag - flags + flag->fold). * large_k is related to bpf_insn.imm, which is s32, while sock_filter.k is * u32. * ate is the pointer to tell how many instructions are folded. This is * deliberately kept as flag->fold only represents the original location of JMP * insn. */ static struct sock_filter jmp_insn (const struct bpf_insn *ebpfp, check_path path, uint32_t large_k, int *ate, InsnFlag *flag) { // in 1st pass, clear instructions, do relocation later struct bpf_insn insn; switch (path) { case NOT_CHECK: insn = *ebpfp; int op = BPF_OP (insn.code); if (op == BPF_EXIT) return CBPF_STMT (BPF_RET | BPF_A, 0); if (op == BPF_JA) { // JA is not impacted by constant blinding flag[insn.off + 1].targeted = 1; return CBPF_JMP (BPF_JMP | BPF_JA, 1, 0, 0); } int code = insn.code; uint32_t k = insn.imm; // originally it's comparing BPF_K, modified during bpf_convert_filter // set it back to BPF_K if (large_k) { k = large_k; code &= ~BPF_X; } flag[flag->fold + insn.off + 1].targeted = 1; // peek next insn, if it's JA (current insn is JMP), it's not targeted, // and the current insn is a valid cBPF op, then it's casted from a JMP // with both jt & jf (possibly, we will check it in second pass) // note that !JSET is always in this branch InsnFlag *ja_flag = flag + flag->fold + 1; if (ebpfp[1].code == (BPF_JMP | BPF_JA) && !ja_flag->targeted && op != BPF_JNE && op != BPF_JLE && op != BPF_JLT) { ++*ate; // flags[i + flag->fold + 1 + ebpfs[i + flag->fold + 1].off + 1] ja_flag[ebpfp[1].off + 1].targeted = 1; // in this case, insn.code is exactly the same from cBPF return CBPF_JMP (code, k, 1, 1); } if (op == BPF_JEQ || op == BPF_JGT || op == BPF_JGE || op == BPF_JSET) return CBPF_JMP (code, k, 1, 0); if (op == BPF_JNE) return CBPF_JMP ((code & ~BPF_JNE) | BPF_JEQ, k, 0, 1); if (op == BPF_JLE) return CBPF_JMP ((code & ~BPF_JLE) | BPF_JGT, k, 0, 1); if (op == BPF_JLT) return CBPF_JMP ((code & ~BPF_JLT) | BPF_JGE, k, 0, 1); ASSERT_JMP (!"Unexpected eBPF JMP pattern"); case CHECK_DIV_X: /* MOV X X * JNE X 0 2 * XOR A A * EXIT * DIV A X 0 */ insn = *++ebpfp; if (insn.code == (BPF_JMP | BPF_JNE | BPF_K)) // without blinding insn = *++ebpfp; else { // with blinding /* ... * MOV AX rnd * XOR AX rnd * JNE X AX 2 * ... */ ASSERT_JMP (insn.code == (BPF_ALU64 | BPF_MOV | BPF_K)); insn = *++ebpfp; ASSERT_JMP (insn.code == (BPF_ALU64 | BPF_XOR | BPF_K)); insn = *++ebpfp; ASSERT_JMP (insn.code == (BPF_JMP | BPF_JNE | BPF_X) && insn.src_reg == BPF_REG_AX); insn = *++ebpfp; *ate += 2; } ASSERT_JMP (insn.code == (BPF_ALU | BPF_XOR | BPF_X)); insn = *++ebpfp; ASSERT_JMP (insn.code == (BPF_JMP | BPF_EXIT)); *ate += 4; return CBPF_STMT (BPF_ALU | BPF_DIV | BPF_X, 0); case CHECK_CMP_LARGE_K: /* MOV TMP K * Jxx TMP A */ ++*ate; // consume MOV TMP K flag->fold++; ASSERT_JMP (BPF_CLASS (ebpfp[1].code) == BPF_JMP); return jmp_insn (ebpfp + 1, NOT_CHECK, ebpfp->imm, ate, flag); case CHECK_RET_K: /* MOV A K * EXIT * or simply MOV A K? */ if (ebpfp[1].code == (BPF_JMP | BPF_EXIT) && !flag[flag->fold + 1].targeted) { ++*ate; return CBPF_STMT (BPF_RET | BPF_K, ebpfp->imm); } return CBPF_STMT (BPF_LD | BPF_IMM, ebpfp->imm); default: ASSERT_JMP (!"Unexpected check_path"); } } static struct sock_filter alu_insn (struct bpf_insn *ebpfp, int *ate, InsnFlag *flag) { struct bpf_insn insn = *ebpfp; struct sock_filter filter; // remove constant blinding first if (BPF_OP (insn.code) == BPF_MOV && insn.dst_reg == BPF_REG_AX) { /* MOV AX K * XOR AX K * ??? A AX ... */ *ate += 2; flag->fold += 2; // instruction is folded 2 insns ahead ebpfp[2].imm = ebpfp[0].imm ^ ebpfp[1].imm; ebpfp[2].code &= ~BPF_X; // restore rval to BPF_K ebpfp[2].src_reg = 0; ebpfp += 2; insn = *ebpfp; } else if (BPF_OP (insn.code) == BPF_XOR && BPF_SRC (insn.code) == BPF_X && insn.src_reg == insn.dst_reg) { // bpf_jit_blind_insn may convert A = 0 and X = 0 to xor ebpfp->src_reg = 0; ebpfp->code = BPF_ALU | BPF_MOV | BPF_K; insn = *ebpfp; } // spotted JMP after de-blind? if (BPF_CLASS (insn.code) == BPF_JMP) return jmp_insn (ebpfp, NOT_CHECK, 0, ate, flag); if (BPF_OP (insn.code) == BPF_MOV) { if (BPF_CLASS (insn.code) == BPF_ALU64 && BPF_SRC (insn.code) == BPF_X && (insn.src_reg == BPF_REG_X || insn.dst_reg == BPF_REG_X)) { int c = BPF_MISC | (insn.src_reg == BPF_REG_A ? BPF_TAX : BPF_TXA); filter = CBPF_STMT (c, 0); } else if (insn.dst_reg == BPF_REG_A && insn.src_reg == 0) { filter = jmp_insn (ebpfp, CHECK_RET_K, 0, ate, flag); // LD LEN is converted to LD IMM in seccomp_check_filter if (filter.code == (BPF_LD | BPF_IMM) && filter.k == sizeof (struct seccomp_data)) filter = CBPF_STMT (BPF_LD | BPF_LEN, 0); } else if (insn.dst_reg == BPF_REG_X && insn.src_reg == 0) { filter = CBPF_STMT (BPF_LDX | BPF_IMM, insn.imm); // LDX LEN is converted to LDX IMM in seccomp_check_filter if (filter.k == sizeof (struct seccomp_data)) filter = CBPF_STMT (BPF_LDX | BPF_LEN, 0); } else if (insn.dst_reg == BPF_REG_X && insn.src_reg == BPF_REG_X) filter = jmp_insn (ebpfp, CHECK_DIV_X, 0, ate, flag); else if (insn.dst_reg == BPF_REG_TMP && insn.src_reg == 0) filter = jmp_insn (ebpfp, CHECK_CMP_LARGE_K, 0, ate, flag); else ASSERT_JMP (!"Unexpected MOV instruction pattern"); return filter; } else // fall through case: most alu instructions are kept the same return CBPF_STMT (insn.code, insn.imm); } #define U32BITS (sizeof (uint32_t) * 8) // mark insns from `fromidx` to `fromidx + count` to be deleted in bitmap static inline void setbits (uint32_t fromidx, uint32_t count) { if (count == 0) return; uint32_t mapidx = fromidx / U32BITS, frombit = fromidx % U32BITS; if (mapidx != (fromidx + count) / U32BITS) { // count is always less than 32 // we need to set bits on 2 bitsets bitmap[mapidx] |= UINT32_MAX << frombit; bitmap[mapidx + 1] |= (1u << ((fromidx + count) % U32BITS)) - 1; } else // we only need to set 1 bitset, easy bitmap[mapidx] |= ((1u << count) - 1) << frombit; } // how many holes in bitmap within the range from `from` bit to `to` bit static uint32_t countbits (uint32_t from, uint32_t to) { uint32_t startidx = from / U32BITS, startbit = from % U32BITS; uint32_t endidx = to / U32BITS, endbit = to % U32BITS; uint32_t bitmask, sum; if (startidx == endidx) { bitmask = ((1u << (endbit - startbit)) - 1) << startbit; return __builtin_popcount (bitmap[startidx] & bitmask); } bitmask = (UINT32_MAX) << startbit; sum = __builtin_popcount (bitmap[startidx] & bitmask); bitmask = (1u << endbit) - 1; sum += __builtin_popcount (bitmap[endidx] & bitmask); for (uint32_t idx = startidx + 1; idx < endidx; idx++) sum += __builtin_popcount (bitmap[idx]); return sum; } long ebpf2cbpf (struct bpf_insn *restrict ebpfs, uint32_t ebpf_len, struct sock_filter *restrict cbpf_buf, bool trustful) { volatile uint32_t i = 0; if (setjmp (restore)) { int lineno = err_line_no; int no = i + 1; if (trustful) { // unexpected kernel migrated eBPF? #ifndef __FILE_NAME__ #define __FILE_NAME__ __FILE__ #endif char filename[] = "/tmp/ceccomp-XXXXXX"; int fd = mkstemp (filename); long rc = -1; warn (M_UNEXPECTED_EBPF_INSN, no, __FILE_NAME__, lineno, err_str); if (fd != -1) { rc = write (fd, ebpfs, sizeof (struct bpf_insn) * ebpf_len); if (rc != -1) info (M_SAVE_EBPF_SUCCEEDED, filename); close (fd); } if (rc == -1) warn (M_SAVE_EBPF_FAILED, strerror (errno)); } else { // detected errors in user-input eBPF #define E_G "CODE:0x00 DST_REG:0x0 SRC_REG:0x0 OFF:0x0000 IMM:0x00000000" #define FMT "CODE:0x%02x DST_REG:0x%x SRC_REG:0x%x OFF:0x%04hx IMM:0x%08x" #define E_G_LEN LITERAL_STRLEN (E_G) char buf[E_G_LEN * 2 + 2]; struct bpf_insn insn = ebpfs[i]; snprintf (buf, E_G_LEN + 1, FMT, insn.code, insn.dst_reg, insn.src_reg, insn.off, insn.imm); buf[E_G_LEN] = '\n'; buf[E_G_LEN * 2 + 1] = '\0'; memset (buf + E_G_LEN + 1, '~', E_G_LEN); warn (M_EBPF_INPUT_ERROR, no, __FILE_NAME__, lineno, err_str, buf); error ("%s", M_DISASM_TERMINATED); #undef E_G #undef FMT #undef E_G_LEN } free (bitmap); bitmap = NULL; free (flags); flags = NULL; return -1; } /* PRE-PASS: check jump destinations from untrusted source */ if (!trustful) for (i = 0; i < ebpf_len; i++) if ((BPF_CLASS (ebpfs[i].code) == BPF_JMP || BPF_CLASS (ebpfs[i].code) == BPF_JMP32) && BPF_OP (ebpfs[i].code) != BPF_EXIT) ASSERT_JMP (ebpfs[i].off >= 0 && i + 1 + ebpfs[i].off < ebpf_len); /* 1ST PASS: fold eBPF insns to cBPF insns */ // skip prologue #define SKIP 3 ASSERT_JMP (BPF_CLASS (ebpfs[0].code) == BPF_ALU && BPF_OP (ebpfs[0].code) == BPF_XOR); ASSERT_JMP (BPF_CLASS (ebpfs[1].code) == BPF_ALU && BPF_OP (ebpfs[1].code) == BPF_XOR); ASSERT_JMP (BPF_CLASS (ebpfs[2].code) == BPF_ALU64 && BPF_OP (ebpfs[2].code) == BPF_MOV); // allocate 1 more word for untrusted source bitmap = calloc (ebpf_len / U32BITS + 2, sizeof (uint32_t)); flags = calloc (ebpf_len + 10, sizeof (*flags)); assert (bitmap && flags); bitmap[0] = 7; // mark prologue to be deleted int code, k, ate; for (i = SKIP; i < ebpf_len; i++) { struct bpf_insn insn = ebpfs[i]; switch (BPF_CLASS (insn.code)) { case BPF_LDX: if (insn.src_reg == BPF_REG_CTX) { code = BPF_LD | BPF_W | BPF_ABS; k = insn.off; } else { ASSERT_JMP (insn.src_reg == BPF_REG_FP); code = BPF_MEM | (insn.dst_reg == BPF_REG_A ? BPF_LD : BPF_LDX); k = (-insn.off - 4) / 4; } cbpf_buf[i] = CBPF_STMT (code, k); continue; case BPF_STX: // note seccomp cBPF only allows BPT_ST, not BPF_ST | BPF_MEM code = insn.src_reg == BPF_REG_A ? BPF_ST : BPF_STX; cbpf_buf[i] = CBPF_STMT (code, (-insn.off - 4) / 4); continue; case BPF_ALU: case BPF_ALU64: ate = 0; cbpf_buf[i] = alu_insn (ebpfs + i, &ate, flags + i); // *i is folded and kept, so starts from i + 1 setbits (i + 1, ate); i += ate; continue; case BPF_JMP: ate = 0; cbpf_buf[i] = jmp_insn (ebpfs + i, NOT_CHECK, 0, &ate, flags + i); setbits (i + 1, ate); i += ate; continue; default: ASSERT_JMP (!"Unexpected BPF code class"); } } /* 2ND PASS: relocate jumps */ uint32_t mapidx = (ebpf_len - 1) / U32BITS; uint32_t bitmask = 1u << ((ebpf_len - 1) % U32BITS); uint32_t bitset = bitmap[mapidx]; uint32_t jmp, patch; for (i = ebpf_len - 1; i > SKIP - 1; i--) { bool deleted = bitset & bitmask; bitmask >>= 1; if (bitmask == 0) { bitset = bitmap[--mapidx]; bitmask = 1u << (U32BITS - 1); } if (deleted) continue; struct sock_filter *f = cbpf_buf + i; if (BPF_CLASS (f->code) != BPF_JMP) continue; uint32_t ebpf_idx = i + flags[i].fold; if (UNLIKELY (f->jt && f->jf)) { // test jf first (i + 1 due to selecting Jxx [JA]) patch = countbits (ebpf_idx + 1, ebpf_idx + 1 + ebpfs[ebpf_idx + 1].off + 1); // If JA can't fit: JA is cleared in 1st pass and counted, need +1 // If JA fits: JA.off is the perspective from JA, not Jxx, need +1 jmp = ebpfs[ebpf_idx + 1].off - patch + 1; if (UNLIKELY (jmp > UINT8_MAX)) { // Oops, this JA can't fit into u8, we have to split it out again // This is why we are looping reversely: cbpf can't jump back, so // modifying cbpf[i] won't impact cbpf[i + x] filters which are // already relocated f->jf = 0; bitmap[(ebpf_idx + 1) / U32BITS] &= ~(1u << ((ebpf_idx + 1) % U32BITS)); cbpf_buf[ebpf_idx + 1] = CBPF_JMP (BPF_JMP | BPF_JA, jmp, 0, 0); } else f->jf = jmp; // now jt patch = countbits (i, ebpf_idx + 1 + ebpfs[ebpf_idx].off); f->jt = ebpfs[ebpf_idx].off - patch + flags[i].fold; } else if (f->jt || f->jf) { patch = countbits (i, ebpf_idx + 1 + ebpfs[ebpf_idx].off); jmp = ebpfs[ebpf_idx].off - patch + flags[i].fold; if (f->jt) f->jt = jmp; else f->jf = jmp; } else { // JA case patch = countbits (i, i + 1 + ebpfs[ebpf_idx].off); f->k = ebpfs[ebpf_idx].off - patch; } } /* 3RD PASS: compress cBPF filters to discard holes */ mapidx = 0, bitmask = 8, bitset = bitmap[mapidx]; struct sock_filter *wp = cbpf_buf, *rp = cbpf_buf + SKIP; for (; rp < cbpf_buf + ebpf_len; rp++) { if (!(bitset & bitmask)) memcpy (wp++, rp, sizeof (*wp)); bitmask <<= 1; if (bitmask == 0) { bitset = bitmap[++mapidx]; bitmask = 1; } } free (bitmap); bitmap = NULL; free (flags); flags = NULL; return wp - cbpf_buf; } ceccomp-4.3.1/src/utils/color.c000066400000000000000000000016501526046660400163540ustar00rootroot00000000000000#include "utils/color.h" #include #include #include #include bool color_enable = true; bool log_color_enable = true; void set_color (color_mode_t color, FILE *output) { if (color == ALWAYS) { color_enable = true; log_color_enable = true; } else if (color == NEVER) { color_enable = false; log_color_enable = false; } else if (color == AUTO) { if (isatty (fileno (output))) color_enable = true; else color_enable = false; if (isatty (STDERR_FILENO)) log_color_enable = true; else log_color_enable = false; } } static bool enable_stack[0x10]; // 0x10 is definitely enough; static uint32_t enable_sp = 0; void push_color (bool enable) { enable_stack[enable_sp++] = color_enable; color_enable = enable; } void pop_color (void) { color_enable = enable_stack[--enable_sp]; } ceccomp-4.3.1/src/utils/hash.c000066400000000000000000000023261526046660400161620ustar00rootroot00000000000000#include "utils/hash.h" #include #include #include #include #include #include "attributes.h" #include "lib/a5hash-5.25.h" AttrPure static uint64_t hash_hkey (hkey_t key) { #if __SIZEOF_POINTER__ == 8 return a5hash (key.start, key.len, 0); #else return a5hash32 (key.start, key.len, 0); #endif } AttrPure static bool cmpr_hkey (hkey_t key1, hkey_t key2) { if (key1.len != key2.len) return false; return !memcmp (key1.start, key2.start, key1.len); } #define NAME str_table #define KEY_TY hkey_t #define VAL_TY uint16_t #define HASH_FN hash_hkey #define CMPR_FN cmpr_hkey #include "lib/verstable-2.2.1.h" str_table hash_table; int insert_key (const hkey_t *key, uint16_t line_nr) { size_t prev_size = vt_size (&hash_table); str_table_itr itr = vt_get_or_insert (&hash_table, *key, line_nr); if (vt_is_end (itr)) return -1; if (prev_size == vt_size (&hash_table)) return 1; return 0; } uint16_t find_key (const hkey_t *key) { str_table_itr itr = vt_get (&hash_table, *key); if (vt_is_end (itr)) return -1; return itr.data->val; } void init_table (void) { vt_init (&hash_table); } void free_table (void) { vt_cleanup (&hash_table); } ceccomp-4.3.1/src/utils/i18n.c000066400000000000000000000000411526046660400160060ustar00rootroot00000000000000#include "i18n.h" locale_t lc_c; ceccomp-4.3.1/src/utils/logger.c000066400000000000000000000030431526046660400165130ustar00rootroot00000000000000#include "utils/logger.h" #include "main.h" #include "utils/color.h" #include #include #include #include #include #define PREFIX_STR(type_str) "[" type_str "]: " #define PREFIX_INIT(type, colorstr) \ [LV_##type] = { PREFIX_STR (#type), colorstr PREFIX_STR (#type) CLR } static const struct print_prefix_t { const char *raw; const char *colorful; } print_prefixes[LV_ERROR + 1] = { PREFIX_INIT (DEBUG, CYANCLR), PREFIX_INIT (INFO, BLUECLR), PREFIX_INIT (WARN, YELLOWCLR), PREFIX_INIT (ERROR, REDCLR), }; int ceccomp_vprint (bool from_external, print_level_t lv, const char *caller_func, const char *fmt, va_list args) { assert (lv <= LV_ERROR); const struct print_prefix_t *prefix = print_prefixes + lv; fprintf (stderr, "%s", log_color_enable ? prefix->colorful : prefix->raw); #ifdef DEBUG if (LIKELY (!from_external)) fprintf (stderr, "in %s: ", caller_func); #else (void)caller_func; #endif int rc = vfprintf (stderr, fmt, args); if (LIKELY (!from_external)) putc ('\n', stderr); fflush (stderr); return rc; } void info_print (print_level_t lv, const char *caller_func, const char *fmt, ...) { va_list args; va_start (args, fmt); ceccomp_vprint (false, lv, caller_func, fmt, args); va_end (args); } void error_print (const char *caller_func, const char *fmt, ...) { va_list args; va_start (args, fmt); ceccomp_vprint (false, LV_ERROR, caller_func, fmt, args); va_end (args); exit (1); } ceccomp-4.3.1/src/utils/parse_args.c000066400000000000000000000146161526046660400173720ustar00rootroot00000000000000#include "utils/parse_args.h" #include "attributes.h" #include "utils/arch_trans.h" #include "utils/error.h" #include "utils/logger.h" #include #include #include #include #include #include #include #include static bool stop_parse = false; static uint64_t fail_fast_strtoull (const char *restrict num, const char *restrict error_msg) { char *end; errno = 0; uint64_t result = strtoull (num, &end, 0); if (*end != '\0' || errno) error ("%s", error_msg); return result; } static FILE * fail_fast_fopen (const char *restrict filename, const char *restrict mode) { if (!strcmp (filename, "-")) { if (*mode == 'r') return stdin; else return stdout; } FILE *fp = fopen (filename, mode); if (fp == NULL) error (M_UNABLE_OPEN_FILE, filename, strerror (errno)); fcntl (fileno (fp), F_SETFD, FD_CLOEXEC); return fp; } static uint32_t fail_fast_resolve_arch (const char *archname) { uint32_t arch = str_to_scmp_arch (archname, true); if (arch == (uint32_t)-1) error (M_UNSUPPORTED_ARCH, archname); return arch; } AttrPure static subcommand_t parse_subcommand (const char *arg) { if (!strcmp (arg, "asm")) return ASM_MODE; else if (!strcmp (arg, "disasm")) return DISASM_MODE; else if (!strcmp (arg, "capture")) return CAPTURE_MODE; else if (!strcmp (arg, "emu")) return EMU_MODE; else if (!strcmp (arg, "trace") || !strcmp (arg, "dump")) return TRACE_MODE; else if (!strcmp (arg, "probe")) return PROBE_MODE; else if (!strcmp (arg, "version")) return VERSION_MODE; else if (!strcmp (arg, "help")) return HELP_MODE; else return HELP_ABNORMAL; } static color_mode_t parse_color_mode (const char *arg) { if (!strcmp (arg, "always")) return ALWAYS; else if (!strcmp (arg, "auto")) return AUTO; else if (!strcmp (arg, "never")) return NEVER; else error ("%s: %s", M_INVALID_COLOR_MODE, arg); } static print_mode_t parse_print_mode (const char *arg) { if (!strcmp (arg, "hexfmt")) return HEXFMT; else if (!strcmp (arg, "hexline")) return HEXLINE; else if (!strcmp (arg, "raw")) return RAW; else if (!strcmp (arg, "c-macro")) return C_MACRO; else error ("%s: %s", M_INVALID_ASM_FMT, arg); } static int parse_asm (asm_arg_t *args, int key, const char *arg, const struct argp_state *state) { switch (key) { case ARGP_KEY_ARG: if (state->arg_num == 1) args->text_file = fail_fast_fopen (arg, "r"); return 0; case 'a': args->scmp_arch = fail_fast_resolve_arch (arg); return 0; case 'f': args->mode = parse_print_mode (arg); return 0; } return 0; } static int parse_disasm (disasm_arg_t *args, int key, const char *arg, const struct argp_state *state) { switch (key) { case ARGP_KEY_ARG: if (state->arg_num == 1) args->raw_file = fail_fast_fopen (arg, "r"); return 0; case 'a': args->scmp_arch = fail_fast_resolve_arch (arg); return 0; case 'e': args->ebpf = true; } return 0; } static int parse_capture (capture_arg_t *args, int key, const char *arg) { switch (key) { case ARGP_KEY_ARG: return 0; case 'p': args->pid = fail_fast_strtoull (arg, M_INVALID_NUMBER); return 0; } return 0; } static int parse_emu (emu_arg_t *args, int key, const char *arg, const struct argp_state *state) { switch (key) { case ARGP_KEY_ARG: if (state->arg_num == 1) args->text_file = fail_fast_fopen (arg, "r"); else if (state->arg_num == 2) args->sys_name = arg; else if (state->arg_num >= 3 && state->arg_num <= 8) args->args[state->arg_num - 3] = fail_fast_strtoull (arg, M_INVALID_NUMBER); else if (state->arg_num == 9) args->ip = fail_fast_strtoull (arg, M_INVALID_NUMBER); return 0; case 'a': args->scmp_arch = fail_fast_resolve_arch (arg); return 0; case 'q': args->quiet = true; return 0; } return 0; } static int parse_trace (trace_arg_t *args, int key, const char *arg, const struct argp_state *state) { switch (key) { case ARGP_KEY_ARG: if (state->arg_num != 1 || args->mode != UNDECIDED) return 0; args->mode = TRACE_PROG; args->prog_idx = state->next - 1; stop_parse = true; return 0; case 'p': if (args->mode != UNDECIDED) return 0; args->mode = TRACE_PID; args->pid = fail_fast_strtoull (arg, M_INVALID_NUMBER); return 0; case 'o': if (args->mode != UNDECIDED) return 0; args->output_file = fail_fast_fopen (arg, "w+"); return 0; case 'q': args->quiet = true; return 0; case 's': args->seize = true; return 0; } return 0; } static int parse_probe (probe_arg_t *args, int key, const char *arg, const struct argp_state *state) { switch (key) { case ARGP_KEY_ARG: if (state->arg_num != 1) return 0; args->prog_idx = state->next - 1; stop_parse = true; return 0; case 'o': args->output_file = fail_fast_fopen (arg, "w+"); return 0; case 'q': args->quiet = true; return 0; } return 0; } error_t parse_opt (int key, char *arg, struct argp_state *state) { ceccomp_arg_t *args = state->input; if (stop_parse) return 0; switch (key) { case ARGP_KEY_ARG: if (state->arg_num == 0) args->cmd = parse_subcommand (arg); break; case 'c': args->when = parse_color_mode (arg); return 0; case 'h': if (args->cmd == HELP_ABNORMAL) args->cmd = HELP_MODE; return 0; case 'u': if (args->cmd == HELP_ABNORMAL) args->cmd = HELP_MODE; return 0; } if (args->cmd == ASM_MODE) return parse_asm (args->asm_arg, key, arg, state); else if (args->cmd == CAPTURE_MODE) return parse_capture (args->capture_arg, key, arg); else if (args->cmd == DISASM_MODE) return parse_disasm (args->disasm_arg, key, arg, state); else if (args->cmd == EMU_MODE) return parse_emu (args->emu_arg, key, arg, state); else if (args->cmd == TRACE_MODE) return parse_trace (args->trace_arg, key, arg, state); else if (args->cmd == PROBE_MODE) return parse_probe (args->probe_arg, key, arg, state); return 0; } ceccomp-4.3.1/src/utils/proc_status.c000066400000000000000000000046741526046660400176150ustar00rootroot00000000000000#include "utils/proc_status.h" #include "config.h" #include "main.h" #include #include #include #include #include #include #include #include #define SECCOMP "Seccomp:" // the sizeof simply including appending \t or space #define SECCOMP_OFFSET (sizeof (SECCOMP)) #define KTHREAD "Kthread:" #define KTHREAD_OFFSET (sizeof (KTHREAD)) #define TRACER_PID "TracerPid:" #define TRACER_PID_OFFSET (sizeof (TRACER_PID)) static long access_proc_with_key (pid_t pid, const char *comparator, size_t strsize) { long value = PROCFS_ERROR; char buf[0x40]; char *end; snprintf (buf, sizeof (buf), "/proc/%d/status", pid); FILE *f = fopen (buf, "r"); if (f == NULL) return PROCFS_ERROR; while (fgets (buf, 0x40, f)) if (STARTWITH (buf, comparator)) { value = strtoull (buf + strsize, &end, 10); if (end == buf + strsize) value = PROCFS_ERROR; break; } fclose (f); return value; } seccomp_mode get_proc_seccomp (pid_t pid) { return access_proc_with_key (pid, SECCOMP, SECCOMP_OFFSET); } kthread_mode is_proc_kthread (pid_t pid) { return access_proc_with_key (pid, KTHREAD, KTHREAD_OFFSET); } pid_t get_tracer_pid (pid_t pid) { return access_proc_with_key (pid, TRACER_PID, TRACER_PID_OFFSET); } #define NOTIFY_S "anon_inode:seccomp notify" int may_be_listener_fd (int pid, long rax) { char path[0x40]; char buf[0x20]; int32_t size; snprintf (path, sizeof (path), "/proc/%d/fd/%ld", pid, rax); // this should return anon_inode:seccomp notify if succeed size = readlink (path, buf, sizeof (buf)); if (size < (int32_t)LITERAL_STRLEN (NOTIFY_S)) return 0; return !memcmp (buf, NOTIFY_S, LITERAL_STRLEN (NOTIFY_S)); } #if EBPF_SUPPORT == 1 int have_bpf_cap (void) { char buf[0x40]; char *end = NULL; uint64_t caps = -1; int rc = -1; FILE *f = fopen ("/proc/self/status", "r"); if (f == NULL) return -1; #define CAPEFF "CapEff:" while (fgets (buf, 0x40, f)) if (STARTWITH (buf, CAPEFF)) { caps = strtoull (buf + sizeof (CAPEFF), &end, 16); if (end == buf + sizeof (CAPEFF)) goto out; break; } if (caps == (uint64_t)-1) goto out; #define CAPABLE(val, bit) ((val) & (1ull << (bit))) rc = (CAPABLE (caps, CAP_BPF) && CAPABLE (caps, CAP_PERFMON)) || CAPABLE (caps, CAP_SYS_ADMIN); out: fclose (f); return rc; } #endif ceccomp-4.3.1/src/utils/read_source.c000066400000000000000000000112631526046660400175320ustar00rootroot00000000000000#define _GNU_SOURCE #include "utils/read_source.h" #include "utils/error.h" #include "utils/logger.h" #include #include #include #include #include #include #include #include #include #include #include #include #define GROW_LEN 0x4000 #define MAX_LINE_LEN 0x180 #define MAX_FILE_LEN 0x400000 // 4MiB typedef enum { UNKNOWN, UNIX, WINDOWS, MACOS, } file_type_t; static file_type_t file_type = UNKNOWN; static char *source = NULL; static uint32_t current = 0; static uint32_t map_len = 0; static void clear_color (char *text, uint32_t line_len) { char *cursor = memchr (text, '\x1b', line_len); if (!cursor) return; char *top = text + line_len; // excluding char *colorstart = NULL; char *clear = cursor; for (; cursor < top; cursor++) { if (!colorstart && *cursor != '\x1b') *clear++ = *cursor; else if (!colorstart && *cursor == '\x1b') colorstart = cursor; else if (colorstart && *cursor == 'm') colorstart = NULL; // else skip } memset (clear, '\0', top - clear); } static char detect_file_type (void) { char lf = '\n'; char *line_break = memchr (source, lf, current); if (!line_break) { if (memchr (source, '\r', current)) // perhaps the file is from macos? { file_type = MACOS; return '\r'; } else error ("%s", M_FOUND_SUS_NO_LF); } else { if (line_break != source && *(line_break - 1) == '\r') file_type = WINDOWS; else file_type = UNIX; } return '\n'; } static unsigned process_source (void) { register char lf = detect_file_type (); char *line_break; char *line_start = source; char *top = source + current; uint32_t line_nr = 1; while (true) { if (line_start + MAX_LINE_LEN <= top) { line_break = memchr (line_start, lf, MAX_LINE_LEN); if (!line_break) error (M_FOUND_SUS_LINE, line_nr, MAX_LINE_LEN); } else { // the rest space is less than MAX_LINE_LEN line_break = memchr (line_start, lf, top - line_start); if (!line_break) break; } if (file_type == WINDOWS) memcpy (line_break - 1, "\n", 2); else *line_break = '\n'; clear_color (line_start, line_break - line_start + 1); line_nr++; line_start = line_break + 1; } if (line_nr >= 4 * BPF_MAXINSNS) error ("%s", M_LINES_TOO_MANY); if (top == line_start) return line_nr; clear_color (line_start, top - line_start + 1); return line_nr + 1; } static void init_map (void) { source = mmap (NULL, GROW_LEN, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (source == MAP_FAILED) error ("mmap: %s", strerror (errno)); map_len = GROW_LEN; } static void increase_map (void) { if (source == NULL) { init_map (); return; } if (current + GROW_LEN <= map_len) return; source = mremap (source, map_len, map_len + GROW_LEN, MREMAP_MAYMOVE); if (source == MAP_FAILED) error ("mremap: %s", strerror (errno)); map_len += GROW_LEN; } unsigned init_source (FILE *read_fp) { uint32_t read_len = 0; int fd = fileno (read_fp); // give compiler some hint do { increase_map (); read_len = read (fd, source + current, GROW_LEN); if (read_len == (uint32_t)-1) error (M_READ_FAIL, strerror (errno)); current += read_len; if (current > MAX_FILE_LEN) error ("%s", M_FILE_TOO_LARGE); } while (read_len > 0); // reading via char device may get less than GROW_LEN const char *found0; if ((found0 = memchr (source, '\0', current))) error (M_FOUND_SUS_ZERO, (unsigned long)(found0 - source)); if (current % GROW_LEN == 0 || current % GROW_LEN > GROW_LEN - 0x20) increase_map (); // scanner expect a trailing \n, which may increase map #ifdef PR_SET_VMA prctl (PR_SET_VMA, PR_SET_VMA_ANON_NAME, source, map_len, "asm source"); #endif return process_source (); } void free_source (void) { munmap (source, map_len); } char * next_line (void) { static uint32_t cursor = 0; if (cursor >= current) return NULL; char *read_ptr = source + cursor; char *line_break = memchr (read_ptr, '\n', current - cursor); if (!line_break) { // meet eof source[current] = '\n'; cursor = current; return read_ptr; } char *top = source + current; // give compiler some hint do line_break++; while (line_break < top && (*line_break == '\0')); cursor = line_break - source; return read_ptr; } ceccomp-4.3.1/src/utils/str_pile.c000066400000000000000000000024331526046660400170570ustar00rootroot00000000000000#include "utils/str_pile.h" #include "main.h" #include #include #include #include #include #include #include static char *str_pile; static char *pile_top; static char *pile_cursor; bool init_pile (size_t init_size) { size_t aligned = (init_size + 0xfff) & ~0xfff; str_pile = mmap (NULL, aligned, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); if (str_pile == MAP_FAILED) return false; #ifdef PR_SET_VMA prctl (PR_SET_VMA, PR_SET_VMA_ANON_NAME, str_pile, aligned, "str pile"); #endif pile_cursor = str_pile; pile_top = str_pile + aligned; return true; } string_t persist_object (const char *sysname, const string_t *arch) { uint32_t syslen = strlen (sysname); uint32_t size; if (arch) size = arch->len + 1 + syslen; // arch.sysname else size = syslen; // sysname assert (pile_cursor + size <= pile_top); if (arch) { memcpy (pile_cursor, arch->start, arch->len); pile_cursor += arch->len; *pile_cursor++ = '.'; } memcpy (pile_cursor, sysname, syslen); pile_cursor += syslen; return (string_t){ .start = pile_cursor - size, .len = size }; } void free_pile (void) { assert (!munmap (str_pile, pile_top - str_pile)); } ceccomp-4.3.1/src/utils/valid_insns.c000066400000000000000000000024351526046660400175510ustar00rootroot00000000000000/* CREDIT: * https://elixir.bootlin.com/glibc/glibc-2.43/source/stdio-common/errname.c * for the method of implementing X macro strings. */ #include "utils/valid_insns.h" #include "attributes.h" #include "main.h" #include #include #include #include #define TOSTR1(x) str##x #define TOSTR(x) TOSTR1 (x) static const struct insn_name_t { // char str0[sizeof ("BPF_LD | BPF_W | BPF_ABS")]; #define X(idx, val) char TOSTR (__LINE__)[sizeof (#val)]; #include "x-macro/valid_codes.h" #undef X } insn_names = { // "BPF_LD | BPF_W | BPF_ABS", #define X(idx, val) #val, #include "x-macro/valid_codes.h" #undef X }; // [1] = offsetof (union insn_name_t, str0) // "BPF_LD | BPF_W | BPF_ABS" static const uint16_t insn_name_idxs[] = { #define X(idx, val) [idx] = offsetof (struct insn_name_t, TOSTR (__LINE__)), #include "x-macro/valid_codes.h" #undef X }; // [BPF_LD | BPF_W | BPF_ABS] = 1, const uint8_t insn_name_map[] = { #define X(idx, val) [val] = idx, #include "x-macro/valid_codes.h" #undef X }; AttrPure const char * get_insn_name (int insn_code) { return (const char *)&insn_names + insn_name_idxs[insn_name_map[insn_code]]; } static_assert (ARRAY_SIZE (insn_name_map) == MAX_VALID_INSN + 1, "Unexpected sizeof(insn_name_map) != 173"); ceccomp-4.3.1/src/utils/vector.c000066400000000000000000000023321526046660400165360ustar00rootroot00000000000000#include "utils/vector.h" #include "main.h" #include "utils/logger.h" #include #include #include #include #include void * reallocate (void *p, size_t new_size) { if (new_size == 0) { free (p); return NULL; } p = realloc (p, new_size); if (p == NULL) error ("realloc: %s", strerror (errno)); return p; } #define UPDATE_VECTOR \ v->data = reallocate (v->data, v->capacity * v->elem_size); void init_vector (vector_t *v, size_t elem_size, size_t initial_capacity) { v->count = 0; v->capacity = initial_capacity ? initial_capacity : 0x10; v->elem_size = elem_size; v->data = NULL; UPDATE_VECTOR; } void free_vector (vector_t *v) { v->count = 0; v->capacity = 0; v->elem_size = 0; UPDATE_VECTOR; } void * push_vector (vector_t *v, const void *elem) { if (UNLIKELY (v->count >= v->capacity)) { v->capacity *= 2; UPDATE_VECTOR; } void *dst = (uint8_t *)v->data + v->count * v->elem_size; memcpy (dst, elem, v->elem_size); v->count++; return dst; } void * get_vector (vector_t *v, uint32_t idx) { return (uint8_t *)v->data + idx * v->elem_size; } ceccomp-4.3.1/test/000077500000000000000000000000001526046660400141205ustar00rootroot00000000000000ceccomp-4.3.1/test/big_endian_cases/000077500000000000000000000000001526046660400173555ustar00rootroot00000000000000ceccomp-4.3.1/test/big_endian_cases/s390x.bpf000066400000000000000000000000601526046660400207300ustar00rootroot00000000000000 € –ÿceccomp-4.3.1/test/big_endian_cases/s390x.casm000066400000000000000000000001751526046660400211130ustar00rootroot00000000000000$A = $arch if ($A != s390x) goto allow $A = $syscall_nr if ($A == mlock) goto forbid allow: return ALLOW forbid: return KILL ceccomp-4.3.1/test/big_endian_cases/s390x.disasm.casm000066400000000000000000000006341526046660400223720ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000004 $A = $arch L0002: 0x15 0x00 0x02 0x80000016 if ($A != s390x) goto L0005 L0003: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0004: 0x15 0x01 0x00 0x00000096 if ($A == mlock) goto L0006 L0005: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0006: 0x06 0x00 0x00 0x00000000 return KILL #--------------------------------- ceccomp-4.3.1/test/big_endian_cases/s390x.hexfmt000066400000000000000000000003301526046660400214540ustar00rootroot00000000000000"\x00\x20\x00\x00\x00\x00\x00\x04", "\x00\x15\x00\x02\x80\x00\x00\x16", "\x00\x20\x00\x00\x00\x00\x00\x00", "\x00\x15\x01\x00\x00\x00\x00\x96", "\x00\x06\x00\x00\x7f\xff\x00\x00", "\x00\x06\x00\x00\x00\x00\x00\x00", ceccomp-4.3.1/test/big_endian_cases/s390x.mmap.casm000066400000000000000000000002001526046660400220310ustar00rootroot00000000000000$A = $arch if ($A != s390x) goto allow $A = $syscall_nr if ($A == mlock) goto forbid allow: return ALLOW #... 2 line(s) skipped ceccomp-4.3.1/test/bpf/000077500000000000000000000000001526046660400146675ustar00rootroot00000000000000ceccomp-4.3.1/test/bpf/CONFidence-2017-amigo.bpf000066400000000000000000000014201526046660400207330ustar00rootroot00000000000000 @ 8 <17`7s3`` ç;ÿ’ÿÿÅÿŒÿüÿÀÿ¯ÿ®ÿ-ÿ%#~ˆ~9à98ð  `“``  ```ÿ  ÿÿÿÿ`œÿÿÿ``  $xV4```ÿceccomp-4.3.1/test/bpf/DEF-CON-2020-bdooos.bpf000066400000000000000000000002301526046660400202320ustar00rootroot00000000000000 ·À   ? @ I ^b„†‹ÎÏÐ×€ÿceccomp-4.3.1/test/bpf/chromium.bpf000066400000000000000000000113401526046660400172020ustar00rootroot00000000000000 >À  E@ %J’%$%/% M%´%¸%Î%BÏL5šÿ·%O5™ý²5=üN%@%J%–K5Œ9L5†÷I%>56™?5�ô<%%%%)%¢*5šï.5î§&%!5-ì"5†ë %%%è5‚(5'�%5ä%5ã$%Ô%ç%÷%%y5x�5Üø%ë5Úuì5Kê%Ú%Ü%qÝ5–Õä5ÔÛ%Ö5mÒÙ5lÕ% ®%É%Ë%ÍÌ5ÌÍ5Ì Ê%»%Éȳ5Ǻ%�% %¡5^ì5Âûž%•5À—5¿” %%L%v% �%ˆ%Œ5Ž3%¶�"5´OŠ%„5²M‡5ù±ƒ%z%~%I5õ­€5ôG|%x5ªòy5Dñw%h%n%q%@s5?ìt5£ëo%k5¡ém5;èi%b%e%�f5œäg5ã›c%N5á4`5à3M% % 8%?%H5I#5Ù‘J5+Ø@%<%Ö>q5'9w%,%3%ˆ556Š{5Ì1%'5Ê(5�É$% %%%Å5†5zÂ%5À%¿¤%%%» 5 ³«5 ·%5µ5´ ,®ÿÿÿÿ (E¬€ (ÿ®& ¥ÿÿÿÿ E£€ ¤\ $žÿÿÿÿ Eœ€ EU�úÿÿÿ —ÿÿÿÿ E•€ – �ÿÿÿÿ EŽ€ × ‰ÿÿÿÿ E‡€ E@ˆÿ·÷ÿ �ÿÿÿÿ E€ E8€ zÿÿÿÿ Ex€ y sÿÿÿÿ Eq€ r lÿÿÿÿ Ej€ k eÿÿÿÿ Ec€ d ^ÿÿÿÿ E\€ ] Wÿÿÿÿ EU€ V Pÿÿÿÿ EN€ O Iÿÿÿÿ EG€ HK Aÿÿÿÿ E?€ E@þÿÿ :ÿÿÿÿ E8€ Tþÿÿ8 2ÿÿÿÿ E0€ Tþÿÿ0 *ÿÿÿÿ E(€ Tþÿÿ( "ÿÿÿÿ E € Tþÿÿ  ÿÿÿÿ E€ Tþÿÿ ÿÿÿÿ E€ Tþÿÿ   ÿÿÿÿ E€  ÿÿÿÿ E€  ûÿÿÿÿ Eù€ û ôÿÿÿÿ Eò€ ô íÿÿÿÿ Eë€ AMVS æÿÿÿÿ Eä€ åamaY ßÿÿÿÿ EÝ€ ß ×ÿÿÿÿ EÕ€ × Ðÿÿÿÿ E΀ Ð Èÿÿÿÿ EÆ€ É Áÿÿÿÿ E¿€ Á ºÿÿÿÿ E¸€ º¹ ³ÿÿÿÿ E±€ ³ ¬ÿÿÿÿ Eª€ ¬ ¥ÿÿÿÿ E£€ ¥  žÿÿÿÿ Eœ€ ž —ÿÿÿÿ E•€ — �ÿÿÿÿ EŽ€ � ‰ÿÿÿÿ E‡€ ‰ ‚ÿÿÿÿ E€€ ‚ {ÿÿÿÿ Ey€ { tÿÿÿÿ Er€   mÿÿÿÿ Ek€ n  $`l $j Ehgücãÿ `ÿÿÿÿ E^€ `  [= EX TAUA Nÿÿÿÿ EL€ O $Gÿÿÿÿ EE€ GH* @ÿÿÿÿ E>€ @A $9ÿÿÿÿ E7€ 9 $2ÿÿÿÿ E0€ 2 $+ÿÿÿÿ E)€ + $$ÿÿÿÿ E"€ $ $ÿÿÿÿ E€   T  T  b@ $ ÿÿÿÿ E€ E øÿÿÿ ,ÿÿÿÿ (E€ (EÌ—ýÿÿceccomp-4.3.1/test/bpf/gctf-2019-quals-caas.bpf000066400000000000000000000007701526046660400207300ustar00rootroot00000000000000 <>À 5:@8765 43 2!1#0*/+./-1,<+ç8 ) &'  ) $ "   $      $   , ( " 4 0 < 8ÿceccomp-4.3.1/test/bpf/ld_alu_misc.bpf000066400000000000000000000002601526046660400176310ustar00rootroot00000000000000   8 Tÿ $‡$Ò„7`ÿceccomp-4.3.1/test/bpf/libseccomp.bpf000066400000000000000000000001301526046660400174720ustar00rootroot00000000000000 >À 5@B;H<ÿceccomp-4.3.1/test/bpf/multi_arch.bpf000066400000000000000000000003001526046660400175000ustar00rootroot00000000000000 >À 5@+21@    ·À \Øÿÿ‹ØÿÿHØÿÿ(@ ‘xÿceccomp-4.3.1/test/bpf/twctf-2016-diary.bpf000066400000000000000000000002201526046660400201750ustar00rootroot00000000000000 ;89:UBÿceccomp-4.3.1/test/bpf/x32.bpf000066400000000000000000000001401526046660400157670ustar00rootroot00000000000000  @ %@@@¬@ @ ÿceccomp-4.3.1/test/conftest.py000066400000000000000000000012251526046660400163170ustar00rootroot00000000000000from types import SimpleNamespace import pytest @pytest.fixture def errns() -> SimpleNamespace: return SimpleNamespace() def fail_or_xfail(report) -> bool: return ( report.skipped and getattr(report, "wasxfail", None) is not None ) or report.failed # hook pytest report to print stderr @pytest.hookimpl(tryfirst=True, hookwrapper=True) def pytest_runtest_makereport(item, call): outcome = yield report = outcome.get_result() if report.when == 'call' and fail_or_xfail(report): ns = item.funcargs.get('errns') if hasattr(ns, 'stderr'): report.sections.append(('Process Standard Error', ns.stderr)) ceccomp-4.3.1/test/dyn_log/000077500000000000000000000000001526046660400155535ustar00rootroot00000000000000ceccomp-4.3.1/test/dyn_log/flag_stderr.log000066400000000000000000000003341526046660400205520ustar00rootroot00000000000000[INFO]: Start tracing process $PID [INFO]: Process $PID invoked seccomp (SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_LOG | SECCOMP_FILTER_FLAG_NEW_LISTENER, &prog) [INFO]: Process $PID exited ceccomp-4.3.1/test/dyn_log/probe.log000066400000000000000000000004751526046660400173730ustar00rootroot00000000000000open -> ALLOW openat -> ALLOW read -> ALLOW write -> ALLOW execve -> ERRNO(1) execveat -> ALLOW mmap -> ALLOW mprotect -> ALLOW sendfile -> KILL_PROCESS ptrace -> KILL fork -> ALLOW ceccomp-4.3.1/test/dyn_log/trace.log000066400000000000000000000015471526046660400173630ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x15 0x00 0x07 0x00000000 if ($A != 0x0) goto L0009 L0002: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0003: 0x15 0x03 0x00 0x0000003b if ($A == execve) goto L0007 L0004: 0x15 0x03 0x00 0x00000028 if ($A == sendfile) goto L0008 L0005: 0x15 0x04 0x00 0x00000065 if ($A == ptrace) goto L0010 L0006: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0007: 0x06 0x00 0x00 0x00050001 return ERRNO(1) L0008: 0x00 0x00 0x00 0x80000000 $A = 0x80000000 L0009: 0x16 0x00 0x00 0x00000000 return $A L0010: 0x3c 0x00 0x00 0x00000000 $A /= $X L0011: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- ceccomp-4.3.1/test/ebpf-blobs/000077500000000000000000000000001526046660400161335ustar00rootroot00000000000000ceccomp-4.3.1/test/ebpf-blobs/expected.casm000066400000000000000000000035101526046660400206000ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x0000003c $A = $high_args[5] L0002: 0x01 0x00 0x00 0x00000001 $X = 0x1 L0003: 0x3c 0x00 0x00 0x00000000 $A /= $X L0004: 0x05 0x00 0x00 0x0000000b goto L0016 L0005: 0x25 0x19 0x00 0x00001111 if ($A > 0x1111) goto L0031 L0006: 0x35 0x00 0x0e 0x00002222 if ($A < 0x2222) goto L0021 L0007: 0x4d 0x0d 0x00 0x00000000 if ($A & $X) goto L0021 L0008: 0x45 0x00 0x0c 0x00004444 if !($A & 0x4444) goto L0021 L0009: 0x25 0x0b 0x03 0x00001111 if ($A > 0x1111) goto L0021, else goto L0013 L0010: 0x3d 0x02 0x0a 0x00000000 if ($A >= $X) goto L0013, else goto L0021 L0011: 0x45 0x09 0x01 0x00003333 if ($A & 0x3333) goto L0021, else goto L0013 L0012: 0x45 0x00 0x08 0x00004444 if !($A & 0x4444) goto L0021 L0013: 0x05 0x00 0x00 0x00000002 goto L0016 L0014: 0x25 0x06 0x00 0x87654321 if ($A > 0x87654321) goto L0021 L0015: 0x15 0x00 0x00 0x00000000 if ($A == 0x0) goto L0016 L0016: 0x00 0x00 0x00 0x00000000 $A = 0x0 L0017: 0x04 0x00 0x00 0x00000020 $A += 0x20 L0018: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0019: 0x16 0x00 0x00 0x00000000 return $A L0020: 0x00 0x00 0x00 0x7fff0000 $A = 0x7fff0000 L0021: 0x16 0x00 0x00 0x00000000 return $A L0022: 0x80 0x00 0x00 0x00000000 $A = $scmp_data_len # 0x40 L0023: 0x81 0x00 0x00 0x00000000 $X = $scmp_data_len # 0x40 L0024: 0x03 0x00 0x00 0x00000001 $mem[0x1] = $X L0025: 0x02 0x00 0x00 0x0000000f $mem[0xf] = $A L0026: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0027: 0x61 0x00 0x00 0x0000000f $X = $mem[0xf] L0028: 0x87 0x00 0x00 0x00000000 $A = $X L0029: 0x07 0x00 0x00 0x00000000 $X = $A L0030: 0x15 0x00 0x00 0x00000000 if ($A == 0x0) goto L0031 L0031: 0x05 0x00 0x00 0x00000001 goto L0033 L0032: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0033: 0x06 0x00 0x00 0x7ffc0000 return LOG #--------------------------------- ceccomp-4.3.1/test/ebpf-blobs/hardened.bin000066400000000000000000000012201526046660400203720ustar00rootroot00000000000000¬¬w¿a`<´ Ѽ7Ÿ¤ м7Ÿ¼·¼w· ¸éC¡§ ¸éC¡]·¬• 0x1111) goto conj if ($A < 0x2222) goto label2 if ($A & $X) goto label2 if !($A & 0x4444) goto label2 if ($A > 0x1111) goto label2, else goto label3 if ($A < $X) goto label2, else goto label3 if ($A & 0x3333) goto label2, else goto label3 if !($A & 0x4444) goto label2, else goto label3 label3: goto next if ($A > 0x87654321) goto label2 if ($A == 0) goto next next: $A = 0 $A += 32 return ALLOW return $A $A = 0x7fff0000 label2: return $A $A = $scmp_data_len $X = $scmp_data_len $mem[1] = $X $mem[15] = $A $A = $mem[1] $X = $mem[15] $A = $X $X = $A if ($A == 0) goto conj conj: goto label1 $X = 0 label1: return LOG ceccomp-4.3.1/test/emu_result/000077500000000000000000000000001526046660400163045ustar00rootroot00000000000000ceccomp-4.3.1/test/emu_result/CONFidence-2017-amigo.accept.casm000066400000000000000000000011211526046660400237600ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != i386) goto L0004 L0003: goto L0014 L0004: $A = $low_args[5] L0005: $mem[0x0] = $A L0006: $A = $high_args[5] L0007: $mem[0x1] = $A L0008: if ($A != 0x3133731) goto L0012 L0009: $A = $mem[0x0] L0010: if ($A == 0x33731337) goto L0013 L0011: $A = $mem[0x1] L0012: return KILL #... 87 line(s) skipped ceccomp-4.3.1/test/emu_result/CONFidence-2017-amigo.open.casm000066400000000000000000000011211526046660400234620ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != i386) goto L0004 L0003: goto L0014 L0004: $A = $low_args[5] L0005: $mem[0x0] = $A L0006: $A = $high_args[5] L0007: $mem[0x1] = $A L0008: if ($A != 0x3133731) goto L0012 L0009: $A = $mem[0x0] L0010: if ($A == 0x33731337) goto L0013 L0011: $A = $mem[0x1] L0012: return KILL #... 87 line(s) skipped ceccomp-4.3.1/test/emu_result/CONFidence-2017-amigo.pipe.casm000066400000000000000000000011211526046660400234560ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != i386) goto L0004 L0003: goto L0014 L0004: $A = $low_args[5] L0005: $mem[0x0] = $A L0006: $A = $high_args[5] L0007: $mem[0x1] = $A L0008: if ($A != 0x3133731) goto L0012 L0009: $A = $mem[0x0] L0010: if ($A == 0x33731337) goto L0013 L0011: $A = $mem[0x1] L0012: return KILL #... 87 line(s) skipped ceccomp-4.3.1/test/emu_result/DEF-CON-2020-bdooos.accept.casm000066400000000000000000000020211526046660400232610ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != aarch64) goto L0019 L0003: $A = $syscall_nr L0004: if ($A == aarch64.ioctl) goto L0018 L0005: if ($A == aarch64.read) goto L0018 L0006: if ($A == aarch64.write) goto L0018 L0007: if ($A == aarch64.ppoll) goto L0018 L0008: if ($A == aarch64.exit_group) goto L0018 L0009: if ($A == aarch64.futex) goto L0018 L0010: if ($A == aarch64.sigaltstack) goto L0018 L0011: if ($A == aarch64.rt_sigaction) goto L0018 L0012: if ($A == aarch64.rt_sigreturn) goto L0018 L0013: if ($A == aarch64.sendto) goto L0018 L0014: if ($A == aarch64.recvfrom) goto L0018 L0015: if ($A == aarch64.setsockopt) goto L0018 L0016: if ($A == aarch64.munmap) goto L0018 L0017: return KILL_PROCESS L0018: return ALLOW L0019: return KILL #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/DEF-CON-2020-bdooos.open.casm000066400000000000000000000020211526046660400227630ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != aarch64) goto L0019 L0003: $A = $syscall_nr L0004: if ($A == aarch64.ioctl) goto L0018 L0005: if ($A == aarch64.read) goto L0018 L0006: if ($A == aarch64.write) goto L0018 L0007: if ($A == aarch64.ppoll) goto L0018 L0008: if ($A == aarch64.exit_group) goto L0018 L0009: if ($A == aarch64.futex) goto L0018 L0010: if ($A == aarch64.sigaltstack) goto L0018 L0011: if ($A == aarch64.rt_sigaction) goto L0018 L0012: if ($A == aarch64.rt_sigreturn) goto L0018 L0013: if ($A == aarch64.sendto) goto L0018 L0014: if ($A == aarch64.recvfrom) goto L0018 L0015: if ($A == aarch64.setsockopt) goto L0018 L0016: if ($A == aarch64.munmap) goto L0018 L0017: return KILL_PROCESS L0018: return ALLOW L0019: return KILL #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/DEF-CON-2020-bdooos.pipe.casm000066400000000000000000000020211526046660400227570ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != aarch64) goto L0019 L0003: $A = $syscall_nr L0004: if ($A == aarch64.ioctl) goto L0018 L0005: if ($A == aarch64.read) goto L0018 L0006: if ($A == aarch64.write) goto L0018 L0007: if ($A == aarch64.ppoll) goto L0018 L0008: if ($A == aarch64.exit_group) goto L0018 L0009: if ($A == aarch64.futex) goto L0018 L0010: if ($A == aarch64.sigaltstack) goto L0018 L0011: if ($A == aarch64.rt_sigaction) goto L0018 L0012: if ($A == aarch64.rt_sigreturn) goto L0018 L0013: if ($A == aarch64.sendto) goto L0018 L0014: if ($A == aarch64.recvfrom) goto L0018 L0015: if ($A == aarch64.setsockopt) goto L0018 L0016: if ($A == aarch64.munmap) goto L0018 L0017: return KILL_PROCESS L0018: return ALLOW L0019: return KILL #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/chromium.accept.casm000066400000000000000000000634661526046660400222510ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A == x86_64) goto L0004 L0003: return TRAP(10) L0004: $A = $syscall_nr L0005: if !($A & 0x40000000) goto L0007 L0006: return TRAP(9) L0007: if ($A <= sched_get_priority_max) goto L0082 L0008: if ($A <= pselect6) goto L0045 L0009: if ($A <= name_to_handle_at) goto L0028 L0010: if ($A <= io_pgetevents) goto L0020 L0011: if ($A <= close_range) goto L0017 L0012: if ($A <= process_madvise) goto L0016 L0013: if ($A <= mseal) goto L0015 L0014: if ($A <= setxattrat) goto L0081 L0015: goto L0604 L0016: if ($A >= faccessat2) goto L0171, else goto L0272 L0017: if ($A <= uretprobe) goto L0019 L0018: if ($A >= pidfd_open) goto L0172, else goto L0272 L0019: if ($A >= rseq) goto L0081, else goto L0272 L0020: if ($A <= kexec_file_load) goto L0025 L0021: if ($A <= pkey_alloc) goto L0024 L0022: if ($A <= pkey_free) goto L0173 L0023: if ($A >= statx) goto L0164, else goto L0081 L0024: if ($A >= pkey_mprotect) goto L0159, else goto L0272 L0025: if ($A <= getrandom) goto L0027 L0026: if ($A >= memfd_create) goto L0081, else goto L0180 L0027: if ($A >= renameat2) goto L0171, else goto L0272 L0028: if ($A <= timerfd_settime) goto L0037 L0029: if ($A <= pipe2) goto L0034 L0030: if ($A <= rt_tgsigqueueinfo) goto L0033 L0031: if ($A <= perf_event_open) goto L0194 L0032: if ($A >= prlimit64) goto L0187, else goto L0272 L0033: if ($A >= inotify_init1) goto L0272, else goto L0201 L0034: if ($A <= signalfd4) goto L0036 L0035: if ($A >= eventfd2) goto L0081, else goto L0272 L0036: if ($A >= accept4) goto L0171, else goto L0272 L0037: if ($A <= utimensat) goto L0042 L0038: if ($A <= signalfd) goto L0041 L0039: if ($A <= eventfd) goto L0272 L0040: if ($A >= fallocate) goto L0171, else goto L0081 L0041: if ($A >= epoll_pwait) goto L0081, else goto L0171 L0042: if ($A <= set_robust_list) goto L0044 L0043: if ($A >= get_robust_list) goto L0272, else goto L0081 L0044: if ($A >= unshare) goto L0272, else goto L0081 L0045: if ($A <= lookup_dcookie) goto L0063 L0046: if ($A <= exit_group) goto L0055 L0047: if ($A <= waitid) goto L0052 L0048: if ($A <= openat) goto L0051 L0049: if ($A <= newfstatat) goto L0171 L0050: if ($A >= unlinkat) goto L0171, else goto L0208 L0051: if ($A >= add_key) goto L0272, else goto L0081 L0052: if ($A <= utimes) goto L0054 L0053: if ($A >= vserver) goto L0272, else goto L0171 L0054: if ($A >= tgkill) goto L0130, else goto L0081 L0055: if ($A <= set_tid_address) goto L0060 L0056: if ($A <= semtimedop) goto L0059 L0057: if ($A <= fadvise64) goto L0171 L0058: if ($A >= clock_gettime) goto L0209, else goto L0272 L0059: if ($A >= restart_syscall) goto L0081, else goto L0272 L0060: if ($A <= epoll_ctl_old) goto L0062 L0061: if ($A >= getdents64) goto L0171, else goto L0272 L0062: if ($A >= epoll_create) goto L0081, else goto L0171 L0063: if ($A <= create_module) goto L0073 L0064: if ($A <= time) goto L0069 L0065: if ($A <= sched_setaffinity) goto L0068 L0066: if ($A <= sched_getaffinity) goto L0272 L0067: if ($A >= set_thread_area) goto L0272, else goto L0090 L0068: if ($A >= futex) goto L0273, else goto L0081 L0069: if ($A <= readahead) goto L0072 L0070: if ($A <= tkill) goto L0272 L0071: goto L0507 L0072: if ($A >= gettid) goto L0081, else goto L0272 L0073: if ($A <= prctl) goto L0078 L0074: if ($A <= setrlimit) goto L0077 L0075: if ($A <= chroot) goto L0081 L0076: if ($A >= iopl) goto L0171, else goto L0272 L0077: if ($A >= arch_prctl) goto L0272, else goto L0329 L0078: if ($A <= mlock) goto L0080 L0079: if ($A >= mlockall) goto L0272, else goto L0081 L0080: if ($A >= sched_rr_get_interval) goto L0272 L0081: goto L0603 L0082: if ($A <= truncate) goto L0120 L0083: if ($A <= getresuid) goto L0103 L0084: if ($A <= rt_sigqueueinfo) goto L0095 L0085: if ($A <= ustat) goto L0092 L0086: if ($A <= getpriority) goto L0091 L0087: if ($A >= sched_setparam) goto L0089 L0088: goto L0396 L0089: if ($A <= sched_getparam) goto L0272 L0090: goto L0381 L0091: if ($A >= fstatfs) goto L0272, else goto L0171 L0092: if ($A <= utime) goto L0094 L0093: if ($A >= personality) goto L0272, else goto L0171 L0094: if ($A >= sigaltstack) goto L0344, else goto L0272 L0095: if ($A <= setfsuid) goto L0100 L0096: if ($A <= capset) goto L0099 L0097: if ($A <= rt_sigpending) goto L0171 L0098: if ($A >= rt_sigtimedwait) goto L0344, else goto L0272 L0099: if ($A >= getsid) goto L0344, else goto L0171 L0100: if ($A <= getresgid) goto L0102 L0101: if ($A >= getpgid) goto L0272, else goto L0344 L0102: if ($A >= setresgid) goto L0171, else goto L0344 L0103: if ($A <= getgid) goto L0112 L0104: if ($A <= getppid) goto L0109 L0105: if ($A <= setreuid) goto L0108 L0106: if ($A <= getgroups) goto L0171 L0107: if ($A >= setgroups) goto L0171, else goto L0344 L0108: if ($A >= getpgrp) goto L0272, else goto L0344 L0109: if ($A <= geteuid) goto L0111 L0110: if ($A >= setpgid) goto L0272, else goto L0344 L0111: if ($A >= setuid) goto L0171, else goto L0344 L0112: if ($A <= getrusage) goto L0117 L0113: if ($A <= ptrace) goto L0116 L0114: if ($A <= getuid) goto L0272 L0115: if ($A >= syslog) goto L0272, else goto L0344 L0116: if ($A >= sysinfo) goto L0344, else goto L0272 L0117: if ($A <= getdents) goto L0119 L0118: if ($A >= gettimeofday) goto L0344, else goto L0171 L0119: if ($A >= ftruncate) goto L0344, else goto L0171 L0120: if ($A <= dup) goto L0143 L0121: if ($A <= clone) goto L0133 L0122: if ($A <= uname) goto L0128 L0123: if ($A <= fcntl) goto L0127 L0124: if ($A >= flock) goto L0126 L0125: goto L0417 L0126: if ($A >= fsync) goto L0344, else goto L0272 L0127: if ($A >= semget) goto L0171, else goto L0344 L0128: if ($A <= exit) goto L0131 L0129: if ($A <= kill) goto L0344 L0130: goto L0500 L0131: if ($A >= fork) goto L0171 L0132: goto L0508 L0133: if ($A <= sendto) goto L0140 L0134: if ($A <= getsockname) goto L0139 L0135: if ($A <= socketpair) goto L0272 L0136: if ($A >= setsockopt) goto L0138 L0137: goto L0532 L0138: goto L0518 L0139: if ($A >= bind) goto L0171, else goto L0344 L0140: if ($A <= getpid) goto L0142 L0141: if ($A >= sendfile) goto L0171, else goto L0344 L0142: if ($A >= getitimer) goto L0272, else goto L0344 L0143: if ($A <= munmap) goto L0154 L0144: if ($A <= pipe) goto L0150 L0145: if ($A <= mincore) goto L0149 L0146: if ($A <= madvise) goto L0344 L0147: if ($A >= shmget) goto L0171 L0148: goto L0539 L0149: if ($A >= msync) goto L0272, else goto L0344 L0150: if ($A <= pread64) goto L0152 L0151: if ($A >= access) goto L0171, else goto L0344 L0152: if ($A <= ioctl) goto L0344 L0153: goto L0574 L0154: if ($A <= fstat) goto L0161 L0155: if ($A <= poll) goto L0160 L0156: if ($A <= mmap) goto L0344 L0157: if ($A >= mprotect) goto L0159 L0158: goto L0594 L0159: goto L0587 L0160: if ($A >= lstat) goto L0171, else goto L0344 L0161: if ($A <= close) goto L0163 L0162: if ($A >= stat) goto L0171, else goto L0344 L0163: if ($A >= open) goto L0171, else goto L0344 L0164: $A = $high_args[3] L0165: if ($A == 0x0) goto L0169 L0166: if ($A != 0xffffffff) goto L0341 L0167: $A = $low_args[3] L0168: if !($A & 0x80000000) goto L0341 L0169: $A = $low_args[3] L0170: if ($A == 0x7ff) goto L0172 L0171: goto L0602 L0172: return ERRNO(38) L0173: $A = $high_args[0] L0174: if ($A == 0x0) goto L0178 L0175: if ($A != 0xffffffff) goto L0341 L0176: $A = $low_args[0] L0177: if !($A & 0x80000000) goto L0341 L0178: $A = $low_args[0] L0179: if ($A == 0x0) goto L0344, else goto L0272 L0180: $A = $high_args[2] L0181: if ($A == 0x0) goto L0185 L0182: if ($A != 0xffffffff) goto L0341 L0183: $A = $low_args[2] L0184: if !($A & 0x80000000) goto L0341 L0185: $A = $low_args[2] L0186: if ($A & 0xfffffffa) goto L0272, else goto L0344 L0187: $A = $high_args[0] L0188: if ($A == 0x0) goto L0192 L0189: if ($A != 0xffffffff) goto L0341 L0190: $A = $low_args[0] L0191: if !($A & 0x80000000) goto L0341 L0192: $A = $low_args[0] L0193: if ($A == 0x0) goto L0344 L0194: $A = $high_args[0] L0195: if ($A == 0x0) goto L0199 L0196: if ($A != 0xffffffff) goto L0341 L0197: $A = $low_args[0] L0198: if !($A & 0x80000000) goto L0341 L0199: $A = $low_args[0] L0200: goto L0416 L0201: $A = $high_args[1] L0202: if ($A == 0x0) goto L0206 L0203: if ($A != 0xffffffff) goto L0341 L0204: $A = $low_args[1] L0205: if !($A & 0x80000000) goto L0341 L0206: $A = $low_args[1] L0207: if ($A & 0xfff7b7ff) goto L0272, else goto L0344 L0208: return TRAP(8) L0209: $A = $high_args[0] L0210: if ($A == 0x0) goto L0214 L0211: if ($A != 0xffffffff) goto L0341 L0212: $A = $low_args[0] L0213: if !($A & 0x80000000) goto L0341 L0214: $A = $low_args[0] L0215: if ($A & 0x80000000) goto L0272 L0216: $A = $high_args[0] L0217: if ($A == 0x0) goto L0221 L0218: if ($A != 0xffffffff) goto L0341 L0219: $A = $low_args[0] L0220: if !($A & 0x80000000) goto L0341 L0221: $A = $low_args[0] L0222: if ($A == 0x7) goto L0344 L0223: $A = $high_args[0] L0224: if ($A == 0x0) goto L0228 L0225: if ($A != 0xffffffff) goto L0341 L0226: $A = $low_args[0] L0227: if !($A & 0x80000000) goto L0341 L0228: $A = $low_args[0] L0229: if ($A == 0x1) goto L0344 L0230: $A = $high_args[0] L0231: if ($A == 0x0) goto L0235 L0232: if ($A != 0xffffffff) goto L0341 L0233: $A = $low_args[0] L0234: if !($A & 0x80000000) goto L0341 L0235: $A = $low_args[0] L0236: if ($A == 0x6) goto L0344 L0237: $A = $high_args[0] L0238: if ($A == 0x0) goto L0242 L0239: if ($A != 0xffffffff) goto L0341 L0240: $A = $low_args[0] L0241: if !($A & 0x80000000) goto L0341 L0242: $A = $low_args[0] L0243: if ($A == 0x4) goto L0344 L0244: $A = $high_args[0] L0245: if ($A == 0x0) goto L0249 L0246: if ($A != 0xffffffff) goto L0341 L0247: $A = $low_args[0] L0248: if !($A & 0x80000000) goto L0341 L0249: $A = $low_args[0] L0250: if ($A == 0x2) goto L0344 L0251: $A = $high_args[0] L0252: if ($A == 0x0) goto L0256 L0253: if ($A != 0xffffffff) goto L0341 L0254: $A = $low_args[0] L0255: if !($A & 0x80000000) goto L0341 L0256: $A = $low_args[0] L0257: if ($A == 0x0) goto L0344 L0258: $A = $high_args[0] L0259: if ($A == 0x0) goto L0263 L0260: if ($A != 0xffffffff) goto L0341 L0261: $A = $low_args[0] L0262: if !($A & 0x80000000) goto L0341 L0263: $A = $low_args[0] L0264: if ($A == 0x5) goto L0344 L0265: $A = $high_args[0] L0266: if ($A == 0x0) goto L0270 L0267: if ($A != 0xffffffff) goto L0341 L0268: $A = $low_args[0] L0269: if !($A & 0x80000000) goto L0341 L0270: $A = $low_args[0] L0271: if ($A == 0x3) goto L0344 L0272: goto L0604 L0273: $A = $high_args[1] L0274: if ($A == 0x0) goto L0278 L0275: if ($A != 0xffffffff) goto L0341 L0276: $A = $low_args[1] L0277: if !($A & 0x80000000) goto L0341 L0278: $A = $low_args[1] L0279: if !($A & 0xfffffe7f) goto L0344 L0280: $A = $high_args[1] L0281: if ($A == 0x0) goto L0285 L0282: if ($A != 0xffffffff) goto L0341 L0283: $A = $low_args[1] L0284: if !($A & 0x80000000) goto L0341 L0285: $A = $low_args[1] L0286: $A &= 0xfffffe7f L0287: if ($A == 0x1) goto L0344 L0288: $A = $high_args[1] L0289: if ($A == 0x0) goto L0293 L0290: if ($A != 0xffffffff) goto L0341 L0291: $A = $low_args[1] L0292: if !($A & 0x80000000) goto L0341 L0293: $A = $low_args[1] L0294: $A &= 0xfffffe7f L0295: if ($A == 0x3) goto L0344 L0296: $A = $high_args[1] L0297: if ($A == 0x0) goto L0301 L0298: if ($A != 0xffffffff) goto L0341 L0299: $A = $low_args[1] L0300: if !($A & 0x80000000) goto L0341 L0301: $A = $low_args[1] L0302: $A &= 0xfffffe7f L0303: if ($A == 0x4) goto L0344 L0304: $A = $high_args[1] L0305: if ($A == 0x0) goto L0309 L0306: if ($A != 0xffffffff) goto L0341 L0307: $A = $low_args[1] L0308: if !($A & 0x80000000) goto L0341 L0309: $A = $low_args[1] L0310: $A &= 0xfffffe7f L0311: if ($A == 0x5) goto L0344 L0312: $A = $high_args[1] L0313: if ($A == 0x0) goto L0317 L0314: if ($A != 0xffffffff) goto L0341 L0315: $A = $low_args[1] L0316: if !($A & 0x80000000) goto L0341 L0317: $A = $low_args[1] L0318: $A &= 0xfffffe7f L0319: if ($A == 0x9) goto L0344 L0320: $A = $high_args[1] L0321: if ($A == 0x0) goto L0325 L0322: if ($A != 0xffffffff) goto L0341 L0323: $A = $low_args[1] L0324: if !($A & 0x80000000) goto L0341 L0325: $A = $low_args[1] L0326: $A &= 0xfffffe7f L0327: if ($A == 0xa) goto L0344 L0328: return ERRNO(22) L0329: $A = $high_args[0] L0330: if ($A == 0x0) goto L0334 L0331: if ($A != 0xffffffff) goto L0341 L0332: $A = $low_args[0] L0333: if !($A & 0x80000000) goto L0341 L0334: $A = $low_args[0] L0335: if ($A == 0x10) goto L0344 L0336: $A = $high_args[0] L0337: if ($A == 0x0) goto L0342 L0338: if ($A != 0xffffffff) goto L0341 L0339: $A = $low_args[0] L0340: if ($A & 0x80000000) goto L0342 L0341: goto L0599 L0342: $A = $low_args[0] L0343: if ($A != 0xf) goto L0345 L0344: goto L0603 L0345: $A = $high_args[0] L0346: if ($A == 0x0) goto L0350 L0347: if ($A != 0xffffffff) goto L0599 L0348: $A = $low_args[0] L0349: if !($A & 0x80000000) goto L0599 L0350: $A = $low_args[0] L0351: if ($A == 0x3) goto L0603 L0352: $A = $high_args[0] L0353: if ($A == 0x0) goto L0357 L0354: if ($A != 0xffffffff) goto L0599 L0355: $A = $low_args[0] L0356: if !($A & 0x80000000) goto L0599 L0357: $A = $low_args[0] L0358: if ($A == 0x4) goto L0603 L0359: $A = $high_args[0] L0360: if ($A == 0x0) goto L0364 L0361: if ($A != 0xffffffff) goto L0599 L0362: $A = $low_args[0] L0363: if !($A & 0x80000000) goto L0599 L0364: $A = $low_args[0] L0365: if ($A == 0x53564d41) goto L0373 L0366: $A = $high_args[0] L0367: if ($A == 0x0) goto L0371 L0368: if ($A != 0xffffffff) goto L0599 L0369: $A = $low_args[0] L0370: if !($A & 0x80000000) goto L0599 L0371: $A = $low_args[0] L0372: if ($A == 0x59616d61) goto L0602, else goto L0380 L0373: $A = $high_args[1] L0374: if ($A == 0x0) goto L0378 L0375: if ($A != 0xffffffff) goto L0599 L0376: $A = $low_args[1] L0377: if !($A & 0x80000000) goto L0599 L0378: $A = $low_args[1] L0379: if ($A == 0x0) goto L0603 L0380: return TRAP(7) L0381: $A = $high_args[0] L0382: if ($A == 0x0) goto L0386 L0383: if ($A != 0xffffffff) goto L0599 L0384: $A = $low_args[0] L0385: if !($A & 0x80000000) goto L0599 L0386: $A = $low_args[0] L0387: if ($A == 0x0) goto L0603 L0388: $A = $high_args[0] L0389: if ($A == 0x0) goto L0393 L0390: if ($A != 0xffffffff) goto L0599 L0391: $A = $low_args[0] L0392: if !($A & 0x80000000) goto L0599 L0393: $A = $low_args[0] L0394: if ($A == 0x1) goto L0603 L0395: return TRAP(6) L0396: $A = $high_args[0] L0397: if ($A == 0x0) goto L0401 L0398: if ($A != 0xffffffff) goto L0599 L0399: $A = $low_args[0] L0400: if !($A & 0x80000000) goto L0599 L0401: $A = $low_args[0] L0402: if ($A != 0x0) goto L0604 L0403: $A = $high_args[1] L0404: if ($A == 0x0) goto L0408 L0405: if ($A != 0xffffffff) goto L0599 L0406: $A = $low_args[1] L0407: if !($A & 0x80000000) goto L0599 L0408: $A = $low_args[1] L0409: if ($A == 0x0) goto L0603 L0410: $A = $high_args[1] L0411: if ($A == 0x0) goto L0415 L0412: if ($A != 0xffffffff) goto L0599 L0413: $A = $low_args[1] L0414: if !($A & 0x80000000) goto L0599 L0415: $A = $low_args[1] L0416: if ($A == 0x1) goto L0603, else goto L0602 L0417: $A = $high_args[1] L0418: if ($A == 0x0) goto L0422 L0419: if ($A != 0xffffffff) goto L0599 L0420: $A = $low_args[1] L0421: if !($A & 0x80000000) goto L0599 L0422: $A = $low_args[1] L0423: if ($A == 0x3) goto L0603 L0424: $A = $high_args[1] L0425: if ($A == 0x0) goto L0429 L0426: if ($A != 0xffffffff) goto L0599 L0427: $A = $low_args[1] L0428: if !($A & 0x80000000) goto L0599 L0429: $A = $low_args[1] L0430: if ($A == 0x1) goto L0603 L0431: $A = $high_args[1] L0432: if ($A == 0x0) goto L0436 L0433: if ($A != 0xffffffff) goto L0599 L0434: $A = $low_args[1] L0435: if !($A & 0x80000000) goto L0599 L0436: $A = $low_args[1] L0437: if ($A == 0x40a) goto L0603 L0438: $A = $high_args[1] L0439: if ($A == 0x0) goto L0443 L0440: if ($A != 0xffffffff) goto L0599 L0441: $A = $low_args[1] L0442: if !($A & 0x80000000) goto L0599 L0443: $A = $low_args[1] L0444: if ($A == 0x2) goto L0603 L0445: $A = $high_args[1] L0446: if ($A == 0x0) goto L0450 L0447: if ($A != 0xffffffff) goto L0599 L0448: $A = $low_args[1] L0449: if !($A & 0x80000000) goto L0599 L0450: $A = $low_args[1] L0451: if ($A == 0x6) goto L0603 L0452: $A = $high_args[1] L0453: if ($A == 0x0) goto L0457 L0454: if ($A != 0xffffffff) goto L0599 L0455: $A = $low_args[1] L0456: if !($A & 0x80000000) goto L0599 L0457: $A = $low_args[1] L0458: if ($A == 0x7) goto L0603 L0459: $A = $high_args[1] L0460: if ($A == 0x0) goto L0464 L0461: if ($A != 0xffffffff) goto L0599 L0462: $A = $low_args[1] L0463: if !($A & 0x80000000) goto L0599 L0464: $A = $low_args[1] L0465: if ($A == 0x5) goto L0603 L0466: $A = $high_args[1] L0467: if ($A == 0x0) goto L0471 L0468: if ($A != 0xffffffff) goto L0599 L0469: $A = $low_args[1] L0470: if !($A & 0x80000000) goto L0599 L0471: $A = $low_args[1] L0472: if ($A == 0x0) goto L0603 L0473: $A = $high_args[1] L0474: if ($A == 0x0) goto L0478 L0475: if ($A != 0xffffffff) goto L0599 L0476: $A = $low_args[1] L0477: if !($A & 0x80000000) goto L0599 L0478: $A = $low_args[1] L0479: if ($A == 0x406) goto L0603 L0480: $A = $high_args[1] L0481: if ($A == 0x0) goto L0485 L0482: if ($A != 0xffffffff) goto L0599 L0483: $A = $low_args[1] L0484: if !($A & 0x80000000) goto L0599 L0485: $A = $low_args[1] L0486: if ($A == 0x4) goto L0496 L0487: $A = $high_args[1] L0488: if ($A == 0x0) goto L0492 L0489: if ($A != 0xffffffff) goto L0599 L0490: $A = $low_args[1] L0491: if !($A & 0x80000000) goto L0599 L0492: $A = $low_args[1] L0493: if ($A != 0x409) goto L0604 L0494: $A = $high_args[2] L0495: if ($A == 0x0) goto L0592, else goto L0604 L0496: $A = $high_args[2] L0497: if ($A != 0x0) goto L0604 L0498: $A = $low_args[2] L0499: if ($A & 0xffe363fc) goto L0604, else goto L0603 L0500: $A = $high_args[0] L0501: if ($A == 0x0) goto L0505 L0502: if ($A != 0xffffffff) goto L0599 L0503: $A = $low_args[0] L0504: if !($A & 0x80000000) goto L0599 L0505: $A = $low_args[0] L0506: if ($A == 0x1) goto L0603 L0507: return TRAP(5) L0508: $A = $high_args[0] L0509: if ($A != 0x0) goto L0512 L0510: $A = $low_args[0] L0511: if ($A == 0x3d0f00) goto L0603 L0512: $A = $low_args[0] L0513: if !($A & 0x10100) goto L0602 L0514: $A = $low_args[0] L0515: $A &= 0x4100 L0516: if ($A == 0x4100) goto L0602 L0517: return TRAP(4) L0518: $A = $high_args[1] L0519: if ($A == 0x0) goto L0523 L0520: if ($A != 0xffffffff) goto L0599 L0521: $A = $low_args[1] L0522: if !($A & 0x80000000) goto L0599 L0523: $A = $low_args[1] L0524: if ($A != 0x1) goto L0604 L0525: $A = $high_args[2] L0526: if ($A == 0x0) goto L0530 L0527: if ($A != 0xffffffff) goto L0599 L0528: $A = $low_args[2] L0529: if !($A & 0x80000000) goto L0599 L0530: $A = $low_args[2] L0531: if ($A == 0x2a) goto L0603, else goto L0604 L0532: $A = $high_args[0] L0533: if ($A == 0x0) goto L0537 L0534: if ($A != 0xffffffff) goto L0599 L0535: $A = $low_args[0] L0536: if !($A & 0x80000000) goto L0599 L0537: $A = $low_args[0] L0538: if ($A == 0x1) goto L0603, else goto L0604 L0539: $A = $high_args[2] L0540: if ($A == 0x0) goto L0544 L0541: if ($A != 0xffffffff) goto L0599 L0542: $A = $low_args[2] L0543: if !($A & 0x80000000) goto L0599 L0544: $A = $low_args[2] L0545: if ($A == 0x4) goto L0603 L0546: $A = $high_args[2] L0547: if ($A == 0x0) goto L0551 L0548: if ($A != 0xffffffff) goto L0599 L0549: $A = $low_args[2] L0550: if !($A & 0x80000000) goto L0599 L0551: $A = $low_args[2] L0552: if ($A == 0x1) goto L0603 L0553: $A = $high_args[2] L0554: if ($A == 0x0) goto L0558 L0555: if ($A != 0xffffffff) goto L0599 L0556: $A = $low_args[2] L0557: if !($A & 0x80000000) goto L0599 L0558: $A = $low_args[2] L0559: if ($A == 0x9) goto L0603 L0560: $A = $high_args[2] L0561: if ($A == 0x0) goto L0565 L0562: if ($A != 0xffffffff) goto L0599 L0563: $A = $low_args[2] L0564: if !($A & 0x80000000) goto L0599 L0565: $A = $low_args[2] L0566: if ($A == 0x0) goto L0603 L0567: $A = $high_args[2] L0568: if ($A == 0x0) goto L0572 L0569: if ($A != 0xffffffff) goto L0599 L0570: $A = $low_args[2] L0571: if !($A & 0x80000000) goto L0599 L0572: $A = $low_args[2] L0573: if ($A == 0x8) goto L0603, else goto L0602 L0574: $A = $high_args[1] L0575: if ($A != 0x0) goto L0578 L0576: $A = $low_args[1] L0577: if ($A == 0x5401) goto L0603 L0578: $A = $high_args[1] L0579: if ($A != 0x0) goto L0582 L0580: $A = $low_args[1] L0581: if ($A == 0x541b) goto L0603 L0582: $A = $high_args[1] L0583: if ($A != 0x0) goto L0586 L0584: $A = $low_args[1] L0585: if ($A == 0x40086200) goto L0603 L0586: return TRAP(3) L0587: $A = $high_args[2] L0588: if ($A == 0x0) goto L0592 L0589: if ($A != 0xffffffff) goto L0599 L0590: $A = $low_args[2] L0591: if !($A & 0x80000000) goto L0599 L0592: $A = $low_args[2] L0593: if ($A & 0xfffffff8) goto L0604, else goto L0603 L0594: $A = $high_args[3] L0595: if ($A == 0x0) goto L0600 L0596: if ($A != 0xffffffff) goto L0599 L0597: $A = $low_args[3] L0598: if ($A & 0x80000000) goto L0600 L0599: return TRAP(2) L0600: $A = $low_args[3] L0601: if ($A & 0xfffd97cc) goto L0604, else goto L0603 L0602: return ERRNO(1) #... 3 line(s) skipped ceccomp-4.3.1/test/emu_result/chromium.open.casm000066400000000000000000000634661526046660400217530ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A == x86_64) goto L0004 L0003: return TRAP(10) L0004: $A = $syscall_nr L0005: if !($A & 0x40000000) goto L0007 L0006: return TRAP(9) L0007: if ($A <= sched_get_priority_max) goto L0082 L0008: if ($A <= pselect6) goto L0045 L0009: if ($A <= name_to_handle_at) goto L0028 L0010: if ($A <= io_pgetevents) goto L0020 L0011: if ($A <= close_range) goto L0017 L0012: if ($A <= process_madvise) goto L0016 L0013: if ($A <= mseal) goto L0015 L0014: if ($A <= setxattrat) goto L0081 L0015: goto L0604 L0016: if ($A >= faccessat2) goto L0171, else goto L0272 L0017: if ($A <= uretprobe) goto L0019 L0018: if ($A >= pidfd_open) goto L0172, else goto L0272 L0019: if ($A >= rseq) goto L0081, else goto L0272 L0020: if ($A <= kexec_file_load) goto L0025 L0021: if ($A <= pkey_alloc) goto L0024 L0022: if ($A <= pkey_free) goto L0173 L0023: if ($A >= statx) goto L0164, else goto L0081 L0024: if ($A >= pkey_mprotect) goto L0159, else goto L0272 L0025: if ($A <= getrandom) goto L0027 L0026: if ($A >= memfd_create) goto L0081, else goto L0180 L0027: if ($A >= renameat2) goto L0171, else goto L0272 L0028: if ($A <= timerfd_settime) goto L0037 L0029: if ($A <= pipe2) goto L0034 L0030: if ($A <= rt_tgsigqueueinfo) goto L0033 L0031: if ($A <= perf_event_open) goto L0194 L0032: if ($A >= prlimit64) goto L0187, else goto L0272 L0033: if ($A >= inotify_init1) goto L0272, else goto L0201 L0034: if ($A <= signalfd4) goto L0036 L0035: if ($A >= eventfd2) goto L0081, else goto L0272 L0036: if ($A >= accept4) goto L0171, else goto L0272 L0037: if ($A <= utimensat) goto L0042 L0038: if ($A <= signalfd) goto L0041 L0039: if ($A <= eventfd) goto L0272 L0040: if ($A >= fallocate) goto L0171, else goto L0081 L0041: if ($A >= epoll_pwait) goto L0081, else goto L0171 L0042: if ($A <= set_robust_list) goto L0044 L0043: if ($A >= get_robust_list) goto L0272, else goto L0081 L0044: if ($A >= unshare) goto L0272, else goto L0081 L0045: if ($A <= lookup_dcookie) goto L0063 L0046: if ($A <= exit_group) goto L0055 L0047: if ($A <= waitid) goto L0052 L0048: if ($A <= openat) goto L0051 L0049: if ($A <= newfstatat) goto L0171 L0050: if ($A >= unlinkat) goto L0171, else goto L0208 L0051: if ($A >= add_key) goto L0272, else goto L0081 L0052: if ($A <= utimes) goto L0054 L0053: if ($A >= vserver) goto L0272, else goto L0171 L0054: if ($A >= tgkill) goto L0130, else goto L0081 L0055: if ($A <= set_tid_address) goto L0060 L0056: if ($A <= semtimedop) goto L0059 L0057: if ($A <= fadvise64) goto L0171 L0058: if ($A >= clock_gettime) goto L0209, else goto L0272 L0059: if ($A >= restart_syscall) goto L0081, else goto L0272 L0060: if ($A <= epoll_ctl_old) goto L0062 L0061: if ($A >= getdents64) goto L0171, else goto L0272 L0062: if ($A >= epoll_create) goto L0081, else goto L0171 L0063: if ($A <= create_module) goto L0073 L0064: if ($A <= time) goto L0069 L0065: if ($A <= sched_setaffinity) goto L0068 L0066: if ($A <= sched_getaffinity) goto L0272 L0067: if ($A >= set_thread_area) goto L0272, else goto L0090 L0068: if ($A >= futex) goto L0273, else goto L0081 L0069: if ($A <= readahead) goto L0072 L0070: if ($A <= tkill) goto L0272 L0071: goto L0507 L0072: if ($A >= gettid) goto L0081, else goto L0272 L0073: if ($A <= prctl) goto L0078 L0074: if ($A <= setrlimit) goto L0077 L0075: if ($A <= chroot) goto L0081 L0076: if ($A >= iopl) goto L0171, else goto L0272 L0077: if ($A >= arch_prctl) goto L0272, else goto L0329 L0078: if ($A <= mlock) goto L0080 L0079: if ($A >= mlockall) goto L0272, else goto L0081 L0080: if ($A >= sched_rr_get_interval) goto L0272 L0081: goto L0603 L0082: if ($A <= truncate) goto L0120 L0083: if ($A <= getresuid) goto L0103 L0084: if ($A <= rt_sigqueueinfo) goto L0095 L0085: if ($A <= ustat) goto L0092 L0086: if ($A <= getpriority) goto L0091 L0087: if ($A >= sched_setparam) goto L0089 L0088: goto L0396 L0089: if ($A <= sched_getparam) goto L0272 L0090: goto L0381 L0091: if ($A >= fstatfs) goto L0272, else goto L0171 L0092: if ($A <= utime) goto L0094 L0093: if ($A >= personality) goto L0272, else goto L0171 L0094: if ($A >= sigaltstack) goto L0344, else goto L0272 L0095: if ($A <= setfsuid) goto L0100 L0096: if ($A <= capset) goto L0099 L0097: if ($A <= rt_sigpending) goto L0171 L0098: if ($A >= rt_sigtimedwait) goto L0344, else goto L0272 L0099: if ($A >= getsid) goto L0344, else goto L0171 L0100: if ($A <= getresgid) goto L0102 L0101: if ($A >= getpgid) goto L0272, else goto L0344 L0102: if ($A >= setresgid) goto L0171, else goto L0344 L0103: if ($A <= getgid) goto L0112 L0104: if ($A <= getppid) goto L0109 L0105: if ($A <= setreuid) goto L0108 L0106: if ($A <= getgroups) goto L0171 L0107: if ($A >= setgroups) goto L0171, else goto L0344 L0108: if ($A >= getpgrp) goto L0272, else goto L0344 L0109: if ($A <= geteuid) goto L0111 L0110: if ($A >= setpgid) goto L0272, else goto L0344 L0111: if ($A >= setuid) goto L0171, else goto L0344 L0112: if ($A <= getrusage) goto L0117 L0113: if ($A <= ptrace) goto L0116 L0114: if ($A <= getuid) goto L0272 L0115: if ($A >= syslog) goto L0272, else goto L0344 L0116: if ($A >= sysinfo) goto L0344, else goto L0272 L0117: if ($A <= getdents) goto L0119 L0118: if ($A >= gettimeofday) goto L0344, else goto L0171 L0119: if ($A >= ftruncate) goto L0344, else goto L0171 L0120: if ($A <= dup) goto L0143 L0121: if ($A <= clone) goto L0133 L0122: if ($A <= uname) goto L0128 L0123: if ($A <= fcntl) goto L0127 L0124: if ($A >= flock) goto L0126 L0125: goto L0417 L0126: if ($A >= fsync) goto L0344, else goto L0272 L0127: if ($A >= semget) goto L0171, else goto L0344 L0128: if ($A <= exit) goto L0131 L0129: if ($A <= kill) goto L0344 L0130: goto L0500 L0131: if ($A >= fork) goto L0171 L0132: goto L0508 L0133: if ($A <= sendto) goto L0140 L0134: if ($A <= getsockname) goto L0139 L0135: if ($A <= socketpair) goto L0272 L0136: if ($A >= setsockopt) goto L0138 L0137: goto L0532 L0138: goto L0518 L0139: if ($A >= bind) goto L0171, else goto L0344 L0140: if ($A <= getpid) goto L0142 L0141: if ($A >= sendfile) goto L0171, else goto L0344 L0142: if ($A >= getitimer) goto L0272, else goto L0344 L0143: if ($A <= munmap) goto L0154 L0144: if ($A <= pipe) goto L0150 L0145: if ($A <= mincore) goto L0149 L0146: if ($A <= madvise) goto L0344 L0147: if ($A >= shmget) goto L0171 L0148: goto L0539 L0149: if ($A >= msync) goto L0272, else goto L0344 L0150: if ($A <= pread64) goto L0152 L0151: if ($A >= access) goto L0171, else goto L0344 L0152: if ($A <= ioctl) goto L0344 L0153: goto L0574 L0154: if ($A <= fstat) goto L0161 L0155: if ($A <= poll) goto L0160 L0156: if ($A <= mmap) goto L0344 L0157: if ($A >= mprotect) goto L0159 L0158: goto L0594 L0159: goto L0587 L0160: if ($A >= lstat) goto L0171, else goto L0344 L0161: if ($A <= close) goto L0163 L0162: if ($A >= stat) goto L0171, else goto L0344 L0163: if ($A >= open) goto L0171, else goto L0344 L0164: $A = $high_args[3] L0165: if ($A == 0x0) goto L0169 L0166: if ($A != 0xffffffff) goto L0341 L0167: $A = $low_args[3] L0168: if !($A & 0x80000000) goto L0341 L0169: $A = $low_args[3] L0170: if ($A == 0x7ff) goto L0172 L0171: goto L0602 L0172: return ERRNO(38) L0173: $A = $high_args[0] L0174: if ($A == 0x0) goto L0178 L0175: if ($A != 0xffffffff) goto L0341 L0176: $A = $low_args[0] L0177: if !($A & 0x80000000) goto L0341 L0178: $A = $low_args[0] L0179: if ($A == 0x0) goto L0344, else goto L0272 L0180: $A = $high_args[2] L0181: if ($A == 0x0) goto L0185 L0182: if ($A != 0xffffffff) goto L0341 L0183: $A = $low_args[2] L0184: if !($A & 0x80000000) goto L0341 L0185: $A = $low_args[2] L0186: if ($A & 0xfffffffa) goto L0272, else goto L0344 L0187: $A = $high_args[0] L0188: if ($A == 0x0) goto L0192 L0189: if ($A != 0xffffffff) goto L0341 L0190: $A = $low_args[0] L0191: if !($A & 0x80000000) goto L0341 L0192: $A = $low_args[0] L0193: if ($A == 0x0) goto L0344 L0194: $A = $high_args[0] L0195: if ($A == 0x0) goto L0199 L0196: if ($A != 0xffffffff) goto L0341 L0197: $A = $low_args[0] L0198: if !($A & 0x80000000) goto L0341 L0199: $A = $low_args[0] L0200: goto L0416 L0201: $A = $high_args[1] L0202: if ($A == 0x0) goto L0206 L0203: if ($A != 0xffffffff) goto L0341 L0204: $A = $low_args[1] L0205: if !($A & 0x80000000) goto L0341 L0206: $A = $low_args[1] L0207: if ($A & 0xfff7b7ff) goto L0272, else goto L0344 L0208: return TRAP(8) L0209: $A = $high_args[0] L0210: if ($A == 0x0) goto L0214 L0211: if ($A != 0xffffffff) goto L0341 L0212: $A = $low_args[0] L0213: if !($A & 0x80000000) goto L0341 L0214: $A = $low_args[0] L0215: if ($A & 0x80000000) goto L0272 L0216: $A = $high_args[0] L0217: if ($A == 0x0) goto L0221 L0218: if ($A != 0xffffffff) goto L0341 L0219: $A = $low_args[0] L0220: if !($A & 0x80000000) goto L0341 L0221: $A = $low_args[0] L0222: if ($A == 0x7) goto L0344 L0223: $A = $high_args[0] L0224: if ($A == 0x0) goto L0228 L0225: if ($A != 0xffffffff) goto L0341 L0226: $A = $low_args[0] L0227: if !($A & 0x80000000) goto L0341 L0228: $A = $low_args[0] L0229: if ($A == 0x1) goto L0344 L0230: $A = $high_args[0] L0231: if ($A == 0x0) goto L0235 L0232: if ($A != 0xffffffff) goto L0341 L0233: $A = $low_args[0] L0234: if !($A & 0x80000000) goto L0341 L0235: $A = $low_args[0] L0236: if ($A == 0x6) goto L0344 L0237: $A = $high_args[0] L0238: if ($A == 0x0) goto L0242 L0239: if ($A != 0xffffffff) goto L0341 L0240: $A = $low_args[0] L0241: if !($A & 0x80000000) goto L0341 L0242: $A = $low_args[0] L0243: if ($A == 0x4) goto L0344 L0244: $A = $high_args[0] L0245: if ($A == 0x0) goto L0249 L0246: if ($A != 0xffffffff) goto L0341 L0247: $A = $low_args[0] L0248: if !($A & 0x80000000) goto L0341 L0249: $A = $low_args[0] L0250: if ($A == 0x2) goto L0344 L0251: $A = $high_args[0] L0252: if ($A == 0x0) goto L0256 L0253: if ($A != 0xffffffff) goto L0341 L0254: $A = $low_args[0] L0255: if !($A & 0x80000000) goto L0341 L0256: $A = $low_args[0] L0257: if ($A == 0x0) goto L0344 L0258: $A = $high_args[0] L0259: if ($A == 0x0) goto L0263 L0260: if ($A != 0xffffffff) goto L0341 L0261: $A = $low_args[0] L0262: if !($A & 0x80000000) goto L0341 L0263: $A = $low_args[0] L0264: if ($A == 0x5) goto L0344 L0265: $A = $high_args[0] L0266: if ($A == 0x0) goto L0270 L0267: if ($A != 0xffffffff) goto L0341 L0268: $A = $low_args[0] L0269: if !($A & 0x80000000) goto L0341 L0270: $A = $low_args[0] L0271: if ($A == 0x3) goto L0344 L0272: goto L0604 L0273: $A = $high_args[1] L0274: if ($A == 0x0) goto L0278 L0275: if ($A != 0xffffffff) goto L0341 L0276: $A = $low_args[1] L0277: if !($A & 0x80000000) goto L0341 L0278: $A = $low_args[1] L0279: if !($A & 0xfffffe7f) goto L0344 L0280: $A = $high_args[1] L0281: if ($A == 0x0) goto L0285 L0282: if ($A != 0xffffffff) goto L0341 L0283: $A = $low_args[1] L0284: if !($A & 0x80000000) goto L0341 L0285: $A = $low_args[1] L0286: $A &= 0xfffffe7f L0287: if ($A == 0x1) goto L0344 L0288: $A = $high_args[1] L0289: if ($A == 0x0) goto L0293 L0290: if ($A != 0xffffffff) goto L0341 L0291: $A = $low_args[1] L0292: if !($A & 0x80000000) goto L0341 L0293: $A = $low_args[1] L0294: $A &= 0xfffffe7f L0295: if ($A == 0x3) goto L0344 L0296: $A = $high_args[1] L0297: if ($A == 0x0) goto L0301 L0298: if ($A != 0xffffffff) goto L0341 L0299: $A = $low_args[1] L0300: if !($A & 0x80000000) goto L0341 L0301: $A = $low_args[1] L0302: $A &= 0xfffffe7f L0303: if ($A == 0x4) goto L0344 L0304: $A = $high_args[1] L0305: if ($A == 0x0) goto L0309 L0306: if ($A != 0xffffffff) goto L0341 L0307: $A = $low_args[1] L0308: if !($A & 0x80000000) goto L0341 L0309: $A = $low_args[1] L0310: $A &= 0xfffffe7f L0311: if ($A == 0x5) goto L0344 L0312: $A = $high_args[1] L0313: if ($A == 0x0) goto L0317 L0314: if ($A != 0xffffffff) goto L0341 L0315: $A = $low_args[1] L0316: if !($A & 0x80000000) goto L0341 L0317: $A = $low_args[1] L0318: $A &= 0xfffffe7f L0319: if ($A == 0x9) goto L0344 L0320: $A = $high_args[1] L0321: if ($A == 0x0) goto L0325 L0322: if ($A != 0xffffffff) goto L0341 L0323: $A = $low_args[1] L0324: if !($A & 0x80000000) goto L0341 L0325: $A = $low_args[1] L0326: $A &= 0xfffffe7f L0327: if ($A == 0xa) goto L0344 L0328: return ERRNO(22) L0329: $A = $high_args[0] L0330: if ($A == 0x0) goto L0334 L0331: if ($A != 0xffffffff) goto L0341 L0332: $A = $low_args[0] L0333: if !($A & 0x80000000) goto L0341 L0334: $A = $low_args[0] L0335: if ($A == 0x10) goto L0344 L0336: $A = $high_args[0] L0337: if ($A == 0x0) goto L0342 L0338: if ($A != 0xffffffff) goto L0341 L0339: $A = $low_args[0] L0340: if ($A & 0x80000000) goto L0342 L0341: goto L0599 L0342: $A = $low_args[0] L0343: if ($A != 0xf) goto L0345 L0344: goto L0603 L0345: $A = $high_args[0] L0346: if ($A == 0x0) goto L0350 L0347: if ($A != 0xffffffff) goto L0599 L0348: $A = $low_args[0] L0349: if !($A & 0x80000000) goto L0599 L0350: $A = $low_args[0] L0351: if ($A == 0x3) goto L0603 L0352: $A = $high_args[0] L0353: if ($A == 0x0) goto L0357 L0354: if ($A != 0xffffffff) goto L0599 L0355: $A = $low_args[0] L0356: if !($A & 0x80000000) goto L0599 L0357: $A = $low_args[0] L0358: if ($A == 0x4) goto L0603 L0359: $A = $high_args[0] L0360: if ($A == 0x0) goto L0364 L0361: if ($A != 0xffffffff) goto L0599 L0362: $A = $low_args[0] L0363: if !($A & 0x80000000) goto L0599 L0364: $A = $low_args[0] L0365: if ($A == 0x53564d41) goto L0373 L0366: $A = $high_args[0] L0367: if ($A == 0x0) goto L0371 L0368: if ($A != 0xffffffff) goto L0599 L0369: $A = $low_args[0] L0370: if !($A & 0x80000000) goto L0599 L0371: $A = $low_args[0] L0372: if ($A == 0x59616d61) goto L0602, else goto L0380 L0373: $A = $high_args[1] L0374: if ($A == 0x0) goto L0378 L0375: if ($A != 0xffffffff) goto L0599 L0376: $A = $low_args[1] L0377: if !($A & 0x80000000) goto L0599 L0378: $A = $low_args[1] L0379: if ($A == 0x0) goto L0603 L0380: return TRAP(7) L0381: $A = $high_args[0] L0382: if ($A == 0x0) goto L0386 L0383: if ($A != 0xffffffff) goto L0599 L0384: $A = $low_args[0] L0385: if !($A & 0x80000000) goto L0599 L0386: $A = $low_args[0] L0387: if ($A == 0x0) goto L0603 L0388: $A = $high_args[0] L0389: if ($A == 0x0) goto L0393 L0390: if ($A != 0xffffffff) goto L0599 L0391: $A = $low_args[0] L0392: if !($A & 0x80000000) goto L0599 L0393: $A = $low_args[0] L0394: if ($A == 0x1) goto L0603 L0395: return TRAP(6) L0396: $A = $high_args[0] L0397: if ($A == 0x0) goto L0401 L0398: if ($A != 0xffffffff) goto L0599 L0399: $A = $low_args[0] L0400: if !($A & 0x80000000) goto L0599 L0401: $A = $low_args[0] L0402: if ($A != 0x0) goto L0604 L0403: $A = $high_args[1] L0404: if ($A == 0x0) goto L0408 L0405: if ($A != 0xffffffff) goto L0599 L0406: $A = $low_args[1] L0407: if !($A & 0x80000000) goto L0599 L0408: $A = $low_args[1] L0409: if ($A == 0x0) goto L0603 L0410: $A = $high_args[1] L0411: if ($A == 0x0) goto L0415 L0412: if ($A != 0xffffffff) goto L0599 L0413: $A = $low_args[1] L0414: if !($A & 0x80000000) goto L0599 L0415: $A = $low_args[1] L0416: if ($A == 0x1) goto L0603, else goto L0602 L0417: $A = $high_args[1] L0418: if ($A == 0x0) goto L0422 L0419: if ($A != 0xffffffff) goto L0599 L0420: $A = $low_args[1] L0421: if !($A & 0x80000000) goto L0599 L0422: $A = $low_args[1] L0423: if ($A == 0x3) goto L0603 L0424: $A = $high_args[1] L0425: if ($A == 0x0) goto L0429 L0426: if ($A != 0xffffffff) goto L0599 L0427: $A = $low_args[1] L0428: if !($A & 0x80000000) goto L0599 L0429: $A = $low_args[1] L0430: if ($A == 0x1) goto L0603 L0431: $A = $high_args[1] L0432: if ($A == 0x0) goto L0436 L0433: if ($A != 0xffffffff) goto L0599 L0434: $A = $low_args[1] L0435: if !($A & 0x80000000) goto L0599 L0436: $A = $low_args[1] L0437: if ($A == 0x40a) goto L0603 L0438: $A = $high_args[1] L0439: if ($A == 0x0) goto L0443 L0440: if ($A != 0xffffffff) goto L0599 L0441: $A = $low_args[1] L0442: if !($A & 0x80000000) goto L0599 L0443: $A = $low_args[1] L0444: if ($A == 0x2) goto L0603 L0445: $A = $high_args[1] L0446: if ($A == 0x0) goto L0450 L0447: if ($A != 0xffffffff) goto L0599 L0448: $A = $low_args[1] L0449: if !($A & 0x80000000) goto L0599 L0450: $A = $low_args[1] L0451: if ($A == 0x6) goto L0603 L0452: $A = $high_args[1] L0453: if ($A == 0x0) goto L0457 L0454: if ($A != 0xffffffff) goto L0599 L0455: $A = $low_args[1] L0456: if !($A & 0x80000000) goto L0599 L0457: $A = $low_args[1] L0458: if ($A == 0x7) goto L0603 L0459: $A = $high_args[1] L0460: if ($A == 0x0) goto L0464 L0461: if ($A != 0xffffffff) goto L0599 L0462: $A = $low_args[1] L0463: if !($A & 0x80000000) goto L0599 L0464: $A = $low_args[1] L0465: if ($A == 0x5) goto L0603 L0466: $A = $high_args[1] L0467: if ($A == 0x0) goto L0471 L0468: if ($A != 0xffffffff) goto L0599 L0469: $A = $low_args[1] L0470: if !($A & 0x80000000) goto L0599 L0471: $A = $low_args[1] L0472: if ($A == 0x0) goto L0603 L0473: $A = $high_args[1] L0474: if ($A == 0x0) goto L0478 L0475: if ($A != 0xffffffff) goto L0599 L0476: $A = $low_args[1] L0477: if !($A & 0x80000000) goto L0599 L0478: $A = $low_args[1] L0479: if ($A == 0x406) goto L0603 L0480: $A = $high_args[1] L0481: if ($A == 0x0) goto L0485 L0482: if ($A != 0xffffffff) goto L0599 L0483: $A = $low_args[1] L0484: if !($A & 0x80000000) goto L0599 L0485: $A = $low_args[1] L0486: if ($A == 0x4) goto L0496 L0487: $A = $high_args[1] L0488: if ($A == 0x0) goto L0492 L0489: if ($A != 0xffffffff) goto L0599 L0490: $A = $low_args[1] L0491: if !($A & 0x80000000) goto L0599 L0492: $A = $low_args[1] L0493: if ($A != 0x409) goto L0604 L0494: $A = $high_args[2] L0495: if ($A == 0x0) goto L0592, else goto L0604 L0496: $A = $high_args[2] L0497: if ($A != 0x0) goto L0604 L0498: $A = $low_args[2] L0499: if ($A & 0xffe363fc) goto L0604, else goto L0603 L0500: $A = $high_args[0] L0501: if ($A == 0x0) goto L0505 L0502: if ($A != 0xffffffff) goto L0599 L0503: $A = $low_args[0] L0504: if !($A & 0x80000000) goto L0599 L0505: $A = $low_args[0] L0506: if ($A == 0x1) goto L0603 L0507: return TRAP(5) L0508: $A = $high_args[0] L0509: if ($A != 0x0) goto L0512 L0510: $A = $low_args[0] L0511: if ($A == 0x3d0f00) goto L0603 L0512: $A = $low_args[0] L0513: if !($A & 0x10100) goto L0602 L0514: $A = $low_args[0] L0515: $A &= 0x4100 L0516: if ($A == 0x4100) goto L0602 L0517: return TRAP(4) L0518: $A = $high_args[1] L0519: if ($A == 0x0) goto L0523 L0520: if ($A != 0xffffffff) goto L0599 L0521: $A = $low_args[1] L0522: if !($A & 0x80000000) goto L0599 L0523: $A = $low_args[1] L0524: if ($A != 0x1) goto L0604 L0525: $A = $high_args[2] L0526: if ($A == 0x0) goto L0530 L0527: if ($A != 0xffffffff) goto L0599 L0528: $A = $low_args[2] L0529: if !($A & 0x80000000) goto L0599 L0530: $A = $low_args[2] L0531: if ($A == 0x2a) goto L0603, else goto L0604 L0532: $A = $high_args[0] L0533: if ($A == 0x0) goto L0537 L0534: if ($A != 0xffffffff) goto L0599 L0535: $A = $low_args[0] L0536: if !($A & 0x80000000) goto L0599 L0537: $A = $low_args[0] L0538: if ($A == 0x1) goto L0603, else goto L0604 L0539: $A = $high_args[2] L0540: if ($A == 0x0) goto L0544 L0541: if ($A != 0xffffffff) goto L0599 L0542: $A = $low_args[2] L0543: if !($A & 0x80000000) goto L0599 L0544: $A = $low_args[2] L0545: if ($A == 0x4) goto L0603 L0546: $A = $high_args[2] L0547: if ($A == 0x0) goto L0551 L0548: if ($A != 0xffffffff) goto L0599 L0549: $A = $low_args[2] L0550: if !($A & 0x80000000) goto L0599 L0551: $A = $low_args[2] L0552: if ($A == 0x1) goto L0603 L0553: $A = $high_args[2] L0554: if ($A == 0x0) goto L0558 L0555: if ($A != 0xffffffff) goto L0599 L0556: $A = $low_args[2] L0557: if !($A & 0x80000000) goto L0599 L0558: $A = $low_args[2] L0559: if ($A == 0x9) goto L0603 L0560: $A = $high_args[2] L0561: if ($A == 0x0) goto L0565 L0562: if ($A != 0xffffffff) goto L0599 L0563: $A = $low_args[2] L0564: if !($A & 0x80000000) goto L0599 L0565: $A = $low_args[2] L0566: if ($A == 0x0) goto L0603 L0567: $A = $high_args[2] L0568: if ($A == 0x0) goto L0572 L0569: if ($A != 0xffffffff) goto L0599 L0570: $A = $low_args[2] L0571: if !($A & 0x80000000) goto L0599 L0572: $A = $low_args[2] L0573: if ($A == 0x8) goto L0603, else goto L0602 L0574: $A = $high_args[1] L0575: if ($A != 0x0) goto L0578 L0576: $A = $low_args[1] L0577: if ($A == 0x5401) goto L0603 L0578: $A = $high_args[1] L0579: if ($A != 0x0) goto L0582 L0580: $A = $low_args[1] L0581: if ($A == 0x541b) goto L0603 L0582: $A = $high_args[1] L0583: if ($A != 0x0) goto L0586 L0584: $A = $low_args[1] L0585: if ($A == 0x40086200) goto L0603 L0586: return TRAP(3) L0587: $A = $high_args[2] L0588: if ($A == 0x0) goto L0592 L0589: if ($A != 0xffffffff) goto L0599 L0590: $A = $low_args[2] L0591: if !($A & 0x80000000) goto L0599 L0592: $A = $low_args[2] L0593: if ($A & 0xfffffff8) goto L0604, else goto L0603 L0594: $A = $high_args[3] L0595: if ($A == 0x0) goto L0600 L0596: if ($A != 0xffffffff) goto L0599 L0597: $A = $low_args[3] L0598: if ($A & 0x80000000) goto L0600 L0599: return TRAP(2) L0600: $A = $low_args[3] L0601: if ($A & 0xfffd97cc) goto L0604, else goto L0603 L0602: return ERRNO(1) #... 3 line(s) skipped ceccomp-4.3.1/test/emu_result/chromium.pipe.casm000066400000000000000000000634661526046660400217470ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A == x86_64) goto L0004 L0003: return TRAP(10) L0004: $A = $syscall_nr L0005: if !($A & 0x40000000) goto L0007 L0006: return TRAP(9) L0007: if ($A <= sched_get_priority_max) goto L0082 L0008: if ($A <= pselect6) goto L0045 L0009: if ($A <= name_to_handle_at) goto L0028 L0010: if ($A <= io_pgetevents) goto L0020 L0011: if ($A <= close_range) goto L0017 L0012: if ($A <= process_madvise) goto L0016 L0013: if ($A <= mseal) goto L0015 L0014: if ($A <= setxattrat) goto L0081 L0015: goto L0604 L0016: if ($A >= faccessat2) goto L0171, else goto L0272 L0017: if ($A <= uretprobe) goto L0019 L0018: if ($A >= pidfd_open) goto L0172, else goto L0272 L0019: if ($A >= rseq) goto L0081, else goto L0272 L0020: if ($A <= kexec_file_load) goto L0025 L0021: if ($A <= pkey_alloc) goto L0024 L0022: if ($A <= pkey_free) goto L0173 L0023: if ($A >= statx) goto L0164, else goto L0081 L0024: if ($A >= pkey_mprotect) goto L0159, else goto L0272 L0025: if ($A <= getrandom) goto L0027 L0026: if ($A >= memfd_create) goto L0081, else goto L0180 L0027: if ($A >= renameat2) goto L0171, else goto L0272 L0028: if ($A <= timerfd_settime) goto L0037 L0029: if ($A <= pipe2) goto L0034 L0030: if ($A <= rt_tgsigqueueinfo) goto L0033 L0031: if ($A <= perf_event_open) goto L0194 L0032: if ($A >= prlimit64) goto L0187, else goto L0272 L0033: if ($A >= inotify_init1) goto L0272, else goto L0201 L0034: if ($A <= signalfd4) goto L0036 L0035: if ($A >= eventfd2) goto L0081, else goto L0272 L0036: if ($A >= accept4) goto L0171, else goto L0272 L0037: if ($A <= utimensat) goto L0042 L0038: if ($A <= signalfd) goto L0041 L0039: if ($A <= eventfd) goto L0272 L0040: if ($A >= fallocate) goto L0171, else goto L0081 L0041: if ($A >= epoll_pwait) goto L0081, else goto L0171 L0042: if ($A <= set_robust_list) goto L0044 L0043: if ($A >= get_robust_list) goto L0272, else goto L0081 L0044: if ($A >= unshare) goto L0272, else goto L0081 L0045: if ($A <= lookup_dcookie) goto L0063 L0046: if ($A <= exit_group) goto L0055 L0047: if ($A <= waitid) goto L0052 L0048: if ($A <= openat) goto L0051 L0049: if ($A <= newfstatat) goto L0171 L0050: if ($A >= unlinkat) goto L0171, else goto L0208 L0051: if ($A >= add_key) goto L0272, else goto L0081 L0052: if ($A <= utimes) goto L0054 L0053: if ($A >= vserver) goto L0272, else goto L0171 L0054: if ($A >= tgkill) goto L0130, else goto L0081 L0055: if ($A <= set_tid_address) goto L0060 L0056: if ($A <= semtimedop) goto L0059 L0057: if ($A <= fadvise64) goto L0171 L0058: if ($A >= clock_gettime) goto L0209, else goto L0272 L0059: if ($A >= restart_syscall) goto L0081, else goto L0272 L0060: if ($A <= epoll_ctl_old) goto L0062 L0061: if ($A >= getdents64) goto L0171, else goto L0272 L0062: if ($A >= epoll_create) goto L0081, else goto L0171 L0063: if ($A <= create_module) goto L0073 L0064: if ($A <= time) goto L0069 L0065: if ($A <= sched_setaffinity) goto L0068 L0066: if ($A <= sched_getaffinity) goto L0272 L0067: if ($A >= set_thread_area) goto L0272, else goto L0090 L0068: if ($A >= futex) goto L0273, else goto L0081 L0069: if ($A <= readahead) goto L0072 L0070: if ($A <= tkill) goto L0272 L0071: goto L0507 L0072: if ($A >= gettid) goto L0081, else goto L0272 L0073: if ($A <= prctl) goto L0078 L0074: if ($A <= setrlimit) goto L0077 L0075: if ($A <= chroot) goto L0081 L0076: if ($A >= iopl) goto L0171, else goto L0272 L0077: if ($A >= arch_prctl) goto L0272, else goto L0329 L0078: if ($A <= mlock) goto L0080 L0079: if ($A >= mlockall) goto L0272, else goto L0081 L0080: if ($A >= sched_rr_get_interval) goto L0272 L0081: goto L0603 L0082: if ($A <= truncate) goto L0120 L0083: if ($A <= getresuid) goto L0103 L0084: if ($A <= rt_sigqueueinfo) goto L0095 L0085: if ($A <= ustat) goto L0092 L0086: if ($A <= getpriority) goto L0091 L0087: if ($A >= sched_setparam) goto L0089 L0088: goto L0396 L0089: if ($A <= sched_getparam) goto L0272 L0090: goto L0381 L0091: if ($A >= fstatfs) goto L0272, else goto L0171 L0092: if ($A <= utime) goto L0094 L0093: if ($A >= personality) goto L0272, else goto L0171 L0094: if ($A >= sigaltstack) goto L0344, else goto L0272 L0095: if ($A <= setfsuid) goto L0100 L0096: if ($A <= capset) goto L0099 L0097: if ($A <= rt_sigpending) goto L0171 L0098: if ($A >= rt_sigtimedwait) goto L0344, else goto L0272 L0099: if ($A >= getsid) goto L0344, else goto L0171 L0100: if ($A <= getresgid) goto L0102 L0101: if ($A >= getpgid) goto L0272, else goto L0344 L0102: if ($A >= setresgid) goto L0171, else goto L0344 L0103: if ($A <= getgid) goto L0112 L0104: if ($A <= getppid) goto L0109 L0105: if ($A <= setreuid) goto L0108 L0106: if ($A <= getgroups) goto L0171 L0107: if ($A >= setgroups) goto L0171, else goto L0344 L0108: if ($A >= getpgrp) goto L0272, else goto L0344 L0109: if ($A <= geteuid) goto L0111 L0110: if ($A >= setpgid) goto L0272, else goto L0344 L0111: if ($A >= setuid) goto L0171, else goto L0344 L0112: if ($A <= getrusage) goto L0117 L0113: if ($A <= ptrace) goto L0116 L0114: if ($A <= getuid) goto L0272 L0115: if ($A >= syslog) goto L0272, else goto L0344 L0116: if ($A >= sysinfo) goto L0344, else goto L0272 L0117: if ($A <= getdents) goto L0119 L0118: if ($A >= gettimeofday) goto L0344, else goto L0171 L0119: if ($A >= ftruncate) goto L0344, else goto L0171 L0120: if ($A <= dup) goto L0143 L0121: if ($A <= clone) goto L0133 L0122: if ($A <= uname) goto L0128 L0123: if ($A <= fcntl) goto L0127 L0124: if ($A >= flock) goto L0126 L0125: goto L0417 L0126: if ($A >= fsync) goto L0344, else goto L0272 L0127: if ($A >= semget) goto L0171, else goto L0344 L0128: if ($A <= exit) goto L0131 L0129: if ($A <= kill) goto L0344 L0130: goto L0500 L0131: if ($A >= fork) goto L0171 L0132: goto L0508 L0133: if ($A <= sendto) goto L0140 L0134: if ($A <= getsockname) goto L0139 L0135: if ($A <= socketpair) goto L0272 L0136: if ($A >= setsockopt) goto L0138 L0137: goto L0532 L0138: goto L0518 L0139: if ($A >= bind) goto L0171, else goto L0344 L0140: if ($A <= getpid) goto L0142 L0141: if ($A >= sendfile) goto L0171, else goto L0344 L0142: if ($A >= getitimer) goto L0272, else goto L0344 L0143: if ($A <= munmap) goto L0154 L0144: if ($A <= pipe) goto L0150 L0145: if ($A <= mincore) goto L0149 L0146: if ($A <= madvise) goto L0344 L0147: if ($A >= shmget) goto L0171 L0148: goto L0539 L0149: if ($A >= msync) goto L0272, else goto L0344 L0150: if ($A <= pread64) goto L0152 L0151: if ($A >= access) goto L0171, else goto L0344 L0152: if ($A <= ioctl) goto L0344 L0153: goto L0574 L0154: if ($A <= fstat) goto L0161 L0155: if ($A <= poll) goto L0160 L0156: if ($A <= mmap) goto L0344 L0157: if ($A >= mprotect) goto L0159 L0158: goto L0594 L0159: goto L0587 L0160: if ($A >= lstat) goto L0171, else goto L0344 L0161: if ($A <= close) goto L0163 L0162: if ($A >= stat) goto L0171, else goto L0344 L0163: if ($A >= open) goto L0171, else goto L0344 L0164: $A = $high_args[3] L0165: if ($A == 0x0) goto L0169 L0166: if ($A != 0xffffffff) goto L0341 L0167: $A = $low_args[3] L0168: if !($A & 0x80000000) goto L0341 L0169: $A = $low_args[3] L0170: if ($A == 0x7ff) goto L0172 L0171: goto L0602 L0172: return ERRNO(38) L0173: $A = $high_args[0] L0174: if ($A == 0x0) goto L0178 L0175: if ($A != 0xffffffff) goto L0341 L0176: $A = $low_args[0] L0177: if !($A & 0x80000000) goto L0341 L0178: $A = $low_args[0] L0179: if ($A == 0x0) goto L0344, else goto L0272 L0180: $A = $high_args[2] L0181: if ($A == 0x0) goto L0185 L0182: if ($A != 0xffffffff) goto L0341 L0183: $A = $low_args[2] L0184: if !($A & 0x80000000) goto L0341 L0185: $A = $low_args[2] L0186: if ($A & 0xfffffffa) goto L0272, else goto L0344 L0187: $A = $high_args[0] L0188: if ($A == 0x0) goto L0192 L0189: if ($A != 0xffffffff) goto L0341 L0190: $A = $low_args[0] L0191: if !($A & 0x80000000) goto L0341 L0192: $A = $low_args[0] L0193: if ($A == 0x0) goto L0344 L0194: $A = $high_args[0] L0195: if ($A == 0x0) goto L0199 L0196: if ($A != 0xffffffff) goto L0341 L0197: $A = $low_args[0] L0198: if !($A & 0x80000000) goto L0341 L0199: $A = $low_args[0] L0200: goto L0416 L0201: $A = $high_args[1] L0202: if ($A == 0x0) goto L0206 L0203: if ($A != 0xffffffff) goto L0341 L0204: $A = $low_args[1] L0205: if !($A & 0x80000000) goto L0341 L0206: $A = $low_args[1] L0207: if ($A & 0xfff7b7ff) goto L0272, else goto L0344 L0208: return TRAP(8) L0209: $A = $high_args[0] L0210: if ($A == 0x0) goto L0214 L0211: if ($A != 0xffffffff) goto L0341 L0212: $A = $low_args[0] L0213: if !($A & 0x80000000) goto L0341 L0214: $A = $low_args[0] L0215: if ($A & 0x80000000) goto L0272 L0216: $A = $high_args[0] L0217: if ($A == 0x0) goto L0221 L0218: if ($A != 0xffffffff) goto L0341 L0219: $A = $low_args[0] L0220: if !($A & 0x80000000) goto L0341 L0221: $A = $low_args[0] L0222: if ($A == 0x7) goto L0344 L0223: $A = $high_args[0] L0224: if ($A == 0x0) goto L0228 L0225: if ($A != 0xffffffff) goto L0341 L0226: $A = $low_args[0] L0227: if !($A & 0x80000000) goto L0341 L0228: $A = $low_args[0] L0229: if ($A == 0x1) goto L0344 L0230: $A = $high_args[0] L0231: if ($A == 0x0) goto L0235 L0232: if ($A != 0xffffffff) goto L0341 L0233: $A = $low_args[0] L0234: if !($A & 0x80000000) goto L0341 L0235: $A = $low_args[0] L0236: if ($A == 0x6) goto L0344 L0237: $A = $high_args[0] L0238: if ($A == 0x0) goto L0242 L0239: if ($A != 0xffffffff) goto L0341 L0240: $A = $low_args[0] L0241: if !($A & 0x80000000) goto L0341 L0242: $A = $low_args[0] L0243: if ($A == 0x4) goto L0344 L0244: $A = $high_args[0] L0245: if ($A == 0x0) goto L0249 L0246: if ($A != 0xffffffff) goto L0341 L0247: $A = $low_args[0] L0248: if !($A & 0x80000000) goto L0341 L0249: $A = $low_args[0] L0250: if ($A == 0x2) goto L0344 L0251: $A = $high_args[0] L0252: if ($A == 0x0) goto L0256 L0253: if ($A != 0xffffffff) goto L0341 L0254: $A = $low_args[0] L0255: if !($A & 0x80000000) goto L0341 L0256: $A = $low_args[0] L0257: if ($A == 0x0) goto L0344 L0258: $A = $high_args[0] L0259: if ($A == 0x0) goto L0263 L0260: if ($A != 0xffffffff) goto L0341 L0261: $A = $low_args[0] L0262: if !($A & 0x80000000) goto L0341 L0263: $A = $low_args[0] L0264: if ($A == 0x5) goto L0344 L0265: $A = $high_args[0] L0266: if ($A == 0x0) goto L0270 L0267: if ($A != 0xffffffff) goto L0341 L0268: $A = $low_args[0] L0269: if !($A & 0x80000000) goto L0341 L0270: $A = $low_args[0] L0271: if ($A == 0x3) goto L0344 L0272: goto L0604 L0273: $A = $high_args[1] L0274: if ($A == 0x0) goto L0278 L0275: if ($A != 0xffffffff) goto L0341 L0276: $A = $low_args[1] L0277: if !($A & 0x80000000) goto L0341 L0278: $A = $low_args[1] L0279: if !($A & 0xfffffe7f) goto L0344 L0280: $A = $high_args[1] L0281: if ($A == 0x0) goto L0285 L0282: if ($A != 0xffffffff) goto L0341 L0283: $A = $low_args[1] L0284: if !($A & 0x80000000) goto L0341 L0285: $A = $low_args[1] L0286: $A &= 0xfffffe7f L0287: if ($A == 0x1) goto L0344 L0288: $A = $high_args[1] L0289: if ($A == 0x0) goto L0293 L0290: if ($A != 0xffffffff) goto L0341 L0291: $A = $low_args[1] L0292: if !($A & 0x80000000) goto L0341 L0293: $A = $low_args[1] L0294: $A &= 0xfffffe7f L0295: if ($A == 0x3) goto L0344 L0296: $A = $high_args[1] L0297: if ($A == 0x0) goto L0301 L0298: if ($A != 0xffffffff) goto L0341 L0299: $A = $low_args[1] L0300: if !($A & 0x80000000) goto L0341 L0301: $A = $low_args[1] L0302: $A &= 0xfffffe7f L0303: if ($A == 0x4) goto L0344 L0304: $A = $high_args[1] L0305: if ($A == 0x0) goto L0309 L0306: if ($A != 0xffffffff) goto L0341 L0307: $A = $low_args[1] L0308: if !($A & 0x80000000) goto L0341 L0309: $A = $low_args[1] L0310: $A &= 0xfffffe7f L0311: if ($A == 0x5) goto L0344 L0312: $A = $high_args[1] L0313: if ($A == 0x0) goto L0317 L0314: if ($A != 0xffffffff) goto L0341 L0315: $A = $low_args[1] L0316: if !($A & 0x80000000) goto L0341 L0317: $A = $low_args[1] L0318: $A &= 0xfffffe7f L0319: if ($A == 0x9) goto L0344 L0320: $A = $high_args[1] L0321: if ($A == 0x0) goto L0325 L0322: if ($A != 0xffffffff) goto L0341 L0323: $A = $low_args[1] L0324: if !($A & 0x80000000) goto L0341 L0325: $A = $low_args[1] L0326: $A &= 0xfffffe7f L0327: if ($A == 0xa) goto L0344 L0328: return ERRNO(22) L0329: $A = $high_args[0] L0330: if ($A == 0x0) goto L0334 L0331: if ($A != 0xffffffff) goto L0341 L0332: $A = $low_args[0] L0333: if !($A & 0x80000000) goto L0341 L0334: $A = $low_args[0] L0335: if ($A == 0x10) goto L0344 L0336: $A = $high_args[0] L0337: if ($A == 0x0) goto L0342 L0338: if ($A != 0xffffffff) goto L0341 L0339: $A = $low_args[0] L0340: if ($A & 0x80000000) goto L0342 L0341: goto L0599 L0342: $A = $low_args[0] L0343: if ($A != 0xf) goto L0345 L0344: goto L0603 L0345: $A = $high_args[0] L0346: if ($A == 0x0) goto L0350 L0347: if ($A != 0xffffffff) goto L0599 L0348: $A = $low_args[0] L0349: if !($A & 0x80000000) goto L0599 L0350: $A = $low_args[0] L0351: if ($A == 0x3) goto L0603 L0352: $A = $high_args[0] L0353: if ($A == 0x0) goto L0357 L0354: if ($A != 0xffffffff) goto L0599 L0355: $A = $low_args[0] L0356: if !($A & 0x80000000) goto L0599 L0357: $A = $low_args[0] L0358: if ($A == 0x4) goto L0603 L0359: $A = $high_args[0] L0360: if ($A == 0x0) goto L0364 L0361: if ($A != 0xffffffff) goto L0599 L0362: $A = $low_args[0] L0363: if !($A & 0x80000000) goto L0599 L0364: $A = $low_args[0] L0365: if ($A == 0x53564d41) goto L0373 L0366: $A = $high_args[0] L0367: if ($A == 0x0) goto L0371 L0368: if ($A != 0xffffffff) goto L0599 L0369: $A = $low_args[0] L0370: if !($A & 0x80000000) goto L0599 L0371: $A = $low_args[0] L0372: if ($A == 0x59616d61) goto L0602, else goto L0380 L0373: $A = $high_args[1] L0374: if ($A == 0x0) goto L0378 L0375: if ($A != 0xffffffff) goto L0599 L0376: $A = $low_args[1] L0377: if !($A & 0x80000000) goto L0599 L0378: $A = $low_args[1] L0379: if ($A == 0x0) goto L0603 L0380: return TRAP(7) L0381: $A = $high_args[0] L0382: if ($A == 0x0) goto L0386 L0383: if ($A != 0xffffffff) goto L0599 L0384: $A = $low_args[0] L0385: if !($A & 0x80000000) goto L0599 L0386: $A = $low_args[0] L0387: if ($A == 0x0) goto L0603 L0388: $A = $high_args[0] L0389: if ($A == 0x0) goto L0393 L0390: if ($A != 0xffffffff) goto L0599 L0391: $A = $low_args[0] L0392: if !($A & 0x80000000) goto L0599 L0393: $A = $low_args[0] L0394: if ($A == 0x1) goto L0603 L0395: return TRAP(6) L0396: $A = $high_args[0] L0397: if ($A == 0x0) goto L0401 L0398: if ($A != 0xffffffff) goto L0599 L0399: $A = $low_args[0] L0400: if !($A & 0x80000000) goto L0599 L0401: $A = $low_args[0] L0402: if ($A != 0x0) goto L0604 L0403: $A = $high_args[1] L0404: if ($A == 0x0) goto L0408 L0405: if ($A != 0xffffffff) goto L0599 L0406: $A = $low_args[1] L0407: if !($A & 0x80000000) goto L0599 L0408: $A = $low_args[1] L0409: if ($A == 0x0) goto L0603 L0410: $A = $high_args[1] L0411: if ($A == 0x0) goto L0415 L0412: if ($A != 0xffffffff) goto L0599 L0413: $A = $low_args[1] L0414: if !($A & 0x80000000) goto L0599 L0415: $A = $low_args[1] L0416: if ($A == 0x1) goto L0603, else goto L0602 L0417: $A = $high_args[1] L0418: if ($A == 0x0) goto L0422 L0419: if ($A != 0xffffffff) goto L0599 L0420: $A = $low_args[1] L0421: if !($A & 0x80000000) goto L0599 L0422: $A = $low_args[1] L0423: if ($A == 0x3) goto L0603 L0424: $A = $high_args[1] L0425: if ($A == 0x0) goto L0429 L0426: if ($A != 0xffffffff) goto L0599 L0427: $A = $low_args[1] L0428: if !($A & 0x80000000) goto L0599 L0429: $A = $low_args[1] L0430: if ($A == 0x1) goto L0603 L0431: $A = $high_args[1] L0432: if ($A == 0x0) goto L0436 L0433: if ($A != 0xffffffff) goto L0599 L0434: $A = $low_args[1] L0435: if !($A & 0x80000000) goto L0599 L0436: $A = $low_args[1] L0437: if ($A == 0x40a) goto L0603 L0438: $A = $high_args[1] L0439: if ($A == 0x0) goto L0443 L0440: if ($A != 0xffffffff) goto L0599 L0441: $A = $low_args[1] L0442: if !($A & 0x80000000) goto L0599 L0443: $A = $low_args[1] L0444: if ($A == 0x2) goto L0603 L0445: $A = $high_args[1] L0446: if ($A == 0x0) goto L0450 L0447: if ($A != 0xffffffff) goto L0599 L0448: $A = $low_args[1] L0449: if !($A & 0x80000000) goto L0599 L0450: $A = $low_args[1] L0451: if ($A == 0x6) goto L0603 L0452: $A = $high_args[1] L0453: if ($A == 0x0) goto L0457 L0454: if ($A != 0xffffffff) goto L0599 L0455: $A = $low_args[1] L0456: if !($A & 0x80000000) goto L0599 L0457: $A = $low_args[1] L0458: if ($A == 0x7) goto L0603 L0459: $A = $high_args[1] L0460: if ($A == 0x0) goto L0464 L0461: if ($A != 0xffffffff) goto L0599 L0462: $A = $low_args[1] L0463: if !($A & 0x80000000) goto L0599 L0464: $A = $low_args[1] L0465: if ($A == 0x5) goto L0603 L0466: $A = $high_args[1] L0467: if ($A == 0x0) goto L0471 L0468: if ($A != 0xffffffff) goto L0599 L0469: $A = $low_args[1] L0470: if !($A & 0x80000000) goto L0599 L0471: $A = $low_args[1] L0472: if ($A == 0x0) goto L0603 L0473: $A = $high_args[1] L0474: if ($A == 0x0) goto L0478 L0475: if ($A != 0xffffffff) goto L0599 L0476: $A = $low_args[1] L0477: if !($A & 0x80000000) goto L0599 L0478: $A = $low_args[1] L0479: if ($A == 0x406) goto L0603 L0480: $A = $high_args[1] L0481: if ($A == 0x0) goto L0485 L0482: if ($A != 0xffffffff) goto L0599 L0483: $A = $low_args[1] L0484: if !($A & 0x80000000) goto L0599 L0485: $A = $low_args[1] L0486: if ($A == 0x4) goto L0496 L0487: $A = $high_args[1] L0488: if ($A == 0x0) goto L0492 L0489: if ($A != 0xffffffff) goto L0599 L0490: $A = $low_args[1] L0491: if !($A & 0x80000000) goto L0599 L0492: $A = $low_args[1] L0493: if ($A != 0x409) goto L0604 L0494: $A = $high_args[2] L0495: if ($A == 0x0) goto L0592, else goto L0604 L0496: $A = $high_args[2] L0497: if ($A != 0x0) goto L0604 L0498: $A = $low_args[2] L0499: if ($A & 0xffe363fc) goto L0604, else goto L0603 L0500: $A = $high_args[0] L0501: if ($A == 0x0) goto L0505 L0502: if ($A != 0xffffffff) goto L0599 L0503: $A = $low_args[0] L0504: if !($A & 0x80000000) goto L0599 L0505: $A = $low_args[0] L0506: if ($A == 0x1) goto L0603 L0507: return TRAP(5) L0508: $A = $high_args[0] L0509: if ($A != 0x0) goto L0512 L0510: $A = $low_args[0] L0511: if ($A == 0x3d0f00) goto L0603 L0512: $A = $low_args[0] L0513: if !($A & 0x10100) goto L0602 L0514: $A = $low_args[0] L0515: $A &= 0x4100 L0516: if ($A == 0x4100) goto L0602 L0517: return TRAP(4) L0518: $A = $high_args[1] L0519: if ($A == 0x0) goto L0523 L0520: if ($A != 0xffffffff) goto L0599 L0521: $A = $low_args[1] L0522: if !($A & 0x80000000) goto L0599 L0523: $A = $low_args[1] L0524: if ($A != 0x1) goto L0604 L0525: $A = $high_args[2] L0526: if ($A == 0x0) goto L0530 L0527: if ($A != 0xffffffff) goto L0599 L0528: $A = $low_args[2] L0529: if !($A & 0x80000000) goto L0599 L0530: $A = $low_args[2] L0531: if ($A == 0x2a) goto L0603, else goto L0604 L0532: $A = $high_args[0] L0533: if ($A == 0x0) goto L0537 L0534: if ($A != 0xffffffff) goto L0599 L0535: $A = $low_args[0] L0536: if !($A & 0x80000000) goto L0599 L0537: $A = $low_args[0] L0538: if ($A == 0x1) goto L0603, else goto L0604 L0539: $A = $high_args[2] L0540: if ($A == 0x0) goto L0544 L0541: if ($A != 0xffffffff) goto L0599 L0542: $A = $low_args[2] L0543: if !($A & 0x80000000) goto L0599 L0544: $A = $low_args[2] L0545: if ($A == 0x4) goto L0603 L0546: $A = $high_args[2] L0547: if ($A == 0x0) goto L0551 L0548: if ($A != 0xffffffff) goto L0599 L0549: $A = $low_args[2] L0550: if !($A & 0x80000000) goto L0599 L0551: $A = $low_args[2] L0552: if ($A == 0x1) goto L0603 L0553: $A = $high_args[2] L0554: if ($A == 0x0) goto L0558 L0555: if ($A != 0xffffffff) goto L0599 L0556: $A = $low_args[2] L0557: if !($A & 0x80000000) goto L0599 L0558: $A = $low_args[2] L0559: if ($A == 0x9) goto L0603 L0560: $A = $high_args[2] L0561: if ($A == 0x0) goto L0565 L0562: if ($A != 0xffffffff) goto L0599 L0563: $A = $low_args[2] L0564: if !($A & 0x80000000) goto L0599 L0565: $A = $low_args[2] L0566: if ($A == 0x0) goto L0603 L0567: $A = $high_args[2] L0568: if ($A == 0x0) goto L0572 L0569: if ($A != 0xffffffff) goto L0599 L0570: $A = $low_args[2] L0571: if !($A & 0x80000000) goto L0599 L0572: $A = $low_args[2] L0573: if ($A == 0x8) goto L0603, else goto L0602 L0574: $A = $high_args[1] L0575: if ($A != 0x0) goto L0578 L0576: $A = $low_args[1] L0577: if ($A == 0x5401) goto L0603 L0578: $A = $high_args[1] L0579: if ($A != 0x0) goto L0582 L0580: $A = $low_args[1] L0581: if ($A == 0x541b) goto L0603 L0582: $A = $high_args[1] L0583: if ($A != 0x0) goto L0586 L0584: $A = $low_args[1] L0585: if ($A == 0x40086200) goto L0603 L0586: return TRAP(3) L0587: $A = $high_args[2] L0588: if ($A == 0x0) goto L0592 L0589: if ($A != 0xffffffff) goto L0599 L0590: $A = $low_args[2] L0591: if !($A & 0x80000000) goto L0599 L0592: $A = $low_args[2] L0593: if ($A & 0xfffffff8) goto L0604, else goto L0603 L0594: $A = $high_args[3] L0595: if ($A == 0x0) goto L0600 L0596: if ($A != 0xffffffff) goto L0599 L0597: $A = $low_args[3] L0598: if ($A & 0x80000000) goto L0600 L0599: return TRAP(2) L0600: $A = $low_args[3] L0601: if ($A & 0xfffd97cc) goto L0604, else goto L0603 L0602: return ERRNO(1) #... 3 line(s) skipped ceccomp-4.3.1/test/emu_result/gctf-2019-quals-caas.accept.casm000066400000000000000000000053061526046660400237570ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != x86_64) goto L0063 L0003: $A = $syscall_nr L0004: if ($A >= 0x40000000) goto L0063 L0005: if ($A == read) goto L0062 L0006: if ($A == write) goto L0062 L0007: if ($A == close) goto L0062 L0008: if ($A == munmap) goto L0062 L0009: if ($A == sched_yield) goto L0062 L0010: if ($A == dup) goto L0062 L0011: if ($A == dup2) goto L0062 L0012: if ($A == nanosleep) goto L0062 L0013: if ($A == connect) goto L0062 L0014: if ($A == accept) goto L0062 L0015: if ($A == recvmsg) goto L0062 L0016: if ($A == bind) goto L0062 L0017: if ($A == exit) goto L0062 L0018: if ($A == exit_group) goto L0062 L0019: if ($A != clone) goto L0024 L0020: $A = $high_args[0] L0021: if ($A != 0x0) goto L0063 L0022: $A = $low_args[0] L0023: if ($A == 0x10900) goto L0062, else goto L0063 L0024: if ($A != socket) goto L0037 L0025: $A = $high_args[0] L0026: if ($A != 0x0) goto L0063 L0027: $A = $low_args[0] L0028: if ($A != 0x2) goto L0063 L0029: $A = $high_args[1] L0030: if ($A != 0x0) goto L0063 L0031: $A = $low_args[1] L0032: if ($A != 0x1) goto L0063 L0033: $A = $high_args[2] L0034: if ($A != 0x0) goto L0063 L0035: $A = $low_args[2] L0036: if ($A == 0x0) goto L0062, else goto L0063 L0037: if ($A != mmap) goto L0063 L0038: $A = $high_args[0] L0039: if ($A != 0x0) goto L0063 L0040: $A = $low_args[0] L0041: if ($A != 0x0) goto L0063 L0042: $A = $high_args[1] L0043: if ($A != 0x0) goto L0063 L0044: $A = $low_args[1] L0045: if ($A != 0x1000) goto L0063 L0046: $A = $high_args[2] L0047: if ($A != 0x0) goto L0063 L0048: $A = $low_args[2] L0049: if ($A != 0x3) goto L0063 L0050: $A = $high_args[3] L0051: if ($A != 0x0) goto L0063 L0052: $A = $low_args[3] L0053: if ($A != 0x22) goto L0063 L0054: $A = $high_args[4] L0055: if ($A != 0x0) goto L0063 L0056: $A = $low_args[4] L0057: if ($A != 0x0) goto L0063 L0058: $A = $high_args[5] L0059: if ($A != 0x0) goto L0063 L0060: $A = $low_args[5] L0061: if ($A != 0x0) goto L0063 L0062: return ALLOW #... 2 line(s) skipped ceccomp-4.3.1/test/emu_result/gctf-2019-quals-caas.open.casm000066400000000000000000000054411526046660400234610ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != x86_64) goto L0063 L0003: $A = $syscall_nr L0004: if ($A >= 0x40000000) goto L0063 L0005: if ($A == read) goto L0062 L0006: if ($A == write) goto L0062 L0007: if ($A == close) goto L0062 L0008: if ($A == munmap) goto L0062 L0009: if ($A == sched_yield) goto L0062 L0010: if ($A == dup) goto L0062 L0011: if ($A == dup2) goto L0062 L0012: if ($A == nanosleep) goto L0062 L0013: if ($A == connect) goto L0062 L0014: if ($A == accept) goto L0062 L0015: if ($A == recvmsg) goto L0062 L0016: if ($A == bind) goto L0062 L0017: if ($A == exit) goto L0062 L0018: if ($A == exit_group) goto L0062 L0019: if ($A != clone) goto L0024 L0020: $A = $high_args[0] L0021: if ($A != 0x0) goto L0063 L0022: $A = $low_args[0] L0023: if ($A == 0x10900) goto L0062, else goto L0063 L0024: if ($A != socket) goto L0037 L0025: $A = $high_args[0] L0026: if ($A != 0x0) goto L0063 L0027: $A = $low_args[0] L0028: if ($A != 0x2) goto L0063 L0029: $A = $high_args[1] L0030: if ($A != 0x0) goto L0063 L0031: $A = $low_args[1] L0032: if ($A != 0x1) goto L0063 L0033: $A = $high_args[2] L0034: if ($A != 0x0) goto L0063 L0035: $A = $low_args[2] L0036: if ($A == 0x0) goto L0062, else goto L0063 L0037: if ($A != mmap) goto L0063 L0038: $A = $high_args[0] L0039: if ($A != 0x0) goto L0063 L0040: $A = $low_args[0] L0041: if ($A != 0x0) goto L0063 L0042: $A = $high_args[1] L0043: if ($A != 0x0) goto L0063 L0044: $A = $low_args[1] L0045: if ($A != 0x1000) goto L0063 L0046: $A = $high_args[2] L0047: if ($A != 0x0) goto L0063 L0048: $A = $low_args[2] L0049: if ($A != 0x3) goto L0063 L0050: $A = $high_args[3] L0051: if ($A != 0x0) goto L0063 L0052: $A = $low_args[3] L0053: if ($A != 0x22) goto L0063 L0054: $A = $high_args[4] L0055: if ($A != 0x0) goto L0063 L0056: $A = $low_args[4] L0057: if ($A != 0x0) goto L0063 L0058: $A = $high_args[5] L0059: if ($A != 0x0) goto L0063 L0060: $A = $low_args[5] L0061: if ($A != 0x0) goto L0063 L0062: return ALLOW L0063: return KILL #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/gctf-2019-quals-caas.pipe.casm000066400000000000000000000054411526046660400234550ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != x86_64) goto L0063 L0003: $A = $syscall_nr L0004: if ($A >= 0x40000000) goto L0063 L0005: if ($A == read) goto L0062 L0006: if ($A == write) goto L0062 L0007: if ($A == close) goto L0062 L0008: if ($A == munmap) goto L0062 L0009: if ($A == sched_yield) goto L0062 L0010: if ($A == dup) goto L0062 L0011: if ($A == dup2) goto L0062 L0012: if ($A == nanosleep) goto L0062 L0013: if ($A == connect) goto L0062 L0014: if ($A == accept) goto L0062 L0015: if ($A == recvmsg) goto L0062 L0016: if ($A == bind) goto L0062 L0017: if ($A == exit) goto L0062 L0018: if ($A == exit_group) goto L0062 L0019: if ($A != clone) goto L0024 L0020: $A = $high_args[0] L0021: if ($A != 0x0) goto L0063 L0022: $A = $low_args[0] L0023: if ($A == 0x10900) goto L0062, else goto L0063 L0024: if ($A != socket) goto L0037 L0025: $A = $high_args[0] L0026: if ($A != 0x0) goto L0063 L0027: $A = $low_args[0] L0028: if ($A != 0x2) goto L0063 L0029: $A = $high_args[1] L0030: if ($A != 0x0) goto L0063 L0031: $A = $low_args[1] L0032: if ($A != 0x1) goto L0063 L0033: $A = $high_args[2] L0034: if ($A != 0x0) goto L0063 L0035: $A = $low_args[2] L0036: if ($A == 0x0) goto L0062, else goto L0063 L0037: if ($A != mmap) goto L0063 L0038: $A = $high_args[0] L0039: if ($A != 0x0) goto L0063 L0040: $A = $low_args[0] L0041: if ($A != 0x0) goto L0063 L0042: $A = $high_args[1] L0043: if ($A != 0x0) goto L0063 L0044: $A = $low_args[1] L0045: if ($A != 0x1000) goto L0063 L0046: $A = $high_args[2] L0047: if ($A != 0x0) goto L0063 L0048: $A = $low_args[2] L0049: if ($A != 0x3) goto L0063 L0050: $A = $high_args[3] L0051: if ($A != 0x0) goto L0063 L0052: $A = $low_args[3] L0053: if ($A != 0x22) goto L0063 L0054: $A = $high_args[4] L0055: if ($A != 0x0) goto L0063 L0056: $A = $low_args[4] L0057: if ($A != 0x0) goto L0063 L0058: $A = $high_args[5] L0059: if ($A != 0x0) goto L0063 L0060: $A = $low_args[5] L0061: if ($A != 0x0) goto L0063 L0062: return ALLOW L0063: return KILL #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/ld_alu_misc.accept.casm000066400000000000000000000007161526046660400226660ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $low_pc L0002: $X = $A L0003: $A = $high_pc L0004: $A = $high_args[0] L0005: $A = $low_args[5] L0006: $A += $X L0007: $A &= 0xfff L0008: if ($A == 0x0) goto L0010 L0009: return KILL #... 14 line(s) skipped ceccomp-4.3.1/test/emu_result/ld_alu_misc.open.casm000066400000000000000000000007161526046660400223700ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $low_pc L0002: $X = $A L0003: $A = $high_pc L0004: $A = $high_args[0] L0005: $A = $low_args[5] L0006: $A += $X L0007: $A &= 0xfff L0008: if ($A == 0x0) goto L0010 L0009: return KILL #... 14 line(s) skipped ceccomp-4.3.1/test/emu_result/ld_alu_misc.pipe.casm000066400000000000000000000007161526046660400223640ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $low_pc L0002: $X = $A L0003: $A = $high_pc L0004: $A = $high_args[0] L0005: $A = $low_args[5] L0006: $A += $X L0007: $A &= 0xfff L0008: if ($A == 0x0) goto L0010 L0009: return KILL #... 14 line(s) skipped ceccomp-4.3.1/test/emu_result/libseccomp.accept.casm000066400000000000000000000010471526046660400225310ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != x86_64) goto L0011 L0003: $A = $syscall_nr L0004: if ($A >= 0x40000000) goto L0011 L0005: if ($A == execveat) goto L0010 L0006: if ($A == execve) goto L0010 L0007: if ($A == fcntl) goto L0010 L0008: if ($A == exit) goto L0010 L0009: return ERRNO(5) #... 3 line(s) skipped ceccomp-4.3.1/test/emu_result/libseccomp.open.casm000066400000000000000000000010471526046660400222330ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != x86_64) goto L0011 L0003: $A = $syscall_nr L0004: if ($A >= 0x40000000) goto L0011 L0005: if ($A == execveat) goto L0010 L0006: if ($A == execve) goto L0010 L0007: if ($A == fcntl) goto L0010 L0008: if ($A == exit) goto L0010 L0009: return ERRNO(5) #... 3 line(s) skipped ceccomp-4.3.1/test/emu_result/libseccomp.pipe.casm000066400000000000000000000010471526046660400222270ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != x86_64) goto L0011 L0003: $A = $syscall_nr L0004: if ($A >= 0x40000000) goto L0011 L0005: if ($A == execveat) goto L0010 L0006: if ($A == execve) goto L0010 L0007: if ($A == fcntl) goto L0010 L0008: if ($A == exit) goto L0010 L0009: return ERRNO(5) #... 3 line(s) skipped ceccomp-4.3.1/test/emu_result/multi_arch.accept.casm000066400000000000000000000023411526046660400225360ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != x86_64) goto L0008 L0003: $A = $syscall_nr L0004: if ($A >= 0x40000000) goto L0023 L0005: if ($A == accept) goto L0024 L0006: if ($A == listen) goto L0024 L0007: if ($A == bind) goto L0024, else goto L0023 L0008: if ($A != i386) goto L0013 L0009: $A = $syscall_nr L0010: if ($A == i386.restart_syscall) goto L0024 L0011: if ($A == i386.exit) goto L0024 L0012: if ($A == i386.fork) goto L0024, else goto L0023 L0013: if ($A != aarch64) goto L0018 L0014: $A = $syscall_nr L0015: if ($A == aarch64.alarm) goto L0024 L0016: if ($A == aarch64.select) goto L0024 L0017: if ($A == aarch64.pipe) goto L0024, else goto L0023 L0018: if ($A != arm) goto L0023 L0019: $A = $syscall_nr L0020: if ($A == arm.restart_syscall) goto L0024 L0021: if ($A == arm.readv) goto L0024 L0022: if ($A == arm.clone) goto L0024 L0023: return KILL L0024: return ALLOW #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/multi_arch.open.casm000066400000000000000000000023261526046660400222430ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != x86_64) goto L0008 L0003: $A = $syscall_nr L0004: if ($A >= 0x40000000) goto L0023 L0005: if ($A == accept) goto L0024 L0006: if ($A == listen) goto L0024 L0007: if ($A == bind) goto L0024, else goto L0023 L0008: if ($A != i386) goto L0013 L0009: $A = $syscall_nr L0010: if ($A == i386.restart_syscall) goto L0024 L0011: if ($A == i386.exit) goto L0024 L0012: if ($A == i386.fork) goto L0024, else goto L0023 L0013: if ($A != aarch64) goto L0018 L0014: $A = $syscall_nr L0015: if ($A == aarch64.alarm) goto L0024 L0016: if ($A == aarch64.select) goto L0024 L0017: if ($A == aarch64.pipe) goto L0024, else goto L0023 L0018: if ($A != arm) goto L0023 L0019: $A = $syscall_nr L0020: if ($A == arm.restart_syscall) goto L0024 L0021: if ($A == arm.readv) goto L0024 L0022: if ($A == arm.clone) goto L0024 L0023: return KILL #... 2 line(s) skipped ceccomp-4.3.1/test/emu_result/multi_arch.pipe.casm000066400000000000000000000023261526046660400222370ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != x86_64) goto L0008 L0003: $A = $syscall_nr L0004: if ($A >= 0x40000000) goto L0023 L0005: if ($A == accept) goto L0024 L0006: if ($A == listen) goto L0024 L0007: if ($A == bind) goto L0024, else goto L0023 L0008: if ($A != i386) goto L0013 L0009: $A = $syscall_nr L0010: if ($A == i386.restart_syscall) goto L0024 L0011: if ($A == i386.exit) goto L0024 L0012: if ($A == i386.fork) goto L0024, else goto L0023 L0013: if ($A != aarch64) goto L0018 L0014: $A = $syscall_nr L0015: if ($A == aarch64.alarm) goto L0024 L0016: if ($A == aarch64.select) goto L0024 L0017: if ($A == aarch64.pipe) goto L0024, else goto L0023 L0018: if ($A != arm) goto L0023 L0019: $A = $syscall_nr L0020: if ($A == arm.restart_syscall) goto L0024 L0021: if ($A == arm.readv) goto L0024 L0022: if ($A == arm.clone) goto L0024 L0023: return KILL #... 2 line(s) skipped ceccomp-4.3.1/test/emu_result/twctf-2016-diary.accept.casm000066400000000000000000000015041526046660400232320ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $syscall_nr L0002: if ($A != open) goto L0004 L0003: return KILL L0004: if ($A != openat) goto L0006 L0005: return KILL L0006: if ($A != execve) goto L0008 L0007: return KILL L0008: if ($A != clone) goto L0010 L0009: return KILL L0010: if ($A != fork) goto L0012 L0011: return KILL L0012: if ($A != vfork) goto L0014 L0013: return KILL L0014: if ($A != creat) goto L0016 L0015: return KILL L0016: if ($A != execveat) goto L0018 L0017: return KILL L0018: return ALLOW #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/twctf-2016-diary.open.casm000066400000000000000000000003551526046660400227370ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $syscall_nr L0002: if ($A != open) goto L0004 L0003: return KILL #... 16 line(s) skipped ceccomp-4.3.1/test/emu_result/twctf-2016-diary.pipe.casm000066400000000000000000000015041526046660400227300ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $syscall_nr L0002: if ($A != open) goto L0004 L0003: return KILL L0004: if ($A != openat) goto L0006 L0005: return KILL L0006: if ($A != execve) goto L0008 L0007: return KILL L0008: if ($A != clone) goto L0010 L0009: return KILL L0010: if ($A != fork) goto L0012 L0011: return KILL L0012: if ($A != vfork) goto L0014 L0013: return KILL L0014: if ($A != creat) goto L0016 L0015: return KILL L0016: if ($A != execveat) goto L0018 L0017: return KILL L0018: return ALLOW #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/x32.accept.casm000066400000000000000000000011511526046660400210210ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != i386) goto L0012 L0003: $A = $syscall_nr L0004: if ($A <= 0x40000000) goto L0012 L0005: if ($A == 0x40000000) goto L0012 L0006: if ($A == 0x40000001) goto L0012 L0007: if ($A == 0x400000ac) goto L0012 L0008: if ($A != 0x40000009) goto L0012 L0009: $A = $low_args[0] L0010: if ($A == 0x0) goto L0012 L0011: return ERRNO(5) L0012: return ALLOW #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/x32.open.casm000066400000000000000000000011511526046660400205230ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != i386) goto L0012 L0003: $A = $syscall_nr L0004: if ($A <= 0x40000000) goto L0012 L0005: if ($A == 0x40000000) goto L0012 L0006: if ($A == 0x40000001) goto L0012 L0007: if ($A == 0x400000ac) goto L0012 L0008: if ($A != 0x40000009) goto L0012 L0009: $A = $low_args[0] L0010: if ($A == 0x0) goto L0012 L0011: return ERRNO(5) L0012: return ALLOW #... 1 line(s) skipped ceccomp-4.3.1/test/emu_result/x32.pipe.casm000066400000000000000000000011511526046660400205170ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: $A = $arch L0002: if ($A != i386) goto L0012 L0003: $A = $syscall_nr L0004: if ($A <= 0x40000000) goto L0012 L0005: if ($A == 0x40000000) goto L0012 L0006: if ($A == 0x40000001) goto L0012 L0007: if ($A == 0x400000ac) goto L0012 L0008: if ($A != 0x40000009) goto L0012 L0009: $A = $low_args[0] L0010: if ($A == 0x0) goto L0012 L0011: return ERRNO(5) L0012: return ALLOW #... 1 line(s) skipped ceccomp-4.3.1/test/errors/000077500000000000000000000000001526046660400154345ustar00rootroot00000000000000ceccomp-4.3.1/test/errors/a01-unexpected-token000066400000000000000000000003621526046660400212210ustar00rootroot00000000000000Test unexpected token and number overflow STDIN $K = 0 $X = 0xffffffffff return ALLOW STDERR [WARN]: 1:1: Unexpected token $K = 0 ^ [WARN]: 2:6: Input number exceeds 32-bit range $X = 0xffffffffff ^ [ERROR]: Found errors when assembling ceccomp-4.3.1/test/errors/a02-labels000066400000000000000000000004361526046660400172040ustar00rootroot00000000000000Test duplicated labels and labels that are not found STDIN L1: if ($A == 0) goto L2 L1: return ALLOW STDERR [WARN]: 2:-: Can not find label declaration if ($A == 0) goto L2 ~~~~~~~~~~~~~~~~~~~~ [WARN]: 3:1: Found duplicated label declaration L1: ^ [ERROR]: Found errors when assembling ceccomp-4.3.1/test/errors/a03-return000066400000000000000000000010631526046660400172570ustar00rootroot00000000000000Test return related errors STDIN return ERRN return ERRNO return ERRNO( return ERRNO(2 return KILL(1) return return TRACE(10000000) STDERR [WARN]: 1:8: Expect return value return ERRN ^ [WARN]: 3:14: Expect number return ERRNO( ^ [WARN]: 4:15: Expect parenthesis return ERRNO(2 ^ [WARN]: 5:12: Unexpected token return KILL(1) ^ [WARN]: 6:7: Expect return value return ^ [WARN]: 7:-: Data carried by return motion exceeds 0xffff return TRACE(10000000) ~~~~~~~~~~~~~~~~~~~~~~ [ERROR]: Found errors when assembling ceccomp-4.3.1/test/errors/a04-assign-line000066400000000000000000000037521526046660400201610ustar00rootroot00000000000000Test assign line related errors STDIN $A = 0 $A = $X $A = $mem[0] $A = $mem[16] $A = $scmp_data_len $A = $arch $A = $low_args[ $A = $high_args[5 $A = $high_args[0x10] $X = 0 $X = $A $X = $mem[ $X = $mem[1] $X = $mem[16] $X = $scmp_data_len $X = $syscall_nr $X -= 0 $X = -$X $mem = $A $mem[4] = 0 $mem[5] = $A $mem[6] = $X $mem[0] = $mem[0] $A = $mem[5] $mem[7] = $syscall_nr $mem[5] -= 0 $A $A - 0 $A = $A + 0 $A = $A $X = $X $A -= 0 $A =- 0 $A =- $A $A = -$X $A += $mem[4] $A *= $X return $A STDERR [WARN]: 3:-: Accessing uninitialized mem $A = $mem[0] ~~~~~~~~~~~~ [WARN]: 4:-: Mem index out of range (0-15) $A = $mem[16] ~~~~~~~~~~~~~ [WARN]: 7:16: Expect number $A = $low_args[ ^ [WARN]: 8:18: Expect bracket $A = $high_args[5 ^ [WARN]: 9:-: Args index out of range (0-5) $A = $high_args[0x10] ~~~~~~~~~~~~~~~~~~~~~ [WARN]: 13:11: Expect number $X = $mem[ ^ [WARN]: 14:-: Accessing uninitialized mem $X = $mem[1] ~~~~~~~~~~~~ [WARN]: 15:-: Mem index out of range (0-15) $X = $mem[16] ~~~~~~~~~~~~~ [WARN]: 17:-: Lvalue should be '$A' $X = $syscall_nr ~~~~~~~~~~~~~~~~ [WARN]: 18:-: Operator should be '=' $X -= 0 ~~~~~~~ [WARN]: 19:-: Operator should be '=' $X = -$X ~~~~~~~~ [WARN]: 21:6: Expect bracket $mem = $A ^ [WARN]: 22:-: Rvalue should be '$A' or '$X' $mem[4] = 0 ~~~~~~~~~~~ [WARN]: 25:-: Rvalue should be '$A' or '$X' $mem[0] = $mem[0] ~~~~~~~~~~~~~~~~~ [WARN]: 27:-: Rvalue should be '$A' or '$X' $mem[7] = $syscall_nr ~~~~~~~~~~~~~~~~~~~~~ [WARN]: 28:-: Operator should be '=' $mem[5] -= 0 ~~~~~~~~~~~~ [WARN]: 30:3: Expect operator $A ^ [WARN]: 31:4: Expect operator $A - 0 ^ [WARN]: 32:9: Unexpected token $A = $A + 0 ^ [WARN]: 33:-: Rvalue can not be '$A' $A = $A ~~~~~~~ [WARN]: 34:-: Rvalue can not be '$X' $X = $X ~~~~~~~ [WARN]: 36:-: Rvalue should be '$A' $A =- 0 ~~~~~~~ [WARN]: 38:-: Rvalue should be '$A' $A = -$X ~~~~~~~~ [WARN]: 39:-: Rvalue should be '$X' or number $A += $mem[4] ~~~~~~~~~~~~~ [ERROR]: Found errors when assembling ceccomp-4.3.1/test/errors/a05-jump-line000066400000000000000000000140721526046660400176460ustar00rootroot00000000000000Test jump line related errors STDIN goto far goto outside goto 333 reverse: if ($A == 0) goto end if !($A == 0) goto end if !!($A == 0) goto end if $A if ($X) if ($A - 0) if ($A & $X) goto end if ($A != noidea) goto end if ($A == i386) goto end if ($A == ?) if ($A == i386.) goto end if ($A == 0) $A if ($A == 0) goto end, if ($A == 0) goto end, else if ($A == 0) goto reverse if ($A == 0) goto end, else goto reverse if ($A == 0) goto far if ($A != 0) goto end, else goto outside end: return ERRNO(1) return ERRNO(2) return ERRNO(3) return ERRNO(4) return ERRNO(5) return ERRNO(6) return ERRNO(7) return ERRNO(8) return ERRNO(9) return ERRNO(10) return ERRNO(11) return ERRNO(12) return ERRNO(13) return ERRNO(14) return ERRNO(15) return ERRNO(16) return ERRNO(17) return ERRNO(18) return ERRNO(19) return ERRNO(20) return ERRNO(21) return ERRNO(22) return ERRNO(23) return ERRNO(24) return ERRNO(25) return ERRNO(26) return ERRNO(27) return ERRNO(28) return ERRNO(29) return ERRNO(30) return ERRNO(31) return ERRNO(32) return ERRNO(33) return ERRNO(34) return ERRNO(35) return ERRNO(36) return ERRNO(37) return ERRNO(38) return ERRNO(39) return ERRNO(40) return ERRNO(41) return ERRNO(42) return ERRNO(43) return ERRNO(44) return ERRNO(45) return ERRNO(46) return ERRNO(47) return ERRNO(48) return ERRNO(49) return ERRNO(50) return ERRNO(51) return ERRNO(52) return ERRNO(53) return ERRNO(54) return ERRNO(55) return ERRNO(56) return ERRNO(57) return ERRNO(58) return ERRNO(59) return ERRNO(60) return ERRNO(61) return ERRNO(62) return ERRNO(63) return ERRNO(64) return ERRNO(65) return ERRNO(66) return ERRNO(67) return ERRNO(68) return ERRNO(69) return ERRNO(70) return ERRNO(71) return ERRNO(72) return ERRNO(73) return ERRNO(74) return ERRNO(75) return ERRNO(76) return ERRNO(77) return ERRNO(78) return ERRNO(79) return ERRNO(80) return ERRNO(81) return ERRNO(82) return ERRNO(83) return ERRNO(84) return ERRNO(85) return ERRNO(86) return ERRNO(87) return ERRNO(88) return ERRNO(89) return ERRNO(90) return ERRNO(91) return ERRNO(92) return ERRNO(93) return ERRNO(94) return ERRNO(95) return ERRNO(96) return ERRNO(97) return ERRNO(98) return ERRNO(99) return ERRNO(100) return ERRNO(101) return ERRNO(102) return ERRNO(103) return ERRNO(104) return ERRNO(105) return ERRNO(106) return ERRNO(107) return ERRNO(108) return ERRNO(109) return ERRNO(110) return ERRNO(111) return ERRNO(112) return ERRNO(113) return ERRNO(114) return ERRNO(115) return ERRNO(116) return ERRNO(117) return ERRNO(118) return ERRNO(119) return ERRNO(120) return ERRNO(121) return ERRNO(122) return ERRNO(123) return ERRNO(124) return ERRNO(125) return ERRNO(126) return ERRNO(127) return ERRNO(128) return ERRNO(129) return ERRNO(130) return ERRNO(131) return ERRNO(132) return ERRNO(133) return ERRNO(134) return ERRNO(135) return ERRNO(136) return ERRNO(137) return ERRNO(138) return ERRNO(139) return ERRNO(140) return ERRNO(141) return ERRNO(142) return ERRNO(143) return ERRNO(144) return ERRNO(145) return ERRNO(146) return ERRNO(147) return ERRNO(148) return ERRNO(149) return ERRNO(150) return ERRNO(151) return ERRNO(152) return ERRNO(153) return ERRNO(154) return ERRNO(155) return ERRNO(156) return ERRNO(157) return ERRNO(158) return ERRNO(159) return ERRNO(160) return ERRNO(161) return ERRNO(162) return ERRNO(163) return ERRNO(164) return ERRNO(165) return ERRNO(166) return ERRNO(167) return ERRNO(168) return ERRNO(169) return ERRNO(170) return ERRNO(171) return ERRNO(172) return ERRNO(173) return ERRNO(174) return ERRNO(175) return ERRNO(176) return ERRNO(177) return ERRNO(178) return ERRNO(179) return ERRNO(180) return ERRNO(181) return ERRNO(182) return ERRNO(183) return ERRNO(184) return ERRNO(185) return ERRNO(186) return ERRNO(187) return ERRNO(188) return ERRNO(189) return ERRNO(190) return ERRNO(191) return ERRNO(192) return ERRNO(193) return ERRNO(194) return ERRNO(195) return ERRNO(196) return ERRNO(197) return ERRNO(198) return ERRNO(199) return ERRNO(200) return ERRNO(201) return ERRNO(202) return ERRNO(203) return ERRNO(204) return ERRNO(205) return ERRNO(206) return ERRNO(207) return ERRNO(208) return ERRNO(209) return ERRNO(210) return ERRNO(211) return ERRNO(212) return ERRNO(213) return ERRNO(214) return ERRNO(215) return ERRNO(216) return ERRNO(217) return ERRNO(218) return ERRNO(219) return ERRNO(220) return ERRNO(221) return ERRNO(222) return ERRNO(223) return ERRNO(224) return ERRNO(225) return ERRNO(226) return ERRNO(227) return ERRNO(228) return ERRNO(229) return ERRNO(230) return ERRNO(231) return ERRNO(232) return ERRNO(233) return ERRNO(234) return ERRNO(235) return ERRNO(236) return ERRNO(237) return ERRNO(238) return ERRNO(239) return ERRNO(240) return ERRNO(241) return ERRNO(242) return ERRNO(243) return ERRNO(244) return ERRNO(245) return ERRNO(246) return ERRNO(247) return ERRNO(248) return ERRNO(249) return ERRNO(250) return ERRNO(251) return ERRNO(252) return ERRNO(253) return ERRNO(254) return ERRNO(255) return ERRNO(256) far:return KILL outside: STDERR [WARN]: 2:-: JA out of filters goto outside ~~~~~~~~~~~~ [WARN]: 3:6: Expect label goto 333 ^ [WARN]: 8:5: Expect parenthesis if !!($A == 0) goto end ^ [WARN]: 9:4: Expect parenthesis if $A ^ [WARN]: 10:5: Expect '$A' if ($X) ^ [WARN]: 11:8: Expect comparator if ($A - 0) ^ [WARN]: 13:11: Expect valid syscall name if ($A != noidea) goto end ^ [WARN]: 15:11: Unexpected token if ($A == ?) ^ [WARN]: 16:16: Expect valid syscall name if ($A == i386.) goto end ^ [WARN]: 17:14: Expect 'goto' if ($A == 0) $A ^ [WARN]: 18:23: Expect 'else' if ($A == 0) goto end, ^ [WARN]: 19:28: Expect 'goto' if ($A == 0) goto end, else ^ [WARN]: 21:-: JT must be positive if ($A == 0) goto reverse ~~~~~~~~~~~~~~~~~~~~~~~~~ [WARN]: 22:-: JF must be positive if ($A == 0) goto end, else goto reverse ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [WARN]: 23:-: JT is larger than 0xff if ($A == 0) goto far ~~~~~~~~~~~~~~~~~~~~~ [WARN]: 24:-: JF is larger than 0xff if ($A != 0) goto end, else goto outside ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ERROR]: Found errors when assembling ceccomp-4.3.1/test/errors/a06-jt-jf-out000066400000000000000000000005601526046660400175630ustar00rootroot00000000000000Test JT and JF out of filters STDIN if ($A > 0) goto outside if ($A <= 0) goto end, else goto outside end: return ALLOW outside: STDERR [WARN]: 1:-: JT out of filters if ($A > 0) goto outside ~~~~~~~~~~~~~~~~~~~~~~~~ [WARN]: 2:-: JF out of filters if ($A <= 0) goto end, else goto outside ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ERROR]: Found errors when assembling ceccomp-4.3.1/test/errors/a07-alu000066400000000000000000000004771526046660400165350ustar00rootroot00000000000000Test alu related errors STDIN $A <<= 64 $A >>= 0x100 $A /= 0 return ALLOW STDERR [WARN]: 1:-: Left or right shifting more than 32 bits $A <<= 64 ~~~~~~~~~ [WARN]: 2:-: Left or right shifting more than 32 bits $A >>= 0x100 ~~~~~~~~~~~~ [WARN]: 3:-: Dividing by zero $A /= 0 ~~~~~~~ [ERROR]: Found errors when assembling ceccomp-4.3.1/test/errors/a08-negative-ja000066400000000000000000000002501526046660400201340ustar00rootroot00000000000000Test unexpected negative JA STDIN back: $A = 0 goto back return ALLOW STDERR [WARN]: 3:-: JA must be positive goto back ~~~~~~~~~ [ERROR]: Found errors when assembling ceccomp-4.3.1/test/errors/b01-invalid-operation000066400000000000000000000020501526046660400213600ustar00rootroot00000000000000Test 5+ invalid operations with normal operations STDIN 00 00 00 00 00 00 00 00 ff ff 00 ff 00 ff 00 ff 13 37 13 37 13 37 13 37 de ad be ef de ad be ef ca fe ba be ca fe ba be 7f 45 4c 46 7f 45 4c 46 fe dc ba 98 76 54 32 10 ff ee dd cc bb aa 99 88 06 00 00 00 00 00 ff 7f STDERR [WARN]: #2: Invalid or unknown operation CODE:0xffff JT:0x00 JF:0xff K:0xff00ff00 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [WARN]: #3: Invalid or unknown operation CODE:0x3713 JT:0x13 JF:0x37 K:0x37133713 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [WARN]: #4: Invalid or unknown operation CODE:0xadde JT:0xbe JF:0xef K:0xefbeadde ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [WARN]: #5: Invalid or unknown operation CODE:0xfeca JT:0xba JF:0xbe K:0xbebafeca ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [WARN]: #6: Invalid or unknown operation CODE:0x457f JT:0x4c JF:0x46 K:0x464c457f ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [WARN]: #7: Invalid or unknown operation CODE:0xdcfe JT:0xba JF:0x98 K:0x10325476 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [ERROR]: Found fatal errors when disassembling ceccomp-4.3.1/test/errors/b02-invalid-load-offset000066400000000000000000000006731526046660400215750ustar00rootroot00000000000000Test invalid load offset with normal operations STDIN 20 00 00 00 05 00 00 00 20 00 00 00 40 00 00 00 06 00 00 00 00 00 ff 7f STDERR [WARN]: #1: seccomp_data load offset must be 4-byte aligned CODE:0x0021 JT:0x00 JF:0x00 K:0x00000005 ^ [WARN]: #2: seccomp_data load offset greater than the struct CODE:0x0021 JT:0x00 JF:0x00 K:0x00000040 ^ [ERROR]: Found fatal errors when disassembling ceccomp-4.3.1/test/errors/b03-alu-error000066400000000000000000000020141526046660400176460ustar00rootroot00000000000000Test ALU loading errors and index overflow and no return STDIN 60 00 00 00 00 00 00 00 60 00 00 00 10 00 00 00 34 00 00 00 00 00 00 00 64 00 00 00 7f 00 00 00 STDOUT #Label CODE JT JF K #--------------------------------- L0001: 0x60 0x00 0x00 0x00000000 $A = $mem[0x0] L0002: 0x60 0x00 0x00 0x00000010 $A = $mem[0x10] L0003: 0x34 0x00 0x00 0x00000000 $A /= 0x0 L0004: 0x64 0x00 0x00 0x0000007f $A <<= 0x7f #--------------------------------- STDERR [WARN]: #1: Accessing uninitialized mem CODE:0x0060 JT:0x00 JF:0x00 K:0x00000000 ^ [WARN]: #2: Mem index out of range (0-15) CODE:0x0060 JT:0x00 JF:0x00 K:0x00000010 ^ [WARN]: #3: Dividing by zero CODE:0x0034 JT:0x00 JF:0x00 K:0x00000000 ^ [WARN]: #4: Left or right shifting more than 32 bits CODE:0x0064 JT:0x00 JF:0x00 K:0x0000007f ^ [WARN]: #4: BPF filters must end with return CODE:0x0064 JT:0x00 JF:0x00 K:0x0000007f ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ceccomp-4.3.1/test/errors/b04-jump-error000066400000000000000000000016301526046660400200440ustar00rootroot00000000000000Test jumping out of filters STDIN 05 00 00 00 00 30 00 00 15 00 09 00 00 00 00 00 15 00 00 21 00 00 00 00 15 00 ee dd 00 00 00 00 06 00 00 00 00 00 ff 7f STDOUT #Label CODE JT JF K #--------------------------------- L0001: 0x05 0x00 0x00 0x00003000 goto L12290 L0002: 0x15 0x09 0x00 0x00000000 if ($A == 0x0) goto L0012 L0003: 0x15 0x00 0x21 0x00000000 if ($A != 0x0) goto L0037 L0004: 0x15 0xee 0xdd 0x00000000 if ($A == 0x0) goto L0243, else goto L0226 L0005: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- STDERR [WARN]: #1: JA out of filters CODE:0x0005 JT:0x00 JF:0x00 K:0x00003000 ^ [WARN]: #2: JT out of filters CODE:0x0015 JT:0x09 JF:0x00 K:0x00000000 ^ [WARN]: #3: JF out of filters CODE:0x0015 JT:0x00 JF:0x21 K:0x00000000 ^ [WARN]: #4: JT out of filters CODE:0x0015 JT:0xee JF:0xdd K:0x00000000 ^ ceccomp-4.3.1/test/errors/b05-empty-input000066400000000000000000000002351526046660400202360ustar00rootroot00000000000000Test empty input with some leftover STDIN 31 32 33 34 35 STDERR [WARN]: 5 byte(s) at the end of input could not fit into a filter [WARN]: The input is empty ceccomp-4.3.1/test/errors/b06-ebpf-empty-input000066400000000000000000000002741526046660400211540ustar00rootroot00000000000000Test empty input with some leftover but in ebpf mode CLI disasm -e STDIN 31 32 33 34 35 STDERR [WARN]: 5 byte(s) at the end of input could not fit into a filter [WARN]: The input is empty ceccomp-4.3.1/test/errors/e01-asm-comparators000066400000000000000000000024261526046660400210560ustar00rootroot00000000000000Test comparators in asm CLI asm - -a x86_64 -f hexfmt STDIN if ($A == 0) goto end if ($A == 0) goto end, else goto kill if ($A != 0) goto end if ($A != 0) goto end, else goto kill if ($A > 0) goto end if ($A > 0) goto end, else goto kill if ($A <= 0) goto end if ($A <= 0) goto end, else goto kill if ($A >= 0) goto end if ($A >= 0) goto end, else goto kill if ($A < 0) goto end if ($A < 0) goto end, else goto kill if ($A & 0xff) goto end if ($A & 0xff) goto end, else goto kill if !($A & 0xff) goto end if !($A & 0xff) goto end, else goto kill return ERRNO(1) # separator end: return ALLOW kill: return KILL STDOUT "\x15\x00\x10\x00\x00\x00\x00\x00", "\x15\x00\x0f\x10\x00\x00\x00\x00", "\x15\x00\x00\x0e\x00\x00\x00\x00", "\x15\x00\x0e\x0d\x00\x00\x00\x00", "\x25\x00\x0c\x00\x00\x00\x00\x00", "\x25\x00\x0b\x0c\x00\x00\x00\x00", "\x25\x00\x00\x0a\x00\x00\x00\x00", "\x25\x00\x0a\x09\x00\x00\x00\x00", "\x35\x00\x08\x00\x00\x00\x00\x00", "\x35\x00\x07\x08\x00\x00\x00\x00", "\x35\x00\x00\x06\x00\x00\x00\x00", "\x35\x00\x06\x05\x00\x00\x00\x00", "\x45\x00\x04\x00\xff\x00\x00\x00", "\x45\x00\x03\x04\xff\x00\x00\x00", "\x45\x00\x00\x02\xff\x00\x00\x00", "\x45\x00\x02\x01\xff\x00\x00\x00", "\x06\x00\x00\x00\x01\x00\x05\x00", "\x06\x00\x00\x00\x00\x00\xff\x7f", "\x06\x00\x00\x00\x00\x00\x00\x00", ceccomp-4.3.1/test/errors/e02-disasm-comparators000066400000000000000000000034761526046660400215650ustar00rootroot00000000000000Test comparators in disasm CLI disasm - -a x86_64 STDIN 15 00 10 00 00 00 00 00 15 00 0f 10 00 00 00 00 15 00 00 0e 00 00 00 00 15 00 0e 0d 00 00 00 00 25 00 0c 00 00 00 00 00 25 00 0b 0c 00 00 00 00 25 00 00 0a 00 00 00 00 25 00 0a 09 00 00 00 00 35 00 08 00 00 00 00 00 35 00 07 08 00 00 00 00 35 00 00 06 00 00 00 00 35 00 06 05 00 00 00 00 45 00 04 00 ff 00 00 00 45 00 03 04 ff 00 00 00 45 00 00 02 ff 00 00 00 45 00 02 01 ff 00 00 00 06 00 00 00 01 00 05 00 06 00 00 00 00 00 ff 7f 06 00 00 00 00 00 00 00 STDOUT #Label CODE JT JF K #--------------------------------- L0001: 0x15 0x10 0x00 0x00000000 if ($A == 0x0) goto L0018 L0002: 0x15 0x0f 0x10 0x00000000 if ($A == 0x0) goto L0018, else goto L0019 L0003: 0x15 0x00 0x0e 0x00000000 if ($A != 0x0) goto L0018 L0004: 0x15 0x0e 0x0d 0x00000000 if ($A == 0x0) goto L0019, else goto L0018 L0005: 0x25 0x0c 0x00 0x00000000 if ($A > 0x0) goto L0018 L0006: 0x25 0x0b 0x0c 0x00000000 if ($A > 0x0) goto L0018, else goto L0019 L0007: 0x25 0x00 0x0a 0x00000000 if ($A <= 0x0) goto L0018 L0008: 0x25 0x0a 0x09 0x00000000 if ($A > 0x0) goto L0019, else goto L0018 L0009: 0x35 0x08 0x00 0x00000000 if ($A >= 0x0) goto L0018 L0010: 0x35 0x07 0x08 0x00000000 if ($A >= 0x0) goto L0018, else goto L0019 L0011: 0x35 0x00 0x06 0x00000000 if ($A < 0x0) goto L0018 L0012: 0x35 0x06 0x05 0x00000000 if ($A >= 0x0) goto L0019, else goto L0018 L0013: 0x45 0x04 0x00 0x000000ff if ($A & 0xff) goto L0018 L0014: 0x45 0x03 0x04 0x000000ff if ($A & 0xff) goto L0018, else goto L0019 L0015: 0x45 0x00 0x02 0x000000ff if !($A & 0xff) goto L0018 L0016: 0x45 0x02 0x01 0x000000ff if ($A & 0xff) goto L0019, else goto L0018 L0017: 0x06 0x00 0x00 0x00050001 return ERRNO(1) L0018: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0019: 0x06 0x00 0x00 0x00000000 return KILL #--------------------------------- ceccomp-4.3.1/test/errors/e03-asm-stx000066400000000000000000000002441526046660400173400ustar00rootroot00000000000000Test if $mem[0] = $X works CLI asm - -a x86_64 -f hexfmt STDIN $mem[0] = $X return 0 STDOUT "\x03\x00\x00\x00\x00\x00\x00\x00", "\x06\x00\x00\x00\x00\x00\x00\x00", ceccomp-4.3.1/test/errors/e04-mem-idx-access000066400000000000000000000003501526046660400205420ustar00rootroot00000000000000Test if emu emulate $mem[idx] correctly CLI emu - 1 STDIN $A = 0x500 $mem[1] = $A $A = 0x501 $mem[0] = $A $A = $mem[1] return $A STDOUT $A = 0x500 $mem[0x1] = $A $A = 0x501 $mem[0x0] = $A $A = $mem[0x1] return $A # $A = 0x500, KILL ceccomp-4.3.1/test/errors/e05-mem-idx-spread000066400000000000000000000012661526046660400205670ustar00rootroot00000000000000Test if disasm spread $mem[idx] correctly CLI disasm - -a x86_64 STDIN 20 00 00 00 00 00 00 00 02 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 60 00 00 00 05 00 00 00 15 00 01 00 3b 00 00 00 06 00 00 00 00 00 ff 7f 06 00 00 00 00 00 ff 7f STDOUT #Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0002: 0x02 0x00 0x00 0x00000005 $mem[0x5] = $A L0003: 0x00 0x00 0x00 0x00000000 $A = 0x0 L0004: 0x60 0x00 0x00 0x00000005 $A = $mem[0x5] L0005: 0x15 0x01 0x00 0x0000003b if ($A == execve) goto L0007 L0006: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0007: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- ceccomp-4.3.1/test/errors/e06-a-div-x000066400000000000000000000002661526046660400172200ustar00rootroot00000000000000Test emulate A / X, X = 0 case CLI emu - 1 STDIN $A = 0x1337 $X = 0 $A /= $X return $A STDOUT $A = 0x1337 $X = 0 $A /= $X # $X == 0, returning 0 (KILL) on FPE #... 1 line(s) skipped ceccomp-4.3.1/test/errors/e07-disasm-track-large000066400000000000000000000425771526046660400214410ustar00rootroot00000000000000Test if disasm is able to track more than 256 lines CLI disasm - -a x86_64 STDIN 20 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 15 00 00 00 00 00 00 00 15 00 00 00 3b 00 00 00 06 00 00 00 00 00 ff 7f STDOUT #Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0002: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0003: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0004: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0005: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0006: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0007: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0008: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0009: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0010: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0011: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0012: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0013: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0014: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0015: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0016: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0017: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0018: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0019: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0020: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0021: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0022: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0023: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0024: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0025: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0026: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0027: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0028: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0029: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0030: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0031: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0032: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0033: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0034: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0035: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0036: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0037: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0038: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0039: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0040: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0041: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0042: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0043: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0044: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0045: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0046: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0047: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0048: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0049: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0050: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0051: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0052: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0053: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0054: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0055: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0056: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0057: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0058: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0059: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0060: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0061: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0062: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0063: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0064: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0065: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0066: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0067: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0068: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0069: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0070: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0071: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0072: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0073: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0074: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0075: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0076: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0077: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0078: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0079: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0080: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0081: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0082: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0083: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0084: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0085: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0086: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0087: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0088: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0089: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0090: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0091: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0092: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0093: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0094: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0095: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0096: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0097: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0098: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0099: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0100: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0101: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0102: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0103: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0104: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0105: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0106: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0107: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0108: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0109: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0110: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0111: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0112: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0113: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0114: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0115: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0116: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0117: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0118: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0119: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0120: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0121: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0122: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0123: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0124: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0125: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0126: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0127: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0128: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0129: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0130: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0131: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0132: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0133: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0134: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0135: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0136: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0137: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0138: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0139: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0140: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0141: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0142: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0143: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0144: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0145: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0146: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0147: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0148: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0149: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0150: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0151: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0152: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0153: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0154: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0155: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0156: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0157: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0158: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0159: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0160: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0161: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0162: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0163: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0164: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0165: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0166: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0167: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0168: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0169: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0170: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0171: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0172: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0173: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0174: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0175: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0176: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0177: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0178: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0179: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0180: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0181: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0182: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0183: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0184: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0185: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0186: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0187: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0188: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0189: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0190: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0191: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0192: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0193: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0194: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0195: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0196: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0197: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0198: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0199: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0200: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0201: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0202: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0203: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0204: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0205: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0206: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0207: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0208: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0209: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0210: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0211: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0212: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0213: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0214: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0215: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0216: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0217: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0218: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0219: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0220: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0221: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0222: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0223: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0224: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0225: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0226: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0227: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0228: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0229: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0230: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0231: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0232: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0233: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0234: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0235: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0236: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0237: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0238: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0239: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0240: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0241: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0242: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0243: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0244: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0245: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0246: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0247: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0248: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0249: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0250: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0251: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0252: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0253: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0254: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0255: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0256: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0257: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0258: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0259: 0x01 0x00 0x00 0x00000000 $X = 0x0 L0260: 0x15 0x00 0x00 0x00000000 if ($A == read) goto L0261 L0261: 0x15 0x00 0x00 0x0000003b if ($A == execve) goto L0262 L0262: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- ceccomp-4.3.1/test/errors/e08-disasm-notify000066400000000000000000000003671526046660400205450ustar00rootroot00000000000000Test if disasm is able to decode NOTIFY CLI disasm - -a x86_64 STDIN 06 00 00 00 00 00 c0 7f STDOUT #Label CODE JT JF K #--------------------------------- L0001: 0x06 0x00 0x00 0x7fc00000 return NOTIFY #--------------------------------- ceccomp-4.3.1/test/errors/e09-trace-no-arg000066400000000000000000000001051526046660400202250ustar00rootroot00000000000000Test ceccomp trace should fail CLI trace STDIN STDOUT $STANDARD_HELP ceccomp-4.3.1/test/errors/e10-emu-no-arg000066400000000000000000000001011526046660400177010ustar00rootroot00000000000000Test ceccomp emu should fail CLI emu STDIN STDOUT $STANDARD_HELP ceccomp-4.3.1/test/errors/e11-invalid-arch000066400000000000000000000002221526046660400203000ustar00rootroot00000000000000Test if cli accepts invalid arch name CLI asm - -a whatever STDIN return ALLOW STDOUT STDERR [ERROR]: Architecture name whatever is not supported ceccomp-4.3.1/test/errors/e12-lex-whole-word000066400000000000000000000004551526046660400206250ustar00rootroot00000000000000Test if ceccomp accepts token pattern like ifx CLI asm - -f hexfmt -a x86_64 STDIN goto ifx goto ALLOWx goto s390xx ALLOWx: s390xx: ifx: return ALLOW STDOUT "\x05\x00\x00\x00\x02\x00\x00\x00", "\x05\x00\x00\x00\x01\x00\x00\x00", "\x05\x00\x00\x00\x00\x00\x00\x00", "\x06\x00\x00\x00\x00\x00\xff\x7f", ceccomp-4.3.1/test/errors/e13-emu-lsh-rsh-overflow000066400000000000000000000003471526046660400217560ustar00rootroot00000000000000Test if ceccomp allow emulates $X = 33, $A <<= $X and behaves the same as what kernel does CLI emu - 0 STDIN $A = 0x7fff000 $X = 0x24 $A <<= $X return $A STDOUT $A = 0x7fff000 $X = 0x24 $A <<= $X return $A # $A = 0x7fff0000, ALLOW ceccomp-4.3.1/test/errors/e14-format-c-macro000066400000000000000000000050721526046660400205610ustar00rootroot00000000000000Tests if c-macro format accepts all valid instructions CLI asm - -a x86_64 -f c-macro STDIN goto end $A = $syscall_nr $A = $arch $A = $low_pc $A = $high_pc $A = $low_args[0] $A = $low_args[5] $A = $high_args[0] $A = $high_args[5] if ($A == $X) goto end if ($A < i386) goto end if !($A & prctl) goto end if ($A == x86_64.seccomp) goto end if ($A == 3333) goto end return NOTIFY return TRACE(32) return TRAP(0) return ERRNO return 0x3333 end: $A = $scmp_data_len $X = $scmp_data_len $A += 3 $A -= $X $A *= 5 $A /= $X $A &= 0xffffffff $A |= $X $A <<= 1 $A >>= 1 $A ^= 2 $A = -$A $A = 32 $X = 64 $A = $X $X = $A $mem[1] = $X $A = $mem[1] $mem[2] = $A $X = $mem[2] return $A STDOUT BPF_JUMP(BPF_JMP | BPF_JA, 0x12, 0, 0), BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, nr)), BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, arch)), BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, instruction_pointer)), BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, instruction_pointer) + 4), BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0])), BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[5])), BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[0]) + 4), BPF_STMT(BPF_LD | BPF_W | BPF_ABS, offsetof(struct seccomp_data, args[5]) + 4), BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_X, 0, 9, 0), BPF_JUMP(BPF_JMP | BPF_JGE | BPF_K, SCMP_ARCH_X86, 0, 8), BPF_JUMP(BPF_JMP | BPF_JSET | BPF_K, SYS_prctl, 0, 7), BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0x13d, 6, 0), BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0xd05, 5, 0), BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_USER_NOTIF), BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_TRACE | 0x20), BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_TRAP | 0), BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ERRNO | 0), BPF_STMT(BPF_RET | BPF_K, 0x3333), BPF_STMT(BPF_LD | BPF_W | BPF_LEN, 0), BPF_STMT(BPF_LDX | BPF_W | BPF_LEN, 0), BPF_STMT(BPF_ALU | BPF_ADD | BPF_K, 0x3), BPF_STMT(BPF_ALU | BPF_SUB | BPF_X, 0), BPF_STMT(BPF_ALU | BPF_MUL | BPF_K, 0x5), BPF_STMT(BPF_ALU | BPF_DIV | BPF_X, 0), BPF_STMT(BPF_ALU | BPF_AND | BPF_K, 0xffffffff), BPF_STMT(BPF_ALU | BPF_OR | BPF_X, 0), BPF_STMT(BPF_ALU | BPF_LSH | BPF_K, 0x1), BPF_STMT(BPF_ALU | BPF_RSH | BPF_K, 0x1), BPF_STMT(BPF_ALU | BPF_XOR | BPF_K, 0x2), BPF_STMT(BPF_ALU | BPF_NEG, 0), BPF_STMT(BPF_LD | BPF_IMM, 0x20), BPF_STMT(BPF_LDX | BPF_IMM, 0x40), BPF_STMT(BPF_MISC | BPF_TXA, 0), BPF_STMT(BPF_MISC | BPF_TAX, 0), BPF_STMT(BPF_STX, 0x1), BPF_STMT(BPF_LD | BPF_MEM, 0x1), BPF_STMT(BPF_ST, 0x2), BPF_STMT(BPF_LDX | BPF_MEM, 0x2), BPF_STMT(BPF_RET | BPF_A, 0), ceccomp-4.3.1/test/shared_vars.py000066400000000000000000000063611526046660400170010ustar00rootroot00000000000000from __future__ import annotations import os import platform import subprocess from dataclasses import dataclass from pathlib import Path from sys import stdin from types import SimpleNamespace from pytest import skip PROJ_DIR = Path(__file__).parent.parent TEST_DIR = PROJ_DIR / 'test' TXT_DIR = TEST_DIR / 'text' BPF_DIR = TEST_DIR / 'bpf' EMU_DIR = TEST_DIR / 'emu_result' BE_DIR = TEST_DIR / 'big_endian_cases' EBPF_DIR = TEST_DIR / 'ebpf-blobs' ERR_CASE_DIR = TEST_DIR / 'errors' CECCOMP = str(PROJ_DIR / 'build' / 'ceccomp') FILENAMES = sorted([p.stem.removesuffix('.casm') for p in TXT_DIR.iterdir()]) COMMON_OPTS = ['-c', 'always', '-a', 'x86_64'] def run_process( argv: list[str], is_binary: bool=False, extra_fd: int | None=None, stdin: str | bytes | None=None, ) -> tuple[int, str | bytes, str | bytes]: if extra_fd is None: result = subprocess.run(argv, timeout=5, capture_output=True, text=not is_binary, input=stdin) else: result = subprocess.run(argv, timeout=5, capture_output=True, text=not is_binary, pass_fds=(extra_fd, ), input=stdin) return result.returncode, result.stdout, result.stderr _, _verstr, _ = run_process(['pkg-config', '--modversion', 'libseccomp'], False) SKIP_CHROMIUM = tuple(_verstr.split('.')) < ('2', '5', '6') SKIP_REASON = 'libseccomp too old (<2.5.6)' def maybe_skip(filename: str): if SKIP_CHROMIUM and filename == 'chromium': skip(SKIP_REASON) def filter2text(filters: bytes) -> str: length = len(filters) # leftover (less than 8 bytes) will be discarded return '\n'.join(filters[i:i + 8].hex(' ') for i in range(0, length, 8)) os.environ['LC_ALL'] = 'C' TIER_1_ARCH = [ # tested 'x86_64', 'i386', 'i686', 'riscv64', 'loongarch64', 'aarch64', 'ppc', 'ppc64le', 's390x', 'arm', 'armv8l', 'armv7l', ] TIER_2_ARCH = [ # untested, but listed in libseccomp 'x32', 'parisc', 'parisc64', 'mips', 'm68k', 's390', 'ppc64', 'sh', 'sh4', 'shel', ] XFAIL_DYNAMIC = platform.machine() not in TIER_1_ARCH \ or (platform.machine() == 'x86_64' and platform.architecture()[0] == '32bit') XFAIL_REASON = 'Dynamic test may fail on this unsupported platform' STANDARD_HELP = run_process([CECCOMP, 'help'])[1] def slice_lines(text: str, positions: list[int]) -> list[str | None]: items = [] for pos_idx, item_idx in enumerate(positions): if item_idx == -1: items.append(None) continue for iter_idx in range(pos_idx + 1, len(positions)): iter_item_idx = positions[iter_idx] if iter_item_idx != -1: items.append(text[text.find('\n', item_idx) + 1: iter_item_idx]) break else: items.append(text[text.find('\n', item_idx) + 1:]) continue return items @dataclass class CornerCaseFile: cli: str | None stdin: str stdout: str | None stderr: str | None @staticmethod def parse(content: str) -> 'CornerCaseFile': pos_list = [ content.find('CLI'), content.find('STDIN'), content.find('STDOUT'), content.find('STDERR'), ] return CornerCaseFile(*slice_lines(content, pos_list)) ceccomp-4.3.1/test/test_asm.py000066400000000000000000000026261526046660400163170ustar00rootroot00000000000000import pytest from shared_vars import * @pytest.mark.parametrize('filename', FILENAMES) def test_asm(filename: str, errns: SimpleNamespace): maybe_skip(filename) input_file = TXT_DIR / f'{filename}.casm' expect_file = BPF_DIR / f'{filename}.bpf' _, stdout, stderr = run_process( [CECCOMP, 'asm', *COMMON_OPTS, '-f', 'raw', str(input_file)], True, ) errns.stderr = stderr.decode() with expect_file.open('rb') as expect: assert filter2text(stdout) == filter2text(expect.read()) def test_s390x_asm(errns: SimpleNamespace): input_file = BE_DIR / 's390x.casm' expect_file = BE_DIR / 's390x.hexfmt' _, stdout, stderr = run_process( [CECCOMP, 'asm', '-f', 'hexfmt', str(input_file), '-a', 's390x'], ) errns.stderr = stderr with expect_file.open() as expect: assert stdout == expect.read() ERROR_IDS = sorted([p.stem[1:] for p in ERR_CASE_DIR.glob('a*')]) @pytest.mark.parametrize('errorid', ERROR_IDS) def test_error_cases(errorid: str): chunk_file = ERR_CASE_DIR / f'a{errorid}' with chunk_file.open() as f: blob = f.read() parsed = CornerCaseFile.parse(blob) assert parsed.stdin assert parsed.stderr _, _, stderr = run_process( # error case for asm will not print to stdout, # so no need to specify arch [CECCOMP, 'asm', '-'], stdin=parsed.stdin, ) assert stderr == parsed.stderr ceccomp-4.3.1/test/test_disasm.py000066400000000000000000000042651526046660400170200ustar00rootroot00000000000000import pytest from shared_vars import * @pytest.mark.parametrize('filename', FILENAMES) def test_disasm(filename: str, errns: SimpleNamespace): maybe_skip(filename) input_file = BPF_DIR / f'{filename}.bpf' expect_file = TXT_DIR / f'{filename}.casm' _, stdout, stderr = run_process( [CECCOMP, 'disasm', *COMMON_OPTS, str(input_file)], ) errns.stderr = stderr with expect_file.open('r') as expect: assert stdout == expect.read() def test_s390x_disasm(errns: SimpleNamespace): input_file = BE_DIR / 's390x.bpf' expect_file = BE_DIR / 's390x.disasm.casm' _, stdout, stderr = run_process( [CECCOMP, 'disasm', str(input_file), '-a', 's390x'], ) errns.stderr = stderr with expect_file.open() as expect: assert stdout == expect.read() def test_normal_ebpf_disasm(errns: SimpleNamespace): input_file = EBPF_DIR / 'normal.bin' expect_file = EBPF_DIR / 'expected.casm' _, stdout, stderr = run_process( [CECCOMP, 'disasm', '-ea', 'x86_64', str(input_file)], ) errns.stderr = stderr with expect_file.open() as expect: assert stdout == expect.read() def test_hardened_ebpf_disasm(errns: SimpleNamespace): input_file = EBPF_DIR / 'hardened.bin' expect_file = EBPF_DIR / 'expected.casm' _, stdout, stderr = run_process( [CECCOMP, 'disasm', '-ea', 'x86_64', str(input_file)], ) errns.stderr = stderr with expect_file.open() as expect: assert stdout == expect.read() ERROR_IDS = sorted([p.stem[1:] for p in ERR_CASE_DIR.glob('b*')]) @pytest.mark.parametrize('errorid', ERROR_IDS) def test_error_cases(errorid: str): chunk_file = ERR_CASE_DIR / f'b{errorid}' with chunk_file.open() as f: blob = f.read() parsed = CornerCaseFile.parse(blob) assert parsed.stdin assert parsed.stderr args = ['-a', 'x86_64'] if parsed.cli and '-e' in parsed.cli: args.append('-e') stdin = bytes.fromhex(parsed.stdin) _, stdout, stderr = run_process( [CECCOMP, 'disasm', '-', *args], stdin=stdin, is_binary=True, ) assert stderr.decode() == parsed.stderr if parsed.stdout: assert stdout.decode() == parsed.stdout ceccomp-4.3.1/test/test_dynamic.py000066400000000000000000000256661526046660400171740ustar00rootroot00000000000000import platform import select import signal import time from enum import IntEnum from subprocess import DEVNULL, PIPE import pytest from shared_vars import * class UnitTests(IntEnum): TRACE = 0 PROBE = 1 SEIZE = 2 TRACE_PID = 3 FLAGS = 4 LOTS_OF_FILTERS = 5 CAPTURE = 6 def arg(self) -> str: return str(self.value) capeff = None # cache capeff def lookup_self_caps() -> str | int: global capeff if capeff is not None: return capeff try: with open('/proc/self/status') as f: for line in f: if line.startswith('CapEff:'): capeff = int(line.split()[1], 16) break else: return 'Capability can not be found in status' except OSError: return 'Can not query /proc to know capability' return capeff def is_not_cap_sys_admin() -> str | None: capeff = lookup_self_caps() if isinstance(capeff, str): return capeff if bool(capeff & (1 << 21)): # CAP_SYS_ADMIN = 21 return None return 'Lack of CAP_SYS_ADMIN capability' def is_not_cap_bpf() -> str | None: capeff = lookup_self_caps() if isinstance(capeff, str): return capeff if capeff & ((1 << 39) | (1 << 38)) == ((1 << 39) | (1 << 38)): # CAP_BPF + CAP_PERFMON return None if bool(capeff & (1 << 21)): # CAP_SYS_ADMIN = 21 return None return 'Incapable of loading eBPF' kver, libbpf_enabled = None, None def does_not_support_capture(pid_mode: bool) -> str | None: global kver, libbpf_enabled if libbpf_enabled is None: _, stdout, _ = run_process([CECCOMP, 'version']) libbpf_idx = stdout.find('libbpf') assert libbpf_idx != -1 libbpf_enabled = stdout.find('-', libbpf_idx) == -1 if not libbpf_enabled: return 'capture module opted out' if kver is None: krel = platform.release().split('.') kver = (int(krel[0]), int(krel[1])) if (not pid_mode and kver < (5, 15)) or (pid_mode and kver < (6, 2)): return 'Kernel too old' if msg := is_not_cap_bpf(): return msg return None TEST_BIN = PROJ_DIR / 'build' / 'test' TEST_SRC = PROJ_DIR / 'test' / 'unit_test.c' if not TEST_BIN.exists() or TEST_BIN.stat().st_mtime <= TEST_SRC.stat().st_mtime: assert run_process(['make', '-C', str(PROJ_DIR), 'test'], False)[0] == 0 TEST = str(TEST_BIN) def pid_state(pid: int) -> str | None: """ Race condition: perhaps kernel killed process but ceccomp hasn't exit, so test is zombie and not being collected. Test this case """ try: os.kill(pid, 0) except ProcessLookupError: return None try: with open(f'/proc/{pid}/stat') as f: state = f.read().split(' ', 4)[2] except: return None else: return None if state == 'Z' else state def filter_execve_k(text: str) -> str: lines = text.splitlines() for i, line in enumerate(lines): if 'execve' in line or 'sendfile' in line or 'ptrace' in line: lines[i] = line[:23] + ' MAY VARY ' + line[33:] return '\n'.join(lines) def fill_pid(log: str, pid: int) -> str: idx = log.find('------') assert idx != -1 prefix = f'PID={pid} ' return log[:idx] + prefix + log[idx + len(prefix):] # -a x86_64 option in COMMON_OPTS will be ignored in trace/probe ##### TEST CASES ##### @pytest.mark.xfail(XFAIL_DYNAMIC, reason=XFAIL_REASON) def test_probe(errns: SimpleNamespace): piper, pipew = os.pipe() os.set_inheritable(pipew, True) argv = [CECCOMP, 'probe', *COMMON_OPTS, '-o', f'/proc/self/fd/{pipew}', TEST, UnitTests.PROBE.arg()] _, stdout, stderr = run_process(argv, False, pipew) os.close(pipew) errns.stderr = stderr expect_file = TEST_DIR / 'dyn_log' / 'probe.log' with expect_file.open() as f: expect = f.read() with os.fdopen(piper) as f: assert f.read() == expect pid = int(stdout.split('=')[1]) end = time.time() + 3 while pid_state(pid) and time.time() < end: time.sleep(0.0625) last_state = pid_state(pid) assert last_state is None or last_state == 'X' @pytest.mark.xfail(XFAIL_DYNAMIC, reason=XFAIL_REASON) def test_trace(errns: SimpleNamespace): piper, pipew = os.pipe() os.set_inheritable(pipew, True) argv = [CECCOMP, 'trace', *COMMON_OPTS, '-o', f'/proc/self/fd/{pipew}', TEST, UnitTests.TRACE.arg()] _, stdout, stderr = run_process(argv, False, pipew) os.close(pipew) errns.stderr = stderr pid = int(stdout.split('=')[1]) expect_file = TEST_DIR / 'dyn_log' / 'trace.log' with expect_file.open() as f: expect = fill_pid(f.read(), pid) with os.fdopen(piper) as f: assert filter_execve_k(f.read()) == filter_execve_k(expect) assert 'WARN' in stderr @pytest.mark.xfail(XFAIL_DYNAMIC, reason=XFAIL_REASON) def test_seize(errns: SimpleNamespace): efd = os.eventfd(0, 0) tp = subprocess.Popen([TEST, UnitTests.SEIZE.arg(), str(efd)], stdin=DEVNULL, stdout=PIPE, stderr=DEVNULL, text=True, pass_fds=(efd,)) pid = int(tp.stdout.readline().split('=')[1]) argv = [CECCOMP, 'trace', *COMMON_OPTS, '-p', str(pid), '-s'] cp = subprocess.Popen(argv, stdin=DEVNULL, stdout=PIPE, stderr=PIPE, text=True) pre_line = cp.stderr.readline() os.eventfd_write(efd, 1) rl, _, _ = select.select([tp.stdout], [], [], 2) if rl: pid = int(rl[0].readline().split('=')[1]) # child pid else: with open(f'/proc/{tp.pid}/wchan') as f: t_kfunc = f.read() with open(f'/proc/{cp.pid}/wchan') as f: c_kfunc = f.read() errns.stderr = f'TEST in {t_kfunc}\nCECCOMP in {c_kfunc}' tp.terminate() cp.terminate() tp.wait(0.5) cp.wait(0.5) assert False, 'Found signal race condition? Pls report to upstream' cp.terminate() stdout, stderr = cp.communicate() errns.stderr = pre_line + stderr cp.wait(0.5) pid_exist = True try: os.kill(pid, 0) except ProcessLookupError: pid_exist = False else: os.eventfd_write(efd, 1) assert pid_exist is True assert tp.wait(0.5) == 0 expect_file = TEST_DIR / 'dyn_log' / 'trace.log' with expect_file.open() as f: expect = filter_execve_k(fill_pid(f.read(), pid)) assert filter_execve_k(stdout) == expect @pytest.mark.xfail(XFAIL_DYNAMIC, reason=XFAIL_REASON) def test_trace_pid(errns: SimpleNamespace): if msg := is_not_cap_sys_admin(): pytest.skip(msg) efd = os.eventfd(0, 0) tp = subprocess.Popen([TEST, UnitTests.TRACE_PID.arg(), str(efd)], stdin=DEVNULL, stdout=PIPE, stderr=DEVNULL, text=True, pass_fds=(efd,)) pid = int(tp.stdout.readline().split('=')[1]) _, stdout, stderr = run_process( [CECCOMP, 'trace', *COMMON_OPTS, '-p', str(pid)], ) errns.stderr = stderr os.eventfd_write(efd, 1) assert tp.wait(0.5) == 0 expect_file = TEST_DIR / 'dyn_log' / 'trace.log' with expect_file.open() as f: expect = filter_execve_k(fill_pid(f.read(), pid)) assert filter_execve_k(stdout) == expect @pytest.mark.xfail(XFAIL_DYNAMIC, reason=XFAIL_REASON) def test_seccomp_flags(errns: SimpleNamespace): piper, pipew = os.pipe() os.set_inheritable(pipew, True) argv = [CECCOMP, 'trace', *COMMON_OPTS, '-o', f'/proc/self/fd/{pipew}', TEST, UnitTests.FLAGS.arg()] _, stdout, stderr = run_process(argv, False, pipew) os.close(pipew) pid = int(stdout.split('=')[1]) errns.stderr = stderr expect_file = TEST_DIR / 'dyn_log' / 'trace.log' with expect_file.open() as f: expect = fill_pid(f.read(), pid) with os.fdopen(piper) as f: assert filter_execve_k(f.read()) == filter_execve_k(expect) expect_file = TEST_DIR / 'dyn_log' / 'flag_stderr.log' with expect_file.open() as f: assert stderr.replace(str(pid), '$PID') == f.read() @pytest.mark.xfail(XFAIL_DYNAMIC, reason=XFAIL_REASON) def test_capture_global(errns: SimpleNamespace): if reason := does_not_support_capture(False): pytest.skip(reason) cp = subprocess.Popen([CECCOMP, 'capture', '-c', 'always'], stdin=DEVNULL, stdout=PIPE, stderr=PIPE, text=True) os.set_blocking(cp.stdout.fileno(), False) expect_file = TEST_DIR / 'dyn_log' / 'trace.log' with expect_file.open() as f: expect = f.read() end = time.time() + 10 while time.time() < end: _, pid_text, _ = run_process([TEST, UnitTests.TRACE.arg()]) pid = int(pid_text.split('=')[1]) disasm = filter_execve_k(fill_pid(expect, pid)) rl, _, _ = select.select([cp.stdout], [], [], 0.375) if not rl: continue if disasm in filter_execve_k(cp.stdout.read()): break time.sleep(0.125) else: cp.terminate() _, errns.stderr = cp.communicate() cp.wait(0.5) if 'libbpf: failed to load BPF skeleton' in errns.stderr: pytest.xfail('Can not load skeleton') pytest.fail('Can not see expected output after 10s') cp.terminate() _, stderr = cp.communicate() cp.wait(0.5) errns.stderr = stderr assert f'{pid} (test)' in stderr @pytest.mark.xfail(XFAIL_DYNAMIC, reason=XFAIL_REASON) def test_capture_pid(errns: SimpleNamespace): if reason := does_not_support_capture(True): pytest.skip(reason) efd = os.eventfd(0, 0) tp = subprocess.Popen([TEST, UnitTests.TRACE_PID.arg(), str(efd)], stdin=DEVNULL, stdout=PIPE, stderr=DEVNULL, text=True, pass_fds=(efd,)) pid = int(tp.stdout.readline().split('=')[1]) _, stdout, stderr = run_process( [CECCOMP, 'capture', '-c', 'always', '-p', str(pid)], ) errns.stderr = stderr if 'libbpf: failed to load BPF skeleton' in stderr: pytest.xfail('Can not load skeleton') os.eventfd_write(efd, 1) assert tp.wait(0.5) == 0 assert f'{pid} has 1 seccomp filter(s)' in stderr expect_file = TEST_DIR / 'dyn_log' / 'trace.log' with expect_file.open() as f: expect = filter_execve_k(f.read()) assert filter_execve_k(stdout) == expect @pytest.mark.xfail(XFAIL_DYNAMIC, reason=XFAIL_REASON) def test_capture_pid_too_many(errns: SimpleNamespace): if reason := does_not_support_capture(True): pytest.skip(reason) efd = os.eventfd(0, 0) tp = subprocess.Popen([TEST, UnitTests.LOTS_OF_FILTERS.arg(), str(efd)], stdin=DEVNULL, stdout=PIPE, stderr=PIPE, text=True, pass_fds=(efd,)) pid = int(tp.stdout.readline().split('=')[1]) _, stdout, stderr = run_process([CECCOMP, 'capture', '-p', str(pid)]) errns.stderr = stderr if 'libbpf: failed to load BPF skeleton' in stderr: pytest.xfail('Can not load skeleton') os.eventfd_write(efd, 1) assert tp.wait(0.5) == 0 assert stdout.count('#Label') == 32 assert f'{pid} has 40 seccomp filter(s)' in stderr assert 'Too many seccomp filters (> 32)' in stderr ceccomp-4.3.1/test/test_edge_case.py000066400000000000000000000053661526046660400174420ustar00rootroot00000000000000import pytest from shared_vars import * def test_asm_large_file(): _, _, stderr = run_process( [CECCOMP, 'asm', '/dev/zero'], ) assert stderr == '[ERROR]: The input file is greater than 4 MiB!\n' def test_asm_no_lf(): _, _, stderr = run_process( [CECCOMP, 'asm', '-'], stdin='1' * 0x400, ) assert stderr == "[ERROR]: No line break in source file, perhaps it's not a text file?\n" def test_asm_long_line(): _, _, stderr = run_process( [CECCOMP, 'asm', '-'], stdin='\n\n' + '1' * 0x400 + '\n', ) assert stderr == '[ERROR]: Line 3 has more than 384 bytes, perhaps the input is not a text file?\n' def test_asm_many_lines(): _, _, stderr = run_process( [CECCOMP, 'asm', '-'], stdin='\n' * 0x4001, ) assert stderr == "[ERROR]: Found more than 16384 lines of text, perhaps it's not for ceccomp?\n" def test_asm_0_file(): _, _, stderr = run_process( [CECCOMP, 'asm', '-'], stdin='\n\n\0\n', ) assert stderr == "[ERROR]: Found '\\0' at file offset 2, perhaps it's not a text file?\n" def test_asm_empty_file(): _, _, stderr = run_process( [CECCOMP, 'asm', '-'], stdin='# \n', ) assert stderr == '[ERROR]: The input does not contain any valid statement\n' def test_asm_4096_statements(errns: SimpleNamespace): exit_code, _, stderr = run_process( [CECCOMP, 'asm', '-'], stdin='return ALLOW\n\n' * 4096, ) errns.stderr = stderr assert exit_code == 0 def test_asm_4097_statements(): _, _, stderr = run_process( [CECCOMP, 'asm', '-'], stdin='return ALLOW\n' * 4097, ) assert stderr == '[ERROR]: Input file has more than 4096 statements!\n' def test_disasm_large_file(): _, _, stderr = run_process( [CECCOMP, 'disasm', '/dev/zero'], ) assert stderr == '[ERROR]: The input is larger than 4096 filters! Perhaps inputting a wrong file?\n' EDGE_IDS = sorted([p.stem[1:] for p in ERR_CASE_DIR.glob('e*')]) @pytest.mark.parametrize('edgeid', EDGE_IDS) def test_edge_cases(errns: SimpleNamespace, edgeid: str): chunk_file = ERR_CASE_DIR / f'e{edgeid}' with chunk_file.open() as f: blob = f.read() parsed = CornerCaseFile.parse(blob) assert parsed.cli cli = parsed.cli.strip().split() stdin = parsed.stdin is_disasm = cli[0] == 'disasm' if is_disasm: stdin = bytes.fromhex(parsed.stdin) _, stdout, stderr = run_process( [CECCOMP, *cli], stdin=stdin, is_binary=is_disasm, ) errns.stderr = stderr if is_disasm: assert stdout.decode() == parsed.stdout elif parsed.stdout.rstrip() == '$STANDARD_HELP': assert stdout == STANDARD_HELP else: assert stdout == parsed.stdout if parsed.stderr: assert stderr == parsed.stderr ceccomp-4.3.1/test/test_emu.py000066400000000000000000000040751526046660400163250ustar00rootroot00000000000000import pytest from shared_vars import * EMU_TARGETS = [] for filename in FILENAMES: EMU_TARGETS.append((filename, 'accept')) EMU_TARGETS.append((filename, 'open')) EMU_TARGETS.append((filename, 'pipe')) @pytest.mark.parametrize('filename, suffix', EMU_TARGETS) def test_emu(filename: str, suffix: str, errns: SimpleNamespace): maybe_skip(filename) input_file = TXT_DIR / f'{filename}.casm' expect_file = EMU_DIR / f'{filename}.{suffix}.casm' emu_args = [suffix, '1', '2', '3', '4', '5', '6'] _, stdout, stderr = run_process( [CECCOMP, 'emu', *COMMON_OPTS, str(input_file), *emu_args], ) errns.stderr = stderr with expect_file.open('r') as expect: assert stdout == expect.read() def test_s390x_emu(errns: SimpleNamespace): input_file = BE_DIR / 's390x.casm' expect_file = BE_DIR / 's390x.mmap.casm' _, stdout, stderr = run_process( [CECCOMP, 'emu', str(input_file), 'mmap', '-a', 's390x'], ) errns.stderr = stderr with expect_file.open() as expect: assert stdout == expect.read() def test_return_A(errns: SimpleNamespace): input_str = '$A = 0x50005\nreturn $A\n' _, stdout, stderr = run_process( [CECCOMP, 'emu', '-', '1', '-q'], stdin=input_str, ) errns.stderr = stderr assert stdout == 'ERRNO(5)\n' def test_return_A_long(errns: SimpleNamespace): input_str = 'return $A\n' _, stdout, stderr = run_process( [CECCOMP, 'emu', '-', '1'], stdin=input_str, ) errns.stderr = stderr assert stdout == 'return $A # $A = 0, KILL\n' def test_return_number(errns: SimpleNamespace): input_str = 'return 0x13371337\n' _, stdout, stderr = run_process( [CECCOMP, 'emu', '-', '1', '-q'], stdin=input_str, ) errns.stderr = stderr assert stdout == 'KILL_PROCESS\n' def test_return_number_long(errns: SimpleNamespace): input_str = 'return 0x7ff01000\n' _, stdout, stderr = run_process( [CECCOMP, 'emu', '-', '1'], stdin=input_str, ) errns.stderr = stderr assert stdout == 'return 0x7ff01000 # TRACE(4096)\n' ceccomp-4.3.1/test/text/000077500000000000000000000000001526046660400151045ustar00rootroot00000000000000ceccomp-4.3.1/test/text/CONFidence-2017-amigo.casm000066400000000000000000000151161526046660400213330ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000004 $A = $arch L0002: 0x15 0x00 0x01 0x40000003 if ($A != i386) goto L0004 L0003: 0x05 0x00 0x00 0x0000000a goto L0014 L0004: 0x20 0x00 0x00 0x00000038 $A = $low_args[5] L0005: 0x02 0x00 0x00 0x00000000 $mem[0x0] = $A L0006: 0x20 0x00 0x00 0x0000003c $A = $high_args[5] L0007: 0x02 0x00 0x00 0x00000001 $mem[0x1] = $A L0008: 0x15 0x00 0x03 0x03133731 if ($A != 0x3133731) goto L0012 L0009: 0x60 0x00 0x00 0x00000000 $A = $mem[0x0] L0010: 0x15 0x02 0x00 0x33731337 if ($A == 0x33731337) goto L0013 L0011: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0012: 0x06 0x00 0x00 0x00000000 return KILL L0013: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0014: 0x05 0x00 0x00 0x00000000 goto L0015 L0015: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0016: 0x15 0x00 0x01 0x000003e7 if ($A != 0x3e7) goto L0018 L0017: 0x06 0x00 0x00 0x0005053b return ERRNO(1339) L0018: 0x15 0x00 0x01 0x00000004 if ($A != 0x4) goto L0020 L0019: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0020: 0x15 0x00 0x01 0x00000092 if ($A != 0x92) goto L0022 L0021: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0022: 0x15 0x00 0x01 0x00000003 if ($A != 0x3) goto L0024 L0023: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0024: 0x15 0x00 0x01 0x000000c5 if ($A != 0xc5) goto L0026 L0025: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0026: 0x15 0x00 0x01 0x0000008c if ($A != 0x8c) goto L0028 L0027: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0028: 0x15 0x00 0x01 0x000000fc if ($A != 0xfc) goto L0030 L0029: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0030: 0x15 0x00 0x01 0x000000c0 if ($A != 0xc0) goto L0032 L0031: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0032: 0x15 0x00 0x01 0x000000af if ($A != 0xaf) goto L0034 L0033: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0034: 0x15 0x00 0x01 0x000000ae if ($A != 0xae) goto L0036 L0035: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0036: 0x15 0x00 0x01 0x0000002d if ($A != 0x2d) goto L0038 L0037: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0038: 0x15 0x00 0x01 0x00000025 if ($A != 0x25) goto L0040 L0039: 0x05 0x00 0x00 0x0000000f goto L0055 L0040: 0x15 0x00 0x01 0x00000101 if ($A != 0x101) goto L0042 L0041: 0x05 0x00 0x00 0x00000023 goto L0077 L0042: 0x15 0x00 0x01 0x0000010e if ($A != 0x10e) goto L0044 L0043: 0x06 0x00 0x00 0x00050000 return ERRNO(0) L0044: 0x15 0x00 0x01 0x00000005 if ($A != 0x5) goto L0046 L0045: 0x06 0x00 0x00 0x0005007e return ERRNO(126) L0046: 0x15 0x00 0x01 0x00000088 if ($A != 0x88) goto L0048 L0047: 0x06 0x00 0x00 0x0005007e return ERRNO(126) L0048: 0x15 0x00 0x01 0x00000014 if ($A != 0x14) goto L0050 L0049: 0x06 0x00 0x00 0x00050539 return ERRNO(1337) L0050: 0x15 0x00 0x01 0x000000e0 if ($A != 0xe0) goto L0052 L0051: 0x06 0x00 0x00 0x00050539 return ERRNO(1337) L0052: 0x15 0x00 0x01 0x00000038 if ($A != 0x38) goto L0054 L0053: 0x06 0x00 0x00 0x7ff00000 return TRACE(0) L0054: 0x06 0x00 0x00 0x00000000 return KILL L0055: 0x05 0x00 0x00 0x00000000 goto L0056 L0056: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0057: 0x02 0x00 0x00 0x00000000 $mem[0x0] = $A L0058: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0059: 0x02 0x00 0x00 0x00000001 $mem[0x1] = $A L0060: 0x15 0x00 0x03 0x00000000 if ($A != 0x0) goto L0064 L0061: 0x60 0x00 0x00 0x00000000 $A = $mem[0x0] L0062: 0x15 0x02 0x00 0x00001d93 if ($A == 0x1d93) goto L0065 L0063: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0064: 0x06 0x00 0x00 0x00000000 return KILL L0065: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0066: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0067: 0x02 0x00 0x00 0x00000000 $mem[0x0] = $A L0068: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0069: 0x02 0x00 0x00 0x00000001 $mem[0x1] = $A L0070: 0x15 0x00 0x03 0x00000000 if ($A != 0x0) goto L0074 L0071: 0x60 0x00 0x00 0x00000000 $A = $mem[0x0] L0072: 0x15 0x02 0x00 0x00000013 if ($A == 0x13) goto L0075 L0073: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0074: 0x06 0x00 0x00 0x00000000 return KILL L0075: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0076: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0077: 0x05 0x00 0x00 0x00000000 goto L0078 L0078: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0079: 0x02 0x00 0x00 0x00000000 $mem[0x0] = $A L0080: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0081: 0x02 0x00 0x00 0x00000001 $mem[0x1] = $A L0082: 0x15 0x00 0x03 0xffffffff if ($A != 0xffffffff) goto L0086 L0083: 0x60 0x00 0x00 0x00000000 $A = $mem[0x0] L0084: 0x15 0x02 0x00 0xffffff9c if ($A == 0xffffff9c) goto L0087 L0085: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0086: 0x06 0x00 0x00 0x00000000 return KILL L0087: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0088: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0089: 0x02 0x00 0x00 0x00000000 $mem[0x0] = $A L0090: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0091: 0x02 0x00 0x00 0x00000001 $mem[0x1] = $A L0092: 0x15 0x00 0x03 0x12345678 if ($A != 0x12345678) goto L0096 L0093: 0x60 0x00 0x00 0x00000000 $A = $mem[0x0] L0094: 0x15 0x02 0x00 0x00000000 if ($A == 0x0) goto L0097 L0095: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0096: 0x06 0x00 0x00 0x00000000 return KILL L0097: 0x60 0x00 0x00 0x00000001 $A = $mem[0x1] L0098: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- ceccomp-4.3.1/test/text/DEF-CON-2020-bdooos.casm000066400000000000000000000032341526046660400206320ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000004 $A = $arch L0002: 0x15 0x00 0x10 0xc00000b7 if ($A != aarch64) goto L0019 L0003: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0004: 0x15 0x0d 0x00 0x0000001d if ($A == aarch64.ioctl) goto L0018 L0005: 0x15 0x0c 0x00 0x0000003f if ($A == aarch64.read) goto L0018 L0006: 0x15 0x0b 0x00 0x00000040 if ($A == aarch64.write) goto L0018 L0007: 0x15 0x0a 0x00 0x00000049 if ($A == aarch64.ppoll) goto L0018 L0008: 0x15 0x09 0x00 0x0000005e if ($A == aarch64.exit_group) goto L0018 L0009: 0x15 0x08 0x00 0x00000062 if ($A == aarch64.futex) goto L0018 L0010: 0x15 0x07 0x00 0x00000084 if ($A == aarch64.sigaltstack) goto L0018 L0011: 0x15 0x06 0x00 0x00000086 if ($A == aarch64.rt_sigaction) goto L0018 L0012: 0x15 0x05 0x00 0x0000008b if ($A == aarch64.rt_sigreturn) goto L0018 L0013: 0x15 0x04 0x00 0x000000ce if ($A == aarch64.sendto) goto L0018 L0014: 0x15 0x03 0x00 0x000000cf if ($A == aarch64.recvfrom) goto L0018 L0015: 0x15 0x02 0x00 0x000000d0 if ($A == aarch64.setsockopt) goto L0018 L0016: 0x15 0x01 0x00 0x000000d7 if ($A == aarch64.munmap) goto L0018 L0017: 0x06 0x00 0x00 0x80000000 return KILL_PROCESS L0018: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0019: 0x06 0x00 0x00 0x00000000 return KILL #--------------------------------- ceccomp-4.3.1/test/text/chromium.casm000066400000000000000000001351001526046660400175740ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000004 $A = $arch L0002: 0x15 0x01 0x00 0xc000003e if ($A == x86_64) goto L0004 L0003: 0x06 0x00 0x00 0x0003000a return TRAP(10) L0004: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0005: 0x45 0x00 0x01 0x40000000 if !($A & 0x40000000) goto L0007 L0006: 0x06 0x00 0x00 0x00030009 return TRAP(9) L0007: 0x25 0x00 0x4a 0x00000092 if ($A <= sched_get_priority_max) goto L0082 L0008: 0x25 0x00 0x24 0x0000010e if ($A <= pselect6) goto L0045 L0009: 0x25 0x00 0x12 0x0000012f if ($A <= name_to_handle_at) goto L0028 L0010: 0x25 0x00 0x09 0x0000014d if ($A <= io_pgetevents) goto L0020 L0011: 0x25 0x00 0x05 0x000001b4 if ($A <= close_range) goto L0017 L0012: 0x25 0x00 0x03 0x000001b8 if ($A <= process_madvise) goto L0016 L0013: 0x25 0x00 0x01 0x000001ce if ($A <= mseal) goto L0015 L0014: 0x25 0x00 0x42 0x000001cf if ($A <= setxattrat) goto L0081 L0015: 0x05 0x00 0x00 0x0000024c goto L0604 L0016: 0x35 0x9a 0xff 0x000001b7 if ($A >= faccessat2) goto L0171, else goto L0272 L0017: 0x25 0x00 0x01 0x0000014f if ($A <= uretprobe) goto L0019 L0018: 0x35 0x99 0xfd 0x000001b2 if ($A >= pidfd_open) goto L0172, else goto L0272 L0019: 0x35 0x3d 0xfc 0x0000014e if ($A >= rseq) goto L0081, else goto L0272 L0020: 0x25 0x00 0x04 0x00000140 if ($A <= kexec_file_load) goto L0025 L0021: 0x25 0x00 0x02 0x0000014a if ($A <= pkey_alloc) goto L0024 L0022: 0x25 0x00 0x96 0x0000014b if ($A <= pkey_free) goto L0173 L0023: 0x35 0x8c 0x39 0x0000014c if ($A >= statx) goto L0164, else goto L0081 L0024: 0x35 0x86 0xf7 0x00000149 if ($A >= pkey_mprotect) goto L0159, else goto L0272 L0025: 0x25 0x00 0x01 0x0000013e if ($A <= getrandom) goto L0027 L0026: 0x35 0x36 0x99 0x0000013f if ($A >= memfd_create) goto L0081, else goto L0180 L0027: 0x35 0x8f 0xf4 0x0000013c if ($A >= renameat2) goto L0171, else goto L0272 L0028: 0x25 0x00 0x08 0x0000011e if ($A <= timerfd_settime) goto L0037 L0029: 0x25 0x00 0x04 0x00000125 if ($A <= pipe2) goto L0034 L0030: 0x25 0x00 0x02 0x00000129 if ($A <= rt_tgsigqueueinfo) goto L0033 L0031: 0x25 0x00 0xa2 0x0000012a if ($A <= perf_event_open) goto L0194 L0032: 0x35 0x9a 0xef 0x0000012e if ($A >= prlimit64) goto L0187, else goto L0272 L0033: 0x35 0xee 0xa7 0x00000126 if ($A >= inotify_init1) goto L0272, else goto L0201 L0034: 0x25 0x00 0x01 0x00000121 if ($A <= signalfd4) goto L0036 L0035: 0x35 0x2d 0xec 0x00000122 if ($A >= eventfd2) goto L0081, else goto L0272 L0036: 0x35 0x86 0xeb 0x00000120 if ($A >= accept4) goto L0171, else goto L0272 L0037: 0x25 0x00 0x04 0x00000118 if ($A <= utimensat) goto L0042 L0038: 0x25 0x00 0x02 0x0000011a if ($A <= signalfd) goto L0041 L0039: 0x25 0x00 0xe8 0x0000011c if ($A <= eventfd) goto L0272 L0040: 0x35 0x82 0x28 0x0000011d if ($A >= fallocate) goto L0171, else goto L0081 L0041: 0x35 0x27 0x81 0x00000119 if ($A >= epoll_pwait) goto L0081, else goto L0171 L0042: 0x25 0x00 0x01 0x00000111 if ($A <= set_robust_list) goto L0044 L0043: 0x35 0xe4 0x25 0x00000112 if ($A >= get_robust_list) goto L0272, else goto L0081 L0044: 0x35 0xe3 0x24 0x00000110 if ($A >= unshare) goto L0272, else goto L0081 L0045: 0x25 0x00 0x11 0x000000d4 if ($A <= lookup_dcookie) goto L0063 L0046: 0x25 0x00 0x08 0x000000e7 if ($A <= exit_group) goto L0055 L0047: 0x25 0x00 0x04 0x000000f7 if ($A <= waitid) goto L0052 L0048: 0x25 0x00 0x02 0x00000101 if ($A <= openat) goto L0051 L0049: 0x25 0x00 0x79 0x00000106 if ($A <= newfstatat) goto L0171 L0050: 0x35 0x78 0x9d 0x00000107 if ($A >= unlinkat) goto L0171, else goto L0208 L0051: 0x35 0xdc 0x1d 0x000000f8 if ($A >= add_key) goto L0272, else goto L0081 L0052: 0x25 0x00 0x01 0x000000eb if ($A <= utimes) goto L0054 L0053: 0x35 0xda 0x75 0x000000ec if ($A >= vserver) goto L0272, else goto L0171 L0054: 0x35 0x4b 0x1a 0x000000ea if ($A >= tgkill) goto L0130, else goto L0081 L0055: 0x25 0x00 0x04 0x000000da if ($A <= set_tid_address) goto L0060 L0056: 0x25 0x00 0x02 0x000000dc if ($A <= semtimedop) goto L0059 L0057: 0x25 0x00 0x71 0x000000dd if ($A <= fadvise64) goto L0171 L0058: 0x35 0x96 0xd5 0x000000e4 if ($A >= clock_gettime) goto L0209, else goto L0272 L0059: 0x35 0x15 0xd4 0x000000db if ($A >= restart_syscall) goto L0081, else goto L0272 L0060: 0x25 0x00 0x01 0x000000d6 if ($A <= epoll_ctl_old) goto L0062 L0061: 0x35 0x6d 0xd2 0x000000d9 if ($A >= getdents64) goto L0171, else goto L0272 L0062: 0x35 0x12 0x6c 0x000000d5 if ($A >= epoll_create) goto L0081, else goto L0171 L0063: 0x25 0x00 0x09 0x000000ae if ($A <= create_module) goto L0073 L0064: 0x25 0x00 0x04 0x000000c9 if ($A <= time) goto L0069 L0065: 0x25 0x00 0x02 0x000000cb if ($A <= sched_setaffinity) goto L0068 L0066: 0x25 0x00 0xcd 0x000000cc if ($A <= sched_getaffinity) goto L0272 L0067: 0x35 0xcc 0x16 0x000000cd if ($A >= set_thread_area) goto L0272, else goto L0090 L0068: 0x35 0xcc 0x0c 0x000000ca if ($A >= futex) goto L0273, else goto L0081 L0069: 0x25 0x00 0x02 0x000000bb if ($A <= readahead) goto L0072 L0070: 0x25 0x00 0xc9 0x000000c8 if ($A <= tkill) goto L0272 L0071: 0x05 0x00 0x00 0x000001b3 goto L0507 L0072: 0x35 0x08 0xc7 0x000000ba if ($A >= gettid) goto L0081, else goto L0272 L0073: 0x25 0x00 0x04 0x0000009d if ($A <= prctl) goto L0078 L0074: 0x25 0x00 0x02 0x000000a0 if ($A <= setrlimit) goto L0077 L0075: 0x25 0x00 0x05 0x000000a1 if ($A <= chroot) goto L0081 L0076: 0x35 0x5e 0xc3 0x000000ac if ($A >= iopl) goto L0171, else goto L0272 L0077: 0x35 0xc2 0xfb 0x0000009e if ($A >= arch_prctl) goto L0272, else goto L0329 L0078: 0x25 0x00 0x01 0x00000095 if ($A <= mlock) goto L0080 L0079: 0x35 0xc0 0x01 0x00000097 if ($A >= mlockall) goto L0272, else goto L0081 L0080: 0x35 0xbf 0x00 0x00000094 if ($A >= sched_rr_get_interval) goto L0272 L0081: 0x05 0x00 0x00 0x00000209 goto L0603 L0082: 0x25 0x00 0x25 0x0000004c if ($A <= truncate) goto L0120 L0083: 0x25 0x00 0x13 0x00000076 if ($A <= getresuid) goto L0103 L0084: 0x25 0x00 0x0a 0x00000081 if ($A <= rt_sigqueueinfo) goto L0095 L0085: 0x25 0x00 0x06 0x00000088 if ($A <= ustat) goto L0092 L0086: 0x25 0x00 0x04 0x0000008c if ($A <= getpriority) goto L0091 L0087: 0x35 0x01 0x00 0x0000008e if ($A >= sched_setparam) goto L0089 L0088: 0x05 0x00 0x00 0x00000133 goto L0396 L0089: 0x25 0x00 0xb6 0x0000008f if ($A <= sched_getparam) goto L0272 L0090: 0x05 0x00 0x00 0x00000122 goto L0381 L0091: 0x35 0xb4 0x4f 0x0000008a if ($A >= fstatfs) goto L0272, else goto L0171 L0092: 0x25 0x00 0x01 0x00000084 if ($A <= utime) goto L0094 L0093: 0x35 0xb2 0x4d 0x00000087 if ($A >= personality) goto L0272, else goto L0171 L0094: 0x35 0xf9 0xb1 0x00000083 if ($A >= sigaltstack) goto L0344, else goto L0272 L0095: 0x25 0x00 0x04 0x0000007a if ($A <= setfsuid) goto L0100 L0096: 0x25 0x00 0x02 0x0000007e if ($A <= capset) goto L0099 L0097: 0x25 0x00 0x49 0x0000007f if ($A <= rt_sigpending) goto L0171 L0098: 0x35 0xf5 0xad 0x00000080 if ($A >= rt_sigtimedwait) goto L0344, else goto L0272 L0099: 0x35 0xf4 0x47 0x0000007c if ($A >= getsid) goto L0344, else goto L0171 L0100: 0x25 0x00 0x01 0x00000078 if ($A <= getresgid) goto L0102 L0101: 0x35 0xaa 0xf2 0x00000079 if ($A >= getpgid) goto L0272, else goto L0344 L0102: 0x35 0x44 0xf1 0x00000077 if ($A >= setresgid) goto L0171, else goto L0344 L0103: 0x25 0x00 0x08 0x00000068 if ($A <= getgid) goto L0112 L0104: 0x25 0x00 0x04 0x0000006e if ($A <= getppid) goto L0109 L0105: 0x25 0x00 0x02 0x00000071 if ($A <= setreuid) goto L0108 L0106: 0x25 0x00 0x40 0x00000073 if ($A <= getgroups) goto L0171 L0107: 0x35 0x3f 0xec 0x00000074 if ($A >= setgroups) goto L0171, else goto L0344 L0108: 0x35 0xa3 0xeb 0x0000006f if ($A >= getpgrp) goto L0272, else goto L0344 L0109: 0x25 0x00 0x01 0x0000006b if ($A <= geteuid) goto L0111 L0110: 0x35 0xa1 0xe9 0x0000006d if ($A >= setpgid) goto L0272, else goto L0344 L0111: 0x35 0x3b 0xe8 0x00000069 if ($A >= setuid) goto L0171, else goto L0344 L0112: 0x25 0x00 0x04 0x00000062 if ($A <= getrusage) goto L0117 L0113: 0x25 0x00 0x02 0x00000065 if ($A <= ptrace) goto L0116 L0114: 0x25 0x00 0x9d 0x00000066 if ($A <= getuid) goto L0272 L0115: 0x35 0x9c 0xe4 0x00000067 if ($A >= syslog) goto L0272, else goto L0344 L0116: 0x35 0xe3 0x9b 0x00000063 if ($A >= sysinfo) goto L0344, else goto L0272 L0117: 0x25 0x00 0x01 0x0000004e if ($A <= getdents) goto L0119 L0118: 0x35 0xe1 0x34 0x00000060 if ($A >= gettimeofday) goto L0344, else goto L0171 L0119: 0x35 0xe0 0x33 0x0000004d if ($A >= ftruncate) goto L0344, else goto L0171 L0120: 0x25 0x00 0x16 0x00000020 if ($A <= dup) goto L0143 L0121: 0x25 0x00 0x0b 0x00000038 if ($A <= clone) goto L0133 L0122: 0x25 0x00 0x05 0x0000003f if ($A <= uname) goto L0128 L0123: 0x25 0x00 0x03 0x00000048 if ($A <= fcntl) goto L0127 L0124: 0x35 0x01 0x00 0x00000049 if ($A >= flock) goto L0126 L0125: 0x05 0x00 0x00 0x00000123 goto L0417 L0126: 0x35 0xd9 0x91 0x0000004a if ($A >= fsync) goto L0344, else goto L0272 L0127: 0x35 0x2b 0xd8 0x00000040 if ($A >= semget) goto L0171, else goto L0344 L0128: 0x25 0x00 0x02 0x0000003c if ($A <= exit) goto L0131 L0129: 0x25 0x00 0xd6 0x0000003e if ($A <= kill) goto L0344 L0130: 0x05 0x00 0x00 0x00000171 goto L0500 L0131: 0x35 0x27 0x00 0x00000039 if ($A >= fork) goto L0171 L0132: 0x05 0x00 0x00 0x00000177 goto L0508 L0133: 0x25 0x00 0x06 0x0000002c if ($A <= sendto) goto L0140 L0134: 0x25 0x00 0x04 0x00000033 if ($A <= getsockname) goto L0139 L0135: 0x25 0x00 0x88 0x00000035 if ($A <= socketpair) goto L0272 L0136: 0x35 0x01 0x00 0x00000036 if ($A >= setsockopt) goto L0138 L0137: 0x05 0x00 0x00 0x0000018a goto L0532 L0138: 0x05 0x00 0x00 0x0000017b goto L0518 L0139: 0x35 0x1f 0xcc 0x00000031 if ($A >= bind) goto L0171, else goto L0344 L0140: 0x25 0x00 0x01 0x00000027 if ($A <= getpid) goto L0142 L0141: 0x35 0x1d 0xca 0x00000028 if ($A >= sendfile) goto L0171, else goto L0344 L0142: 0x35 0x81 0xc9 0x00000024 if ($A >= getitimer) goto L0272, else goto L0344 L0143: 0x25 0x00 0x0a 0x0000000b if ($A <= munmap) goto L0154 L0144: 0x25 0x00 0x05 0x00000016 if ($A <= pipe) goto L0150 L0145: 0x25 0x00 0x03 0x0000001b if ($A <= mincore) goto L0149 L0146: 0x25 0x00 0xc5 0x0000001c if ($A <= madvise) goto L0344 L0147: 0x35 0x17 0x00 0x0000001d if ($A >= shmget) goto L0171 L0148: 0x05 0x00 0x00 0x00000186 goto L0539 L0149: 0x35 0x7a 0xc2 0x0000001a if ($A >= msync) goto L0272, else goto L0344 L0150: 0x25 0x00 0x01 0x00000011 if ($A <= pread64) goto L0152 L0151: 0x35 0x13 0xc0 0x00000015 if ($A >= access) goto L0171, else goto L0344 L0152: 0x25 0x00 0xbf 0x00000010 if ($A <= ioctl) goto L0344 L0153: 0x05 0x00 0x00 0x000001a4 goto L0574 L0154: 0x25 0x00 0x06 0x00000005 if ($A <= fstat) goto L0161 L0155: 0x25 0x00 0x04 0x00000007 if ($A <= poll) goto L0160 L0156: 0x25 0x00 0xbb 0x00000009 if ($A <= mmap) goto L0344 L0157: 0x35 0x01 0x00 0x0000000a if ($A >= mprotect) goto L0159 L0158: 0x05 0x00 0x00 0x000001b3 goto L0594 L0159: 0x05 0x00 0x00 0x000001ab goto L0587 L0160: 0x35 0x0a 0xb7 0x00000006 if ($A >= lstat) goto L0171, else goto L0344 L0161: 0x25 0x00 0x01 0x00000003 if ($A <= close) goto L0163 L0162: 0x35 0x08 0xb5 0x00000004 if ($A >= stat) goto L0171, else goto L0344 L0163: 0x35 0x07 0xb4 0x00000002 if ($A >= open) goto L0171, else goto L0344 L0164: 0x20 0x00 0x00 0x0000002c $A = $high_args[3] L0165: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0169 L0166: 0x15 0x00 0xae 0xffffffff if ($A != 0xffffffff) goto L0341 L0167: 0x20 0x00 0x00 0x00000028 $A = $low_args[3] L0168: 0x45 0x00 0xac 0x80000000 if !($A & 0x80000000) goto L0341 L0169: 0x20 0x00 0x00 0x00000028 $A = $low_args[3] L0170: 0x15 0x01 0x00 0x000007ff if ($A == 0x7ff) goto L0172 L0171: 0x05 0x00 0x00 0x000001ae goto L0602 L0172: 0x06 0x00 0x00 0x00050026 return ERRNO(38) L0173: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0174: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0178 L0175: 0x15 0x00 0xa5 0xffffffff if ($A != 0xffffffff) goto L0341 L0176: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0177: 0x45 0x00 0xa3 0x80000000 if !($A & 0x80000000) goto L0341 L0178: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0179: 0x15 0xa4 0x5c 0x00000000 if ($A == 0x0) goto L0344, else goto L0272 L0180: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0181: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0185 L0182: 0x15 0x00 0x9e 0xffffffff if ($A != 0xffffffff) goto L0341 L0183: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0184: 0x45 0x00 0x9c 0x80000000 if !($A & 0x80000000) goto L0341 L0185: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0186: 0x45 0x55 0x9d 0xfffffffa if ($A & 0xfffffffa) goto L0272, else goto L0344 L0187: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0188: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0192 L0189: 0x15 0x00 0x97 0xffffffff if ($A != 0xffffffff) goto L0341 L0190: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0191: 0x45 0x00 0x95 0x80000000 if !($A & 0x80000000) goto L0341 L0192: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0193: 0x15 0x96 0x00 0x00000000 if ($A == 0x0) goto L0344 L0194: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0195: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0199 L0196: 0x15 0x00 0x90 0xffffffff if ($A != 0xffffffff) goto L0341 L0197: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0198: 0x45 0x00 0x8e 0x80000000 if !($A & 0x80000000) goto L0341 L0199: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0200: 0x05 0x00 0x00 0x000000d7 goto L0416 L0201: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0202: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0206 L0203: 0x15 0x00 0x89 0xffffffff if ($A != 0xffffffff) goto L0341 L0204: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0205: 0x45 0x00 0x87 0x80000000 if !($A & 0x80000000) goto L0341 L0206: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0207: 0x45 0x40 0x88 0xfff7b7ff if ($A & 0xfff7b7ff) goto L0272, else goto L0344 L0208: 0x06 0x00 0x00 0x00030008 return TRAP(8) L0209: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0210: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0214 L0211: 0x15 0x00 0x81 0xffffffff if ($A != 0xffffffff) goto L0341 L0212: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0213: 0x45 0x00 0x7f 0x80000000 if !($A & 0x80000000) goto L0341 L0214: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0215: 0x45 0x38 0x00 0x80000000 if ($A & 0x80000000) goto L0272 L0216: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0217: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0221 L0218: 0x15 0x00 0x7a 0xffffffff if ($A != 0xffffffff) goto L0341 L0219: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0220: 0x45 0x00 0x78 0x80000000 if !($A & 0x80000000) goto L0341 L0221: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0222: 0x15 0x79 0x00 0x00000007 if ($A == 0x7) goto L0344 L0223: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0224: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0228 L0225: 0x15 0x00 0x73 0xffffffff if ($A != 0xffffffff) goto L0341 L0226: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0227: 0x45 0x00 0x71 0x80000000 if !($A & 0x80000000) goto L0341 L0228: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0229: 0x15 0x72 0x00 0x00000001 if ($A == 0x1) goto L0344 L0230: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0231: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0235 L0232: 0x15 0x00 0x6c 0xffffffff if ($A != 0xffffffff) goto L0341 L0233: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0234: 0x45 0x00 0x6a 0x80000000 if !($A & 0x80000000) goto L0341 L0235: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0236: 0x15 0x6b 0x00 0x00000006 if ($A == 0x6) goto L0344 L0237: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0238: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0242 L0239: 0x15 0x00 0x65 0xffffffff if ($A != 0xffffffff) goto L0341 L0240: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0241: 0x45 0x00 0x63 0x80000000 if !($A & 0x80000000) goto L0341 L0242: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0243: 0x15 0x64 0x00 0x00000004 if ($A == 0x4) goto L0344 L0244: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0245: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0249 L0246: 0x15 0x00 0x5e 0xffffffff if ($A != 0xffffffff) goto L0341 L0247: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0248: 0x45 0x00 0x5c 0x80000000 if !($A & 0x80000000) goto L0341 L0249: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0250: 0x15 0x5d 0x00 0x00000002 if ($A == 0x2) goto L0344 L0251: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0252: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0256 L0253: 0x15 0x00 0x57 0xffffffff if ($A != 0xffffffff) goto L0341 L0254: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0255: 0x45 0x00 0x55 0x80000000 if !($A & 0x80000000) goto L0341 L0256: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0257: 0x15 0x56 0x00 0x00000000 if ($A == 0x0) goto L0344 L0258: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0259: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0263 L0260: 0x15 0x00 0x50 0xffffffff if ($A != 0xffffffff) goto L0341 L0261: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0262: 0x45 0x00 0x4e 0x80000000 if !($A & 0x80000000) goto L0341 L0263: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0264: 0x15 0x4f 0x00 0x00000005 if ($A == 0x5) goto L0344 L0265: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0266: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0270 L0267: 0x15 0x00 0x49 0xffffffff if ($A != 0xffffffff) goto L0341 L0268: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0269: 0x45 0x00 0x47 0x80000000 if !($A & 0x80000000) goto L0341 L0270: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0271: 0x15 0x48 0x00 0x00000003 if ($A == 0x3) goto L0344 L0272: 0x05 0x00 0x00 0x0000014b goto L0604 L0273: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0274: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0278 L0275: 0x15 0x00 0x41 0xffffffff if ($A != 0xffffffff) goto L0341 L0276: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0277: 0x45 0x00 0x3f 0x80000000 if !($A & 0x80000000) goto L0341 L0278: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0279: 0x45 0x00 0x40 0xfffffe7f if !($A & 0xfffffe7f) goto L0344 L0280: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0281: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0285 L0282: 0x15 0x00 0x3a 0xffffffff if ($A != 0xffffffff) goto L0341 L0283: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0284: 0x45 0x00 0x38 0x80000000 if !($A & 0x80000000) goto L0341 L0285: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0286: 0x54 0x00 0x00 0xfffffe7f $A &= 0xfffffe7f L0287: 0x15 0x38 0x00 0x00000001 if ($A == 0x1) goto L0344 L0288: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0289: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0293 L0290: 0x15 0x00 0x32 0xffffffff if ($A != 0xffffffff) goto L0341 L0291: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0292: 0x45 0x00 0x30 0x80000000 if !($A & 0x80000000) goto L0341 L0293: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0294: 0x54 0x00 0x00 0xfffffe7f $A &= 0xfffffe7f L0295: 0x15 0x30 0x00 0x00000003 if ($A == 0x3) goto L0344 L0296: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0297: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0301 L0298: 0x15 0x00 0x2a 0xffffffff if ($A != 0xffffffff) goto L0341 L0299: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0300: 0x45 0x00 0x28 0x80000000 if !($A & 0x80000000) goto L0341 L0301: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0302: 0x54 0x00 0x00 0xfffffe7f $A &= 0xfffffe7f L0303: 0x15 0x28 0x00 0x00000004 if ($A == 0x4) goto L0344 L0304: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0305: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0309 L0306: 0x15 0x00 0x22 0xffffffff if ($A != 0xffffffff) goto L0341 L0307: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0308: 0x45 0x00 0x20 0x80000000 if !($A & 0x80000000) goto L0341 L0309: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0310: 0x54 0x00 0x00 0xfffffe7f $A &= 0xfffffe7f L0311: 0x15 0x20 0x00 0x00000005 if ($A == 0x5) goto L0344 L0312: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0313: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0317 L0314: 0x15 0x00 0x1a 0xffffffff if ($A != 0xffffffff) goto L0341 L0315: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0316: 0x45 0x00 0x18 0x80000000 if !($A & 0x80000000) goto L0341 L0317: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0318: 0x54 0x00 0x00 0xfffffe7f $A &= 0xfffffe7f L0319: 0x15 0x18 0x00 0x00000009 if ($A == 0x9) goto L0344 L0320: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0321: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0325 L0322: 0x15 0x00 0x12 0xffffffff if ($A != 0xffffffff) goto L0341 L0323: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0324: 0x45 0x00 0x10 0x80000000 if !($A & 0x80000000) goto L0341 L0325: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0326: 0x54 0x00 0x00 0xfffffe7f $A &= 0xfffffe7f L0327: 0x15 0x10 0x00 0x0000000a if ($A == 0xa) goto L0344 L0328: 0x06 0x00 0x00 0x00050016 return ERRNO(22) L0329: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0330: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0334 L0331: 0x15 0x00 0x09 0xffffffff if ($A != 0xffffffff) goto L0341 L0332: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0333: 0x45 0x00 0x07 0x80000000 if !($A & 0x80000000) goto L0341 L0334: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0335: 0x15 0x08 0x00 0x00000010 if ($A == 0x10) goto L0344 L0336: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0337: 0x15 0x04 0x00 0x00000000 if ($A == 0x0) goto L0342 L0338: 0x15 0x00 0x02 0xffffffff if ($A != 0xffffffff) goto L0341 L0339: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0340: 0x45 0x01 0x00 0x80000000 if ($A & 0x80000000) goto L0342 L0341: 0x05 0x00 0x00 0x00000101 goto L0599 L0342: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0343: 0x15 0x00 0x01 0x0000000f if ($A != 0xf) goto L0345 L0344: 0x05 0x00 0x00 0x00000102 goto L0603 L0345: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0346: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0350 L0347: 0x15 0x00 0xfb 0xffffffff if ($A != 0xffffffff) goto L0599 L0348: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0349: 0x45 0x00 0xf9 0x80000000 if !($A & 0x80000000) goto L0599 L0350: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0351: 0x15 0xfb 0x00 0x00000003 if ($A == 0x3) goto L0603 L0352: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0353: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0357 L0354: 0x15 0x00 0xf4 0xffffffff if ($A != 0xffffffff) goto L0599 L0355: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0356: 0x45 0x00 0xf2 0x80000000 if !($A & 0x80000000) goto L0599 L0357: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0358: 0x15 0xf4 0x00 0x00000004 if ($A == 0x4) goto L0603 L0359: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0360: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0364 L0361: 0x15 0x00 0xed 0xffffffff if ($A != 0xffffffff) goto L0599 L0362: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0363: 0x45 0x00 0xeb 0x80000000 if !($A & 0x80000000) goto L0599 L0364: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0365: 0x15 0x07 0x00 0x53564d41 if ($A == 0x53564d41) goto L0373 L0366: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0367: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0371 L0368: 0x15 0x00 0xe6 0xffffffff if ($A != 0xffffffff) goto L0599 L0369: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0370: 0x45 0x00 0xe4 0x80000000 if !($A & 0x80000000) goto L0599 L0371: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0372: 0x15 0xe5 0x07 0x59616d61 if ($A == 0x59616d61) goto L0602, else goto L0380 L0373: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0374: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0378 L0375: 0x15 0x00 0xdf 0xffffffff if ($A != 0xffffffff) goto L0599 L0376: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0377: 0x45 0x00 0xdd 0x80000000 if !($A & 0x80000000) goto L0599 L0378: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0379: 0x15 0xdf 0x00 0x00000000 if ($A == 0x0) goto L0603 L0380: 0x06 0x00 0x00 0x00030007 return TRAP(7) L0381: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0382: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0386 L0383: 0x15 0x00 0xd7 0xffffffff if ($A != 0xffffffff) goto L0599 L0384: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0385: 0x45 0x00 0xd5 0x80000000 if !($A & 0x80000000) goto L0599 L0386: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0387: 0x15 0xd7 0x00 0x00000000 if ($A == 0x0) goto L0603 L0388: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0389: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0393 L0390: 0x15 0x00 0xd0 0xffffffff if ($A != 0xffffffff) goto L0599 L0391: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0392: 0x45 0x00 0xce 0x80000000 if !($A & 0x80000000) goto L0599 L0393: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0394: 0x15 0xd0 0x00 0x00000001 if ($A == 0x1) goto L0603 L0395: 0x06 0x00 0x00 0x00030006 return TRAP(6) L0396: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0397: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0401 L0398: 0x15 0x00 0xc8 0xffffffff if ($A != 0xffffffff) goto L0599 L0399: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0400: 0x45 0x00 0xc6 0x80000000 if !($A & 0x80000000) goto L0599 L0401: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0402: 0x15 0x00 0xc9 0x00000000 if ($A != 0x0) goto L0604 L0403: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0404: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0408 L0405: 0x15 0x00 0xc1 0xffffffff if ($A != 0xffffffff) goto L0599 L0406: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0407: 0x45 0x00 0xbf 0x80000000 if !($A & 0x80000000) goto L0599 L0408: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0409: 0x15 0xc1 0x00 0x00000000 if ($A == 0x0) goto L0603 L0410: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0411: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0415 L0412: 0x15 0x00 0xba 0xffffffff if ($A != 0xffffffff) goto L0599 L0413: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0414: 0x45 0x00 0xb8 0x80000000 if !($A & 0x80000000) goto L0599 L0415: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0416: 0x15 0xba 0xb9 0x00000001 if ($A == 0x1) goto L0603, else goto L0602 L0417: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0418: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0422 L0419: 0x15 0x00 0xb3 0xffffffff if ($A != 0xffffffff) goto L0599 L0420: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0421: 0x45 0x00 0xb1 0x80000000 if !($A & 0x80000000) goto L0599 L0422: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0423: 0x15 0xb3 0x00 0x00000003 if ($A == 0x3) goto L0603 L0424: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0425: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0429 L0426: 0x15 0x00 0xac 0xffffffff if ($A != 0xffffffff) goto L0599 L0427: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0428: 0x45 0x00 0xaa 0x80000000 if !($A & 0x80000000) goto L0599 L0429: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0430: 0x15 0xac 0x00 0x00000001 if ($A == 0x1) goto L0603 L0431: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0432: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0436 L0433: 0x15 0x00 0xa5 0xffffffff if ($A != 0xffffffff) goto L0599 L0434: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0435: 0x45 0x00 0xa3 0x80000000 if !($A & 0x80000000) goto L0599 L0436: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0437: 0x15 0xa5 0x00 0x0000040a if ($A == 0x40a) goto L0603 L0438: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0439: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0443 L0440: 0x15 0x00 0x9e 0xffffffff if ($A != 0xffffffff) goto L0599 L0441: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0442: 0x45 0x00 0x9c 0x80000000 if !($A & 0x80000000) goto L0599 L0443: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0444: 0x15 0x9e 0x00 0x00000002 if ($A == 0x2) goto L0603 L0445: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0446: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0450 L0447: 0x15 0x00 0x97 0xffffffff if ($A != 0xffffffff) goto L0599 L0448: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0449: 0x45 0x00 0x95 0x80000000 if !($A & 0x80000000) goto L0599 L0450: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0451: 0x15 0x97 0x00 0x00000006 if ($A == 0x6) goto L0603 L0452: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0453: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0457 L0454: 0x15 0x00 0x90 0xffffffff if ($A != 0xffffffff) goto L0599 L0455: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0456: 0x45 0x00 0x8e 0x80000000 if !($A & 0x80000000) goto L0599 L0457: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0458: 0x15 0x90 0x00 0x00000007 if ($A == 0x7) goto L0603 L0459: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0460: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0464 L0461: 0x15 0x00 0x89 0xffffffff if ($A != 0xffffffff) goto L0599 L0462: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0463: 0x45 0x00 0x87 0x80000000 if !($A & 0x80000000) goto L0599 L0464: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0465: 0x15 0x89 0x00 0x00000005 if ($A == 0x5) goto L0603 L0466: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0467: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0471 L0468: 0x15 0x00 0x82 0xffffffff if ($A != 0xffffffff) goto L0599 L0469: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0470: 0x45 0x00 0x80 0x80000000 if !($A & 0x80000000) goto L0599 L0471: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0472: 0x15 0x82 0x00 0x00000000 if ($A == 0x0) goto L0603 L0473: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0474: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0478 L0475: 0x15 0x00 0x7b 0xffffffff if ($A != 0xffffffff) goto L0599 L0476: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0477: 0x45 0x00 0x79 0x80000000 if !($A & 0x80000000) goto L0599 L0478: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0479: 0x15 0x7b 0x00 0x00000406 if ($A == 0x406) goto L0603 L0480: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0481: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0485 L0482: 0x15 0x00 0x74 0xffffffff if ($A != 0xffffffff) goto L0599 L0483: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0484: 0x45 0x00 0x72 0x80000000 if !($A & 0x80000000) goto L0599 L0485: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0486: 0x15 0x09 0x00 0x00000004 if ($A == 0x4) goto L0496 L0487: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0488: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0492 L0489: 0x15 0x00 0x6d 0xffffffff if ($A != 0xffffffff) goto L0599 L0490: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0491: 0x45 0x00 0x6b 0x80000000 if !($A & 0x80000000) goto L0599 L0492: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0493: 0x15 0x00 0x6e 0x00000409 if ($A != 0x409) goto L0604 L0494: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0495: 0x15 0x60 0x6c 0x00000000 if ($A == 0x0) goto L0592, else goto L0604 L0496: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0497: 0x15 0x00 0x6a 0x00000000 if ($A != 0x0) goto L0604 L0498: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0499: 0x45 0x68 0x67 0xffe363fc if ($A & 0xffe363fc) goto L0604, else goto L0603 L0500: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0501: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0505 L0502: 0x15 0x00 0x60 0xffffffff if ($A != 0xffffffff) goto L0599 L0503: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0504: 0x45 0x00 0x5e 0x80000000 if !($A & 0x80000000) goto L0599 L0505: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0506: 0x15 0x60 0x00 0x00000001 if ($A == 0x1) goto L0603 L0507: 0x06 0x00 0x00 0x00030005 return TRAP(5) L0508: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0509: 0x15 0x00 0x02 0x00000000 if ($A != 0x0) goto L0512 L0510: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0511: 0x15 0x5b 0x00 0x003d0f00 if ($A == 0x3d0f00) goto L0603 L0512: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0513: 0x45 0x00 0x58 0x00010100 if !($A & 0x10100) goto L0602 L0514: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0515: 0x54 0x00 0x00 0x00004100 $A &= 0x4100 L0516: 0x15 0x55 0x00 0x00004100 if ($A == 0x4100) goto L0602 L0517: 0x06 0x00 0x00 0x00030004 return TRAP(4) L0518: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0519: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0523 L0520: 0x15 0x00 0x4e 0xffffffff if ($A != 0xffffffff) goto L0599 L0521: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0522: 0x45 0x00 0x4c 0x80000000 if !($A & 0x80000000) goto L0599 L0523: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0524: 0x15 0x00 0x4f 0x00000001 if ($A != 0x1) goto L0604 L0525: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0526: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0530 L0527: 0x15 0x00 0x47 0xffffffff if ($A != 0xffffffff) goto L0599 L0528: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0529: 0x45 0x00 0x45 0x80000000 if !($A & 0x80000000) goto L0599 L0530: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0531: 0x15 0x47 0x48 0x0000002a if ($A == 0x2a) goto L0603, else goto L0604 L0532: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0533: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0537 L0534: 0x15 0x00 0x40 0xffffffff if ($A != 0xffffffff) goto L0599 L0535: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0536: 0x45 0x00 0x3e 0x80000000 if !($A & 0x80000000) goto L0599 L0537: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0538: 0x15 0x40 0x41 0x00000001 if ($A == 0x1) goto L0603, else goto L0604 L0539: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0540: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0544 L0541: 0x15 0x00 0x39 0xffffffff if ($A != 0xffffffff) goto L0599 L0542: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0543: 0x45 0x00 0x37 0x80000000 if !($A & 0x80000000) goto L0599 L0544: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0545: 0x15 0x39 0x00 0x00000004 if ($A == 0x4) goto L0603 L0546: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0547: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0551 L0548: 0x15 0x00 0x32 0xffffffff if ($A != 0xffffffff) goto L0599 L0549: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0550: 0x45 0x00 0x30 0x80000000 if !($A & 0x80000000) goto L0599 L0551: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0552: 0x15 0x32 0x00 0x00000001 if ($A == 0x1) goto L0603 L0553: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0554: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0558 L0555: 0x15 0x00 0x2b 0xffffffff if ($A != 0xffffffff) goto L0599 L0556: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0557: 0x45 0x00 0x29 0x80000000 if !($A & 0x80000000) goto L0599 L0558: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0559: 0x15 0x2b 0x00 0x00000009 if ($A == 0x9) goto L0603 L0560: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0561: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0565 L0562: 0x15 0x00 0x24 0xffffffff if ($A != 0xffffffff) goto L0599 L0563: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0564: 0x45 0x00 0x22 0x80000000 if !($A & 0x80000000) goto L0599 L0565: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0566: 0x15 0x24 0x00 0x00000000 if ($A == 0x0) goto L0603 L0567: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0568: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0572 L0569: 0x15 0x00 0x1d 0xffffffff if ($A != 0xffffffff) goto L0599 L0570: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0571: 0x45 0x00 0x1b 0x80000000 if !($A & 0x80000000) goto L0599 L0572: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0573: 0x15 0x1d 0x1c 0x00000008 if ($A == 0x8) goto L0603, else goto L0602 L0574: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0575: 0x15 0x00 0x02 0x00000000 if ($A != 0x0) goto L0578 L0576: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0577: 0x15 0x19 0x00 0x00005401 if ($A == 0x5401) goto L0603 L0578: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0579: 0x15 0x00 0x02 0x00000000 if ($A != 0x0) goto L0582 L0580: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0581: 0x15 0x15 0x00 0x0000541b if ($A == 0x541b) goto L0603 L0582: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0583: 0x15 0x00 0x02 0x00000000 if ($A != 0x0) goto L0586 L0584: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0585: 0x15 0x11 0x00 0x40086200 if ($A == 0x40086200) goto L0603 L0586: 0x06 0x00 0x00 0x00030003 return TRAP(3) L0587: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0588: 0x15 0x03 0x00 0x00000000 if ($A == 0x0) goto L0592 L0589: 0x15 0x00 0x09 0xffffffff if ($A != 0xffffffff) goto L0599 L0590: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0591: 0x45 0x00 0x07 0x80000000 if !($A & 0x80000000) goto L0599 L0592: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0593: 0x45 0x0a 0x09 0xfffffff8 if ($A & 0xfffffff8) goto L0604, else goto L0603 L0594: 0x20 0x00 0x00 0x0000002c $A = $high_args[3] L0595: 0x15 0x04 0x00 0x00000000 if ($A == 0x0) goto L0600 L0596: 0x15 0x00 0x02 0xffffffff if ($A != 0xffffffff) goto L0599 L0597: 0x20 0x00 0x00 0x00000028 $A = $low_args[3] L0598: 0x45 0x01 0x00 0x80000000 if ($A & 0x80000000) goto L0600 L0599: 0x06 0x00 0x00 0x00030002 return TRAP(2) L0600: 0x20 0x00 0x00 0x00000028 $A = $low_args[3] L0601: 0x45 0x02 0x01 0xfffd97cc if ($A & 0xfffd97cc) goto L0604, else goto L0603 L0602: 0x06 0x00 0x00 0x00050001 return ERRNO(1) L0603: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0604: 0x06 0x00 0x00 0x00030001 return TRAP(1) #--------------------------------- ceccomp-4.3.1/test/text/gctf-2019-quals-caas.casm000066400000000000000000000114721526046660400213220ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000004 $A = $arch L0002: 0x15 0x00 0x3c 0xc000003e if ($A != x86_64) goto L0063 L0003: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0004: 0x35 0x3a 0x00 0x40000000 if ($A >= 0x40000000) goto L0063 L0005: 0x15 0x38 0x00 0x00000000 if ($A == read) goto L0062 L0006: 0x15 0x37 0x00 0x00000001 if ($A == write) goto L0062 L0007: 0x15 0x36 0x00 0x00000003 if ($A == close) goto L0062 L0008: 0x15 0x35 0x00 0x0000000b if ($A == munmap) goto L0062 L0009: 0x15 0x34 0x00 0x00000018 if ($A == sched_yield) goto L0062 L0010: 0x15 0x33 0x00 0x00000020 if ($A == dup) goto L0062 L0011: 0x15 0x32 0x00 0x00000021 if ($A == dup2) goto L0062 L0012: 0x15 0x31 0x00 0x00000023 if ($A == nanosleep) goto L0062 L0013: 0x15 0x30 0x00 0x0000002a if ($A == connect) goto L0062 L0014: 0x15 0x2f 0x00 0x0000002b if ($A == accept) goto L0062 L0015: 0x15 0x2e 0x00 0x0000002f if ($A == recvmsg) goto L0062 L0016: 0x15 0x2d 0x00 0x00000031 if ($A == bind) goto L0062 L0017: 0x15 0x2c 0x00 0x0000003c if ($A == exit) goto L0062 L0018: 0x15 0x2b 0x00 0x000000e7 if ($A == exit_group) goto L0062 L0019: 0x15 0x00 0x04 0x00000038 if ($A != clone) goto L0024 L0020: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0021: 0x15 0x00 0x29 0x00000000 if ($A != 0x0) goto L0063 L0022: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0023: 0x15 0x26 0x27 0x00010900 if ($A == 0x10900) goto L0062, else goto L0063 L0024: 0x15 0x00 0x0c 0x00000029 if ($A != socket) goto L0037 L0025: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0026: 0x15 0x00 0x24 0x00000000 if ($A != 0x0) goto L0063 L0027: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0028: 0x15 0x00 0x22 0x00000002 if ($A != 0x2) goto L0063 L0029: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0030: 0x15 0x00 0x20 0x00000000 if ($A != 0x0) goto L0063 L0031: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0032: 0x15 0x00 0x1e 0x00000001 if ($A != 0x1) goto L0063 L0033: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0034: 0x15 0x00 0x1c 0x00000000 if ($A != 0x0) goto L0063 L0035: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0036: 0x15 0x19 0x1a 0x00000000 if ($A == 0x0) goto L0062, else goto L0063 L0037: 0x15 0x00 0x19 0x00000009 if ($A != mmap) goto L0063 L0038: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0039: 0x15 0x00 0x17 0x00000000 if ($A != 0x0) goto L0063 L0040: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0041: 0x15 0x00 0x15 0x00000000 if ($A != 0x0) goto L0063 L0042: 0x20 0x00 0x00 0x0000001c $A = $high_args[1] L0043: 0x15 0x00 0x13 0x00000000 if ($A != 0x0) goto L0063 L0044: 0x20 0x00 0x00 0x00000018 $A = $low_args[1] L0045: 0x15 0x00 0x11 0x00001000 if ($A != 0x1000) goto L0063 L0046: 0x20 0x00 0x00 0x00000024 $A = $high_args[2] L0047: 0x15 0x00 0x0f 0x00000000 if ($A != 0x0) goto L0063 L0048: 0x20 0x00 0x00 0x00000020 $A = $low_args[2] L0049: 0x15 0x00 0x0d 0x00000003 if ($A != 0x3) goto L0063 L0050: 0x20 0x00 0x00 0x0000002c $A = $high_args[3] L0051: 0x15 0x00 0x0b 0x00000000 if ($A != 0x0) goto L0063 L0052: 0x20 0x00 0x00 0x00000028 $A = $low_args[3] L0053: 0x15 0x00 0x09 0x00000022 if ($A != 0x22) goto L0063 L0054: 0x20 0x00 0x00 0x00000034 $A = $high_args[4] L0055: 0x15 0x00 0x07 0x00000000 if ($A != 0x0) goto L0063 L0056: 0x20 0x00 0x00 0x00000030 $A = $low_args[4] L0057: 0x15 0x00 0x05 0x00000000 if ($A != 0x0) goto L0063 L0058: 0x20 0x00 0x00 0x0000003c $A = $high_args[5] L0059: 0x15 0x00 0x03 0x00000000 if ($A != 0x0) goto L0063 L0060: 0x20 0x00 0x00 0x00000038 $A = $low_args[5] L0061: 0x15 0x00 0x01 0x00000000 if ($A != 0x0) goto L0063 L0062: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0063: 0x06 0x00 0x00 0x00000000 return KILL #--------------------------------- ceccomp-4.3.1/test/text/ld_alu_misc.casm000066400000000000000000000030051526046660400202220ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000008 $A = $low_pc L0002: 0x07 0x00 0x00 0x00000000 $X = $A L0003: 0x20 0x00 0x00 0x0000000c $A = $high_pc L0004: 0x20 0x00 0x00 0x00000014 $A = $high_args[0] L0005: 0x20 0x00 0x00 0x00000038 $A = $low_args[5] L0006: 0x0c 0x00 0x00 0x00000000 $A += $X L0007: 0x54 0x00 0x00 0x00000fff $A &= 0xfff L0008: 0x15 0x01 0x00 0x00000000 if ($A == 0x0) goto L0010 L0009: 0x06 0x00 0x00 0x00000000 return KILL L0010: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0011: 0x07 0x00 0x00 0x00000000 $X = $A L0012: 0x24 0x00 0x00 0x00000102 $A *= 0x102 L0013: 0x02 0x00 0x00 0x00000000 $mem[0x0] = $A L0014: 0x87 0x00 0x00 0x00000000 $A = $X L0015: 0x24 0x00 0x00 0x000001d2 $A *= 0x1d2 L0016: 0x84 0x00 0x00 0x00000000 $A = -$A L0017: 0x04 0x00 0x00 0x00001337 $A += 0x1337 L0018: 0x07 0x00 0x00 0x00000000 $X = $A L0019: 0x60 0x00 0x00 0x00000000 $A = $mem[0x0] L0020: 0x1d 0x00 0x01 0x00000000 if ($A != $X) goto L0022 L0021: 0x06 0x00 0x00 0x00000000 return KILL L0022: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- ceccomp-4.3.1/test/text/libseccomp.casm000066400000000000000000000016251526046660400200750ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000004 $A = $arch L0002: 0x15 0x00 0x08 0xc000003e if ($A != x86_64) goto L0011 L0003: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0004: 0x35 0x06 0x00 0x40000000 if ($A >= 0x40000000) goto L0011 L0005: 0x15 0x04 0x00 0x00000142 if ($A == execveat) goto L0010 L0006: 0x15 0x03 0x00 0x0000003b if ($A == execve) goto L0010 L0007: 0x15 0x02 0x00 0x00000048 if ($A == fcntl) goto L0010 L0008: 0x15 0x01 0x00 0x0000003c if ($A == exit) goto L0010 L0009: 0x06 0x00 0x00 0x00050005 return ERRNO(5) L0010: 0x06 0x00 0x00 0x7fff0000 return ALLOW L0011: 0x06 0x00 0x00 0x00000000 return KILL #--------------------------------- ceccomp-4.3.1/test/text/multi_arch.casm000066400000000000000000000040161526046660400201010ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000004 $A = $arch L0002: 0x15 0x00 0x05 0xc000003e if ($A != x86_64) goto L0008 L0003: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0004: 0x35 0x12 0x00 0x40000000 if ($A >= 0x40000000) goto L0023 L0005: 0x15 0x12 0x00 0x0000002b if ($A == accept) goto L0024 L0006: 0x15 0x11 0x00 0x00000032 if ($A == listen) goto L0024 L0007: 0x15 0x10 0x0f 0x00000031 if ($A == bind) goto L0024, else goto L0023 L0008: 0x15 0x00 0x04 0x40000003 if ($A != i386) goto L0013 L0009: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0010: 0x15 0x0d 0x00 0x00000000 if ($A == i386.restart_syscall) goto L0024 L0011: 0x15 0x0c 0x00 0x00000001 if ($A == i386.exit) goto L0024 L0012: 0x15 0x0b 0x0a 0x00000002 if ($A == i386.fork) goto L0024, else goto L0023 L0013: 0x15 0x00 0x04 0xc00000b7 if ($A != aarch64) goto L0018 L0014: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0015: 0x15 0x08 0x00 0xffffd85c if ($A == aarch64.alarm) goto L0024 L0016: 0x15 0x07 0x00 0xffffd88b if ($A == aarch64.select) goto L0024 L0017: 0x15 0x06 0x05 0xffffd848 if ($A == aarch64.pipe) goto L0024, else goto L0023 L0018: 0x15 0x00 0x04 0x40000028 if ($A != arm) goto L0023 L0019: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0020: 0x15 0x03 0x00 0x00000000 if ($A == arm.restart_syscall) goto L0024 L0021: 0x15 0x02 0x00 0x00000091 if ($A == arm.readv) goto L0024 L0022: 0x15 0x01 0x00 0x00000078 if ($A == arm.clone) goto L0024 L0023: 0x06 0x00 0x00 0x00000000 return KILL L0024: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- ceccomp-4.3.1/test/text/twctf-2016-diary.casm000066400000000000000000000024661526046660400206040ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0002: 0x15 0x00 0x01 0x00000002 if ($A != open) goto L0004 L0003: 0x06 0x00 0x00 0x00000000 return KILL L0004: 0x15 0x00 0x01 0x00000101 if ($A != openat) goto L0006 L0005: 0x06 0x00 0x00 0x00000000 return KILL L0006: 0x15 0x00 0x01 0x0000003b if ($A != execve) goto L0008 L0007: 0x06 0x00 0x00 0x00000000 return KILL L0008: 0x15 0x00 0x01 0x00000038 if ($A != clone) goto L0010 L0009: 0x06 0x00 0x00 0x00000000 return KILL L0010: 0x15 0x00 0x01 0x00000039 if ($A != fork) goto L0012 L0011: 0x06 0x00 0x00 0x00000000 return KILL L0012: 0x15 0x00 0x01 0x0000003a if ($A != vfork) goto L0014 L0013: 0x06 0x00 0x00 0x00000000 return KILL L0014: 0x15 0x00 0x01 0x00000055 if ($A != creat) goto L0016 L0015: 0x06 0x00 0x00 0x00000000 return KILL L0016: 0x15 0x00 0x01 0x00000142 if ($A != execveat) goto L0018 L0017: 0x06 0x00 0x00 0x00000000 return KILL L0018: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- ceccomp-4.3.1/test/text/x32.casm000066400000000000000000000020011526046660400163560ustar00rootroot00000000000000#Label CODE JT JF K #--------------------------------- L0001: 0x20 0x00 0x00 0x00000004 $A = $arch L0002: 0x15 0x00 0x09 0x40000003 if ($A != i386) goto L0012 L0003: 0x20 0x00 0x00 0x00000000 $A = $syscall_nr L0004: 0x25 0x00 0x07 0x40000000 if ($A <= 0x40000000) goto L0012 L0005: 0x15 0x06 0x00 0x40000000 if ($A == 0x40000000) goto L0012 L0006: 0x15 0x05 0x00 0x40000001 if ($A == 0x40000001) goto L0012 L0007: 0x15 0x04 0x00 0x400000ac if ($A == 0x400000ac) goto L0012 L0008: 0x15 0x00 0x03 0x40000009 if ($A != 0x40000009) goto L0012 L0009: 0x20 0x00 0x00 0x00000010 $A = $low_args[0] L0010: 0x15 0x01 0x00 0x00000000 if ($A == 0x0) goto L0012 L0011: 0x06 0x00 0x00 0x00050005 return ERRNO(5) L0012: 0x06 0x00 0x00 0x7fff0000 return ALLOW #--------------------------------- ceccomp-4.3.1/test/unit_test.c000066400000000000000000000102541526046660400163040ustar00rootroot00000000000000// this is for separately function testing #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0])) enum test_case { TEST_TRACE = 0, TEST_PROBE = 1, TEST_SEIZE = 2, TEST_TRACE_PID = 3, TEST_FLAGS = 4, TEST_LOTS_OF_FILTERS = 5, TEST_CAPTURE = 6, }; static const struct sock_filter filters[] = { BPF_JUMP (BPF_JMP | BPF_JEQ | BPF_K, 0, 0, 7), BPF_STMT (BPF_LD | BPF_W | BPF_ABS, offsetof (struct seccomp_data, nr)), BPF_JUMP (BPF_JMP | BPF_JEQ | BPF_K, SYS_execve, 3, 0), BPF_JUMP (BPF_JMP | BPF_JEQ | BPF_K, SYS_sendfile, 3, 0), BPF_JUMP (BPF_JMP | BPF_JEQ | BPF_K, SYS_ptrace, 4, 0), BPF_STMT (BPF_RET | BPF_K, SECCOMP_RET_ALLOW), BPF_STMT (BPF_RET | BPF_K, SECCOMP_RET_ERRNO | 1), BPF_STMT (BPF_LD | BPF_W | BPF_K, SECCOMP_RET_KILL_PROCESS), BPF_STMT (BPF_RET | BPF_A, 0), BPF_STMT (BPF_ALU | BPF_DIV | BPF_X, 0), BPF_STMT (BPF_RET | BPF_K, SECCOMP_RET_ALLOW), }; static void load_filter (bool tofail) { prctl (PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); struct sock_fprog prog = { .len = ARRAY_SIZE (filters), .filter = (struct sock_filter *)filters }; syscall (SYS_seccomp, SECCOMP_SET_MODE_FILTER, NULL, &prog); // test failed loading if (tofail) syscall (SYS_seccomp, SECCOMP_SET_MODE_FILTER, NULL, NULL); } int main (int argc, char **argv) { setvbuf (stdout, NULL, _IOLBF, 0x100); int choice = argc < 2 ? 0 : atoi (argv[1]); int efd = argc < 3 ? 0 : atoi (argv[2]); uint64_t sem; switch (choice) { case TEST_TRACE: printf ("pid=%d\n", getpid ()); load_filter (true); break; case TEST_SEIZE: prctl (PR_SET_PTRACER, PR_SET_PTRACER_ANY); pid_t pid = getpid (); printf ("pid=%d\n", pid); assert (efd != 0); assert (read (efd, &sem, 8) == 8); pid = fork (); if (pid) { waitpid (pid, NULL, 0); exit (0); } // child load_filter (false); printf ("child=%d\n", getpid ()); assert (read (efd, &sem, 8) == 8); break; case TEST_PROBE: pid = fork (); if (pid != 0) { wait (NULL); exit (0); } else { pid = fork (); if (pid != 0) exit (0); // grandchild process pid = getpid (); printf ("pid=%d\n", pid); load_filter (false); signal (SIGINT, SIG_IGN); sleep (100); } break; case TEST_TRACE_PID: load_filter (false); printf ("pid=%d\n", getpid ()); assert (efd != 0); assert (read (efd, &sem, 8) == 8); break; case TEST_FLAGS: printf ("pid=%d\n", getpid ()); prctl (PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); struct sock_fprog prog = { .len = ARRAY_SIZE (filters), .filter = (struct sock_filter *)filters }; syscall (SYS_seccomp, SECCOMP_SET_MODE_FILTER, SECCOMP_FILTER_FLAG_LOG | SECCOMP_FILTER_FLAG_NEW_LISTENER, &prog); break; case TEST_LOTS_OF_FILTERS: prctl (PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0); struct sock_filter stk_rules[] = { BPF_STMT (BPF_LD | BPF_W | BPF_ABS, offsetof (struct seccomp_data, args[5]) + 4), BPF_JUMP (BPF_JMP | BPF_JGT | BPF_K, 0, 1, 0), BPF_STMT (BPF_RET | BPF_K, SECCOMP_RET_ALLOW), BPF_STMT (BPF_RET | BPF_K, SECCOMP_RET_LOG), }; struct sock_fprog stk_prog = { .len = ARRAY_SIZE (stk_rules), .filter = stk_rules }; for (int i = 0; i < 40; i++) { stk_rules[1].k = 0x80000000 | i; syscall (SYS_seccomp, SECCOMP_SET_MODE_FILTER, 0, &stk_prog); } printf ("pid=%d\n", getpid ()); assert (efd != 0); assert (read (efd, &sem, 8) == 8); break; default: load_filter (true); break; } return 0; }