pax_global_header00006660000000000000000000000064144477363770014540gustar00rootroot0000000000000052 comment=c840222a391439285478820b4477d5fa6b78d63d taglib-1.13.1/000077500000000000000000000000001444773637700130655ustar00rootroot00000000000000taglib-1.13.1/.astylerc000066400000000000000000000005361444773637700147200ustar00rootroot00000000000000--suffix=none --style=kr --indent=spaces=2 --indent-col1-comments --min-conditional-indent=0 --attach-extern-c --attach-namespaces --indent-namespaces --pad-oper --unpad-paren --align-pointer=name --align-reference=name --max-instatement-indent=40 --break-closing-brackets --remove-brackets --convert-tabs --max-code-length=100 --break-after-logical taglib-1.13.1/.editorconfig000066400000000000000000000006151444773637700155440ustar00rootroot00000000000000# EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true # Non-specified newlines with a newline ending every file [*] insert_final_newline = true # 2 space indentation [*.{h,cpp,tcc,cmake,yml}] indent_style = space indent_size = 2 # Trim traling whitespaces [*.{h,cpp,tcc,cmake,yml}] trim_trailing_whitespace = true # UTF-8 without BOM [*] charset = utf-8 taglib-1.13.1/.github/000077500000000000000000000000001444773637700144255ustar00rootroot00000000000000taglib-1.13.1/.github/workflows/000077500000000000000000000000001444773637700164625ustar00rootroot00000000000000taglib-1.13.1/.github/workflows/build.yml000066400000000000000000000031541444773637700203070ustar00rootroot00000000000000name: Build on: [push, pull_request, workflow_dispatch] env: BUILD_TYPE: Release jobs: build: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] include: - os: windows-latest cmake_extra_args: '-DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake"' runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v3 - name: Set up Ubuntu run: sudo apt install -y libcppunit-dev zlib1g-dev if: matrix.os == 'ubuntu-latest' - name: Set up macOS run: brew install cppunit if: matrix.os == 'macos-latest' - name: Set up Windows run: vcpkg install cppunit --triplet x64-windows if: matrix.os == 'windows-latest' - name: Configure run: > cmake -B${{github.workspace}}/build -DBUILD_SHARED_LIBS=ON -DVISIBILITY_HIDDEN=ON -DBUILD_TESTING=ON -DBUILD_EXAMPLES=ON -DBUILD_BINDINGS=ON -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} ${{ matrix.cmake_extra_args }} - name: Build run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}} - name: Test working-directory: ${{github.workspace}}/build run: ctest -C ${{env.BUILD_TYPE}} -V --no-tests=error if: matrix.os != 'windows-latest' - name: Test Windows working-directory: ${{github.workspace}}/build run: | $env:Path += ";$env:VCPKG_INSTALLATION_ROOT\packages\cppunit_x64-windows\bin;$PWD\taglib\Release" ctest -C ${{env.BUILD_TYPE}} -V --no-tests=error if: matrix.os == 'windows-latest' taglib-1.13.1/.gitignore000066400000000000000000000015741444773637700150640ustar00rootroot00000000000000cmake_install.cmake cmake_uninstall.cmake Makefile CTestTestfile.cmake CMakeFiles/ CMakeLists.txt.user* *.so *.so.* *.dylib *.vcproj *.ncb *.sln *.suo *.user .* !.github/workflows/ *~ /CMakeCache.txt /Doxyfile /config.h /taglib.pc /tests/test_runner /tests/Testing /taglib/libtag.a /taglib_config.h /taglib-config /bindings/c/libtag_c.a /bindings/c/taglib_c.pc /bindings/c/Debug /bindings/c/MinSizeRel /bindings/c/Release /bindings/c/tag_c.dir/Debug /bindings/c/tag_c.dir/MinSizeRel /bindings/c/tag_c.dir/Release /examples/framelist /examples/strip-id3v1 /examples/tagreader /examples/tagreader_c /examples/tagwriter /doc/html /taglib/Debug /taglib/MinSizeRel /taglib/Release /taglib/tag.dir/Debug /taglib/tag.dir/MinSizeRel /taglib/tag.dir/Release /ALL_BUILD.dir /ZERO_CHECK.dir taglib.h.stamp taglib.xcodeproj CMakeScripts /.clang-format /compile_commands.json /build/ .clangd .cache .idea taglib-1.13.1/3rdparty/000077500000000000000000000000001444773637700146355ustar00rootroot00000000000000taglib-1.13.1/3rdparty/utf8-cpp/000077500000000000000000000000001444773637700163035ustar00rootroot00000000000000taglib-1.13.1/3rdparty/utf8-cpp/checked.h000066400000000000000000000276311444773637700200530ustar00rootroot00000000000000// Copyright 2006-2016 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include "core.h" #include namespace utf8 { // Base for the exceptions that may be thrown from the library class exception : public ::std::exception { }; // Exceptions that may be thrown from the library functions. class invalid_code_point : public exception { uint32_t cp; public: invalid_code_point(uint32_t codepoint) : cp(codepoint) {} virtual const char* what() const throw() { return "Invalid code point"; } uint32_t code_point() const {return cp;} }; class invalid_utf8 : public exception { uint8_t u8; public: invalid_utf8 (uint8_t u) : u8(u) {} virtual const char* what() const throw() { return "Invalid UTF-8"; } uint8_t utf8_octet() const {return u8;} }; class invalid_utf16 : public exception { uint16_t u16; public: invalid_utf16 (uint16_t u) : u16(u) {} virtual const char* what() const throw() { return "Invalid UTF-16"; } uint16_t utf16_word() const {return u16;} }; class not_enough_room : public exception { public: virtual const char* what() const throw() { return "Not enough space"; } }; /// The library API - functions intended to be called by the users template octet_iterator append(uint32_t cp, octet_iterator result) { if (!utf8::internal::is_code_point_valid(cp)) throw invalid_code_point(cp); if (cp < 0x80) // one octet *(result++) = static_cast(cp); else if (cp < 0x800) { // two octets *(result++) = static_cast((cp >> 6) | 0xc0); *(result++) = static_cast((cp & 0x3f) | 0x80); } else if (cp < 0x10000) { // three octets *(result++) = static_cast((cp >> 12) | 0xe0); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } else { // four octets *(result++) = static_cast((cp >> 18) | 0xf0); *(result++) = static_cast(((cp >> 12) & 0x3f) | 0x80); *(result++) = static_cast(((cp >> 6) & 0x3f) | 0x80); *(result++) = static_cast((cp & 0x3f) | 0x80); } return result; } template output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) { while (start != end) { octet_iterator sequence_start = start; internal::utf_error err_code = utf8::internal::validate_next(start, end); switch (err_code) { case internal::UTF8_OK : for (octet_iterator it = sequence_start; it != start; ++it) *out++ = *it; break; case internal::NOT_ENOUGH_ROOM: throw not_enough_room(); case internal::INVALID_LEAD: out = utf8::append (replacement, out); ++start; break; case internal::INCOMPLETE_SEQUENCE: case internal::OVERLONG_SEQUENCE: case internal::INVALID_CODE_POINT: out = utf8::append (replacement, out); ++start; // just one replacement mark for the sequence while (start != end && utf8::internal::is_trail(*start)) ++start; break; } } return out; } template inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) { static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); return utf8::replace_invalid(start, end, out, replacement_marker); } template uint32_t next(octet_iterator& it, octet_iterator end) { uint32_t cp = 0; internal::utf_error err_code = utf8::internal::validate_next(it, end, cp); switch (err_code) { case internal::UTF8_OK : break; case internal::NOT_ENOUGH_ROOM : throw not_enough_room(); case internal::INVALID_LEAD : case internal::INCOMPLETE_SEQUENCE : case internal::OVERLONG_SEQUENCE : throw invalid_utf8(*it); case internal::INVALID_CODE_POINT : throw invalid_code_point(cp); } return cp; } template uint32_t peek_next(octet_iterator it, octet_iterator end) { return utf8::next(it, end); } template uint32_t prior(octet_iterator& it, octet_iterator start) { // can't do much if it == start if (it == start) throw not_enough_room(); octet_iterator end = it; // Go back until we hit either a lead octet or start while (utf8::internal::is_trail(*(--it))) if (it == start) throw invalid_utf8(*it); // error - no lead byte in the sequence return utf8::peek_next(it, end); } /// Deprecated in versions that include "prior" template uint32_t previous(octet_iterator& it, octet_iterator pass_start) { octet_iterator end = it; while (utf8::internal::is_trail(*(--it))) if (it == pass_start) throw invalid_utf8(*it); // error - no lead byte in the sequence octet_iterator temp = it; return utf8::next(temp, end); } template void advance (octet_iterator& it, distance_type n, octet_iterator end) { for (distance_type i = 0; i < n; ++i) utf8::next(it, end); } template typename std::iterator_traits::difference_type distance (octet_iterator first, octet_iterator last) { typename std::iterator_traits::difference_type dist; for (dist = 0; first < last; ++dist) utf8::next(first, last); return dist; } template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) { while (start != end) { uint32_t cp = utf8::internal::mask16(*start++); // Take care of surrogate pairs first if (utf8::internal::is_lead_surrogate(cp)) { if (start != end) { uint32_t trail_surrogate = utf8::internal::mask16(*start++); if (utf8::internal::is_trail_surrogate(trail_surrogate)) cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET; else throw invalid_utf16(static_cast(trail_surrogate)); } else throw invalid_utf16(static_cast(cp)); } // Lone trail surrogate else if (utf8::internal::is_trail_surrogate(cp)) throw invalid_utf16(static_cast(cp)); result = utf8::append(cp, result); } return result; } template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) { while (start < end) { uint32_t cp = utf8::next(start, end); if (cp > 0xffff) { //make a surrogate pair *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); *result++ = static_cast((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN); } else *result++ = static_cast(cp); } return result; } template octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result) { while (start != end) result = utf8::append(*(start++), result); return result; } template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) { while (start < end) (*result++) = utf8::next(start, end); return result; } // The iterator class template class iterator : public std::iterator { octet_iterator it; octet_iterator range_start; octet_iterator range_end; public: iterator () {} explicit iterator (const octet_iterator& octet_it, const octet_iterator& rangestart, const octet_iterator& rangeend) : it(octet_it), range_start(rangestart), range_end(rangeend) { if (it < range_start || it > range_end) throw std::out_of_range("Invalid utf-8 iterator position"); } // the default "big three" are OK octet_iterator base () const { return it; } uint32_t operator * () const { octet_iterator temp = it; return utf8::next(temp, range_end); } bool operator == (const iterator& rhs) const { if (range_start != rhs.range_start || range_end != rhs.range_end) throw std::logic_error("Comparing utf-8 iterators defined with different ranges"); return (it == rhs.it); } bool operator != (const iterator& rhs) const { return !(operator == (rhs)); } iterator& operator ++ () { utf8::next(it, range_end); return *this; } iterator operator ++ (int) { iterator temp = *this; utf8::next(it, range_end); return temp; } iterator& operator -- () { utf8::prior(it, range_start); return *this; } iterator operator -- (int) { iterator temp = *this; utf8::prior(it, range_start); return temp; } }; // class iterator } // namespace utf8 #endif //header guard taglib-1.13.1/3rdparty/utf8-cpp/core.h000066400000000000000000000247761444773637700174240ustar00rootroot00000000000000// Copyright 2006 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #include namespace utf8 { // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers // You may need to change them to match your system. // These typedefs have the same names as ones from cstdint, or boost/cstdint typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; // Helper code - not intended to be directly called by the library users. May be changed at any time namespace internal { // Unicode constants // Leading (high) surrogates: 0xd800 - 0xdbff // Trailing (low) surrogates: 0xdc00 - 0xdfff const uint16_t LEAD_SURROGATE_MIN = 0xd800u; const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10); const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN; // Maximum valid value for a Unicode code point const uint32_t CODE_POINT_MAX = 0x0010ffffu; template inline uint8_t mask8(octet_type oc) { return static_cast(0xff & oc); } template inline uint16_t mask16(u16_type oc) { return static_cast(0xffff & oc); } template inline bool is_trail(octet_type oc) { return ((utf8::internal::mask8(oc) >> 6) == 0x2); } template inline bool is_lead_surrogate(u16 cp) { return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX); } template inline bool is_trail_surrogate(u16 cp) { return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); } template inline bool is_surrogate(u16 cp) { return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX); } template inline bool is_code_point_valid(u32 cp) { return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp)); } template inline typename std::iterator_traits::difference_type sequence_length(octet_iterator lead_it) { uint8_t lead = utf8::internal::mask8(*lead_it); if (lead < 0x80) return 1; else if ((lead >> 5) == 0x6) return 2; else if ((lead >> 4) == 0xe) return 3; else if ((lead >> 3) == 0x1e) return 4; else return 0; } template inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length) { if (cp < 0x80) { if (length != 1) return true; } else if (cp < 0x800) { if (length != 2) return true; } else if (cp < 0x10000) { if (length != 3) return true; } return false; } enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT}; /// Helper for get_sequence_x template utf_error increase_safely(octet_iterator& it, octet_iterator end) { if (++it == end) return NOT_ENOUGH_ROOM; if (!utf8::internal::is_trail(*it)) return INCOMPLETE_SEQUENCE; return UTF8_OK; } #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;} /// get_sequence_x functions decode utf-8 sequences of the length x template utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); return UTF8_OK; } template utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f); return UTF8_OK; } template utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point += (*it) & 0x3f; return UTF8_OK; } template utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point += (utf8::internal::mask8(*it) << 6) & 0xfff; UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) code_point += (*it) & 0x3f; return UTF8_OK; } #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR template utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) { if (it == end) return NOT_ENOUGH_ROOM; // Save the original value of it so we can go back in case of failure // Of course, it does not make much sense with i.e. stream iterators octet_iterator original_it = it; uint32_t cp = 0; // Determine the sequence length based on the lead octet typedef typename std::iterator_traits::difference_type octet_difference_type; const octet_difference_type length = utf8::internal::sequence_length(it); // Get trail octets and calculate the code point utf_error err = UTF8_OK; switch (length) { case 0: return INVALID_LEAD; case 1: err = utf8::internal::get_sequence_1(it, end, cp); break; case 2: err = utf8::internal::get_sequence_2(it, end, cp); break; case 3: err = utf8::internal::get_sequence_3(it, end, cp); break; case 4: err = utf8::internal::get_sequence_4(it, end, cp); break; } if (err == UTF8_OK) { // Decoding succeeded. Now, security checks... if (utf8::internal::is_code_point_valid(cp)) { if (!utf8::internal::is_overlong_sequence(cp, length)){ // Passed! Return here. code_point = cp; ++it; return UTF8_OK; } else err = OVERLONG_SEQUENCE; } else err = INVALID_CODE_POINT; } // Failure branch - restore the original value of the iterator it = original_it; return err; } template inline utf_error validate_next(octet_iterator& it, octet_iterator end) { uint32_t ignored; return utf8::internal::validate_next(it, end, ignored); } } // namespace internal /// The library API - functions intended to be called by the users // Byte order mark const uint8_t bom[] = {0xef, 0xbb, 0xbf}; template octet_iterator find_invalid(octet_iterator start, octet_iterator end) { octet_iterator result = start; while (result != end) { utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end); if (err_code != internal::UTF8_OK) return result; } return result; } template inline bool is_valid(octet_iterator start, octet_iterator end) { return (utf8::find_invalid(start, end) == end); } template inline bool starts_with_bom (octet_iterator it, octet_iterator end) { return ( ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) && ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) && ((it != end) && (utf8::internal::mask8(*it)) == bom[2]) ); } //Deprecated in release 2.3 template inline bool is_bom (octet_iterator it) { return ( (utf8::internal::mask8(*it++)) == bom[0] && (utf8::internal::mask8(*it++)) == bom[1] && (utf8::internal::mask8(*it)) == bom[2] ); } } // namespace utf8 #endif // header guard taglib-1.13.1/AUTHORS000066400000000000000000000015711444773637700141410ustar00rootroot00000000000000Scott Wheeler Author, maintainer Lukas Lalinsky Implementation of multiple new file formats, many bug fixes, maintainer Tsuda Kageyu A lot of bug fixes and performance improvements, maintainer. Stephen F. Booth DSF metadata implementation, bug fixes, maintainer. Ismael Orenstein Xing header implementation Allan Sandfeld Jensen FLAC metadata implementation Teemu Tervo Numerous bug reports and fixes Mathias Panzenböck Mod, S3M, IT and XM metadata implementations Damien Plisson DSDIFF metadata implementation Urs Fleisch Bug fixes, maintainer. Please send all patches and questions to taglib-devel@kde.org rather than to individual developers! taglib-1.13.1/CMakeLists.txt000066400000000000000000000142661444773637700156360ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR) project(taglib) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") include(CTest) include(FeatureSummary) include(GNUInstallDirs) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) if(APPLE) option(BUILD_FRAMEWORK "Build an OS X framework" OFF) if(BUILD_FRAMEWORK) set(BUILD_SHARED_LIBS ON) #set(CMAKE_MACOSX_RPATH 1) set(FRAMEWORK_INSTALL_DIR "/Library/Frameworks" CACHE STRING "Directory to install frameworks to.") endif() endif() if(NOT BUILD_SHARED_LIBS) add_definitions(-DTAGLIB_STATIC) endif() option(ENABLE_STATIC_RUNTIME "Visual Studio, link with runtime statically" OFF) option(ENABLE_CCACHE "Use ccache when building libtag" OFF) if(ENABLE_CCACHE) find_program(CCACHE_FOUND ccache) if(CCACHE_FOUND) set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache) set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) endif() endif() option(VISIBILITY_HIDDEN "Build with -fvisibility=hidden" OFF) option(BUILD_EXAMPLES "Build the examples" OFF) option(BUILD_BINDINGS "Build the bindings" ON) option(NO_ITUNES_HACKS "Disable workarounds for iTunes bugs" OFF) option(PLATFORM_WINRT "Enable WinRT support" OFF) if(PLATFORM_WINRT) add_definitions(-DPLATFORM_WINRT) endif() add_definitions(-DHAVE_CONFIG_H) set(TESTS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/tests/") if(CMAKE_C_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") endif() if(CMAKE_CXX_COMPILER_ID MATCHES "^(GNU|Clang|AppleClang)$") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") endif() if(MSVC) if(ENABLE_STATIC_RUNTIME) foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") endforeach(flag_var) endif() # Disable warnings for internal invocations of API functions # that have been marked with TAGLIB_DEPRECATED # https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /wd4996") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4996") endif() # Read version information from file taglib/toolkit/taglib.h into variables # TAGLIB_LIB_MAJOR_VERSION, TAGLIB_LIB_MINOR_VERSION, TAGLIB_LIB_PATCH_VERSION. foreach(version_part MAJOR MINOR PATCH) set(version_var_name "TAGLIB_${version_part}_VERSION") file(STRINGS taglib/toolkit/taglib.h version_line REGEX "^#define +${version_var_name}") if(NOT version_line) message(FATAL_ERROR "${version_var_name} not found in taglib.h") endif() string(REGEX MATCH "${version_var_name} +([^ ]+)" result ${version_line}) set(TAGLIB_LIB_${version_part}_VERSION ${CMAKE_MATCH_1}) endforeach(version_part) # Only used to force cmake rerun when taglib.h changes. configure_file(taglib/toolkit/taglib.h ${CMAKE_CURRENT_BINARY_DIR}/taglib.h.stamp) if("${TAGLIB_LIB_PATCH_VERSION}" EQUAL "0") set(TAGLIB_LIB_VERSION_STRING "${TAGLIB_LIB_MAJOR_VERSION}.${TAGLIB_LIB_MINOR_VERSION}") else() set(TAGLIB_LIB_VERSION_STRING "${TAGLIB_LIB_MAJOR_VERSION}.${TAGLIB_LIB_MINOR_VERSION}.${TAGLIB_LIB_PATCH_VERSION}") endif() # 1. If the library source code has changed at all since the last update, then increment revision. # 2. If any interfaces have been added, removed, or changed since the last update, increment current, and set revision to 0. # 3. If any interfaces have been added since the last public release, then increment age. # 4. If any interfaces have been removed since the last public release, then set age to 0. set(TAGLIB_SOVERSION_CURRENT 20) set(TAGLIB_SOVERSION_REVISION 1) set(TAGLIB_SOVERSION_AGE 19) math(EXPR TAGLIB_SOVERSION_MAJOR "${TAGLIB_SOVERSION_CURRENT} - ${TAGLIB_SOVERSION_AGE}") math(EXPR TAGLIB_SOVERSION_MINOR "${TAGLIB_SOVERSION_AGE}") math(EXPR TAGLIB_SOVERSION_PATCH "${TAGLIB_SOVERSION_REVISION}") include(ConfigureChecks.cmake) # Determine whether zlib is installed. option(WITH_ZLIB "Build with ZLIB" ON) if(WITH_ZLIB) if(NOT ZLIB_SOURCE) find_package(ZLIB) if(ZLIB_FOUND) set(HAVE_ZLIB 1) set(ZLIB_LIBRARIES_FLAGS -lz) else() set(HAVE_ZLIB 0) endif() endif() if(NOT HAVE_ZLIB AND ZLIB_SOURCE) set(HAVE_ZLIB 1) set(HAVE_ZLIB_SOURCE 1) endif() else() set(HAVE_ZLIB 0) endif() if(NOT WIN32) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/taglib-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/taglib-config" @ONLY) install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/taglib-config" DESTINATION "${CMAKE_INSTALL_BINDIR}") endif() if(WIN32) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/taglib-config.cmd.cmake" "${CMAKE_CURRENT_BINARY_DIR}/taglib-config.cmd") install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/taglib-config.cmd" DESTINATION "${CMAKE_INSTALL_BINDIR}") endif() if(NOT BUILD_FRAMEWORK) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/taglib.pc.cmake" "${CMAKE_CURRENT_BINARY_DIR}/taglib.pc" @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/taglib.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") endif() include_directories(${CMAKE_CURRENT_BINARY_DIR}) configure_file(config.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/config.h") option(TRACE_IN_RELEASE "Output debug messages even in release mode" OFF) if(TRACE_IN_RELEASE) set(TRACE_IN_RELEASE TRUE) endif() configure_file(taglib/taglib_config.h.cmake "${CMAKE_CURRENT_BINARY_DIR}/taglib_config.h") add_subdirectory(taglib) if(BUILD_BINDINGS) add_subdirectory(bindings) endif() if(BUILD_TESTING) find_package(CppUnit) if(CppUnit_FOUND) add_subdirectory(tests) else() message(WARNING "BUILD_TESTING requested, but CppUnit not found, skipping tests.") endif() endif() if(BUILD_EXAMPLES) add_subdirectory(examples) endif() configure_file("${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.cmake" "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile") add_custom_target(docs doxygen) # uninstall target configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) if(NOT TARGET uninstall) add_custom_target(uninstall COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") endif() feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) taglib-1.13.1/COPYING.LGPL000066400000000000000000000636421444773637700146700ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! taglib-1.13.1/COPYING.MPL000066400000000000000000000622331444773637700145550ustar00rootroot00000000000000 MOZILLA PUBLIC LICENSE Version 1.1 --------------- 1. Definitions. 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. "Executable" means Covered Code in any form other than Source Code. 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. "License" means this document. 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. 6. Versions of the License. 6.1. New Versions. Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. 13. MULTIPLE-LICENSED CODE. Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the NPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. EXHIBIT A -Mozilla Public License. ``The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________. Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] taglib-1.13.1/ConfigureChecks.cmake000066400000000000000000000102121444773637700171250ustar00rootroot00000000000000include(CheckLibraryExists) include(CheckTypeSize) include(CheckCXXSourceCompiles) # Check if the size of numeric types are suitable. check_type_size("short" SIZEOF_SHORT) if(NOT ${SIZEOF_SHORT} EQUAL 2) message(FATAL_ERROR "TagLib requires that short is 16-bit wide.") endif() check_type_size("int" SIZEOF_INT) if(NOT ${SIZEOF_INT} EQUAL 4) message(FATAL_ERROR "TagLib requires that int is 32-bit wide.") endif() check_type_size("long long" SIZEOF_LONGLONG) if(NOT ${SIZEOF_LONGLONG} EQUAL 8) message(FATAL_ERROR "TagLib requires that long long is 64-bit wide.") endif() check_type_size("wchar_t" SIZEOF_WCHAR_T) if(${SIZEOF_WCHAR_T} LESS 2) message(FATAL_ERROR "TagLib requires that wchar_t is sufficient to store a UTF-16 char.") endif() check_type_size("float" SIZEOF_FLOAT) if(NOT ${SIZEOF_FLOAT} EQUAL 4) message(FATAL_ERROR "TagLib requires that float is 32-bit wide.") endif() check_type_size("double" SIZEOF_DOUBLE) if(NOT ${SIZEOF_DOUBLE} EQUAL 8) message(FATAL_ERROR "TagLib requires that double is 64-bit wide.") endif() # Determine which kind of atomic operations your compiler supports. check_cxx_source_compiles(" int main() { volatile int x; __sync_add_and_fetch(&x, 1); int y = __sync_sub_and_fetch(&x, 1); return 0; } " HAVE_GCC_ATOMIC) if(NOT HAVE_GCC_ATOMIC) check_cxx_source_compiles(" #include int main() { volatile int32_t x; OSAtomicIncrement32Barrier(&x); int32_t y = OSAtomicDecrement32Barrier(&x); return 0; } " HAVE_MAC_ATOMIC) if(NOT HAVE_MAC_ATOMIC) check_cxx_source_compiles(" #include int main() { volatile LONG x; InterlockedIncrement(&x); LONG y = InterlockedDecrement(&x); return 0; } " HAVE_WIN_ATOMIC) if(NOT HAVE_WIN_ATOMIC) check_cxx_source_compiles(" #include int main() { volatile int x; __sync_add_and_fetch(&x, 1); int y = __sync_sub_and_fetch(&x, 1); return 0; } " HAVE_IA64_ATOMIC) endif() endif() endif() # Determine which kind of byte swap functions your compiler supports. check_cxx_source_compiles(" int main() { __builtin_bswap16(0); __builtin_bswap32(0); __builtin_bswap64(0); return 0; } " HAVE_GCC_BYTESWAP) if(NOT HAVE_GCC_BYTESWAP) check_cxx_source_compiles(" #include int main() { __bswap_16(0); __bswap_32(0); __bswap_64(0); return 0; } " HAVE_GLIBC_BYTESWAP) if(NOT HAVE_GLIBC_BYTESWAP) check_cxx_source_compiles(" #include int main() { _byteswap_ushort(0); _byteswap_ulong(0); _byteswap_uint64(0); return 0; } " HAVE_MSC_BYTESWAP) if(NOT HAVE_MSC_BYTESWAP) check_cxx_source_compiles(" #include int main() { OSSwapInt16(0); OSSwapInt32(0); OSSwapInt64(0); return 0; } " HAVE_MAC_BYTESWAP) if(NOT HAVE_MAC_BYTESWAP) check_cxx_source_compiles(" #include int main() { swap16(0); swap32(0); swap64(0); return 0; } " HAVE_OPENBSD_BYTESWAP) endif() endif() endif() endif() # Determine whether your compiler supports some safer version of vsprintf. check_cxx_source_compiles(" #include #include int main() { char buf[20]; va_list args; vsnprintf(buf, 20, \"%d\", args); return 0; } " HAVE_VSNPRINTF) if(NOT HAVE_VSNPRINTF) check_cxx_source_compiles(" #include #include int main() { char buf[20]; va_list args; vsprintf_s(buf, \"%d\", args); return 0; } " HAVE_VSPRINTF_S) endif() # Determine whether your compiler supports ISO _strdup. check_cxx_source_compiles(" #include int main() { _strdup(0); return 0; } " HAVE_ISO_STRDUP) # Detect WinRT mode if(CMAKE_SYSTEM_NAME STREQUAL "WindowsStore") set(PLATFORM WINRT 1) endif() taglib-1.13.1/Doxyfile.cmake000066400000000000000000000275471444773637700156710ustar00rootroot00000000000000# Doxyfile 1.9.1 #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = TagLib PROJECT_NUMBER = ${TAGLIB_LIB_VERSION_STRING} PROJECT_BRIEF = PROJECT_LOGO = @CMAKE_SOURCE_DIR@/doc/taglib.svg OUTPUT_DIRECTORY = doc CREATE_SUBDIRS = NO ALLOW_UNICODE_NAMES = NO OUTPUT_LANGUAGE = English OUTPUT_TEXT_DIRECTION = None BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO FULL_PATH_NAMES = NO STRIP_FROM_PATH = STRIP_FROM_INC_PATH = SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO JAVADOC_BANNER = NO QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO PYTHON_DOCSTRING = YES INHERIT_DOCS = YES SEPARATE_MEMBER_PAGES = NO TAB_SIZE = 4 ALIASES = OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO OPTIMIZE_OUTPUT_SLICE = NO EXTENSION_MAPPING = MARKDOWN_SUPPORT = YES TOC_INCLUDE_HEADINGS = 5 AUTOLINK_SUPPORT = YES BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES DISTRIBUTE_GROUP_DOC = NO GROUP_NESTED_COMPOUNDS = NO SUBGROUPING = YES INLINE_GROUPED_CLASSES = NO INLINE_SIMPLE_STRUCTS = NO TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 NUM_PROC_THREADS = 1 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- EXTRACT_ALL = YES EXTRACT_PRIVATE = NO EXTRACT_PRIV_VIRTUAL = NO EXTRACT_PACKAGE = NO EXTRACT_STATIC = NO EXTRACT_LOCAL_CLASSES = NO EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO RESOLVE_UNNAMED_PARAMS = YES HIDE_UNDOC_MEMBERS = NO HIDE_UNDOC_CLASSES = NO HIDE_FRIEND_COMPOUNDS = NO HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = YES CASE_SENSE_NAMES = YES HIDE_SCOPE_NAMES = NO HIDE_COMPOUND_REFERENCE= NO SHOW_INCLUDE_FILES = YES SHOW_GROUPED_MEMB_INC = NO FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = YES SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = NO SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO STRICT_PROTO_MATCHING = NO GENERATE_TODOLIST = NO GENERATE_TESTLIST = NO GENERATE_BUGLIST = NO GENERATE_DEPRECATEDLIST= YES ENABLED_SECTIONS = MAX_INITIALIZER_LINES = 30 SHOW_USED_FILES = YES SHOW_FILES = YES SHOW_NAMESPACES = YES FILE_VERSION_FILTER = LAYOUT_FILE = CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES WARN_IF_UNDOCUMENTED = NO WARN_IF_DOC_ERROR = YES WARN_NO_PARAMDOC = NO WARN_AS_ERROR = NO WARN_FORMAT = "$file:$line: $text" WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- INPUT = @CMAKE_SOURCE_DIR@/taglib INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.h \ *.hh \ *.H RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = * EXAMPLE_RECURSIVE = NO IMAGE_PATH = INPUT_FILTER = FILTER_PATTERNS = FILTER_SOURCE_FILES = NO FILTER_SOURCE_PATTERNS = USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = NO INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES SOURCE_TOOLTIPS = YES USE_HTAGS = NO VERBATIM_HEADERS = YES CLANG_ASSISTED_PARSING = NO CLANG_ADD_INC_PATHS = YES CLANG_OPTIONS = CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = YES IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = @CMAKE_SOURCE_DIR@/doc/api-header.html HTML_FOOTER = @CMAKE_SOURCE_DIR@/doc/api-footer.html HTML_STYLESHEET = HTML_EXTRA_STYLESHEET = HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 HTML_TIMESTAMP = NO HTML_DYNAMIC_MENUS = YES HTML_DYNAMIC_SECTIONS = NO HTML_INDEX_NUM_ENTRIES = 100 GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" DOCSET_BUNDLE_ID = org.doxygen.Project DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher GENERATE_HTMLHELP = NO CHM_FILE = HHC_LOCATION = GENERATE_CHI = NO CHM_INDEX_ENCODING = BINARY_TOC = NO TOC_EXPAND = NO GENERATE_QHP = NO QCH_FILE = QHP_NAMESPACE = org.doxygen.Project QHP_VIRTUAL_FOLDER = doc QHP_CUST_FILTER_NAME = QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = QHG_LOCATION = GENERATE_ECLIPSEHELP = NO ECLIPSE_DOC_ID = org.doxygen.Project DISABLE_INDEX = NO GENERATE_TREEVIEW = NO ENUM_VALUES_PER_LINE = 4 TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO HTML_FORMULA_FORMAT = png FORMULA_FONTSIZE = 10 FORMULA_TRANSPARENT = YES FORMULA_MACROFILE = USE_MATHJAX = NO MATHJAX_FORMAT = HTML-CSS MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 MATHJAX_EXTENSIONS = MATHJAX_CODEFILE = SEARCHENGINE = NO SERVER_BASED_SEARCH = NO EXTERNAL_SEARCH = NO SEARCHENGINE_URL = SEARCHDATA_FILE = searchdata.xml EXTERNAL_SEARCH_ID = EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = latex LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex LATEX_MAKEINDEX_CMD = makeindex COMPACT_LATEX = NO PAPER_TYPE = letter EXTRA_PACKAGES = LATEX_HEADER = LATEX_FOOTER = LATEX_EXTRA_STYLESHEET = LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES USE_PDFLATEX = YES LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain LATEX_TIMESTAMP = NO LATEX_EMOJI_DIRECTORY = #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = rtf COMPACT_RTF = NO RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = RTF_SOURCE_CODE = NO #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = man MAN_EXTENSION = .3 MAN_SUBDIR = MAN_LINKS = NO #--------------------------------------------------------------------------- # Configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml XML_PROGRAMLISTING = YES XML_NS_MEMB_FILE_SCOPE = NO #--------------------------------------------------------------------------- # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook DOCBOOK_PROGRAMLISTING = NO #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO PERLMOD_PRETTY = YES PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES MACRO_EXPANSION = NO EXPAND_ONLY_PREDEF = NO SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = DO_NOT_DOCUMENT \ DOXYGEN EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration options related to external references #--------------------------------------------------------------------------- TAGFILES = GENERATE_TAGFILE = ALLEXTERNALS = NO EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- CLASS_DIAGRAMS = YES DIA_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES DOT_NUM_THREADS = 0 DOT_FONTNAME = Helvetica DOT_FONTSIZE = 10 DOT_FONTPATH = CLASS_GRAPH = YES COLLABORATION_GRAPH = YES GROUP_GRAPHS = YES UML_LOOK = NO UML_LIMIT_NUM_FIELDS = 10 DOT_UML_DETAILS = NO DOT_WRAP_THRESHOLD = 17 TEMPLATE_RELATIONS = YES INCLUDE_GRAPH = YES INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO CALLER_GRAPH = NO GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES DOT_IMAGE_FORMAT = svg INTERACTIVE_SVG = NO DOT_PATH = DOTFILE_DIRS = MSCFILE_DIRS = DIAFILE_DIRS = PLANTUML_JAR_PATH = PLANTUML_CFG_FILE = PLANTUML_INCLUDE_PATH = DOT_GRAPH_MAX_NODES = 100 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES DOT_CLEANUP = YES taglib-1.13.1/INSTALL.md000066400000000000000000000167061444773637700145270ustar00rootroot00000000000000TagLib Installation =================== TagLib uses the CMake build system. As a user, you will most likely want to build TagLib in release mode and install it into a system-wide location. This can be done using the following commands: cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release . make sudo make install In order to build the included examples, use the `BUILD_EXAMPLES` option: cmake -DBUILD_EXAMPLES=ON [...] If you want to build TagLib without ZLib, you can use cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release -DWITH_ZLIB=OFF . make sudo make install See http://www.cmake.org/cmake/help/runningcmake.html for generic help on running CMake. Mac OS X -------- On Mac OS X, you might want to build a framework that can be easily integrated into your application. If you set the BUILD_FRAMEWORK option on, it will compile TagLib as a framework. For example, the following command can be used to build a framework with Mac OS X 10.10 as the deployment target: mkdir build; cd build cmake .. -DCMAKE_BUILD_TYPE=Release \ -DBUILD_TESTING=OFF \ -DBUILD_FRAMEWORK=ON \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 \ -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" make For a 10.10 static library, use: mkdir build; cd build cmake .. -DCMAKE_BUILD_TYPE=Release \ -DBUILD_TESTING=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_OSX_DEPLOYMENT_TARGET=10.10 \ -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" make After `make`, and `make install`, add `libtag.` to your XCode project, and add the include folder to the project's User Header Search Paths. Windows ------- It's Windows ... Systems vary! This means you need to adjust things to suit your system, especially paths. Tested with: * Microsoft Visual Studio 2010, 2015, 2017 * Microsoft C++ Build Tools 2015, 2017 (standalone packages not requiring Visual Studio) * GCC by mingw-w64.sf.net v4.6.3 (Strawberry Perl 32b) * MinGW32-4.8.0 Requirements: * Tool chain, build environment, whatever ya want to call it ... Installed and working. * CMake program. (Available at: www.cmake.org) Installed and working. Optional: * Zlib library. Available in some tool chains, not all. Search the web, take your choice. Useful configuration options used with CMake (GUI and/or command line): Any of the `ZLIB_` variables may be used at the command line, `ZLIB_ROOT` is only available on the command line. | option | description | | ----------------------- | ----------- | | `WITH_ZLIB=` | Whether to build with ZLib | | `ZLIB_ROOT=` | Where to find ZLib's root directory. Assumes parent of: `\include` and `\lib.`| | `ZLIB_INCLUDE_DIR=` | Where to find ZLib's Include directory.| | `ZLIB_LIBRARY=` | Where to find ZLib's Library. | `ZLIB_SOURCE=` | Where to find ZLib's Source Code. Alternative to `ZLIB_INCLUDE_DIR` and `ZLIB_LIBRARY`. | `CMAKE_INSTALL_PREFIX=` | Where to install Taglib. | | `CMAKE_BUILD_TYPE=` | Release, Debug, etc ... (Not available in MSVC) | The easiest way is at the command prompt (Visual C++ command prompt for MSVS users – batch file and/or shortcuts are your friends). 1. **Build the Makefiles:** Replace "GENERATOR" with your needs. * For MSVS: `Visual Studio XX YYYY`, e.g. `Visual Studio 14 2015`. **Note**: As Visual Studio 2017 supports CMake, you can skip this step and open the taglib folder in VS instead. * For MinGW: `MinGW Makefiles` C:\GitRoot\taglib> cmake -G "GENERATOR" -DCMAKE_INSTALL_PREFIX=C:\Libraries\taglib Or use the CMake GUI: 1. Open CMake GUI. 2. Set paths: *Where is the source code* and *Where to build the binaries*. In the example, both would be: `C:\GitRoot\taglib` 3. Tick: Advanced 4. Select: Configure 5. Select: Generator 6. Tick: Use default native compilers 7. Select: Finish Wait until done. 8. If using ZLib, Scroll down. (to the bottom of the list of options ... should go over them all) 1. Edit: `ZLIB_INCLUDE_DIR` 2. Edit: `ZLIB_LIBRARY` 9. Select: Generate 2. **Build the project** * MSVS: C:\GitRoot\taglib> msbuild all_build.vcxproj /p:Configuration=Release OR (Depending on MSVS version or personal choice) C:\GitRoot\taglib> devenv all_build.vcxproj /build Release OR in the MSVS GUI: 1. Open MSVS. 2. Open taglib solution. 3. Set build type to: Release (look in the tool bars) 2. Hit F7 to build the solution. (project) * MinGW: C:\GitRoot\taglib> gmake OR (Depending on MinGW install) C:\GitRoot\taglib> mingw32-make 3. **Install the project** (Change `install` to `uninstall` to uninstall the project) * MSVS: C:\GitRoot\taglib> msbuild install.vcxproj OR (Depending on MSVC version or personal choice) C:\GitRoot\taglib> devenv install.vcxproj Or in the MSVS GUI: 1. Open project. 2. Open Solution Explorer. 3. Right Click: INSTALL 4. Select: Project Only 5. Select: Build Only INSTALL * MinGW: C:\GitRoot\taglib> gmake install OR (Depending on MinGW install) C:\GitRoot\taglib> mingw32-make install To build a static library, set the following two options with CMake: -DBUILD_SHARED_LIBS=OFF -DENABLE_STATIC_RUNTIME=ON Including `ENABLE_STATIC_RUNTIME=ON` indicates you want TagLib built using the static runtime library, rather than the DLL form of the runtime. Unit Tests ---------- If you want to run the test suite to make sure TagLib works properly on your system, you need to have cppunit installed. To build the tests, include the option `-DBUILD_TESTING=ON` when running cmake. The test suite has a custom target in the build system, so you can run the tests using make: make check Windows MinGW: * Get cppunit from https://www.freedesktop.org/wiki/Software/cppunit/ * Build it for MinGW: - `./autogen.sh` - `./configure --disable-shared` - `mingw32-make; mingw32-make install DESTDIR=/path/to/install/dir` * Build TagLib with testing enabled: - ``` cmake -G "MinGW Makefiles" -DBUILD_TESTING=ON -DBUILD_EXAMPLES=ON -DBUILD_SHARED_LIBS=OFF \ -DCPPUNIT_INCLUDE_DIR=/path/to/cppunit/include \ -DCPPUNIT_LIBRARIES=/path/to/cppunit/lib/libcppunit.a \ -DCPPUNIT_INSTALLED_VERSION=1.15.1 ``` - `mingw32-make` - `mingw32-make check` Windows MSVS: * Get cppunit from https://www.freedesktop.org/wiki/Software/cppunit/ * Build it in Visual Studio: - Open examples/examples2008.sln, convert all, do not overwrite. - Set architecture to x64, build configuration, e.g. Debug DLL. - It may fail, but the needed libraries should be available in src\cppunit\DebugDll. * Build TagLib with testing enabled: - ``` cmake -G "Visual Studio 16 2019" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTING=ON -DBUILD_EXAMPLES=ON -DBUILD_SHARED_LIBS=OFF -DENABLE_STATIC_RUNTIME=ON -DCPPUNIT_INCLUDE_DIR=\path\to\cppunit\include -DCPPUNIT_LIBRARIES=\path\to\cppunit\DebugDll\cppunitd_dll.lib -DCPPUNIT_INSTALLED_VERSION=1.15.1 ``` - `msbuild all_build.vcxproj /p:Configuration=Debug` - `path %path%;\path\to\cppunit\DebugDll` - `tests\Debug\test_runner.exe` macOS: * Install cppunit using a package manager, e.g. `brew install cppunit` * Build TagLib with testing enabled: - `cmake -DBUILD_TESTS=ON -DBUILD_EXAMPLES=ON -DBUILD_SHARED_LIBS=OFF` - `make` - `make check` taglib-1.13.1/NEWS000066400000000000000000000403761444773637700135760ustar00rootroot00000000000000TagLib 1.13.1 (Jul 1, 2023) =========================== * Fixed parsing of TXXX frames without description. * Detect MP4 atoms with invalid length or type. * Do not miss ID3v2 frames when an extended header is present. * Use property "DISCSUBTITLE" for ID3v2 "TSST" frame. * Build system improvements: Use absolute path for macOS dylib install name, support --define-prefix when using pkg-config, fixed minimum required CppUnit version. * Code clean up using clang-tidy. TagLib 1.13 (Oct 27, 2022) ========================== * Added interface StreamTypeResolver to support streams which cannot be fopen()'ed, e.g. network files. * Added MP4::File::strip() to remove meta atom from MP4 file. * Added Map::value() to look up without creating entry. * Use property "WORK" instead of "CONTENTGROUP" for ID3v2 "TIT1" frame, use property "WORK" for ASF "WM/ContentGroupDescription", use property "COMPILATION" for ID3v2 "TCMP" frame. * Build system improvements: option WITH_ZLIB, BUILD_TESTING instead of BUILD_TESTS, GNUInstallDirs, FeatureSummary, tests with BUILD_SHARED_LIBS, cross compilation with Buildroot, systems without HAVE_GCC_ATOMIC, Clang. * Fixed heap-buffer-overflows when handling ASF, APE, FLAC, ID3v2, MP4, MPC tags. * Fixed detection of invalid file by extension when correct type can be detected by contents. * Fixed unnecessary creation of map entries in APE and FLAC tags if looked up tag does not exist. * Fixed parsing of MP4 non-full meta atoms. * Fixed potential ID3v1 false positive in the presence of an APE tag. * Fixed ID3v2 version handling for frames embedded in CHAP or CTOC frames. * Fixed parsing of multiple strings with a single BOM in ID3v2.4.0. * Fixed several smaller issues reported by clang-tidy. TagLib 1.12 (Feb 16, 2021) ========================== * Added support for WinRT. * Added support for Linux on POWER. * Added support for classical music tags of iTunes 12.5. * Added support for file descriptor to FileStream. * Added support for 'cmID', 'purl', 'egid' MP4 atoms. * Added support for 'GRP1' ID3v2 frame. * Added support for extensible WAV subformat. * Enabled FileRef to detect file types based on the stream content. * Dropped support for Windows 9x and NT 4.0 or older. * Check for mandatory header objects in ASF files. * More tolerant handling of RIFF padding, WAV files, broken MPEG streams. * Improved calculation of Ogg, Opus, Speex, WAV, MP4 bitrates. * Improved Windows compatibility by storing FLAC picture after comments. * Fixed numerical genres in ID3v2.3.0 'TCON' frames. * Fixed consistency of API removing MP4 items when empty values are set. * Fixed consistency of API preferring COMM frames with no description. * Fixed OOB read on invalid Ogg FLAC files (CVE-2018-11439). * Fixed handling of empty MPEG files. * Fixed parsing MP4 mdhd timescale. * Fixed reading MP4 atoms with zero length. * Fixed reading FLAC files with zero-sized seektables. * Fixed handling of lowercase field names in Vorbis Comments. * Fixed handling of 'rate' atoms in MP4 files. * Fixed handling of invalid UTF-8 sequences. * Fixed possible file corruptions when saving Ogg files. * Fixed handling of non-audio blocks, sampling rates, DSD audio in WavPack files. * TableOfContentsFrame::toString() improved. * UserTextIdentificationFrame::toString() improved. * Marked FileRef::create() deprecated. * Marked MPEG::File::save() with boolean parameters deprecated, provide overloads with enum parameters. * Several smaller bug fixes and performance improvements. TagLib 1.11.1 (Oct 24, 2016) ============================ * Fixed binary incompatible change in TagLib::String. * Fixed reading ID3v2 CTOC frames with a lot of entries. * Fixed seeking ByteVectorStream from the end. TagLib 1.11 (Apr 29, 2016) ========================== 1.11: * Fixed reading APE items with long keys. * Fixed reading ID3v2 SYLT frames when description is empty. 1.11 BETA 2: * Better handling of PCM WAV files with a 'fact' chunk. * Better handling of corrupted APE tags. * Efficient decoding of unsynchronized ID3v2 frames. * Fixed text encoding when saving certain frames in ID3v2.3 tags. * Fixed updating the size of RIFF files when removing chunks. * Several smaller bug fixes and performance improvements. 1.11 BETA: * New API for creating FileRef from IOStream. * Added support for ID3v2 PCST and WFED frames. * Added support for pictures in XiphComment. * Added String::clear(). * Added FLAC::File::strip() for removing non-standard tags. * Added alternative functions to XiphComment::removeField(). * Added BUILD_BINDINGS build option. * Added ENABLE_CCACHE build option. * Replaced ENABLE_STATIC build option with BUILD_SHARED_LIBS. * Better handling of duplicate ID3v2 tags in all kinds of files. * Better handling of duplicate tag chunks in WAV files. * Better handling of duplicate tag chunks in AIFF files. * Better handling of duplicate Vorbis comment blocks in FLAC files. * Better handling of broken MPEG audio frames. * Fixed crash when calling File::properties() after strip(). * Fixed crash when parsing certain MPEG files. * Fixed crash when saving Ogg files. * Fixed possible file corruptions when saving ASF files. * Fixed possible file corruptions when saving FLAC files. * Fixed possible file corruptions when saving MP4 files. * Fixed possible file corruptions when saving MPEG files. * Fixed possible file corruptions when saving APE files. * Fixed possible file corruptions when saving Musepack files. * Fixed possible file corruptions when saving WavPack files. * Fixed updating the comment field of Vorbis comments. * Fixed reading date and time in ID3v2.3 tags. * Marked ByteVector::null and ByteVector::isNull() deprecated. * Marked String::null and String::isNull() deprecated. * Marked XiphComment::removeField() deprecated. * Marked Ogg::Page::getCopyWithNewPageSequenceNumber() deprecated. It returns null. * Marked custom integer types deprecated. * Many smaller bug fixes and performance improvements. TagLib 1.10 (Nov 11, 2015) ========================== 1.10: * Added new options to the tagwriter example. * Fixed self-assignment operator in some types. * Fixed extraction of MP4 tag keys with an empty list. 1.10 BETA: * New API for the audio length in milliseconds. * Added support for ID3v2 ETCO and SYLT frames. * Added support for album artist in PropertyMap API of MP4 files. * Added support for embedded frames in ID3v2 CHAP and CTOC frames. * Added support for AIFF-C files. * Better handling of duplicate ID3v2 tags in MPEG files. * Allowed generating taglib.pc on Windows. * Added ZLIB_SOURCE build option. * Fixed backwards-incompatible change in TagLib::String when constructing UTF16 strings. * Fixed crash when parsing certain FLAC files. * Fixed crash when encoding empty strings. * Fixed saving of certain XM files on OS X. * Changed Xiph and APE generic getters to return space-concatenated values. * Fixed possible file corruptions when removing tags from WAV files. * Added support for MP4 files with 64-bit atoms in certain 64-bit environments. * Prevented ID3v2 padding from being too large. * Fixed crash when parsing corrupted APE files. * Fixed crash when parsing corrupted WAV files. * Fixed crash when parsing corrupted Ogg FLAC files. * Fixed crash when parsing corrupted MPEG files. * Fixed saving empty tags in WAV files. * Fixed crash when parsing corrupted Musepack files. * Fixed possible memory leaks when parsing AIFF and WAV files. * Fixed crash when parsing corrupted MP4 files. * Stopped writing empty ID3v2 frames. * Fixed possible file corruptions when saving WMA files. * Added TagLib::MP4::Tag::isEmpty(). * Added accessors to manipulate MP4 tags. * Fixed crash when parsing corrupted WavPack files. * Fixed seeking MPEG frames. * Fixed reading FLAC files with zero-sized padding blocks. * Added support for reading the encoder information of WMA files. * Added support for reading the codec of WAV files. * Added support for multi channel WavPack files. * Added support for reading the nominal bitrate of Ogg Speex files. * Added support for VBR headers in MPEG files. * Marked FLAC::File::streamInfoData() deprecated. It returns an empty ByteVector. * Marked FLAC::File::streamLength() deprecated. It returns zero. * Fixed possible file corruptions when adding an ID3v1 tag to FLAC files. * Many smaller bug fixes and performance improvements. TagLib 1.9.1 (Oct 8, 2013) ========================== * Fixed binary incompatible change in TagLib::Map and TagLib::List. * Fixed constructing String from ByteVector. * Fixed compilation on MSVC with the /Zc:wchar_t- option. * Fixed detecting of RIFF files with invalid chunk sizes. * Added TagLib::MP4::Properties::codec(). TagLib 1.9 (Oct 6, 2013) ======================== * Added support for the Ogg Opus file format. * Added support for INFO tags in WAV files. * Changed FileStream to use Windows file API. * Included taglib-config.cmd script for Windows. * New ID3v1::Tag methods for working directly with genre numbers. * New MPEG::File methods for checking which tags are saved in the file. * Added support for the PropertyMap API to ASF and MP4 files. * Added MusicBrainz identifiers to the PropertyMap API. * Allowed reading of MP4 cover art without an explicitly specified format. * Better parsing of corrupted FLAC files. * Fixed saving of PropertyMap comments without description into ID3v2 tags. * Fixed crash when parsing certain XM files. * Fixed compilation of unit test with clang. * Better handling of files that can't be open or have read-only permissions. * Improved atomic reference counting. * New hookable API for debug messages. * More complete Windows install instructions. * Many smaller bug fixes and performance improvements. TagLib 1.8 (Sep 6, 2012) ======================== 1.8: * Added support for OWNE ID3 frames. * Changed key validation in the new PropertyMap API. * ID3v1::Tag::setStringHandler will no londer delete the previous handler, the caller is responsible for this. * File objects will also no longer delete the passed IOStream objects. It should be done in the caller code after the File object is no longer used. * Added ID3v2::Tag::setLatin1StringHandler for custom handling of latin1-encoded text in ID3v2 frames. * Fixed validation of ID3v2 frame IDs (IDs with '0' were ignored). 1.8 BETA: * New API for accessing tags by name. * New abstract I/O stream layer to allow custom I/O handlers. * Support for writing ID3v2.3 tags. * Support for various module file formats (MOD, S3M, IT, XM). * Support for MP4 and ASF is now enabled by default. * Started using atomic int operations for reference counting. * Added methods for checking if WMA and MP4 files are DRM-protected. * Added taglib_free to the C bindings. * New method to allow removing pictures from FLAC files. * Support for reading audio properties from ALAC and Musepack SV8 files. * Added replay-gain information to Musepack audio properties. * Support for APEv2 binary tags. * Many AudioProperties subclasses now provide information about the total number of samples. * Various small bug fixes. TagLib 1.7.2 (Apr 20, 2012) =========================== * Fixed division by zero while parsing corrupted MP4 files (CVE-2012-2396). * Fixed compilation on Haiku. TagLib 1.7.1 (Mar 17, 2012) =========================== * Improved parsing of corrupted WMA, RIFF and OGG files. * Fixed a memory leak in the WMA parser. * Fixed a memory leak in the FLAC parser. * Fixed a possible division by zero in the APE parser. * Added detection of TTA2 files. * Fixed saving of multiple identically named tags to Vorbis Comments. TagLib 1.7 (Mar 11, 2011) ========================= 1.7: * Fixed memory leaks in the FLAC file format parser. * Fixed bitrate calculation for WAV files. 1.7 RC1: * Support for reading/writing tags from Monkey's Audio files. (BUG:210404) * Support for reading/writing embedded pictures from WMA files. * Support for reading/writing embedded pictures from FLAC files (BUG:218696). * Implemented APE::Tag::isEmpty() to check for all APE tags, not just the basic ones. * Added reading of WAV audio length. (BUG:116033) * Exposed FLAC MD5 signature of the uncompressed audio stream via FLAC::Properties::signature(). (BUG:160172) * Added function ByteVector::toHex() for hex-encoding of byte vectors. * WavPack reader now tries to get the audio length by finding the final block, if the header doesn't have the information. (BUG:258016) * Fixed a memory leak in the ID3v2.2 PIC frame parser. (BUG:257007) * Fixed writing of RIFF files with even chunk sizes. (BUG:243954) * Fixed compilation on MSVC 2010. * Removed support for building using autoconf/automake. * API docs can be now built using "make docs". TagLib 1.6.3 (Apr 17, 2010) =========================== * Fixed definitions of the TAGLIB_WITH_MP4 and TAGLIB_WITH_ASF macros. * Fixed upgrading of ID3v2.3 genre frame with ID3v1 code 0 (Blues). * New method `int String::toInt(bool *ok)` which can return whether the conversion to a number was successful. * Fixed parsing of incorrectly written lengths in ID3v2 (affects mainly compressed frames). (BUG:231075) TagLib 1.6.2 (Apr 9, 2010) ========================== * Read Vorbis Comments from the first FLAC metadata block, if there are multiple ones. (BUG:211089) * Fixed a memory leak in FileRef's OGA format detection. * Fixed compilation with the Sun Studio compiler. (BUG:215225) * Handle WM/TrackNumber attributes with DWORD content in WMA files. (BUG:218526) * More strict check if something is a valid MP4 file. (BUG:216819) * Correctly save MP4 int-pair atoms with flags set to 0. * Fixed compilation of the test runner on Windows. * Store ASF attributes larger than 64k in the metadata library object. * Ignore trailing non-data atoms when parsing MP4 covr atoms. * Don't upgrade ID3v2.2 frame TDA to TDRC. (BUG:228968) TagLib 1.6.1 (Oct 31, 2009) =========================== * Better detection of the audio codec of .oga files in FileRef. * Fixed saving of Vorbis comments to Ogg FLAC files. TagLib tried to include the Vorbis framing bit, which is only correct for Ogg Vorbis. * Public symbols now have explicitly set visibility to "default" on GCC. * Added missing exports for static ID3v1 functions. * Fixed a typo in taglib_c.pc * Fixed a failing test on ppc64. * Support for binary 'covr' atom in MP4 files. TagLib 1.6 treated them as text atoms, which corrupted them in some cases. * Fixed ID3v1-style genre to string conversion in MP4 files. TagLib 1.6 (Sep 13, 2009) ========================= 1.6: * New CMake option to build a static version - ENABLE_STATIC. * Added support for disabling dllimport/dllexport on Windows using the TAGLIB_STATIC macro. * Support for parsing the obsolete 'gnre' MP4 atom. * New cpp macros TAGLIB_WITH_MP4 and TAGLIB_WITH_ASF to determine if TagLib was built with MP4/ASF support. 1.6 RC1: * Split Ogg packets larger than 64k into multiple pages. (BUG:171957) * TagLib can now use FLAC padding block. (BUG:107659) * ID3v2.2 frames are now not incorrectly saved. (BUG:176373) * Support for ID3v2.2 PIC frames. (BUG:167786) * Fixed a bug in ByteVectorList::split(). * XiphComment::year() now falls back to YEAR if DATE doesn't exist and XiphComment::year() falls back to TRACKNUM if TRACKNUMBER doesn't exist. (BUG:144396) * Improved ID3v2.3 genre parsing. (BUG:188578) * Better checking of corrupted ID3v2 APIC data. (BUG:168382) * Bitrate calculating using the Xing header now uses floating point numbers. (BUG:172556) * New TagLib::String method rfind(). * Added support for MP4 file format with iTunes-style metadata [optional]. * Added support for ASF (WMA) file format [optional]. * Fixed crash when saving a Locator APEv2 tag. (BUG:169810) * Fixed a possible crash in the non-const version of String::operator[] and in String::operator+=. (BUG:169389) * Added support for PRIV ID3v2 frames. * Empty ID3v2 genres are no longer treated as numeric ID3v1 genres. * Added support for the POPM (rating/playcount) ID3v2 frame. * Generic RIFF file format support: * Support for AIFF files with ID3v2 tags. * Support for WAV files with ID3v2 tags. * Fixed crash on handling unsupported ID3v2 frames, e.g. on encrypted frames. (BUG:161721) * Fixed overflow while calculating bitrate of FLAC files with a very high bitrate. taglib-1.13.1/README.md000066400000000000000000000017661444773637700143560ustar00rootroot00000000000000# TagLib [![Build Status](../../actions/workflows/build.yml/badge.svg)](../../actions) ### TagLib Audio Metadata Library https://taglib.org/ TagLib is a library for reading and editing the metadata of several popular audio formats. Currently it supports both ID3v1 and [ID3v2][] for MP3 files, [Ogg Vorbis][] comments and ID3 tags in [FLAC][], MPC, Speex, WavPack, TrueAudio, WAV, AIFF, MP4, APE, and ASF files. TagLib is distributed under the [GNU Lesser General Public License][] (LGPL) and [Mozilla Public License][] (MPL). Essentially that means that it may be used in proprietary applications, but if changes are made to TagLib they must be contributed back to the project. Please review the licenses if you are considering using TagLib in your project. [ID3v2]: https://id3.org/ [Ogg Vorbis]: https://xiph.org/vorbis/ [FLAC]: https://xiph.org/flac/ [GNU Lesser General Public License]: https://www.gnu.org/licenses/lgpl.html [Mozilla Public License]: https://www.mozilla.org/MPL/MPL-1.1.html taglib-1.13.1/bindings/000077500000000000000000000000001444773637700146625ustar00rootroot00000000000000taglib-1.13.1/bindings/CMakeLists.txt000066400000000000000000000000251444773637700174170ustar00rootroot00000000000000add_subdirectory(c) taglib-1.13.1/bindings/README000066400000000000000000000004351444773637700155440ustar00rootroot00000000000000There are a few other people that have done bindings externally that I have been made aware of. I have not personally reviewed these bindings, but I'm listing them here so that those who find them useful are able to find them: http://developer.kde.org/~wheeler/taglib.html#bindings taglib-1.13.1/bindings/c/000077500000000000000000000000001444773637700151045ustar00rootroot00000000000000taglib-1.13.1/bindings/c/CMakeLists.txt000066400000000000000000000055231444773637700176510ustar00rootroot00000000000000include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/toolkit ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/asf ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/vorbis ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/flac ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/flac ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpc ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mp4 ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg/id3v2 ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg/id3v2/frames ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/wavpack ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/speex ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/trueaudio ) set(tag_c_HDRS tag_c.h) add_library(tag_c tag_c.cpp ${tag_c_HDRS}) target_link_libraries(tag_c tag) set_target_properties(tag_c PROPERTIES PUBLIC_HEADER "${tag_c_HDRS}" DEFINE_SYMBOL MAKE_TAGLIB_LIB ) if(VISIBILITY_HIDDEN) set_target_properties(tag_c PROPERTIES C_VISIBILITY_PRESET hidden ) endif() if(BUILD_FRAMEWORK) set_target_properties(tag_c PROPERTIES FRAMEWORK TRUE) endif() # On Solaris we need to explicitly add the C++ standard and runtime # libraries to the libs used by the C bindings, because those C bindings # themselves won't pull in the C++ libs -- and if a C application is # using the C bindings then we get link errors. check_library_exists(Crun __RTTI___ "" HAVE_CRUN_LIB) if(HAVE_CRUN_LIB) # Which libraries to link depends critically on which # STL version is going to be used by your application # and which runtime is in use. While Crun is pretty much # the only game in town, the three available STLs -- Cstd, # stlport4 and stdcxx -- make this a mess. The KDE-Solaris # team supports stdcxx (Apache RogueWave stdcxx 4.1.3). # According to http://bugs.kde.org/show_bug.cgi?id=215225 the library can have the following two names: find_library(ROGUEWAVE_STDCXX_LIBRARY NAMES stdcxx4 stdcxx) if(NOT ROGUEWAVE_STDCXX_LIBRARY) message(FATAL_ERROR "Did not find supported STL library (tried stdcxx4 and stdcxx)") endif() target_link_libraries(tag_c ${ROGUEWAVE_STDCXX_LIBRARY} Crun) endif() set_target_properties(tag_c PROPERTIES VERSION 0.0.0 SOVERSION 0 DEFINE_SYMBOL MAKE_TAGLIB_C_LIB INSTALL_NAME_DIR ${CMAKE_INSTALL_FULL_LIBDIR} ) install(TARGETS tag_c FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/taglib ) if(NOT BUILD_FRAMEWORK) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/taglib_c.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/taglib_c.pc @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/taglib_c.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) endif() taglib-1.13.1/bindings/c/tag_c.cpp000066400000000000000000000212671444773637700166750ustar00rootroot00000000000000/*************************************************************************** copyright : (C) 2003 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * * USA * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "tag_c.h" using namespace TagLib; namespace { List strings; bool unicodeStrings = true; bool stringManagementEnabled = true; char *stringToCharArray(const String &s) { const std::string str = s.to8Bit(unicodeStrings); #ifdef HAVE_ISO_STRDUP return ::_strdup(str.c_str()); #else return ::strdup(str.c_str()); #endif } String charArrayToString(const char *s) { return String(s, unicodeStrings ? String::UTF8 : String::Latin1); } } // namespace void taglib_set_strings_unicode(BOOL unicode) { unicodeStrings = (unicode != 0); } void taglib_set_string_management_enabled(BOOL management) { stringManagementEnabled = (management != 0); } void taglib_free(void* pointer) { free(pointer); } //////////////////////////////////////////////////////////////////////////////// // TagLib::File wrapper //////////////////////////////////////////////////////////////////////////////// TagLib_File *taglib_file_new(const char *filename) { return reinterpret_cast(FileRef::create(filename)); } TagLib_File *taglib_file_new_type(const char *filename, TagLib_File_Type type) { switch(type) { case TagLib_File_MPEG: return reinterpret_cast(new MPEG::File(filename)); case TagLib_File_OggVorbis: return reinterpret_cast(new Ogg::Vorbis::File(filename)); case TagLib_File_FLAC: return reinterpret_cast(new FLAC::File(filename)); case TagLib_File_MPC: return reinterpret_cast(new MPC::File(filename)); case TagLib_File_OggFlac: return reinterpret_cast(new Ogg::FLAC::File(filename)); case TagLib_File_WavPack: return reinterpret_cast(new WavPack::File(filename)); case TagLib_File_Speex: return reinterpret_cast(new Ogg::Speex::File(filename)); case TagLib_File_TrueAudio: return reinterpret_cast(new TrueAudio::File(filename)); case TagLib_File_MP4: return reinterpret_cast(new MP4::File(filename)); case TagLib_File_ASF: return reinterpret_cast(new ASF::File(filename)); default: return 0; } } void taglib_file_free(TagLib_File *file) { delete reinterpret_cast(file); } BOOL taglib_file_is_valid(const TagLib_File *file) { return reinterpret_cast(file)->isValid(); } TagLib_Tag *taglib_file_tag(const TagLib_File *file) { const File *f = reinterpret_cast(file); return reinterpret_cast(f->tag()); } const TagLib_AudioProperties *taglib_file_audioproperties(const TagLib_File *file) { const File *f = reinterpret_cast(file); return reinterpret_cast(f->audioProperties()); } BOOL taglib_file_save(TagLib_File *file) { return reinterpret_cast(file)->save(); } //////////////////////////////////////////////////////////////////////////////// // TagLib::Tag wrapper //////////////////////////////////////////////////////////////////////////////// char *taglib_tag_title(const TagLib_Tag *tag) { const Tag *t = reinterpret_cast(tag); char *s = stringToCharArray(t->title()); if(stringManagementEnabled) strings.append(s); return s; } char *taglib_tag_artist(const TagLib_Tag *tag) { const Tag *t = reinterpret_cast(tag); char *s = stringToCharArray(t->artist()); if(stringManagementEnabled) strings.append(s); return s; } char *taglib_tag_album(const TagLib_Tag *tag) { const Tag *t = reinterpret_cast(tag); char *s = stringToCharArray(t->album()); if(stringManagementEnabled) strings.append(s); return s; } char *taglib_tag_comment(const TagLib_Tag *tag) { const Tag *t = reinterpret_cast(tag); char *s = stringToCharArray(t->comment()); if(stringManagementEnabled) strings.append(s); return s; } char *taglib_tag_genre(const TagLib_Tag *tag) { const Tag *t = reinterpret_cast(tag); char *s = stringToCharArray(t->genre()); if(stringManagementEnabled) strings.append(s); return s; } unsigned int taglib_tag_year(const TagLib_Tag *tag) { const Tag *t = reinterpret_cast(tag); return t->year(); } unsigned int taglib_tag_track(const TagLib_Tag *tag) { const Tag *t = reinterpret_cast(tag); return t->track(); } void taglib_tag_set_title(TagLib_Tag *tag, const char *title) { Tag *t = reinterpret_cast(tag); t->setTitle(charArrayToString(title)); } void taglib_tag_set_artist(TagLib_Tag *tag, const char *artist) { Tag *t = reinterpret_cast(tag); t->setArtist(charArrayToString(artist)); } void taglib_tag_set_album(TagLib_Tag *tag, const char *album) { Tag *t = reinterpret_cast(tag); t->setAlbum(charArrayToString(album)); } void taglib_tag_set_comment(TagLib_Tag *tag, const char *comment) { Tag *t = reinterpret_cast(tag); t->setComment(charArrayToString(comment)); } void taglib_tag_set_genre(TagLib_Tag *tag, const char *genre) { Tag *t = reinterpret_cast(tag); t->setGenre(charArrayToString(genre)); } void taglib_tag_set_year(TagLib_Tag *tag, unsigned int year) { Tag *t = reinterpret_cast(tag); t->setYear(year); } void taglib_tag_set_track(TagLib_Tag *tag, unsigned int track) { Tag *t = reinterpret_cast(tag); t->setTrack(track); } void taglib_tag_free_strings() { if(!stringManagementEnabled) return; for(List::ConstIterator it = strings.begin(); it != strings.end(); ++it) free(*it); strings.clear(); } //////////////////////////////////////////////////////////////////////////////// // TagLib::AudioProperties wrapper //////////////////////////////////////////////////////////////////////////////// int taglib_audioproperties_length(const TagLib_AudioProperties *audioProperties) { const AudioProperties *p = reinterpret_cast(audioProperties); return p->length(); } int taglib_audioproperties_bitrate(const TagLib_AudioProperties *audioProperties) { const AudioProperties *p = reinterpret_cast(audioProperties); return p->bitrate(); } int taglib_audioproperties_samplerate(const TagLib_AudioProperties *audioProperties) { const AudioProperties *p = reinterpret_cast(audioProperties); return p->sampleRate(); } int taglib_audioproperties_channels(const TagLib_AudioProperties *audioProperties) { const AudioProperties *p = reinterpret_cast(audioProperties); return p->channels(); } void taglib_id3v2_set_default_text_encoding(TagLib_ID3v2_Encoding encoding) { String::Type type = String::Latin1; switch(encoding) { case TagLib_ID3v2_Latin1: type = String::Latin1; break; case TagLib_ID3v2_UTF16: type = String::UTF16; break; case TagLib_ID3v2_UTF16BE: type = String::UTF16BE; break; case TagLib_ID3v2_UTF8: type = String::UTF8; break; } ID3v2::FrameFactory::instance()->setDefaultTextEncoding(type); } taglib-1.13.1/bindings/c/tag_c.h000066400000000000000000000227701444773637700163420ustar00rootroot00000000000000/*************************************************************************** copyright : (C) 2003 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * * USA * ***************************************************************************/ #ifndef TAGLIB_TAG_C #define TAGLIB_TAG_C /* Do not include this in the main TagLib documentation. */ #ifndef DO_NOT_DOCUMENT #ifdef __cplusplus extern "C" { #endif #if defined(TAGLIB_STATIC) #define TAGLIB_C_EXPORT #elif defined(_WIN32) || defined(_WIN64) #ifdef MAKE_TAGLIB_C_LIB #define TAGLIB_C_EXPORT __declspec(dllexport) #else #define TAGLIB_C_EXPORT __declspec(dllimport) #endif #elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1) #define TAGLIB_C_EXPORT __attribute__ ((visibility("default"))) #else #define TAGLIB_C_EXPORT #endif #ifndef BOOL #define BOOL int #endif /******************************************************************************* * [ TagLib C Binding ] * * This is an interface to TagLib's "simple" API, meaning that you can read and * modify media files in a generic, but not specialized way. This is a rough * representation of TagLib::File and TagLib::Tag, for which the documentation * is somewhat more complete and worth consulting. *******************************************************************************/ /* * These are used for type provide some type safety to the C API (as opposed to * using void *, but pointers to them are simply cast to the corresponding C++ * types in the implementation. */ typedef struct { int dummy; } TagLib_File; typedef struct { int dummy; } TagLib_Tag; typedef struct { int dummy; } TagLib_AudioProperties; /*! * By default all strings coming into or out of TagLib's C API are in UTF8. * However, it may be desirable for TagLib to operate on Latin1 (ISO-8859-1) * strings in which case this should be set to FALSE. */ TAGLIB_C_EXPORT void taglib_set_strings_unicode(BOOL unicode); /*! * TagLib can keep track of strings that are created when outputting tag values * and clear them using taglib_tag_clear_strings(). This is enabled by default. * However if you wish to do more fine grained management of strings, you can do * so by setting \a management to FALSE. */ TAGLIB_C_EXPORT void taglib_set_string_management_enabled(BOOL management); /*! * Explicitly free a string returned from TagLib */ TAGLIB_C_EXPORT void taglib_free(void* pointer); /******************************************************************************* * File API ******************************************************************************/ typedef enum { TagLib_File_MPEG, TagLib_File_OggVorbis, TagLib_File_FLAC, TagLib_File_MPC, TagLib_File_OggFlac, TagLib_File_WavPack, TagLib_File_Speex, TagLib_File_TrueAudio, TagLib_File_MP4, TagLib_File_ASF } TagLib_File_Type; /*! * Creates a TagLib file based on \a filename. TagLib will try to guess the file * type. * * \returns NULL if the file type cannot be determined or the file cannot * be opened. */ TAGLIB_C_EXPORT TagLib_File *taglib_file_new(const char *filename); /*! * Creates a TagLib file based on \a filename. Rather than attempting to guess * the type, it will use the one specified by \a type. */ TAGLIB_C_EXPORT TagLib_File *taglib_file_new_type(const char *filename, TagLib_File_Type type); /*! * Frees and closes the file. */ TAGLIB_C_EXPORT void taglib_file_free(TagLib_File *file); /*! * Returns true if the file is open and readable and valid information for * the Tag and / or AudioProperties was found. */ TAGLIB_C_EXPORT BOOL taglib_file_is_valid(const TagLib_File *file); /*! * Returns a pointer to the tag associated with this file. This will be freed * automatically when the file is freed. */ TAGLIB_C_EXPORT TagLib_Tag *taglib_file_tag(const TagLib_File *file); /*! * Returns a pointer to the audio properties associated with this file. This * will be freed automatically when the file is freed. */ TAGLIB_C_EXPORT const TagLib_AudioProperties *taglib_file_audioproperties(const TagLib_File *file); /*! * Saves the \a file to disk. */ TAGLIB_C_EXPORT BOOL taglib_file_save(TagLib_File *file); /****************************************************************************** * Tag API ******************************************************************************/ /*! * Returns a string with this tag's title. * * \note By default this string should be UTF8 encoded and its memory should be * freed using taglib_tag_free_strings(). */ TAGLIB_C_EXPORT char *taglib_tag_title(const TagLib_Tag *tag); /*! * Returns a string with this tag's artist. * * \note By default this string should be UTF8 encoded and its memory should be * freed using taglib_tag_free_strings(). */ TAGLIB_C_EXPORT char *taglib_tag_artist(const TagLib_Tag *tag); /*! * Returns a string with this tag's album name. * * \note By default this string should be UTF8 encoded and its memory should be * freed using taglib_tag_free_strings(). */ TAGLIB_C_EXPORT char *taglib_tag_album(const TagLib_Tag *tag); /*! * Returns a string with this tag's comment. * * \note By default this string should be UTF8 encoded and its memory should be * freed using taglib_tag_free_strings(). */ TAGLIB_C_EXPORT char *taglib_tag_comment(const TagLib_Tag *tag); /*! * Returns a string with this tag's genre. * * \note By default this string should be UTF8 encoded and its memory should be * freed using taglib_tag_free_strings(). */ TAGLIB_C_EXPORT char *taglib_tag_genre(const TagLib_Tag *tag); /*! * Returns the tag's year or 0 if year is not set. */ TAGLIB_C_EXPORT unsigned int taglib_tag_year(const TagLib_Tag *tag); /*! * Returns the tag's track number or 0 if track number is not set. */ TAGLIB_C_EXPORT unsigned int taglib_tag_track(const TagLib_Tag *tag); /*! * Sets the tag's title. * * \note By default this string should be UTF8 encoded. */ TAGLIB_C_EXPORT void taglib_tag_set_title(TagLib_Tag *tag, const char *title); /*! * Sets the tag's artist. * * \note By default this string should be UTF8 encoded. */ TAGLIB_C_EXPORT void taglib_tag_set_artist(TagLib_Tag *tag, const char *artist); /*! * Sets the tag's album. * * \note By default this string should be UTF8 encoded. */ TAGLIB_C_EXPORT void taglib_tag_set_album(TagLib_Tag *tag, const char *album); /*! * Sets the tag's comment. * * \note By default this string should be UTF8 encoded. */ TAGLIB_C_EXPORT void taglib_tag_set_comment(TagLib_Tag *tag, const char *comment); /*! * Sets the tag's genre. * * \note By default this string should be UTF8 encoded. */ TAGLIB_C_EXPORT void taglib_tag_set_genre(TagLib_Tag *tag, const char *genre); /*! * Sets the tag's year. 0 indicates that this field should be cleared. */ TAGLIB_C_EXPORT void taglib_tag_set_year(TagLib_Tag *tag, unsigned int year); /*! * Sets the tag's track number. 0 indicates that this field should be cleared. */ TAGLIB_C_EXPORT void taglib_tag_set_track(TagLib_Tag *tag, unsigned int track); /*! * Frees all of the strings that have been created by the tag. */ TAGLIB_C_EXPORT void taglib_tag_free_strings(void); /****************************************************************************** * Audio Properties API ******************************************************************************/ /*! * Returns the length of the file in seconds. */ TAGLIB_C_EXPORT int taglib_audioproperties_length(const TagLib_AudioProperties *audioProperties); /*! * Returns the bitrate of the file in kb/s. */ TAGLIB_C_EXPORT int taglib_audioproperties_bitrate(const TagLib_AudioProperties *audioProperties); /*! * Returns the sample rate of the file in Hz. */ TAGLIB_C_EXPORT int taglib_audioproperties_samplerate(const TagLib_AudioProperties *audioProperties); /*! * Returns the number of channels in the audio stream. */ TAGLIB_C_EXPORT int taglib_audioproperties_channels(const TagLib_AudioProperties *audioProperties); /******************************************************************************* * Special convenience ID3v2 functions *******************************************************************************/ typedef enum { TagLib_ID3v2_Latin1, TagLib_ID3v2_UTF16, TagLib_ID3v2_UTF16BE, TagLib_ID3v2_UTF8 } TagLib_ID3v2_Encoding; /*! * This sets the default encoding for ID3v2 frames that are written to tags. */ TAGLIB_C_EXPORT void taglib_id3v2_set_default_text_encoding(TagLib_ID3v2_Encoding encoding); #ifdef __cplusplus } #endif #endif /* DO_NOT_DOCUMENT */ #endif taglib-1.13.1/bindings/c/taglib_c.pc.cmake000066400000000000000000000005061444773637700202540ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ Name: TagLib C Bindings Description: Audio meta-data library (C bindings) Requires: taglib Version: @TAGLIB_LIB_VERSION_STRING@ Libs: -L${libdir} -ltag_c Cflags: -I${includedir}/taglib taglib-1.13.1/cmake/000077500000000000000000000000001444773637700141455ustar00rootroot00000000000000taglib-1.13.1/cmake/modules/000077500000000000000000000000001444773637700156155ustar00rootroot00000000000000taglib-1.13.1/cmake/modules/FindCppUnit.cmake000066400000000000000000000052241444773637700210050ustar00rootroot00000000000000# - Try to find the libcppunit libraries # Once done this will define # # CppUnit_FOUND - system has libcppunit # CPPUNIT_INCLUDE_DIR - the libcppunit include directory # CPPUNIT_LIBRARIES - libcppunit library include (MacroEnsureVersion) if(NOT CPPUNIT_MIN_VERSION) SET(CPPUNIT_MIN_VERSION 1.14.0) endif(NOT CPPUNIT_MIN_VERSION) FIND_PROGRAM(CPPUNIT_CONFIG_EXECUTABLE cppunit-config ) IF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) # in cache already SET(CppUnit_FOUND TRUE) ELSE(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) SET(CPPUNIT_INCLUDE_DIR) SET(CPPUNIT_LIBRARIES) IF(CPPUNIT_CONFIG_EXECUTABLE) EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --cflags RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_CFLAGS) EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --libs RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_LIBRARIES) EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_INSTALLED_VERSION) STRING(REGEX REPLACE "-I(.+)" "\\1" CPPUNIT_CFLAGS "${CPPUNIT_CFLAGS}") ELSE(CPPUNIT_CONFIG_EXECUTABLE) # in case win32 needs to find it the old way? FIND_PATH(CPPUNIT_CFLAGS cppunit/TestRunner.h PATHS /usr/include /usr/local/include ) FIND_LIBRARY(CPPUNIT_LIBRARIES NAMES cppunit PATHS /usr/lib /usr/local/lib ) # how can we find cppunit version? MESSAGE (STATUS "Ensure your cppunit installed version is at least ${CPPUNIT_MIN_VERSION}") SET (CPPUNIT_INSTALLED_VERSION ${CPPUNIT_MIN_VERSION}) ENDIF(CPPUNIT_CONFIG_EXECUTABLE) SET(CPPUNIT_INCLUDE_DIR ${CPPUNIT_CFLAGS} "${CPPUNIT_CFLAGS}/cppunit") ENDIF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) IF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) SET(CppUnit_FOUND TRUE) if(NOT CppUnit_FIND_QUIETLY) MESSAGE (STATUS "Found cppunit: ${CPPUNIT_LIBRARIES}") endif(NOT CppUnit_FIND_QUIETLY) IF(CPPUNIT_CONFIG_EXECUTABLE) EXEC_PROGRAM(${CPPUNIT_CONFIG_EXECUTABLE} ARGS --version RETURN_VALUE _return_VALUE OUTPUT_VARIABLE CPPUNIT_INSTALLED_VERSION) ENDIF(CPPUNIT_CONFIG_EXECUTABLE) macro_ensure_version( ${CPPUNIT_MIN_VERSION} ${CPPUNIT_INSTALLED_VERSION} CPPUNIT_INSTALLED_VERSION_OK ) IF(NOT CPPUNIT_INSTALLED_VERSION_OK) MESSAGE ("** CppUnit version is too old: found ${CPPUNIT_INSTALLED_VERSION} installed, ${CPPUNIT_MIN_VERSION} or newer is required") SET(CppUnit_FOUND FALSE) ENDIF(NOT CPPUNIT_INSTALLED_VERSION_OK) ELSE(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) SET(CppUnit_FOUND FALSE CACHE BOOL "Not found cppunit library") ENDIF(CPPUNIT_INCLUDE_DIR AND CPPUNIT_LIBRARIES) MARK_AS_ADVANCED(CPPUNIT_INCLUDE_DIR CPPUNIT_LIBRARIES) taglib-1.13.1/cmake/modules/MacroEnsureVersion.cmake000066400000000000000000000066561444773637700224250ustar00rootroot00000000000000# This macro compares version numbers of the form "x.y.z" # MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) # will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION # where both have to be in a 3-part-version format, leading and trailing # text is ok, e.g. # MACRO_ENSURE_VERSION( "2.5.31" "flex 2.5.4a" VERSION_OK) # which means 2.5.31 is required and "flex 2.5.4a" is what was found on the system # Copyright (c) 2006, David Faure, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. MACRO(MACRO_ENSURE_VERSION requested_version found_version var_too_old) # parse the parts of the version string STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" req_major_vers "${requested_version}") STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" req_minor_vers "${requested_version}") STRING(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" req_patch_vers "${requested_version}") STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" found_minor_vers "${found_version}") STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" found_patch_vers "${found_version}") # compute an overall version number which can be compared at once MATH(EXPR req_vers_num "${req_major_vers}*10000 + ${req_minor_vers}*100 + ${req_patch_vers}") MATH(EXPR found_vers_num "${found_major_vers}*10000 + ${found_minor_vers}*100 + ${found_patch_vers}") if (found_vers_num LESS req_vers_num) set( ${var_too_old} FALSE ) else (found_vers_num LESS req_vers_num) set( ${var_too_old} TRUE ) endif (found_vers_num LESS req_vers_num) ENDMACRO(MACRO_ENSURE_VERSION) # This macro compares version numbers of the form "x.y" # MACRO_ENSURE_VERSION( FOO_MIN_VERSION FOO_VERSION_FOUND FOO_VERSION_OK) # will set FOO_VERSIN_OK to true if FOO_VERSION_FOUND >= FOO_MIN_VERSION # where both have to be in a 2-part-version format, leading and trailing # text is ok, e.g. # MACRO_ENSURE_VERSION( "0.5" "foo 0.6" VERSION_OK) # which means 0.5 is required and "foo 0.6" is what was found on the system # Copyright (c) 2006, David Faure, # Copyright (c) 2007, Pino Toscano, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. MACRO(MACRO_ENSURE_VERSION2 requested_version found_version var_too_old) # parse the parts of the version string STRING(REGEX REPLACE "([0-9]+)\\.[0-9]+" "\\1" req_major_vers "${requested_version}") STRING(REGEX REPLACE "[0-9]+\\.([0-9]+)" "\\1" req_minor_vers "${requested_version}") STRING(REGEX REPLACE "[^0-9]*([0-9]+)\\.[0-9]+.*" "\\1" found_major_vers "${found_version}") STRING(REGEX REPLACE "[^0-9]*[0-9]+\\.([0-9]+).*" "\\1" found_minor_vers "${found_version}") # compute an overall version number which can be compared at once MATH(EXPR req_vers_num "${req_major_vers}*100 + ${req_minor_vers}") MATH(EXPR found_vers_num "${found_major_vers}*100 + ${found_minor_vers}") if (found_vers_num LESS req_vers_num) set( ${var_too_old} FALSE ) else (found_vers_num LESS req_vers_num) set( ${var_too_old} TRUE ) endif (found_vers_num LESS req_vers_num) ENDMACRO(MACRO_ENSURE_VERSION2) taglib-1.13.1/cmake_uninstall.cmake.in000066400000000000000000000014271444773637700176510ustar00rootroot00000000000000if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") endif() file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) string(REGEX REPLACE "\n" ";" files "${files}") foreach (file ${files}) message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") if (EXISTS "$ENV{DESTDIR}${file}") execute_process( COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}" OUTPUT_VARIABLE rm_out RESULT_VARIABLE rm_retval ) if(NOT ${rm_retval} EQUAL 0) message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") endif () else () message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") endif () endforeach() taglib-1.13.1/config.h.cmake000066400000000000000000000017311444773637700155640ustar00rootroot00000000000000/* config.h. Generated by cmake from config.h.cmake */ #ifndef TAGLIB_CONFIG_H #define TAGLIB_CONFIG_H /* Defined if your compiler supports some byte swap functions */ #cmakedefine HAVE_GCC_BYTESWAP 1 #cmakedefine HAVE_GLIBC_BYTESWAP 1 #cmakedefine HAVE_MSC_BYTESWAP 1 #cmakedefine HAVE_MAC_BYTESWAP 1 #cmakedefine HAVE_OPENBSD_BYTESWAP 1 /* Defined if your compiler supports some atomic operations */ #cmakedefine HAVE_GCC_ATOMIC 1 #cmakedefine HAVE_MAC_ATOMIC 1 #cmakedefine HAVE_WIN_ATOMIC 1 #cmakedefine HAVE_IA64_ATOMIC 1 /* Defined if your compiler supports some safer version of vsprintf */ #cmakedefine HAVE_VSNPRINTF 1 #cmakedefine HAVE_VSPRINTF_S 1 /* Defined if your compiler supports ISO _strdup */ #cmakedefine HAVE_ISO_STRDUP 1 /* Defined if zlib is installed */ #cmakedefine HAVE_ZLIB 1 /* Indicates whether debug messages are shown even in release mode */ #cmakedefine TRACE_IN_RELEASE 1 #cmakedefine TESTS_DIR "@TESTS_DIR@" #endif taglib-1.13.1/doc/000077500000000000000000000000001444773637700136325ustar00rootroot00000000000000taglib-1.13.1/doc/README000066400000000000000000000001221444773637700145050ustar00rootroot00000000000000Run "make docs" in the parent directory to generate the TagLib API documentation. taglib-1.13.1/doc/api-footer.html000066400000000000000000000000221444773637700165570ustar00rootroot00000000000000 taglib-1.13.1/doc/api-header.html000066400000000000000000000031241444773637700165170ustar00rootroot00000000000000 $title ($projectname) $treeview $search $mathjax $extrastylesheet
$projectname  $projectnumber
$projectbrief
$projectbrief
$searchbox
taglib-1.13.1/doc/taglib.svg000066400000000000000000000253631444773637700156260ustar00rootroot00000000000000 taglib 2 Created with Sketch. MP3 VORBIS FLAC MP4 AAC WAV AIFF TA WP taglib-1.13.1/examples/000077500000000000000000000000001444773637700147035ustar00rootroot00000000000000taglib-1.13.1/examples/CMakeLists.txt000066400000000000000000000024151444773637700174450ustar00rootroot00000000000000include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../taglib ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/toolkit ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ape ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v1 ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2 ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2/frames ${CMAKE_CURRENT_SOURCE_DIR}/../bindings/c/ ) if(NOT BUILD_SHARED_LIBS) add_definitions(-DTAGLIB_STATIC) endif() ########### next target ############### add_executable(tagreader tagreader.cpp) target_link_libraries(tagreader tag) ########### next target ############### add_executable(tagreader_c tagreader_c.c) target_link_libraries(tagreader_c tag_c) ########### next target ############### add_executable(tagwriter tagwriter.cpp) target_link_libraries(tagwriter tag) ########### next target ############### add_executable(framelist framelist.cpp) target_link_libraries(framelist tag) ########### next target ############### add_executable(strip-id3v1 strip-id3v1.cpp) target_link_libraries(strip-id3v1 tag) install(TARGETS tagreader tagreader_c tagwriter framelist strip-id3v1 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) taglib-1.13.1/examples/framelist.cpp000066400000000000000000000074471444773637700174110ustar00rootroot00000000000000/* Copyright (C) 2003 Scott Wheeler * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace TagLib; int main(int argc, char *argv[]) { // process the command line args for(int i = 1; i < argc; i++) { cout << "******************** \"" << argv[i] << "\"********************" << endl; MPEG::File f(argv[i]); ID3v2::Tag *id3v2tag = f.ID3v2Tag(); if(id3v2tag) { cout << "ID3v2." << id3v2tag->header()->majorVersion() << "." << id3v2tag->header()->revisionNumber() << ", " << id3v2tag->header()->tagSize() << " bytes in tag" << endl; ID3v2::FrameList::ConstIterator it = id3v2tag->frameList().begin(); for(; it != id3v2tag->frameList().end(); it++) { cout << (*it)->frameID(); if(ID3v2::CommentsFrame *comment = dynamic_cast(*it)) if(!comment->description().isEmpty()) cout << " [" << comment->description() << "]"; cout << " - \"" << (*it)->toString() << "\"" << endl; } } else cout << "file does not have a valid id3v2 tag" << endl; cout << endl << "ID3v1" << endl; ID3v1::Tag *id3v1tag = f.ID3v1Tag(); if(id3v1tag) { cout << "title - \"" << id3v1tag->title() << "\"" << endl; cout << "artist - \"" << id3v1tag->artist() << "\"" << endl; cout << "album - \"" << id3v1tag->album() << "\"" << endl; cout << "year - \"" << id3v1tag->year() << "\"" << endl; cout << "comment - \"" << id3v1tag->comment() << "\"" << endl; cout << "track - \"" << id3v1tag->track() << "\"" << endl; cout << "genre - \"" << id3v1tag->genre() << "\"" << endl; } else cout << "file does not have a valid id3v1 tag" << endl; APE::Tag *ape = f.APETag(); cout << endl << "APE" << endl; if(ape) { for(APE::ItemListMap::ConstIterator it = ape->itemListMap().begin(); it != ape->itemListMap().end(); ++it) { if((*it).second.type() != APE::Item::Binary) cout << (*it).first << " - \"" << (*it).second.toString() << "\"" << endl; else cout << (*it).first << " - Binary data (" << (*it).second.binaryData().size() << " bytes)" << endl; } } else cout << "file does not have a valid APE tag" << endl; cout << endl; } } taglib-1.13.1/examples/strip-id3v1.cpp000066400000000000000000000031731444773637700175000ustar00rootroot00000000000000/* Copyright (C) 2003 Scott Wheeler * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include using namespace TagLib; int main(int argc, char *argv[]) { for(int i = 1; i < argc; i++) { std::cout << "******************** Stripping ID3v1 Tag From: \"" << argv[i] << "\"********************" << std::endl; MPEG::File f(argv[i]); f.strip(MPEG::File::ID3v1); } } taglib-1.13.1/examples/tagreader.cpp000066400000000000000000000065251444773637700173550ustar00rootroot00000000000000/* Copyright (C) 2003 Scott Wheeler * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include using namespace std; int main(int argc, char *argv[]) { for(int i = 1; i < argc; i++) { cout << "******************** \"" << argv[i] << "\" ********************" << endl; TagLib::FileRef f(argv[i]); if(!f.isNull() && f.tag()) { TagLib::Tag *tag = f.tag(); cout << "-- TAG (basic) --" << endl; cout << "title - \"" << tag->title() << "\"" << endl; cout << "artist - \"" << tag->artist() << "\"" << endl; cout << "album - \"" << tag->album() << "\"" << endl; cout << "year - \"" << tag->year() << "\"" << endl; cout << "comment - \"" << tag->comment() << "\"" << endl; cout << "track - \"" << tag->track() << "\"" << endl; cout << "genre - \"" << tag->genre() << "\"" << endl; TagLib::PropertyMap tags = f.file()->properties(); unsigned int longest = 0; for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { if (i->first.size() > longest) { longest = i->first.size(); } } cout << "-- TAG (properties) --" << endl; for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { for(TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j) { cout << left << std::setw(longest) << i->first << " - " << '"' << *j << '"' << endl; } } } if(!f.isNull() && f.audioProperties()) { TagLib::AudioProperties *properties = f.audioProperties(); int seconds = properties->length() % 60; int minutes = (properties->length() - seconds) / 60; cout << "-- AUDIO --" << endl; cout << "bitrate - " << properties->bitrate() << endl; cout << "sample rate - " << properties->sampleRate() << endl; cout << "channels - " << properties->channels() << endl; cout << "length - " << minutes << ":" << setfill('0') << setw(2) << seconds << endl; } } return 0; } taglib-1.13.1/examples/tagreader_c.c000066400000000000000000000055411444773637700173140ustar00rootroot00000000000000/* Copyright (C) 2003 Scott Wheeler * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #ifndef FALSE #define FALSE 0 #endif int main(int argc, char *argv[]) { int i; int seconds; int minutes; TagLib_File *file; TagLib_Tag *tag; const TagLib_AudioProperties *properties; taglib_set_strings_unicode(FALSE); for(i = 1; i < argc; i++) { printf("******************** \"%s\" ********************\n", argv[i]); file = taglib_file_new(argv[i]); if(file == NULL) break; tag = taglib_file_tag(file); properties = taglib_file_audioproperties(file); if(tag != NULL) { printf("-- TAG --\n"); printf("title - \"%s\"\n", taglib_tag_title(tag)); printf("artist - \"%s\"\n", taglib_tag_artist(tag)); printf("album - \"%s\"\n", taglib_tag_album(tag)); printf("year - \"%i\"\n", taglib_tag_year(tag)); printf("comment - \"%s\"\n", taglib_tag_comment(tag)); printf("track - \"%i\"\n", taglib_tag_track(tag)); printf("genre - \"%s\"\n", taglib_tag_genre(tag)); } if(properties != NULL) { seconds = taglib_audioproperties_length(properties) % 60; minutes = (taglib_audioproperties_length(properties) - seconds) / 60; printf("-- AUDIO --\n"); printf("bitrate - %i\n", taglib_audioproperties_bitrate(properties)); printf("sample rate - %i\n", taglib_audioproperties_samplerate(properties)); printf("channels - %i\n", taglib_audioproperties_channels(properties)); printf("length - %i:%02i\n", minutes, seconds); } taglib_tag_free_strings(); taglib_file_free(file); } return 0; } taglib-1.13.1/examples/tagwriter.cpp000066400000000000000000000121211444773637700174140ustar00rootroot00000000000000/* Copyright (C) 2004 Scott Wheeler * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; bool isArgument(const char *s) { return strlen(s) == 2 && s[0] == '-'; } bool isFile(const char *s) { struct stat st; #ifdef _WIN32 return ::stat(s, &st) == 0 && (st.st_mode & (S_IFREG)); #else return ::stat(s, &st) == 0 && (st.st_mode & (S_IFREG | S_IFLNK)); #endif } void usage() { cout << endl; cout << "Usage: tagwriter " << endl; cout << endl; cout << "Where the valid fields are:" << endl; cout << " -t " << endl; cout << " -a <artist>" << endl; cout << " -A <album>" << endl; cout << " -c <comment>" << endl; cout << " -g <genre>" << endl; cout << " -y <year>" << endl; cout << " -T <track>" << endl; cout << " -R <tagname> <tagvalue>" << endl; cout << " -I <tagname> <tagvalue>" << endl; cout << " -D <tagname>" << endl; cout << endl; exit(1); } void checkForRejectedProperties(const TagLib::PropertyMap &tags) { // stolen from tagreader.cpp if(tags.size() > 0) { unsigned int longest = 0; for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { if(i->first.size() > longest) { longest = i->first.size(); } } cout << "-- rejected TAGs (properties) --" << endl; for(TagLib::PropertyMap::ConstIterator i = tags.begin(); i != tags.end(); ++i) { for(TagLib::StringList::ConstIterator j = i->second.begin(); j != i->second.end(); ++j) { cout << left << std::setw(longest) << i->first << " - " << '"' << *j << '"' << endl; } } } } int main(int argc, char *argv[]) { TagLib::List<TagLib::FileRef> fileList; while(argc > 0 && isFile(argv[argc - 1])) { TagLib::FileRef f(argv[argc - 1]); if(!f.isNull() && f.tag()) fileList.append(f); argc--; } if(fileList.isEmpty()) usage(); for(int i = 1; i < argc - 1; i += 2) { if(isArgument(argv[i]) && i + 1 < argc && !isArgument(argv[i + 1])) { char field = argv[i][1]; TagLib::String value = argv[i + 1]; TagLib::List<TagLib::FileRef>::ConstIterator it; for(it = fileList.begin(); it != fileList.end(); ++it) { TagLib::Tag *t = (*it).tag(); switch (field) { case 't': t->setTitle(value); break; case 'a': t->setArtist(value); break; case 'A': t->setAlbum(value); break; case 'c': t->setComment(value); break; case 'g': t->setGenre(value); break; case 'y': t->setYear(value.toInt()); break; case 'T': t->setTrack(value.toInt()); break; case 'R': case 'I': if(i + 2 < argc) { TagLib::PropertyMap map = (*it).file()->properties (); if(field == 'R') { map.replace(value, TagLib::String(argv[i + 2])); } else { map.insert(value, TagLib::String(argv[i + 2])); } ++i; checkForRejectedProperties((*it).file()->setProperties(map)); } else { usage(); } break; case 'D': { TagLib::PropertyMap map = (*it).file()->properties(); map.erase(value); checkForRejectedProperties((*it).file()->setProperties(map)); break; } default: usage(); break; } } } else usage(); } TagLib::List<TagLib::FileRef>::ConstIterator it; for(it = fileList.begin(); it != fileList.end(); ++it) (*it).file()->save(); return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib-config.cmake�������������������������������������������������������������������0000664�0000000�0000000�00000001702�14447736377�0016574�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh usage() { echo "usage: $0 [OPTIONS]" cat << EOH options: [--libs] [--cflags] [--version] [--prefix] EOH exit 1; } # Looks useless as it is, but could be replaced with a "pcfiledir" by Buildroot. prefix= exec_prefix= if test -z "$prefix"; then includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ else includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ fi if test -z "$exec_prefix"; then libdir=@CMAKE_INSTALL_FULL_LIBDIR@ else libdir=${exec_prefix}/@CMAKE_INSTALL_LIBDIR@ fi flags="" if test $# -eq 0 ; then usage fi while test $# -gt 0 do case $1 in --libs) flags="$flags -L$libdir -ltag @ZLIB_LIBRARIES_FLAGS@" ;; --cflags) flags="$flags -I$includedir -I$includedir/taglib" ;; --version) echo @TAGLIB_LIB_VERSION_STRING@ ;; --prefix) echo ${prefix:-@CMAKE_INSTALL_PREFIX@} ;; *) echo "$0: unknown option $1" echo usage ;; esac shift done if test -n "$flags" then echo $flags fi ��������������������������������������������������������������taglib-1.13.1/taglib-config.cmd.cmake���������������������������������������������������������������0000664�0000000�0000000�00000002172�14447736377�0017340�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������@echo off goto beginning * * It is what it is, you can do with it as you please. * * Just don't blame me if it teaches your computer to smoke! * * -Enjoy * fh :)_~ * :beginning if /i "%1#" == "--libs#" goto doit if /i "%1#" == "--cflags#" goto doit if /i "%1#" == "--version#" goto doit if /i "%1#" == "--prefix#" goto doit echo "usage: %0 [OPTIONS]" echo [--libs] echo [--cflags] echo [--version] echo [--prefix] goto theend * * NOTE: Windows does not assume libraries are prefixed with 'lib'. * NOTE: If '-llibtag' is the last element, it is easily appended in the users installation/makefile process * to allow for static, shared or debug builds. * It would be preferable if the top level CMakeLists.txt provided the library name during config. ?? :doit if /i "%1#" == "--libs#" echo -L${CMAKE_INSTALL_FULL_LIBDIR} -llibtag if /i "%1#" == "--cflags#" echo -I${CMAKE_INSTALL_FULL_INCLUDEDIR} -I${CMAKE_INSTALL_FULL_INCLUDEDIR}/taglib if /i "%1#" == "--version#" echo ${TAGLIB_LIB_VERSION_STRING} if /i "%1#" == "--prefix#" echo ${CMAKE_INSTALL_PREFIX} :theend ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib.pc.cmake�����������������������������������������������������������������������0000664�0000000�0000000�00000000514�14447736377�0015732�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ Name: TagLib Description: Audio meta-data library Requires: Version: @TAGLIB_LIB_VERSION_STRING@ Libs: -L${libdir} -ltag @ZLIB_LIBRARIES_FLAGS@ Cflags: -I${includedir} -I${includedir}/taglib ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/�������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0014327�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/CMakeLists.txt�����������������������������������������������������������������0000664�0000000�0000000�00000020572�14447736377�0017075�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������set(CMAKE_INCLUDE_CURRENT_DIR ON) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/toolkit ${CMAKE_CURRENT_SOURCE_DIR}/asf ${CMAKE_CURRENT_SOURCE_DIR}/mpeg ${CMAKE_CURRENT_SOURCE_DIR}/ogg ${CMAKE_CURRENT_SOURCE_DIR}/ogg/flac ${CMAKE_CURRENT_SOURCE_DIR}/flac ${CMAKE_CURRENT_SOURCE_DIR}/mpc ${CMAKE_CURRENT_SOURCE_DIR}/mp4 ${CMAKE_CURRENT_SOURCE_DIR}/ogg/vorbis ${CMAKE_CURRENT_SOURCE_DIR}/ogg/speex ${CMAKE_CURRENT_SOURCE_DIR}/ogg/opus ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v2 ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v2/frames ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v1 ${CMAKE_CURRENT_SOURCE_DIR}/ape ${CMAKE_CURRENT_SOURCE_DIR}/wavpack ${CMAKE_CURRENT_SOURCE_DIR}/trueaudio ${CMAKE_CURRENT_SOURCE_DIR}/riff ${CMAKE_CURRENT_SOURCE_DIR}/riff/aiff ${CMAKE_CURRENT_SOURCE_DIR}/riff/wav ${CMAKE_CURRENT_SOURCE_DIR}/mod ${CMAKE_CURRENT_SOURCE_DIR}/s3m ${CMAKE_CURRENT_SOURCE_DIR}/it ${CMAKE_CURRENT_SOURCE_DIR}/xm ${taglib_SOURCE_DIR}/3rdparty ) if(ZLIB_FOUND) include_directories(${ZLIB_INCLUDE_DIR}) elseif(HAVE_ZLIB_SOURCE) include_directories(${ZLIB_SOURCE}) endif() set(tag_HDRS tag.h fileref.h audioproperties.h taglib_export.h ${CMAKE_CURRENT_BINARY_DIR}/../taglib_config.h toolkit/taglib.h toolkit/tstring.h toolkit/tlist.h toolkit/tlist.tcc toolkit/tstringlist.h toolkit/tbytevector.h toolkit/tbytevectorlist.h toolkit/tbytevectorstream.h toolkit/tiostream.h toolkit/tfile.h toolkit/tfilestream.h toolkit/tmap.h toolkit/tmap.tcc toolkit/tpropertymap.h toolkit/trefcounter.h toolkit/tdebuglistener.h mpeg/mpegfile.h mpeg/mpegproperties.h mpeg/mpegheader.h mpeg/xingheader.h mpeg/id3v1/id3v1tag.h mpeg/id3v1/id3v1genres.h mpeg/id3v2/id3v2.h mpeg/id3v2/id3v2extendedheader.h mpeg/id3v2/id3v2frame.h mpeg/id3v2/id3v2header.h mpeg/id3v2/id3v2synchdata.h mpeg/id3v2/id3v2footer.h mpeg/id3v2/id3v2framefactory.h mpeg/id3v2/id3v2tag.h mpeg/id3v2/frames/attachedpictureframe.h mpeg/id3v2/frames/commentsframe.h mpeg/id3v2/frames/eventtimingcodesframe.h mpeg/id3v2/frames/generalencapsulatedobjectframe.h mpeg/id3v2/frames/ownershipframe.h mpeg/id3v2/frames/popularimeterframe.h mpeg/id3v2/frames/privateframe.h mpeg/id3v2/frames/relativevolumeframe.h mpeg/id3v2/frames/synchronizedlyricsframe.h mpeg/id3v2/frames/textidentificationframe.h mpeg/id3v2/frames/uniquefileidentifierframe.h mpeg/id3v2/frames/unknownframe.h mpeg/id3v2/frames/unsynchronizedlyricsframe.h mpeg/id3v2/frames/urllinkframe.h mpeg/id3v2/frames/chapterframe.h mpeg/id3v2/frames/tableofcontentsframe.h mpeg/id3v2/frames/podcastframe.h ogg/oggfile.h ogg/oggpage.h ogg/oggpageheader.h ogg/xiphcomment.h ogg/vorbis/vorbisfile.h ogg/vorbis/vorbisproperties.h ogg/flac/oggflacfile.h ogg/speex/speexfile.h ogg/speex/speexproperties.h ogg/opus/opusfile.h ogg/opus/opusproperties.h flac/flacfile.h flac/flacpicture.h flac/flacproperties.h flac/flacmetadatablock.h ape/apefile.h ape/apeproperties.h ape/apetag.h ape/apefooter.h ape/apeitem.h mpc/mpcfile.h mpc/mpcproperties.h wavpack/wavpackfile.h wavpack/wavpackproperties.h trueaudio/trueaudiofile.h trueaudio/trueaudioproperties.h riff/rifffile.h riff/aiff/aifffile.h riff/aiff/aiffproperties.h riff/wav/wavfile.h riff/wav/wavproperties.h riff/wav/infotag.h asf/asffile.h asf/asfproperties.h asf/asftag.h asf/asfattribute.h asf/asfpicture.h mp4/mp4file.h mp4/mp4atom.h mp4/mp4tag.h mp4/mp4item.h mp4/mp4properties.h mp4/mp4coverart.h mod/modfilebase.h mod/modfile.h mod/modtag.h mod/modproperties.h it/itfile.h it/itproperties.h s3m/s3mfile.h s3m/s3mproperties.h xm/xmfile.h xm/xmproperties.h ) set(mpeg_SRCS mpeg/mpegfile.cpp mpeg/mpegproperties.cpp mpeg/mpegheader.cpp mpeg/xingheader.cpp ) set(id3v1_SRCS mpeg/id3v1/id3v1tag.cpp mpeg/id3v1/id3v1genres.cpp ) set(id3v2_SRCS mpeg/id3v2/id3v2framefactory.cpp mpeg/id3v2/id3v2synchdata.cpp mpeg/id3v2/id3v2tag.cpp mpeg/id3v2/id3v2header.cpp mpeg/id3v2/id3v2frame.cpp mpeg/id3v2/id3v2footer.cpp mpeg/id3v2/id3v2extendedheader.cpp ) set(frames_SRCS mpeg/id3v2/frames/attachedpictureframe.cpp mpeg/id3v2/frames/commentsframe.cpp mpeg/id3v2/frames/eventtimingcodesframe.cpp mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp mpeg/id3v2/frames/ownershipframe.cpp mpeg/id3v2/frames/popularimeterframe.cpp mpeg/id3v2/frames/privateframe.cpp mpeg/id3v2/frames/relativevolumeframe.cpp mpeg/id3v2/frames/synchronizedlyricsframe.cpp mpeg/id3v2/frames/textidentificationframe.cpp mpeg/id3v2/frames/uniquefileidentifierframe.cpp mpeg/id3v2/frames/unknownframe.cpp mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp mpeg/id3v2/frames/urllinkframe.cpp mpeg/id3v2/frames/chapterframe.cpp mpeg/id3v2/frames/tableofcontentsframe.cpp mpeg/id3v2/frames/podcastframe.cpp ) set(ogg_SRCS ogg/oggfile.cpp ogg/oggpage.cpp ogg/oggpageheader.cpp ogg/xiphcomment.cpp ) set(vorbis_SRCS ogg/vorbis/vorbisfile.cpp ogg/vorbis/vorbisproperties.cpp ) set(flacs_SRCS flac/flacfile.cpp flac/flacpicture.cpp flac/flacproperties.cpp flac/flacmetadatablock.cpp flac/flacunknownmetadatablock.cpp ) set(oggflacs_SRCS ogg/flac/oggflacfile.cpp ) set(mpc_SRCS mpc/mpcfile.cpp mpc/mpcproperties.cpp ) set(mp4_SRCS mp4/mp4file.cpp mp4/mp4atom.cpp mp4/mp4tag.cpp mp4/mp4item.cpp mp4/mp4properties.cpp mp4/mp4coverart.cpp ) set(ape_SRCS ape/apetag.cpp ape/apefooter.cpp ape/apeitem.cpp ape/apefile.cpp ape/apeproperties.cpp ) set(wavpack_SRCS wavpack/wavpackfile.cpp wavpack/wavpackproperties.cpp ) set(speex_SRCS ogg/speex/speexfile.cpp ogg/speex/speexproperties.cpp ) set(opus_SRCS ogg/opus/opusfile.cpp ogg/opus/opusproperties.cpp ) set(trueaudio_SRCS trueaudio/trueaudiofile.cpp trueaudio/trueaudioproperties.cpp ) set(asf_SRCS asf/asftag.cpp asf/asffile.cpp asf/asfproperties.cpp asf/asfattribute.cpp asf/asfpicture.cpp ) set(riff_SRCS riff/rifffile.cpp ) set(aiff_SRCS riff/aiff/aifffile.cpp riff/aiff/aiffproperties.cpp ) set(wav_SRCS riff/wav/wavfile.cpp riff/wav/wavproperties.cpp riff/wav/infotag.cpp ) set(mod_SRCS mod/modfilebase.cpp mod/modfile.cpp mod/modtag.cpp mod/modproperties.cpp ) set(s3m_SRCS s3m/s3mfile.cpp s3m/s3mproperties.cpp ) set(it_SRCS it/itfile.cpp it/itproperties.cpp ) set(xm_SRCS xm/xmfile.cpp xm/xmproperties.cpp ) set(toolkit_SRCS toolkit/tstring.cpp toolkit/tstringlist.cpp toolkit/tbytevector.cpp toolkit/tbytevectorlist.cpp toolkit/tbytevectorstream.cpp toolkit/tiostream.cpp toolkit/tfile.cpp toolkit/tfilestream.cpp toolkit/tdebug.cpp toolkit/tpropertymap.cpp toolkit/trefcounter.cpp toolkit/tdebuglistener.cpp toolkit/tzlib.cpp ) if(HAVE_ZLIB_SOURCE) set(zlib_SRCS ${ZLIB_SOURCE}/adler32.c ${ZLIB_SOURCE}/crc32.c ${ZLIB_SOURCE}/inffast.c ${ZLIB_SOURCE}/inflate.c ${ZLIB_SOURCE}/inftrees.c ${ZLIB_SOURCE}/zutil.c ) endif() set(tag_LIB_SRCS ${mpeg_SRCS} ${id3v1_SRCS} ${id3v2_SRCS} ${frames_SRCS} ${ogg_SRCS} ${vorbis_SRCS} ${oggflacs_SRCS} ${mpc_SRCS} ${ape_SRCS} ${toolkit_SRCS} ${flacs_SRCS} ${wavpack_SRCS} ${speex_SRCS} ${trueaudio_SRCS} ${riff_SRCS} ${aiff_SRCS} ${wav_SRCS} ${asf_SRCS} ${mp4_SRCS} ${mod_SRCS} ${s3m_SRCS} ${it_SRCS} ${xm_SRCS} ${opus_SRCS} ${zlib_SRCS} tag.cpp tagunion.cpp fileref.cpp audioproperties.cpp tagutils.cpp ) add_library(tag ${tag_LIB_SRCS} ${tag_HDRS}) set_property(TARGET tag PROPERTY CXX_STANDARD 98) if(HAVE_ZLIB AND NOT HAVE_ZLIB_SOURCE) target_link_libraries(tag ${ZLIB_LIBRARIES}) endif() set_target_properties(tag PROPERTIES VERSION ${TAGLIB_SOVERSION_MAJOR}.${TAGLIB_SOVERSION_MINOR}.${TAGLIB_SOVERSION_PATCH} SOVERSION ${TAGLIB_SOVERSION_MAJOR} INSTALL_NAME_DIR ${CMAKE_INSTALL_FULL_LIBDIR} DEFINE_SYMBOL MAKE_TAGLIB_LIB LINK_INTERFACE_LIBRARIES "" PUBLIC_HEADER "${tag_HDRS}" ) if(VISIBILITY_HIDDEN) set_target_properties(tag PROPERTIES C_VISIBILITY_PRESET hidden) endif() if(BUILD_FRAMEWORK) unset(INSTALL_NAME_DIR) set_target_properties(tag PROPERTIES FRAMEWORK TRUE MACOSX_RPATH 1 VERSION "A" SOVERSION "A" ) endif() install(TARGETS tag FRAMEWORK DESTINATION ${FRAMEWORK_INSTALL_DIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/taglib ) ��������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/���������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015074�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/ape-tag-format.txt���������������������������������������������������������0000664�0000000�0000000�00000020113�14447736377�0020436�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������================================================================================ = APE Tag Specification, Version 2.000 ================================================================================ Original Content (C) 2004, Frank Klemm <frank.klemm@elster.offl.uni-jena.de> Formatting / Editing (C) 2004, Scott Wheeler <wheeler@kde.org> ================================================================================ = Contents ================================================================================ 1 - APE Tag General Structure 2 - APE Tag Header / Footer Format 3 - APE Tag Flags 4 - APE Tag Item Format 5 - APE Tag Item Supported Keys 6 - APE Tag Item Content 7 - Data Types 7.1 - Data Types / UTF-8 7.2 - Data Types / Dates 7.3 - Data Types / Timestamps ================================================================================ = 1 - APE Tag General Structure ================================================================================ Member of Basic Components of SV8 Stream Note: It is strongly recommended that the data size be stored in the tags. The size should normally be in the roughly one kilobyte, never more than 8 kilobytes. Larger data should be stored externally using link entries. Linked data is much easier to process by normal programs, so for instance JPEG data should not be included inside the audio file. APE Tag Version 2.000 (with header, recommended): /================================\ | APE Tag Header | 32 bytes | |-------------------|------------| | APE Tag Item 1 | > 10 bytes | | APE Tag Item 2 | > 10 bytes | | APE Tag Item n-1 | > 10 bytes | | APE Tag Item n | > 10 bytes | |-------------------|------------| | APE Tag Footer | 32 bytes | \================================/ APE tag items should be sorted ascending by size. When streaming, parts of the APE tag may be dropped to reduce the danger of drop outs between tracks. This is not required, but is strongly recommended. It would be desirable for the items to be sorted by importance / size, but this is not feasible. This convention should only be broken when adding less important small items and it is not desirable to rewrite the entire tag. An APE tag at the end of a file (the recommended location) must have at least a footer; an APE tag at the beginning of a file (strongly discouraged) must have at least a header. APE Tag Version 1.000 (without header, deprecated) /================================\ | APE Tag Item 1 | > 10 bytes | | APE Tag Item 2 | > 10 bytes | | APE Tag Item n-1 | > 10 bytes | | APE Tag Item n | > 10 bytes | |-------------------|------------| | APE Tag Footer | 32 bytes | \================================/ ================================================================================ = 2 - APE Tag Header / Footer Format ================================================================================ Contains number, length and attributes of all tag items Header and Footer are different in 1 bit in the Tags Flags to distinguish between them. Member of APE Tag 2.0 /===========================================================================\ | Preamble | 8 bytes | { 'A', 'P', 'E', 'T', 'A', 'G', 'E', 'X' } | |----------------|---------|------------------------------------------------| | Version Number | 4 bytes | 1000 = Version 1.000, 2000 = Version 2.000 | |----------------|---------|------------------------------------------------| | Tag Size | 4 bytes | Tag size in bytes including footer and all tag | | | | items excluding the header (for 1.000 | | | | compatibility) | |----------------|---------|------------------------------------------------| | Item Count | 4 bytes | Number of items in the tag | |----------------|---------|------------------------------------------------| | Tag Flags | 4 bytes | Global flags | |----------------|---------|------------------------------------------------| | Reserved | 8 bytes | Must be zeroed | \===========================================================================/ ================================================================================ = 3 - APE Tag Flags ================================================================================ The general flag structure for either items or headers / footers is the same. Bits 31, 30 and 29 are specific to headers / footers, whereas 2 through 0 are item specific. Note: APE Tags from Version 1.0 do not use any of the following. All flags in that version are zeroed and ignored when reading. /=================================================================\ | Contains Header | Bit 31 | 1 - has header | 0 - no header | |-----------------|-------------|---------------------------------| | Contains Footer | Bit 30 | 1 - has footer | 0 - no footer | |-----------------|-------------|---------------------------------| | Is Header | Bit 29 | 1 - is header | 0 - is footer | |-----------------|-------------|---------------------------------| | Undefined | Bits 28 - 3 | Undefined, must be zeroed | |-----------------|-------------|---------------------------------| | Encoding | Bits 2 - 1 | 00 - UTF-8 | | | | 01 - Binary Data * | | | | 10 - External Reference ** | | | | 11 - Reserved | |-----------------|-------------|---------------------------------| | Read Only | Bit 0 | 1 - read only | 0 - read/write | \=================================================================/ (*) Should be ignored by tools for editing text values (**) Allowed external reference formats: - http://host/directory/filename.ext - ftp://host/directory/filename.ext - filename.ext - /directory/filename.ext - DRIVE:/directory/filename.ext Note: External references are also UTF-8 encoded. ================================================================================ = 4 - APE Tag Item Format ================================================================================ APE Tag Items are stored as key-value pairs. APE Tags Item Key are case sensitive, however it is illegal to use keys which only differ in case and it is recommended that tag reading not be case sensitive. Every key can only occur (at most) once. It is not possible to repeat a key to signify updated contents. Tags can be partially or completely repeated in the streaming format. This makes it possible to display an artist and / or title if it was missed at the beginning of the stream. It is recommended that the important information like artist, album and title should occur approximately every 2 minutes in the stream and again 5 to 10 seconds before the end. However, care should be tak en not to replicate this information too often or during passages with high bitrate demands to avoid unnecessary drop-outs. /==============================================================================\ | Content Size | 4 bytes | Length of the value in bytes | |----------------|---------------|---------------------------------------------| | Flags | 4 bytes | Item flags | |----------------|---------------|---------------------------------------------| | Key | 2 - 255 bytes | Item key | |----------------|---------------|---------------------------------------------| | Key Terminator | 1 byte | Null byte that indicates the end of the key | |----------------|---------------|---------------------------------------------| | Value | variable | Content (formatted according to the flags) | \==============================================================================/ ================================================================================ Sections 5 - 7 haven't yet been converted from: http://www.personal.uni-jena.de/~pfk/mpp/sv8/apetag.html �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/apefile.cpp����������������������������������������������������������������0000664�0000000�0000000�00000017216�14447736377�0017214�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2010 by Alex Novichkov email : novichko@atnet.ru copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com (original WavPack implementation) copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tstring.h> #include <tdebug.h> #include <tagunion.h> #include <id3v1tag.h> #include <id3v2header.h> #include <tpropertymap.h> #include <tagutils.h> #include "apefile.h" #include "apetag.h" #include "apefooter.h" using namespace TagLib; namespace { enum { ApeAPEIndex = 0, ApeID3v1Index = 1 }; } // namespace class APE::File::FilePrivate { public: FilePrivate() : APELocation(-1), APESize(0), ID3v1Location(-1), ID3v2Header(0), ID3v2Location(-1), ID3v2Size(0), properties(0) {} ~FilePrivate() { delete ID3v2Header; delete properties; } long APELocation; long APESize; long ID3v1Location; ID3v2::Header *ID3v2Header; long ID3v2Location; long ID3v2Size; TagUnion tag; Properties *properties; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool APE::File::isSupported(IOStream *stream) { // An APE file has an ID "MAC " somewhere. An ID3v2 tag may precede. const ByteVector buffer = Utils::readHeader(stream, bufferSize(), true); return (buffer.find("MAC ") >= 0); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// APE::File::File(FileName file, bool readProperties, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } APE::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : TagLib::File(stream), d(new FilePrivate()) { if(isOpen()) read(readProperties); } APE::File::~File() { delete d; } TagLib::Tag *APE::File::tag() const { return &d->tag; } PropertyMap APE::File::properties() const { return d->tag.properties(); } void APE::File::removeUnsupportedProperties(const StringList &properties) { d->tag.removeUnsupportedProperties(properties); } PropertyMap APE::File::setProperties(const PropertyMap &properties) { if(ID3v1Tag()) ID3v1Tag()->setProperties(properties); return APETag(true)->setProperties(properties); } APE::Properties *APE::File::audioProperties() const { return d->properties; } bool APE::File::save() { if(readOnly()) { debug("APE::File::save() -- File is read only."); return false; } // Update ID3v1 tag if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { // ID3v1 tag is not empty. Update the old one or create a new one. if(d->ID3v1Location >= 0) { seek(d->ID3v1Location); } else { seek(0, End); d->ID3v1Location = tell(); } writeBlock(ID3v1Tag()->render()); } else { // ID3v1 tag is empty. Remove the old one. if(d->ID3v1Location >= 0) { truncate(d->ID3v1Location); d->ID3v1Location = -1; } } // Update APE tag if(APETag() && !APETag()->isEmpty()) { // APE tag is not empty. Update the old one or create a new one. if(d->APELocation < 0) { if(d->ID3v1Location >= 0) d->APELocation = d->ID3v1Location; else d->APELocation = length(); } const ByteVector data = APETag()->render(); insert(data, d->APELocation, d->APESize); if(d->ID3v1Location >= 0) d->ID3v1Location += (static_cast<long>(data.size()) - d->APESize); d->APESize = data.size(); } else { // APE tag is empty. Remove the old one. if(d->APELocation >= 0) { removeBlock(d->APELocation, d->APESize); if(d->ID3v1Location >= 0) d->ID3v1Location -= d->APESize; d->APELocation = -1; d->APESize = 0; } } return true; } ID3v1::Tag *APE::File::ID3v1Tag(bool create) { return d->tag.access<ID3v1::Tag>(ApeID3v1Index, create); } APE::Tag *APE::File::APETag(bool create) { return d->tag.access<APE::Tag>(ApeAPEIndex, create); } void APE::File::strip(int tags) { if(tags & ID3v1) d->tag.set(ApeID3v1Index, 0); if(tags & APE) d->tag.set(ApeAPEIndex, 0); if(!ID3v1Tag()) APETag(true); } bool APE::File::hasAPETag() const { return (d->APELocation >= 0); } bool APE::File::hasID3v1Tag() const { return (d->ID3v1Location >= 0); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void APE::File::read(bool readProperties) { // Look for an ID3v2 tag d->ID3v2Location = Utils::findID3v2(this); if(d->ID3v2Location >= 0) { seek(d->ID3v2Location); d->ID3v2Header = new ID3v2::Header(readBlock(ID3v2::Header::size())); d->ID3v2Size = d->ID3v2Header->completeTagSize(); } // Look for an ID3v1 tag d->ID3v1Location = Utils::findID3v1(this); if(d->ID3v1Location >= 0) d->tag.set(ApeID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); // Look for an APE tag d->APELocation = Utils::findAPE(this, d->ID3v1Location); if(d->APELocation >= 0) { d->tag.set(ApeAPEIndex, new APE::Tag(this, d->APELocation)); d->APESize = APETag()->footer()->completeTagSize(); d->APELocation = d->APELocation + APE::Footer::size() - d->APESize; } if(d->ID3v1Location < 0) APETag(true); // Look for APE audio properties if(readProperties) { long streamLength; if(d->APELocation >= 0) streamLength = d->APELocation; else if(d->ID3v1Location >= 0) streamLength = d->ID3v1Location; else streamLength = length(); if(d->ID3v2Location >= 0) { seek(d->ID3v2Location + d->ID3v2Size); streamLength -= (d->ID3v2Location + d->ID3v2Size); } else { seek(0); } d->properties = new Properties(this, streamLength); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/apefile.h������������������������������������������������������������������0000664�0000000�0000000�00000020363�14447736377�0016656�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2010 by Alex Novichkov email : novichko@atnet.ru copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com (original WavPack implementation) copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_APEFILE_H #define TAGLIB_APEFILE_H #include "tfile.h" #include "taglib_export.h" #include "apeproperties.h" namespace TagLib { class Tag; namespace ID3v1 { class Tag; } namespace APE { class Tag; } //! An implementation of APE metadata /*! * This is implementation of APE metadata. * * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream * properties from the file. */ namespace APE { //! An implementation of TagLib::File with APE specific methods /*! * This implements and provides an interface for APE files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to APE files. */ class TAGLIB_EXPORT File : public TagLib::File { public: /*! * This set of flags is used for various operations and is suitable for * being OR-ed together. */ enum TagTypes { //! Empty set. Matches no tag types. NoTags = 0x0000, //! Matches ID3v1 tags. ID3v1 = 0x0001, //! Matches APE tags. APE = 0x0002, //! Matches all tag types. AllTags = 0xffff }; /*! * Constructs an APE file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an APE file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag * or a combination of the two. */ virtual TagLib::Tag *tag() const; /*! * Implements the unified property interface -- export function. * If the file contains both an APE and an ID3v1 tag, only APE * will be converted to the PropertyMap. */ PropertyMap properties() const; /*! * Removes unsupported properties. Forwards to the actual Tag's * removeUnsupportedProperties() function. */ void removeUnsupportedProperties(const StringList &properties); /*! * Implements the unified property interface -- import function. * Creates an APEv2 tag if necessary. A potentially existing ID3v1 * tag will be updated as well. */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the APE::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Saves the file. * * \note According to the official Monkey's Audio SDK, an APE file * can only have either ID3V1 or APE tags, so a parameter is used here. */ virtual bool save(); /*! * Returns a pointer to the ID3v1 tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid ID3v1 tag. If \a create is true it will create * an ID3v1 tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file * on disk actually has an ID3v1 tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasID3v1Tag() */ ID3v1::Tag *ID3v1Tag(bool create = false); /*! * Returns a pointer to the APE tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid APE tag. If \a create is true it will create * an APE tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an APE tag. Use hasAPETag() to check if the file * on disk actually has an APE tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasAPETag() */ APE::Tag *APETag(bool create = false); /*! * This will remove the tags that match the OR-ed together TagTypes from the * file. By default it removes all tags. * * \note This will also invalidate pointers to the tags * as their memory will be freed. * \note In order to make the removal permanent save() still needs to be called */ void strip(int tags = AllTags); /*! * Returns whether or not the file on disk actually has an APE tag. * * \see APETag() */ bool hasAPETag() const; /*! * Returns whether or not the file on disk actually has an ID3v1 tag. * * \see ID3v1Tag() */ bool hasID3v1Tag() const; /*! * Returns whether or not the given \a stream can be opened as an APE * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace APE } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/apefooter.cpp��������������������������������������������������������������0000664�0000000�0000000�00000012601�14447736377�0017564�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen (C) 2002 - 2008 by Scott Wheeler (id3v2header.cpp) email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <iostream> #include <bitset> #include <tstring.h> #include <tdebug.h> #include "apefooter.h" using namespace TagLib; using namespace APE; class APE::Footer::FooterPrivate { public: FooterPrivate() : version(0), footerPresent(true), headerPresent(false), isHeader(false), itemCount(0), tagSize(0) {} unsigned int version; bool footerPresent; bool headerPresent; bool isHeader; unsigned int itemCount; unsigned int tagSize; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// unsigned int APE::Footer::size() { return 32; } ByteVector APE::Footer::fileIdentifier() { return ByteVector("APETAGEX"); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// APE::Footer::Footer() : d(new FooterPrivate()) { } APE::Footer::Footer(const ByteVector &data) : d(new FooterPrivate()) { parse(data); } APE::Footer::~Footer() { delete d; } unsigned int APE::Footer::version() const { return d->version; } bool APE::Footer::headerPresent() const { return d->headerPresent; } bool APE::Footer::footerPresent() const { return d->footerPresent; } bool APE::Footer::isHeader() const { return d->isHeader; } void APE::Footer::setHeaderPresent(bool b) const { d->headerPresent = b; } unsigned int APE::Footer::itemCount() const { return d->itemCount; } void APE::Footer::setItemCount(unsigned int s) { d->itemCount = s; } unsigned int APE::Footer::tagSize() const { return d->tagSize; } unsigned int APE::Footer::completeTagSize() const { if(d->headerPresent) return d->tagSize + size(); return d->tagSize; } void APE::Footer::setTagSize(unsigned int s) { d->tagSize = s; } void APE::Footer::setData(const ByteVector &data) { parse(data); } ByteVector APE::Footer::renderFooter() const { return render(false); } ByteVector APE::Footer::renderHeader() const { if(!d->headerPresent) return ByteVector(); return render(true); } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void APE::Footer::parse(const ByteVector &data) { if(data.size() < size()) return; // The first eight bytes, data[0..7], are the File Identifier, "APETAGEX". // Read the version number d->version = data.toUInt(8, false); // Read the tag size d->tagSize = data.toUInt(12, false); // Read the item count d->itemCount = data.toUInt(16, false); // Read the flags std::bitset<32> flags(TAGLIB_CONSTRUCT_BITSET(data.toUInt(20, false))); d->headerPresent = flags[31]; d->footerPresent = !flags[30]; d->isHeader = flags[29]; } ByteVector APE::Footer::render(bool isHeader) const { ByteVector v; // add the file identifier -- "APETAGEX" v.append(fileIdentifier()); // add the version number -- we always render a 2.000 tag regardless of what // the tag originally was. v.append(ByteVector::fromUInt(2000, false)); // add the tag size v.append(ByteVector::fromUInt(d->tagSize, false)); // add the item count v.append(ByteVector::fromUInt(d->itemCount, false)); // render and add the flags std::bitset<32> flags; flags[31] = d->headerPresent; flags[30] = false; // footer is always present flags[29] = isHeader; v.append(ByteVector::fromUInt(flags.to_ulong(), false)); // add the reserved 64bit v.append(ByteVector::fromLongLong(0)); return v; } �������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/apefooter.h����������������������������������������������������������������0000664�0000000�0000000�00000012200�14447736377�0017224�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_APEFOOTER_H #define TAGLIB_APEFOOTER_H #include "tbytevector.h" #include "taglib_export.h" namespace TagLib { namespace APE { //! An implementation of APE footers /*! * This class implements APE footers (and headers). It attempts to follow, both * semantically and programmatically, the structure specified in * the APE v2.0 standard. The API is based on the properties of APE footer and * headers specified there. */ class TAGLIB_EXPORT Footer { public: /*! * Constructs an empty APE footer. */ Footer(); /*! * Constructs an APE footer based on \a data. parse() is called * immediately. */ Footer(const ByteVector &data); /*! * Destroys the footer. */ virtual ~Footer(); /*! * Returns the version number. (Note: This is the 1000 or 2000.) */ unsigned int version() const; /*! * Returns true if a header is present in the tag. */ bool headerPresent() const; /*! * Returns true if a footer is present in the tag. */ bool footerPresent() const; /*! * Returns true this is actually the header. */ bool isHeader() const; /*! * Sets whether the header should be rendered or not */ void setHeaderPresent(bool b) const; /*! * Returns the number of items in the tag. */ unsigned int itemCount() const; /*! * Set the item count to \a s. * \see itemCount() */ void setItemCount(unsigned int s); /*! * Returns the tag size in bytes. This is the size of the frame content and footer. * The size of the \e entire tag will be this plus the header size, if present. * * \see completeTagSize() */ unsigned int tagSize() const; /*! * Returns the tag size, including if present, the header * size. * * \see tagSize() */ unsigned int completeTagSize() const; /*! * Set the tag size to \a s. * \see tagSize() */ void setTagSize(unsigned int s); /*! * Returns the size of the footer. Presently this is always 32 bytes. */ static unsigned int size(); /*! * Returns the string used to identify an APE tag inside of a file. * Presently this is always "APETAGEX". */ static ByteVector fileIdentifier(); /*! * Sets the data that will be used as the footer. 32 bytes, * starting from \a data will be used. */ void setData(const ByteVector &data); /*! * Renders the footer back to binary format. */ ByteVector renderFooter() const; /*! * Renders the header corresponding to the footer. If headerPresent is * set to false, it returns an empty ByteVector. */ ByteVector renderHeader() const; protected: /*! * Called by setData() to parse the footer data. It makes this information * available through the public API. */ void parse(const ByteVector &data); /*! * Called by renderFooter and renderHeader */ ByteVector render(bool isHeader) const; private: Footer(const Footer &); Footer &operator=(const Footer &); class FooterPrivate; FooterPrivate *d; }; } // namespace APE } // namespace TagLib #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/apeitem.cpp����������������������������������������������������������������0000664�0000000�0000000�00000015113�14447736377�0017225�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevectorlist.h> #include <tdebug.h> #include "apeitem.h" using namespace TagLib; using namespace APE; class APE::Item::ItemPrivate { public: ItemPrivate() : type(Text), readOnly(false) {} Item::ItemTypes type; String key; ByteVector value; StringList text; bool readOnly; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// APE::Item::Item() : d(new ItemPrivate()) { } APE::Item::Item(const String &key, const String &value) : d(new ItemPrivate()) { d->key = key; d->text.append(value); } APE::Item::Item(const String &key, const StringList &values) : d(new ItemPrivate()) { d->key = key; d->text = values; } APE::Item::Item(const String &key, const ByteVector &value, bool binary) : d(new ItemPrivate()) { d->key = key; if(binary) { d->type = Binary; d->value = value; } else { d->text.append(value); } } APE::Item::Item(const Item &item) : d(new ItemPrivate(*item.d)) { } APE::Item::~Item() { delete d; } Item &APE::Item::operator=(const Item &item) { Item(item).swap(*this); return *this; } void APE::Item::swap(Item &item) { using std::swap; swap(d, item.d); } void APE::Item::setReadOnly(bool readOnly) { d->readOnly = readOnly; } bool APE::Item::isReadOnly() const { return d->readOnly; } void APE::Item::setType(APE::Item::ItemTypes val) { d->type = val; } APE::Item::ItemTypes APE::Item::type() const { return d->type; } String APE::Item::key() const { return d->key; } ByteVector APE::Item::binaryData() const { return d->value; } void APE::Item::setBinaryData(const ByteVector &value) { d->type = Binary; d->value = value; d->text.clear(); } ByteVector APE::Item::value() const { // This seems incorrect as it won't be actually rendering the value to keep it // up to date. return d->value; } void APE::Item::setKey(const String &key) { d->key = key; } void APE::Item::setValue(const String &value) { d->type = Text; d->text = value; d->value.clear(); } void APE::Item::setValues(const StringList &value) { d->type = Text; d->text = value; d->value.clear(); } void APE::Item::appendValue(const String &value) { d->type = Text; d->text.append(value); d->value.clear(); } void APE::Item::appendValues(const StringList &values) { d->type = Text; d->text.append(values); d->value.clear(); } int APE::Item::size() const { int result = 8 + d->key.size() + 1; switch(d->type) { case Text: if(!d->text.isEmpty()) { StringList::ConstIterator it = d->text.begin(); result += it->data(String::UTF8).size(); it++; for(; it != d->text.end(); ++it) result += 1 + it->data(String::UTF8).size(); } break; case Binary: case Locator: result += d->value.size(); break; } return result; } StringList APE::Item::toStringList() const { return d->text; } StringList APE::Item::values() const { return d->text; } String APE::Item::toString() const { if(d->type == Text && !isEmpty()) return d->text.front(); return String(); } bool APE::Item::isEmpty() const { switch(d->type) { case Text: if(d->text.isEmpty()) return true; return d->text.size() == 1 && d->text.front().isEmpty(); case Binary: case Locator: return d->value.isEmpty(); default: return false; } } void APE::Item::parse(const ByteVector &data) { // 11 bytes is the minimum size for an APE item if(data.size() < 11) { debug("APE::Item::parse() -- no data in item"); return; } const unsigned int valueLength = data.toUInt(0, false); const unsigned int flags = data.toUInt(4, false); // An item key can contain ASCII characters from 0x20 up to 0x7E, not UTF-8. // We assume that the validity of the given key has been checked. d->key = String(&data[8], String::Latin1); const ByteVector value = data.mid(8 + d->key.size() + 1, valueLength); setReadOnly(flags & 1); setType(static_cast<ItemTypes>((flags >> 1) & 3)); if(Text == d->type) d->text = StringList(ByteVectorList::split(value, '\0'), String::UTF8); else d->value = value; } ByteVector APE::Item::render() const { ByteVector data; unsigned int flags = ((d->readOnly) ? 1 : 0) | (d->type << 1); ByteVector value; if(isEmpty()) return data; if(d->type == Text) { StringList::ConstIterator it = d->text.begin(); value.append(it->data(String::UTF8)); it++; for(; it != d->text.end(); ++it) { value.append('\0'); value.append(it->data(String::UTF8)); } d->value = value; } else value.append(d->value); data.append(ByteVector::fromUInt(value.size(), false)); data.append(ByteVector::fromUInt(flags, false)); data.append(d->key.data(String::Latin1)); data.append(ByteVector('\0')); data.append(value); return data; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/apeitem.h������������������������������������������������������������������0000664�0000000�0000000�00000014337�14447736377�0016701�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_APEITEM_H #define TAGLIB_APEITEM_H #include "tbytevector.h" #include "tstring.h" #include "tstringlist.h" namespace TagLib { namespace APE { //! An implementation of APE-items /*! * This class provides the features of items in the APEv2 standard. */ class TAGLIB_EXPORT Item { public: /*! * Enum of types an Item can have. The value of 3 is reserved. */ enum ItemTypes { //! Item contains text information coded in UTF-8 Text = 0, //! Item contains binary information Binary = 1, //! Item is a locator of external stored information Locator = 2 }; /*! * Constructs an empty item. */ Item(); /*! * Constructs a text item with \a key and \a value. */ // BIC: Remove this, StringList has a constructor from a single string Item(const String &key, const String &value); /*! * Constructs a text item with \a key and \a values. */ Item(const String &key, const StringList &values); /*! * Constructs an item with \a key and \a value. * If \a binary is true a Binary item will be created, otherwise \a value will be interpreted as text */ Item(const String &key, const ByteVector &value, bool binary); /*! * Construct an item as a copy of \a item. */ Item(const Item &item); /*! * Destroys the item. */ virtual ~Item(); /*! * Copies the contents of \a item into this item. */ Item &operator=(const Item &item); /*! * Exchanges the content of this item by the content of \a item. */ void swap(Item &item); /*! * Returns the key. */ String key() const; /*! * Returns the binary value. * If the item type is not \a Binary, always returns an empty ByteVector. */ ByteVector binaryData() const; /*! * Set the binary value to \a value * The item's type will also be set to \a Binary */ void setBinaryData(const ByteVector &value); #ifndef DO_NOT_DOCUMENT /* Remove in next binary incompatible release */ ByteVector value() const; #endif /*! * Sets the key for the item to \a key. */ void setKey(const String &key); /*! * Sets the text value of the item to \a value and clears any previous contents. * * \see toString() */ void setValue(const String &value); /*! * Sets the text value of the item to the list of values in \a value and clears * any previous contents. * * \see toStringList() */ void setValues(const StringList &values); /*! * Appends \a value to create (or extend) the current list of text values. * * \see toString() */ void appendValue(const String &value); /*! * Appends \a values to extend the current list of text values. * * \see toStringList() */ void appendValues(const StringList &values); /*! * Returns the size of the full item. */ int size() const; /*! * Returns the value as a single string. In case of multiple strings, * the first is returned. If the data type is not \a Text, always returns * an empty String. */ String toString() const; #ifndef DO_NOT_DOCUMENT /* Remove in next binary incompatible release */ StringList toStringList() const; #endif /*! * Returns the list of text values. If the data type is not \a Text, always * returns an empty StringList. */ StringList values() const; /*! * Render the item to a ByteVector. */ ByteVector render() const; /*! * Parse the item from the ByteVector \a data. */ void parse(const ByteVector& data); /*! * Set the item to read-only. */ void setReadOnly(bool readOnly); /*! * Return true if the item is read-only. */ bool isReadOnly() const; /*! * Sets the type of the item to \a type. * * \see ItemTypes */ void setType(ItemTypes type); /*! * Returns the type of the item. */ ItemTypes type() const; /*! * Returns if the item has any real content. */ bool isEmpty() const; private: class ItemPrivate; ItemPrivate *d; }; } // namespace APE } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/apeproperties.cpp����������������������������������������������������������0000664�0000000�0000000�00000016054�14447736377�0020470�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2010 by Alex Novichkov email : novichko@atnet.ru copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com (original WavPack implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include <bitset> #include "id3v2tag.h" #include "apeproperties.h" #include "apefile.h" #include "apetag.h" #include "apefooter.h" using namespace TagLib; class APE::Properties::PropertiesPrivate { public: PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), channels(0), version(0), bitsPerSample(0), sampleFrames(0) {} int length; int bitrate; int sampleRate; int channels; int version; int bitsPerSample; unsigned int sampleFrames; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// APE::Properties::Properties(File *, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { debug("APE::Properties::Properties() -- This constructor is no longer used."); } APE::Properties::Properties(File *file, long streamLength, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(file, streamLength); } APE::Properties::~Properties() { delete d; } int APE::Properties::length() const { return lengthInSeconds(); } int APE::Properties::lengthInSeconds() const { return d->length / 1000; } int APE::Properties::lengthInMilliseconds() const { return d->length; } int APE::Properties::bitrate() const { return d->bitrate; } int APE::Properties::sampleRate() const { return d->sampleRate; } int APE::Properties::channels() const { return d->channels; } int APE::Properties::version() const { return d->version; } int APE::Properties::bitsPerSample() const { return d->bitsPerSample; } unsigned int APE::Properties::sampleFrames() const { return d->sampleFrames; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// namespace { int headerVersion(const ByteVector &header) { if(header.size() < 6 || !header.startsWith("MAC ")) return -1; return header.toUShort(4, false); } } // namespace void APE::Properties::read(File *file, long streamLength) { // First, we assume that the file pointer is set at the first descriptor. long offset = file->tell(); int version = headerVersion(file->readBlock(6)); // Next, we look for the descriptor. if(version < 0) { offset = file->find("MAC ", offset); file->seek(offset); version = headerVersion(file->readBlock(6)); } if(version < 0) { debug("APE::Properties::read() -- APE descriptor not found"); return; } d->version = version; if(d->version >= 3980) analyzeCurrent(file); else analyzeOld(file); if(d->sampleFrames > 0 && d->sampleRate > 0) { const double length = d->sampleFrames * 1000.0 / d->sampleRate; d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); } } void APE::Properties::analyzeCurrent(File *file) { // Read the descriptor file->seek(2, File::Current); const ByteVector descriptor = file->readBlock(44); if(descriptor.size() < 44) { debug("APE::Properties::analyzeCurrent() -- descriptor is too short."); return; } const unsigned int descriptorBytes = descriptor.toUInt(0, false); if((descriptorBytes - 52) > 0) file->seek(descriptorBytes - 52, File::Current); // Read the header const ByteVector header = file->readBlock(24); if(header.size() < 24) { debug("APE::Properties::analyzeCurrent() -- MAC header is too short."); return; } // Get the APE info d->channels = header.toShort(18, false); d->sampleRate = header.toUInt(20, false); d->bitsPerSample = header.toShort(16, false); const unsigned int totalFrames = header.toUInt(12, false); if(totalFrames == 0) return; const unsigned int blocksPerFrame = header.toUInt(4, false); const unsigned int finalFrameBlocks = header.toUInt(8, false); d->sampleFrames = (totalFrames - 1) * blocksPerFrame + finalFrameBlocks; } void APE::Properties::analyzeOld(File *file) { const ByteVector header = file->readBlock(26); if(header.size() < 26) { debug("APE::Properties::analyzeOld() -- MAC header is too short."); return; } const unsigned int totalFrames = header.toUInt(18, false); // Fail on 0 length APE files (catches non-finalized APE files) if(totalFrames == 0) return; const short compressionLevel = header.toShort(0, false); unsigned int blocksPerFrame; if(d->version >= 3950) blocksPerFrame = 73728 * 4; else if(d->version >= 3900 || (d->version >= 3800 && compressionLevel == 4000)) blocksPerFrame = 73728; else blocksPerFrame = 9216; // Get the APE info d->channels = header.toShort(4, false); d->sampleRate = header.toUInt(6, false); const unsigned int finalFrameBlocks = header.toUInt(22, false); d->sampleFrames = (totalFrames - 1) * blocksPerFrame + finalFrameBlocks; // Get the bit depth from the RIFF-fmt chunk. file->seek(16, File::Current); const ByteVector fmt = file->readBlock(28); if(fmt.size() < 28 || !fmt.startsWith("WAVEfmt ")) { debug("APE::Properties::analyzeOld() -- fmt header is too short."); return; } d->bitsPerSample = fmt.toShort(26, false); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/apeproperties.h������������������������������������������������������������0000664�0000000�0000000�00000010763�14447736377�0020136�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2010 by Alex Novichkov email : novichko@atnet.ru copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com (original WavPack implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_APEPROPERTIES_H #define TAGLIB_APEPROPERTIES_H #include "taglib_export.h" #include "audioproperties.h" namespace TagLib { namespace APE { class File; //! An implementation of audio property reading for APE /*! * This reads the data from an APE stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of APE::Properties with the data read from the * APE::File \a file. * * \deprecated Use Properties(File *, long, ReadStyle). */ TAGLIB_DEPRECATED Properties(File *file, ReadStyle style = Average); /*! * Create an instance of APE::Properties with the data read from the * APE::File \a file. */ Properties(File *file, long streamLength, ReadStyle style = Average); /*! * Destroys this APE::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the number of bits per audio sample. */ int bitsPerSample() const; /*! * Returns the total number of audio samples in file. */ unsigned int sampleFrames() const; /*! * Returns APE version. */ int version() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(File *file, long streamLength); void analyzeCurrent(File *file); void analyzeOld(File *file); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace APE } // namespace TagLib #endif �������������taglib-1.13.1/taglib/ape/apetag.cpp�����������������������������������������������������������������0000664�0000000�0000000�00000027631�14447736377�0017052�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #if defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x5130) // Sun Studio finds multiple specializations of Map because // it considers specializations with and without class types // to be different; this define forces Map to use only the // specialization with the class keyword. #define WANT_CLASS_INSTANTIATION_OF_MAP (1) #endif #include <tfile.h> #include <tstring.h> #include <tmap.h> #include <tpropertymap.h> #include <tdebug.h> #include <tutils.h> #include "apetag.h" #include "apefooter.h" #include "apeitem.h" using namespace TagLib; using namespace APE; namespace { const unsigned int MinKeyLength = 2; const unsigned int MaxKeyLength = 255; bool isKeyValid(const ByteVector &key) { const char *invalidKeys[] = { "ID3", "TAG", "OGGS", "MP+", 0 }; // only allow printable ASCII including space (32..126) for(ByteVector::ConstIterator it = key.begin(); it != key.end(); ++it) { const int c = static_cast<unsigned char>(*it); if(c < 32 || c > 126) return false; } const String upperKey = String(key).upper(); for(size_t i = 0; invalidKeys[i] != 0; ++i) { if(upperKey == invalidKeys[i]) return false; } return true; } } // namespace class APE::Tag::TagPrivate { public: TagPrivate() : file(0), footerLocation(0) {} File *file; long footerLocation; Footer footer; ItemListMap itemListMap; }; //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// APE::Tag::Tag() : d(new TagPrivate()) { } APE::Tag::Tag(TagLib::File *file, long footerLocation) : d(new TagPrivate()) { d->file = file; d->footerLocation = footerLocation; read(); } APE::Tag::~Tag() { delete d; } ByteVector APE::Tag::fileIdentifier() { return ByteVector::fromCString("APETAGEX"); } String APE::Tag::title() const { Item value = d->itemListMap.value("TITLE"); return value.isEmpty() ? String() : value.values().toString(); } String APE::Tag::artist() const { Item value = d->itemListMap.value("ARTIST"); return value.isEmpty() ? String() : value.values().toString(); } String APE::Tag::album() const { Item value = d->itemListMap.value("ALBUM"); return value.isEmpty() ? String() : value.values().toString(); } String APE::Tag::comment() const { Item value = d->itemListMap.value("COMMENT"); return value.isEmpty() ? String() : value.values().toString(); } String APE::Tag::genre() const { Item value = d->itemListMap.value("GENRE"); return value.isEmpty() ? String() : value.values().toString(); } unsigned int APE::Tag::year() const { Item value = d->itemListMap.value("YEAR"); return value.isEmpty() ? 0 : value.toString().toInt(); } unsigned int APE::Tag::track() const { Item value = d->itemListMap.value("TRACK"); return value.isEmpty() ? 0 : value.toString().toInt(); } void APE::Tag::setTitle(const String &s) { addValue("TITLE", s, true); } void APE::Tag::setArtist(const String &s) { addValue("ARTIST", s, true); } void APE::Tag::setAlbum(const String &s) { addValue("ALBUM", s, true); } void APE::Tag::setComment(const String &s) { addValue("COMMENT", s, true); } void APE::Tag::setGenre(const String &s) { addValue("GENRE", s, true); } void APE::Tag::setYear(unsigned int i) { if(i == 0) removeItem("YEAR"); else addValue("YEAR", String::number(i), true); } void APE::Tag::setTrack(unsigned int i) { if(i == 0) removeItem("TRACK"); else addValue("TRACK", String::number(i), true); } namespace { // conversions of tag keys between what we use in PropertyMap and what's usual // for APE tags // usual, APE const std::pair<const char *, const char *> keyConversions[] = { std::make_pair("TRACKNUMBER", "TRACK"), std::make_pair("DATE", "YEAR"), std::make_pair("ALBUMARTIST", "ALBUM ARTIST"), std::make_pair("DISCNUMBER", "DISC"), std::make_pair("REMIXER", "MIXARTIST"), std::make_pair("RELEASESTATUS", "MUSICBRAINZ_ALBUMSTATUS"), std::make_pair("RELEASETYPE", "MUSICBRAINZ_ALBUMTYPE"), }; const size_t keyConversionsSize = sizeof(keyConversions) / sizeof(keyConversions[0]); } // namespace PropertyMap APE::Tag::properties() const { PropertyMap properties; ItemListMap::ConstIterator it = itemListMap().begin(); for(; it != itemListMap().end(); ++it) { String tagName = it->first.upper(); // if the item is Binary or Locator, or if the key is an invalid string, // add to unsupportedData if(it->second.type() != Item::Text || tagName.isEmpty()) { properties.unsupportedData().append(it->first); } else { // Some tags need to be handled specially for(size_t i = 0; i < keyConversionsSize; ++i) { if(tagName == keyConversions[i].second) tagName = keyConversions[i].first; } properties[tagName].append(it->second.toStringList()); } } return properties; } void APE::Tag::removeUnsupportedProperties(const StringList &properties) { StringList::ConstIterator it = properties.begin(); for(; it != properties.end(); ++it) removeItem(*it); } PropertyMap APE::Tag::setProperties(const PropertyMap &origProps) { PropertyMap properties(origProps); // make a local copy that can be modified // see comment in properties() for(size_t i = 0; i < keyConversionsSize; ++i) if(properties.contains(keyConversions[i].first)) { properties.insert(keyConversions[i].second, properties[keyConversions[i].first]); properties.erase(keyConversions[i].first); } // first check if tags need to be removed completely StringList toRemove; ItemListMap::ConstIterator remIt = itemListMap().begin(); for(; remIt != itemListMap().end(); ++remIt) { String key = remIt->first.upper(); // only remove if a) key is valid, b) type is text, c) key not contained in new properties if(!key.isEmpty() && remIt->second.type() == APE::Item::Text && !properties.contains(key)) toRemove.append(remIt->first); } for(StringList::ConstIterator removeIt = toRemove.begin(); removeIt != toRemove.end(); removeIt++) removeItem(*removeIt); // now sync in the "forward direction" PropertyMap::ConstIterator it = properties.begin(); PropertyMap invalid; for(; it != properties.end(); ++it) { const String &tagName = it->first; if(!checkKey(tagName)) invalid.insert(it->first, it->second); else if(!(itemListMap().contains(tagName)) || !(itemListMap()[tagName].values() == it->second)) { if(it->second.isEmpty()) removeItem(tagName); else { StringList::ConstIterator valueIt = it->second.begin(); addValue(tagName, *valueIt, true); ++valueIt; for(; valueIt != it->second.end(); ++valueIt) addValue(tagName, *valueIt, false); } } } return invalid; } bool APE::Tag::checkKey(const String &key) { if(key.size() < MinKeyLength || key.size() > MaxKeyLength) return false; return isKeyValid(key.data(String::UTF8)); } APE::Footer *APE::Tag::footer() const { return &d->footer; } const APE::ItemListMap& APE::Tag::itemListMap() const { return d->itemListMap; } void APE::Tag::removeItem(const String &key) { d->itemListMap.erase(key.upper()); } void APE::Tag::addValue(const String &key, const String &value, bool replace) { if(replace) removeItem(key); if(value.isEmpty()) return; // Text items may contain more than one value. // Binary or locator items may have only one value, hence always replaced. ItemListMap::Iterator it = d->itemListMap.find(key.upper()); if(it != d->itemListMap.end() && it->second.type() == Item::Text) it->second.appendValue(value); else setItem(key, Item(key, value)); } void APE::Tag::setData(const String &key, const ByteVector &value) { removeItem(key); if(value.isEmpty()) return; setItem(key, Item(key, value, true)); } void APE::Tag::setItem(const String &key, const Item &item) { if(!checkKey(key)) { debug("APE::Tag::setItem() - Couldn't set an item due to an invalid key."); return; } d->itemListMap[key.upper()] = item; } bool APE::Tag::isEmpty() const { return d->itemListMap.isEmpty(); } //////////////////////////////////////////////////////////////////////////////// // protected methods //////////////////////////////////////////////////////////////////////////////// void APE::Tag::read() { if(d->file && d->file->isValid()) { d->file->seek(d->footerLocation); d->footer.setData(d->file->readBlock(Footer::size())); if(d->footer.tagSize() <= Footer::size() || d->footer.tagSize() > static_cast<unsigned long>(d->file->length())) return; d->file->seek(d->footerLocation + Footer::size() - d->footer.tagSize()); parse(d->file->readBlock(d->footer.tagSize() - Footer::size())); } } ByteVector APE::Tag::render() const { ByteVector data; unsigned int itemCount = 0; for(ItemListMap::ConstIterator it = d->itemListMap.begin(); it != d->itemListMap.end(); ++it) { data.append(it->second.render()); itemCount++; } d->footer.setItemCount(itemCount); d->footer.setTagSize(data.size() + Footer::size()); d->footer.setHeaderPresent(true); return d->footer.renderHeader() + data + d->footer.renderFooter(); } void APE::Tag::parse(const ByteVector &data) { // 11 bytes is the minimum size for an APE item if(data.size() < 11) return; unsigned int pos = 0; for(unsigned int i = 0; i < d->footer.itemCount() && pos <= data.size() - 11; i++) { const int nullPos = data.find('\0', pos + 8); if(nullPos < 0) { debug("APE::Tag::parse() - Couldn't find a key/value separator. Stopped parsing."); return; } const unsigned int keyLength = nullPos - pos - 8; const unsigned int valLength = data.toUInt(pos, false); if(valLength >= data.size() || pos > data.size() - valLength) { debug("APE::Tag::parse() - Invalid val length. Stopped parsing."); return; } if(keyLength >= MinKeyLength && keyLength <= MaxKeyLength && isKeyValid(data.mid(pos + 8, keyLength))) { APE::Item item; item.parse(data.mid(pos)); d->itemListMap.insert(item.key().upper(), item); } else { debug("APE::Tag::parse() - Skipped an item due to an invalid key."); } pos += keyLength + valLength + 9; } } �������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ape/apetag.h�������������������������������������������������������������������0000664�0000000�0000000�00000016051�14447736377�0016511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_APETAG_H #define TAGLIB_APETAG_H #include "tag.h" #include "tbytevector.h" #include "tmap.h" #include "tstring.h" #include "taglib_export.h" #include "apeitem.h" namespace TagLib { class File; //! An implementation of the APE tagging format namespace APE { class Footer; /*! * A mapping between a list of item names, or keys, and the associated item. * * \see APE::Tag::itemListMap() */ typedef Map<const String, Item> ItemListMap; //! An APE tag implementation class TAGLIB_EXPORT Tag : public TagLib::Tag { public: /*! * Create an APE tag with default values. */ Tag(); /*! * Create an APE tag and parse the data in \a file with APE footer at * \a tagOffset. */ Tag(TagLib::File *file, long footerLocation); /*! * Destroys this Tag instance. */ virtual ~Tag(); /*! * Renders the in memory values to a ByteVector suitable for writing to * the file. */ ByteVector render() const; /*! * Returns the string "APETAGEX" suitable for usage in locating the tag in a * file. */ static ByteVector fileIdentifier(); // Reimplementations. virtual String title() const; virtual String artist() const; virtual String album() const; virtual String comment() const; virtual String genre() const; virtual unsigned int year() const; virtual unsigned int track() const; virtual void setTitle(const String &s); virtual void setArtist(const String &s); virtual void setAlbum(const String &s); virtual void setComment(const String &s); virtual void setGenre(const String &s); virtual void setYear(unsigned int i); virtual void setTrack(unsigned int i); /*! * Implements the unified tag dictionary interface -- export function. * APE tags are perfectly compatible with the dictionary interface because they * support both arbitrary tag names and multiple values. Currently only * APE items of type *Text* are handled by the dictionary interface; all *Binary* * and *Locator* items will be put into the unsupportedData list and can be * deleted on request using removeUnsupportedProperties(). The same happens * to Text items if their key is invalid for PropertyMap (which should actually * never happen). * * The only conversion done by this export function is to rename the APE tags * TRACK to TRACKNUMBER, YEAR to DATE, and ALBUM ARTIST to ALBUMARTIST, respectively, * in order to be compliant with the names used in other formats. */ PropertyMap properties() const; void removeUnsupportedProperties(const StringList &properties); /*! * Implements the unified tag dictionary interface -- import function. The same * comments as for the export function apply; additionally note that the APE tag * specification requires keys to have between 2 and 16 printable ASCII characters * with the exception of the fixed strings "ID3", "TAG", "OGGS", and "MP+". */ PropertyMap setProperties(const PropertyMap &); /*! * Check if the given String is a valid APE tag key. */ static bool checkKey(const String&); /*! * Returns a pointer to the tag's footer. */ Footer *footer() const; /*! * Returns a reference to the item list map. This is an ItemListMap of * all of the items in the tag. * * This is the most powerful structure for accessing the items of the tag. * * APE tags are case-insensitive, all keys in this map have been converted * to upper case. * * \warning You should not modify this data structure directly, instead * use setItem() and removeItem(). */ const ItemListMap &itemListMap() const; /*! * Removes the \a key item from the tag */ void removeItem(const String &key); /*! * Adds to the text item specified by \a key the data \a value. If \a replace * is true, then all of the other values on the same key will be removed * first. If a binary item exists for \a key it will be removed first. */ void addValue(const String &key, const String &value, bool replace = true); /*! * Set the binary data for the key specified by \a item to \a value * This will convert the item to type \a Binary if it isn't already and * all of the other values on the same key will be removed. */ void setData(const String &key, const ByteVector &value); /*! * Sets the \a key item to the value of \a item. If an item with the \a key is already * present, it will be replaced. */ void setItem(const String &key, const Item &item); /*! * Returns true if the tag does not contain any data. */ bool isEmpty() const; protected: /*! * Reads from the file specified in the constructor. */ void read(); /*! * Parses the body of the tag in \a data. */ void parse(const ByteVector &data); private: Tag(const Tag &); Tag &operator=(const Tag &); class TagPrivate; TagPrivate *d; }; } // namespace APE } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/asf/���������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015100�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/asf/asfattribute.cpp�����������������������������������������������������������0000664�0000000�0000000�00000020214�14447736377�0020300�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <taglib.h> #include <tdebug.h> #include <trefcounter.h> #include "asfattribute.h" #include "asffile.h" #include "asfutils.h" using namespace TagLib; class ASF::Attribute::AttributePrivate : public RefCounter { public: AttributePrivate() : pictureValue(ASF::Picture::fromInvalid()), numericValue(0), stream(0), language(0) {} AttributeTypes type; String stringValue; ByteVector byteVectorValue; ASF::Picture pictureValue; unsigned long long numericValue; int stream; int language; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// ASF::Attribute::Attribute() : d(new AttributePrivate()) { d->type = UnicodeType; } ASF::Attribute::Attribute(const ASF::Attribute &other) : d(other.d) { d->ref(); } ASF::Attribute::Attribute(const String &value) : d(new AttributePrivate()) { d->type = UnicodeType; d->stringValue = value; } ASF::Attribute::Attribute(const ByteVector &value) : d(new AttributePrivate()) { d->type = BytesType; d->byteVectorValue = value; } ASF::Attribute::Attribute(const ASF::Picture &value) : d(new AttributePrivate()) { d->type = BytesType; d->pictureValue = value; } ASF::Attribute::Attribute(unsigned int value) : d(new AttributePrivate()) { d->type = DWordType; d->numericValue = value; } ASF::Attribute::Attribute(unsigned long long value) : d(new AttributePrivate()) { d->type = QWordType; d->numericValue = value; } ASF::Attribute::Attribute(unsigned short value) : d(new AttributePrivate()) { d->type = WordType; d->numericValue = value; } ASF::Attribute::Attribute(bool value) : d(new AttributePrivate()) { d->type = BoolType; d->numericValue = value; } ASF::Attribute &ASF::Attribute::operator=(const ASF::Attribute &other) { Attribute(other).swap(*this); return *this; } void ASF::Attribute::swap(Attribute &other) { using std::swap; swap(d, other.d); } ASF::Attribute::~Attribute() { if(d->deref()) delete d; } ASF::Attribute::AttributeTypes ASF::Attribute::type() const { return d->type; } String ASF::Attribute::toString() const { return d->stringValue; } ByteVector ASF::Attribute::toByteVector() const { if(d->pictureValue.isValid()) return d->pictureValue.render(); return d->byteVectorValue; } unsigned short ASF::Attribute::toBool() const { return d->numericValue ? 1 : 0; } unsigned short ASF::Attribute::toUShort() const { return static_cast<unsigned short>(d->numericValue); } unsigned int ASF::Attribute::toUInt() const { return static_cast<unsigned int>(d->numericValue); } unsigned long long ASF::Attribute::toULongLong() const { return static_cast<unsigned long long>(d->numericValue); } ASF::Picture ASF::Attribute::toPicture() const { return d->pictureValue; } String ASF::Attribute::parse(ASF::File &f, int kind) { unsigned int size, nameLength; String name; d->pictureValue = Picture::fromInvalid(); // extended content descriptor if(kind == 0) { nameLength = readWORD(&f); name = readString(&f, nameLength); d->type = static_cast<ASF::Attribute::AttributeTypes>(readWORD(&f)); size = readWORD(&f); } // metadata & metadata library else { int temp = readWORD(&f); // metadata library if(kind == 2) { d->language = temp; } d->stream = readWORD(&f); nameLength = readWORD(&f); d->type = static_cast<ASF::Attribute::AttributeTypes>(readWORD(&f)); size = readDWORD(&f); name = readString(&f, nameLength); } if(kind != 2 && size > 65535) { debug("ASF::Attribute::parse() -- Value larger than 64kB"); } switch(d->type) { case WordType: d->numericValue = readWORD(&f); break; case BoolType: if(kind == 0) { d->numericValue = (readDWORD(&f) != 0); } else { d->numericValue = (readWORD(&f) != 0); } break; case DWordType: d->numericValue = readDWORD(&f); break; case QWordType: d->numericValue = readQWORD(&f); break; case UnicodeType: d->stringValue = readString(&f, size); break; case BytesType: case GuidType: d->byteVectorValue = f.readBlock(size); break; } if(d->type == BytesType && name == "WM/Picture") { d->pictureValue.parse(d->byteVectorValue); if(d->pictureValue.isValid()) { d->byteVectorValue.clear(); } } return name; } int ASF::Attribute::dataSize() const { switch (d->type) { case WordType: return 2; case BoolType: return 4; case DWordType: return 4; case QWordType: return 5; case UnicodeType: return d->stringValue.size() * 2 + 2; case BytesType: if(d->pictureValue.isValid()) return d->pictureValue.dataSize(); case GuidType: return d->byteVectorValue.size(); } return 0; } ByteVector ASF::Attribute::render(const String &name, int kind) const { ByteVector data; switch (d->type) { case WordType: data.append(ByteVector::fromShort(toUShort(), false)); break; case BoolType: if(kind == 0) { data.append(ByteVector::fromUInt(toBool(), false)); } else { data.append(ByteVector::fromShort(toBool(), false)); } break; case DWordType: data.append(ByteVector::fromUInt(toUInt(), false)); break; case QWordType: data.append(ByteVector::fromLongLong(toULongLong(), false)); break; case UnicodeType: data.append(renderString(d->stringValue)); break; case BytesType: if(d->pictureValue.isValid()) { data.append(d->pictureValue.render()); break; } case GuidType: data.append(d->byteVectorValue); break; } if(kind == 0) { data = renderString(name, true) + ByteVector::fromShort(static_cast<int>(d->type), false) + ByteVector::fromShort(data.size(), false) + data; } else { ByteVector nameData = renderString(name); data = ByteVector::fromShort(kind == 2 ? d->language : 0, false) + ByteVector::fromShort(d->stream, false) + ByteVector::fromShort(nameData.size(), false) + ByteVector::fromShort(static_cast<int>(d->type), false) + ByteVector::fromUInt(data.size(), false) + nameData + data; } return data; } int ASF::Attribute::language() const { return d->language; } void ASF::Attribute::setLanguage(int value) { d->language = value; } int ASF::Attribute::stream() const { return d->stream; } void ASF::Attribute::setStream(int value) { d->stream = value; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/asf/asfattribute.h�������������������������������������������������������������0000664�0000000�0000000�00000013613�14447736377�0017752�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ASFATTRIBUTE_H #define TAGLIB_ASFATTRIBUTE_H #include "tstring.h" #include "tbytevector.h" #include "taglib_export.h" #include "asfpicture.h" namespace TagLib { namespace ASF { class File; class Picture; class TAGLIB_EXPORT Attribute { public: /*! * Enum of types an Attribute can have. */ enum AttributeTypes { UnicodeType = 0, BytesType = 1, BoolType = 2, DWordType = 3, QWordType = 4, WordType = 5, GuidType = 6 }; /*! * Constructs an empty attribute. */ Attribute(); /*! * Constructs an attribute with \a key and a UnicodeType \a value. */ Attribute(const String &value); /*! * Constructs an attribute with \a key and a BytesType \a value. */ Attribute(const ByteVector &value); /*! * Constructs an attribute with \a key and a Picture \a value. * * This attribute is compatible with the ID3 frame, APIC. The ID3 specification for the APIC frame stipulates that, * while there may be any number of APIC frames associated with a file, * only one may be of type 1 and only one may be of type 2. * * The specification also states that the description of the picture can be no longer than 64 characters, but can be empty. * WM/Picture attributes added with TagLib::ASF are not automatically validated to conform to ID3 specifications. * You must add code in your application to perform validations if you want to maintain complete compatibility with ID3. */ Attribute(const Picture &value); /*! * Constructs an attribute with \a key and a DWordType \a value. */ Attribute(unsigned int value); /*! * Constructs an attribute with \a key and a QWordType \a value. */ Attribute(unsigned long long value); /*! * Constructs an attribute with \a key and a WordType \a value. */ Attribute(unsigned short value); /*! * Constructs an attribute with \a key and a BoolType \a value. */ Attribute(bool value); /*! * Construct an attribute as a copy of \a other. */ Attribute(const Attribute &item); /*! * Copies the contents of \a other into this item. */ Attribute &operator=(const Attribute &other); /*! * Exchanges the content of the Attribute by the content of \a other. */ void swap(Attribute &other); /*! * Destroys the attribute. */ virtual ~Attribute(); /*! * Returns type of the value. */ AttributeTypes type() const; /*! * Returns the BoolType \a value. */ unsigned short toBool() const; /*! * Returns the WordType \a value. */ unsigned short toUShort() const; /*! * Returns the DWordType \a value. */ unsigned int toUInt() const; /*! * Returns the QWordType \a value. */ unsigned long long toULongLong() const; /*! * Returns the UnicodeType \a value. */ String toString() const; /*! * Returns the BytesType \a value. */ ByteVector toByteVector() const; /*! * Returns the Picture \a value. */ Picture toPicture() const; /*! * Returns the language number, or 0 is no stream number was set. */ int language() const; /*! * Sets the language number. */ void setLanguage(int value); /*! * Returns the stream number, or 0 is no stream number was set. */ int stream() const; /*! * Sets the stream number. */ void setStream(int value); #ifndef DO_NOT_DOCUMENT /* THIS IS PRIVATE, DON'T TOUCH IT! */ String parse(ASF::File &file, int kind = 0); #endif //! Returns the size of the stored data int dataSize() const; private: friend class File; ByteVector render(const String &name, int kind = 0) const; class AttributePrivate; AttributePrivate *d; }; } // namespace ASF } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/asf/asffile.cpp����������������������������������������������������������������0000664�0000000�0000000�00000052666�14447736377�0017234�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tbytevectorlist.h> #include <tpropertymap.h> #include <tstring.h> #include <tagutils.h> #include "asffile.h" #include "asftag.h" #include "asfproperties.h" #include "asfutils.h" using namespace TagLib; class ASF::File::FilePrivate { public: class BaseObject; class UnknownObject; class FilePropertiesObject; class StreamPropertiesObject; class ContentDescriptionObject; class ExtendedContentDescriptionObject; class HeaderExtensionObject; class CodecListObject; class MetadataObject; class MetadataLibraryObject; FilePrivate(): headerSize(0), tag(0), properties(0), contentDescriptionObject(0), extendedContentDescriptionObject(0), headerExtensionObject(0), metadataObject(0), metadataLibraryObject(0) { objects.setAutoDelete(true); } ~FilePrivate() { delete tag; delete properties; } unsigned long long headerSize; ASF::Tag *tag; ASF::Properties *properties; List<BaseObject *> objects; ContentDescriptionObject *contentDescriptionObject; ExtendedContentDescriptionObject *extendedContentDescriptionObject; HeaderExtensionObject *headerExtensionObject; MetadataObject *metadataObject; MetadataLibraryObject *metadataLibraryObject; }; namespace { const ByteVector headerGuid("\x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C", 16); const ByteVector filePropertiesGuid("\xA1\xDC\xAB\x8C\x47\xA9\xCF\x11\x8E\xE4\x00\xC0\x0C\x20\x53\x65", 16); const ByteVector streamPropertiesGuid("\x91\x07\xDC\xB7\xB7\xA9\xCF\x11\x8E\xE6\x00\xC0\x0C\x20\x53\x65", 16); const ByteVector contentDescriptionGuid("\x33\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C", 16); const ByteVector extendedContentDescriptionGuid("\x40\xA4\xD0\xD2\x07\xE3\xD2\x11\x97\xF0\x00\xA0\xC9\x5E\xA8\x50", 16); const ByteVector headerExtensionGuid("\xb5\x03\xbf_.\xa9\xcf\x11\x8e\xe3\x00\xc0\x0c Se", 16); const ByteVector metadataGuid("\xEA\xCB\xF8\xC5\xAF[wH\204g\xAA\214D\xFAL\xCA", 16); const ByteVector metadataLibraryGuid("\224\034#D\230\224\321I\241A\x1d\x13NEpT", 16); const ByteVector codecListGuid("\x40\x52\xd1\x86\x1d\x31\xd0\x11\xa3\xa4\x00\xa0\xc9\x03\x48\xf6", 16); const ByteVector contentEncryptionGuid("\xFB\xB3\x11\x22\x23\xBD\xD2\x11\xB4\xB7\x00\xA0\xC9\x55\xFC\x6E", 16); const ByteVector extendedContentEncryptionGuid("\x14\xE6\x8A\x29\x22\x26 \x17\x4C\xB9\x35\xDA\xE0\x7E\xE9\x28\x9C", 16); const ByteVector advancedContentEncryptionGuid("\xB6\x9B\x07\x7A\xA4\xDA\x12\x4E\xA5\xCA\x91\xD3\x8D\xC1\x1A\x8D", 16); } // namespace class ASF::File::FilePrivate::BaseObject { public: ByteVector data; virtual ~BaseObject() {} virtual ByteVector guid() const = 0; virtual void parse(ASF::File *file, unsigned int size); virtual ByteVector render(ASF::File *file); }; class ASF::File::FilePrivate::UnknownObject : public ASF::File::FilePrivate::BaseObject { ByteVector myGuid; public: UnknownObject(const ByteVector &guid); ByteVector guid() const; }; class ASF::File::FilePrivate::FilePropertiesObject : public ASF::File::FilePrivate::BaseObject { public: ByteVector guid() const; void parse(ASF::File *file, unsigned int size); }; class ASF::File::FilePrivate::StreamPropertiesObject : public ASF::File::FilePrivate::BaseObject { public: ByteVector guid() const; void parse(ASF::File *file, unsigned int size); }; class ASF::File::FilePrivate::ContentDescriptionObject : public ASF::File::FilePrivate::BaseObject { public: ByteVector guid() const; void parse(ASF::File *file, unsigned int size); ByteVector render(ASF::File *file); }; class ASF::File::FilePrivate::ExtendedContentDescriptionObject : public ASF::File::FilePrivate::BaseObject { public: ByteVectorList attributeData; ByteVector guid() const; void parse(ASF::File *file, unsigned int size); ByteVector render(ASF::File *file); }; class ASF::File::FilePrivate::MetadataObject : public ASF::File::FilePrivate::BaseObject { public: ByteVectorList attributeData; ByteVector guid() const; void parse(ASF::File *file, unsigned int size); ByteVector render(ASF::File *file); }; class ASF::File::FilePrivate::MetadataLibraryObject : public ASF::File::FilePrivate::BaseObject { public: ByteVectorList attributeData; ByteVector guid() const; void parse(ASF::File *file, unsigned int size); ByteVector render(ASF::File *file); }; class ASF::File::FilePrivate::HeaderExtensionObject : public ASF::File::FilePrivate::BaseObject { public: List<ASF::File::FilePrivate::BaseObject *> objects; HeaderExtensionObject(); ByteVector guid() const; void parse(ASF::File *file, unsigned int size); ByteVector render(ASF::File *file); }; class ASF::File::FilePrivate::CodecListObject : public ASF::File::FilePrivate::BaseObject { public: ByteVector guid() const; void parse(ASF::File *file, unsigned int size); private: enum CodecType { Video = 0x0001, Audio = 0x0002, Unknown = 0xFFFF }; }; void ASF::File::FilePrivate::BaseObject::parse(ASF::File *file, unsigned int size) { data.clear(); if(size > 24 && size <= static_cast<unsigned int>(file->length())) data = file->readBlock(size - 24); else data = ByteVector(); } ByteVector ASF::File::FilePrivate::BaseObject::render(ASF::File * /*file*/) { return guid() + ByteVector::fromLongLong(data.size() + 24, false) + data; } ASF::File::FilePrivate::UnknownObject::UnknownObject(const ByteVector &guid) : myGuid(guid) { } ByteVector ASF::File::FilePrivate::UnknownObject::guid() const { return myGuid; } ByteVector ASF::File::FilePrivate::FilePropertiesObject::guid() const { return filePropertiesGuid; } void ASF::File::FilePrivate::FilePropertiesObject::parse(ASF::File *file, unsigned int size) { BaseObject::parse(file, size); if(data.size() < 64) { debug("ASF::File::FilePrivate::FilePropertiesObject::parse() -- data is too short."); return; } const long long duration = data.toLongLong(40, false); const long long preroll = data.toLongLong(56, false); file->d->properties->setLengthInMilliseconds(static_cast<int>(duration / 10000.0 - preroll + 0.5)); } ByteVector ASF::File::FilePrivate::StreamPropertiesObject::guid() const { return streamPropertiesGuid; } void ASF::File::FilePrivate::StreamPropertiesObject::parse(ASF::File *file, unsigned int size) { BaseObject::parse(file, size); if(data.size() < 70) { debug("ASF::File::FilePrivate::StreamPropertiesObject::parse() -- data is too short."); return; } file->d->properties->setCodec(data.toUShort(54, false)); file->d->properties->setChannels(data.toUShort(56, false)); file->d->properties->setSampleRate(data.toUInt(58, false)); file->d->properties->setBitrate(static_cast<int>(data.toUInt(62, false) * 8.0 / 1000.0 + 0.5)); file->d->properties->setBitsPerSample(data.toUShort(68, false)); } ByteVector ASF::File::FilePrivate::ContentDescriptionObject::guid() const { return contentDescriptionGuid; } void ASF::File::FilePrivate::ContentDescriptionObject::parse(ASF::File *file, unsigned int /*size*/) { const int titleLength = readWORD(file); const int artistLength = readWORD(file); const int copyrightLength = readWORD(file); const int commentLength = readWORD(file); const int ratingLength = readWORD(file); file->d->tag->setTitle(readString(file,titleLength)); file->d->tag->setArtist(readString(file,artistLength)); file->d->tag->setCopyright(readString(file,copyrightLength)); file->d->tag->setComment(readString(file,commentLength)); file->d->tag->setRating(readString(file,ratingLength)); } ByteVector ASF::File::FilePrivate::ContentDescriptionObject::render(ASF::File *file) { const ByteVector v1 = renderString(file->d->tag->title()); const ByteVector v2 = renderString(file->d->tag->artist()); const ByteVector v3 = renderString(file->d->tag->copyright()); const ByteVector v4 = renderString(file->d->tag->comment()); const ByteVector v5 = renderString(file->d->tag->rating()); data.clear(); data.append(ByteVector::fromShort(v1.size(), false)); data.append(ByteVector::fromShort(v2.size(), false)); data.append(ByteVector::fromShort(v3.size(), false)); data.append(ByteVector::fromShort(v4.size(), false)); data.append(ByteVector::fromShort(v5.size(), false)); data.append(v1); data.append(v2); data.append(v3); data.append(v4); data.append(v5); return BaseObject::render(file); } ByteVector ASF::File::FilePrivate::ExtendedContentDescriptionObject::guid() const { return extendedContentDescriptionGuid; } void ASF::File::FilePrivate::ExtendedContentDescriptionObject::parse(ASF::File *file, unsigned int /*size*/) { int count = readWORD(file); while(count--) { ASF::Attribute attribute; String name = attribute.parse(*file); file->d->tag->addAttribute(name, attribute); } } ByteVector ASF::File::FilePrivate::ExtendedContentDescriptionObject::render(ASF::File *file) { data.clear(); data.append(ByteVector::fromShort(attributeData.size(), false)); data.append(attributeData.toByteVector("")); return BaseObject::render(file); } ByteVector ASF::File::FilePrivate::MetadataObject::guid() const { return metadataGuid; } void ASF::File::FilePrivate::MetadataObject::parse(ASF::File *file, unsigned int /*size*/) { int count = readWORD(file); while(count--) { ASF::Attribute attribute; String name = attribute.parse(*file, 1); file->d->tag->addAttribute(name, attribute); } } ByteVector ASF::File::FilePrivate::MetadataObject::render(ASF::File *file) { data.clear(); data.append(ByteVector::fromShort(attributeData.size(), false)); data.append(attributeData.toByteVector("")); return BaseObject::render(file); } ByteVector ASF::File::FilePrivate::MetadataLibraryObject::guid() const { return metadataLibraryGuid; } void ASF::File::FilePrivate::MetadataLibraryObject::parse(ASF::File *file, unsigned int /*size*/) { int count = readWORD(file); while(count--) { ASF::Attribute attribute; String name = attribute.parse(*file, 2); file->d->tag->addAttribute(name, attribute); } } ByteVector ASF::File::FilePrivate::MetadataLibraryObject::render(ASF::File *file) { data.clear(); data.append(ByteVector::fromShort(attributeData.size(), false)); data.append(attributeData.toByteVector("")); return BaseObject::render(file); } ASF::File::FilePrivate::HeaderExtensionObject::HeaderExtensionObject() { objects.setAutoDelete(true); } ByteVector ASF::File::FilePrivate::HeaderExtensionObject::guid() const { return headerExtensionGuid; } void ASF::File::FilePrivate::HeaderExtensionObject::parse(ASF::File *file, unsigned int /*size*/) { file->seek(18, File::Current); long long dataSize = readDWORD(file); long long dataPos = 0; while(dataPos < dataSize) { ByteVector guid = file->readBlock(16); if(guid.size() != 16) { file->setValid(false); break; } bool ok; long long size = readQWORD(file, &ok); if(!ok || size < 0 || size > dataSize - dataPos) { file->setValid(false); break; } BaseObject *obj; if(guid == metadataGuid) { file->d->metadataObject = new MetadataObject(); obj = file->d->metadataObject; } else if(guid == metadataLibraryGuid) { file->d->metadataLibraryObject = new MetadataLibraryObject(); obj = file->d->metadataLibraryObject; } else { obj = new UnknownObject(guid); } obj->parse(file, static_cast<unsigned int>(size)); objects.append(obj); dataPos += size; } } ByteVector ASF::File::FilePrivate::HeaderExtensionObject::render(ASF::File *file) { data.clear(); for(List<BaseObject *>::ConstIterator it = objects.begin(); it != objects.end(); ++it) { data.append((*it)->render(file)); } data = ByteVector("\x11\xD2\xD3\xAB\xBA\xA9\xcf\x11\x8E\xE6\x00\xC0\x0C\x20\x53\x65\x06\x00", 18) + ByteVector::fromUInt(data.size(), false) + data; return BaseObject::render(file); } ByteVector ASF::File::FilePrivate::CodecListObject::guid() const { return codecListGuid; } void ASF::File::FilePrivate::CodecListObject::parse(ASF::File *file, unsigned int size) { BaseObject::parse(file, size); if(data.size() <= 20) { debug("ASF::File::FilePrivate::CodecListObject::parse() -- data is too short."); return; } unsigned int pos = 16; const int count = data.toUInt(pos, false); pos += 4; for(int i = 0; i < count; ++i) { if(pos >= data.size()) break; const CodecType type = static_cast<CodecType>(data.toUShort(pos, false)); pos += 2; int nameLength = data.toUShort(pos, false); pos += 2; const unsigned int namePos = pos; pos += nameLength * 2; const int descLength = data.toUShort(pos, false); pos += 2; const unsigned int descPos = pos; pos += descLength * 2; const int infoLength = data.toUShort(pos, false); pos += 2 + infoLength * 2; if(type == CodecListObject::Audio) { // First audio codec found. const String name(data.mid(namePos, nameLength * 2), String::UTF16LE); file->d->properties->setCodecName(name.stripWhiteSpace()); const String desc(data.mid(descPos, descLength * 2), String::UTF16LE); file->d->properties->setCodecDescription(desc.stripWhiteSpace()); break; } } } //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool ASF::File::isSupported(IOStream *stream) { // An ASF file has to start with the designated GUID. const ByteVector id = Utils::readHeader(stream, 16, false); return (id == headerGuid); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// ASF::File::File(FileName file, bool, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate()) { if(isOpen()) read(); } ASF::File::File(IOStream *stream, bool, Properties::ReadStyle) : TagLib::File(stream), d(new FilePrivate()) { if(isOpen()) read(); } ASF::File::~File() { delete d; } ASF::Tag *ASF::File::tag() const { return d->tag; } PropertyMap ASF::File::properties() const { return d->tag->properties(); } void ASF::File::removeUnsupportedProperties(const StringList &properties) { d->tag->removeUnsupportedProperties(properties); } PropertyMap ASF::File::setProperties(const PropertyMap &properties) { return d->tag->setProperties(properties); } ASF::Properties *ASF::File::audioProperties() const { return d->properties; } bool ASF::File::save() { if(readOnly()) { debug("ASF::File::save() -- File is read only."); return false; } if(!isValid()) { debug("ASF::File::save() -- Trying to save invalid file."); return false; } if(!d->contentDescriptionObject) { d->contentDescriptionObject = new FilePrivate::ContentDescriptionObject(); d->objects.append(d->contentDescriptionObject); } if(!d->extendedContentDescriptionObject) { d->extendedContentDescriptionObject = new FilePrivate::ExtendedContentDescriptionObject(); d->objects.append(d->extendedContentDescriptionObject); } if(!d->headerExtensionObject) { d->headerExtensionObject = new FilePrivate::HeaderExtensionObject(); d->objects.append(d->headerExtensionObject); } if(!d->metadataObject) { d->metadataObject = new FilePrivate::MetadataObject(); d->headerExtensionObject->objects.append(d->metadataObject); } if(!d->metadataLibraryObject) { d->metadataLibraryObject = new FilePrivate::MetadataLibraryObject(); d->headerExtensionObject->objects.append(d->metadataLibraryObject); } d->extendedContentDescriptionObject->attributeData.clear(); d->metadataObject->attributeData.clear(); d->metadataLibraryObject->attributeData.clear(); const AttributeListMap allAttributes = d->tag->attributeListMap(); for(AttributeListMap::ConstIterator it = allAttributes.begin(); it != allAttributes.end(); ++it) { const String &name = it->first; const AttributeList &attributes = it->second; bool inExtendedContentDescriptionObject = false; bool inMetadataObject = false; for(AttributeList::ConstIterator jt = attributes.begin(); jt != attributes.end(); ++jt) { const Attribute &attribute = *jt; const bool largeValue = (attribute.dataSize() > 65535); const bool guid = (attribute.type() == Attribute::GuidType); if(!inExtendedContentDescriptionObject && !guid && !largeValue && attribute.language() == 0 && attribute.stream() == 0) { d->extendedContentDescriptionObject->attributeData.append(attribute.render(name)); inExtendedContentDescriptionObject = true; } else if(!inMetadataObject && !guid && !largeValue && attribute.language() == 0 && attribute.stream() != 0) { d->metadataObject->attributeData.append(attribute.render(name, 1)); inMetadataObject = true; } else { d->metadataLibraryObject->attributeData.append(attribute.render(name, 2)); } } } ByteVector data; for(List<FilePrivate::BaseObject *>::ConstIterator it = d->objects.begin(); it != d->objects.end(); ++it) { data.append((*it)->render(this)); } seek(16); writeBlock(ByteVector::fromLongLong(data.size() + 30, false)); writeBlock(ByteVector::fromUInt(d->objects.size(), false)); writeBlock(ByteVector("\x01\x02", 2)); insert(data, 30, static_cast<unsigned long>(d->headerSize - 30)); d->headerSize = data.size() + 30; return true; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void ASF::File::read() { if(!isValid()) return; if(readBlock(16) != headerGuid) { debug("ASF::File::read(): Not an ASF file."); setValid(false); return; } d->tag = new ASF::Tag(); d->properties = new ASF::Properties(); bool ok; d->headerSize = readQWORD(this, &ok); if(!ok) { setValid(false); return; } int numObjects = readDWORD(this, &ok); if(!ok) { setValid(false); return; } seek(2, Current); FilePrivate::FilePropertiesObject *filePropertiesObject = 0; FilePrivate::StreamPropertiesObject *streamPropertiesObject = 0; for(int i = 0; i < numObjects; i++) { const ByteVector guid = readBlock(16); if(guid.size() != 16) { setValid(false); break; } long size = static_cast<long>(readQWORD(this, &ok)); if(!ok) { setValid(false); break; } FilePrivate::BaseObject *obj; if(guid == filePropertiesGuid) { filePropertiesObject = new FilePrivate::FilePropertiesObject(); obj = filePropertiesObject; } else if(guid == streamPropertiesGuid) { streamPropertiesObject = new FilePrivate::StreamPropertiesObject(); obj = streamPropertiesObject; } else if(guid == contentDescriptionGuid) { d->contentDescriptionObject = new FilePrivate::ContentDescriptionObject(); obj = d->contentDescriptionObject; } else if(guid == extendedContentDescriptionGuid) { d->extendedContentDescriptionObject = new FilePrivate::ExtendedContentDescriptionObject(); obj = d->extendedContentDescriptionObject; } else if(guid == headerExtensionGuid) { d->headerExtensionObject = new FilePrivate::HeaderExtensionObject(); obj = d->headerExtensionObject; } else if(guid == codecListGuid) { obj = new FilePrivate::CodecListObject(); } else { if(guid == contentEncryptionGuid || guid == extendedContentEncryptionGuid || guid == advancedContentEncryptionGuid) { d->properties->setEncrypted(true); } obj = new FilePrivate::UnknownObject(guid); } obj->parse(this, size); d->objects.append(obj); } if(!filePropertiesObject || !streamPropertiesObject) { debug("ASF::File::read(): Missing mandatory header objects."); setValid(false); return; } } ��������������������������������������������������������������������������taglib-1.13.1/taglib/asf/asffile.h������������������������������������������������������������������0000664�0000000�0000000�00000011433�14447736377�0016664�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ASFFILE_H #define TAGLIB_ASFFILE_H #include "tag.h" #include "tfile.h" #include "taglib_export.h" #include "asfproperties.h" #include "asftag.h" namespace TagLib { //! An implementation of ASF (WMA) metadata namespace ASF { /*! * This implements and provides an interface for ASF files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to ASF files. */ class TAGLIB_EXPORT File : public TagLib::File { public: /*! * Constructs an ASF file from \a file. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an ASF file from \a stream. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns a pointer to the ASF tag of the file. * * ASF::Tag implements the tag interface, so this serves as the * reimplementation of TagLib::File::tag(). * * \note The Tag <b>is still</b> owned by the ASF::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. */ virtual Tag *tag() const; /*! * Implements the unified property interface -- export function. */ PropertyMap properties() const; /*! * Removes unsupported properties. Forwards to the actual Tag's * removeUnsupportedProperties() function. */ void removeUnsupportedProperties(const StringList &properties); /*! * Implements the unified property interface -- import function. */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the ASF audio properties for this file. */ virtual Properties *audioProperties() const; /*! * Save the file. * * This returns true if the save was successful. */ virtual bool save(); /*! * Returns whether or not the given \a stream can be opened as an ASF * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: void read(); class FilePrivate; FilePrivate *d; }; } // namespace ASF } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/asf/asfpicture.cpp�������������������������������������������������������������0000664�0000000�0000000�00000010726�14447736377�0017757�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2010 by Anton Sergunov email : setosha@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <taglib.h> #include <tdebug.h> #include <trefcounter.h> #include "asfattribute.h" #include "asffile.h" #include "asfpicture.h" #include "asfutils.h" using namespace TagLib; class ASF::Picture::PicturePrivate : public RefCounter { public: bool valid; Type type; String mimeType; String description; ByteVector picture; }; //////////////////////////////////////////////////////////////////////////////// // Picture class members //////////////////////////////////////////////////////////////////////////////// ASF::Picture::Picture() : d(new PicturePrivate()) { d->valid = true; } ASF::Picture::Picture(const Picture& other) : d(other.d) { d->ref(); } ASF::Picture::~Picture() { if(d->deref()) delete d; } bool ASF::Picture::isValid() const { return d->valid; } String ASF::Picture::mimeType() const { return d->mimeType; } void ASF::Picture::setMimeType(const String &value) { d->mimeType = value; } ASF::Picture::Type ASF::Picture::type() const { return d->type; } void ASF::Picture::setType(const ASF::Picture::Type& t) { d->type = t; } String ASF::Picture::description() const { return d->description; } void ASF::Picture::setDescription(const String &desc) { d->description = desc; } ByteVector ASF::Picture::picture() const { return d->picture; } void ASF::Picture::setPicture(const ByteVector &p) { d->picture = p; } int ASF::Picture::dataSize() const { return 9 + (d->mimeType.length() + d->description.length()) * 2 + d->picture.size(); } ASF::Picture& ASF::Picture::operator=(const ASF::Picture& other) { Picture(other).swap(*this); return *this; } void ASF::Picture::swap(Picture &other) { using std::swap; swap(d, other.d); } ByteVector ASF::Picture::render() const { if(!isValid()) return ByteVector(); return ByteVector(static_cast<char>(d->type)) + ByteVector::fromUInt(d->picture.size(), false) + renderString(d->mimeType) + renderString(d->description) + d->picture; } void ASF::Picture::parse(const ByteVector& bytes) { d->valid = false; if(bytes.size() < 9) return; int pos = 0; d->type = static_cast<Type>(bytes[0]); ++pos; const unsigned int dataLen = bytes.toUInt(pos, false); pos+=4; const ByteVector nullStringTerminator(2, 0); int endPos = bytes.find(nullStringTerminator, pos, 2); if(endPos < 0) return; d->mimeType = String(bytes.mid(pos, endPos - pos), String::UTF16LE); pos = endPos+2; endPos = bytes.find(nullStringTerminator, pos, 2); if(endPos < 0) return; d->description = String(bytes.mid(pos, endPos - pos), String::UTF16LE); pos = endPos+2; if(dataLen + pos != bytes.size()) return; d->picture = bytes.mid(pos, dataLen); d->valid = true; } ASF::Picture ASF::Picture::fromInvalid() { Picture ret; ret.d->valid = false; return ret; } ������������������������������������������taglib-1.13.1/taglib/asf/asfpicture.h���������������������������������������������������������������0000664�0000000�0000000�00000015764�14447736377�0017433�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2010 by Anton Sergunov email : setosha@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef ASFPICTURE_H #define ASFPICTURE_H #include "tstring.h" #include "tbytevector.h" #include "taglib_export.h" #include "attachedpictureframe.h" namespace TagLib { namespace ASF { //! An ASF attached picture interface implementation /*! * This is an implementation of ASF attached pictures interface. Pictures may be * included in attributes, one per WM/Picture attribute (but there may be multiple WM/Picture * attribute in a single tag). These pictures are usually in either JPEG or * PNG format. * \see Attribute::toPicture() * \see Attribute::Attribute(const Picture& picture) */ class TAGLIB_EXPORT Picture { public: /*! * This describes the function or content of the picture. */ enum Type { //! A type not enumerated below Other = 0x00, //! 32x32 PNG image that should be used as the file icon FileIcon = 0x01, //! File icon of a different size or format OtherFileIcon = 0x02, //! Front cover image of the album FrontCover = 0x03, //! Back cover image of the album BackCover = 0x04, //! Inside leaflet page of the album LeafletPage = 0x05, //! Image from the album itself Media = 0x06, //! Picture of the lead artist or soloist LeadArtist = 0x07, //! Picture of the artist or performer Artist = 0x08, //! Picture of the conductor Conductor = 0x09, //! Picture of the band or orchestra Band = 0x0A, //! Picture of the composer Composer = 0x0B, //! Picture of the lyricist or text writer Lyricist = 0x0C, //! Picture of the recording location or studio RecordingLocation = 0x0D, //! Picture of the artists during recording DuringRecording = 0x0E, //! Picture of the artists during performance DuringPerformance = 0x0F, //! Picture from a movie or video related to the track MovieScreenCapture = 0x10, //! Picture of a large, coloured fish ColouredFish = 0x11, //! Illustration related to the track Illustration = 0x12, //! Logo of the band or performer BandLogo = 0x13, //! Logo of the publisher (record company) PublisherLogo = 0x14 }; /*! * Constructs an empty picture. */ Picture(); /*! * Construct an picture as a copy of \a other. */ Picture(const Picture& other); /*! * Destroys the picture. */ virtual ~Picture(); /*! * Copies the contents of \a other into this picture. */ Picture& operator=(const Picture& other); /*! * Exchanges the content of the Picture by the content of \a other. */ void swap(Picture &other); /*! * Returns true if Picture stores valid picture */ bool isValid() const; /*! * Returns the mime type of the image. This should in most cases be * "image/png" or "image/jpeg". * \see setMimeType(const String &) * \see picture() * \see setPicture(const ByteArray&) */ String mimeType() const; /*! * Sets the mime type of the image. This should in most cases be * "image/png" or "image/jpeg". * \see setMimeType(const String &) * \see picture() * \see setPicture(const ByteArray&) */ void setMimeType(const String &value); /*! * Returns the type of the image. * * \see Type * \see setType() */ Type type() const; /*! * Sets the type for the image. * * \see Type * \see type() */ void setType(const ASF::Picture::Type& t); /*! * Returns a text description of the image. * * \see setDescription() */ String description() const; /*! * Sets a textual description of the image to \a desc. * * \see description() */ void setDescription(const String &desc); /*! * Returns the image data as a ByteVector. * * \note ByteVector has a data() method that returns a const char * which * should make it easy to export this data to external programs. * * \see setPicture() * \see mimeType() */ ByteVector picture() const; /*! * Sets the image data to \a p. \a p should be of the type specified in * this frame's mime-type specification. * * \see picture() * \see mimeType() * \see setMimeType() */ void setPicture(const ByteVector &p); /*! * Returns picture as binary raw data \a value */ ByteVector render() const; /*! * Returns picture as binary raw data \a value */ int dataSize() const; #ifndef DO_NOT_DOCUMENT /* THIS IS PRIVATE, DON'T TOUCH IT! */ void parse(const ByteVector& ); static Picture fromInvalid(); #endif private: class PicturePrivate; PicturePrivate *d; }; } // namespace ASF } // namespace TagLib #endif // ASFPICTURE_H ������������taglib-1.13.1/taglib/asf/asfproperties.cpp����������������������������������������������������������0000664�0000000�0000000�00000011047�14447736377�0020475�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tstring.h> #include "asfproperties.h" using namespace TagLib; class ASF::Properties::PropertiesPrivate { public: PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), channels(0), bitsPerSample(0), codec(ASF::Properties::Unknown), encrypted(false) {} int length; int bitrate; int sampleRate; int channels; int bitsPerSample; ASF::Properties::Codec codec; String codecName; String codecDescription; bool encrypted; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// ASF::Properties::Properties() : AudioProperties(AudioProperties::Average), d(new PropertiesPrivate()) { } ASF::Properties::~Properties() { delete d; } int ASF::Properties::length() const { return lengthInSeconds(); } int ASF::Properties::lengthInSeconds() const { return d->length / 1000; } int ASF::Properties::lengthInMilliseconds() const { return d->length; } int ASF::Properties::bitrate() const { return d->bitrate; } int ASF::Properties::sampleRate() const { return d->sampleRate; } int ASF::Properties::channels() const { return d->channels; } int ASF::Properties::bitsPerSample() const { return d->bitsPerSample; } ASF::Properties::Codec ASF::Properties::codec() const { return d->codec; } String ASF::Properties::codecName() const { return d->codecName; } String ASF::Properties::codecDescription() const { return d->codecDescription; } bool ASF::Properties::isEncrypted() const { return d->encrypted; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void ASF::Properties::setLength(int /*length*/) { debug("ASF::Properties::setLength() -- This method is deprecated. Do not use."); } void ASF::Properties::setLengthInMilliseconds(int value) { d->length = value; } void ASF::Properties::setBitrate(int value) { d->bitrate = value; } void ASF::Properties::setSampleRate(int value) { d->sampleRate = value; } void ASF::Properties::setChannels(int value) { d->channels = value; } void ASF::Properties::setBitsPerSample(int value) { d->bitsPerSample = value; } void ASF::Properties::setCodec(int value) { switch(value) { case 0x0160: d->codec = WMA1; break; case 0x0161: d->codec = WMA2; break; case 0x0162: d->codec = WMA9Pro; break; case 0x0163: d->codec = WMA9Lossless; break; default: d->codec = Unknown; break; } } void ASF::Properties::setCodecName(const String &value) { d->codecName = value; } void ASF::Properties::setCodecDescription(const String &value) { d->codecDescription = value; } void ASF::Properties::setEncrypted(bool value) { d->encrypted = value; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/asf/asfproperties.h������������������������������������������������������������0000664�0000000�0000000�00000012340�14447736377�0020137�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ASFPROPERTIES_H #define TAGLIB_ASFPROPERTIES_H #include "audioproperties.h" #include "tstring.h" #include "taglib_export.h" namespace TagLib { namespace ASF { //! An implementation of ASF audio properties class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Audio codec types can be used in ASF file. */ enum Codec { /*! * Couldn't detect the codec. */ Unknown = 0, /*! * Windows Media Audio 1 */ WMA1, /*! * Windows Media Audio 2 or above */ WMA2, /*! * Windows Media Audio 9 Professional */ WMA9Pro, /*! * Windows Media Audio 9 Lossless */ WMA9Lossless, }; /*! * Creates an instance of ASF::Properties. */ Properties(); /*! * Destroys this ASF::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the number of bits per audio sample. */ int bitsPerSample() const; /*! * Returns the codec used in the file. * * \see codecName() * \see codecDescription() */ Codec codec() const; /*! * Returns the concrete codec name, for example "Windows Media Audio 9.1" * used in the file if available, otherwise an empty string. * * \see codec() * \see codecDescription() */ String codecName() const; /*! * Returns the codec description, typically contains the encoder settings, * for example "VBR Quality 50, 44kHz, stereo 1-pass VBR" if available, * otherwise an empty string. * * \see codec() * \see codecName() */ String codecDescription() const; /*! * Returns whether or not the file is encrypted. */ bool isEncrypted() const; #ifndef DO_NOT_DOCUMENT // deprecated void setLength(int value); void setLengthInMilliseconds(int value); void setBitrate(int value); void setSampleRate(int value); void setChannels(int value); void setBitsPerSample(int value); void setCodec(int value); void setCodecName(const String &value); void setCodecDescription(const String &value); void setEncrypted(bool value); #endif private: class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace ASF } // namespace TagLib #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/asf/asftag.cpp�����������������������������������������������������������������0000664�0000000�0000000�00000025161�14447736377�0017056�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tpropertymap.h> #include "asftag.h" using namespace TagLib; class ASF::Tag::TagPrivate { public: String title; String artist; String copyright; String comment; String rating; AttributeListMap attributeListMap; }; ASF::Tag::Tag() : d(new TagPrivate()) { } ASF::Tag::~Tag() { delete d; } String ASF::Tag::title() const { return d->title; } String ASF::Tag::artist() const { return d->artist; } String ASF::Tag::album() const { if(d->attributeListMap.contains("WM/AlbumTitle")) return d->attributeListMap["WM/AlbumTitle"][0].toString(); return String(); } String ASF::Tag::copyright() const { return d->copyright; } String ASF::Tag::comment() const { return d->comment; } String ASF::Tag::rating() const { return d->rating; } unsigned int ASF::Tag::year() const { if(d->attributeListMap.contains("WM/Year")) return d->attributeListMap["WM/Year"][0].toString().toInt(); return 0; } unsigned int ASF::Tag::track() const { if(d->attributeListMap.contains("WM/TrackNumber")) { const ASF::Attribute attr = d->attributeListMap["WM/TrackNumber"][0]; if(attr.type() == ASF::Attribute::DWordType) return attr.toUInt(); return attr.toString().toInt(); } if(d->attributeListMap.contains("WM/Track")) return d->attributeListMap["WM/Track"][0].toUInt(); return 0; } String ASF::Tag::genre() const { if(d->attributeListMap.contains("WM/Genre")) return d->attributeListMap["WM/Genre"][0].toString(); return String(); } void ASF::Tag::setTitle(const String &value) { d->title = value; } void ASF::Tag::setArtist(const String &value) { d->artist = value; } void ASF::Tag::setCopyright(const String &value) { d->copyright = value; } void ASF::Tag::setComment(const String &value) { d->comment = value; } void ASF::Tag::setRating(const String &value) { d->rating = value; } void ASF::Tag::setAlbum(const String &value) { setAttribute("WM/AlbumTitle", value); } void ASF::Tag::setGenre(const String &value) { setAttribute("WM/Genre", value); } void ASF::Tag::setYear(unsigned int value) { setAttribute("WM/Year", String::number(value)); } void ASF::Tag::setTrack(unsigned int value) { setAttribute("WM/TrackNumber", String::number(value)); } ASF::AttributeListMap& ASF::Tag::attributeListMap() { return d->attributeListMap; } const ASF::AttributeListMap &ASF::Tag::attributeListMap() const { return d->attributeListMap; } bool ASF::Tag::contains(const String &key) const { return d->attributeListMap.contains(key); } void ASF::Tag::removeItem(const String &key) { d->attributeListMap.erase(key); } ASF::AttributeList ASF::Tag::attribute(const String &name) const { return d->attributeListMap[name]; } void ASF::Tag::setAttribute(const String &name, const Attribute &attribute) { AttributeList value; value.append(attribute); d->attributeListMap.insert(name, value); } void ASF::Tag::setAttribute(const String &name, const AttributeList &values) { d->attributeListMap.insert(name, values); } void ASF::Tag::addAttribute(const String &name, const Attribute &attribute) { if(d->attributeListMap.contains(name)) { d->attributeListMap[name].append(attribute); } else { setAttribute(name, attribute); } } bool ASF::Tag::isEmpty() const { return TagLib::Tag::isEmpty() && copyright().isEmpty() && rating().isEmpty() && d->attributeListMap.isEmpty(); } namespace { const std::pair<const char *, const char *> keyTranslation[] = { std::make_pair("WM/AlbumTitle", "ALBUM"), std::make_pair("WM/AlbumArtist", "ALBUMARTIST"), std::make_pair("WM/Composer", "COMPOSER"), std::make_pair("WM/Writer", "LYRICIST"), std::make_pair("WM/Conductor", "CONDUCTOR"), std::make_pair("WM/ModifiedBy", "REMIXER"), std::make_pair("WM/Year", "DATE"), std::make_pair("WM/OriginalReleaseYear", "ORIGINALDATE"), std::make_pair("WM/Producer", "PRODUCER"), std::make_pair("WM/ContentGroupDescription", "WORK"), std::make_pair("WM/SubTitle", "SUBTITLE"), std::make_pair("WM/SetSubTitle", "DISCSUBTITLE"), std::make_pair("WM/TrackNumber", "TRACKNUMBER"), std::make_pair("WM/PartOfSet", "DISCNUMBER"), std::make_pair("WM/Genre", "GENRE"), std::make_pair("WM/BeatsPerMinute", "BPM"), std::make_pair("WM/Mood", "MOOD"), std::make_pair("WM/ISRC", "ISRC"), std::make_pair("WM/Lyrics", "LYRICS"), std::make_pair("WM/Media", "MEDIA"), std::make_pair("WM/Publisher", "LABEL"), std::make_pair("WM/CatalogNo", "CATALOGNUMBER"), std::make_pair("WM/Barcode", "BARCODE"), std::make_pair("WM/EncodedBy", "ENCODEDBY"), std::make_pair("WM/AlbumSortOrder", "ALBUMSORT"), std::make_pair("WM/AlbumArtistSortOrder", "ALBUMARTISTSORT"), std::make_pair("WM/ArtistSortOrder", "ARTISTSORT"), std::make_pair("WM/TitleSortOrder", "TITLESORT"), std::make_pair("WM/Script", "SCRIPT"), std::make_pair("WM/Language", "LANGUAGE"), std::make_pair("WM/ARTISTS", "ARTISTS"), std::make_pair("ASIN", "ASIN"), std::make_pair("MusicBrainz/Track Id", "MUSICBRAINZ_TRACKID"), std::make_pair("MusicBrainz/Artist Id", "MUSICBRAINZ_ARTISTID"), std::make_pair("MusicBrainz/Album Id", "MUSICBRAINZ_ALBUMID"), std::make_pair("MusicBrainz/Album Artist Id", "MUSICBRAINZ_ALBUMARTISTID"), std::make_pair("MusicBrainz/Album Release Country", "RELEASECOUNTRY"), std::make_pair("MusicBrainz/Album Status", "RELEASESTATUS"), std::make_pair("MusicBrainz/Album Type", "RELEASETYPE"), std::make_pair("MusicBrainz/Release Group Id", "MUSICBRAINZ_RELEASEGROUPID"), std::make_pair("MusicBrainz/Release Track Id", "MUSICBRAINZ_RELEASETRACKID"), std::make_pair("MusicBrainz/Work Id", "MUSICBRAINZ_WORKID"), std::make_pair("MusicIP/PUID", "MUSICIP_PUID"), std::make_pair("Acoustid/Id", "ACOUSTID_ID"), std::make_pair("Acoustid/Fingerprint", "ACOUSTID_FINGERPRINT"), }; const size_t keyTranslationSize = sizeof(keyTranslation) / sizeof(keyTranslation[0]); String translateKey(const String &key) { for(size_t i = 0; i < keyTranslationSize; ++i) { if(key == keyTranslation[i].first) return keyTranslation[i].second; } return String(); } } // namespace PropertyMap ASF::Tag::properties() const { PropertyMap props; if(!d->title.isEmpty()) { props["TITLE"] = d->title; } if(!d->artist.isEmpty()) { props["ARTIST"] = d->artist; } if(!d->copyright.isEmpty()) { props["COPYRIGHT"] = d->copyright; } if(!d->comment.isEmpty()) { props["COMMENT"] = d->comment; } ASF::AttributeListMap::ConstIterator it = d->attributeListMap.begin(); for(; it != d->attributeListMap.end(); ++it) { const String key = translateKey(it->first); if(!key.isEmpty()) { AttributeList::ConstIterator it2 = it->second.begin(); for(; it2 != it->second.end(); ++it2) { if(key == "TRACKNUMBER") { if(it2->type() == ASF::Attribute::DWordType) props.insert(key, String::number(it2->toUInt())); else props.insert(key, it2->toString()); } else { props.insert(key, it2->toString()); } } } else { props.unsupportedData().append(it->first); } } return props; } void ASF::Tag::removeUnsupportedProperties(const StringList &props) { StringList::ConstIterator it = props.begin(); for(; it != props.end(); ++it) d->attributeListMap.erase(*it); } PropertyMap ASF::Tag::setProperties(const PropertyMap &props) { static Map<String, String> reverseKeyMap; if(reverseKeyMap.isEmpty()) { for(size_t i = 0; i < keyTranslationSize; i++) { reverseKeyMap[keyTranslation[i].second] = keyTranslation[i].first; } } PropertyMap origProps = properties(); PropertyMap::ConstIterator it = origProps.begin(); for(; it != origProps.end(); ++it) { if(!props.contains(it->first) || props[it->first].isEmpty()) { if(it->first == "TITLE") { d->title.clear(); } else if(it->first == "ARTIST") { d->artist.clear(); } else if(it->first == "COMMENT") { d->comment.clear(); } else if(it->first == "COPYRIGHT") { d->copyright.clear(); } else { d->attributeListMap.erase(reverseKeyMap[it->first]); } } } PropertyMap ignoredProps; it = props.begin(); for(; it != props.end(); ++it) { if(reverseKeyMap.contains(it->first)) { String name = reverseKeyMap[it->first]; removeItem(name); StringList::ConstIterator it2 = it->second.begin(); for(; it2 != it->second.end(); ++it2) { addAttribute(name, *it2); } } else if(it->first == "TITLE") { d->title = it->second.toString(); } else if(it->first == "ARTIST") { d->artist = it->second.toString(); } else if(it->first == "COMMENT") { d->comment = it->second.toString(); } else if(it->first == "COPYRIGHT") { d->copyright = it->second.toString(); } else { ignoredProps.insert(it->first, it->second); } } return ignoredProps; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/asf/asftag.h�������������������������������������������������������������������0000664�0000000�0000000�00000014427�14447736377�0016526�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2005-2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ASFTAG_H #define TAGLIB_ASFTAG_H #include "tag.h" #include "tlist.h" #include "tmap.h" #include "taglib_export.h" #include "asfattribute.h" namespace TagLib { namespace ASF { typedef List<Attribute> AttributeList; typedef Map<String, AttributeList> AttributeListMap; class TAGLIB_EXPORT Tag : public TagLib::Tag { friend class File; public: Tag(); virtual ~Tag(); /*! * Returns the track name. */ virtual String title() const; /*! * Returns the artist name. */ virtual String artist() const; /*! * Returns the album name; if no album name is present in the tag * String::null will be returned. */ virtual String album() const; /*! * Returns the track comment. */ virtual String comment() const; /*! * Returns the genre name; if no genre is present in the tag String::null * will be returned. */ virtual String genre() const; /*! * Returns the rating. */ virtual String rating() const; /*! * Returns the genre name; if no genre is present in the tag String::null * will be returned. */ virtual String copyright() const; /*! * Returns the year; if there is no year set, this will return 0. */ virtual unsigned int year() const; /*! * Returns the track number; if there is no track number set, this will * return 0. */ virtual unsigned int track() const; /*! * Sets the title to \a s. */ virtual void setTitle(const String &s); /*! * Sets the artist to \a s. */ virtual void setArtist(const String &s); /*! * Sets the album to \a s. If \a s is String::null then this value will be * cleared. */ virtual void setAlbum(const String &s); /*! * Sets the comment to \a s. */ virtual void setComment(const String &s); /*! * Sets the rating to \a s. */ virtual void setRating(const String &s); /*! * Sets the copyright to \a s. */ virtual void setCopyright(const String &s); /*! * Sets the genre to \a s. */ virtual void setGenre(const String &s); /*! * Sets the year to \a i. If \a s is 0 then this value will be cleared. */ virtual void setYear(unsigned int i); /*! * Sets the track to \a i. If \a s is 0 then this value will be cleared. */ virtual void setTrack(unsigned int i); /*! * Returns true if the tag does not contain any data. This should be * reimplemented in subclasses that provide more than the basic tagging * abilities in this class. */ virtual bool isEmpty() const; /*! * \deprecated Use attributeListMap() const, contains(), removeItem(), * attribute(), setAttribute(), addAttribute(). */ AttributeListMap &attributeListMap(); /*! * Returns a reference to the item list map. This is an AttributeListMap of * all of the items in the tag. */ // BIC: return by value const AttributeListMap &attributeListMap() const; /*! * \return True if a value for \a attribute is currently set. */ bool contains(const String &name) const; /*! * Removes the \a key attribute from the tag */ void removeItem(const String &name); /*! * \return The list of values for the key \a name, or an empty list if no * values have been set. */ AttributeList attribute(const String &name) const; /*! * Sets the \a key attribute to the value of \a attribute. If an attribute * with the \a key is already present, it will be replaced. */ void setAttribute(const String &name, const Attribute &attribute); /*! * Sets multiple \a values to the key \a name. */ void setAttribute(const String &name, const AttributeList &values); /*! * Sets the \a key attribute to the value of \a attribute. If an attribute * with the \a key is already present, it will be added to the list. */ void addAttribute(const String &name, const Attribute &attribute); PropertyMap properties() const; void removeUnsupportedProperties(const StringList& properties); PropertyMap setProperties(const PropertyMap &properties); private: class TagPrivate; TagPrivate *d; }; } // namespace ASF } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/asf/asfutils.h�����������������������������������������������������������������0000664�0000000�0000000�00000007036�14447736377�0017111�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ASFUTILS_H #define TAGLIB_ASFUTILS_H // THIS FILE IS NOT A PART OF THE TAGLIB API #ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header namespace TagLib { namespace ASF { namespace { inline unsigned short readWORD(File *file, bool *ok = 0) { const ByteVector v = file->readBlock(2); if(v.size() != 2) { if(ok) *ok = false; return 0; } if(ok) *ok = true; return v.toUShort(false); } inline unsigned int readDWORD(File *file, bool *ok = 0) { const ByteVector v = file->readBlock(4); if(v.size() != 4) { if(ok) *ok = false; return 0; } if(ok) *ok = true; return v.toUInt(false); } inline long long readQWORD(File *file, bool *ok = 0) { const ByteVector v = file->readBlock(8); if(v.size() != 8) { if(ok) *ok = false; return 0; } if(ok) *ok = true; return v.toLongLong(false); } inline String readString(File *file, int length) { ByteVector data = file->readBlock(length); unsigned int size = data.size(); while (size >= 2) { if(data[size - 1] != '\0' || data[size - 2] != '\0') { break; } size -= 2; } if(size != data.size()) { data.resize(size); } return String(data, String::UTF16LE); } inline ByteVector renderString(const String &str, bool includeLength = false) { ByteVector data = str.data(String::UTF16LE) + ByteVector::fromShort(0, false); if(includeLength) { data = ByteVector::fromShort(data.size(), false) + data; } return data; } } // namespace } // namespace ASF } // namespace TagLib #endif #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/audioproperties.cpp������������������������������������������������������������0000664�0000000�0000000�00000012232�14447736377�0020251�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include "aiffproperties.h" #include "apeproperties.h" #include "asfproperties.h" #include "flacproperties.h" #include "mp4properties.h" #include "mpcproperties.h" #include "mpegproperties.h" #include "opusproperties.h" #include "speexproperties.h" #include "trueaudioproperties.h" #include "vorbisproperties.h" #include "wavproperties.h" #include "wavpackproperties.h" #include "audioproperties.h" using namespace TagLib; // This macro is a workaround for the fact that we can't add virtual functions. // Should be true virtual functions in taglib2. #define VIRTUAL_FUNCTION_WORKAROUND(function_name, default_value) \ if(dynamic_cast<const APE::Properties*>(this)) \ return dynamic_cast<const APE::Properties*>(this)->function_name(); \ if(dynamic_cast<const ASF::Properties*>(this)) \ return dynamic_cast<const ASF::Properties*>(this)->function_name(); \ if(dynamic_cast<const FLAC::Properties*>(this)) \ return dynamic_cast<const FLAC::Properties*>(this)->function_name(); \ if(dynamic_cast<const MP4::Properties*>(this)) \ return dynamic_cast<const MP4::Properties*>(this)->function_name(); \ if(dynamic_cast<const MPC::Properties*>(this)) \ return dynamic_cast<const MPC::Properties*>(this)->function_name(); \ if(dynamic_cast<const MPEG::Properties*>(this)) \ return dynamic_cast<const MPEG::Properties*>(this)->function_name(); \ if(dynamic_cast<const Ogg::Opus::Properties*>(this)) \ return dynamic_cast<const Ogg::Opus::Properties*>(this)->function_name(); \ if(dynamic_cast<const Ogg::Speex::Properties*>(this)) \ return dynamic_cast<const Ogg::Speex::Properties*>(this)->function_name(); \ if(dynamic_cast<const TrueAudio::Properties*>(this)) \ return dynamic_cast<const TrueAudio::Properties*>(this)->function_name(); \ if(dynamic_cast<const RIFF::AIFF::Properties*>(this)) \ return dynamic_cast<const RIFF::AIFF::Properties*>(this)->function_name(); \ if(dynamic_cast<const RIFF::WAV::Properties*>(this)) \ return dynamic_cast<const RIFF::WAV::Properties*>(this)->function_name(); \ if(dynamic_cast<const Vorbis::Properties*>(this)) \ return dynamic_cast<const Vorbis::Properties*>(this)->function_name(); \ if(dynamic_cast<const WavPack::Properties*>(this)) \ return dynamic_cast<const WavPack::Properties*>(this)->function_name(); \ return (default_value); class AudioProperties::AudioPropertiesPrivate { }; //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// AudioProperties::~AudioProperties() { } int AudioProperties::lengthInSeconds() const { VIRTUAL_FUNCTION_WORKAROUND(lengthInSeconds, 0) } int AudioProperties::lengthInMilliseconds() const { VIRTUAL_FUNCTION_WORKAROUND(lengthInMilliseconds, 0) } //////////////////////////////////////////////////////////////////////////////// // protected methods //////////////////////////////////////////////////////////////////////////////// AudioProperties::AudioProperties(ReadStyle) : d(0) { } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/audioproperties.h��������������������������������������������������������������0000664�0000000�0000000�00000010617�14447736377�0017723�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_AUDIOPROPERTIES_H #define TAGLIB_AUDIOPROPERTIES_H #include "taglib_export.h" namespace TagLib { //! A simple, abstract interface to common audio properties /*! * The values here are common to most audio formats. For more specific, codec * dependent values, please see see the subclasses APIs. This is meant to * compliment the TagLib::File and TagLib::Tag APIs in providing a simple * interface that is sufficient for most applications. */ class TAGLIB_EXPORT AudioProperties { public: /*! * Reading audio properties from a file can sometimes be very time consuming * and for the most accurate results can often involve reading the entire * file. Because in many situations speed is critical or the accuracy of the * values is not particularly important this allows the level of desired * accuracy to be set. */ enum ReadStyle { //! Read as little of the file as possible Fast, //! Read more of the file and make better values guesses Average, //! Read as much of the file as needed to report accurate values Accurate }; /*! * Destroys this AudioProperties instance. */ virtual ~AudioProperties(); /*! * Returns the length of the file in seconds. */ virtual int length() const = 0; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the most appropriate bit rate for the file in kb/s. For constant * bitrate formats this is simply the bitrate of the file. For variable * bitrate formats this is either the average or nominal bitrate. */ virtual int bitrate() const = 0; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const = 0; /*! * Returns the number of audio channels. */ virtual int channels() const = 0; protected: /*! * Construct an audio properties instance. This is protected as this class * should not be instantiated directly, but should be instantiated via its * subclasses and can be fetched from the FileRef or File APIs. * * \see ReadStyle */ AudioProperties(ReadStyle style); private: AudioProperties(const AudioProperties &); AudioProperties &operator=(const AudioProperties &); class AudioPropertiesPrivate; AudioPropertiesPrivate *d; }; } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/fileref.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000041703�14447736377�0016454�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org copyright : (C) 2010 by Alex Novichkov email : novichko@atnet.ru (added APE file support) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <cstring> #include <tfile.h> #include <tfilestream.h> #include <tstring.h> #include <tdebug.h> #include <trefcounter.h> #include "fileref.h" #include "asffile.h" #include "mpegfile.h" #include "vorbisfile.h" #include "flacfile.h" #include "oggflacfile.h" #include "mpcfile.h" #include "mp4file.h" #include "wavpackfile.h" #include "speexfile.h" #include "opusfile.h" #include "trueaudiofile.h" #include "aifffile.h" #include "wavfile.h" #include "apefile.h" #include "modfile.h" #include "s3mfile.h" #include "itfile.h" #include "xmfile.h" using namespace TagLib; namespace { typedef List<const FileRef::FileTypeResolver *> ResolverList; ResolverList fileTypeResolvers; // Detect the file type by user-defined resolvers. File *detectByResolvers(FileName fileName, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) { #ifdef _WIN32 if(::strlen(fileName) == 0 && ::wcslen(fileName) == 0) return 0; #else if(::strlen(fileName) == 0) return 0; #endif ResolverList::ConstIterator it = fileTypeResolvers.begin(); for(; it != fileTypeResolvers.end(); ++it) { File *file = (*it)->createFile(fileName, readAudioProperties, audioPropertiesStyle); if(file) return file; } return 0; } File *detectByResolvers(IOStream* stream, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) { for(ResolverList::ConstIterator it = fileTypeResolvers.begin(); it != fileTypeResolvers.end(); ++it) { if(const FileRef::StreamTypeResolver *streamResolver = dynamic_cast<const FileRef::StreamTypeResolver*>(*it)) { if(File *file = streamResolver->createFileFromStream( stream, readAudioProperties, audioPropertiesStyle)) return file; } } return 0; } // Detect the file type based on the file extension. File* detectByExtension(IOStream *stream, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) { #ifdef _WIN32 const String s = stream->name().toString(); #else const String s(stream->name()); #endif String ext; const int pos = s.rfind("."); if(pos != -1) ext = s.substr(pos + 1).upper(); // If this list is updated, the method defaultFileExtensions() should also be // updated. However at some point that list should be created at the same time // that a default file type resolver is created. if(ext.isEmpty()) return 0; // .oga can be any audio in the Ogg container. So leave it to content-based detection. File *file = 0; if(ext == "MP3") file = new MPEG::File(stream, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); else if(ext == "OGG") file = new Ogg::Vorbis::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "FLAC") file = new FLAC::File(stream, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); else if(ext == "MPC") file = new MPC::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "WV") file = new WavPack::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "SPX") file = new Ogg::Speex::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "OPUS") file = new Ogg::Opus::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "TTA") file = new TrueAudio::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "M4A" || ext == "M4R" || ext == "M4B" || ext == "M4P" || ext == "MP4" || ext == "3G2" || ext == "M4V") file = new MP4::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "WMA" || ext == "ASF") file = new ASF::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "AIF" || ext == "AIFF" || ext == "AFC" || ext == "AIFC") file = new RIFF::AIFF::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "WAV") file = new RIFF::WAV::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "APE") file = new APE::File(stream, readAudioProperties, audioPropertiesStyle); // module, nst and wow are possible but uncommon extensions else if(ext == "MOD" || ext == "MODULE" || ext == "NST" || ext == "WOW") file = new Mod::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "S3M") file = new S3M::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "IT") file = new IT::File(stream, readAudioProperties, audioPropertiesStyle); else if(ext == "XM") file = new XM::File(stream, readAudioProperties, audioPropertiesStyle); // if file is not valid, leave it to content-based detection. if(file) { if(file->isValid()) return file; delete file; } return 0; } // Detect the file type based on the actual content of the stream. File *detectByContent(IOStream *stream, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) { File *file = 0; if(MPEG::File::isSupported(stream)) file = new MPEG::File(stream, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); else if(Ogg::Vorbis::File::isSupported(stream)) file = new Ogg::Vorbis::File(stream, readAudioProperties, audioPropertiesStyle); else if(Ogg::FLAC::File::isSupported(stream)) file = new Ogg::FLAC::File(stream, readAudioProperties, audioPropertiesStyle); else if(FLAC::File::isSupported(stream)) file = new FLAC::File(stream, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); else if(MPC::File::isSupported(stream)) file = new MPC::File(stream, readAudioProperties, audioPropertiesStyle); else if(WavPack::File::isSupported(stream)) file = new WavPack::File(stream, readAudioProperties, audioPropertiesStyle); else if(Ogg::Speex::File::isSupported(stream)) file = new Ogg::Speex::File(stream, readAudioProperties, audioPropertiesStyle); else if(Ogg::Opus::File::isSupported(stream)) file = new Ogg::Opus::File(stream, readAudioProperties, audioPropertiesStyle); else if(TrueAudio::File::isSupported(stream)) file = new TrueAudio::File(stream, readAudioProperties, audioPropertiesStyle); else if(MP4::File::isSupported(stream)) file = new MP4::File(stream, readAudioProperties, audioPropertiesStyle); else if(ASF::File::isSupported(stream)) file = new ASF::File(stream, readAudioProperties, audioPropertiesStyle); else if(RIFF::AIFF::File::isSupported(stream)) file = new RIFF::AIFF::File(stream, readAudioProperties, audioPropertiesStyle); else if(RIFF::WAV::File::isSupported(stream)) file = new RIFF::WAV::File(stream, readAudioProperties, audioPropertiesStyle); else if(APE::File::isSupported(stream)) file = new APE::File(stream, readAudioProperties, audioPropertiesStyle); // isSupported() only does a quick check, so double check the file here. if(file) { if(file->isValid()) return file; delete file; } return 0; } // Internal function that supports FileRef::create(). // This looks redundant, but necessary in order not to change the previous // behavior of FileRef::create(). File* createInternal(FileName fileName, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) { File *file = detectByResolvers(fileName, readAudioProperties, audioPropertiesStyle); if(file) return file; #ifdef _WIN32 const String s = fileName.toString(); #else const String s(fileName); #endif String ext; const int pos = s.rfind("."); if(pos != -1) ext = s.substr(pos + 1).upper(); if(ext.isEmpty()) return 0; if(ext == "MP3") return new MPEG::File(fileName, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); if(ext == "OGG") return new Ogg::Vorbis::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "OGA") { /* .oga can be any audio in the Ogg container. First try FLAC, then Vorbis. */ File *file = new Ogg::FLAC::File(fileName, readAudioProperties, audioPropertiesStyle); if(file->isValid()) return file; delete file; return new Ogg::Vorbis::File(fileName, readAudioProperties, audioPropertiesStyle); } if(ext == "FLAC") return new FLAC::File(fileName, ID3v2::FrameFactory::instance(), readAudioProperties, audioPropertiesStyle); if(ext == "MPC") return new MPC::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "WV") return new WavPack::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "SPX") return new Ogg::Speex::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "OPUS") return new Ogg::Opus::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "TTA") return new TrueAudio::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "M4A" || ext == "M4R" || ext == "M4B" || ext == "M4P" || ext == "MP4" || ext == "3G2" || ext == "M4V") return new MP4::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "WMA" || ext == "ASF") return new ASF::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "AIF" || ext == "AIFF" || ext == "AFC" || ext == "AIFC") return new RIFF::AIFF::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "WAV") return new RIFF::WAV::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "APE") return new APE::File(fileName, readAudioProperties, audioPropertiesStyle); // module, nst and wow are possible but uncommon extensions if(ext == "MOD" || ext == "MODULE" || ext == "NST" || ext == "WOW") return new Mod::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "S3M") return new S3M::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "IT") return new IT::File(fileName, readAudioProperties, audioPropertiesStyle); if(ext == "XM") return new XM::File(fileName, readAudioProperties, audioPropertiesStyle); return 0; } } // namespace class FileRef::FileRefPrivate : public RefCounter { public: FileRefPrivate() : file(0), stream(0) {} ~FileRefPrivate() { delete file; delete stream; } File *file; IOStream *stream; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// FileRef::FileRef() : d(new FileRefPrivate()) { } FileRef::FileRef(FileName fileName, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) : d(new FileRefPrivate()) { parse(fileName, readAudioProperties, audioPropertiesStyle); } FileRef::FileRef(IOStream* stream, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) : d(new FileRefPrivate()) { parse(stream, readAudioProperties, audioPropertiesStyle); } FileRef::FileRef(File *file) : d(new FileRefPrivate()) { d->file = file; } FileRef::FileRef(const FileRef &ref) : d(ref.d) { d->ref(); } FileRef::~FileRef() { if(d->deref()) delete d; } Tag *FileRef::tag() const { if(isNull()) { debug("FileRef::tag() - Called without a valid file."); return 0; } return d->file->tag(); } AudioProperties *FileRef::audioProperties() const { if(isNull()) { debug("FileRef::audioProperties() - Called without a valid file."); return 0; } return d->file->audioProperties(); } File *FileRef::file() const { return d->file; } bool FileRef::save() { if(isNull()) { debug("FileRef::save() - Called without a valid file."); return false; } return d->file->save(); } const FileRef::FileTypeResolver *FileRef::addFileTypeResolver(const FileRef::FileTypeResolver *resolver) // static { fileTypeResolvers.prepend(resolver); return resolver; } StringList FileRef::defaultFileExtensions() { StringList l; l.append("ogg"); l.append("flac"); l.append("oga"); l.append("opus"); l.append("mp3"); l.append("mpc"); l.append("wv"); l.append("spx"); l.append("tta"); l.append("m4a"); l.append("m4r"); l.append("m4b"); l.append("m4p"); l.append("3g2"); l.append("mp4"); l.append("m4v"); l.append("wma"); l.append("asf"); l.append("aif"); l.append("aiff"); l.append("afc"); l.append("aifc"); l.append("wav"); l.append("ape"); l.append("mod"); l.append("module"); // alias for "mod" l.append("nst"); // alias for "mod" l.append("wow"); // alias for "mod" l.append("s3m"); l.append("it"); l.append("xm"); return l; } bool FileRef::isNull() const { return (!d->file || !d->file->isValid()); } FileRef &FileRef::operator=(const FileRef &ref) { FileRef(ref).swap(*this); return *this; } void FileRef::swap(FileRef &ref) { using std::swap; swap(d, ref.d); } bool FileRef::operator==(const FileRef &ref) const { return (ref.d->file == d->file); } bool FileRef::operator!=(const FileRef &ref) const { return (ref.d->file != d->file); } File *FileRef::create(FileName fileName, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) // static { return createInternal(fileName, readAudioProperties, audioPropertiesStyle); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void FileRef::parse(FileName fileName, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) { // Try user-defined resolvers. d->file = detectByResolvers(fileName, readAudioProperties, audioPropertiesStyle); if(d->file) return; // Try to resolve file types based on the file extension. d->stream = new FileStream(fileName); d->file = detectByExtension(d->stream, readAudioProperties, audioPropertiesStyle); if(d->file) return; // At last, try to resolve file types based on the actual content. d->file = detectByContent(d->stream, readAudioProperties, audioPropertiesStyle); if(d->file) return; // Stream have to be closed here if failed to resolve file types. delete d->stream; d->stream = 0; } void FileRef::parse(IOStream *stream, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle) { // Try user-defined stream resolvers. d->file = detectByResolvers(stream, readAudioProperties, audioPropertiesStyle); if(d->file) return; // Try user-defined resolvers. d->file = detectByResolvers(stream->name(), readAudioProperties, audioPropertiesStyle); if(d->file) return; // Try to resolve file types based on the file extension. d->file = detectByExtension(stream, readAudioProperties, audioPropertiesStyle); if(d->file) return; // At last, try to resolve file types based on the actual content of the file. d->file = detectByContent(stream, readAudioProperties, audioPropertiesStyle); } �������������������������������������������������������������taglib-1.13.1/taglib/fileref.h����������������������������������������������������������������������0000664�0000000�0000000�00000025265�14447736377�0016126�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_FILEREF_H #define TAGLIB_FILEREF_H #include "tfile.h" #include "tstringlist.h" #include "taglib_export.h" #include "audioproperties.h" namespace TagLib { class Tag; //! This class provides a simple abstraction for creating and handling files /*! * FileRef exists to provide a minimal, generic and value-based wrapper around * a File. It is lightweight and implicitly shared, and as such suitable for * pass-by-value use. This hides some of the uglier details of TagLib::File * and the non-generic portions of the concrete file implementations. * * This class is useful in a "simple usage" situation where it is desirable * to be able to get and set some of the tag information that is similar * across file types. * * Also note that it is probably a good idea to plug this into your mime * type system rather than using the constructor that accepts a file name using * the FileTypeResolver. * * \see FileTypeResolver * \see addFileTypeResolver() */ class TAGLIB_EXPORT FileRef { public: //! A class for pluggable file type resolution. /*! * This class is used to add extend TagLib's very basic file name based file * type resolution. * * This can be accomplished with: * * \code * * class MyFileTypeResolver : FileTypeResolver * { * TagLib::File *createFile(TagLib::FileName *fileName, bool, AudioProperties::ReadStyle) const * { * if(someCheckForAnMP3File(fileName)) * return new TagLib::MPEG::File(fileName); * return 0; * } * } * * FileRef::addFileTypeResolver(new MyFileTypeResolver); * * \endcode * * Naturally a less contrived example would be slightly more complex. This * can be used to plug in mime-type detection systems or to add new file types * to TagLib. */ class TAGLIB_EXPORT FileTypeResolver { TAGLIB_IGNORE_MISSING_DESTRUCTOR public: /*! * This method must be overridden to provide an additional file type * resolver. If the resolver is able to determine the file type it should * return a valid File object; if not it should return 0. * * \note The created file is then owned by the FileRef and should not be * deleted. Deletion will happen automatically when the FileRef passes * out of scope. */ virtual File *createFile(FileName fileName, bool readAudioProperties = true, AudioProperties::ReadStyle audioPropertiesStyle = AudioProperties::Average) const = 0; }; class TAGLIB_EXPORT StreamTypeResolver : public FileTypeResolver { TAGLIB_IGNORE_MISSING_DESTRUCTOR public: virtual File *createFileFromStream(IOStream *stream, bool readAudioProperties = true, AudioProperties::ReadStyle audioPropertiesStyle = AudioProperties::Average) const = 0; }; /*! * Creates a null FileRef. */ FileRef(); /*! * Create a FileRef from \a fileName. If \a readAudioProperties is true then * the audio properties will be read using \a audioPropertiesStyle. If * \a readAudioProperties is false then \a audioPropertiesStyle will be * ignored. * * Also see the note in the class documentation about why you may not want to * use this method in your application. */ explicit FileRef(FileName fileName, bool readAudioProperties = true, AudioProperties::ReadStyle audioPropertiesStyle = AudioProperties::Average); /*! * Construct a FileRef from an opened \a IOStream. If \a readAudioProperties * is true then the audio properties will be read using \a audioPropertiesStyle. * If \a readAudioProperties is false then \a audioPropertiesStyle will be * ignored. * * Also see the note in the class documentation about why you may not want to * use this method in your application. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. */ explicit FileRef(IOStream* stream, bool readAudioProperties = true, AudioProperties::ReadStyle audioPropertiesStyle = AudioProperties::Average); /*! * Construct a FileRef using \a file. The FileRef now takes ownership of the * pointer and will delete the File when it passes out of scope. */ explicit FileRef(File *file); /*! * Make a copy of \a ref. */ FileRef(const FileRef &ref); /*! * Destroys this FileRef instance. */ virtual ~FileRef(); /*! * Returns a pointer to represented file's tag. * * \warning This pointer will become invalid when this FileRef and all * copies pass out of scope. * * \warning Do not cast it to any subclasses of Tag. * Use tag returning methods of appropriate subclasses of File instead. * * \see File::tag() */ Tag *tag() const; /*! * Returns the audio properties for this FileRef. If no audio properties * were read then this will returns a null pointer. */ AudioProperties *audioProperties() const; /*! * Returns a pointer to the file represented by this handler class. * * As a general rule this call should be avoided since if you need to work * with file objects directly, you are probably better served instantiating * the File subclasses (i.e. MPEG::File) manually and working with their APIs. * * This <i>handle</i> exists to provide a minimal, generic and value-based * wrapper around a File. Accessing the file directly generally indicates * a moving away from this simplicity (and into things beyond the scope of * FileRef). * * \warning This pointer will become invalid when this FileRef and all * copies pass out of scope. */ File *file() const; /*! * Saves the file. Returns true on success. */ bool save(); /*! * Adds a FileTypeResolver to the list of those used by TagLib. Each * additional FileTypeResolver is added to the front of a list of resolvers * that are tried. If the FileTypeResolver returns zero the next resolver * is tried. * * Returns a pointer to the added resolver (the same one that's passed in -- * this is mostly so that static initializers have something to use for * assignment). * * \see FileTypeResolver */ static const FileTypeResolver *addFileTypeResolver(const FileTypeResolver *resolver); /*! * As is mentioned elsewhere in this class's documentation, the default file * type resolution code provided by TagLib only works by comparing file * extensions. * * This method returns the list of file extensions that are used by default. * * The extensions are all returned in lowercase, though the comparison used * by TagLib for resolution is case-insensitive. * * \note This does not account for any additional file type resolvers that * are plugged in. Also note that this is not intended to replace a proper * mime-type resolution system, but is just here for reference. * * \see FileTypeResolver */ static StringList defaultFileExtensions(); /*! * Returns true if the file (and as such other pointers) are null. */ bool isNull() const; /*! * Assign the file pointed to by \a ref to this FileRef. */ FileRef &operator=(const FileRef &ref); /*! * Exchanges the content of the FileRef by the content of \a ref. */ void swap(FileRef &ref); /*! * Returns true if this FileRef and \a ref point to the same File object. */ bool operator==(const FileRef &ref) const; /*! * Returns true if this FileRef and \a ref do not point to the same File * object. */ bool operator!=(const FileRef &ref) const; /*! * A simple implementation of file type guessing. If \a readAudioProperties * is true then the audio properties will be read using * \a audioPropertiesStyle. If \a readAudioProperties is false then * \a audioPropertiesStyle will be ignored. * * \note You generally shouldn't use this method, but instead the constructor * directly. * * \deprecated Use FileRef(FileName, bool, AudioProperties::ReadStyle). */ static File *create(FileName fileName, bool readAudioProperties = true, AudioProperties::ReadStyle audioPropertiesStyle = AudioProperties::Average); private: void parse(FileName fileName, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle); void parse(IOStream *stream, bool readAudioProperties, AudioProperties::ReadStyle audioPropertiesStyle); class FileRefPrivate; FileRefPrivate *d; }; } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/��������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015234�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/flacfile.cpp��������������������������������������������������������������0000664�0000000�0000000�00000035540�14447736377�0017514�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2003-2004 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tstring.h> #include <tlist.h> #include <tdebug.h> #include <tagunion.h> #include <tpropertymap.h> #include <tagutils.h> #include <id3v2header.h> #include <id3v2tag.h> #include <id3v1tag.h> #include <xiphcomment.h> #include "flacpicture.h" #include "flacfile.h" #include "flacmetadatablock.h" #include "flacunknownmetadatablock.h" using namespace TagLib; namespace { typedef List<FLAC::MetadataBlock *> BlockList; typedef BlockList::Iterator BlockIterator; typedef BlockList::Iterator BlockConstIterator; enum { FlacXiphIndex = 0, FlacID3v2Index = 1, FlacID3v1Index = 2 }; const long MinPaddingLength = 4096; const long MaxPaddingLegnth = 1024 * 1024; const char LastBlockFlag = '\x80'; } // namespace class FLAC::File::FilePrivate { public: FilePrivate(const ID3v2::FrameFactory *frameFactory = ID3v2::FrameFactory::instance()) : ID3v2FrameFactory(frameFactory), ID3v2Location(-1), ID3v2OriginalSize(0), ID3v1Location(-1), properties(0), flacStart(0), streamStart(0), scanned(false) { blocks.setAutoDelete(true); } ~FilePrivate() { delete properties; } const ID3v2::FrameFactory *ID3v2FrameFactory; long ID3v2Location; long ID3v2OriginalSize; long ID3v1Location; TagUnion tag; Properties *properties; ByteVector xiphCommentData; BlockList blocks; long flacStart; long streamStart; bool scanned; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool FLAC::File::isSupported(IOStream *stream) { // A FLAC file has an ID "fLaC" somewhere. An ID3v2 tag may precede. const ByteVector buffer = Utils::readHeader(stream, bufferSize(), true); return (buffer.find("fLaC") >= 0); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// FLAC::File::File(FileName file, bool readProperties, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } FLAC::File::File(FileName file, ID3v2::FrameFactory *frameFactory, bool readProperties, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate(frameFactory)) { if(isOpen()) read(readProperties); } FLAC::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory, bool readProperties, Properties::ReadStyle) : TagLib::File(stream), d(new FilePrivate(frameFactory)) { if(isOpen()) read(readProperties); } FLAC::File::~File() { delete d; } TagLib::Tag *FLAC::File::tag() const { return &d->tag; } PropertyMap FLAC::File::properties() const { return d->tag.properties(); } void FLAC::File::removeUnsupportedProperties(const StringList &unsupported) { d->tag.removeUnsupportedProperties(unsupported); } PropertyMap FLAC::File::setProperties(const PropertyMap &properties) { return xiphComment(true)->setProperties(properties); } FLAC::Properties *FLAC::File::audioProperties() const { return d->properties; } bool FLAC::File::save() { if(readOnly()) { debug("FLAC::File::save() - Cannot save to a read only file."); return false; } if(!isValid()) { debug("FLAC::File::save() -- Trying to save invalid file."); return false; } // Create new vorbis comments if(!hasXiphComment()) Tag::duplicate(&d->tag, xiphComment(true), false); d->xiphCommentData = xiphComment()->render(false); // Replace metadata blocks MetadataBlock *commentBlock = new UnknownMetadataBlock(MetadataBlock::VorbisComment, d->xiphCommentData); for(BlockIterator it = d->blocks.begin(); it != d->blocks.end();) { if((*it)->code() == MetadataBlock::VorbisComment) { // Remove the old Vorbis Comment block delete *it; it = d->blocks.erase(it); continue; } if(commentBlock && (*it)->code() == MetadataBlock::Picture) { // Set the new Vorbis Comment block before the first picture block d->blocks.insert(it, commentBlock); commentBlock = 0; } ++it; } if(commentBlock) d->blocks.append(commentBlock); // Render data for the metadata blocks ByteVector data; for(BlockConstIterator it = d->blocks.begin(); it != d->blocks.end(); ++it) { ByteVector blockData = (*it)->render(); ByteVector blockHeader = ByteVector::fromUInt(blockData.size()); blockHeader[0] = (*it)->code(); data.append(blockHeader); data.append(blockData); } // Compute the amount of padding, and append that to data. long originalLength = d->streamStart - d->flacStart; long paddingLength = originalLength - data.size() - 4; if(paddingLength <= 0) { paddingLength = MinPaddingLength; } else { // Padding won't increase beyond 1% of the file size or 1MB. long threshold = length() / 100; threshold = std::max(threshold, MinPaddingLength); threshold = std::min(threshold, MaxPaddingLegnth); if(paddingLength > threshold) paddingLength = MinPaddingLength; } ByteVector paddingHeader = ByteVector::fromUInt(paddingLength); paddingHeader[0] = static_cast<char>(MetadataBlock::Padding | LastBlockFlag); data.append(paddingHeader); data.resize(static_cast<unsigned int>(data.size() + paddingLength)); // Write the data to the file insert(data, d->flacStart, originalLength); d->streamStart += (static_cast<long>(data.size()) - originalLength); if(d->ID3v1Location >= 0) d->ID3v1Location += (static_cast<long>(data.size()) - originalLength); // Update ID3 tags if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { // ID3v2 tag is not empty. Update the old one or create a new one. if(d->ID3v2Location < 0) d->ID3v2Location = 0; data = ID3v2Tag()->render(); insert(data, d->ID3v2Location, d->ID3v2OriginalSize); d->flacStart += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); d->streamStart += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); if(d->ID3v1Location >= 0) d->ID3v1Location += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); d->ID3v2OriginalSize = data.size(); } else { // ID3v2 tag is empty. Remove the old one. if(d->ID3v2Location >= 0) { removeBlock(d->ID3v2Location, d->ID3v2OriginalSize); d->flacStart -= d->ID3v2OriginalSize; d->streamStart -= d->ID3v2OriginalSize; if(d->ID3v1Location >= 0) d->ID3v1Location -= d->ID3v2OriginalSize; d->ID3v2Location = -1; d->ID3v2OriginalSize = 0; } } if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { // ID3v1 tag is not empty. Update the old one or create a new one. if(d->ID3v1Location >= 0) { seek(d->ID3v1Location); } else { seek(0, End); d->ID3v1Location = tell(); } writeBlock(ID3v1Tag()->render()); } else { // ID3v1 tag is empty. Remove the old one. if(d->ID3v1Location >= 0) { truncate(d->ID3v1Location); d->ID3v1Location = -1; } } return true; } ID3v2::Tag *FLAC::File::ID3v2Tag(bool create) { return d->tag.access<ID3v2::Tag>(FlacID3v2Index, create); } ID3v1::Tag *FLAC::File::ID3v1Tag(bool create) { return d->tag.access<ID3v1::Tag>(FlacID3v1Index, create); } Ogg::XiphComment *FLAC::File::xiphComment(bool create) { return d->tag.access<Ogg::XiphComment>(FlacXiphIndex, create); } void FLAC::File::setID3v2FrameFactory(const ID3v2::FrameFactory *factory) { d->ID3v2FrameFactory = factory; } ByteVector FLAC::File::streamInfoData() { debug("FLAC::File::streamInfoData() -- This function is obsolete. Returning an empty ByteVector."); return ByteVector(); } long FLAC::File::streamLength() { debug("FLAC::File::streamLength() -- This function is obsolete. Returning zero."); return 0; } List<FLAC::Picture *> FLAC::File::pictureList() { List<Picture *> pictures; for(BlockConstIterator it = d->blocks.begin(); it != d->blocks.end(); ++it) { Picture *picture = dynamic_cast<Picture *>(*it); if(picture) { pictures.append(picture); } } return pictures; } void FLAC::File::addPicture(Picture *picture) { d->blocks.append(picture); } void FLAC::File::removePicture(Picture *picture, bool del) { BlockIterator it = d->blocks.find(picture); if(it != d->blocks.end()) d->blocks.erase(it); if(del) delete picture; } void FLAC::File::removePictures() { for(BlockIterator it = d->blocks.begin(); it != d->blocks.end(); ) { if(dynamic_cast<Picture *>(*it)) { delete *it; it = d->blocks.erase(it); } else { ++it; } } } void FLAC::File::strip(int tags) { if(tags & ID3v1) d->tag.set(FlacID3v1Index, 0); if(tags & ID3v2) d->tag.set(FlacID3v2Index, 0); if(tags & XiphComment) { xiphComment()->removeAllFields(); xiphComment()->removeAllPictures(); } } bool FLAC::File::hasXiphComment() const { return !d->xiphCommentData.isEmpty(); } bool FLAC::File::hasID3v1Tag() const { return (d->ID3v1Location >= 0); } bool FLAC::File::hasID3v2Tag() const { return (d->ID3v2Location >= 0); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void FLAC::File::read(bool readProperties) { // Look for an ID3v2 tag d->ID3v2Location = Utils::findID3v2(this); if(d->ID3v2Location >= 0) { d->tag.set(FlacID3v2Index, new ID3v2::Tag(this, d->ID3v2Location, d->ID3v2FrameFactory)); d->ID3v2OriginalSize = ID3v2Tag()->header()->completeTagSize(); } // Look for an ID3v1 tag d->ID3v1Location = Utils::findID3v1(this); if(d->ID3v1Location >= 0) d->tag.set(FlacID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); // Look for FLAC metadata, including vorbis comments scan(); if(!isValid()) return; if(!d->xiphCommentData.isEmpty()) d->tag.set(FlacXiphIndex, new Ogg::XiphComment(d->xiphCommentData)); else d->tag.set(FlacXiphIndex, new Ogg::XiphComment()); if(readProperties) { // First block should be the stream_info metadata const ByteVector infoData = d->blocks.front()->render(); long streamLength; if(d->ID3v1Location >= 0) streamLength = d->ID3v1Location - d->streamStart; else streamLength = length() - d->streamStart; d->properties = new Properties(infoData, streamLength); } } void FLAC::File::scan() { // Scan the metadata pages if(d->scanned) return; if(!isValid()) return; long nextBlockOffset; if(d->ID3v2Location >= 0) nextBlockOffset = find("fLaC", d->ID3v2Location + d->ID3v2OriginalSize); else nextBlockOffset = find("fLaC"); if(nextBlockOffset < 0) { debug("FLAC::File::scan() -- FLAC stream not found"); setValid(false); return; } nextBlockOffset += 4; d->flacStart = nextBlockOffset; while(true) { seek(nextBlockOffset); const ByteVector header = readBlock(4); if(header.size() != 4) { debug("FLAC::File::scan() -- Failed to read a block header"); setValid(false); return; } // Header format (from spec): // <1> Last-metadata-block flag // <7> BLOCK_TYPE // 0 : STREAMINFO // 1 : PADDING // .. // 4 : VORBIS_COMMENT // .. // 6 : PICTURE // .. // <24> Length of metadata to follow const char blockType = header[0] & ~LastBlockFlag; const bool isLastBlock = (header[0] & LastBlockFlag) != 0; const unsigned int blockLength = header.toUInt(1U, 3U); // First block should be the stream_info metadata if(d->blocks.isEmpty() && blockType != MetadataBlock::StreamInfo) { debug("FLAC::File::scan() -- First block should be the stream_info metadata"); setValid(false); return; } if(blockLength == 0 && blockType != MetadataBlock::Padding && blockType != MetadataBlock::SeekTable) { debug("FLAC::File::scan() -- Zero-sized metadata block found"); setValid(false); return; } const ByteVector data = readBlock(blockLength); if(data.size() != blockLength) { debug("FLAC::File::scan() -- Failed to read a metadata block"); setValid(false); return; } MetadataBlock *block = 0; // Found the vorbis-comment if(blockType == MetadataBlock::VorbisComment) { if(d->xiphCommentData.isEmpty()) { d->xiphCommentData = data; block = new UnknownMetadataBlock(MetadataBlock::VorbisComment, data); } else { debug("FLAC::File::scan() -- multiple Vorbis Comment blocks found, discarding"); } } else if(blockType == MetadataBlock::Picture) { FLAC::Picture *picture = new FLAC::Picture(); if(picture->parse(data)) { block = picture; } else { debug("FLAC::File::scan() -- invalid picture found, discarding"); delete picture; } } else if(blockType == MetadataBlock::Padding) { // Skip all padding blocks. } else { block = new UnknownMetadataBlock(blockType, data); } if(block) d->blocks.append(block); nextBlockOffset += blockLength + 4; if(isLastBlock) break; } // End of metadata, now comes the datastream d->streamStart = nextBlockOffset; d->scanned = true; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/flacfile.h����������������������������������������������������������������0000664�0000000�0000000�00000030100�14447736377�0017144�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2003 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_FLACFILE_H #define TAGLIB_FLACFILE_H #include "taglib_export.h" #include "tfile.h" #include "tlist.h" #include "tag.h" #include "flacpicture.h" #include "flacproperties.h" namespace TagLib { class Tag; namespace ID3v2 { class FrameFactory; class Tag; } namespace ID3v1 { class Tag; } namespace Ogg { class XiphComment; } //! An implementation of FLAC metadata /*! * This is implementation of FLAC metadata for non-Ogg FLAC files. At some * point when Ogg / FLAC is more common there will be a similar implementation * under the Ogg hierarchy. * * This supports ID3v1, ID3v2 and Xiph style comments as well as reading stream * properties from the file. */ namespace FLAC { //! An implementation of TagLib::File with FLAC specific methods /*! * This implements and provides an interface for FLAC files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to FLAC files. */ class TAGLIB_EXPORT File : public TagLib::File { public: /*! * This set of flags is used for various operations and is suitable for * being OR-ed together. */ enum TagTypes { //! Empty set. Matches no tag types. NoTags = 0x0000, //! Matches Vorbis comments. XiphComment = 0x0001, //! Matches ID3v1 tags. ID3v1 = 0x0002, //! Matches ID3v2 tags. ID3v2 = 0x0004, //! Matches all tag types. AllTags = 0xffff }; /*! * Constructs a FLAC file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. * * \deprecated This constructor will be dropped in favor of the one below * in a future version. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an FLAC file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * If this file contains and ID3v2 tag the frames will be created using * \a frameFactory. * * \note In the current implementation, \a propertiesStyle is ignored. */ // BIC: merge with the above constructor File(FileName file, ID3v2::FrameFactory *frameFactory, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs a FLAC file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * If this file contains and ID3v2 tag the frames will be created using * \a frameFactory. * * \note In the current implementation, \a propertiesStyle is ignored. */ // BIC: merge with the above constructor File(IOStream *stream, ID3v2::FrameFactory *frameFactory, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the Tag for this file. This will be a union of XiphComment, * ID3v1 and ID3v2 tags. * * \see ID3v2Tag() * \see ID3v1Tag() * \see XiphComment() */ virtual TagLib::Tag *tag() const; /*! * Implements the unified property interface -- export function. * If the file contains more than one tag (e.g. XiphComment and ID3v1), * only the first one (in the order XiphComment, ID3v2, ID3v1) will be * converted to the PropertyMap. */ PropertyMap properties() const; void removeUnsupportedProperties(const StringList &); /*! * Implements the unified property interface -- import function. * This always creates a Xiph comment, if none exists. The return value * relates to the Xiph comment only. * Ignores any changes to ID3v1 or ID3v2 comments since they are not allowed * in the FLAC specification. */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the FLAC::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Save the file. This will primarily save the XiphComment, but * will also keep any old ID3-tags up to date. If the file * has no XiphComment, one will be constructed from the ID3-tags. * * This returns true if the save was successful. */ virtual bool save(); /*! * Returns a pointer to the ID3v2 tag of the file. * * If \a create is false (the default) this returns a null pointer * if there is no valid ID3v2 tag. If \a create is true it will create * an ID3v2 tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file * on disk actually has an ID3v2 tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasID3v2Tag() */ ID3v2::Tag *ID3v2Tag(bool create = false); /*! * Returns a pointer to the ID3v1 tag of the file. * * If \a create is false (the default) this returns a null pointer * if there is no valid APE tag. If \a create is true it will create * an APE tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file * on disk actually has an ID3v1 tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasID3v1Tag() */ ID3v1::Tag *ID3v1Tag(bool create = false); /*! * Returns a pointer to the XiphComment for the file. * * If \a create is false (the default) this returns a null pointer * if there is no valid XiphComment. If \a create is true it will create * a XiphComment if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has a XiphComment. Use hasXiphComment() to check if the * file on disk actually has a XiphComment. * * \note The Tag <b>is still</b> owned by the FLAC::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasXiphComment() */ Ogg::XiphComment *xiphComment(bool create = false); /*! * Set the ID3v2::FrameFactory to something other than the default. This * can be used to specify the way that ID3v2 frames will be interpreted * when * * \see ID3v2FrameFactory * \deprecated This value should be passed in via the constructor. */ TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); /*! * Returns the block of data used by FLAC::Properties for parsing the * stream properties. * * \deprecated Always returns an empty vector. */ TAGLIB_DEPRECATED ByteVector streamInfoData(); // BIC: remove /*! * Returns the length of the audio-stream, used by FLAC::Properties for * calculating the bitrate. * * \deprecated Always returns zero. */ TAGLIB_DEPRECATED long streamLength(); // BIC: remove /*! * Returns a list of pictures attached to the FLAC file. */ List<Picture *> pictureList(); /*! * Removes an attached picture. If \a del is true the picture's memory * will be freed; if it is false, it must be deleted by the user. */ void removePicture(Picture *picture, bool del = true); /*! * Remove all attached images. */ void removePictures(); /*! * Add a new picture to the file. The file takes ownership of the * picture and will handle freeing its memory. * * \note The file will be saved only after calling save(). */ void addPicture(Picture *picture); /*! * This will remove the tags that match the OR-ed together TagTypes from * the file. By default it removes all tags. * * \warning This will also invalidate pointers to the tags as their memory * will be freed. * * \note In order to make the removal permanent save() still needs to be * called. * * \note This won't remove the Vorbis comment block completely. The * vendor ID will be preserved. */ void strip(int tags = AllTags); /*! * Returns whether or not the file on disk actually has a XiphComment. * * \see xiphComment() */ bool hasXiphComment() const; /*! * Returns whether or not the file on disk actually has an ID3v1 tag. * * \see ID3v1Tag() */ bool hasID3v1Tag() const; /*! * Returns whether or not the file on disk actually has an ID3v2 tag. * * \see ID3v2Tag() */ bool hasID3v2Tag() const; /*! * Returns whether or not the given \a stream can be opened as a FLAC * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); void scan(); class FilePrivate; FilePrivate *d; }; } // namespace FLAC } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/flacmetadatablock.cpp�����������������������������������������������������0000664�0000000�0000000�00000003724�14447736377�0021367�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2010 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <taglib.h> #include <tdebug.h> #include "flacmetadatablock.h" using namespace TagLib; class FLAC::MetadataBlock::MetadataBlockPrivate { public: MetadataBlockPrivate() {} }; FLAC::MetadataBlock::MetadataBlock() : d(0) { } FLAC::MetadataBlock::~MetadataBlock() { } ��������������������������������������������taglib-1.13.1/taglib/flac/flacmetadatablock.h�������������������������������������������������������0000664�0000000�0000000�00000005124�14447736377�0021030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2010 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_FLACMETADATABLOCK_H #define TAGLIB_FLACMETADATABLOCK_H #include "tlist.h" #include "tbytevector.h" #include "taglib_export.h" namespace TagLib { namespace FLAC { class TAGLIB_EXPORT MetadataBlock { public: MetadataBlock(); virtual ~MetadataBlock(); enum BlockType { StreamInfo = 0, Padding, Application, SeekTable, VorbisComment, CueSheet, Picture }; /*! * Returns the FLAC metadata block type. */ virtual int code() const = 0; /*! * Render the content of the block. */ virtual ByteVector render() const = 0; private: MetadataBlock(const MetadataBlock &item); MetadataBlock &operator=(const MetadataBlock &item); class MetadataBlockPrivate; MetadataBlockPrivate *d; }; } // namespace FLAC } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/flacpicture.cpp�����������������������������������������������������������0000664�0000000�0000000�00000012554�14447736377�0020250�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2010 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <taglib.h> #include <tdebug.h> #include "flacpicture.h" using namespace TagLib; class FLAC::Picture::PicturePrivate { public: PicturePrivate() : type(FLAC::Picture::Other), width(0), height(0), colorDepth(0), numColors(0) {} Type type; String mimeType; String description; int width; int height; int colorDepth; int numColors; ByteVector data; }; FLAC::Picture::Picture() : d(new PicturePrivate()) { } FLAC::Picture::Picture(const ByteVector &data) : d(new PicturePrivate()) { parse(data); } FLAC::Picture::~Picture() { delete d; } int FLAC::Picture::code() const { return FLAC::MetadataBlock::Picture; } bool FLAC::Picture::parse(const ByteVector &data) { if(data.size() < 32) { debug("A picture block must contain at least 5 bytes."); return false; } unsigned int pos = 0; d->type = static_cast<FLAC::Picture::Type>(data.toUInt(pos)); pos += 4; unsigned int mimeTypeLength = data.toUInt(pos); pos += 4; if(pos + mimeTypeLength + 24 > data.size()) { debug("Invalid picture block."); return false; } d->mimeType = String(data.mid(pos, mimeTypeLength), String::UTF8); pos += mimeTypeLength; unsigned int descriptionLength = data.toUInt(pos); pos += 4; if(pos + descriptionLength + 20 > data.size()) { debug("Invalid picture block."); return false; } d->description = String(data.mid(pos, descriptionLength), String::UTF8); pos += descriptionLength; d->width = data.toUInt(pos); pos += 4; d->height = data.toUInt(pos); pos += 4; d->colorDepth = data.toUInt(pos); pos += 4; d->numColors = data.toUInt(pos); pos += 4; unsigned int dataLength = data.toUInt(pos); pos += 4; if(pos + dataLength > data.size()) { debug("Invalid picture block."); return false; } d->data = data.mid(pos, dataLength); return true; } ByteVector FLAC::Picture::render() const { ByteVector result; result.append(ByteVector::fromUInt(d->type)); ByteVector mimeTypeData = d->mimeType.data(String::UTF8); result.append(ByteVector::fromUInt(mimeTypeData.size())); result.append(mimeTypeData); ByteVector descriptionData = d->description.data(String::UTF8); result.append(ByteVector::fromUInt(descriptionData.size())); result.append(descriptionData); result.append(ByteVector::fromUInt(d->width)); result.append(ByteVector::fromUInt(d->height)); result.append(ByteVector::fromUInt(d->colorDepth)); result.append(ByteVector::fromUInt(d->numColors)); result.append(ByteVector::fromUInt(d->data.size())); result.append(d->data); return result; } FLAC::Picture::Type FLAC::Picture::type() const { return d->type; } void FLAC::Picture::setType(FLAC::Picture::Type type) { d->type = type; } String FLAC::Picture::mimeType() const { return d->mimeType; } void FLAC::Picture::setMimeType(const String &mimeType) { d->mimeType = mimeType; } String FLAC::Picture::description() const { return d->description; } void FLAC::Picture::setDescription(const String &description) { d->description = description; } int FLAC::Picture::width() const { return d->width; } void FLAC::Picture::setWidth(int width) { d->width = width; } int FLAC::Picture::height() const { return d->height; } void FLAC::Picture::setHeight(int height) { d->height = height; } int FLAC::Picture::colorDepth() const { return d->colorDepth; } void FLAC::Picture::setColorDepth(int colorDepth) { d->colorDepth = colorDepth; } int FLAC::Picture::numColors() const { return d->numColors; } void FLAC::Picture::setNumColors(int numColors) { d->numColors = numColors; } ByteVector FLAC::Picture::data() const { return d->data; } void FLAC::Picture::setData(const ByteVector &data) { d->data = data; } ����������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/flacpicture.h�������������������������������������������������������������0000664�0000000�0000000�00000014227�14447736377�0017714�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2010 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_FLACPICTURE_H #define TAGLIB_FLACPICTURE_H #include "tlist.h" #include "tstring.h" #include "tbytevector.h" #include "taglib_export.h" #include "flacmetadatablock.h" namespace TagLib { namespace FLAC { class TAGLIB_EXPORT Picture : public MetadataBlock { public: /*! * This describes the function or content of the picture. */ enum Type { //! A type not enumerated below Other = 0x00, //! 32x32 PNG image that should be used as the file icon FileIcon = 0x01, //! File icon of a different size or format OtherFileIcon = 0x02, //! Front cover image of the album FrontCover = 0x03, //! Back cover image of the album BackCover = 0x04, //! Inside leaflet page of the album LeafletPage = 0x05, //! Image from the album itself Media = 0x06, //! Picture of the lead artist or soloist LeadArtist = 0x07, //! Picture of the artist or performer Artist = 0x08, //! Picture of the conductor Conductor = 0x09, //! Picture of the band or orchestra Band = 0x0A, //! Picture of the composer Composer = 0x0B, //! Picture of the lyricist or text writer Lyricist = 0x0C, //! Picture of the recording location or studio RecordingLocation = 0x0D, //! Picture of the artists during recording DuringRecording = 0x0E, //! Picture of the artists during performance DuringPerformance = 0x0F, //! Picture from a movie or video related to the track MovieScreenCapture = 0x10, //! Picture of a large, coloured fish ColouredFish = 0x11, //! Illustration related to the track Illustration = 0x12, //! Logo of the band or performer BandLogo = 0x13, //! Logo of the publisher (record company) PublisherLogo = 0x14 }; Picture(); Picture(const ByteVector &data); ~Picture(); /*! * Returns the type of the image. */ Type type() const; /*! * Sets the type of the image. */ void setType(Type type); /*! * Returns the mime type of the image. This should in most cases be * "image/png" or "image/jpeg". */ String mimeType() const; /*! * Sets the mime type of the image. This should in most cases be * "image/png" or "image/jpeg". */ void setMimeType(const String &m); /*! * Returns a text description of the image. */ String description() const; /*! * Sets a textual description of the image to \a desc. */ void setDescription(const String &desc); /*! * Returns the width of the image. */ int width() const; /*! * Sets the width of the image. */ void setWidth(int w); /*! * Returns the height of the image. */ int height() const; /*! * Sets the height of the image. */ void setHeight(int h); /*! * Returns the color depth (in bits-per-pixel) of the image. */ int colorDepth() const; /*! * Sets the color depth (in bits-per-pixel) of the image. */ void setColorDepth(int depth); /*! * Returns the number of colors used on the image.. */ int numColors() const; /*! * Sets the number of colors used on the image (for indexed images). */ void setNumColors(int numColors); /*! * Returns the image data. */ ByteVector data() const; /*! * Sets the image data. */ void setData(const ByteVector &data); /*! * Returns the FLAC metadata block type. */ int code() const; /*! * Render the content to the FLAC picture block format. */ ByteVector render() const; /*! * Parse the picture data in the FLAC picture block format. */ bool parse(const ByteVector &rawData); private: Picture(const Picture &item); Picture &operator=(const Picture &item); class PicturePrivate; PicturePrivate *d; }; typedef List<Picture> PictureList; } // namespace FLAC } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/flacproperties.cpp��������������������������������������������������������0000664�0000000�0000000�00000011456�14447736377�0020771�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2003 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include "flacproperties.h" #include "flacfile.h" using namespace TagLib; class FLAC::Properties::PropertiesPrivate { public: PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), bitsPerSample(0), channels(0), sampleFrames(0) {} int length; int bitrate; int sampleRate; int bitsPerSample; int channels; unsigned long long sampleFrames; ByteVector signature; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// FLAC::Properties::Properties(ByteVector data, long streamLength, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(data, streamLength); } FLAC::Properties::Properties(File *, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { debug("FLAC::Properties::Properties() - This constructor is no longer used."); } FLAC::Properties::~Properties() { delete d; } int FLAC::Properties::length() const { return lengthInSeconds(); } int FLAC::Properties::lengthInSeconds() const { return d->length / 1000; } int FLAC::Properties::lengthInMilliseconds() const { return d->length; } int FLAC::Properties::bitrate() const { return d->bitrate; } int FLAC::Properties::sampleRate() const { return d->sampleRate; } int FLAC::Properties::bitsPerSample() const { return d->bitsPerSample; } int FLAC::Properties::sampleWidth() const { return bitsPerSample(); } int FLAC::Properties::channels() const { return d->channels; } unsigned long long FLAC::Properties::sampleFrames() const { return d->sampleFrames; } ByteVector FLAC::Properties::signature() const { return d->signature; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void FLAC::Properties::read(const ByteVector &data, long streamLength) { if(data.size() < 18) { debug("FLAC::Properties::read() - FLAC properties must contain at least 18 bytes."); return; } unsigned int pos = 0; // Minimum block size (in samples) pos += 2; // Maximum block size (in samples) pos += 2; // Minimum frame size (in bytes) pos += 3; // Maximum frame size (in bytes) pos += 3; const unsigned int flags = data.toUInt(pos, true); pos += 4; d->sampleRate = flags >> 12; d->channels = ((flags >> 9) & 7) + 1; d->bitsPerSample = ((flags >> 4) & 31) + 1; // The last 4 bits are the most significant 4 bits for the 36 bit // stream length in samples. (Audio files measured in days) const unsigned long long hi = flags & 0xf; const unsigned long long lo = data.toUInt(pos, true); pos += 4; d->sampleFrames = (hi << 32) | lo; if(d->sampleFrames > 0 && d->sampleRate > 0) { const double length = d->sampleFrames * 1000.0 / d->sampleRate; d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); } if(data.size() >= pos + 16) d->signature = data.mid(pos, 16); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/flacproperties.h����������������������������������������������������������0000664�0000000�0000000�00000011256�14447736377�0020434�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2003 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_FLACPROPERTIES_H #define TAGLIB_FLACPROPERTIES_H #include "taglib_export.h" #include "audioproperties.h" namespace TagLib { namespace FLAC { class File; //! An implementation of audio property reading for FLAC /*! * This reads the data from an FLAC stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of FLAC::Properties with the data read from the * ByteVector \a data. */ // BIC: switch to const reference Properties(ByteVector data, long streamLength, ReadStyle style = Average); /*! * Create an instance of FLAC::Properties with the data read from the * FLAC::File \a file. */ // BIC: remove Properties(File *file, ReadStyle style = Average); /*! * Destroys this FLAC::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the number of bits per audio sample as read from the FLAC * identification header. */ int bitsPerSample() const; /*! * Returns the sample width as read from the FLAC identification * header. * * \note This method is just an alias of bitsPerSample(). * * \deprecated Use bitsPerSample(). */ TAGLIB_DEPRECATED int sampleWidth() const; /*! * Return the number of sample frames. */ unsigned long long sampleFrames() const; /*! * Returns the MD5 signature of the uncompressed audio stream as read * from the stream info header. */ ByteVector signature() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(const ByteVector &data, long streamLength); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace FLAC } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/flacunknownmetadatablock.cpp����������������������������������������������0000664�0000000�0000000�00000005070�14447736377�0023003�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2010 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <taglib.h> #include <tdebug.h> #include <tstring.h> #include "flacunknownmetadatablock.h" using namespace TagLib; class FLAC::UnknownMetadataBlock::UnknownMetadataBlockPrivate { public: UnknownMetadataBlockPrivate() : code(0) {} int code; ByteVector data; }; FLAC::UnknownMetadataBlock::UnknownMetadataBlock(int code, const ByteVector &data) : d(new UnknownMetadataBlockPrivate()) { d->code = code; d->data = data; } FLAC::UnknownMetadataBlock::~UnknownMetadataBlock() { delete d; } int FLAC::UnknownMetadataBlock::code() const { return d->code; } void FLAC::UnknownMetadataBlock::setCode(int code) { d->code = code; } ByteVector FLAC::UnknownMetadataBlock::data() const { return d->data; } void FLAC::UnknownMetadataBlock::setData(const ByteVector &data) { d->data = data; } ByteVector FLAC::UnknownMetadataBlock::render() const { return d->data; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/flac/flacunknownmetadatablock.h������������������������������������������������0000664�0000000�0000000�00000005522�14447736377�0022452�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2010 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_FLACUNKNOWNMETADATABLOCK_H #define TAGLIB_FLACUNKNOWNMETADATABLOCK_H #include "tlist.h" #include "tbytevector.h" #include "taglib_export.h" #include "flacmetadatablock.h" namespace TagLib { namespace FLAC { class TAGLIB_EXPORT UnknownMetadataBlock : public MetadataBlock { public: UnknownMetadataBlock(int blockType, const ByteVector &data); ~UnknownMetadataBlock(); /*! * Returns the FLAC metadata block type. */ int code() const; /*! * Sets the FLAC metadata block type. */ void setCode(int code); /*! * Returns the FLAC metadata block type. */ ByteVector data() const; /*! * Sets the FLAC metadata block type. */ void setData(const ByteVector &data); /*! * Render the content of the block. */ ByteVector render() const; private: UnknownMetadataBlock(const MetadataBlock &item); UnknownMetadataBlock &operator=(const MetadataBlock &item); class UnknownMetadataBlockPrivate; UnknownMetadataBlockPrivate *d; }; } // namespace FLAC } // namespace TagLib #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/it/����������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0014743�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/it/itfile.cpp������������������������������������������������������������������0000664�0000000�0000000�00000023426�14447736377�0016732�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tstringlist.h" #include "itfile.h" #include "tdebug.h" #include "modfileprivate.h" #include "tpropertymap.h" using namespace TagLib; using namespace IT; class IT::File::FilePrivate { public: FilePrivate(AudioProperties::ReadStyle propertiesStyle) : properties(propertiesStyle) { } Mod::Tag tag; IT::Properties properties; }; IT::File::File(FileName file, bool readProperties, AudioProperties::ReadStyle propertiesStyle) : Mod::FileBase(file), d(new FilePrivate(propertiesStyle)) { if(isOpen()) read(readProperties); } IT::File::File(IOStream *stream, bool readProperties, AudioProperties::ReadStyle propertiesStyle) : Mod::FileBase(stream), d(new FilePrivate(propertiesStyle)) { if(isOpen()) read(readProperties); } IT::File::~File() { delete d; } Mod::Tag *IT::File::tag() const { return &d->tag; } PropertyMap IT::File::properties() const { return d->tag.properties(); } PropertyMap IT::File::setProperties(const PropertyMap &properties) { return d->tag.setProperties(properties); } IT::Properties *IT::File::audioProperties() const { return &d->properties; } bool IT::File::save() { if(readOnly()) { debug("IT::File::save() - Cannot save to a read only file."); return false; } seek(4); writeString(d->tag.title(), 25); writeByte(0); seek(2, Current); unsigned short length = 0; unsigned short instrumentCount = 0; unsigned short sampleCount = 0; if(!readU16L(length) || !readU16L(instrumentCount) || !readU16L(sampleCount)) return false; seek(15, Current); // write comment as instrument and sample names: StringList lines = d->tag.comment().split("\n"); for(unsigned short i = 0; i < instrumentCount; ++ i) { seek(192L + length + (static_cast<long>(i) << 2)); unsigned long instrumentOffset = 0; if(!readU32L(instrumentOffset)) return false; seek(instrumentOffset + 32); if(i < lines.size()) writeString(lines[i], 25); else writeString(String(), 25); writeByte(0); } for(unsigned short i = 0; i < sampleCount; ++ i) { seek(192L + length + (static_cast<long>(instrumentCount) << 2) + (static_cast<long>(i) << 2)); unsigned long sampleOffset = 0; if(!readU32L(sampleOffset)) return false; seek(sampleOffset + 20); if(static_cast<unsigned int>(i + instrumentCount) < lines.size()) writeString(lines[i + instrumentCount], 25); else writeString(String(), 25); writeByte(0); } // write rest as message: StringList messageLines; for(unsigned int i = instrumentCount + sampleCount; i < lines.size(); ++ i) messageLines.append(lines[i]); ByteVector message = messageLines.toString("\r").data(String::Latin1); // it's actually not really stated if the message needs a // terminating NUL but it does not hurt to add one: if(message.size() > 7999) message.resize(7999); message.append(static_cast<char>(0)); unsigned short special = 0; unsigned short messageLength = 0; unsigned long messageOffset = 0; seek(46); if(!readU16L(special)) return false; unsigned long fileSize = File::length(); if(special & Properties::MessageAttached) { seek(54); if(!readU16L(messageLength) || !readU32L(messageOffset)) return false; if(messageLength == 0) messageOffset = fileSize; } else { messageOffset = fileSize; seek(46); writeU16L(special | 0x1); } if(messageOffset + messageLength >= fileSize) { // append new message seek(54); writeU16L(message.size()); writeU32L(messageOffset); seek(messageOffset); writeBlock(message); truncate(messageOffset + message.size()); } else { // Only overwrite existing message. // I'd need to parse (understand!) the whole file for more. // Although I could just move the message to the end of file // and let the existing one be, but that would waste space. message.resize(messageLength, 0); seek(messageOffset); writeBlock(message); } return true; } void IT::File::read(bool) { if(!isOpen()) return; seek(0); READ_ASSERT(readBlock(4) == "IMPM"); READ_STRING(d->tag.setTitle, 26); seek(2, Current); READ_U16L_AS(length); READ_U16L_AS(instrumentCount); READ_U16L_AS(sampleCount); d->properties.setInstrumentCount(instrumentCount); d->properties.setSampleCount(sampleCount); READ_U16L(d->properties.setPatternCount); READ_U16L(d->properties.setVersion); READ_U16L(d->properties.setCompatibleVersion); READ_U16L(d->properties.setFlags); READ_U16L_AS(special); d->properties.setSpecial(special); READ_BYTE(d->properties.setGlobalVolume); READ_BYTE(d->properties.setMixVolume); READ_BYTE(d->properties.setBpmSpeed); READ_BYTE(d->properties.setTempo); READ_BYTE(d->properties.setPanningSeparation); READ_BYTE(d->properties.setPitchWheelDepth); // IT supports some kind of comment tag. Still, the // sample/instrument names are abused as comments so // I just add all together. String message; if(special & Properties::MessageAttached) { READ_U16L_AS(messageLength); READ_U32L_AS(messageOffset); seek(messageOffset); ByteVector messageBytes = readBlock(messageLength); READ_ASSERT(messageBytes.size() == messageLength); int index = messageBytes.find(static_cast<char>(0)); if(index > -1) messageBytes.resize(index, 0); messageBytes.replace('\r', '\n'); message = messageBytes; } seek(64); ByteVector pannings = readBlock(64); ByteVector volumes = readBlock(64); READ_ASSERT(pannings.size() == 64 && volumes.size() == 64); int channels = 0; for(int i = 0; i < 64; ++ i) { // Strictly speaking an IT file has always 64 channels, but // I don't count disabled and muted channels. // But this always gives 64 channels for all my files anyway. // Strangely VLC does report other values. I wonder how VLC // gets it's values. if(static_cast<unsigned char>(pannings[i]) < 128 && volumes[i] > 0) ++channels; } d->properties.setChannels(channels); // real length might be shorter because of skips and terminator unsigned short realLength = 0; for(unsigned short i = 0; i < length; ++ i) { READ_BYTE_AS(order); if(order == 255) break; if(order != 254) ++ realLength; } d->properties.setLengthInPatterns(realLength); StringList comment; // Note: I found files that have nil characters somewhere // in the instrument/sample names and more characters // afterwards. The spec does not mention such a case. // Currently I just discard anything after a nil, but // e.g. VLC seems to interpret a nil as a space. I // don't know what is the proper behaviour. for(unsigned short i = 0; i < instrumentCount; ++ i) { seek(192L + length + (static_cast<long>(i) << 2)); READ_U32L_AS(instrumentOffset); seek(instrumentOffset); ByteVector instrumentMagic = readBlock(4); READ_ASSERT(instrumentMagic == "IMPI"); READ_STRING_AS(dosFileName, 13); seek(15, Current); READ_STRING_AS(instrumentName, 26); comment.append(instrumentName); } for(unsigned short i = 0; i < sampleCount; ++ i) { seek(192L + length + (static_cast<long>(instrumentCount) << 2) + (static_cast<long>(i) << 2)); READ_U32L_AS(sampleOffset); seek(sampleOffset); ByteVector sampleMagic = readBlock(4); READ_ASSERT(sampleMagic == "IMPS"); READ_STRING_AS(dosFileName, 13); READ_BYTE_AS(globalVolume); READ_BYTE_AS(sampleFlags); READ_BYTE_AS(sampleVolume); READ_STRING_AS(sampleName, 26); /* READ_BYTE_AS(sampleCvt); READ_BYTE_AS(samplePanning); READ_U32L_AS(sampleLength); READ_U32L_AS(loopStart); READ_U32L_AS(loopStop); READ_U32L_AS(c5speed); READ_U32L_AS(sustainLoopStart); READ_U32L_AS(sustainLoopEnd); READ_U32L_AS(sampleDataOffset); READ_BYTE_AS(vibratoSpeed); READ_BYTE_AS(vibratoDepth); READ_BYTE_AS(vibratoRate); READ_BYTE_AS(vibratoType); */ comment.append(sampleName); } if(message.size() > 0) comment.append(message); d->tag.setComment(comment.toString("\n")); d->tag.setTrackerName("Impulse Tracker"); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/it/itfile.h��������������������������������������������������������������������0000664�0000000�0000000�00000007447�14447736377�0016404�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301 USA * ***************************************************************************/ #ifndef TAGLIB_ITFILE_H #define TAGLIB_ITFILE_H #include "tfile.h" #include "audioproperties.h" #include "taglib_export.h" #include "modfilebase.h" #include "modtag.h" #include "itproperties.h" namespace TagLib { namespace IT { class TAGLIB_EXPORT File : public Mod::FileBase { public: /*! * Constructs a Impulse Tracker file from \a file. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. */ File(FileName file, bool readProperties = true, AudioProperties::ReadStyle propertiesStyle = AudioProperties::Average); /*! * Constructs a Impulse Tracker file from \a stream. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. */ File(IOStream *stream, bool readProperties = true, AudioProperties::ReadStyle propertiesStyle = AudioProperties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); Mod::Tag *tag() const; /*! * Forwards to Mod::Tag::properties(). * BIC: will be removed once File::toDict() is made virtual */ PropertyMap properties() const; /*! * Forwards to Mod::Tag::setProperties(). * BIC: will be removed once File::setProperties() is made virtual */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the IT::Properties for this file. If no audio properties * were read then this will return a null pointer. */ IT::Properties *audioProperties() const; /*! * Save the file. * This is the same as calling save(AllTags); * * \note Saving Impulse Tracker tags is not supported. */ bool save(); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace IT } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/it/itproperties.cpp������������������������������������������������������������0000664�0000000�0000000�00000013365�14447736377�0020210�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright :(C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "itproperties.h" using namespace TagLib; using namespace IT; class IT::Properties::PropertiesPrivate { public: PropertiesPrivate() : channels(0), lengthInPatterns(0), instrumentCount(0), sampleCount(0), patternCount(0), version(0), compatibleVersion(0), flags(0), special(0), globalVolume(0), mixVolume(0), tempo(0), bpmSpeed(0), panningSeparation(0), pitchWheelDepth(0) { } int channels; unsigned short lengthInPatterns; unsigned short instrumentCount; unsigned short sampleCount; unsigned short patternCount; unsigned short version; unsigned short compatibleVersion; unsigned short flags; unsigned short special; unsigned char globalVolume; unsigned char mixVolume; unsigned char tempo; unsigned char bpmSpeed; unsigned char panningSeparation; unsigned char pitchWheelDepth; }; IT::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : AudioProperties(propertiesStyle), d(new PropertiesPrivate()) { } IT::Properties::~Properties() { delete d; } int IT::Properties::length() const { return 0; } int IT::Properties::lengthInSeconds() const { return 0; } int IT::Properties::lengthInMilliseconds() const { return 0; } int IT::Properties::bitrate() const { return 0; } int IT::Properties::sampleRate() const { return 0; } int IT::Properties::channels() const { return d->channels; } unsigned short IT::Properties::lengthInPatterns() const { return d->lengthInPatterns; } bool IT::Properties::stereo() const { return d->flags & Stereo; } unsigned short IT::Properties::instrumentCount() const { return d->instrumentCount; } unsigned short IT::Properties::sampleCount() const { return d->sampleCount; } unsigned short IT::Properties::patternCount() const { return d->patternCount; } unsigned short IT::Properties::version() const { return d->version; } unsigned short IT::Properties::compatibleVersion() const { return d->compatibleVersion; } unsigned short IT::Properties::flags() const { return d->flags; } unsigned short IT::Properties::special() const { return d->special; } unsigned char IT::Properties::globalVolume() const { return d->globalVolume; } unsigned char IT::Properties::mixVolume() const { return d->mixVolume; } unsigned char IT::Properties::tempo() const { return d->tempo; } unsigned char IT::Properties::bpmSpeed() const { return d->bpmSpeed; } unsigned char IT::Properties::panningSeparation() const { return d->panningSeparation; } unsigned char IT::Properties::pitchWheelDepth() const { return d->pitchWheelDepth; } void IT::Properties::setChannels(int channels) { d->channels = channels; } void IT::Properties::setLengthInPatterns(unsigned short lengthInPatterns) { d->lengthInPatterns = lengthInPatterns; } void IT::Properties::setInstrumentCount(unsigned short instrumentCount) { d->instrumentCount = instrumentCount; } void IT::Properties::setSampleCount(unsigned short sampleCount) { d->sampleCount = sampleCount; } void IT::Properties::setPatternCount(unsigned short patternCount) { d->patternCount = patternCount; } void IT::Properties::setFlags(unsigned short flags) { d->flags = flags; } void IT::Properties::setSpecial(unsigned short special) { d->special = special; } void IT::Properties::setCompatibleVersion(unsigned short compatibleVersion) { d->compatibleVersion = compatibleVersion; } void IT::Properties::setVersion(unsigned short version) { d->version = version; } void IT::Properties::setGlobalVolume(unsigned char globalVolume) { d->globalVolume = globalVolume; } void IT::Properties::setMixVolume(unsigned char mixVolume) { d->mixVolume = mixVolume; } void IT::Properties::setTempo(unsigned char tempo) { d->tempo = tempo; } void IT::Properties::setBpmSpeed(unsigned char bpmSpeed) { d->bpmSpeed = bpmSpeed; } void IT::Properties::setPanningSeparation(unsigned char panningSeparation) { d->panningSeparation = panningSeparation; } void IT::Properties::setPitchWheelDepth(unsigned char pitchWheelDepth) { d->pitchWheelDepth = pitchWheelDepth; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/it/itproperties.h��������������������������������������������������������������0000664�0000000�0000000�00000010720�14447736377�0017645�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ITPROPERTIES_H #define TAGLIB_ITPROPERTIES_H #include "taglib.h" #include "audioproperties.h" namespace TagLib { namespace IT { class TAGLIB_EXPORT Properties : public AudioProperties { friend class File; public: /*! Flag bits. */ enum { Stereo = 1, Vol0MixOptimizations = 2, UseInstruments = 4, LinearSlides = 8, OldEffects = 16, LinkEffects = 32, UseMidiPitchController = 64, RequestEmbeddedMidiConf = 128 }; /*! Special bits. */ enum { MessageAttached = 1, MidiConfEmbedded = 8 }; Properties(AudioProperties::ReadStyle propertiesStyle); virtual ~Properties(); int length() const; int lengthInSeconds() const; int lengthInMilliseconds() const; int bitrate() const; int sampleRate() const; int channels() const; unsigned short lengthInPatterns() const; bool stereo() const; unsigned short instrumentCount() const; unsigned short sampleCount() const; unsigned short patternCount() const; unsigned short version() const; unsigned short compatibleVersion() const; unsigned short flags() const; unsigned short special() const; unsigned char globalVolume() const; unsigned char mixVolume() const; unsigned char tempo() const; unsigned char bpmSpeed() const; unsigned char panningSeparation() const; unsigned char pitchWheelDepth() const; void setChannels(int channels); void setLengthInPatterns(unsigned short lengthInPatterns); void setInstrumentCount(unsigned short instrumentCount); void setSampleCount (unsigned short sampleCount); void setPatternCount(unsigned short patternCount); void setVersion (unsigned short version); void setCompatibleVersion(unsigned short compatibleVersion); void setFlags (unsigned short flags); void setSpecial (unsigned short special); void setGlobalVolume(unsigned char globalVolume); void setMixVolume (unsigned char mixVolume); void setTempo (unsigned char tempo); void setBpmSpeed (unsigned char bpmSpeed); void setPanningSeparation(unsigned char panningSeparation); void setPitchWheelDepth (unsigned char pitchWheelDepth); private: Properties(const Properties&); Properties &operator=(const Properties&); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace IT } // namespace TagLib #endif ������������������������������������������������taglib-1.13.1/taglib/mod/���������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015106�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mod/modfile.cpp����������������������������������������������������������������0000664�0000000�0000000�00000013131�14447736377�0017230�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "modfile.h" #include "tstringlist.h" #include "tdebug.h" #include "modfileprivate.h" #include "tpropertymap.h" using namespace TagLib; using namespace Mod; class Mod::File::FilePrivate { public: FilePrivate(AudioProperties::ReadStyle propertiesStyle) : properties(propertiesStyle) { } Mod::Tag tag; Mod::Properties properties; }; Mod::File::File(FileName file, bool readProperties, AudioProperties::ReadStyle propertiesStyle) : Mod::FileBase(file), d(new FilePrivate(propertiesStyle)) { if(isOpen()) read(readProperties); } Mod::File::File(IOStream *stream, bool readProperties, AudioProperties::ReadStyle propertiesStyle) : Mod::FileBase(stream), d(new FilePrivate(propertiesStyle)) { if(isOpen()) read(readProperties); } Mod::File::~File() { delete d; } Mod::Tag *Mod::File::tag() const { return &d->tag; } Mod::Properties *Mod::File::audioProperties() const { return &d->properties; } PropertyMap Mod::File::properties() const { return d->tag.properties(); } PropertyMap Mod::File::setProperties(const PropertyMap &properties) { return d->tag.setProperties(properties); } bool Mod::File::save() { if(readOnly()) { debug("Mod::File::save() - Cannot save to a read only file."); return false; } seek(0); writeString(d->tag.title(), 20); StringList lines = d->tag.comment().split("\n"); unsigned int n = std::min(lines.size(), d->properties.instrumentCount()); for(unsigned int i = 0; i < n; ++ i) { writeString(lines[i], 22); seek(8, Current); } for(unsigned int i = n; i < d->properties.instrumentCount(); ++ i) { writeString(String(), 22); seek(8, Current); } return true; } void Mod::File::read(bool) { if(!isOpen()) return; seek(1080); ByteVector modId = readBlock(4); READ_ASSERT(modId.size() == 4); int channels = 4; unsigned int instruments = 31; if(modId == "M.K." || modId == "M!K!" || modId == "M&K!" || modId == "N.T.") { d->tag.setTrackerName("ProTracker"); channels = 4; } else if(modId.startsWith("FLT") || modId.startsWith("TDZ")) { d->tag.setTrackerName("StarTrekker"); char digit = modId[3]; READ_ASSERT(digit >= '0' && digit <= '9'); channels = digit - '0'; } else if(modId.endsWith("CHN")) { d->tag.setTrackerName("StarTrekker"); char digit = modId[0]; READ_ASSERT(digit >= '0' && digit <= '9'); channels = digit - '0'; } else if(modId == "CD81" || modId == "OKTA") { d->tag.setTrackerName("Atari Oktalyzer"); channels = 8; } else if(modId.endsWith("CH") || modId.endsWith("CN")) { d->tag.setTrackerName("TakeTracker"); char digit = modId[0]; READ_ASSERT(digit >= '0' && digit <= '9'); channels = (digit - '0') * 10; digit = modId[1]; READ_ASSERT(digit >= '0' && digit <= '9'); channels += digit - '0'; } else { // Not sure if this is correct. I'd need a file // created with NoiseTracker to check this. d->tag.setTrackerName("NoiseTracker"); // probably channels = 4; instruments = 15; } d->properties.setChannels(channels); d->properties.setInstrumentCount(instruments); seek(0); READ_STRING(d->tag.setTitle, 20); StringList comment; for(unsigned int i = 0; i < instruments; ++ i) { READ_STRING_AS(instrumentName, 22); // value in words, * 2 (<< 1) for bytes: READ_U16B_AS(sampleLength); READ_BYTE_AS(fineTuneByte); int fineTune = fineTuneByte & 0xF; // > 7 means negative value if(fineTune > 7) fineTune -= 16; READ_BYTE_AS(volume); if(volume > 64) volume = 64; // volume in decibels: 20 * log10(volume / 64) // value in words, * 2 (<< 1) for bytes: READ_U16B_AS(repeatStart); // value in words, * 2 (<< 1) for bytes: READ_U16B_AS(repatLength); comment.append(instrumentName); } READ_BYTE(d->properties.setLengthInPatterns); d->tag.setComment(comment.toString("\n")); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mod/modfile.h������������������������������������������������������������������0000664�0000000�0000000�00000007753�14447736377�0016712�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MODFILE_H #define TAGLIB_MODFILE_H #include "tfile.h" #include "audioproperties.h" #include "taglib_export.h" #include "modfilebase.h" #include "modtag.h" #include "modproperties.h" namespace TagLib { namespace Mod { class TAGLIB_EXPORT File : public TagLib::Mod::FileBase { public: /*! * Constructs a Protracker file from \a file. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. */ File(FileName file, bool readProperties = true, AudioProperties::ReadStyle propertiesStyle = AudioProperties::Average); /*! * Constructs a Protracker file from \a stream. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. */ File(IOStream *stream, bool readProperties = true, AudioProperties::ReadStyle propertiesStyle = AudioProperties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); Mod::Tag *tag() const; /*! * Implements the unified property interface -- export function. * Forwards to Mod::Tag::properties(). */ PropertyMap properties() const; /*! * Implements the unified property interface -- import function. * Forwards to Mod::Tag::setProperties(). */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the Mod::Properties for this file. If no audio properties * were read then this will return a null pointer. */ Mod::Properties *audioProperties() const; /*! * Save the file. * This is the same as calling save(AllTags); * * \note Saving Protracker tags is not supported. */ bool save(); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace Mod } // namespace TagLib #endif ���������������������taglib-1.13.1/taglib/mod/modfilebase.cpp������������������������������������������������������������0000664�0000000�0000000�00000007360�14447736377�0020072�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tdebug.h" #include "modfilebase.h" using namespace TagLib; using namespace Mod; Mod::FileBase::FileBase(FileName file) : TagLib::File(file) { } Mod::FileBase::FileBase(IOStream *stream) : TagLib::File(stream) { } void Mod::FileBase::writeString(const String &s, unsigned long size, char padding) { ByteVector data(s.data(String::Latin1)); data.resize(size, padding); writeBlock(data); } bool Mod::FileBase::readString(String &s, unsigned long size) { ByteVector data(readBlock(size)); if(data.size() < size) return false; int index = data.find(static_cast<char>(0)); if(index > -1) { data.resize(index); } data.replace('\xff', ' '); s = data; return true; } void Mod::FileBase::writeByte(unsigned char byte) { ByteVector data(1, byte); writeBlock(data); } void Mod::FileBase::writeU16L(unsigned short number) { writeBlock(ByteVector::fromShort(number, false)); } void Mod::FileBase::writeU32L(unsigned long number) { writeBlock(ByteVector::fromUInt(number, false)); } void Mod::FileBase::writeU16B(unsigned short number) { writeBlock(ByteVector::fromShort(number, true)); } void Mod::FileBase::writeU32B(unsigned long number) { writeBlock(ByteVector::fromUInt(number, true)); } bool Mod::FileBase::readByte(unsigned char &byte) { ByteVector data(readBlock(1)); if(data.size() < 1) return false; byte = data[0]; return true; } bool Mod::FileBase::readU16L(unsigned short &number) { ByteVector data(readBlock(2)); if(data.size() < 2) return false; number = data.toUShort(false); return true; } bool Mod::FileBase::readU32L(unsigned long &number) { ByteVector data(readBlock(4)); if(data.size() < 4) return false; number = data.toUInt(false); return true; } bool Mod::FileBase::readU16B(unsigned short &number) { ByteVector data(readBlock(2)); if(data.size() < 2) return false; number = data.toUShort(true); return true; } bool Mod::FileBase::readU32B(unsigned long &number) { ByteVector data(readBlock(4)); if(data.size() < 4) return false; number = data.toUInt(true); return true; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mod/modfilebase.h��������������������������������������������������������������0000664�0000000�0000000�00000005257�14447736377�0017542�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MODFILEBASE_H #define TAGLIB_MODFILEBASE_H #include "taglib.h" #include "tfile.h" #include "tstring.h" #include "tlist.h" #include "taglib_export.h" #include <algorithm> namespace TagLib { namespace Mod { class TAGLIB_EXPORT FileBase : public TagLib::File { protected: FileBase(FileName file); FileBase(IOStream *stream); void writeString(const String &s, unsigned long size, char padding = 0); void writeByte(unsigned char byte); void writeU16L(unsigned short number); void writeU32L(unsigned long number); void writeU16B(unsigned short number); void writeU32B(unsigned long number); bool readString(String &s, unsigned long size); bool readByte(unsigned char &byte); bool readU16L(unsigned short &number); bool readU32L(unsigned long &number); bool readU16B(unsigned short &number); bool readU32B(unsigned long &number); }; } // namespace Mod } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mod/modfileprivate.h�����������������������������������������������������������0000664�0000000�0000000�00000005220�14447736377�0020270�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * * MA 02110-1301 USA * ***************************************************************************/ #ifndef TAGLIB_MODFILEPRIVATE_H #define TAGLIB_MODFILEPRIVATE_H // some helper-macros only used internally by (s3m|it|xm)file.cpp #define READ_ASSERT(cond) \ if(!(cond)) \ { \ setValid(false); \ return; \ } #define READ(setter,type,read) \ { \ type number; \ READ_ASSERT(read(number)); \ setter(number); \ } #define READ_BYTE(setter) READ(setter,unsigned char,readByte) #define READ_U16L(setter) READ(setter,unsigned short,readU16L) #define READ_U32L(setter) READ(setter,unsigned long,readU32L) #define READ_U16B(setter) READ(setter,unsigned short,readU16B) #define READ_U32B(setter) READ(setter,unsigned long,readU32B) #define READ_STRING(setter,size) \ { \ String s; \ READ_ASSERT(readString(s, size)); \ setter(s); \ } #define READ_AS(type,name,read) \ type name = 0; \ READ_ASSERT(read(name)); #define READ_BYTE_AS(name) READ_AS(unsigned char,name,readByte) #define READ_U16L_AS(name) READ_AS(unsigned short,name,readU16L) #define READ_U32L_AS(name) READ_AS(unsigned long,name,readU32L) #define READ_U16B_AS(name) READ_AS(unsigned short,name,readU16B) #define READ_U32B_AS(name) READ_AS(unsigned long,name,readU32B) #define READ_STRING_AS(name,size) \ String name; \ READ_ASSERT(readString(name, size)); #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mod/modproperties.cpp����������������������������������������������������������0000664�0000000�0000000�00000006034�14447736377�0020511�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "modproperties.h" using namespace TagLib; using namespace Mod; class Mod::Properties::PropertiesPrivate { public: PropertiesPrivate() : channels(0), instrumentCount(0), lengthInPatterns(0) { } int channels; unsigned int instrumentCount; unsigned char lengthInPatterns; }; Mod::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : AudioProperties(propertiesStyle), d(new PropertiesPrivate()) { } Mod::Properties::~Properties() { delete d; } int Mod::Properties::length() const { return 0; } int Mod::Properties::lengthInSeconds() const { return 0; } int Mod::Properties::lengthInMilliseconds() const { return 0; } int Mod::Properties::bitrate() const { return 0; } int Mod::Properties::sampleRate() const { return 0; } int Mod::Properties::channels() const { return d->channels; } unsigned int Mod::Properties::instrumentCount() const { return d->instrumentCount; } unsigned char Mod::Properties::lengthInPatterns() const { return d->lengthInPatterns; } void Mod::Properties::setChannels(int channels) { d->channels = channels; } void Mod::Properties::setInstrumentCount(unsigned int instrumentCount) { d->instrumentCount = instrumentCount; } void Mod::Properties::setLengthInPatterns(unsigned char lengthInPatterns) { d->lengthInPatterns = lengthInPatterns; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mod/modproperties.h������������������������������������������������������������0000664�0000000�0000000�00000005351�14447736377�0020157�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MODPROPERTIES_H #define TAGLIB_MODPROPERTIES_H #include "taglib.h" #include "audioproperties.h" namespace TagLib { namespace Mod { class TAGLIB_EXPORT Properties : public AudioProperties { public: Properties(AudioProperties::ReadStyle propertiesStyle); virtual ~Properties(); int length() const; int lengthInSeconds() const; int lengthInMilliseconds() const; int bitrate() const; int sampleRate() const; int channels() const; unsigned int instrumentCount() const; unsigned char lengthInPatterns() const; void setChannels(int channels); void setInstrumentCount(unsigned int sampleCount); void setLengthInPatterns(unsigned char lengthInPatterns); private: friend class File; Properties(const Properties&); Properties &operator=(const Properties&); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace Mod } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mod/modtag.cpp�����������������������������������������������������������������0000664�0000000�0000000�00000010252�14447736377�0017065�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "modtag.h" #include "tstringlist.h" #include "tpropertymap.h" using namespace TagLib; using namespace Mod; class Mod::Tag::TagPrivate { public: TagPrivate() { } String title; String comment; String trackerName; }; Mod::Tag::Tag() : d(new TagPrivate()) { } Mod::Tag::~Tag() { delete d; } String Mod::Tag::title() const { return d->title; } String Mod::Tag::artist() const { return String(); } String Mod::Tag::album() const { return String(); } String Mod::Tag::comment() const { return d->comment; } String Mod::Tag::genre() const { return String(); } unsigned int Mod::Tag::year() const { return 0; } unsigned int Mod::Tag::track() const { return 0; } String Mod::Tag::trackerName() const { return d->trackerName; } void Mod::Tag::setTitle(const String &title) { d->title = title; } void Mod::Tag::setArtist(const String &) { } void Mod::Tag::setAlbum(const String &) { } void Mod::Tag::setComment(const String &comment) { d->comment = comment; } void Mod::Tag::setGenre(const String &) { } void Mod::Tag::setYear(unsigned int) { } void Mod::Tag::setTrack(unsigned int) { } void Mod::Tag::setTrackerName(const String &trackerName) { d->trackerName = trackerName; } PropertyMap Mod::Tag::properties() const { PropertyMap properties; properties["TITLE"] = d->title; properties["COMMENT"] = d->comment; if(!(d->trackerName.isEmpty())) properties["TRACKERNAME"] = d->trackerName; return properties; } PropertyMap Mod::Tag::setProperties(const PropertyMap &origProps) { PropertyMap properties(origProps); properties.removeEmpty(); StringList oneValueSet; if(properties.contains("TITLE")) { d->title = properties["TITLE"].front(); oneValueSet.append("TITLE"); } else d->title.clear(); if(properties.contains("COMMENT")) { d->comment = properties["COMMENT"].front(); oneValueSet.append("COMMENT"); } else d->comment.clear(); if(properties.contains("TRACKERNAME")) { d->trackerName = properties["TRACKERNAME"].front(); oneValueSet.append("TRACKERNAME"); } else d->trackerName.clear(); // for each tag that has been set above, remove the first entry in the corresponding // value list. The others will be returned as unsupported by this format. for(StringList::ConstIterator it = oneValueSet.begin(); it != oneValueSet.end(); ++it) { if(properties[*it].size() == 1) properties.erase(*it); else properties[*it].erase( properties[*it].begin() ); } return properties; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mod/modtag.h�������������������������������������������������������������������0000664�0000000�0000000�00000015721�14447736377�0016540�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MODTAG_H #define TAGLIB_MODTAG_H #include "tag.h" namespace TagLib { namespace Mod { /*! * Tags for module files (Mod, S3M, IT, XM). * * Note that only the \a title is supported as such by most * module file formats. Except for XM files the \a trackerName * is derived from the file format or the flavour of the file * format. For XM files it is stored in the file. * * The \a comment tag is not strictly supported by module files, * but it is common practice to abuse instrument/sample/pattern * names as multiline comments. TagLib does so as well. */ class TAGLIB_EXPORT Tag : public TagLib::Tag { public: Tag(); virtual ~Tag(); /*! * Returns the track name; if no track name is present in the tag * String::null will be returned. */ virtual String title() const; /*! * Not supported by module files. Therefore always returns String::null. */ virtual String artist() const; /*! * Not supported by module files. Therefore always returns String::null. */ virtual String album() const; /*! * Returns the track comment derived from the instrument/sample/pattern * names; if no comment is present in the tag String::null will be * returned. */ virtual String comment() const; /*! * Not supported by module files. Therefore always returns String::null. */ virtual String genre() const; /*! * Not supported by module files. Therefore always returns 0. */ virtual unsigned int year() const; /*! * Not supported by module files. Therefore always returns 0. */ virtual unsigned int track() const; /*! * Returns the name of the tracker used to create/edit the module file. * Only XM files store this tag to the file as such, for other formats * (Mod, S3M, IT) this is derived from the file type or the flavour of * the file type. Therefore only XM files might have an empty * (String::null) tracker name. */ String trackerName() const; /*! * Sets the title to \a title. If \a title is String::null then this * value will be cleared. * * The length limits per file type are (1 character = 1 byte): * Mod 20 characters, S3M 27 characters, IT 25 characters and XM 20 * characters. */ virtual void setTitle(const String &title); /*! * Not supported by module files and therefore ignored. */ virtual void setArtist(const String &artist); /*! * Not supported by module files and therefore ignored. */ virtual void setAlbum(const String &album); /*! * Sets the comment to \a comment. If \a comment is String::null then * this value will be cleared. * * Note that module file formats don't actually support a comment tag. * Instead the names of instruments/patterns/samples are abused as * a multiline comment. Because of this the number of lines in a * module file is fixed to the number of instruments/patterns/samples. * * Also note that the instrument/pattern/sample name length is limited * an thus the line length in comments are limited. Too big comments * will be truncated. * * The line length limits per file type are (1 character = 1 byte): * Mod 22 characters, S3M 27 characters, IT 25 characters and XM 22 * characters. */ virtual void setComment(const String &comment); /*! * Not supported by module files and therefore ignored. */ virtual void setGenre(const String &genre); /*! * Not supported by module files and therefore ignored. */ virtual void setYear(unsigned int year); /*! * Not supported by module files and therefore ignored. */ virtual void setTrack(unsigned int track); /*! * Sets the tracker name to \a trackerName. If \a trackerName is * String::null then this value will be cleared. * * Note that only XM files support this tag. Setting the * tracker name for other module file formats will be ignored. * * The length of this tag is limited to 20 characters (1 character * = 1 byte). */ void setTrackerName(const String &trackerName); /*! * Implements the unified property interface -- export function. * Since the module tag is very limited, the exported map is as well. */ PropertyMap properties() const; /*! * Implements the unified property interface -- import function. * Because of the limitations of the module file tag, any tags besides * COMMENT, TITLE and, if it is an XM file, TRACKERNAME, will be * returned. Additionally, if the map contains tags with multiple values, * all but the first will be contained in the returned map of unsupported * properties. */ PropertyMap setProperties(const PropertyMap &); private: Tag(const Tag &); Tag &operator=(const Tag &); class TagPrivate; TagPrivate *d; }; } // namespace Mod } // namespace TagLib #endif �����������������������������������������������taglib-1.13.1/taglib/mp4/���������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015027�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4atom.cpp����������������������������������������������������������������0000664�0000000�0000000�00000014745�14447736377�0017127�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <climits> #include <tdebug.h> #include <tstring.h> #include "mp4atom.h" using namespace TagLib; const char *const MP4::Atom::containers[11] = { "moov", "udta", "mdia", "meta", "ilst", "stbl", "minf", "moof", "traf", "trak", "stsd" }; MP4::Atom::Atom(File *file) : offset(file->tell()) { children.setAutoDelete(true); ByteVector header = file->readBlock(8); if(header.size() != 8) { // The atom header must be 8 bytes long, otherwise there is either // trailing garbage or the file is truncated debug("MP4: Couldn't read 8 bytes of data for atom header"); length = 0; file->seek(0, File::End); return; } length = header.toUInt(); if(length == 0) { // The last atom which extends to the end of the file. length = file->length() - offset; } else if(length == 1) { // The atom has a 64-bit length. const long long longLength = file->readBlock(8).toLongLong(); if(longLength <= LONG_MAX) { // The actual length fits in long. That's always the case if long is 64-bit. length = static_cast<long>(longLength); } else { debug("MP4: 64-bit atoms are not supported"); length = 0; file->seek(0, File::End); return; } } if(length < 8 || length > file->length() - offset) { debug("MP4: Invalid atom size"); length = 0; file->seek(0, File::End); return; } name = header.mid(4, 4); for(int i = 0; i < 4; ++i) { const char ch = name.at(i); if((ch < ' ' || ch > '~') && ch != '\251') { debug("MP4: Invalid atom type"); length = 0; file->seek(0, File::End); } } for(int i = 0; i < numContainers; i++) { if(name == containers[i]) { if(name == "meta") { long posAfterMeta = file->tell(); ByteVector nextSize = file->readBlock(8).mid(4, 4); static const char *const metaChildrenNames[] = { "hdlr", "ilst", "mhdr", "ctry", "lang" }; bool metaIsFullAtom = true; for(size_t j = 0; j < sizeof(metaChildrenNames) / sizeof(metaChildrenNames[0]); ++j) { if(nextSize == metaChildrenNames[j]) { // meta is not a full atom (i.e. not followed by version, flags). It // is followed by the size and type of the first child atom. metaIsFullAtom = false; break; } } // Only skip next four bytes, which contain version and flags, if meta // is a full atom. file->seek(posAfterMeta + (metaIsFullAtom ? 4 : 0)); } else if(name == "stsd") { file->seek(8, File::Current); } while(file->tell() < offset + length) { MP4::Atom *child = new MP4::Atom(file); children.append(child); if(child->length == 0) return; } return; } } file->seek(offset + length); } MP4::Atom::~Atom() { } MP4::Atom * MP4::Atom::find(const char *name1, const char *name2, const char *name3, const char *name4) { if(name1 == 0) { return this; } for(AtomList::ConstIterator it = children.begin(); it != children.end(); ++it) { if((*it)->name == name1) { return (*it)->find(name2, name3, name4); } } return 0; } MP4::AtomList MP4::Atom::findall(const char *name, bool recursive) { MP4::AtomList result; for(AtomList::ConstIterator it = children.begin(); it != children.end(); ++it) { if((*it)->name == name) { result.append(*it); } if(recursive) { result.append((*it)->findall(name, recursive)); } } return result; } bool MP4::Atom::path(MP4::AtomList &path, const char *name1, const char *name2, const char *name3) { path.append(this); if(name1 == 0) { return true; } for(AtomList::ConstIterator it = children.begin(); it != children.end(); ++it) { if((*it)->name == name1) { return (*it)->path(path, name2, name3); } } return false; } MP4::Atoms::Atoms(File *file) { atoms.setAutoDelete(true); file->seek(0, File::End); long end = file->tell(); file->seek(0); while(file->tell() + 8 <= end) { MP4::Atom *atom = new MP4::Atom(file); atoms.append(atom); if (atom->length == 0) break; } } MP4::Atoms::~Atoms() { } MP4::Atom * MP4::Atoms::find(const char *name1, const char *name2, const char *name3, const char *name4) { for(AtomList::ConstIterator it = atoms.begin(); it != atoms.end(); ++it) { if((*it)->name == name1) { return (*it)->find(name2, name3, name4); } } return 0; } MP4::AtomList MP4::Atoms::path(const char *name1, const char *name2, const char *name3, const char *name4) { MP4::AtomList path; for(AtomList::ConstIterator it = atoms.begin(); it != atoms.end(); ++it) { if((*it)->name == name1) { if(!(*it)->path(path, name2, name3, name4)) { path.clear(); } return path; } } return path; } ���������������������������taglib-1.13.1/taglib/mp4/mp4atom.h������������������������������������������������������������������0000664�0000000�0000000�00000011206�14447736377�0016561�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007,2011 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ // This file is not part of the public API! #ifndef DO_NOT_DOCUMENT #ifndef TAGLIB_MP4ATOM_H #define TAGLIB_MP4ATOM_H #include "tfile.h" #include "tlist.h" namespace TagLib { namespace MP4 { class Atom; typedef TagLib::List<Atom *> AtomList; enum AtomDataType { TypeImplicit = 0, // for use with tags for which no type needs to be indicated because only one type is allowed TypeUTF8 = 1, // without any count or null terminator TypeUTF16 = 2, // also known as UTF-16BE TypeSJIS = 3, // deprecated unless it is needed for special Japanese characters TypeHTML = 6, // the HTML file header specifies which HTML version TypeXML = 7, // the XML header must identify the DTD or schemas TypeUUID = 8, // also known as GUID; stored as 16 bytes in binary (valid as an ID) TypeISRC = 9, // stored as UTF-8 text (valid as an ID) TypeMI3P = 10, // stored as UTF-8 text (valid as an ID) TypeGIF = 12, // (deprecated) a GIF image TypeJPEG = 13, // a JPEG image TypePNG = 14, // a PNG image TypeURL = 15, // absolute, in UTF-8 characters TypeDuration = 16, // in milliseconds, 32-bit integer TypeDateTime = 17, // in UTC, counting seconds since midnight, January 1, 1904; 32 or 64-bits TypeGenred = 18, // a list of enumerated values TypeInteger = 21, // a signed big-endian integer with length one of { 1,2,3,4,8 } bytes TypeRIAAPA = 24, // RIAA parental advisory; { -1=no, 1=yes, 0=unspecified }, 8-bit integer TypeUPC = 25, // Universal Product Code, in text UTF-8 format (valid as an ID) TypeBMP = 27, // Windows bitmap image TypeUndefined = 255 // undefined }; struct AtomData { AtomData(AtomDataType type, ByteVector data) : type(type), locale(0), data(data) {} AtomDataType type; int locale; ByteVector data; }; typedef TagLib::List<AtomData> AtomDataList; class TAGLIB_EXPORT Atom { public: Atom(File *file); ~Atom(); Atom *find(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); bool path(AtomList &path, const char *name1, const char *name2 = 0, const char *name3 = 0); AtomList findall(const char *name, bool recursive = false); long offset; long length; TagLib::ByteVector name; AtomList children; private: static const int numContainers = 11; static const char *const containers[11]; }; //! Root-level atoms class TAGLIB_EXPORT Atoms { public: Atoms(File *file); ~Atoms(); Atom *find(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); AtomList path(const char *name1, const char *name2 = 0, const char *name3 = 0, const char *name4 = 0); AtomList atoms; }; } // namespace MP4 } // namespace TagLib #endif #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4coverart.cpp������������������������������������������������������������0000664�0000000�0000000�00000005364�14447736377�0020011�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2009 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <taglib.h> #include <tdebug.h> #include "trefcounter.h" #include "mp4coverart.h" using namespace TagLib; class MP4::CoverArt::CoverArtPrivate : public RefCounter { public: CoverArtPrivate() : format(MP4::CoverArt::JPEG) {} Format format; ByteVector data; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// MP4::CoverArt::CoverArt(Format format, const ByteVector &data) : d(new CoverArtPrivate()) { d->format = format; d->data = data; } MP4::CoverArt::CoverArt(const CoverArt &item) : d(item.d) { d->ref(); } MP4::CoverArt & MP4::CoverArt::operator=(const CoverArt &item) { CoverArt(item).swap(*this); return *this; } void MP4::CoverArt::swap(CoverArt &item) { using std::swap; swap(d, item.d); } MP4::CoverArt::~CoverArt() { if(d->deref()) { delete d; } } MP4::CoverArt::Format MP4::CoverArt::format() const { return d->format; } ByteVector MP4::CoverArt::data() const { return d->data; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4coverart.h��������������������������������������������������������������0000664�0000000�0000000�00000005443�14447736377�0017454�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2009 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MP4COVERART_H #define TAGLIB_MP4COVERART_H #include "tlist.h" #include "tbytevector.h" #include "taglib_export.h" #include "mp4atom.h" namespace TagLib { namespace MP4 { class TAGLIB_EXPORT CoverArt { public: /*! * This describes the image type. */ enum Format { JPEG = TypeJPEG, PNG = TypePNG, BMP = TypeBMP, GIF = TypeGIF, Unknown = TypeImplicit, }; CoverArt(Format format, const ByteVector &data); ~CoverArt(); CoverArt(const CoverArt &item); /*! * Copies the contents of \a item into this CoverArt. */ CoverArt &operator=(const CoverArt &item); /*! * Exchanges the content of the CoverArt by the content of \a item. */ void swap(CoverArt &item); //! Format of the image Format format() const; //! The image data ByteVector data() const; private: class CoverArtPrivate; CoverArtPrivate *d; }; typedef List<CoverArt> CoverArtList; } // namespace MP4 } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4file.cpp����������������������������������������������������������������0000664�0000000�0000000�00000011617�14447736377�0017101�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tstring.h> #include <tpropertymap.h> #include <tagutils.h> #include "mp4atom.h" #include "mp4tag.h" #include "mp4file.h" using namespace TagLib; namespace { bool checkValid(const MP4::AtomList &list) { for(MP4::AtomList::ConstIterator it = list.begin(); it != list.end(); ++it) { if((*it)->length == 0) return false; if(!checkValid((*it)->children)) return false; } return true; } } // namespace class MP4::File::FilePrivate { public: FilePrivate() : tag(0), atoms(0), properties(0) {} ~FilePrivate() { delete atoms; delete tag; delete properties; } MP4::Tag *tag; MP4::Atoms *atoms; MP4::Properties *properties; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool MP4::File::isSupported(IOStream *stream) { // An MP4 file has to have an "ftyp" box first. const ByteVector id = Utils::readHeader(stream, 8, false); return id.containsAt("ftyp", 4); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// MP4::File::File(FileName file, bool readProperties, AudioProperties::ReadStyle) : TagLib::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } MP4::File::File(IOStream *stream, bool readProperties, AudioProperties::ReadStyle) : TagLib::File(stream), d(new FilePrivate()) { if(isOpen()) read(readProperties); } MP4::File::~File() { delete d; } MP4::Tag * MP4::File::tag() const { return d->tag; } PropertyMap MP4::File::properties() const { return d->tag->properties(); } void MP4::File::removeUnsupportedProperties(const StringList &properties) { d->tag->removeUnsupportedProperties(properties); } PropertyMap MP4::File::setProperties(const PropertyMap &properties) { return d->tag->setProperties(properties); } MP4::Properties * MP4::File::audioProperties() const { return d->properties; } void MP4::File::read(bool readProperties) { if(!isValid()) return; d->atoms = new Atoms(this); if(!checkValid(d->atoms->atoms)) { setValid(false); return; } // must have a moov atom, otherwise consider it invalid if(!d->atoms->find("moov")) { setValid(false); return; } d->tag = new Tag(this, d->atoms); if(readProperties) { d->properties = new Properties(this, d->atoms); } } bool MP4::File::save() { if(readOnly()) { debug("MP4::File::save() -- File is read only."); return false; } if(!isValid()) { debug("MP4::File::save() -- Trying to save invalid file."); return false; } return d->tag->save(); } bool MP4::File::strip(int tags) { if(readOnly()) { debug("MP4::File::strip() - Cannot strip tags from a read only file."); return false; } if(!isValid()) { debug("MP4::File::strip() -- Cannot strip tags from an invalid file."); return false; } if(tags & MP4) { return d->tag->strip(); } return true; } bool MP4::File::hasMP4Tag() const { return (d->atoms->find("moov", "udta", "meta", "ilst") != 0); } �����������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4file.h������������������������������������������������������������������0000664�0000000�0000000�00000013176�14447736377�0016550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MP4FILE_H #define TAGLIB_MP4FILE_H #include "tag.h" #include "tfile.h" #include "taglib_export.h" #include "mp4properties.h" #include "mp4tag.h" namespace TagLib { //! An implementation of MP4 (AAC, ALAC, ...) metadata namespace MP4 { class Atoms; /*! * This implements and provides an interface for MP4 files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to MP4 files. */ class TAGLIB_EXPORT File : public TagLib::File { public: /*! * This set of flags is used for strip() and is suitable for * being OR-ed together. */ enum TagTypes { //! Empty set. Matches no tag types. NoTags = 0x0000, //! Matches MP4 tags. MP4 = 0x0001, //! Matches all tag types. AllTags = 0xffff }; /*! * Constructs an MP4 file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle audioPropertiesStyle = Properties::Average); /*! * Constructs an MP4 file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle audioPropertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns a pointer to the MP4 tag of the file. * * MP4::Tag implements the tag interface, so this serves as the * reimplementation of TagLib::File::tag(). * * \note The Tag <b>is still</b> owned by the MP4::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. */ Tag *tag() const; /*! * Implements the unified property interface -- export function. */ PropertyMap properties() const; /*! * Removes unsupported properties. Forwards to the actual Tag's * removeUnsupportedProperties() function. */ void removeUnsupportedProperties(const StringList &properties); /*! * Implements the unified property interface -- import function. */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the MP4 audio properties for this file. */ Properties *audioProperties() const; /*! * Save the file. * * This returns true if the save was successful. */ bool save(); /*! * This will strip the tags that match the OR-ed together TagTypes from the * file. By default it strips all tags. It returns true if the tags are * successfully stripped. * * \note This will update the file immediately. */ bool strip(int tags = AllTags); /*! * Returns whether or not the file on disk actually has an MP4 tag, or the * file has a Metadata Item List (ilst) atom. */ bool hasMP4Tag() const; /*! * Returns whether or not the given \a stream can be opened as an ASF * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace MP4 } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4item.cpp����������������������������������������������������������������0000664�0000000�0000000�00000010355�14447736377�0017116�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <taglib.h> #include <tdebug.h> #include "trefcounter.h" #include "mp4item.h" using namespace TagLib; class MP4::Item::ItemPrivate : public RefCounter { public: ItemPrivate() : valid(true), atomDataType(TypeUndefined) {} bool valid; AtomDataType atomDataType; union { bool m_bool; int m_int; IntPair m_intPair; unsigned char m_byte; unsigned int m_uint; long long m_longlong; }; StringList m_stringList; ByteVectorList m_byteVectorList; MP4::CoverArtList m_coverArtList; }; MP4::Item::Item() : d(new ItemPrivate()) { d->valid = false; } MP4::Item::Item(const Item &item) : d(item.d) { d->ref(); } MP4::Item & MP4::Item::operator=(const Item &item) { Item(item).swap(*this); return *this; } void MP4::Item::swap(Item &item) { using std::swap; swap(d, item.d); } MP4::Item::~Item() { if(d->deref()) delete d; } MP4::Item::Item(bool value) : d(new ItemPrivate()) { d->m_bool = value; } MP4::Item::Item(int value) : d(new ItemPrivate()) { d->m_int = value; } MP4::Item::Item(unsigned char value) : d(new ItemPrivate()) { d->m_byte = value; } MP4::Item::Item(unsigned int value) : d(new ItemPrivate()) { d->m_uint = value; } MP4::Item::Item(long long value) : d(new ItemPrivate()) { d->m_longlong = value; } MP4::Item::Item(int value1, int value2) : d(new ItemPrivate()) { d->m_intPair.first = value1; d->m_intPair.second = value2; } MP4::Item::Item(const ByteVectorList &value) : d(new ItemPrivate()) { d->m_byteVectorList = value; } MP4::Item::Item(const StringList &value) : d(new ItemPrivate()) { d->m_stringList = value; } MP4::Item::Item(const MP4::CoverArtList &value) : d(new ItemPrivate()) { d->m_coverArtList = value; } void MP4::Item::setAtomDataType(MP4::AtomDataType type) { d->atomDataType = type; } MP4::AtomDataType MP4::Item::atomDataType() const { return d->atomDataType; } bool MP4::Item::toBool() const { return d->m_bool; } int MP4::Item::toInt() const { return d->m_int; } unsigned char MP4::Item::toByte() const { return d->m_byte; } unsigned int MP4::Item::toUInt() const { return d->m_uint; } long long MP4::Item::toLongLong() const { return d->m_longlong; } MP4::Item::IntPair MP4::Item::toIntPair() const { return d->m_intPair; } StringList MP4::Item::toStringList() const { return d->m_stringList; } ByteVectorList MP4::Item::toByteVectorList() const { return d->m_byteVectorList; } MP4::CoverArtList MP4::Item::toCoverArtList() const { return d->m_coverArtList; } bool MP4::Item::isValid() const { return d->valid; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4item.h������������������������������������������������������������������0000664�0000000�0000000�00000006113�14447736377�0016560�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MP4ITEM_H #define TAGLIB_MP4ITEM_H #include "tstringlist.h" #include "mp4coverart.h" #include "taglib_export.h" namespace TagLib { namespace MP4 { class TAGLIB_EXPORT Item { public: struct IntPair { int first, second; }; Item(); Item(const Item &item); /*! * Copies the contents of \a item into this Item. */ Item &operator=(const Item &item); /*! * Exchanges the content of the Item by the content of \a item. */ void swap(Item &item); ~Item(); Item(int value); Item(unsigned char value); Item(unsigned int value); Item(long long value); Item(bool value); Item(int first, int second); Item(const StringList &value); Item(const ByteVectorList &value); Item(const CoverArtList &value); void setAtomDataType(AtomDataType type); AtomDataType atomDataType() const; int toInt() const; unsigned char toByte() const; unsigned int toUInt() const; long long toLongLong() const; bool toBool() const; IntPair toIntPair() const; StringList toStringList() const; ByteVectorList toByteVectorList() const; CoverArtList toCoverArtList() const; bool isValid() const; private: class ItemPrivate; ItemPrivate *d; }; } // namespace MP4 } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4properties.cpp����������������������������������������������������������0000664�0000000�0000000�00000016154�14447736377�0020357�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tstring.h> #include "mp4file.h" #include "mp4atom.h" #include "mp4properties.h" using namespace TagLib; namespace { // Calculate the total bytes used by audio data, used to calculate the bitrate long long calculateMdatLength(const MP4::AtomList &list) { long long totalLength = 0; for(MP4::AtomList::ConstIterator it = list.begin(); it != list.end(); ++it) { long length = (*it)->length; if(length == 0) return 0; // for safety, see checkValid() in mp4file.cpp if((*it)->name == "mdat") totalLength += length; totalLength += calculateMdatLength((*it)->children); } return totalLength; } } // namespace class MP4::Properties::PropertiesPrivate { public: PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), channels(0), bitsPerSample(0), encrypted(false), codec(MP4::Properties::Unknown) {} int length; int bitrate; int sampleRate; int channels; int bitsPerSample; bool encrypted; Codec codec; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// MP4::Properties::Properties(File *file, MP4::Atoms *atoms, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(file, atoms); } MP4::Properties::~Properties() { delete d; } int MP4::Properties::channels() const { return d->channels; } int MP4::Properties::sampleRate() const { return d->sampleRate; } int MP4::Properties::length() const { return lengthInSeconds(); } int MP4::Properties::lengthInSeconds() const { return d->length / 1000; } int MP4::Properties::lengthInMilliseconds() const { return d->length; } int MP4::Properties::bitrate() const { return d->bitrate; } int MP4::Properties::bitsPerSample() const { return d->bitsPerSample; } bool MP4::Properties::isEncrypted() const { return d->encrypted; } MP4::Properties::Codec MP4::Properties::codec() const { return d->codec; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void MP4::Properties::read(File *file, Atoms *atoms) { MP4::Atom *moov = atoms->find("moov"); if(!moov) { debug("MP4: Atom 'moov' not found"); return; } MP4::Atom *trak = 0; ByteVector data; const MP4::AtomList trakList = moov->findall("trak"); for(MP4::AtomList::ConstIterator it = trakList.begin(); it != trakList.end(); ++it) { trak = *it; MP4::Atom *hdlr = trak->find("mdia", "hdlr"); if(!hdlr) { debug("MP4: Atom 'trak.mdia.hdlr' not found"); return; } file->seek(hdlr->offset); data = file->readBlock(hdlr->length); if(data.containsAt("soun", 16)) { break; } trak = 0; } if(!trak) { debug("MP4: No audio tracks"); return; } MP4::Atom *mdhd = trak->find("mdia", "mdhd"); if(!mdhd) { debug("MP4: Atom 'trak.mdia.mdhd' not found"); return; } file->seek(mdhd->offset); data = file->readBlock(mdhd->length); const unsigned int version = data.at(8); long long unit; long long length; if(version == 1) { if(data.size() < 36 + 8) { debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected"); return; } unit = data.toUInt(28U); length = data.toLongLong(32U); } else { if(data.size() < 24 + 8) { debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected"); return; } unit = data.toUInt(20U); length = data.toUInt(24U); } if(unit > 0 && length > 0) d->length = static_cast<int>(length * 1000.0 / unit + 0.5); MP4::Atom *atom = trak->find("mdia", "minf", "stbl", "stsd"); if(!atom) { return; } file->seek(atom->offset); data = file->readBlock(atom->length); if(data.containsAt("mp4a", 20)) { d->codec = AAC; d->channels = data.toShort(40U); d->bitsPerSample = data.toShort(42U); d->sampleRate = data.toUInt(46U); if(data.containsAt("esds", 56) && data.at(64) == 0x03) { unsigned int pos = 65; if(data.containsAt("\x80\x80\x80", pos)) { pos += 3; } pos += 4; if(data.at(pos) == 0x04) { pos += 1; if(data.containsAt("\x80\x80\x80", pos)) { pos += 3; } pos += 10; const unsigned int bitrateValue = data.toUInt(pos); if(bitrateValue != 0 || d->length <= 0) { d->bitrate = static_cast<int>((bitrateValue + 500) / 1000.0 + 0.5); } else { d->bitrate = static_cast<int>( (calculateMdatLength(atoms->atoms) * 8) / d->length); } } } } else if(data.containsAt("alac", 20)) { if(atom->length == 88 && data.containsAt("alac", 56)) { d->codec = ALAC; d->bitsPerSample = data.at(69); d->channels = data.at(73); d->bitrate = static_cast<int>(data.toUInt(80U) / 1000.0 + 0.5); d->sampleRate = data.toUInt(84U); if(d->bitrate == 0 && d->length > 0) { // There are files which do not contain a nominal bitrate, e.g. those // generated by refalac64.exe. Calculate the bitrate from the audio // data size (mdat atoms) and the duration. d->bitrate = (calculateMdatLength(atoms->atoms) * 8) / d->length; } } } MP4::Atom *drms = atom->find("drms"); if(drms) { d->encrypted = true; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4properties.h������������������������������������������������������������0000664�0000000�0000000�00000007304�14447736377�0020021�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MP4PROPERTIES_H #define TAGLIB_MP4PROPERTIES_H #include "taglib_export.h" #include "audioproperties.h" namespace TagLib { namespace MP4 { class Atoms; class File; //! An implementation of MP4 audio properties class TAGLIB_EXPORT Properties : public AudioProperties { public: enum Codec { Unknown = 0, AAC, ALAC }; Properties(File *file, Atoms *atoms, ReadStyle style = Average); virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the number of bits per audio sample. */ virtual int bitsPerSample() const; /*! * Returns whether or not the file is encrypted. */ bool isEncrypted() const; /*! * Returns the codec used in the file. */ Codec codec() const; private: void read(File *file, Atoms *atoms); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace MP4 } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mp4/mp4tag.cpp�����������������������������������������������������������������0000664�0000000�0000000�00000076742�14447736377�0016747�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007,2011 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tstring.h> #include <tpropertymap.h> #include "mp4atom.h" #include "mp4tag.h" #include "id3v1genres.h" using namespace TagLib; class MP4::Tag::TagPrivate { public: TagPrivate() : file(0), atoms(0) {} TagLib::File *file; Atoms *atoms; ItemMap items; }; MP4::Tag::Tag() : d(new TagPrivate()) { } MP4::Tag::Tag(TagLib::File *file, MP4::Atoms *atoms) : d(new TagPrivate()) { d->file = file; d->atoms = atoms; MP4::Atom *ilst = atoms->find("moov", "udta", "meta", "ilst"); if(!ilst) { //debug("Atom moov.udta.meta.ilst not found."); return; } for(AtomList::ConstIterator it = ilst->children.begin(); it != ilst->children.end(); ++it) { MP4::Atom *atom = *it; file->seek(atom->offset + 8); if(atom->name == "----") { parseFreeForm(atom); } else if(atom->name == "trkn" || atom->name == "disk") { parseIntPair(atom); } else if(atom->name == "cpil" || atom->name == "pgap" || atom->name == "pcst" || atom->name == "hdvd" || atom->name == "shwm") { parseBool(atom); } else if(atom->name == "tmpo" || atom->name == "\251mvi" || atom->name == "\251mvc") { parseInt(atom); } else if(atom->name == "rate") { AtomDataList data = parseData2(atom); if(!data.isEmpty()) { AtomData val = data[0]; if (val.type == TypeUTF8) { addItem(atom->name, StringList(String(val.data, String::UTF8))); } else { addItem(atom->name, static_cast<int>(val.data.toShort())); } } } else if(atom->name == "tvsn" || atom->name == "tves" || atom->name == "cnID" || atom->name == "sfID" || atom->name == "atID" || atom->name == "geID" || atom->name == "cmID") { parseUInt(atom); } else if(atom->name == "plID") { parseLongLong(atom); } else if(atom->name == "stik" || atom->name == "rtng" || atom->name == "akID") { parseByte(atom); } else if(atom->name == "gnre") { parseGnre(atom); } else if(atom->name == "covr") { parseCovr(atom); } else if(atom->name == "purl" || atom->name == "egid") { parseText(atom, -1); } else { parseText(atom); } } } MP4::Tag::~Tag() { delete d; } MP4::AtomDataList MP4::Tag::parseData2(const MP4::Atom *atom, int expectedFlags, bool freeForm) { AtomDataList result; ByteVector data = d->file->readBlock(atom->length - 8); int i = 0; unsigned int pos = 0; while(pos < data.size()) { const int length = static_cast<int>(data.toUInt(pos)); if(length < 12) { debug("MP4: Too short atom"); return result; } const ByteVector name = data.mid(pos + 4, 4); const int flags = static_cast<int>(data.toUInt(pos + 8)); if(freeForm && i < 2) { if(i == 0 && name != "mean") { debug("MP4: Unexpected atom \"" + name + "\", expecting \"mean\""); return result; } if(i == 1 && name != "name") { debug("MP4: Unexpected atom \"" + name + "\", expecting \"name\""); return result; } result.append(AtomData(static_cast<AtomDataType>(flags), data.mid(pos + 12, length - 12))); } else { if(name != "data") { debug("MP4: Unexpected atom \"" + name + "\", expecting \"data\""); return result; } if(expectedFlags == -1 || flags == expectedFlags) { result.append(AtomData(static_cast<AtomDataType>(flags), data.mid(pos + 16, length - 16))); } } pos += length; i++; } return result; } ByteVectorList MP4::Tag::parseData(const MP4::Atom *atom, int expectedFlags, bool freeForm) { AtomDataList data = parseData2(atom, expectedFlags, freeForm); ByteVectorList result; for(AtomDataList::ConstIterator it = data.begin(); it != data.end(); ++it) { result.append(it->data); } return result; } void MP4::Tag::parseInt(const MP4::Atom *atom) { ByteVectorList data = parseData(atom); if(!data.isEmpty()) { addItem(atom->name, static_cast<int>(data[0].toShort())); } } void MP4::Tag::parseUInt(const MP4::Atom *atom) { ByteVectorList data = parseData(atom); if(!data.isEmpty()) { addItem(atom->name, data[0].toUInt()); } } void MP4::Tag::parseLongLong(const MP4::Atom *atom) { ByteVectorList data = parseData(atom); if(!data.isEmpty()) { addItem(atom->name, data[0].toLongLong()); } } void MP4::Tag::parseByte(const MP4::Atom *atom) { ByteVectorList data = parseData(atom); if(!data.isEmpty()) { addItem(atom->name, static_cast<unsigned char>(data[0].at(0))); } } void MP4::Tag::parseGnre(const MP4::Atom *atom) { ByteVectorList data = parseData(atom); if(!data.isEmpty()) { int idx = static_cast<int>(data[0].toShort()); if(idx > 0) { addItem("\251gen", StringList(ID3v1::genre(idx - 1))); } } } void MP4::Tag::parseIntPair(const MP4::Atom *atom) { ByteVectorList data = parseData(atom); if(!data.isEmpty()) { const int a = data[0].toShort(2U); const int b = data[0].toShort(4U); addItem(atom->name, MP4::Item(a, b)); } } void MP4::Tag::parseBool(const MP4::Atom *atom) { ByteVectorList data = parseData(atom); if(!data.isEmpty()) { bool value = data[0].size() ? data[0][0] != '\0' : false; addItem(atom->name, value); } } void MP4::Tag::parseText(const MP4::Atom *atom, int expectedFlags) { ByteVectorList data = parseData(atom, expectedFlags); if(!data.isEmpty()) { StringList value; for(ByteVectorList::ConstIterator it = data.begin(); it != data.end(); ++it) { value.append(String(*it, String::UTF8)); } addItem(atom->name, value); } } void MP4::Tag::parseFreeForm(const MP4::Atom *atom) { AtomDataList data = parseData2(atom, -1, true); if(data.size() > 2) { AtomDataList::ConstIterator itBegin = data.begin(); String name = "----:"; name += String((itBegin++)->data, String::UTF8); // data[0].data name += ':'; name += String((itBegin++)->data, String::UTF8); // data[1].data AtomDataType type = itBegin->type; // data[2].type for(AtomDataList::ConstIterator it = itBegin; it != data.end(); ++it) { if(it->type != type) { debug("MP4: We currently don't support values with multiple types"); break; } } if(type == TypeUTF8) { StringList value; for(AtomDataList::ConstIterator it = itBegin; it != data.end(); ++it) { value.append(String(it->data, String::UTF8)); } Item item(value); item.setAtomDataType(type); addItem(name, item); } else { ByteVectorList value; for(AtomDataList::ConstIterator it = itBegin; it != data.end(); ++it) { value.append(it->data); } Item item(value); item.setAtomDataType(type); addItem(name, item); } } } void MP4::Tag::parseCovr(const MP4::Atom *atom) { MP4::CoverArtList value; ByteVector data = d->file->readBlock(atom->length - 8); unsigned int pos = 0; while(pos < data.size()) { const int length = static_cast<int>(data.toUInt(pos)); if(length < 12) { debug("MP4: Too short atom"); break; } const ByteVector name = data.mid(pos + 4, 4); const int flags = static_cast<int>(data.toUInt(pos + 8)); if(name != "data") { debug("MP4: Unexpected atom \"" + name + "\", expecting \"data\""); break; } if(flags == TypeJPEG || flags == TypePNG || flags == TypeBMP || flags == TypeGIF || flags == TypeImplicit) { value.append(MP4::CoverArt(static_cast<MP4::CoverArt::Format>(flags), data.mid(pos + 16, length - 16))); } else { debug("MP4: Unknown covr format " + String::number(flags)); } pos += length; } if(!value.isEmpty()) addItem(atom->name, value); } ByteVector MP4::Tag::padIlst(const ByteVector &data, int length) const { if(length == -1) { length = ((data.size() + 1023) & ~1023) - data.size(); } return renderAtom("free", ByteVector(length, '\1')); } ByteVector MP4::Tag::renderAtom(const ByteVector &name, const ByteVector &data) const { return ByteVector::fromUInt(data.size() + 8) + name + data; } ByteVector MP4::Tag::renderData(const ByteVector &name, int flags, const ByteVectorList &data) const { ByteVector result; for(ByteVectorList::ConstIterator it = data.begin(); it != data.end(); ++it) { result.append(renderAtom("data", ByteVector::fromUInt(flags) + ByteVector(4, '\0') + *it)); } return renderAtom(name, result); } ByteVector MP4::Tag::renderBool(const ByteVector &name, const MP4::Item &item) const { ByteVectorList data; data.append(ByteVector(1, item.toBool() ? '\1' : '\0')); return renderData(name, TypeInteger, data); } ByteVector MP4::Tag::renderInt(const ByteVector &name, const MP4::Item &item) const { ByteVectorList data; data.append(ByteVector::fromShort(item.toInt())); return renderData(name, TypeInteger, data); } ByteVector MP4::Tag::renderUInt(const ByteVector &name, const MP4::Item &item) const { ByteVectorList data; data.append(ByteVector::fromUInt(item.toUInt())); return renderData(name, TypeInteger, data); } ByteVector MP4::Tag::renderLongLong(const ByteVector &name, const MP4::Item &item) const { ByteVectorList data; data.append(ByteVector::fromLongLong(item.toLongLong())); return renderData(name, TypeInteger, data); } ByteVector MP4::Tag::renderByte(const ByteVector &name, const MP4::Item &item) const { ByteVectorList data; data.append(ByteVector(1, item.toByte())); return renderData(name, TypeInteger, data); } ByteVector MP4::Tag::renderIntPair(const ByteVector &name, const MP4::Item &item) const { ByteVectorList data; data.append(ByteVector(2, '\0') + ByteVector::fromShort(item.toIntPair().first) + ByteVector::fromShort(item.toIntPair().second) + ByteVector(2, '\0')); return renderData(name, TypeImplicit, data); } ByteVector MP4::Tag::renderIntPairNoTrailing(const ByteVector &name, const MP4::Item &item) const { ByteVectorList data; data.append(ByteVector(2, '\0') + ByteVector::fromShort(item.toIntPair().first) + ByteVector::fromShort(item.toIntPair().second)); return renderData(name, TypeImplicit, data); } ByteVector MP4::Tag::renderText(const ByteVector &name, const MP4::Item &item, int flags) const { ByteVectorList data; StringList value = item.toStringList(); for(StringList::ConstIterator it = value.begin(); it != value.end(); ++it) { data.append(it->data(String::UTF8)); } return renderData(name, flags, data); } ByteVector MP4::Tag::renderCovr(const ByteVector &name, const MP4::Item &item) const { ByteVector data; MP4::CoverArtList value = item.toCoverArtList(); for(MP4::CoverArtList::ConstIterator it = value.begin(); it != value.end(); ++it) { data.append(renderAtom("data", ByteVector::fromUInt(it->format()) + ByteVector(4, '\0') + it->data())); } return renderAtom(name, data); } ByteVector MP4::Tag::renderFreeForm(const String &name, const MP4::Item &item) const { StringList header = StringList::split(name, ":"); if(header.size() != 3) { debug("MP4: Invalid free-form item name \"" + name + "\""); return ByteVector(); } ByteVector data; data.append(renderAtom("mean", ByteVector::fromUInt(0) + header[1].data(String::UTF8))); data.append(renderAtom("name", ByteVector::fromUInt(0) + header[2].data(String::UTF8))); AtomDataType type = item.atomDataType(); if(type == TypeUndefined) { if(!item.toStringList().isEmpty()) { type = TypeUTF8; } else { type = TypeImplicit; } } if(type == TypeUTF8) { StringList value = item.toStringList(); for(StringList::ConstIterator it = value.begin(); it != value.end(); ++it) { data.append(renderAtom("data", ByteVector::fromUInt(type) + ByteVector(4, '\0') + it->data(String::UTF8))); } } else { ByteVectorList value = item.toByteVectorList(); for(ByteVectorList::ConstIterator it = value.begin(); it != value.end(); ++it) { data.append(renderAtom("data", ByteVector::fromUInt(type) + ByteVector(4, '\0') + *it)); } } return renderAtom("----", data); } bool MP4::Tag::save() { ByteVector data; for(MP4::ItemMap::ConstIterator it = d->items.begin(); it != d->items.end(); ++it) { const String name = it->first; if(name.startsWith("----")) { data.append(renderFreeForm(name, it->second)); } else if(name == "trkn") { data.append(renderIntPair(name.data(String::Latin1), it->second)); } else if(name == "disk") { data.append(renderIntPairNoTrailing(name.data(String::Latin1), it->second)); } else if(name == "cpil" || name == "pgap" || name == "pcst" || name == "hdvd" || name == "shwm") { data.append(renderBool(name.data(String::Latin1), it->second)); } else if(name == "tmpo" || name == "\251mvi" || name == "\251mvc") { data.append(renderInt(name.data(String::Latin1), it->second)); } else if (name == "rate") { const MP4::Item& item = it->second; StringList value = item.toStringList(); if (value.isEmpty()) { data.append(renderInt(name.data(String::Latin1), item)); } else { data.append(renderText(name.data(String::Latin1), item)); } } else if(name == "tvsn" || name == "tves" || name == "cnID" || name == "sfID" || name == "atID" || name == "geID" || name == "cmID") { data.append(renderUInt(name.data(String::Latin1), it->second)); } else if(name == "plID") { data.append(renderLongLong(name.data(String::Latin1), it->second)); } else if(name == "stik" || name == "rtng" || name == "akID") { data.append(renderByte(name.data(String::Latin1), it->second)); } else if(name == "covr") { data.append(renderCovr(name.data(String::Latin1), it->second)); } else if(name == "purl" || name == "egid") { data.append(renderText(name.data(String::Latin1), it->second, TypeImplicit)); } else if(name.size() == 4){ data.append(renderText(name.data(String::Latin1), it->second)); } else { debug("MP4: Unknown item name \"" + name + "\""); } } data = renderAtom("ilst", data); AtomList path = d->atoms->path("moov", "udta", "meta", "ilst"); if(path.size() == 4) { saveExisting(data, path); } else { saveNew(data); } return true; } bool MP4::Tag::strip() { d->items.clear(); AtomList path = d->atoms->path("moov", "udta", "meta", "ilst"); if(path.size() == 4) { saveExisting(ByteVector(), path); } return true; } void MP4::Tag::updateParents(const AtomList &path, long delta, int ignore) { if(static_cast<int>(path.size()) <= ignore) return; AtomList::ConstIterator itEnd = path.end(); std::advance(itEnd, 0 - ignore); for(AtomList::ConstIterator it = path.begin(); it != itEnd; ++it) { d->file->seek((*it)->offset); long size = d->file->readBlock(4).toUInt(); // 64-bit if (size == 1) { d->file->seek(4, File::Current); // Skip name long long longSize = d->file->readBlock(8).toLongLong(); // Seek the offset of the 64-bit size d->file->seek((*it)->offset + 8); d->file->writeBlock(ByteVector::fromLongLong(longSize + delta)); } // 32-bit else { d->file->seek((*it)->offset); d->file->writeBlock(ByteVector::fromUInt(size + delta)); } } } void MP4::Tag::updateOffsets(long delta, long offset) { MP4::Atom *moov = d->atoms->find("moov"); if(moov) { MP4::AtomList stco = moov->findall("stco", true); for(MP4::AtomList::ConstIterator it = stco.begin(); it != stco.end(); ++it) { MP4::Atom *atom = *it; if(atom->offset > offset) { atom->offset += delta; } d->file->seek(atom->offset + 12); ByteVector data = d->file->readBlock(atom->length - 12); unsigned int count = data.toUInt(); d->file->seek(atom->offset + 16); unsigned int pos = 4; while(count--) { long o = static_cast<long>(data.toUInt(pos)); if(o > offset) { o += delta; } d->file->writeBlock(ByteVector::fromUInt(o)); pos += 4; } } MP4::AtomList co64 = moov->findall("co64", true); for(MP4::AtomList::ConstIterator it = co64.begin(); it != co64.end(); ++it) { MP4::Atom *atom = *it; if(atom->offset > offset) { atom->offset += delta; } d->file->seek(atom->offset + 12); ByteVector data = d->file->readBlock(atom->length - 12); unsigned int count = data.toUInt(); d->file->seek(atom->offset + 16); unsigned int pos = 4; while(count--) { long long o = data.toLongLong(pos); if(o > offset) { o += delta; } d->file->writeBlock(ByteVector::fromLongLong(o)); pos += 8; } } } MP4::Atom *moof = d->atoms->find("moof"); if(moof) { MP4::AtomList tfhd = moof->findall("tfhd", true); for(MP4::AtomList::ConstIterator it = tfhd.begin(); it != tfhd.end(); ++it) { MP4::Atom *atom = *it; if(atom->offset > offset) { atom->offset += delta; } d->file->seek(atom->offset + 9); ByteVector data = d->file->readBlock(atom->length - 9); const unsigned int flags = data.toUInt(0, 3, true); if(flags & 1) { long long o = data.toLongLong(7U); if(o > offset) { o += delta; } d->file->seek(atom->offset + 16); d->file->writeBlock(ByteVector::fromLongLong(o)); } } } } void MP4::Tag::saveNew(ByteVector data) { data = renderAtom("meta", ByteVector(4, '\0') + renderAtom("hdlr", ByteVector(8, '\0') + ByteVector("mdirappl") + ByteVector(9, '\0')) + data + padIlst(data)); AtomList path = d->atoms->path("moov", "udta"); if(path.size() != 2) { path = d->atoms->path("moov"); data = renderAtom("udta", data); } long offset = path.back()->offset + 8; d->file->insert(data, offset, 0); updateParents(path, data.size()); updateOffsets(data.size(), offset); // Insert the newly created atoms into the tree to keep it up-to-date. d->file->seek(offset); path.back()->children.prepend(new Atom(d->file)); } void MP4::Tag::saveExisting(ByteVector data, const AtomList &path) { AtomList::ConstIterator it = path.end(); MP4::Atom *ilst = *(--it); long offset = ilst->offset; long length = ilst->length; MP4::Atom *meta = *(--it); AtomList::ConstIterator index = meta->children.find(ilst); // check if there is an atom before 'ilst', and possibly use it as padding if(index != meta->children.begin()) { AtomList::ConstIterator prevIndex = index; prevIndex--; MP4::Atom *prev = *prevIndex; if(prev->name == "free") { offset = prev->offset; length += prev->length; } } // check if there is an atom after 'ilst', and possibly use it as padding AtomList::ConstIterator nextIndex = index; nextIndex++; if(nextIndex != meta->children.end()) { MP4::Atom *next = *nextIndex; if(next->name == "free") { length += next->length; } } long delta = data.size() - length; if(!data.isEmpty()) { if(delta > 0 || (delta < 0 && delta > -8)) { data.append(padIlst(data)); delta = data.size() - length; } else if(delta < 0) { data.append(padIlst(data, -delta - 8)); delta = 0; } d->file->insert(data, offset, length); if(delta) { updateParents(path, delta, 1); updateOffsets(delta, offset); } } else { // Strip meta if data is empty, only the case when called from strip(). MP4::Atom *udta = *(--it); AtomList &udtaChildren = udta->children; AtomList::Iterator metaIt = udtaChildren.find(meta); if(metaIt != udtaChildren.end()) { offset = meta->offset; delta = - meta->length; udtaChildren.erase(metaIt); d->file->removeBlock(meta->offset, meta->length); delete meta; if(delta) { updateParents(path, delta, 2); updateOffsets(delta, offset); } } } } String MP4::Tag::title() const { if(d->items.contains("\251nam")) return d->items["\251nam"].toStringList().toString(", "); return String(); } String MP4::Tag::artist() const { if(d->items.contains("\251ART")) return d->items["\251ART"].toStringList().toString(", "); return String(); } String MP4::Tag::album() const { if(d->items.contains("\251alb")) return d->items["\251alb"].toStringList().toString(", "); return String(); } String MP4::Tag::comment() const { if(d->items.contains("\251cmt")) return d->items["\251cmt"].toStringList().toString(", "); return String(); } String MP4::Tag::genre() const { if(d->items.contains("\251gen")) return d->items["\251gen"].toStringList().toString(", "); return String(); } unsigned int MP4::Tag::year() const { if(d->items.contains("\251day")) return d->items["\251day"].toStringList().toString().toInt(); return 0; } unsigned int MP4::Tag::track() const { if(d->items.contains("trkn")) return d->items["trkn"].toIntPair().first; return 0; } void MP4::Tag::setTitle(const String &value) { setTextItem("\251nam", value); } void MP4::Tag::setArtist(const String &value) { setTextItem("\251ART", value); } void MP4::Tag::setAlbum(const String &value) { setTextItem("\251alb", value); } void MP4::Tag::setComment(const String &value) { setTextItem("\251cmt", value); } void MP4::Tag::setGenre(const String &value) { setTextItem("\251gen", value); } void MP4::Tag::setTextItem(const String &key, const String &value) { if (!value.isEmpty()) { d->items[key] = StringList(value); } else { d->items.erase(key); } } void MP4::Tag::setYear(unsigned int value) { if (value == 0) { d->items.erase("\251day"); } else { d->items["\251day"] = StringList(String::number(value)); } } void MP4::Tag::setTrack(unsigned int value) { if (value == 0) { d->items.erase("trkn"); } else { d->items["trkn"] = MP4::Item(value, 0); } } bool MP4::Tag::isEmpty() const { return d->items.isEmpty(); } MP4::ItemMap &MP4::Tag::itemListMap() { return d->items; } const MP4::ItemMap &MP4::Tag::itemMap() const { return d->items; } MP4::Item MP4::Tag::item(const String &key) const { return d->items[key]; } void MP4::Tag::setItem(const String &key, const Item &value) { d->items[key] = value; } void MP4::Tag::removeItem(const String &key) { d->items.erase(key); } bool MP4::Tag::contains(const String &key) const { return d->items.contains(key); } namespace { const std::pair<const char *, const char *> keyTranslation[] = { std::make_pair("\251nam", "TITLE"), std::make_pair("\251ART", "ARTIST"), std::make_pair("\251alb", "ALBUM"), std::make_pair("\251cmt", "COMMENT"), std::make_pair("\251gen", "GENRE"), std::make_pair("\251day", "DATE"), std::make_pair("\251wrt", "COMPOSER"), std::make_pair("\251grp", "GROUPING"), std::make_pair("aART", "ALBUMARTIST"), std::make_pair("trkn", "TRACKNUMBER"), std::make_pair("disk", "DISCNUMBER"), std::make_pair("cpil", "COMPILATION"), std::make_pair("tmpo", "BPM"), std::make_pair("cprt", "COPYRIGHT"), std::make_pair("\251lyr", "LYRICS"), std::make_pair("\251too", "ENCODEDBY"), std::make_pair("soal", "ALBUMSORT"), std::make_pair("soaa", "ALBUMARTISTSORT"), std::make_pair("soar", "ARTISTSORT"), std::make_pair("sonm", "TITLESORT"), std::make_pair("soco", "COMPOSERSORT"), std::make_pair("sosn", "SHOWSORT"), std::make_pair("shwm", "SHOWWORKMOVEMENT"), std::make_pair("pgap", "GAPLESSPLAYBACK"), std::make_pair("pcst", "PODCAST"), std::make_pair("catg", "PODCASTCATEGORY"), std::make_pair("desc", "PODCASTDESC"), std::make_pair("egid", "PODCASTID"), std::make_pair("purl", "PODCASTURL"), std::make_pair("tves", "TVEPISODE"), std::make_pair("tven", "TVEPISODEID"), std::make_pair("tvnn", "TVNETWORK"), std::make_pair("tvsn", "TVSEASON"), std::make_pair("tvsh", "TVSHOW"), std::make_pair("\251wrk", "WORK"), std::make_pair("\251mvn", "MOVEMENTNAME"), std::make_pair("\251mvi", "MOVEMENTNUMBER"), std::make_pair("\251mvc", "MOVEMENTCOUNT"), std::make_pair("----:com.apple.iTunes:MusicBrainz Track Id", "MUSICBRAINZ_TRACKID"), std::make_pair("----:com.apple.iTunes:MusicBrainz Artist Id", "MUSICBRAINZ_ARTISTID"), std::make_pair("----:com.apple.iTunes:MusicBrainz Album Id", "MUSICBRAINZ_ALBUMID"), std::make_pair("----:com.apple.iTunes:MusicBrainz Album Artist Id", "MUSICBRAINZ_ALBUMARTISTID"), std::make_pair("----:com.apple.iTunes:MusicBrainz Release Group Id", "MUSICBRAINZ_RELEASEGROUPID"), std::make_pair("----:com.apple.iTunes:MusicBrainz Release Track Id", "MUSICBRAINZ_RELEASETRACKID"), std::make_pair("----:com.apple.iTunes:MusicBrainz Work Id", "MUSICBRAINZ_WORKID"), std::make_pair("----:com.apple.iTunes:MusicBrainz Album Release Country", "RELEASECOUNTRY"), std::make_pair("----:com.apple.iTunes:MusicBrainz Album Status", "RELEASESTATUS"), std::make_pair("----:com.apple.iTunes:MusicBrainz Album Type", "RELEASETYPE"), std::make_pair("----:com.apple.iTunes:ARTISTS", "ARTISTS"), std::make_pair("----:com.apple.iTunes:originaldate", "ORIGINALDATE"), std::make_pair("----:com.apple.iTunes:ASIN", "ASIN"), std::make_pair("----:com.apple.iTunes:LABEL", "LABEL"), std::make_pair("----:com.apple.iTunes:LYRICIST", "LYRICIST"), std::make_pair("----:com.apple.iTunes:CONDUCTOR", "CONDUCTOR"), std::make_pair("----:com.apple.iTunes:REMIXER", "REMIXER"), std::make_pair("----:com.apple.iTunes:ENGINEER", "ENGINEER"), std::make_pair("----:com.apple.iTunes:PRODUCER", "PRODUCER"), std::make_pair("----:com.apple.iTunes:DJMIXER", "DJMIXER"), std::make_pair("----:com.apple.iTunes:MIXER", "MIXER"), std::make_pair("----:com.apple.iTunes:SUBTITLE", "SUBTITLE"), std::make_pair("----:com.apple.iTunes:DISCSUBTITLE", "DISCSUBTITLE"), std::make_pair("----:com.apple.iTunes:MOOD", "MOOD"), std::make_pair("----:com.apple.iTunes:ISRC", "ISRC"), std::make_pair("----:com.apple.iTunes:CATALOGNUMBER", "CATALOGNUMBER"), std::make_pair("----:com.apple.iTunes:BARCODE", "BARCODE"), std::make_pair("----:com.apple.iTunes:SCRIPT", "SCRIPT"), std::make_pair("----:com.apple.iTunes:LANGUAGE", "LANGUAGE"), std::make_pair("----:com.apple.iTunes:LICENSE", "LICENSE"), std::make_pair("----:com.apple.iTunes:MEDIA", "MEDIA"), }; const size_t keyTranslationSize = sizeof(keyTranslation) / sizeof(keyTranslation[0]); String translateKey(const String &key) { for(size_t i = 0; i < keyTranslationSize; ++i) { if(key == keyTranslation[i].first) return keyTranslation[i].second; } return String(); } } // namespace PropertyMap MP4::Tag::properties() const { PropertyMap props; for(MP4::ItemMap::ConstIterator it = d->items.begin(); it != d->items.end(); ++it) { const String key = translateKey(it->first); if(!key.isEmpty()) { if(key == "TRACKNUMBER" || key == "DISCNUMBER") { MP4::Item::IntPair ip = it->second.toIntPair(); String value = String::number(ip.first); if(ip.second) { value += "/" + String::number(ip.second); } props[key] = value; } else if(key == "BPM" || key == "MOVEMENTNUMBER" || key == "MOVEMENTCOUNT" || key == "TVEPISODE" || key == "TVSEASON") { props[key] = String::number(it->second.toInt()); } else if(key == "COMPILATION" || key == "SHOWWORKMOVEMENT" || key == "GAPLESSPLAYBACK" || key == "PODCAST") { props[key] = String::number(it->second.toBool()); } else { props[key] = it->second.toStringList(); } } else { props.unsupportedData().append(it->first); } } return props; } void MP4::Tag::removeUnsupportedProperties(const StringList &props) { for(StringList::ConstIterator it = props.begin(); it != props.end(); ++it) d->items.erase(*it); } PropertyMap MP4::Tag::setProperties(const PropertyMap &props) { static Map<String, String> reverseKeyMap; if(reverseKeyMap.isEmpty()) { for(size_t i = 0; i < keyTranslationSize; i++) { reverseKeyMap[keyTranslation[i].second] = keyTranslation[i].first; } } PropertyMap origProps = properties(); for(PropertyMap::ConstIterator it = origProps.begin(); it != origProps.end(); ++it) { if(!props.contains(it->first) || props[it->first].isEmpty()) { d->items.erase(reverseKeyMap[it->first]); } } PropertyMap ignoredProps; for(PropertyMap::ConstIterator it = props.begin(); it != props.end(); ++it) { if(reverseKeyMap.contains(it->first)) { String name = reverseKeyMap[it->first]; if((it->first == "TRACKNUMBER" || it->first == "DISCNUMBER") && !it->second.isEmpty()) { StringList parts = StringList::split(it->second.front(), "/"); if(!parts.isEmpty()) { int first = parts[0].toInt(); int second = 0; if(parts.size() > 1) { second = parts[1].toInt(); } d->items[name] = MP4::Item(first, second); } } else if((it->first == "BPM" || it->first == "MOVEMENTNUMBER" || it->first == "MOVEMENTCOUNT" || it->first == "TVEPISODE" || it->first == "TVSEASON") && !it->second.isEmpty()) { int value = it->second.front().toInt(); d->items[name] = MP4::Item(value); } else if((it->first == "COMPILATION" || it->first == "SHOWWORKMOVEMENT" || it->first == "GAPLESSPLAYBACK" || it->first == "PODCAST") && !it->second.isEmpty()) { bool value = (it->second.front().toInt() != 0); d->items[name] = MP4::Item(value); } else { d->items[name] = it->second; } } else { ignoredProps.insert(it->first, it->second); } } return ignoredProps; } void MP4::Tag::addItem(const String &name, const Item &value) { if(!d->items.contains(name)) { d->items.insert(name, value); } else { debug("MP4: Ignoring duplicate atom \"" + name + "\""); } } ������������������������������taglib-1.13.1/taglib/mp4/mp4tag.h�������������������������������������������������������������������0000664�0000000�0000000�00000015072�14447736377�0016401�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************** copyright : (C) 2007,2011 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com **************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MP4TAG_H #define TAGLIB_MP4TAG_H #include "tag.h" #include "tbytevectorlist.h" #include "tfile.h" #include "tmap.h" #include "tstringlist.h" #include "taglib_export.h" #include "mp4atom.h" #include "mp4item.h" namespace TagLib { namespace MP4 { /*! * \deprecated Use ItemMap. */ TAGLIB_DEPRECATED typedef TagLib::Map<String, Item> ItemListMap; typedef TagLib::Map<String, Item> ItemMap; class TAGLIB_EXPORT Tag: public TagLib::Tag { public: Tag(); Tag(TagLib::File *file, Atoms *atoms); virtual ~Tag(); bool save(); virtual String title() const; virtual String artist() const; virtual String album() const; virtual String comment() const; virtual String genre() const; virtual unsigned int year() const; virtual unsigned int track() const; virtual void setTitle(const String &value); virtual void setArtist(const String &value); virtual void setAlbum(const String &value); virtual void setComment(const String &value); virtual void setGenre(const String &value); virtual void setYear(unsigned int value); virtual void setTrack(unsigned int value); virtual bool isEmpty() const; /*! * \deprecated Use the item() and setItem() API instead. */ TAGLIB_DEPRECATED ItemMap &itemListMap(); /*! * Returns a string-keyed map of the MP4::Items for this tag. */ const ItemMap &itemMap() const; /*! * \return The item, if any, corresponding to \a key. */ Item item(const String &key) const; /*! * Sets the value of \a key to \a value, overwriting any previous value. */ void setItem(const String &key, const Item &value); /*! * Removes the entry with \a key from the tag, or does nothing if it does * not exist. */ void removeItem(const String &key); /*! * \return True if the tag contains an entry for \a key. */ bool contains(const String &key) const; /*! * Saves the associated file with the tag stripped. */ bool strip(); PropertyMap properties() const; void removeUnsupportedProperties(const StringList& properties); PropertyMap setProperties(const PropertyMap &properties); protected: /*! * Sets the value of \a key to \a value, overwriting any previous value. * If \a value is empty, the item is removed. */ void setTextItem(const String &key, const String &value); private: AtomDataList parseData2(const Atom *atom, int expectedFlags = -1, bool freeForm = false); ByteVectorList parseData(const Atom *atom, int expectedFlags = -1, bool freeForm = false); void parseText(const Atom *atom, int expectedFlags = 1); void parseFreeForm(const Atom *atom); void parseInt(const Atom *atom); void parseByte(const Atom *atom); void parseUInt(const Atom *atom); void parseLongLong(const Atom *atom); void parseGnre(const Atom *atom); void parseIntPair(const Atom *atom); void parseBool(const Atom *atom); void parseCovr(const Atom *atom); ByteVector padIlst(const ByteVector &data, int length = -1) const; ByteVector renderAtom(const ByteVector &name, const ByteVector &data) const; ByteVector renderData(const ByteVector &name, int flags, const ByteVectorList &data) const; ByteVector renderText(const ByteVector &name, const Item &item, int flags = TypeUTF8) const; ByteVector renderFreeForm(const String &name, const Item &item) const; ByteVector renderBool(const ByteVector &name, const Item &item) const; ByteVector renderInt(const ByteVector &name, const Item &item) const; ByteVector renderByte(const ByteVector &name, const Item &item) const; ByteVector renderUInt(const ByteVector &name, const Item &item) const; ByteVector renderLongLong(const ByteVector &name, const Item &item) const; ByteVector renderIntPair(const ByteVector &name, const Item &item) const; ByteVector renderIntPairNoTrailing(const ByteVector &name, const Item &item) const; ByteVector renderCovr(const ByteVector &name, const Item &item) const; void updateParents(const AtomList &path, long delta, int ignore = 0); void updateOffsets(long delta, long offset); void saveNew(ByteVector data); void saveExisting(ByteVector data, const AtomList &path); void addItem(const String &name, const Item &value); class TagPrivate; TagPrivate *d; }; } // namespace MP4 } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpc/���������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015106�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpc/mpcfile.cpp����������������������������������������������������������������0000664�0000000�0000000�00000017462�14447736377�0017243�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tstring.h> #include <tagunion.h> #include <tdebug.h> #include <tpropertymap.h> #include <tagutils.h> #include "mpcfile.h" #include "id3v1tag.h" #include "id3v2header.h" #include "apetag.h" #include "apefooter.h" using namespace TagLib; namespace { enum { MPCAPEIndex = 0, MPCID3v1Index = 1 }; } // namespace class MPC::File::FilePrivate { public: FilePrivate() : APELocation(-1), APESize(0), ID3v1Location(-1), ID3v2Header(0), ID3v2Location(-1), ID3v2Size(0), properties(0) {} ~FilePrivate() { delete ID3v2Header; delete properties; } long APELocation; long APESize; long ID3v1Location; ID3v2::Header *ID3v2Header; long ID3v2Location; long ID3v2Size; TagUnion tag; Properties *properties; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool MPC::File::isSupported(IOStream *stream) { // A newer MPC file has to start with "MPCK" or "MP+", but older files don't // have keys to do a quick check. const ByteVector id = Utils::readHeader(stream, 4, false); return (id == "MPCK" || id.startsWith("MP+")); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// MPC::File::File(FileName file, bool readProperties, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } MPC::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : TagLib::File(stream), d(new FilePrivate()) { if(isOpen()) read(readProperties); } MPC::File::~File() { delete d; } TagLib::Tag *MPC::File::tag() const { return &d->tag; } PropertyMap MPC::File::properties() const { return d->tag.properties(); } void MPC::File::removeUnsupportedProperties(const StringList &properties) { d->tag.removeUnsupportedProperties(properties); } PropertyMap MPC::File::setProperties(const PropertyMap &properties) { if(ID3v1Tag()) ID3v1Tag()->setProperties(properties); return APETag(true)->setProperties(properties); } MPC::Properties *MPC::File::audioProperties() const { return d->properties; } bool MPC::File::save() { if(readOnly()) { debug("MPC::File::save() -- File is read only."); return false; } // Possibly strip ID3v2 tag if(!d->ID3v2Header && d->ID3v2Location >= 0) { removeBlock(d->ID3v2Location, d->ID3v2Size); if(d->APELocation >= 0) d->APELocation -= d->ID3v2Size; if(d->ID3v1Location >= 0) d->ID3v1Location -= d->ID3v2Size; d->ID3v2Location = -1; d->ID3v2Size = 0; } // Update ID3v1 tag if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { // ID3v1 tag is not empty. Update the old one or create a new one. if(d->ID3v1Location >= 0) { seek(d->ID3v1Location); } else { seek(0, End); d->ID3v1Location = tell(); } writeBlock(ID3v1Tag()->render()); } else { // ID3v1 tag is empty. Remove the old one. if(d->ID3v1Location >= 0) { truncate(d->ID3v1Location); d->ID3v1Location = -1; } } // Update APE tag if(APETag() && !APETag()->isEmpty()) { // APE tag is not empty. Update the old one or create a new one. if(d->APELocation < 0) { if(d->ID3v1Location >= 0) d->APELocation = d->ID3v1Location; else d->APELocation = length(); } const ByteVector data = APETag()->render(); insert(data, d->APELocation, d->APESize); if(d->ID3v1Location >= 0) d->ID3v1Location += (static_cast<long>(data.size()) - d->APESize); d->APESize = data.size(); } else { // APE tag is empty. Remove the old one. if(d->APELocation >= 0) { removeBlock(d->APELocation, d->APESize); if(d->ID3v1Location >= 0) d->ID3v1Location -= d->APESize; d->APELocation = -1; d->APESize = 0; } } return true; } ID3v1::Tag *MPC::File::ID3v1Tag(bool create) { return d->tag.access<ID3v1::Tag>(MPCID3v1Index, create); } APE::Tag *MPC::File::APETag(bool create) { return d->tag.access<APE::Tag>(MPCAPEIndex, create); } void MPC::File::strip(int tags) { if(tags & ID3v1) d->tag.set(MPCID3v1Index, 0); if(tags & APE) d->tag.set(MPCAPEIndex, 0); if(!ID3v1Tag()) APETag(true); if(tags & ID3v2) { delete d->ID3v2Header; d->ID3v2Header = 0; } } void MPC::File::remove(int tags) { strip(tags); } bool MPC::File::hasID3v1Tag() const { return (d->ID3v1Location >= 0); } bool MPC::File::hasAPETag() const { return (d->APELocation >= 0); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void MPC::File::read(bool readProperties) { // Look for an ID3v2 tag d->ID3v2Location = Utils::findID3v2(this); if(d->ID3v2Location >= 0) { seek(d->ID3v2Location); d->ID3v2Header = new ID3v2::Header(readBlock(ID3v2::Header::size())); d->ID3v2Size = d->ID3v2Header->completeTagSize(); } // Look for an ID3v1 tag d->ID3v1Location = Utils::findID3v1(this); if(d->ID3v1Location >= 0) d->tag.set(MPCID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); // Look for an APE tag d->APELocation = Utils::findAPE(this, d->ID3v1Location); if(d->APELocation >= 0) { d->tag.set(MPCAPEIndex, new APE::Tag(this, d->APELocation)); d->APESize = APETag()->footer()->completeTagSize(); d->APELocation = d->APELocation + APE::Footer::size() - d->APESize; } if(d->ID3v1Location < 0) APETag(true); // Look for MPC metadata if(readProperties) { long streamLength; if(d->APELocation >= 0) streamLength = d->APELocation; else if(d->ID3v1Location >= 0) streamLength = d->ID3v1Location; else streamLength = length(); if(d->ID3v2Location >= 0) { seek(d->ID3v2Location + d->ID3v2Size); streamLength -= (d->ID3v2Location + d->ID3v2Size); } else { seek(0); } d->properties = new Properties(this, streamLength); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpc/mpcfile.h������������������������������������������������������������������0000664�0000000�0000000�00000020304�14447736377�0016675�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MPCFILE_H #define TAGLIB_MPCFILE_H #include "taglib_export.h" #include "tfile.h" #include "tag.h" #include "mpcproperties.h" #include "tlist.h" namespace TagLib { class Tag; namespace ID3v1 { class Tag; } namespace APE { class Tag; } //! An implementation of MPC metadata /*! * This is implementation of MPC metadata. * * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream * properties from the file. ID3v2 tags are invalid in MPC-files, but will be skipped * and ignored. */ namespace MPC { //! An implementation of TagLib::File with MPC specific methods /*! * This implements and provides an interface for MPC files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to MPC files. * The only invalid tag combination supported is an ID3v1 tag after an APE tag. */ class TAGLIB_EXPORT File : public TagLib::File { public: /*! * This set of flags is used for various operations and is suitable for * being OR-ed together. */ enum TagTypes { //! Empty set. Matches no tag types. NoTags = 0x0000, //! Matches ID3v1 tags. ID3v1 = 0x0001, //! Matches ID3v2 tags. ID3v2 = 0x0002, //! Matches APE tags. APE = 0x0004, //! Matches all tag types. AllTags = 0xffff }; /*! * Constructs an MPC file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an MPC file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag * or a combination of the two. */ virtual TagLib::Tag *tag() const; /*! * Implements the unified property interface -- export function. * If the file contains both an APE and an ID3v1 tag, only the APE * tag will be converted to the PropertyMap. */ PropertyMap properties() const; void removeUnsupportedProperties(const StringList &properties); /*! * Implements the unified property interface -- import function. * Affects only the APEv2 tag which will be created if necessary. * If an ID3v1 tag exists, it will be updated as well. */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the MPC::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Saves the file. * * This returns true if the save was successful. */ virtual bool save(); /*! * Returns a pointer to the ID3v1 tag of the file. * * If \a create is false (the default) this returns a null pointer * if there is no valid APE tag. If \a create is true it will create * an APE tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file * on disk actually has an ID3v1 tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasID3v1Tag() */ ID3v1::Tag *ID3v1Tag(bool create = false); /*! * Returns a pointer to the APE tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid APE tag. If \a create is true it will create * an APE tag if one does not exist and returns a valid pointer. If * there already be an ID3v1 tag, the new APE tag will be placed before it. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an APE tag. Use hasAPETag() to check if the file * on disk actually has an APE tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasAPETag() */ APE::Tag *APETag(bool create = false); /*! * This will remove the tags that match the OR-ed together TagTypes from the * file. By default it removes all tags. * * \warning This will also invalidate pointers to the tags * as their memory will be freed. * * \note In order to make the removal permanent save() still needs to be called. */ void strip(int tags = AllTags); /*! * \deprecated Use strip(). * \see strip */ TAGLIB_DEPRECATED void remove(int tags = AllTags); /*! * Returns whether or not the file on disk actually has an ID3v1 tag. * * \see ID3v1Tag() */ bool hasID3v1Tag() const; /*! * Returns whether or not the file on disk actually has an APE tag. * * \see APETag() */ bool hasAPETag() const; /*! * Returns whether or not the given \a stream can be opened as an MPC * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace MPC } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpc/mpcproperties.cpp����������������������������������������������������������0000664�0000000�0000000�00000023441�14447736377�0020512�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include <bitset> #include <math.h> #include "mpcproperties.h" #include "mpcfile.h" using namespace TagLib; class MPC::Properties::PropertiesPrivate { public: PropertiesPrivate() : version(0), length(0), bitrate(0), sampleRate(0), channels(0), totalFrames(0), sampleFrames(0), trackGain(0), trackPeak(0), albumGain(0), albumPeak(0) {} int version; int length; int bitrate; int sampleRate; int channels; unsigned int totalFrames; unsigned int sampleFrames; int trackGain; int trackPeak; int albumGain; int albumPeak; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// MPC::Properties::Properties(const ByteVector &data, long streamLength, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { readSV7(data, streamLength); } MPC::Properties::Properties(File *file, long streamLength, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { ByteVector magic = file->readBlock(4); if(magic == "MPCK") { // Musepack version 8 readSV8(file, streamLength); } else { // Musepack version 7 or older, fixed size header readSV7(magic + file->readBlock(MPC::HeaderSize - 4), streamLength); } } MPC::Properties::~Properties() { delete d; } int MPC::Properties::length() const { return lengthInSeconds(); } int MPC::Properties::lengthInSeconds() const { return d->length / 1000; } int MPC::Properties::lengthInMilliseconds() const { return d->length; } int MPC::Properties::bitrate() const { return d->bitrate; } int MPC::Properties::sampleRate() const { return d->sampleRate; } int MPC::Properties::channels() const { return d->channels; } int MPC::Properties::mpcVersion() const { return d->version; } unsigned int MPC::Properties::totalFrames() const { return d->totalFrames; } unsigned int MPC::Properties::sampleFrames() const { return d->sampleFrames; } int MPC::Properties::trackGain() const { return d->trackGain; } int MPC::Properties::trackPeak() const { return d->trackPeak; } int MPC::Properties::albumGain() const { return d->albumGain; } int MPC::Properties::albumPeak() const { return d->albumPeak; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// namespace { unsigned long readSize(File *file, unsigned int &sizeLength, bool &eof) { sizeLength = 0; eof = false; unsigned char tmp; unsigned long size = 0; do { const ByteVector b = file->readBlock(1); if(b.isEmpty()) { eof = true; break; } tmp = b[0]; size = (size << 7) | (tmp & 0x7F); sizeLength++; } while((tmp & 0x80)); return size; } unsigned long readSize(const ByteVector &data, unsigned int &pos) { unsigned char tmp; unsigned long size = 0; do { tmp = data[pos++]; size = (size << 7) | (tmp & 0x7F); } while((tmp & 0x80) && (pos < data.size())); return size; } // This array looks weird, but the same as original MusePack code found at: // https://www.musepack.net/index.php?pg=src const unsigned short sftable [8] = { 44100, 48000, 37800, 32000, 0, 0, 0, 0 }; } // namespace void MPC::Properties::readSV8(File *file, long streamLength) { bool readSH = false, readRG = false; while(!readSH && !readRG) { const ByteVector packetType = file->readBlock(2); unsigned int packetSizeLength; bool eof; const unsigned long packetSize = readSize(file, packetSizeLength, eof); if(eof) { debug("MPC::Properties::readSV8() - Reached to EOF."); break; } const unsigned long dataSize = packetSize - 2 - packetSizeLength; const ByteVector data = file->readBlock(dataSize); if(data.size() != dataSize) { debug("MPC::Properties::readSV8() - dataSize doesn't match the actual data size."); break; } if(packetType == "SH") { // Stream Header // http://trac.musepack.net/wiki/SV8Specification#StreamHeaderPacket if(dataSize <= 5) { debug("MPC::Properties::readSV8() - \"SH\" packet is too short to parse."); break; } readSH = true; unsigned int pos = 4; d->version = data[pos]; pos += 1; d->sampleFrames = readSize(data, pos); if(pos > dataSize - 3) { debug("MPC::Properties::readSV8() - \"SH\" packet is corrupt."); break; } const unsigned long begSilence = readSize(data, pos); if(pos > dataSize - 2) { debug("MPC::Properties::readSV8() - \"SH\" packet is corrupt."); break; } const unsigned short flags = data.toUShort(pos, true); pos += 2; d->sampleRate = sftable[(flags >> 13) & 0x07]; d->channels = ((flags >> 4) & 0x0F) + 1; const unsigned int frameCount = d->sampleFrames - begSilence; if(frameCount > 0 && d->sampleRate > 0) { const double length = frameCount * 1000.0 / d->sampleRate; d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); } } else if (packetType == "RG") { // Replay Gain // http://trac.musepack.net/wiki/SV8Specification#ReplaygainPacket if(dataSize <= 9) { debug("MPC::Properties::readSV8() - \"RG\" packet is too short to parse."); break; } readRG = true; const int replayGainVersion = data[0]; if(replayGainVersion == 1) { d->trackGain = data.toShort(1, true); d->trackPeak = data.toShort(3, true); d->albumGain = data.toShort(5, true); d->albumPeak = data.toShort(7, true); } } else if(packetType == "SE") { break; } else { file->seek(dataSize, File::Current); } } } void MPC::Properties::readSV7(const ByteVector &data, long streamLength) { if(data.startsWith("MP+")) { if(data.size() < 4) return; d->version = data[3] & 15; if(d->version < 7) return; d->totalFrames = data.toUInt(4, false); const unsigned int flags = data.toUInt(8, false); d->sampleRate = sftable[(flags >> 16) & 0x03]; d->channels = 2; const unsigned int gapless = data.toUInt(5, false); d->trackGain = data.toShort(14, false); d->trackPeak = data.toUShort(12, false); d->albumGain = data.toShort(18, false); d->albumPeak = data.toUShort(16, false); // convert gain info if(d->trackGain != 0) { int tmp = static_cast<int>((64.82 - static_cast<short>(d->trackGain) / 100.) * 256. + .5); if(tmp >= (1 << 16) || tmp < 0) tmp = 0; d->trackGain = tmp; } if(d->albumGain != 0) { int tmp = static_cast<int>((64.82 - d->albumGain / 100.) * 256. + .5); if(tmp >= (1 << 16) || tmp < 0) tmp = 0; d->albumGain = tmp; } if (d->trackPeak != 0) d->trackPeak = static_cast<int>(log10(static_cast<double>(d->trackPeak)) * 20 * 256 + .5); if (d->albumPeak != 0) d->albumPeak = static_cast<int>(log10(static_cast<double>(d->albumPeak)) * 20 * 256 + .5); bool trueGapless = (gapless >> 31) & 0x0001; if(trueGapless) { unsigned int lastFrameSamples = (gapless >> 20) & 0x07FF; d->sampleFrames = d->totalFrames * 1152 - lastFrameSamples; } else d->sampleFrames = d->totalFrames * 1152 - 576; } else { const unsigned int headerData = data.toUInt(0, false); d->bitrate = (headerData >> 23) & 0x01ff; d->version = (headerData >> 11) & 0x03ff; d->sampleRate = 44100; d->channels = 2; if(d->version >= 5) d->totalFrames = data.toUInt(4, false); else d->totalFrames = data.toUShort(6, false); d->sampleFrames = d->totalFrames * 1152 - 576; } if(d->sampleFrames > 0 && d->sampleRate > 0) { const double length = d->sampleFrames * 1000.0 / d->sampleRate; d->length = static_cast<int>(length + 0.5); if(d->bitrate == 0) d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpc/mpcproperties.h������������������������������������������������������������0000664�0000000�0000000�00000012146�14447736377�0020157�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MPCPROPERTIES_H #define TAGLIB_MPCPROPERTIES_H #include "taglib_export.h" #include "audioproperties.h" namespace TagLib { namespace MPC { class File; static const unsigned int HeaderSize = 8 * 7; //! An implementation of audio property reading for MPC /*! * This reads the data from an MPC stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of MPC::Properties with the data read from the * ByteVector \a data. * * This constructor is deprecated. It only works for MPC version up to 7. */ Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); /*! * Create an instance of MPC::Properties with the data read directly * from a MPC::File. */ Properties(File *file, long streamLength, ReadStyle style = Average); /*! * Destroys this MPC::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the version of the bitstream (SV4-SV8) */ int mpcVersion() const; unsigned int totalFrames() const; unsigned int sampleFrames() const; /*! * Returns the track gain as an integer value, * to convert to dB: trackGain in dB = 64.82 - (trackGain / 256) */ int trackGain() const; /*! * Returns the track peak as an integer value, * to convert to dB: trackPeak in dB = trackPeak / 256 * to convert to floating [-1..1]: trackPeak = 10^(trackPeak / 256 / 20)/32768 */ int trackPeak() const; /*! * Returns the album gain as an integer value, * to convert to dB: albumGain in dB = 64.82 - (albumGain / 256) */ int albumGain() const; /*! * Returns the album peak as an integer value, * to convert to dB: albumPeak in dB = albumPeak / 256 * to convert to floating [-1..1]: albumPeak = 10^(albumPeak / 256 / 20)/32768 */ int albumPeak() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void readSV7(const ByteVector &data, long streamLength); void readSV8(File *file, long streamLength); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace MPC } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/��������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015257�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v1/��������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016205�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v1/id3v1genres.cpp�����������������������������������������������������0000664�0000000�0000000�00000014300�14447736377�0021041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "id3v1genres.h" using namespace TagLib; namespace { const wchar_t *const genres[] = { L"Blues", L"Classic Rock", L"Country", L"Dance", L"Disco", L"Funk", L"Grunge", L"Hip-Hop", L"Jazz", L"Metal", L"New Age", L"Oldies", L"Other", L"Pop", L"R&B", L"Rap", L"Reggae", L"Rock", L"Techno", L"Industrial", L"Alternative", L"Ska", L"Death Metal", L"Pranks", L"Soundtrack", L"Euro-Techno", L"Ambient", L"Trip-Hop", L"Vocal", L"Jazz-Funk", L"Fusion", L"Trance", L"Classical", L"Instrumental", L"Acid", L"House", L"Game", L"Sound Clip", L"Gospel", L"Noise", L"Alternative Rock", L"Bass", L"Soul", L"Punk", L"Space", L"Meditative", L"Instrumental Pop", L"Instrumental Rock", L"Ethnic", L"Gothic", L"Darkwave", L"Techno-Industrial", L"Electronic", L"Pop-Folk", L"Eurodance", L"Dream", L"Southern Rock", L"Comedy", L"Cult", L"Gangsta", L"Top 40", L"Christian Rap", L"Pop/Funk", L"Jungle", L"Native American", L"Cabaret", L"New Wave", L"Psychedelic", L"Rave", L"Showtunes", L"Trailer", L"Lo-Fi", L"Tribal", L"Acid Punk", L"Acid Jazz", L"Polka", L"Retro", L"Musical", L"Rock & Roll", L"Hard Rock", L"Folk", L"Folk Rock", L"National Folk", L"Swing", L"Fast Fusion", L"Bebop", L"Latin", L"Revival", L"Celtic", L"Bluegrass", L"Avant-garde", L"Gothic Rock", L"Progressive Rock", L"Psychedelic Rock", L"Symphonic Rock", L"Slow Rock", L"Big Band", L"Chorus", L"Easy Listening", L"Acoustic", L"Humour", L"Speech", L"Chanson", L"Opera", L"Chamber Music", L"Sonata", L"Symphony", L"Booty Bass", L"Primus", L"Porn Groove", L"Satire", L"Slow Jam", L"Club", L"Tango", L"Samba", L"Folklore", L"Ballad", L"Power Ballad", L"Rhythmic Soul", L"Freestyle", L"Duet", L"Punk Rock", L"Drum Solo", L"A Cappella", L"Euro-House", L"Dancehall", L"Goa", L"Drum & Bass", L"Club-House", L"Hardcore Techno", L"Terror", L"Indie", L"Britpop", L"Worldbeat", L"Polsk Punk", L"Beat", L"Christian Gangsta Rap", L"Heavy Metal", L"Black Metal", L"Crossover", L"Contemporary Christian", L"Christian Rock", L"Merengue", L"Salsa", L"Thrash Metal", L"Anime", L"Jpop", L"Synthpop", L"Abstract", L"Art Rock", L"Baroque", L"Bhangra", L"Big Beat", L"Breakbeat", L"Chillout", L"Downtempo", L"Dub", L"EBM", L"Eclectic", L"Electro", L"Electroclash", L"Emo", L"Experimental", L"Garage", L"Global", L"IDM", L"Illbient", L"Industro-Goth", L"Jam Band", L"Krautrock", L"Leftfield", L"Lounge", L"Math Rock", L"New Romantic", L"Nu-Breakz", L"Post-Punk", L"Post-Rock", L"Psytrance", L"Shoegaze", L"Space Rock", L"Trop Rock", L"World Music", L"Neoclassical", L"Audiobook", L"Audio Theatre", L"Neue Deutsche Welle", L"Podcast", L"Indie Rock", L"G-Funk", L"Dubstep", L"Garage Rock", L"Psybient" }; const int genresSize = sizeof(genres) / sizeof(genres[0]); } // namespace StringList ID3v1::genreList() { StringList l; for(int i = 0; i < genresSize; i++) { l.append(genres[i]); } return l; } ID3v1::GenreMap ID3v1::genreMap() { GenreMap m; for(int i = 0; i < genresSize; i++) { m.insert(genres[i], i); } return m; } String ID3v1::genre(int i) { if(i >= 0 && i < genresSize) return String(genres[i]); // always make a copy return String(); } int ID3v1::genreIndex(const String &name) { for(int i = 0; i < genresSize; ++i) { if(name == genres[i]) return i; } // If the name was not found, try the names which have been changed static const struct { const wchar_t *genre; int code; } fixUpGenres[] = { { L"Jazz+Funk", 29 }, { L"Folk/Rock", 81 }, { L"Bebob", 85 }, { L"Avantgarde", 90 }, { L"Dance Hall", 125 }, { L"Hardcore", 129 }, { L"BritPop", 132 }, { L"Negerpunk", 133 } }; static const int fixUpGenresSize = sizeof(fixUpGenres) / sizeof(fixUpGenres[0]); for(int i = 0; i < fixUpGenresSize; ++i) { if(name == fixUpGenres[i].genre) return fixUpGenres[i].code; } return 255; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v1/id3v1genres.h�������������������������������������������������������0000664�0000000�0000000�00000005447�14447736377�0020522�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ID3V1GENRE_H #define TAGLIB_ID3V1GENRE_H #include "tmap.h" #include "tstringlist.h" #include "taglib_export.h" namespace TagLib { namespace ID3v1 { typedef Map<String, int> GenreMap; /*! * Returns the list of canonical ID3v1 genre names in the order that they * are listed in the standard. */ StringList TAGLIB_EXPORT genreList(); /*! * A "reverse mapping" that goes from the canonical ID3v1 genre name to the * respective genre number. genreMap()["Rock"] == */ GenreMap TAGLIB_EXPORT genreMap(); /*! * Returns the name of the genre at \a index in the ID3v1 genre list. If * \a index is out of range -- less than zero or greater than 191 -- a null * string will be returned. */ String TAGLIB_EXPORT genre(int index); /*! * Returns the genre index for the (case sensitive) genre \a name. If the * genre is not in the list 255 (which signifies an unknown genre in ID3v1) * will be returned. */ int TAGLIB_EXPORT genreIndex(const String &name); } // namespace ID3v1 } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v1/id3v1tag.cpp��������������������������������������������������������0000664�0000000�0000000�00000014762�14447736377�0020345�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tfile.h> #include "id3v1tag.h" #include "id3v1genres.h" using namespace TagLib; using namespace ID3v1; namespace { const ID3v1::StringHandler defaultStringHandler; const ID3v1::StringHandler *stringHandler = &defaultStringHandler; } // namespace class ID3v1::Tag::TagPrivate { public: TagPrivate() : file(0), tagOffset(0), track(0), genre(255) {} File *file; long tagOffset; String title; String artist; String album; String year; String comment; unsigned char track; unsigned char genre; }; //////////////////////////////////////////////////////////////////////////////// // StringHandler implementation //////////////////////////////////////////////////////////////////////////////// StringHandler::StringHandler() { } String ID3v1::StringHandler::parse(const ByteVector &data) const { return String(data, String::Latin1).stripWhiteSpace(); } ByteVector ID3v1::StringHandler::render(const String &s) const { if(s.isLatin1()) return s.data(String::Latin1); return ByteVector(); } //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// ID3v1::Tag::Tag() : d(new TagPrivate()) { } ID3v1::Tag::Tag(File *file, long tagOffset) : d(new TagPrivate()) { d->file = file; d->tagOffset = tagOffset; read(); } ID3v1::Tag::~Tag() { delete d; } ByteVector ID3v1::Tag::render() const { ByteVector data; data.append(fileIdentifier()); data.append(stringHandler->render(d->title).resize(30)); data.append(stringHandler->render(d->artist).resize(30)); data.append(stringHandler->render(d->album).resize(30)); data.append(stringHandler->render(d->year).resize(4)); data.append(stringHandler->render(d->comment).resize(28)); data.append(static_cast<char>(0)); data.append(static_cast<char>(d->track)); data.append(static_cast<char>(d->genre)); return data; } ByteVector ID3v1::Tag::fileIdentifier() { return ByteVector::fromCString("TAG"); } String ID3v1::Tag::title() const { return d->title; } String ID3v1::Tag::artist() const { return d->artist; } String ID3v1::Tag::album() const { return d->album; } String ID3v1::Tag::comment() const { return d->comment; } String ID3v1::Tag::genre() const { return ID3v1::genre(d->genre); } unsigned int ID3v1::Tag::year() const { return d->year.toInt(); } unsigned int ID3v1::Tag::track() const { return d->track; } void ID3v1::Tag::setTitle(const String &s) { d->title = s; } void ID3v1::Tag::setArtist(const String &s) { d->artist = s; } void ID3v1::Tag::setAlbum(const String &s) { d->album = s; } void ID3v1::Tag::setComment(const String &s) { d->comment = s; } void ID3v1::Tag::setGenre(const String &s) { d->genre = ID3v1::genreIndex(s); } void ID3v1::Tag::setYear(unsigned int i) { d->year = i > 0 ? String::number(i) : String(); } void ID3v1::Tag::setTrack(unsigned int i) { d->track = i < 256 ? i : 0; } unsigned int ID3v1::Tag::genreNumber() const { return d->genre; } void ID3v1::Tag::setGenreNumber(unsigned int i) { d->genre = i < 256 ? i : 255; } void ID3v1::Tag::setStringHandler(const StringHandler *handler) { if(handler) stringHandler = handler; else stringHandler = &defaultStringHandler; } //////////////////////////////////////////////////////////////////////////////// // protected methods //////////////////////////////////////////////////////////////////////////////// void ID3v1::Tag::read() { if(d->file && d->file->isValid()) { d->file->seek(d->tagOffset); // read the tag -- always 128 bytes const ByteVector data = d->file->readBlock(128); // some initial sanity checking if(data.size() == 128 && data.startsWith("TAG")) parse(data); else debug("ID3v1 tag is not valid or could not be read at the specified offset."); } } void ID3v1::Tag::parse(const ByteVector &data) { int offset = 3; d->title = stringHandler->parse(data.mid(offset, 30)); offset += 30; d->artist = stringHandler->parse(data.mid(offset, 30)); offset += 30; d->album = stringHandler->parse(data.mid(offset, 30)); offset += 30; d->year = stringHandler->parse(data.mid(offset, 4)); offset += 4; // Check for ID3v1.1 -- Note that ID3v1 *does not* support "track zero" -- this // is not a bug in TagLib. Since a zeroed byte is what we would expect to // indicate the end of a C-String, specifically the comment string, a value of // zero must be assumed to be just that. if(data[offset + 28] == 0 && data[offset + 29] != 0) { // ID3v1.1 detected d->comment = stringHandler->parse(data.mid(offset, 28)); d->track = static_cast<unsigned char>(data[offset + 29]); } else d->comment = data.mid(offset, 30); offset += 30; d->genre = static_cast<unsigned char>(data[offset]); } ��������������taglib-1.13.1/taglib/mpeg/id3v1/id3v1tag.h����������������������������������������������������������0000664�0000000�0000000�00000015725�14447736377�0020012�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ID3V1TAG_H #define TAGLIB_ID3V1TAG_H #include "tag.h" #include "tbytevector.h" #include "taglib_export.h" namespace TagLib { class File; //! An ID3v1 implementation namespace ID3v1 { //! A abstraction for the string to data encoding in ID3v1 tags. /*! * ID3v1 should in theory always contain ISO-8859-1 (Latin1) data. In * practice it does not. TagLib by default only supports ISO-8859-1 data * in ID3v1 tags. * * However by subclassing this class and reimplementing parse() and render() * and setting your reimplementation as the default with * ID3v1::Tag::setStringHandler() you can define how you would like these * transformations to be done. * * \warning It is advisable <b>not</b> to write non-ISO-8859-1 data to ID3v1 * tags. Please consider disabling the writing of ID3v1 tags in the case * that the data is not ISO-8859-1. * * \see ID3v1::Tag::setStringHandler() */ class TAGLIB_EXPORT StringHandler { TAGLIB_IGNORE_MISSING_DESTRUCTOR public: // BIC: Add virtual destructor. StringHandler(); /*! * Decode a string from \a data. The default implementation assumes that * \a data is an ISO-8859-1 (Latin1) character array. */ virtual String parse(const ByteVector &data) const; /*! * Encode a ByteVector with the data from \a s. The default implementation * assumes that \a s is an ISO-8859-1 (Latin1) string. If the string is * does not conform to ISO-8859-1, no value is written. * * \warning It is recommended that you <b>not</b> override this method, but * instead do not write an ID3v1 tag in the case that the data is not * ISO-8859-1. */ virtual ByteVector render(const String &s) const; }; //! The main class in the ID3v1 implementation /*! * This is an implementation of the ID3v1 format. ID3v1 is both the simplest * and most common of tag formats but is rather limited. Because of its * pervasiveness and the way that applications have been written around the * fields that it provides, the generic TagLib::Tag API is a mirror of what is * provided by ID3v1. * * ID3v1 tags should generally only contain Latin1 information. However because * many applications do not follow this rule there is now support for overriding * the ID3v1 string handling using the ID3v1::StringHandler class. Please see * the documentation for that class for more information. * * \see StringHandler * * \note Most fields are truncated to a maximum of 28-30 bytes. The * truncation happens automatically when the tag is rendered. */ class TAGLIB_EXPORT Tag : public TagLib::Tag { public: /*! * Create an ID3v1 tag with default values. */ Tag(); /*! * Create an ID3v1 tag and parse the data in \a file starting at * \a tagOffset. */ Tag(File *file, long tagOffset); /*! * Destroys this Tag instance. */ virtual ~Tag(); /*! * Renders the in memory values to a ByteVector suitable for writing to * the file. */ ByteVector render() const; /*! * Returns the string "TAG" suitable for usage in locating the tag in a * file. */ static ByteVector fileIdentifier(); // Reimplementations. virtual String title() const; virtual String artist() const; virtual String album() const; virtual String comment() const; virtual String genre() const; virtual unsigned int year() const; virtual unsigned int track() const; virtual void setTitle(const String &s); virtual void setArtist(const String &s); virtual void setAlbum(const String &s); virtual void setComment(const String &s); virtual void setGenre(const String &s); virtual void setYear(unsigned int i); virtual void setTrack(unsigned int i); /*! * Returns the genre in number. * * \note Normally 255 indicates that this tag contains no genre. */ unsigned int genreNumber() const; /*! * Sets the genre in number to \a i. * * \note Valid value is from 0 up to 255. Normally 255 indicates that * this tag contains no genre. */ void setGenreNumber(unsigned int i); /*! * Sets the string handler that decides how the ID3v1 data will be * converted to and from binary data. * If the parameter \a handler is null, the previous handler is * released and default ISO-8859-1 handler is restored. * * \note The caller is responsible for deleting the previous handler * as needed after it is released. * * \see StringHandler */ static void setStringHandler(const StringHandler *handler); protected: /*! * Reads from the file specified in the constructor. */ void read(); /*! * Pareses the body of the tag in \a data. */ void parse(const ByteVector &data); private: Tag(const Tag &); Tag &operator=(const Tag &); class TagPrivate; TagPrivate *d; }; } // namespace ID3v1 } // namespace TagLib #endif �������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/��������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016206�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/�������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0017463�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/attachedpictureframe.cpp�������������������������������������0000664�0000000�0000000�00000014746�14447736377�0024367�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "attachedpictureframe.h" #include <tstringlist.h> #include <tdebug.h> using namespace TagLib; using namespace ID3v2; class AttachedPictureFrame::AttachedPictureFramePrivate { public: AttachedPictureFramePrivate() : textEncoding(String::Latin1), type(AttachedPictureFrame::Other) {} String::Type textEncoding; String mimeType; AttachedPictureFrame::Type type; String description; ByteVector data; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// AttachedPictureFrame::AttachedPictureFrame() : Frame("APIC"), d(new AttachedPictureFramePrivate()) { } AttachedPictureFrame::AttachedPictureFrame(const ByteVector &data) : Frame(data), d(new AttachedPictureFramePrivate()) { setData(data); } AttachedPictureFrame::~AttachedPictureFrame() { delete d; } String AttachedPictureFrame::toString() const { String s = "[" + d->mimeType + "]"; return d->description.isEmpty() ? s : d->description + " " + s; } String::Type AttachedPictureFrame::textEncoding() const { return d->textEncoding; } void AttachedPictureFrame::setTextEncoding(String::Type t) { d->textEncoding = t; } String AttachedPictureFrame::mimeType() const { return d->mimeType; } void AttachedPictureFrame::setMimeType(const String &m) { d->mimeType = m; } AttachedPictureFrame::Type AttachedPictureFrame::type() const { return d->type; } void AttachedPictureFrame::setType(Type t) { d->type = t; } String AttachedPictureFrame::description() const { return d->description; } void AttachedPictureFrame::setDescription(const String &desc) { d->description = desc; } ByteVector AttachedPictureFrame::picture() const { return d->data; } void AttachedPictureFrame::setPicture(const ByteVector &p) { d->data = p; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void AttachedPictureFrame::parseFields(const ByteVector &data) { if(data.size() < 5) { debug("A picture frame must contain at least 5 bytes."); return; } d->textEncoding = static_cast<String::Type>(data[0]); int pos = 1; d->mimeType = readStringField(data, String::Latin1, &pos); /* Now we need at least two more bytes available */ if(static_cast<unsigned int>(pos) + 1 >= data.size()) { debug("Truncated picture frame."); return; } d->type = static_cast<TagLib::ID3v2::AttachedPictureFrame::Type>(data[pos++]); d->description = readStringField(data, d->textEncoding, &pos); d->data = data.mid(pos); } ByteVector AttachedPictureFrame::renderFields() const { ByteVector data; String::Type encoding = checkTextEncoding(d->description, d->textEncoding); data.append(static_cast<char>(encoding)); data.append(d->mimeType.data(String::Latin1)); data.append(textDelimiter(String::Latin1)); data.append(static_cast<char>(d->type)); data.append(d->description.data(encoding)); data.append(textDelimiter(encoding)); data.append(d->data); return data; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// AttachedPictureFrame::AttachedPictureFrame(const ByteVector &data, Header *h) : Frame(h), d(new AttachedPictureFramePrivate()) { parseFields(fieldData(data)); } //////////////////////////////////////////////////////////////////////////////// // support for ID3v2.2 PIC frames //////////////////////////////////////////////////////////////////////////////// void AttachedPictureFrameV22::parseFields(const ByteVector &data) { if(data.size() < 5) { debug("A picture frame must contain at least 5 bytes."); return; } d->textEncoding = static_cast<String::Type>(data[0]); int pos = 1; String fixedString = String(data.mid(pos, 3), String::Latin1); pos += 3; // convert fixed string image type to mime string if (fixedString.upper() == "JPG") { d->mimeType = "image/jpeg"; } else if (fixedString.upper() == "PNG") { d->mimeType = "image/png"; } else { debug("probably unsupported image type"); d->mimeType = "image/" + fixedString; } d->type = static_cast<TagLib::ID3v2::AttachedPictureFrame::Type>(data[pos++]); d->description = readStringField(data, d->textEncoding, &pos); d->data = data.mid(pos); } AttachedPictureFrameV22::AttachedPictureFrameV22(const ByteVector &data, Header *h) { // set v2.2 header to make fieldData work correctly setHeader(h, true); parseFields(fieldData(data)); // now set the v2.4 header Frame::Header *newHeader = new Frame::Header("APIC"); newHeader->setFrameSize(h->frameSize()); setHeader(newHeader, true); } ��������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/attachedpictureframe.h���������������������������������������0000664�0000000�0000000�00000016563�14447736377�0024033�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ATTACHEDPICTUREFRAME_H #define TAGLIB_ATTACHEDPICTUREFRAME_H #include "id3v2frame.h" #include "id3v2header.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { //! An ID3v2 attached picture frame implementation /*! * This is an implementation of ID3v2 attached pictures. Pictures may be * included in tags, one per APIC frame (but there may be multiple APIC * frames in a single tag). These pictures are usually in either JPEG or * PNG format. */ class TAGLIB_EXPORT AttachedPictureFrame : public Frame { friend class FrameFactory; public: /*! * This describes the function or content of the picture. */ enum Type { //! A type not enumerated below Other = 0x00, //! 32x32 PNG image that should be used as the file icon FileIcon = 0x01, //! File icon of a different size or format OtherFileIcon = 0x02, //! Front cover image of the album FrontCover = 0x03, //! Back cover image of the album BackCover = 0x04, //! Inside leaflet page of the album LeafletPage = 0x05, //! Image from the album itself Media = 0x06, //! Picture of the lead artist or soloist LeadArtist = 0x07, //! Picture of the artist or performer Artist = 0x08, //! Picture of the conductor Conductor = 0x09, //! Picture of the band or orchestra Band = 0x0A, //! Picture of the composer Composer = 0x0B, //! Picture of the lyricist or text writer Lyricist = 0x0C, //! Picture of the recording location or studio RecordingLocation = 0x0D, //! Picture of the artists during recording DuringRecording = 0x0E, //! Picture of the artists during performance DuringPerformance = 0x0F, //! Picture from a movie or video related to the track MovieScreenCapture = 0x10, //! Picture of a large, coloured fish ColouredFish = 0x11, //! Illustration related to the track Illustration = 0x12, //! Logo of the band or performer BandLogo = 0x13, //! Logo of the publisher (record company) PublisherLogo = 0x14 }; /*! * Constructs an empty picture frame. The description, content and text * encoding should be set manually. */ AttachedPictureFrame(); /*! * Constructs an AttachedPicture frame based on \a data. */ explicit AttachedPictureFrame(const ByteVector &data); /*! * Destroys the AttahcedPictureFrame instance. */ virtual ~AttachedPictureFrame(); /*! * Returns a string containing the description and mime-type */ virtual String toString() const; /*! * Returns the text encoding used for the description. * * \see setTextEncoding() * \see description() */ String::Type textEncoding() const; /*! * Set the text encoding used for the description. * * \see description() */ void setTextEncoding(String::Type t); /*! * Returns the mime type of the image. This should in most cases be * "image/png" or "image/jpeg". */ String mimeType() const; /*! * Sets the mime type of the image. This should in most cases be * "image/png" or "image/jpeg". */ void setMimeType(const String &m); /*! * Returns the type of the image. * * \see Type * \see setType() */ Type type() const; /*! * Sets the type for the image. * * \see Type * \see type() */ void setType(Type t); /*! * Returns a text description of the image. * * \see setDescription() * \see textEncoding() * \see setTextEncoding() */ String description() const; /*! * Sets a textual description of the image to \a desc. * * \see description() * \see textEncoding() * \see setTextEncoding() */ void setDescription(const String &desc); /*! * Returns the image data as a ByteVector. * * \note ByteVector has a data() method that returns a const char * which * should make it easy to export this data to external programs. * * \see setPicture() * \see mimeType() */ ByteVector picture() const; /*! * Sets the image data to \a p. \a p should be of the type specified in * this frame's mime-type specification. * * \see picture() * \see mimeType() * \see setMimeType() */ void setPicture(const ByteVector &p); protected: virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; class AttachedPictureFramePrivate; AttachedPictureFramePrivate *d; private: AttachedPictureFrame(const AttachedPictureFrame &); AttachedPictureFrame &operator=(const AttachedPictureFrame &); AttachedPictureFrame(const ByteVector &data, Header *h); }; //! support for ID3v2.2 PIC frames class TAGLIB_EXPORT AttachedPictureFrameV22 : public AttachedPictureFrame { protected: virtual void parseFields(const ByteVector &data); private: AttachedPictureFrameV22(const ByteVector &data, Header *h); friend class FrameFactory; }; } // namespace ID3v2 } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/chapterframe.cpp���������������������������������������������0000664�0000000�0000000�00000020626�14447736377�0022636�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2013 by Lukas Krejci email : krejclu6@fel.cvut.cz ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevectorlist.h> #include <tpropertymap.h> #include <tdebug.h> #include <stdio.h> #include "chapterframe.h" using namespace TagLib; using namespace ID3v2; class ChapterFrame::ChapterFramePrivate { public: ChapterFramePrivate() : tagHeader(0), startTime(0), endTime(0), startOffset(0), endOffset(0) { embeddedFrameList.setAutoDelete(true); } const ID3v2::Header *tagHeader; ByteVector elementID; unsigned int startTime; unsigned int endTime; unsigned int startOffset; unsigned int endOffset; FrameListMap embeddedFrameListMap; FrameList embeddedFrameList; }; //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// ChapterFrame::ChapterFrame(const ID3v2::Header *tagHeader, const ByteVector &data) : ID3v2::Frame(data), d(new ChapterFramePrivate()) { d->tagHeader = tagHeader; setData(data); } ChapterFrame::ChapterFrame(const ByteVector &elementID, unsigned int startTime, unsigned int endTime, unsigned int startOffset, unsigned int endOffset, const FrameList &embeddedFrames) : ID3v2::Frame("CHAP"), d(new ChapterFramePrivate()) { // setElementID has a workaround for a previously silly API where you had to // specifically include the null byte. setElementID(elementID); d->startTime = startTime; d->endTime = endTime; d->startOffset = startOffset; d->endOffset = endOffset; for(FrameList::ConstIterator it = embeddedFrames.begin(); it != embeddedFrames.end(); ++it) addEmbeddedFrame(*it); } ChapterFrame::~ChapterFrame() { delete d; } ByteVector ChapterFrame::elementID() const { return d->elementID; } unsigned int ChapterFrame::startTime() const { return d->startTime; } unsigned int ChapterFrame::endTime() const { return d->endTime; } unsigned int ChapterFrame::startOffset() const { return d->startOffset; } unsigned int ChapterFrame::endOffset() const { return d->endOffset; } void ChapterFrame::setElementID(const ByteVector &eID) { d->elementID = eID; if(d->elementID.endsWith(static_cast<char>(0))) d->elementID = d->elementID.mid(0, d->elementID.size() - 1); } void ChapterFrame::setStartTime(const unsigned int &sT) { d->startTime = sT; } void ChapterFrame::setEndTime(const unsigned int &eT) { d->endTime = eT; } void ChapterFrame::setStartOffset(const unsigned int &sO) { d->startOffset = sO; } void ChapterFrame::setEndOffset(const unsigned int &eO) { d->endOffset = eO; } const FrameListMap &ChapterFrame::embeddedFrameListMap() const { return d->embeddedFrameListMap; } const FrameList &ChapterFrame::embeddedFrameList() const { return d->embeddedFrameList; } const FrameList &ChapterFrame::embeddedFrameList(const ByteVector &frameID) const { return d->embeddedFrameListMap[frameID]; } void ChapterFrame::addEmbeddedFrame(Frame *frame) { d->embeddedFrameList.append(frame); d->embeddedFrameListMap[frame->frameID()].append(frame); } void ChapterFrame::removeEmbeddedFrame(Frame *frame, bool del) { // remove the frame from the frame list FrameList::Iterator it = d->embeddedFrameList.find(frame); d->embeddedFrameList.erase(it); // ...and from the frame list map it = d->embeddedFrameListMap[frame->frameID()].find(frame); d->embeddedFrameListMap[frame->frameID()].erase(it); // ...and delete as desired if(del) delete frame; } void ChapterFrame::removeEmbeddedFrames(const ByteVector &id) { FrameList l = d->embeddedFrameListMap[id]; for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) removeEmbeddedFrame(*it, true); } String ChapterFrame::toString() const { String s = String(d->elementID) + ": start time: " + String::number(d->startTime) + ", end time: " + String::number(d->endTime); if(d->startOffset != 0xFFFFFFFF) s += ", start offset: " + String::number(d->startOffset); if(d->endOffset != 0xFFFFFFFF) s += ", end offset: " + String::number(d->endOffset); if(!d->embeddedFrameList.isEmpty()) { StringList frameIDs; for(FrameList::ConstIterator it = d->embeddedFrameList.begin(); it != d->embeddedFrameList.end(); ++it) frameIDs.append((*it)->frameID()); s += ", sub-frames: [ " + frameIDs.toString(", ") + " ]"; } return s; } PropertyMap ChapterFrame::asProperties() const { PropertyMap map; map.unsupportedData().append(frameID() + String("/") + d->elementID); return map; } ChapterFrame *ChapterFrame::findByElementID(const ID3v2::Tag *tag, const ByteVector &eID) // static { ID3v2::FrameList comments = tag->frameList("CHAP"); for(ID3v2::FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) { ChapterFrame *frame = dynamic_cast<ChapterFrame *>(*it); if(frame && frame->elementID() == eID) return frame; } return 0; } void ChapterFrame::parseFields(const ByteVector &data) { unsigned int size = data.size(); if(size < 18) { debug("A CHAP frame must contain at least 18 bytes (1 byte element ID " "terminated by null and 4x4 bytes for start and end time and offset)."); return; } int pos = 0; unsigned int embPos = 0; d->elementID = readStringField(data, String::Latin1, &pos).data(String::Latin1); d->startTime = data.toUInt(pos, true); pos += 4; d->endTime = data.toUInt(pos, true); pos += 4; d->startOffset = data.toUInt(pos, true); pos += 4; d->endOffset = data.toUInt(pos, true); pos += 4; size -= pos; // Embedded frames are optional if(size < header()->size()) return; while(embPos < size - header()->size()) { Frame *frame = FrameFactory::instance()->createFrame(data.mid(pos + embPos), d->tagHeader); if(!frame) return; // Checks to make sure that frame parsed correctly. if(frame->size() <= 0) { delete frame; return; } embPos += frame->size() + header()->size(); addEmbeddedFrame(frame); } } ByteVector ChapterFrame::renderFields() const { ByteVector data; data.append(d->elementID); data.append('\0'); data.append(ByteVector::fromUInt(d->startTime, true)); data.append(ByteVector::fromUInt(d->endTime, true)); data.append(ByteVector::fromUInt(d->startOffset, true)); data.append(ByteVector::fromUInt(d->endOffset, true)); FrameList l = d->embeddedFrameList; for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) { (*it)->header()->setVersion(header()->version()); data.append((*it)->render()); } return data; } ChapterFrame::ChapterFrame(const ID3v2::Header *tagHeader, const ByteVector &data, Header *h) : Frame(h), d(new ChapterFramePrivate()) { d->tagHeader = tagHeader; parseFields(fieldData(data)); } ����������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/chapterframe.h�����������������������������������������������0000664�0000000�0000000�00000021373�14447736377�0022303�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2013 by Lukas Krejci email : krejclu6@fel.cvut.cz ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_CHAPTERFRAME #define TAGLIB_CHAPTERFRAME #include "id3v2tag.h" #include "id3v2frame.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { /*! * This is an implementation of ID3v2 chapter frames. The purpose of this * frame is to describe a single chapter within an audio file. */ //! An implementation of ID3v2 chapter frames class TAGLIB_EXPORT ChapterFrame : public ID3v2::Frame { friend class FrameFactory; public: /*! * Creates a chapter frame based on \a data. \a tagHeader is required as * the internal frames are parsed based on the tag version. */ ChapterFrame(const ID3v2::Header *tagHeader, const ByteVector &data); /*! * Creates a chapter frame with the element ID \a elementID, start time * \a startTime, end time \a endTime, start offset \a startOffset, * end offset \a endOffset and optionally a list of embedded frames, * whose ownership will then be taken over by this Frame, in * \a embeddedFrames; * * All times are in milliseconds. */ ChapterFrame(const ByteVector &elementID, unsigned int startTime, unsigned int endTime, unsigned int startOffset, unsigned int endOffset, const FrameList &embeddedFrames = FrameList()); /*! * Destroys the frame. */ virtual ~ChapterFrame(); /*! * Returns the element ID of the frame. Element ID * is a null terminated string, however it's not human-readable. * * \see setElementID() */ ByteVector elementID() const; /*! * Returns time of chapter's start (in milliseconds). * * \see setStartTime() */ unsigned int startTime() const; /*! * Returns time of chapter's end (in milliseconds). * * \see setEndTime() */ unsigned int endTime() const; /*! * Returns zero based byte offset (count of bytes from the beginning * of the audio file) of chapter's start. * * \note If returned value is 0xFFFFFFFF, start time should be used instead. * \see setStartOffset() */ unsigned int startOffset() const; /*! * Returns zero based byte offset (count of bytes from the beginning * of the audio file) of chapter's end. * * \note If returned value is 0xFFFFFFFF, end time should be used instead. * \see setEndOffset() */ unsigned int endOffset() const; /*! * Sets the element ID of the frame to \a eID. If \a eID isn't * null terminated, a null char is appended automatically. * * \see elementID() */ void setElementID(const ByteVector &eID); /*! * Sets time of chapter's start (in milliseconds) to \a sT. * * \see startTime() */ void setStartTime(const unsigned int &sT); /*! * Sets time of chapter's end (in milliseconds) to \a eT. * * \see endTime() */ void setEndTime(const unsigned int &eT); /*! * Sets zero based byte offset (count of bytes from the beginning * of the audio file) of chapter's start to \a sO. * * \see startOffset() */ void setStartOffset(const unsigned int &sO); /*! * Sets zero based byte offset (count of bytes from the beginning * of the audio file) of chapter's end to \a eO. * * \see endOffset() */ void setEndOffset(const unsigned int &eO); /*! * Returns a reference to the frame list map. This is an FrameListMap of * all of the frames embedded in the CHAP frame. * * This is the most convenient structure for accessing the CHAP frame's * embedded frames. Many frame types allow multiple instances of the same * frame type so this is a map of lists. In most cases however there will * only be a single frame of a certain type. * * \warning You should not modify this data structure directly, instead * use addEmbeddedFrame() and removeEmbeddedFrame(). * * \see embeddedFrameList() */ const FrameListMap &embeddedFrameListMap() const; /*! * Returns a reference to the embedded frame list. This is an FrameList * of all of the frames embedded in the CHAP frame in the order that they * were parsed. * * This can be useful if for example you want iterate over the CHAP frame's * embedded frames in the order that they occur in the CHAP frame. * * \warning You should not modify this data structure directly, instead * use addEmbeddedFrame() and removeEmbeddedFrame(). */ const FrameList &embeddedFrameList() const; /*! * Returns the embedded frame list for frames with the id \a frameID * or an empty list if there are no embedded frames of that type. This * is just a convenience and is equivalent to: * * \code * embeddedFrameListMap()[frameID]; * \endcode * * \see embeddedFrameListMap() */ const FrameList &embeddedFrameList(const ByteVector &frameID) const; /*! * Add an embedded frame to the CHAP frame. At this point the CHAP frame * takes ownership of the embedded frame and will handle freeing its memory. * * \note Using this method will invalidate any pointers on the list * returned by embeddedFrameList() */ void addEmbeddedFrame(Frame *frame); /*! * Remove an embedded frame from the CHAP frame. If \a del is true the frame's * memory will be freed; if it is false, it must be deleted by the user. * * \note Using this method will invalidate any pointers on the list * returned by embeddedFrameList() */ void removeEmbeddedFrame(Frame *frame, bool del = true); /*! * Remove all embedded frames of type \a id from the CHAP frame and free their * memory. * * \note Using this method will invalidate any pointers on the list * returned by embeddedFrameList() */ void removeEmbeddedFrames(const ByteVector &id); virtual String toString() const; PropertyMap asProperties() const; /*! * CHAP frames each have a unique element ID. This searches for a CHAP * frame with the element ID \a eID and returns a pointer to it. This * can be used to link CTOC and CHAP frames together. * * \see elementID() */ static ChapterFrame *findByElementID(const Tag *tag, const ByteVector &eID); protected: virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: ChapterFrame(const ID3v2::Header *tagHeader, const ByteVector &data, Header *h); ChapterFrame(const ChapterFrame &); ChapterFrame &operator=(const ChapterFrame &); class ChapterFramePrivate; ChapterFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/commentsframe.cpp��������������������������������������������0000664�0000000�0000000�00000013124�14447736377�0023030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevectorlist.h> #include <id3v2tag.h> #include <tdebug.h> #include <tstringlist.h> #include "commentsframe.h" #include "tpropertymap.h" using namespace TagLib; using namespace ID3v2; class CommentsFrame::CommentsFramePrivate { public: CommentsFramePrivate() : textEncoding(String::Latin1) {} String::Type textEncoding; ByteVector language; String description; String text; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// CommentsFrame::CommentsFrame(String::Type encoding) : Frame("COMM"), d(new CommentsFramePrivate()) { d->textEncoding = encoding; } CommentsFrame::CommentsFrame(const ByteVector &data) : Frame(data), d(new CommentsFramePrivate()) { setData(data); } CommentsFrame::~CommentsFrame() { delete d; } String CommentsFrame::toString() const { return d->text; } ByteVector CommentsFrame::language() const { return d->language; } String CommentsFrame::description() const { return d->description; } String CommentsFrame::text() const { return d->text; } void CommentsFrame::setLanguage(const ByteVector &languageEncoding) { d->language = languageEncoding.mid(0, 3); } void CommentsFrame::setDescription(const String &s) { d->description = s; } void CommentsFrame::setText(const String &s) { d->text = s; } String::Type CommentsFrame::textEncoding() const { return d->textEncoding; } void CommentsFrame::setTextEncoding(String::Type encoding) { d->textEncoding = encoding; } PropertyMap CommentsFrame::asProperties() const { String key = description().upper(); PropertyMap map; if(key.isEmpty() || key == "COMMENT") map.insert("COMMENT", text()); else map.insert("COMMENT:" + key, text()); return map; } CommentsFrame *CommentsFrame::findByDescription(const ID3v2::Tag *tag, const String &d) // static { ID3v2::FrameList comments = tag->frameList("COMM"); for(ID3v2::FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) { CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it); if(frame && frame->description() == d) return frame; } return 0; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void CommentsFrame::parseFields(const ByteVector &data) { if(data.size() < 5) { debug("A comment frame must contain at least 5 bytes."); return; } d->textEncoding = static_cast<String::Type>(data[0]); d->language = data.mid(1, 3); int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; ByteVectorList l = ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign, 2); if(l.size() == 2) { if(d->textEncoding == String::Latin1) { d->description = Tag::latin1StringHandler()->parse(l.front()); d->text = Tag::latin1StringHandler()->parse(l.back()); } else { d->description = String(l.front(), d->textEncoding); d->text = String(l.back(), d->textEncoding); } } } ByteVector CommentsFrame::renderFields() const { ByteVector v; String::Type encoding = d->textEncoding; encoding = checkTextEncoding(d->description, encoding); encoding = checkTextEncoding(d->text, encoding); v.append(static_cast<char>(encoding)); v.append(d->language.size() == 3 ? d->language : "XXX"); v.append(d->description.data(encoding)); v.append(textDelimiter(encoding)); v.append(d->text.data(encoding)); return v; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// CommentsFrame::CommentsFrame(const ByteVector &data, Header *h) : Frame(h), d(new CommentsFramePrivate()) { parseFields(fieldData(data)); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/commentsframe.h����������������������������������������������0000664�0000000�0000000�00000013447�14447736377�0022505�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_COMMENTSFRAME_H #define TAGLIB_COMMENTSFRAME_H #include "id3v2frame.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { //! An implementation of ID3v2 comments /*! * This implements the ID3v2 comment format. An ID3v2 comment consists of * a language encoding, a description and a single text field. */ class TAGLIB_EXPORT CommentsFrame : public Frame { friend class FrameFactory; public: /*! * Construct an empty comment frame that will use the text encoding * \a encoding. */ explicit CommentsFrame(String::Type encoding = String::Latin1); /*! * Construct a comment based on the data in \a data. */ explicit CommentsFrame(const ByteVector &data); /*! * Destroys this CommentFrame instance. */ virtual ~CommentsFrame(); /*! * Returns the text of this comment. * * \see text() */ virtual String toString() const; /*! * Returns the language encoding as a 3 byte encoding as specified by * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a>. * * \note Most taggers simply ignore this value. * * \see setLanguage() */ ByteVector language() const; /*! * Returns the description of this comment. * * \note Most taggers simply ignore this value. * * \see setDescription() */ String description() const; /*! * Returns the text of this comment. * * \see setText() */ String text() const; /*! * Set the language using the 3 byte language code from * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a> to * \a languageCode. * * \see language() */ void setLanguage(const ByteVector &languageCode); /*! * Sets the description of the comment to \a s. * * \see description() */ void setDescription(const String &s); /*! * Sets the text portion of the comment to \a s. * * \see text() */ virtual void setText(const String &s); /*! * Returns the text encoding that will be used in rendering this frame. * This defaults to the type that was either specified in the constructor * or read from the frame when parsed. * * \see setTextEncoding() * \see render() */ String::Type textEncoding() const; /*! * Sets the text encoding to be used when rendering this frame to * \a encoding. * * \see textEncoding() * \see render() */ void setTextEncoding(String::Type encoding); /*! * Parses this frame as PropertyMap with a single key. * - if description() is empty or "COMMENT", the key will be "COMMENT" * - if description() is not a valid PropertyMap key, the frame will be * marked unsupported by an entry "COMM/<description>" in the unsupportedData() * attribute of the returned map. * - otherwise, the key will be "COMMENT:<description>" * - The single value will be the frame's text(). */ PropertyMap asProperties() const; /*! * Comments each have a unique description. This searches for a comment * frame with the description \a d and returns a pointer to it. If no * frame is found that matches the given description null is returned. * * \see description() */ static CommentsFrame *findByDescription(const Tag *tag, const String &d); protected: // Reimplementations. virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: /*! * The constructor used by the FrameFactory. */ CommentsFrame(const ByteVector &data, Header *h); CommentsFrame(const CommentsFrame &); CommentsFrame &operator=(const CommentsFrame &); class CommentsFramePrivate; CommentsFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/eventtimingcodesframe.cpp������������������������������������0000664�0000000�0000000�00000011205�14447736377�0024550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2014 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "eventtimingcodesframe.h" #include <tbytevectorlist.h> #include <id3v2tag.h> #include <tdebug.h> #include <tpropertymap.h> using namespace TagLib; using namespace ID3v2; class EventTimingCodesFrame::EventTimingCodesFramePrivate { public: EventTimingCodesFramePrivate() : timestampFormat(EventTimingCodesFrame::AbsoluteMilliseconds) {} EventTimingCodesFrame::TimestampFormat timestampFormat; EventTimingCodesFrame::SynchedEventList synchedEvents; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// EventTimingCodesFrame::EventTimingCodesFrame() : Frame("ETCO"), d(new EventTimingCodesFramePrivate()) { } EventTimingCodesFrame::EventTimingCodesFrame(const ByteVector &data) : Frame(data), d(new EventTimingCodesFramePrivate()) { setData(data); } EventTimingCodesFrame::~EventTimingCodesFrame() { delete d; } String EventTimingCodesFrame::toString() const { return String(); } EventTimingCodesFrame::TimestampFormat EventTimingCodesFrame::timestampFormat() const { return d->timestampFormat; } EventTimingCodesFrame::SynchedEventList EventTimingCodesFrame::synchedEvents() const { return d->synchedEvents; } void EventTimingCodesFrame::setTimestampFormat( EventTimingCodesFrame::TimestampFormat f) { d->timestampFormat = f; } void EventTimingCodesFrame::setSynchedEvents( const EventTimingCodesFrame::SynchedEventList &e) { d->synchedEvents = e; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void EventTimingCodesFrame::parseFields(const ByteVector &data) { const int end = data.size(); if(end < 1) { debug("An event timing codes frame must contain at least 1 byte."); return; } d->timestampFormat = static_cast<TimestampFormat>(data[0]); int pos = 1; d->synchedEvents.clear(); while(pos + 4 < end) { EventType type = static_cast<EventType>(static_cast<unsigned char>(data[pos++])); unsigned int time = data.toUInt(pos, true); pos += 4; d->synchedEvents.append(SynchedEvent(time, type)); } } ByteVector EventTimingCodesFrame::renderFields() const { ByteVector v; v.append(static_cast<char>(d->timestampFormat)); for(SynchedEventList::ConstIterator it = d->synchedEvents.begin(); it != d->synchedEvents.end(); ++it) { const SynchedEvent &entry = *it; v.append(static_cast<char>(entry.type)); v.append(ByteVector::fromUInt(entry.time)); } return v; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// EventTimingCodesFrame::EventTimingCodesFrame(const ByteVector &data, Header *h) : Frame(h), d(new EventTimingCodesFramePrivate()) { parseFields(fieldData(data)); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/eventtimingcodesframe.h��������������������������������������0000664�0000000�0000000�00000014172�14447736377�0024223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2014 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_EVENTTIMINGCODESFRAME_H #define TAGLIB_EVENTTIMINGCODESFRAME_H #include "id3v2frame.h" #include "tlist.h" namespace TagLib { namespace ID3v2 { //! ID3v2 event timing codes frame /*! * An implementation of ID3v2 event timing codes. */ class TAGLIB_EXPORT EventTimingCodesFrame : public Frame { friend class FrameFactory; public: /*! * Specifies the timestamp format used. */ enum TimestampFormat { //! The timestamp is of unknown format. Unknown = 0x00, //! The timestamp represents the number of MPEG frames since //! the beginning of the audio stream. AbsoluteMpegFrames = 0x01, //! The timestamp represents the number of milliseconds since //! the beginning of the audio stream. AbsoluteMilliseconds = 0x02 }; /*! * Event types defined in id3v2.4.0-frames.txt 4.5. Event timing codes. */ enum EventType { Padding = 0x00, EndOfInitialSilence = 0x01, IntroStart = 0x02, MainPartStart = 0x03, OutroStart = 0x04, OutroEnd = 0x05, VerseStart = 0x06, RefrainStart = 0x07, InterludeStart = 0x08, ThemeStart = 0x09, VariationStart = 0x0a, KeyChange = 0x0b, TimeChange = 0x0c, MomentaryUnwantedNoise = 0x0d, SustainedNoise = 0x0e, SustainedNoiseEnd = 0x0f, IntroEnd = 0x10, MainPartEnd = 0x11, VerseEnd = 0x12, RefrainEnd = 0x13, ThemeEnd = 0x14, Profanity = 0x15, ProfanityEnd = 0x16, NotPredefinedSynch0 = 0xe0, NotPredefinedSynch1 = 0xe1, NotPredefinedSynch2 = 0xe2, NotPredefinedSynch3 = 0xe3, NotPredefinedSynch4 = 0xe4, NotPredefinedSynch5 = 0xe5, NotPredefinedSynch6 = 0xe6, NotPredefinedSynch7 = 0xe7, NotPredefinedSynch8 = 0xe8, NotPredefinedSynch9 = 0xe9, NotPredefinedSynchA = 0xea, NotPredefinedSynchB = 0xeb, NotPredefinedSynchC = 0xec, NotPredefinedSynchD = 0xed, NotPredefinedSynchE = 0xee, NotPredefinedSynchF = 0xef, AudioEnd = 0xfd, AudioFileEnds = 0xfe }; /*! * Single entry of time stamp and event. */ struct SynchedEvent { SynchedEvent(unsigned int ms, EventType t) : time(ms), type(t) {} unsigned int time; EventType type; }; /*! * List of synchronized events. */ typedef TagLib::List<SynchedEvent> SynchedEventList; /*! * Construct an empty event timing codes frame. */ explicit EventTimingCodesFrame(); /*! * Construct a event timing codes frame based on the data in \a data. */ explicit EventTimingCodesFrame(const ByteVector &data); /*! * Destroys this EventTimingCodesFrame instance. */ virtual ~EventTimingCodesFrame(); /*! * Returns a null string. */ virtual String toString() const; /*! * Returns the timestamp format. */ TimestampFormat timestampFormat() const; /*! * Returns the events with the time stamps. */ SynchedEventList synchedEvents() const; /*! * Set the timestamp format. * * \see timestampFormat() */ void setTimestampFormat(TimestampFormat f); /*! * Sets the text with the time stamps. * * \see text() */ void setSynchedEvents(const SynchedEventList &e); protected: // Reimplementations. virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: /*! * The constructor used by the FrameFactory. */ EventTimingCodesFrame(const ByteVector &data, Header *h); EventTimingCodesFrame(const EventTimingCodesFrame &); EventTimingCodesFrame &operator=(const EventTimingCodesFrame &); class EventTimingCodesFramePrivate; EventTimingCodesFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.cpp���������������������������0000664�0000000�0000000�00000012774�14447736377�0026412�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org copyright : (C) 2006 by Aaron VonderHaar email : avh4@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tstringlist.h> #include "generalencapsulatedobjectframe.h" using namespace TagLib; using namespace ID3v2; class GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFramePrivate { public: GeneralEncapsulatedObjectFramePrivate() : textEncoding(String::Latin1) {} String::Type textEncoding; String mimeType; String fileName; String description; ByteVector data; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame() : Frame("GEOB"), d(new GeneralEncapsulatedObjectFramePrivate()) { } GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data) : Frame(data), d(new GeneralEncapsulatedObjectFramePrivate()) { setData(data); } GeneralEncapsulatedObjectFrame::~GeneralEncapsulatedObjectFrame() { delete d; } String GeneralEncapsulatedObjectFrame::toString() const { String text = "[" + d->mimeType + "]"; if(!d->fileName.isEmpty()) text += " " + d->fileName; if(!d->description.isEmpty()) text += " \"" + d->description + "\""; return text; } String::Type GeneralEncapsulatedObjectFrame::textEncoding() const { return d->textEncoding; } void GeneralEncapsulatedObjectFrame::setTextEncoding(String::Type encoding) { d->textEncoding = encoding; } String GeneralEncapsulatedObjectFrame::mimeType() const { return d->mimeType; } void GeneralEncapsulatedObjectFrame::setMimeType(const String &type) { d->mimeType = type; } String GeneralEncapsulatedObjectFrame::fileName() const { return d->fileName; } void GeneralEncapsulatedObjectFrame::setFileName(const String &name) { d->fileName = name; } String GeneralEncapsulatedObjectFrame::description() const { return d->description; } void GeneralEncapsulatedObjectFrame::setDescription(const String &desc) { d->description = desc; } ByteVector GeneralEncapsulatedObjectFrame::object() const { return d->data; } void GeneralEncapsulatedObjectFrame::setObject(const ByteVector &data) { d->data = data; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void GeneralEncapsulatedObjectFrame::parseFields(const ByteVector &data) { if(data.size() < 4) { debug("An object frame must contain at least 4 bytes."); return; } d->textEncoding = static_cast<String::Type>(data[0]); int pos = 1; d->mimeType = readStringField(data, String::Latin1, &pos); d->fileName = readStringField(data, d->textEncoding, &pos); d->description = readStringField(data, d->textEncoding, &pos); d->data = data.mid(pos); } ByteVector GeneralEncapsulatedObjectFrame::renderFields() const { StringList sl; sl.append(d->fileName); sl.append(d->description); const String::Type encoding = checkTextEncoding(sl, d->textEncoding); ByteVector data; data.append(static_cast<char>(encoding)); data.append(d->mimeType.data(String::Latin1)); data.append(textDelimiter(String::Latin1)); data.append(d->fileName.data(encoding)); data.append(textDelimiter(encoding)); data.append(d->description.data(encoding)); data.append(textDelimiter(encoding)); data.append(d->data); return data; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// GeneralEncapsulatedObjectFrame::GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h) : Frame(h), d(new GeneralEncapsulatedObjectFramePrivate()) { parseFields(fieldData(data)); } ����taglib-1.13.1/taglib/mpeg/id3v2/frames/generalencapsulatedobjectframe.h�����������������������������0000664�0000000�0000000�00000013546�14447736377�0026055�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org copyright : (C) 2006 by Aaron VonderHaar email : avh4@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_GENERALENCAPSULATEDOBJECT_H #define TAGLIB_GENERALENCAPSULATEDOBJECT_H #include "id3v2frame.h" #include "id3v2header.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { //! An ID3v2 general encapsulated object frame implementation /*! * This is an implementation of ID3v2 general encapsulated objects. * Arbitrary binary data may be included in tags, stored in GEOB frames. * There may be multiple GEOB frames in a single tag. Each GEOB it * labelled with a content description (which may be blank), a required * mime-type, and a file name (may be blank). The content description * uniquely identifies the GEOB frame in the tag. */ class TAGLIB_EXPORT GeneralEncapsulatedObjectFrame : public Frame { friend class FrameFactory; public: /*! * Constructs an empty object frame. The description, file name and text * encoding should be set manually. */ GeneralEncapsulatedObjectFrame(); /*! * Constructs a GeneralEncapsulatedObjectFrame frame based on \a data. * * \warning This is \em not data for the encapsulated object, for that use * setObject(). This constructor is used when reading the frame from the * disk. */ explicit GeneralEncapsulatedObjectFrame(const ByteVector &data); /*! * Destroys the GeneralEncapsulatedObjectFrame instance. */ virtual ~GeneralEncapsulatedObjectFrame(); /*! * Returns a string containing the description, file name and mime-type */ virtual String toString() const; /*! * Returns the text encoding used for the description and file name. * * \see setTextEncoding() * \see description() * \see fileName() */ String::Type textEncoding() const; /*! * Set the text encoding used for the description and file name. * * \see description() * \see fileName() */ void setTextEncoding(String::Type encoding); /*! * Returns the mime type of the object. */ String mimeType() const; /*! * Sets the mime type of the object. */ void setMimeType(const String &type); /*! * Returns the file name of the object. * * \see setFileName() */ String fileName() const; /*! * Sets the file name for the object. * * \see fileName() */ void setFileName(const String &name); /*! * Returns the content description of the object. * * \see setDescription() * \see textEncoding() * \see setTextEncoding() */ String description() const; /*! * Sets the content description of the object to \a desc. * * \see description() * \see textEncoding() * \see setTextEncoding() */ void setDescription(const String &desc); /*! * Returns the object data as a ByteVector. * * \note ByteVector has a data() method that returns a const char * which * should make it easy to export this data to external programs. * * \see setObject() * \see mimeType() */ ByteVector object() const; /*! * Sets the object data to \a data. \a data should be of the type specified in * this frame's mime-type specification. * * \see object() * \see mimeType() * \see setMimeType() */ void setObject(const ByteVector &object); protected: virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: GeneralEncapsulatedObjectFrame(const ByteVector &data, Header *h); GeneralEncapsulatedObjectFrame(const GeneralEncapsulatedObjectFrame &); GeneralEncapsulatedObjectFrame &operator=(const GeneralEncapsulatedObjectFrame &); class GeneralEncapsulatedObjectFramePrivate; GeneralEncapsulatedObjectFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/ownershipframe.cpp�������������������������������������������0000664�0000000�0000000�00000011624�14447736377�0023224�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Rupert Daniel email : rupert@cancelmonday.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tstringlist.h> #include <id3v2tag.h> #include "ownershipframe.h" using namespace TagLib; using namespace ID3v2; class OwnershipFrame::OwnershipFramePrivate { public: String pricePaid; String datePurchased; String seller; String::Type textEncoding; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// OwnershipFrame::OwnershipFrame(String::Type encoding) : Frame("OWNE"), d(new OwnershipFramePrivate()) { d->textEncoding = encoding; } OwnershipFrame::OwnershipFrame(const ByteVector &data) : Frame(data), d(new OwnershipFramePrivate()) { setData(data); } OwnershipFrame::~OwnershipFrame() { delete d; } String OwnershipFrame::toString() const { return "pricePaid=" + d->pricePaid + " datePurchased=" + d->datePurchased + " seller=" + d->seller; } String OwnershipFrame::pricePaid() const { return d->pricePaid; } void OwnershipFrame::setPricePaid(const String &s) { d->pricePaid = s; } String OwnershipFrame::datePurchased() const { return d->datePurchased; } void OwnershipFrame::setDatePurchased(const String &s) { d->datePurchased = s; } String OwnershipFrame::seller() const { return d->seller; } void OwnershipFrame::setSeller(const String &s) { d->seller = s; } String::Type OwnershipFrame::textEncoding() const { return d->textEncoding; } void OwnershipFrame::setTextEncoding(String::Type encoding) { d->textEncoding = encoding; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void OwnershipFrame::parseFields(const ByteVector &data) { int pos = 0; // Need at least 1 byte for the encoding if(data.isEmpty()) { return; } // Get the text encoding d->textEncoding = static_cast<String::Type>(data[0]); pos += 1; // Read the price paid this is a null terminate string d->pricePaid = readStringField(data, String::Latin1, &pos); // If we don't have at least 8 bytes left then don't parse the rest of the // data if(data.size() - pos < 8) { return; } // Read the date purchased YYYYMMDD d->datePurchased = String(data.mid(pos, 8)); pos += 8; // Read the seller if(d->textEncoding == String::Latin1) d->seller = Tag::latin1StringHandler()->parse(data.mid(pos)); else d->seller = String(data.mid(pos), d->textEncoding); } ByteVector OwnershipFrame::renderFields() const { StringList sl; sl.append(d->seller); const String::Type encoding = checkTextEncoding(sl, d->textEncoding); ByteVector v; v.append(static_cast<char>(encoding)); v.append(d->pricePaid.data(String::Latin1)); v.append(textDelimiter(String::Latin1)); v.append(d->datePurchased.data(String::Latin1)); v.append(d->seller.data(encoding)); return v; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// OwnershipFrame::OwnershipFrame(const ByteVector &data, Header *h) : Frame(h), d(new OwnershipFramePrivate()) { parseFields(fieldData(data)); } ������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/ownershipframe.h���������������������������������������������0000664�0000000�0000000�00000010743�14447736377�0022672�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Rupert Daniel email : rupert@cancelmonday.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_OWNERSHIPFRAME_H #define TAGLIB_OWNERSHIPFRAME_H #include "id3v2frame.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { //! An implementation of ID3v2 "ownership" /*! * This implements the ID3v2 ownership (OWNE frame). It consists of * a price paid, a date purchased (YYYYMMDD) and the name of the seller. */ class TAGLIB_EXPORT OwnershipFrame : public Frame { friend class FrameFactory; public: /*! * Construct an empty ownership frame. */ explicit OwnershipFrame(String::Type encoding = String::Latin1); /*! * Construct a ownership based on the data in \a data. */ explicit OwnershipFrame(const ByteVector &data); /*! * Destroys this OwnershipFrame instance. */ virtual ~OwnershipFrame(); /*! * Returns the text of this popularimeter. * * \see text() */ virtual String toString() const; /*! * Returns the date purchased. * * \see setDatePurchased() */ String datePurchased() const; /*! * Set the date purchased. * * \see datePurchased() */ void setDatePurchased(const String &datePurchased); /*! * Returns the price paid. * * \see setPricePaid() */ String pricePaid() const; /*! * Set the price paid. * * \see pricePaid() */ void setPricePaid(const String &pricePaid); /*! * Returns the seller. * * \see setSeller() */ String seller() const; /*! * Set the seller. * * \see seller() */ void setSeller(const String &seller); /*! * Returns the text encoding that will be used in rendering this frame. * This defaults to the type that was either specified in the constructor * or read from the frame when parsed. * * \see setTextEncoding() * \see render() */ String::Type textEncoding() const; /*! * Sets the text encoding to be used when rendering this frame to * \a encoding. * * \see textEncoding() * \see render() */ void setTextEncoding(String::Type encoding); protected: // Reimplementations. virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: /*! * The constructor used by the FrameFactory. */ OwnershipFrame(const ByteVector &data, Header *h); OwnershipFrame(const OwnershipFrame &); OwnershipFrame &operator=(const OwnershipFrame &); class OwnershipFramePrivate; OwnershipFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif �����������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/podcastframe.cpp���������������������������������������������0000664�0000000�0000000�00000006047�14447736377�0022646�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "podcastframe.h" #include <tpropertymap.h> using namespace TagLib; using namespace ID3v2; class PodcastFrame::PodcastFramePrivate { public: ByteVector fieldData; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// PodcastFrame::PodcastFrame() : Frame("PCST"), d(new PodcastFramePrivate()) { d->fieldData = ByteVector(4, '\0'); } PodcastFrame::~PodcastFrame() { delete d; } String PodcastFrame::toString() const { return String(); } PropertyMap PodcastFrame::asProperties() const { PropertyMap map; map.insert("PODCAST", StringList()); return map; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void PodcastFrame::parseFields(const ByteVector &data) { d->fieldData = data; } ByteVector PodcastFrame::renderFields() const { return d->fieldData; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// PodcastFrame::PodcastFrame(const ByteVector &data, Header *h) : Frame(h), d(new PodcastFramePrivate()) { parseFields(fieldData(data)); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/podcastframe.h�����������������������������������������������0000664�0000000�0000000�00000005560�14447736377�0022312�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_PODCASTFRAME_H #define TAGLIB_PODCASTFRAME_H #include "id3v2frame.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { //! ID3v2 podcast frame /*! * An implementation of ID3v2 podcast flag, a frame with four zero bytes. */ class TAGLIB_EXPORT PodcastFrame : public Frame { friend class FrameFactory; public: /*! * Construct a podcast frame. */ PodcastFrame(); /*! * Destroys this PodcastFrame instance. */ virtual ~PodcastFrame(); /*! * Returns a null string. */ virtual String toString() const; PropertyMap asProperties() const; protected: // Reimplementations. virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: /*! * The constructor used by the FrameFactory. */ PodcastFrame(const ByteVector &data, Header *h); PodcastFrame(const PodcastFrame &); PodcastFrame &operator=(const PodcastFrame &); class PodcastFramePrivate; PodcastFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/popularimeterframe.cpp���������������������������������������0000664�0000000�0000000�00000010217�14447736377�0024073�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Lukas Lalinsky email : lalinsky@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include "popularimeterframe.h" using namespace TagLib; using namespace ID3v2; class PopularimeterFrame::PopularimeterFramePrivate { public: PopularimeterFramePrivate() : rating(0), counter(0) {} String email; int rating; unsigned int counter; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// PopularimeterFrame::PopularimeterFrame() : Frame("POPM"), d(new PopularimeterFramePrivate()) { } PopularimeterFrame::PopularimeterFrame(const ByteVector &data) : Frame(data), d(new PopularimeterFramePrivate()) { setData(data); } PopularimeterFrame::~PopularimeterFrame() { delete d; } String PopularimeterFrame::toString() const { return d->email + " rating=" + String::number(d->rating) + " counter=" + String::number(d->counter); } String PopularimeterFrame::email() const { return d->email; } void PopularimeterFrame::setEmail(const String &s) { d->email = s; } int PopularimeterFrame::rating() const { return d->rating; } void PopularimeterFrame::setRating(int s) { d->rating = s; } unsigned int PopularimeterFrame::counter() const { return d->counter; } void PopularimeterFrame::setCounter(unsigned int s) { d->counter = s; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void PopularimeterFrame::parseFields(const ByteVector &data) { int pos = 0, size = static_cast<int>(data.size()); d->email = readStringField(data, String::Latin1, &pos); d->rating = 0; d->counter = 0; if(pos < size) { d->rating = static_cast<unsigned char>(data[pos++]); if(pos < size) { d->counter = data.toUInt(static_cast<unsigned int>(pos)); } } } ByteVector PopularimeterFrame::renderFields() const { ByteVector data; data.append(d->email.data(String::Latin1)); data.append(textDelimiter(String::Latin1)); data.append(static_cast<char>(d->rating)); data.append(ByteVector::fromUInt(d->counter)); return data; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// PopularimeterFrame::PopularimeterFrame(const ByteVector &data, Header *h) : Frame(h), d(new PopularimeterFramePrivate()) { parseFields(fieldData(data)); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/popularimeterframe.h�����������������������������������������0000664�0000000�0000000�00000007551�14447736377�0023547�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Lukas Lalinsky email : lalinsky@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_POPULARIMETERFRAME_H #define TAGLIB_POPULARIMETERFRAME_H #include "id3v2frame.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { //! An implementation of ID3v2 "popularimeter" /*! * This implements the ID3v2 popularimeter (POPM frame). It consists of * an email, a rating and an optional counter. */ class TAGLIB_EXPORT PopularimeterFrame : public Frame { friend class FrameFactory; public: /*! * Construct an empty popularimeter frame. */ explicit PopularimeterFrame(); /*! * Construct a popularimeter based on the data in \a data. */ explicit PopularimeterFrame(const ByteVector &data); /*! * Destroys this PopularimeterFrame instance. */ virtual ~PopularimeterFrame(); /*! * Returns the text of this popularimeter. * * \see text() */ virtual String toString() const; /*! * Returns the email. * * \see setEmail() */ String email() const; /*! * Set the email. * * \see email() */ void setEmail(const String &email); /*! * Returns the rating. * * \see setRating() */ int rating() const; /*! * Set the rating. * * \see rating() */ void setRating(int rating); /*! * Returns the counter. * * \see setCounter() */ unsigned int counter() const; /*! * Set the counter. * * \see counter() */ void setCounter(unsigned int counter); protected: // Reimplementations. virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: /*! * The constructor used by the FrameFactory. */ PopularimeterFrame(const ByteVector &data, Header *h); PopularimeterFrame(const PopularimeterFrame &); PopularimeterFrame &operator=(const PopularimeterFrame &); class PopularimeterFramePrivate; PopularimeterFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/privateframe.cpp���������������������������������������������0000664�0000000�0000000�00000007440�14447736377�0022661�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Serkan Kalyoncu copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevectorlist.h> #include <id3v2tag.h> #include <tdebug.h> #include "privateframe.h" using namespace TagLib; using namespace ID3v2; class PrivateFrame::PrivateFramePrivate { public: ByteVector data; String owner; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// PrivateFrame::PrivateFrame() : Frame("PRIV"), d(new PrivateFramePrivate()) { } PrivateFrame::PrivateFrame(const ByteVector &data) : Frame(data), d(new PrivateFramePrivate()) { Frame::setData(data); } PrivateFrame::~PrivateFrame() { delete d; } String PrivateFrame::toString() const { return d->owner; } String PrivateFrame::owner() const { return d->owner; } ByteVector PrivateFrame::data() const { return d->data; } void PrivateFrame::setOwner(const String &s) { d->owner = s; } void PrivateFrame::setData(const ByteVector & data) { d->data = data; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void PrivateFrame::parseFields(const ByteVector &data) { if(data.size() < 2) { debug("A private frame must contain at least 2 bytes."); return; } // Owner identifier is assumed to be Latin1 const int byteAlign = 1; const int endOfOwner = data.find(textDelimiter(String::Latin1), 0, byteAlign); d->owner = String(data.mid(0, endOfOwner)); d->data = data.mid(endOfOwner + 1); } ByteVector PrivateFrame::renderFields() const { ByteVector v; v.append(d->owner.data(String::Latin1)); v.append(textDelimiter(String::Latin1)); v.append(d->data); return v; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// PrivateFrame::PrivateFrame(const ByteVector &data, Header *h) : Frame(h), d(new PrivateFramePrivate()) { parseFields(fieldData(data)); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/privateframe.h�����������������������������������������������0000664�0000000�0000000�00000007100�14447736377�0022317�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Serkan Kalyoncu copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_PRIVATEFRAME_H #define TAGLIB_PRIVATEFRAME_H #include "id3v2frame.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { //! An implementation of ID3v2 privateframe class TAGLIB_EXPORT PrivateFrame : public Frame { friend class FrameFactory; public: /*! * Construct an empty private frame. */ PrivateFrame(); /*! * Construct a private frame based on the data in \a data. * * \note This is the constructor used when parsing the frame from a file. */ explicit PrivateFrame(const ByteVector &data); /*! * Destroys this private frame instance. */ virtual ~PrivateFrame(); /*! * Returns the text of this private frame, currently just the owner. * * \see text() */ virtual String toString() const; /*! * \return The owner of the private frame. * \note This should contain an email address or link to a website. */ String owner() const; /*! * */ ByteVector data() const; /*! * Sets the owner of the frame to \a s. * \note This should contain an email address or link to a website. */ void setOwner(const String &s); /*! * */ void setData(const ByteVector &v); protected: // Reimplementations. virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: /*! * The constructor used by the FrameFactory. */ PrivateFrame(const ByteVector &data, Header *h); PrivateFrame(const PrivateFrame &); PrivateFrame &operator=(const PrivateFrame &); class PrivateFramePrivate; PrivateFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/relativevolumeframe.cpp��������������������������������������0000664�0000000�0000000�00000015334�14447736377�0024253�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tmap.h> #include "relativevolumeframe.h" using namespace TagLib; using namespace ID3v2; struct ChannelData { ChannelData() : channelType(RelativeVolumeFrame::Other), volumeAdjustment(0) {} RelativeVolumeFrame::ChannelType channelType; short volumeAdjustment; RelativeVolumeFrame::PeakVolume peakVolume; }; class RelativeVolumeFrame::RelativeVolumeFramePrivate { public: String identification; Map<ChannelType, ChannelData> channels; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// RelativeVolumeFrame::RelativeVolumeFrame() : Frame("RVA2"), d(new RelativeVolumeFramePrivate()) { } RelativeVolumeFrame::RelativeVolumeFrame(const ByteVector &data) : Frame(data), d(new RelativeVolumeFramePrivate()) { setData(data); } RelativeVolumeFrame::~RelativeVolumeFrame() { delete d; } String RelativeVolumeFrame::toString() const { return d->identification; } List<RelativeVolumeFrame::ChannelType> RelativeVolumeFrame::channels() const { List<ChannelType> l; Map<ChannelType, ChannelData>::ConstIterator it = d->channels.begin(); for(; it != d->channels.end(); ++it) l.append((*it).first); return l; } // deprecated RelativeVolumeFrame::ChannelType RelativeVolumeFrame::channelType() const { return MasterVolume; } // deprecated void RelativeVolumeFrame::setChannelType(ChannelType) { } short RelativeVolumeFrame::volumeAdjustmentIndex(ChannelType type) const { return d->channels.contains(type) ? d->channels[type].volumeAdjustment : 0; } short RelativeVolumeFrame::volumeAdjustmentIndex() const { return volumeAdjustmentIndex(MasterVolume); } void RelativeVolumeFrame::setVolumeAdjustmentIndex(short index, ChannelType type) { d->channels[type].volumeAdjustment = index; } void RelativeVolumeFrame::setVolumeAdjustmentIndex(short index) { setVolumeAdjustmentIndex(index, MasterVolume); } float RelativeVolumeFrame::volumeAdjustment(ChannelType type) const { return d->channels.contains(type) ? static_cast<float>(d->channels[type].volumeAdjustment) / static_cast<float>(512) : 0; } float RelativeVolumeFrame::volumeAdjustment() const { return volumeAdjustment(MasterVolume); } void RelativeVolumeFrame::setVolumeAdjustment(float adjustment, ChannelType type) { d->channels[type].volumeAdjustment = static_cast<short>(adjustment * static_cast<float>(512)); } void RelativeVolumeFrame::setVolumeAdjustment(float adjustment) { setVolumeAdjustment(adjustment, MasterVolume); } RelativeVolumeFrame::PeakVolume RelativeVolumeFrame::peakVolume(ChannelType type) const { return d->channels.contains(type) ? d->channels[type].peakVolume : PeakVolume(); } RelativeVolumeFrame::PeakVolume RelativeVolumeFrame::peakVolume() const { return peakVolume(MasterVolume); } void RelativeVolumeFrame::setPeakVolume(const PeakVolume &peak, ChannelType type) { d->channels[type].peakVolume = peak; } void RelativeVolumeFrame::setPeakVolume(const PeakVolume &peak) { setPeakVolume(peak, MasterVolume); } String RelativeVolumeFrame::identification() const { return d->identification; } void RelativeVolumeFrame::setIdentification(const String &s) { d->identification = s; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void RelativeVolumeFrame::parseFields(const ByteVector &data) { int pos = 0; d->identification = readStringField(data, String::Latin1, &pos); // Each channel is at least 4 bytes. while(pos <= static_cast<int>(data.size()) - 4) { ChannelType type = static_cast<ChannelType>(data[pos]); pos += 1; ChannelData &channel = d->channels[type]; channel.volumeAdjustment = data.toShort(static_cast<unsigned int>(pos)); pos += 2; channel.peakVolume.bitsRepresentingPeak = data[pos]; pos += 1; const int bytes = (channel.peakVolume.bitsRepresentingPeak + 7) / 8; channel.peakVolume.peakVolume = data.mid(pos, bytes); pos += bytes; } } ByteVector RelativeVolumeFrame::renderFields() const { ByteVector data; data.append(d->identification.data(String::Latin1)); data.append(textDelimiter(String::Latin1)); Map<ChannelType, ChannelData>::ConstIterator it = d->channels.begin(); for(; it != d->channels.end(); ++it) { ChannelType type = (*it).first; const ChannelData &channel = (*it).second; data.append(static_cast<char>(type)); data.append(ByteVector::fromShort(channel.volumeAdjustment)); data.append(static_cast<char>(channel.peakVolume.bitsRepresentingPeak)); data.append(channel.peakVolume.peakVolume); } return data; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// RelativeVolumeFrame::RelativeVolumeFrame(const ByteVector &data, Header *h) : Frame(h), d(new RelativeVolumeFramePrivate()) { parseFields(fieldData(data)); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/relativevolumeframe.h����������������������������������������0000664�0000000�0000000�00000022572�14447736377�0023722�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_RELATIVEVOLUMEFRAME_H #define TAGLIB_RELATIVEVOLUMEFRAME_H #include "tlist.h" #include "id3v2frame.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { //! An ID3v2 relative volume adjustment frame implementation /*! * This is an implementation of ID3v2 relative volume adjustment. The * presence of this frame makes it possible to specify an increase in volume * for an audio file or specific audio tracks in that file. * * Multiple relative volume adjustment frames may be present in the tag * each with a unique identification and describing volume adjustment for * different channel types. */ class TAGLIB_EXPORT RelativeVolumeFrame : public Frame { friend class FrameFactory; public: /*! * This indicates the type of volume adjustment that should be applied. */ enum ChannelType { //! A type not enumerated below Other = 0x00, //! The master volume for the track MasterVolume = 0x01, //! The front right audio channel FrontRight = 0x02, //! The front left audio channel FrontLeft = 0x03, //! The back right audio channel BackRight = 0x04, //! The back left audio channel BackLeft = 0x05, //! The front center audio channel FrontCentre = 0x06, //! The back center audio channel BackCentre = 0x07, //! The subwoofer audio channel Subwoofer = 0x08 }; //! Struct that stores the relevant values for ID3v2 peak volume /*! * The peak volume is described as a series of bits that is padded to fill * a block of bytes. These two values should always be updated in tandem. */ struct PeakVolume { /*! * Constructs an empty peak volume description. */ PeakVolume() : bitsRepresentingPeak(0) {} /*! * The number of bits (in the range of 0 to 255) used to describe the * peak volume. */ unsigned char bitsRepresentingPeak; /*! * The array of bits (represented as a series of bytes) used to describe * the peak volume. */ ByteVector peakVolume; }; /*! * Constructs a RelativeVolumeFrame. The relevant data should be set * manually. */ RelativeVolumeFrame(); /*! * Constructs a RelativeVolumeFrame based on the contents of \a data. */ RelativeVolumeFrame(const ByteVector &data); /*! * Destroys the RelativeVolumeFrame instance. */ virtual ~RelativeVolumeFrame(); /*! * Returns the frame's identification. * * \see identification() */ virtual String toString() const; /*! * Returns a list of channels with information currently in the frame. */ List<ChannelType> channels() const; /*! * \deprecated Always returns master volume. */ TAGLIB_DEPRECATED ChannelType channelType() const; /*! * \deprecated This method no longer has any effect. */ TAGLIB_DEPRECATED void setChannelType(ChannelType t); /* * There was a terrible API goof here, and while this can't be changed to * the way it appears below for binary compatibility reasons, let's at * least pretend that it looks clean. */ #ifdef DOXYGEN /*! * Returns the relative volume adjustment "index". As indicated by the * ID3v2 standard this is a 16-bit signed integer that reflects the * decibels of adjustment when divided by 512. * * This defaults to returning the value for the master volume channel if * available and returns 0 if the specified channel does not exist. * * \see setVolumeAdjustmentIndex() * \see volumeAdjustment() */ short volumeAdjustmentIndex(ChannelType type = MasterVolume) const; /*! * Set the volume adjustment to \a index. As indicated by the ID3v2 * standard this is a 16-bit signed integer that reflects the decibels of * adjustment when divided by 512. * * By default this sets the value for the master volume. * * \see volumeAdjustmentIndex() * \see setVolumeAdjustment() */ void setVolumeAdjustmentIndex(short index, ChannelType type = MasterVolume); /*! * Returns the relative volume adjustment in decibels. * * \note Because this is actually stored internally as an "index" to this * value the value returned by this method may not be identical to the * value set using setVolumeAdjustment(). * * This defaults to returning the value for the master volume channel if * available and returns 0 if the specified channel does not exist. * * \see setVolumeAdjustment() * \see volumeAdjustmentIndex() */ float volumeAdjustment(ChannelType type = MasterVolume) const; /*! * Set the relative volume adjustment in decibels to \a adjustment. * * By default this sets the value for the master volume. * * \note Because this is actually stored internally as an "index" to this * value the value set by this method may not be identical to the one * returned by volumeAdjustment(). * * \see setVolumeAdjustment() * \see volumeAdjustmentIndex() */ void setVolumeAdjustment(float adjustment, ChannelType type = MasterVolume); /*! * Returns the peak volume (represented as a length and a string of bits). * * This defaults to returning the value for the master volume channel if * available and returns 0 if the specified channel does not exist. * * \see setPeakVolume() */ PeakVolume peakVolume(ChannelType type = MasterVolume) const; /*! * Sets the peak volume to \a peak. * * By default this sets the value for the master volume. * * \see peakVolume() */ void setPeakVolume(const PeakVolume &peak, ChannelType type = MasterVolume); #else // BIC: Combine each of the following pairs of functions (or maybe just // rework this junk altogether). short volumeAdjustmentIndex(ChannelType type) const; short volumeAdjustmentIndex() const; void setVolumeAdjustmentIndex(short index, ChannelType type); void setVolumeAdjustmentIndex(short index); float volumeAdjustment(ChannelType type) const; float volumeAdjustment() const; void setVolumeAdjustment(float adjustment, ChannelType type); void setVolumeAdjustment(float adjustment); PeakVolume peakVolume(ChannelType type) const; PeakVolume peakVolume() const; void setPeakVolume(const PeakVolume &peak, ChannelType type); void setPeakVolume(const PeakVolume &peak); #endif /*! * Returns the identification for this frame. */ String identification() const; /*! * Sets the identification of the frame to \a s. The string * is used to identify the situation and/or device where this * adjustment should apply. */ void setIdentification(const String &s); protected: virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: RelativeVolumeFrame(const ByteVector &data, Header *h); RelativeVolumeFrame(const RelativeVolumeFrame &); RelativeVolumeFrame &operator=(const RelativeVolumeFrame &); class RelativeVolumeFramePrivate; RelativeVolumeFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/synchronizedlyricsframe.cpp����������������������������������0000664�0000000�0000000�00000016464�14447736377�0025162�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2014 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "synchronizedlyricsframe.h" #include <tbytevectorlist.h> #include <id3v2tag.h> #include <tdebug.h> #include <tpropertymap.h> using namespace TagLib; using namespace ID3v2; class SynchronizedLyricsFrame::SynchronizedLyricsFramePrivate { public: SynchronizedLyricsFramePrivate() : textEncoding(String::Latin1), timestampFormat(SynchronizedLyricsFrame::AbsoluteMilliseconds), type(SynchronizedLyricsFrame::Lyrics) {} String::Type textEncoding; ByteVector language; SynchronizedLyricsFrame::TimestampFormat timestampFormat; SynchronizedLyricsFrame::Type type; String description; SynchronizedLyricsFrame::SynchedTextList synchedText; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// SynchronizedLyricsFrame::SynchronizedLyricsFrame(String::Type encoding) : Frame("SYLT"), d(new SynchronizedLyricsFramePrivate()) { d->textEncoding = encoding; } SynchronizedLyricsFrame::SynchronizedLyricsFrame(const ByteVector &data) : Frame(data), d(new SynchronizedLyricsFramePrivate()) { setData(data); } SynchronizedLyricsFrame::~SynchronizedLyricsFrame() { delete d; } String SynchronizedLyricsFrame::toString() const { return d->description; } String::Type SynchronizedLyricsFrame::textEncoding() const { return d->textEncoding; } ByteVector SynchronizedLyricsFrame::language() const { return d->language; } SynchronizedLyricsFrame::TimestampFormat SynchronizedLyricsFrame::timestampFormat() const { return d->timestampFormat; } SynchronizedLyricsFrame::Type SynchronizedLyricsFrame::type() const { return d->type; } String SynchronizedLyricsFrame::description() const { return d->description; } SynchronizedLyricsFrame::SynchedTextList SynchronizedLyricsFrame::synchedText() const { return d->synchedText; } void SynchronizedLyricsFrame::setTextEncoding(String::Type encoding) { d->textEncoding = encoding; } void SynchronizedLyricsFrame::setLanguage(const ByteVector &languageEncoding) { d->language = languageEncoding.mid(0, 3); } void SynchronizedLyricsFrame::setTimestampFormat(SynchronizedLyricsFrame::TimestampFormat f) { d->timestampFormat = f; } void SynchronizedLyricsFrame::setType(SynchronizedLyricsFrame::Type t) { d->type = t; } void SynchronizedLyricsFrame::setDescription(const String &s) { d->description = s; } void SynchronizedLyricsFrame::setSynchedText( const SynchronizedLyricsFrame::SynchedTextList &t) { d->synchedText = t; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void SynchronizedLyricsFrame::parseFields(const ByteVector &data) { const int end = data.size(); if(end < 7) { debug("A synchronized lyrics frame must contain at least 7 bytes."); return; } d->textEncoding = static_cast<String::Type>(data[0]); d->language = data.mid(1, 3); d->timestampFormat = static_cast<TimestampFormat>(data[4]); d->type = static_cast<Type>(data[5]); int pos = 6; d->description = readStringField(data, d->textEncoding, &pos); if(pos == 6) return; /* * If UTF16 strings are found in SYLT frames, a BOM may only be * present in the first string (content descriptor), and the strings of * the synchronized text have no BOM. Here the BOM is read from * the first string to have a specific encoding with endianness for the * case of strings without BOM so that readStringField() will work. */ String::Type encWithEndianness = d->textEncoding; if(d->textEncoding == String::UTF16) { unsigned short bom = data.toUShort(6, true); if(bom == 0xfffe) { encWithEndianness = String::UTF16LE; } else if(bom == 0xfeff) { encWithEndianness = String::UTF16BE; } } d->synchedText.clear(); while(pos < end) { String::Type enc = d->textEncoding; // If a UTF16 string has no BOM, use the encoding found above. if(enc == String::UTF16 && pos + 1 < end) { unsigned short bom = data.toUShort(pos, true); if(bom != 0xfffe && bom != 0xfeff) { enc = encWithEndianness; } } String text = readStringField(data, enc, &pos); if(pos + 4 > end) return; unsigned int time = data.toUInt(pos, true); pos += 4; d->synchedText.append(SynchedText(time, text)); } } ByteVector SynchronizedLyricsFrame::renderFields() const { ByteVector v; String::Type encoding = d->textEncoding; encoding = checkTextEncoding(d->description, encoding); for(SynchedTextList::ConstIterator it = d->synchedText.begin(); it != d->synchedText.end(); ++it) { encoding = checkTextEncoding(it->text, encoding); } v.append(static_cast<char>(encoding)); v.append(d->language.size() == 3 ? d->language : "XXX"); v.append(static_cast<char>(d->timestampFormat)); v.append(static_cast<char>(d->type)); v.append(d->description.data(encoding)); v.append(textDelimiter(encoding)); for(SynchedTextList::ConstIterator it = d->synchedText.begin(); it != d->synchedText.end(); ++it) { const SynchedText &entry = *it; v.append(entry.text.data(encoding)); v.append(textDelimiter(encoding)); v.append(ByteVector::fromUInt(entry.time)); } return v; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// SynchronizedLyricsFrame::SynchronizedLyricsFrame(const ByteVector &data, Header *h) : Frame(h), d(new SynchronizedLyricsFramePrivate()) { parseFields(fieldData(data)); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/synchronizedlyricsframe.h������������������������������������0000664�0000000�0000000�00000016316�14447736377�0024623�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2014 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_SYNCHRONIZEDLYRICSFRAME_H #define TAGLIB_SYNCHRONIZEDLYRICSFRAME_H #include "id3v2frame.h" #include "tlist.h" namespace TagLib { namespace ID3v2 { //! ID3v2 synchronized lyrics frame /*! * An implementation of ID3v2 synchronized lyrics. */ class TAGLIB_EXPORT SynchronizedLyricsFrame : public Frame { friend class FrameFactory; public: /*! * Specifies the timestamp format used. */ enum TimestampFormat { //! The timestamp is of unknown format. Unknown = 0x00, //! The timestamp represents the number of MPEG frames since //! the beginning of the audio stream. AbsoluteMpegFrames = 0x01, //! The timestamp represents the number of milliseconds since //! the beginning of the audio stream. AbsoluteMilliseconds = 0x02 }; /*! * Specifies the type of text contained. */ enum Type { //! The text is some other type of text. Other = 0x00, //! The text contains lyrical data. Lyrics = 0x01, //! The text contains a transcription. TextTranscription = 0x02, //! The text lists the movements in the piece. Movement = 0x03, //! The text describes events that occur. Events = 0x04, //! The text contains chord changes that occur in the music. Chord = 0x05, //! The text contains trivia or "pop up" information about the media. Trivia = 0x06, //! The text contains URLs for relevant webpages. WebpageUrls = 0x07, //! The text contains URLs for relevant images. ImageUrls = 0x08 }; /*! * Single entry of time stamp and lyrics text. */ struct SynchedText { SynchedText(unsigned int ms, String str) : time(ms), text(str) {} unsigned int time; String text; }; /*! * List of synchronized lyrics. */ typedef TagLib::List<SynchedText> SynchedTextList; /*! * Construct an empty synchronized lyrics frame that will use the text * encoding \a encoding. */ explicit SynchronizedLyricsFrame(String::Type encoding = String::Latin1); /*! * Construct a synchronized lyrics frame based on the data in \a data. */ explicit SynchronizedLyricsFrame(const ByteVector &data); /*! * Destroys this SynchronizedLyricsFrame instance. */ virtual ~SynchronizedLyricsFrame(); /*! * Returns the description of this synchronized lyrics frame. * * \see description() */ virtual String toString() const; /*! * Returns the text encoding that will be used in rendering this frame. * This defaults to the type that was either specified in the constructor * or read from the frame when parsed. * * \see setTextEncoding() * \see render() */ String::Type textEncoding() const; /*! * Returns the language encoding as a 3 byte encoding as specified by * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a>. * * \note Most taggers simply ignore this value. * * \see setLanguage() */ ByteVector language() const; /*! * Returns the timestamp format. */ TimestampFormat timestampFormat() const; /*! * Returns the type of text contained. */ Type type() const; /*! * Returns the description of this synchronized lyrics frame. * * \note Most taggers simply ignore this value. * * \see setDescription() */ String description() const; /*! * Returns the text with the time stamps. */ SynchedTextList synchedText() const; /*! * Sets the text encoding to be used when rendering this frame to * \a encoding. * * \see textEncoding() * \see render() */ void setTextEncoding(String::Type encoding); /*! * Set the language using the 3 byte language code from * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a> to * \a languageCode. * * \see language() */ void setLanguage(const ByteVector &languageCode); /*! * Set the timestamp format. * * \see timestampFormat() */ void setTimestampFormat(TimestampFormat f); /*! * Set the type of text contained. * * \see type() */ void setType(Type t); /*! * Sets the description of the synchronized lyrics frame to \a s. * * \see description() */ void setDescription(const String &s); /*! * Sets the text with the time stamps. * * \see text() */ void setSynchedText(const SynchedTextList &t); protected: // Reimplementations. virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: /*! * The constructor used by the FrameFactory. */ SynchronizedLyricsFrame(const ByteVector &data, Header *h); SynchronizedLyricsFrame(const SynchronizedLyricsFrame &); SynchronizedLyricsFrame &operator=(const SynchronizedLyricsFrame &); class SynchronizedLyricsFramePrivate; SynchronizedLyricsFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp�������������������������������������0000664�0000000�0000000�00000023750�14447736377�0024403�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2013 by Lukas Krejci email : krejclu6@fel.cvut.cz ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevectorlist.h> #include <tpropertymap.h> #include <tdebug.h> #include "tableofcontentsframe.h" using namespace TagLib; using namespace ID3v2; class TableOfContentsFrame::TableOfContentsFramePrivate { public: TableOfContentsFramePrivate() : tagHeader(0), isTopLevel(false), isOrdered(false) { embeddedFrameList.setAutoDelete(true); } const ID3v2::Header *tagHeader; ByteVector elementID; bool isTopLevel; bool isOrdered; ByteVectorList childElements; FrameListMap embeddedFrameListMap; FrameList embeddedFrameList; }; namespace { // These functions are needed to try to aim for backward compatibility with // an API that previously (unreasonably) required null bytes to be appended // at the end of identifiers explicitly by the API user. // BIC: remove these ByteVector &strip(ByteVector &b) { if(b.endsWith('\0')) b.resize(b.size() - 1); return b; } ByteVectorList &strip(ByteVectorList &l) { for(ByteVectorList::Iterator it = l.begin(); it != l.end(); ++it) { strip(*it); } return l; } } // namespace //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// TableOfContentsFrame::TableOfContentsFrame(const ID3v2::Header *tagHeader, const ByteVector &data) : ID3v2::Frame(data), d(new TableOfContentsFramePrivate()) { d->tagHeader = tagHeader; setData(data); } TableOfContentsFrame::TableOfContentsFrame(const ByteVector &elementID, const ByteVectorList &children, const FrameList &embeddedFrames) : ID3v2::Frame("CTOC"), d(new TableOfContentsFramePrivate()) { d->elementID = elementID; strip(d->elementID); d->childElements = children; for(FrameList::ConstIterator it = embeddedFrames.begin(); it != embeddedFrames.end(); ++it) addEmbeddedFrame(*it); } TableOfContentsFrame::~TableOfContentsFrame() { delete d; } ByteVector TableOfContentsFrame::elementID() const { return d->elementID; } bool TableOfContentsFrame::isTopLevel() const { return d->isTopLevel; } bool TableOfContentsFrame::isOrdered() const { return d->isOrdered; } unsigned int TableOfContentsFrame::entryCount() const { return d->childElements.size(); } ByteVectorList TableOfContentsFrame::childElements() const { return d->childElements; } void TableOfContentsFrame::setElementID(const ByteVector &eID) { d->elementID = eID; strip(d->elementID); } void TableOfContentsFrame::setIsTopLevel(const bool &t) { d->isTopLevel = t; } void TableOfContentsFrame::setIsOrdered(const bool &o) { d->isOrdered = o; } void TableOfContentsFrame::setChildElements(const ByteVectorList &l) { d->childElements = l; strip(d->childElements); } void TableOfContentsFrame::addChildElement(const ByteVector &cE) { d->childElements.append(cE); strip(d->childElements); } void TableOfContentsFrame::removeChildElement(const ByteVector &cE) { ByteVectorList::Iterator it = d->childElements.find(cE); if(it == d->childElements.end()) it = d->childElements.find(cE + ByteVector("\0")); if(it != d->childElements.end()) d->childElements.erase(it); } const FrameListMap &TableOfContentsFrame::embeddedFrameListMap() const { return d->embeddedFrameListMap; } const FrameList &TableOfContentsFrame::embeddedFrameList() const { return d->embeddedFrameList; } const FrameList &TableOfContentsFrame::embeddedFrameList(const ByteVector &frameID) const { return d->embeddedFrameListMap[frameID]; } void TableOfContentsFrame::addEmbeddedFrame(Frame *frame) { d->embeddedFrameList.append(frame); d->embeddedFrameListMap[frame->frameID()].append(frame); } void TableOfContentsFrame::removeEmbeddedFrame(Frame *frame, bool del) { // remove the frame from the frame list FrameList::Iterator it = d->embeddedFrameList.find(frame); if(it != d->embeddedFrameList.end()) d->embeddedFrameList.erase(it); // ...and from the frame list map FrameList &mappedList = d->embeddedFrameListMap[frame->frameID()]; it = mappedList.find(frame); if(it != mappedList.end()) mappedList.erase(it); // ...and delete as desired if(del) delete frame; } void TableOfContentsFrame::removeEmbeddedFrames(const ByteVector &id) { FrameList l = d->embeddedFrameListMap[id]; for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) removeEmbeddedFrame(*it, true); } String TableOfContentsFrame::toString() const { String s = String(d->elementID) + ": top level: " + (d->isTopLevel ? "true" : "false") + ", ordered: " + (d->isOrdered ? "true" : "false"); if(!d->childElements.isEmpty()) { s+= ", chapters: [ " + String(d->childElements.toByteVector(", ")) + " ]"; } if(!d->embeddedFrameList.isEmpty()) { StringList frameIDs; for(FrameList::ConstIterator it = d->embeddedFrameList.begin(); it != d->embeddedFrameList.end(); ++it) frameIDs.append((*it)->frameID()); s += ", sub-frames: [ " + frameIDs.toString(", ") + " ]"; } return s; } PropertyMap TableOfContentsFrame::asProperties() const { PropertyMap map; map.unsupportedData().append(frameID() + String("/") + d->elementID); return map; } TableOfContentsFrame *TableOfContentsFrame::findByElementID(const ID3v2::Tag *tag, const ByteVector &eID) // static { ID3v2::FrameList tablesOfContents = tag->frameList("CTOC"); for(ID3v2::FrameList::ConstIterator it = tablesOfContents.begin(); it != tablesOfContents.end(); ++it) { TableOfContentsFrame *frame = dynamic_cast<TableOfContentsFrame *>(*it); if(frame && frame->elementID() == eID) return frame; } return 0; } TableOfContentsFrame *TableOfContentsFrame::findTopLevel(const ID3v2::Tag *tag) // static { ID3v2::FrameList tablesOfContents = tag->frameList("CTOC"); for(ID3v2::FrameList::ConstIterator it = tablesOfContents.begin(); it != tablesOfContents.end(); ++it) { TableOfContentsFrame *frame = dynamic_cast<TableOfContentsFrame *>(*it); if(frame && frame->isTopLevel()) return frame; } return 0; } void TableOfContentsFrame::parseFields(const ByteVector &data) { unsigned int size = data.size(); if(size < 6) { debug("A CTOC frame must contain at least 6 bytes (1 byte element ID terminated by " "null, 1 byte flags, 1 byte entry count and 1 byte child element ID terminated " "by null."); return; } int pos = 0; unsigned int embPos = 0; d->elementID = readStringField(data, String::Latin1, &pos).data(String::Latin1); d->isTopLevel = (data.at(pos) & 2) != 0; d->isOrdered = (data.at(pos++) & 1) != 0; unsigned int entryCount = static_cast<unsigned char>(data.at(pos++)); for(unsigned int i = 0; i < entryCount; i++) { ByteVector childElementID = readStringField(data, String::Latin1, &pos).data(String::Latin1); d->childElements.append(childElementID); } size -= pos; if(size < header()->size()) return; while(embPos < size - header()->size()) { Frame *frame = FrameFactory::instance()->createFrame(data.mid(pos + embPos), d->tagHeader); if(!frame) return; // Checks to make sure that frame parsed correctly. if(frame->size() <= 0) { delete frame; return; } embPos += frame->size() + header()->size(); addEmbeddedFrame(frame); } } ByteVector TableOfContentsFrame::renderFields() const { ByteVector data; data.append(d->elementID); data.append('\0'); char flags = 0; if(d->isTopLevel) flags += 2; if(d->isOrdered) flags += 1; data.append(flags); data.append(static_cast<char>(entryCount())); ByteVectorList::ConstIterator it = d->childElements.begin(); while(it != d->childElements.end()) { data.append(*it); data.append('\0'); it++; } FrameList l = d->embeddedFrameList; for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) { (*it)->header()->setVersion(header()->version()); data.append((*it)->render()); } return data; } TableOfContentsFrame::TableOfContentsFrame(const ID3v2::Header *tagHeader, const ByteVector &data, Header *h) : Frame(h), d(new TableOfContentsFramePrivate()) { d->tagHeader = tagHeader; parseFields(fieldData(data)); } ������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/tableofcontentsframe.h���������������������������������������0000664�0000000�0000000�00000021701�14447736377�0024042�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2013 by Lukas Krejci email : krejclu6@fel.cvut.cz ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_TABLEOFCONTENTSFRAME #define TAGLIB_TABLEOFCONTENTSFRAME #include "id3v2tag.h" #include "id3v2frame.h" #include "tbytevectorlist.h" namespace TagLib { namespace ID3v2 { /*! * This is an implementation of ID3v2 table of contents frames. Purpose * of this frame is to allow a table of contents to be defined. */ //! An implementation of ID3v2 table of contents frames class TAGLIB_EXPORT TableOfContentsFrame : public ID3v2::Frame { friend class FrameFactory; public: /*! * Creates a table of contents frame based on \a data. \a tagHeader is * required as the internal frames are parsed based on the tag version. */ TableOfContentsFrame(const ID3v2::Header *tagHeader, const ByteVector &data); /*! * Creates a table of contents frame with the element ID \a elementID, * the child elements \a children and embedded frames, which become owned * by this frame, in \a embeddedFrames. */ TableOfContentsFrame(const ByteVector &elementID, const ByteVectorList &children = ByteVectorList(), const FrameList &embeddedFrames = FrameList()); /*! * Destroys the frame. */ ~TableOfContentsFrame(); /*! * Returns the elementID of the frame. Element ID * is a null terminated string, however it's not human-readable. * * \see setElementID() */ ByteVector elementID() const; /*! * Returns true, if the frame is top-level (doesn't have * any parent CTOC frame). * * \see setIsTopLevel() */ bool isTopLevel() const; /*! * Returns true, if the child elements list entries * are ordered. * * \see setIsOrdered() */ bool isOrdered() const; /*! * Returns count of child elements of the frame. It always * corresponds to size of child elements list. * * \see childElements() */ unsigned int entryCount() const; /*! * Returns list of child elements of the frame. * * \see setChildElements() */ ByteVectorList childElements() const; /*! * Sets the elementID of the frame to \a eID. If \a eID isn't * null terminated, a null char is appended automatically. * * \see elementID() */ void setElementID(const ByteVector &eID); /*! * Sets, if the frame is top-level (doesn't have * any parent CTOC frame). * * \see isTopLevel() */ void setIsTopLevel(const bool &t); /*! * Sets, if the child elements list entries * are ordered. * * \see isOrdered() */ void setIsOrdered(const bool &o); /*! * Sets list of child elements of the frame to \a l. * * \see childElements() */ void setChildElements(const ByteVectorList &l); /*! * Adds \a cE to list of child elements of the frame. * * \see childElements() */ void addChildElement(const ByteVector &cE); /*! * Removes \a cE to list of child elements of the frame. * * \see childElements() */ void removeChildElement(const ByteVector &cE); /*! * Returns a reference to the frame list map. This is an FrameListMap of * all of the frames embedded in the CTOC frame. * * This is the most convenient structure for accessing the CTOC frame's * embedded frames. Many frame types allow multiple instances of the same * frame type so this is a map of lists. In most cases however there will * only be a single frame of a certain type. * * \warning You should not modify this data structure directly, instead * use addEmbeddedFrame() and removeEmbeddedFrame(). * * \see embeddedFrameList() */ const FrameListMap &embeddedFrameListMap() const; /*! * Returns a reference to the embedded frame list. This is an FrameList * of all of the frames embedded in the CTOC frame in the order that they * were parsed. * * This can be useful if for example you want iterate over the CTOC frame's * embedded frames in the order that they occur in the CTOC frame. * * \warning You should not modify this data structure directly, instead * use addEmbeddedFrame() and removeEmbeddedFrame(). */ const FrameList &embeddedFrameList() const; /*! * Returns the embedded frame list for frames with the id \a frameID * or an empty list if there are no embedded frames of that type. This * is just a convenience and is equivalent to: * * \code * embeddedFrameListMap()[frameID]; * \endcode * * \see embeddedFrameListMap() */ const FrameList &embeddedFrameList(const ByteVector &frameID) const; /*! * Add an embedded frame to the CTOC frame. At this point the CTOC frame * takes ownership of the embedded frame and will handle freeing its memory. * * \note Using this method will invalidate any pointers on the list * returned by embeddedFrameList() */ void addEmbeddedFrame(Frame *frame); /*! * Remove an embedded frame from the CTOC frame. If \a del is true the frame's * memory will be freed; if it is false, it must be deleted by the user. * * \note Using this method will invalidate any pointers on the list * returned by embeddedFrameList() */ void removeEmbeddedFrame(Frame *frame, bool del = true); /*! * Remove all embedded frames of type \a id from the CTOC frame and free their * memory. * * \note Using this method will invalidate any pointers on the list * returned by embeddedFrameList() */ void removeEmbeddedFrames(const ByteVector &id); virtual String toString() const; PropertyMap asProperties() const; /*! * CTOC frames each have a unique element ID. This searches for a CTOC * frame with the element ID \a eID and returns a pointer to it. This * can be used to link together parent and child CTOC frames. * * \see elementID() */ static TableOfContentsFrame *findByElementID(const Tag *tag, const ByteVector &eID); /*! * CTOC frames each contain a flag that indicates, if CTOC frame is top-level (there isn't * any frame, which contains this frame in its child elements list). Only a single frame * within tag can be top-level. This searches for a top-level CTOC frame. * * \see isTopLevel() */ static TableOfContentsFrame *findTopLevel(const Tag *tag); protected: virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: TableOfContentsFrame(const ID3v2::Header *tagHeader, const ByteVector &data, Header *h); TableOfContentsFrame(const TableOfContentsFrame &); TableOfContentsFrame &operator=(const TableOfContentsFrame &); class TableOfContentsFramePrivate; TableOfContentsFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ���������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/textidentificationframe.cpp����������������������������������0000664�0000000�0000000�00000033540�14447736377�0025105�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevectorlist.h> #include <id3v2tag.h> #include "textidentificationframe.h" #include "tpropertymap.h" #include "id3v1genres.h" using namespace TagLib; using namespace ID3v2; class TextIdentificationFrame::TextIdentificationFramePrivate { public: TextIdentificationFramePrivate() : textEncoding(String::Latin1) {} String::Type textEncoding; StringList fieldList; }; //////////////////////////////////////////////////////////////////////////////// // TextIdentificationFrame public members //////////////////////////////////////////////////////////////////////////////// TextIdentificationFrame::TextIdentificationFrame(const ByteVector &type, String::Type encoding) : Frame(type), d(new TextIdentificationFramePrivate()) { d->textEncoding = encoding; } TextIdentificationFrame::TextIdentificationFrame(const ByteVector &data) : Frame(data), d(new TextIdentificationFramePrivate()) { setData(data); } TextIdentificationFrame *TextIdentificationFrame::createTIPLFrame(const PropertyMap &properties) // static { TextIdentificationFrame *frame = new TextIdentificationFrame("TIPL"); StringList l; for(PropertyMap::ConstIterator it = properties.begin(); it != properties.end(); ++it){ const String role = involvedPeopleMap()[it->first]; if(role.isEmpty()) // should not happen continue; l.append(role); l.append(it->second.toString(",")); // comma-separated list of names } frame->setText(l); return frame; } TextIdentificationFrame *TextIdentificationFrame::createTMCLFrame(const PropertyMap &properties) // static { TextIdentificationFrame *frame = new TextIdentificationFrame("TMCL"); StringList l; for(PropertyMap::ConstIterator it = properties.begin(); it != properties.end(); ++it){ if(!it->first.startsWith(instrumentPrefix)) // should not happen continue; l.append(it->first.substr(instrumentPrefix.size())); l.append(it->second.toString(",")); } frame->setText(l); return frame; } TextIdentificationFrame::~TextIdentificationFrame() { delete d; } void TextIdentificationFrame::setText(const StringList &l) { d->fieldList = l; } void TextIdentificationFrame::setText(const String &s) { d->fieldList = s; } String TextIdentificationFrame::toString() const { return d->fieldList.toString(); } StringList TextIdentificationFrame::fieldList() const { return d->fieldList; } String::Type TextIdentificationFrame::textEncoding() const { return d->textEncoding; } void TextIdentificationFrame::setTextEncoding(String::Type encoding) { d->textEncoding = encoding; } namespace { // array of allowed TIPL prefixes and their corresponding key value const std::pair<const char *, const char *> involvedPeople[] = { std::make_pair("ARRANGER", "ARRANGER"), std::make_pair("ENGINEER", "ENGINEER"), std::make_pair("PRODUCER", "PRODUCER"), std::make_pair("DJ-MIX", "DJMIXER"), std::make_pair("MIX", "MIXER"), }; const size_t involvedPeopleSize = sizeof(involvedPeople) / sizeof(involvedPeople[0]); } // namespace const KeyConversionMap &TextIdentificationFrame::involvedPeopleMap() // static { static KeyConversionMap m; if(m.isEmpty()) { for(size_t i = 0; i < involvedPeopleSize; ++i) m.insert(involvedPeople[i].second, involvedPeople[i].first); } return m; } PropertyMap TextIdentificationFrame::asProperties() const { if(frameID() == "TIPL") return makeTIPLProperties(); if(frameID() == "TMCL") return makeTMCLProperties(); PropertyMap map; String tagName = frameIDToKey(frameID()); if(tagName.isEmpty()) { map.unsupportedData().append(frameID()); return map; } StringList values = fieldList(); if(tagName == "GENRE") { // Special case: Support ID3v1-style genre numbers. They are not officially supported in // ID3v2, however it seems that still a lot of programs use them. for(StringList::Iterator it = values.begin(); it != values.end(); ++it) { bool ok = false; int test = it->toInt(&ok); // test if the genre value is an integer if(ok) *it = ID3v1::genre(test); } } else if(tagName == "DATE") { for(StringList::Iterator it = values.begin(); it != values.end(); ++it) { // ID3v2 specifies ISO8601 timestamps which contain a 'T' as separator between date and time. // Since this is unusual in other formats, the T is removed. int tpos = it->find("T"); if(tpos != -1) (*it)[tpos] = ' '; } } PropertyMap ret; ret.insert(tagName, values); return ret; } //////////////////////////////////////////////////////////////////////////////// // TextIdentificationFrame protected members //////////////////////////////////////////////////////////////////////////////// void TextIdentificationFrame::parseFields(const ByteVector &data) { // Don't try to parse invalid frames if(data.size() < 2) return; // read the string data type (the first byte of the field data) d->textEncoding = static_cast<String::Type>(data[0]); // split the byte array into chunks based on the string type (two byte delimiter // for unicode encodings) int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; // build a small counter to strip nulls off the end of the field int dataLength = data.size() - 1; while(dataLength > 0 && data[dataLength] == 0) dataLength--; while(dataLength % byteAlign != 0) dataLength++; ByteVectorList l = ByteVectorList::split(data.mid(1, dataLength), textDelimiter(d->textEncoding), byteAlign); d->fieldList.clear(); // append those split values to the list and make sure that the new string's // type is the same specified for this frame unsigned short firstBom = 0; for(ByteVectorList::ConstIterator it = l.begin(); it != l.end(); it++) { if(!it->isEmpty() || (it == l.begin() && frameID() == "TXXX")) { if(d->textEncoding == String::Latin1) { d->fieldList.append(Tag::latin1StringHandler()->parse(*it)); } else { String::Type textEncoding = d->textEncoding; if(textEncoding == String::UTF16) { if(it == l.begin()) { firstBom = it->mid(0, 2).toUShort(); } else { unsigned short subsequentBom = it->mid(0, 2).toUShort(); if(subsequentBom != 0xfeff && subsequentBom != 0xfffe) { if(firstBom == 0xfeff) { textEncoding = String::UTF16BE; } else if(firstBom == 0xfffe) { textEncoding = String::UTF16LE; } } } } d->fieldList.append(String(*it, textEncoding)); } } } } ByteVector TextIdentificationFrame::renderFields() const { String::Type encoding = checkTextEncoding(d->fieldList, d->textEncoding); ByteVector v; v.append(static_cast<char>(encoding)); for(StringList::ConstIterator it = d->fieldList.begin(); it != d->fieldList.end(); it++) { // Since the field list is null delimited, if this is not the first // element in the list, append the appropriate delimiter for this // encoding. if(it != d->fieldList.begin()) v.append(textDelimiter(encoding)); v.append((*it).data(encoding)); } return v; } //////////////////////////////////////////////////////////////////////////////// // TextIdentificationFrame private members //////////////////////////////////////////////////////////////////////////////// TextIdentificationFrame::TextIdentificationFrame(const ByteVector &data, Header *h) : Frame(h), d(new TextIdentificationFramePrivate()) { parseFields(fieldData(data)); } PropertyMap TextIdentificationFrame::makeTIPLProperties() const { PropertyMap map; if(fieldList().size() % 2 != 0){ // according to the ID3 spec, TIPL must contain an even number of entries map.unsupportedData().append(frameID()); return map; } StringList l = fieldList(); for(StringList::ConstIterator it = l.begin(); it != l.end(); ++it) { bool found = false; for(size_t i = 0; i < involvedPeopleSize; ++i) if(*it == involvedPeople[i].first) { map.insert(involvedPeople[i].second, (++it)->split(",")); found = true; break; } if(!found){ // invalid involved role -> mark whole frame as unsupported in order to be consistent with writing map.clear(); map.unsupportedData().append(frameID()); return map; } } return map; } PropertyMap TextIdentificationFrame::makeTMCLProperties() const { PropertyMap map; if(fieldList().size() % 2 != 0){ // according to the ID3 spec, TMCL must contain an even number of entries map.unsupportedData().append(frameID()); return map; } StringList l = fieldList(); for(StringList::ConstIterator it = l.begin(); it != l.end(); ++it) { String instrument = it->upper(); if(instrument.isEmpty()) { // instrument is not a valid key -> frame unsupported map.clear(); map.unsupportedData().append(frameID()); return map; } map.insert(L"PERFORMER:" + instrument, (++it)->split(",")); } return map; } //////////////////////////////////////////////////////////////////////////////// // UserTextIdentificationFrame public members //////////////////////////////////////////////////////////////////////////////// UserTextIdentificationFrame::UserTextIdentificationFrame(String::Type encoding) : TextIdentificationFrame("TXXX", encoding), d(0) { StringList l; l.append(String()); l.append(String()); setText(l); } UserTextIdentificationFrame::UserTextIdentificationFrame(const ByteVector &data) : TextIdentificationFrame(data) { checkFields(); } UserTextIdentificationFrame::UserTextIdentificationFrame(const String &description, const StringList &values, String::Type encoding) : TextIdentificationFrame("TXXX", encoding), d(0) { setDescription(description); setText(values); } String UserTextIdentificationFrame::toString() const { // first entry is the description itself, drop from values list StringList l = fieldList(); for(StringList::Iterator it = l.begin(); it != l.end(); ++it) { l.erase(it); break; } return "[" + description() + "] " + l.toString(); } String UserTextIdentificationFrame::description() const { return !TextIdentificationFrame::fieldList().isEmpty() ? TextIdentificationFrame::fieldList().front() : String(); } StringList UserTextIdentificationFrame::fieldList() const { // TODO: remove this function return TextIdentificationFrame::fieldList(); } void UserTextIdentificationFrame::setText(const String &text) { if(description().isEmpty()) setDescription(String()); TextIdentificationFrame::setText(StringList(description()).append(text)); } void UserTextIdentificationFrame::setText(const StringList &fields) { if(description().isEmpty()) setDescription(String()); TextIdentificationFrame::setText(StringList(description()).append(fields)); } void UserTextIdentificationFrame::setDescription(const String &s) { StringList l = fieldList(); if(l.isEmpty()) l.append(s); else l[0] = s; TextIdentificationFrame::setText(l); } PropertyMap UserTextIdentificationFrame::asProperties() const { PropertyMap map; String tagName = txxxToKey(description()); StringList v = fieldList(); for(StringList::ConstIterator it = v.begin(); it != v.end(); ++it) if(it != v.begin()) map.insert(tagName, *it); return map; } UserTextIdentificationFrame *UserTextIdentificationFrame::find( ID3v2::Tag *tag, const String &description) // static { FrameList l = tag->frameList("TXXX"); for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) { UserTextIdentificationFrame *f = dynamic_cast<UserTextIdentificationFrame *>(*it); if(f && f->description() == description) return f; } return 0; } //////////////////////////////////////////////////////////////////////////////// // UserTextIdentificationFrame private members //////////////////////////////////////////////////////////////////////////////// UserTextIdentificationFrame::UserTextIdentificationFrame(const ByteVector &data, Header *h) : TextIdentificationFrame(data, h) { checkFields(); } void UserTextIdentificationFrame::checkFields() { int fields = fieldList().size(); if(fields == 0) setDescription(String()); if(fields <= 1) setText(String()); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/textidentificationframe.h������������������������������������0000664�0000000�0000000�00000030467�14447736377�0024557�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_TEXTIDENTIFICATIONFRAME_H #define TAGLIB_TEXTIDENTIFICATIONFRAME_H #include "tstringlist.h" #include "tmap.h" #include "taglib_export.h" #include "id3v2frame.h" namespace TagLib { namespace ID3v2 { class Tag; typedef Map<String, String> KeyConversionMap; //! An ID3v2 text identification frame implementation /*! * This is an implementation of the most common type of ID3v2 frame -- text * identification frames. There are a number of variations on this. Those * enumerated in the ID3v2.4 standard are: * * <ul> * <li><b>TALB</b> Album/Movie/Show title</li> * <li><b>TBPM</b> BPM (beats per minute)</li> * <li><b>TCOM</b> Composer</li> * <li><b>TCON</b> Content type</li> * <li><b>TCOP</b> Copyright message</li> * <li><b>TDEN</b> Encoding time</li> * <li><b>TDLY</b> Playlist delay</li> * <li><b>TDOR</b> Original release time</li> * <li><b>TDRC</b> Recording time</li> * <li><b>TDRL</b> Release time</li> * <li><b>TDTG</b> Tagging time</li> * <li><b>TENC</b> Encoded by</li> * <li><b>TEXT</b> Lyricist/Text writer</li> * <li><b>TFLT</b> File type</li> * <li><b>TIPL</b> Involved people list</li> * <li><b>TIT1</b> Content group description</li> * <li><b>TIT2</b> Title/songname/content description</li> * <li><b>TIT3</b> Subtitle/Description refinement</li> * <li><b>TKEY</b> Initial key</li> * <li><b>TLAN</b> Language(s)</li> * <li><b>TLEN</b> Length</li> * <li><b>TMCL</b> Musician credits list</li> * <li><b>TMED</b> Media type</li> * <li><b>TMOO</b> Mood</li> * <li><b>TOAL</b> Original album/movie/show title</li> * <li><b>TOFN</b> Original filename</li> * <li><b>TOLY</b> Original lyricist(s)/text writer(s)</li> * <li><b>TOPE</b> Original artist(s)/performer(s)</li> * <li><b>TOWN</b> File owner/licensee</li> * <li><b>TPE1</b> Lead performer(s)/Soloist(s)</li> * <li><b>TPE2</b> Band/orchestra/accompaniment</li> * <li><b>TPE3</b> Conductor/performer refinement</li> * <li><b>TPE4</b> Interpreted, remixed, or otherwise modified by</li> * <li><b>TPOS</b> Part of a set</li> * <li><b>TPRO</b> Produced notice</li> * <li><b>TPUB</b> Publisher</li> * <li><b>TRCK</b> Track number/Position in set</li> * <li><b>TRSN</b> Internet radio station name</li> * <li><b>TRSO</b> Internet radio station owner</li> * <li><b>TSOA</b> Album sort order</li> * <li><b>TSOP</b> Performer sort order</li> * <li><b>TSOT</b> Title sort order</li> * <li><b>TSRC</b> ISRC (international standard recording code)</li> * <li><b>TSSE</b> Software/Hardware and settings used for encoding</li> * <li><b>TSST</b> Set subtitle</li> * </ul> * * The ID3v2 Frames document gives a description of each of these formats * and the expected order of strings in each. ID3v2::Header::frameID() can * be used to determine the frame type. * * \note If non-Latin1 compatible strings are used with this class, even if * the text encoding is set to Latin1, the frame will be written using UTF8 * (with the encoding flag appropriately set in the output). */ class TAGLIB_EXPORT TextIdentificationFrame : public Frame { friend class FrameFactory; public: /*! * Construct an empty frame of type \a type. Uses \a encoding as the * default text encoding. * * \note In this case you must specify the text encoding as it * resolves the ambiguity between constructors. * * \note Please see the note in the class description regarding Latin1. */ TextIdentificationFrame(const ByteVector &type, String::Type encoding); /*! * This is a dual purpose constructor. \a data can either be binary data * that should be parsed or (at a minimum) the frame ID. */ explicit TextIdentificationFrame(const ByteVector &data); /*! * This is a special factory method to create a TIPL (involved people list) * frame from the given \a properties. Will parse key=[list of values] data * into the TIPL format as specified in the ID3 standard. */ static TextIdentificationFrame *createTIPLFrame(const PropertyMap &properties); /*! * This is a special factory method to create a TMCL (musician credits list) * frame from the given \a properties. Will parse key=[list of values] data * into the TMCL format as specified in the ID3 standard, where key should be * of the form instrumentPrefix:instrument. */ static TextIdentificationFrame *createTMCLFrame(const PropertyMap &properties); /*! * Destroys this TextIdentificationFrame instance. */ virtual ~TextIdentificationFrame(); /*! * Text identification frames are a list of string fields. * * This function will accept either a StringList or a String (using the * StringList constructor that accepts a single String). * * \note This will not change the text encoding of the frame even if the * strings passed in are not of the same encoding. Please use * setEncoding(s.type()) if you wish to change the encoding of the frame. */ void setText(const StringList &l); // Reimplementations. virtual void setText(const String &s); virtual String toString() const; /*! * Returns the text encoding that will be used in rendering this frame. * This defaults to the type that was either specified in the constructor * or read from the frame when parsed. * * \note Please see the note in the class description regarding Latin1. * * \see setTextEncoding() * \see render() */ String::Type textEncoding() const; /*! * Sets the text encoding to be used when rendering this frame to * \a encoding. * * \note Please see the note in the class description regarding Latin1. * * \see textEncoding() * \see render() */ void setTextEncoding(String::Type encoding); /*! * Returns a list of the strings in this frame. */ StringList fieldList() const; /*! * Returns a KeyConversionMap mapping a role as it would be used in a PropertyMap * to the corresponding key used in a TIPL ID3 frame to describe that role. */ static const KeyConversionMap &involvedPeopleMap(); PropertyMap asProperties() const; protected: // Reimplementations. virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; /*! * The constructor used by the FrameFactory. */ TextIdentificationFrame(const ByteVector &data, Header *h); private: TextIdentificationFrame(const TextIdentificationFrame &); TextIdentificationFrame &operator=(const TextIdentificationFrame &); /*! * Parses the special structure of a TIPL frame * Only the whitelisted roles "ARRANGER", "ENGINEER", "PRODUCER", * "DJMIXER" (ID3: "DJ-MIX") and "MIXER" (ID3: "MIX") are allowed. */ PropertyMap makeTIPLProperties() const; /*! * Parses the special structure of a TMCL frame. */ PropertyMap makeTMCLProperties() const; class TextIdentificationFramePrivate; TextIdentificationFramePrivate *d; }; /*! * This is a specialization of text identification frames that allows for * user defined entries. Each entry has a description in addition to the * normal list of fields that a text identification frame has. * * This description identifies the frame and must be unique. */ //! An ID3v2 custom text identification frame implementation class TAGLIB_EXPORT UserTextIdentificationFrame : public TextIdentificationFrame { friend class FrameFactory; public: /*! * Constructs an empty user defined text identification frame. For this to be * a useful frame both a description and text must be set. */ explicit UserTextIdentificationFrame(String::Type encoding = String::Latin1); /*! * Creates a frame based on \a data. */ explicit UserTextIdentificationFrame(const ByteVector &data); /*! * Creates a user defined text identification frame with the given \a description * and \a values. */ UserTextIdentificationFrame(const String &description, const StringList &values, String::Type encoding = String::UTF8); virtual String toString() const; /*! * Returns the description for this frame. */ String description() const; /*! * Sets the description of the frame to \a s. \a s must be unique. You can * check for the presence of another user defined text frame of the same type * using find() and testing for null. */ void setDescription(const String &s); StringList fieldList() const; void setText(const String &text); void setText(const StringList &fields); /*! * A UserTextIdentificationFrame is parsed into a PropertyMap as follows: * - the key is the frame's description, uppercased * - if the description contains '::', only the substring after that * separator is considered as key (compatibility with exfalso) * - if the above rules don't yield a valid key (e.g. containing non-ASCII * characters), the returned map will contain an entry "TXXX/<description>" * in its unsupportedData() list. * - The values will be copies of the fieldList(). * - If the description() appears as value in fieldList(), it will be omitted * in the value list, in order to be compatible with TagLib which copies * the description() into the fieldList(). */ PropertyMap asProperties() const; /*! * Searches for the user defined text frame with the description \a description * in \a tag. This returns null if no matching frames were found. */ static UserTextIdentificationFrame *find(Tag *tag, const String &description); private: UserTextIdentificationFrame(const ByteVector &data, Header *h); UserTextIdentificationFrame(const TextIdentificationFrame &); UserTextIdentificationFrame &operator=(const UserTextIdentificationFrame &); void checkFields(); class UserTextIdentificationFramePrivate; UserTextIdentificationFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp��������������������������������0000664�0000000�0000000�00000010577�14447736377�0025425�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevectorlist.h> #include <tpropertymap.h> #include <tdebug.h> #include "id3v2tag.h" #include "uniquefileidentifierframe.h" using namespace TagLib; using namespace ID3v2; class UniqueFileIdentifierFrame::UniqueFileIdentifierFramePrivate { public: String owner; ByteVector identifier; }; //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data) : ID3v2::Frame(data), d(new UniqueFileIdentifierFramePrivate()) { setData(data); } UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const String &owner, const ByteVector &id) : ID3v2::Frame("UFID"), d(new UniqueFileIdentifierFramePrivate()) { d->owner = owner; d->identifier = id; } UniqueFileIdentifierFrame::~UniqueFileIdentifierFrame() { delete d; } String UniqueFileIdentifierFrame::owner() const { return d->owner; } ByteVector UniqueFileIdentifierFrame::identifier() const { return d->identifier; } void UniqueFileIdentifierFrame::setOwner(const String &s) { d->owner = s; } void UniqueFileIdentifierFrame::setIdentifier(const ByteVector &v) { d->identifier = v; } String UniqueFileIdentifierFrame::toString() const { return String(); } PropertyMap UniqueFileIdentifierFrame::asProperties() const { PropertyMap map; if(d->owner == "http://musicbrainz.org") { map.insert("MUSICBRAINZ_TRACKID", String(d->identifier)); } else { map.unsupportedData().append(frameID() + String("/") + d->owner); } return map; } UniqueFileIdentifierFrame *UniqueFileIdentifierFrame::findByOwner(const ID3v2::Tag *tag, const String &o) // static { ID3v2::FrameList comments = tag->frameList("UFID"); for(ID3v2::FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) { UniqueFileIdentifierFrame *frame = dynamic_cast<UniqueFileIdentifierFrame *>(*it); if(frame && frame->owner() == o) return frame; } return 0; } void UniqueFileIdentifierFrame::parseFields(const ByteVector &data) { if(data.size() < 1) { debug("An UFID frame must contain at least 1 byte."); return; } int pos = 0; d->owner = readStringField(data, String::Latin1, &pos); d->identifier = data.mid(pos); } ByteVector UniqueFileIdentifierFrame::renderFields() const { ByteVector data; data.append(d->owner.data(String::Latin1)); data.append(static_cast<char>(0)); data.append(d->identifier); return data; } UniqueFileIdentifierFrame::UniqueFileIdentifierFrame(const ByteVector &data, Header *h) : Frame(h), d(new UniqueFileIdentifierFramePrivate()) { parseFields(fieldData(data)); } ���������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/uniquefileidentifierframe.h����������������������������������0000664�0000000�0000000�00000010540�14447736377�0025060�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_UNIQUEFILEIDENTIFIERFRAME #define TAGLIB_UNIQUEFILEIDENTIFIERFRAME #include "id3v2frame.h" namespace TagLib { namespace ID3v2 { /*! * This is an implementation of ID3v2 unique file identifier frames. This * frame is used to identify the file in an arbitrary database identified * by the owner field. */ //! An implementation of ID3v2 unique identifier frames class TAGLIB_EXPORT UniqueFileIdentifierFrame : public ID3v2::Frame { friend class FrameFactory; public: /*! * Creates a unique file identifier frame based on \a data. */ UniqueFileIdentifierFrame(const ByteVector &data); /*! * Creates a unique file identifier frame with the owner \a owner and * the identification \a id. */ UniqueFileIdentifierFrame(const String &owner, const ByteVector &id); /*! * Destroys the frame. */ ~UniqueFileIdentifierFrame(); /*! * Returns the owner for the frame; essentially this is the key for * determining which identification scheme this key belongs to. This * will usually either be an email address or URL for the person or tool * used to create the unique identifier. * * \see setOwner() */ String owner() const; /*! * Returns the unique identifier. Though sometimes this is a text string * it also may be binary data and as much should be assumed when handling * it. */ ByteVector identifier() const; /*! * Sets the owner of the identification scheme to \a s. * * \see owner() */ void setOwner(const String &s); /*! * Sets the unique file identifier to \a v. * * \see identifier() */ void setIdentifier(const ByteVector &v); virtual String toString() const; PropertyMap asProperties() const; /*! * UFID frames each have a unique owner. This searches for a UFID * frame with the owner \a o and returns a pointer to it. * * \see owner() */ static UniqueFileIdentifierFrame *findByOwner(const Tag *tag, const String &o); protected: virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: UniqueFileIdentifierFrame(const UniqueFileIdentifierFrame &); UniqueFileIdentifierFrame &operator=(const UniqueFileIdentifierFrame &); UniqueFileIdentifierFrame(const ByteVector &data, Header *h); class UniqueFileIdentifierFramePrivate; UniqueFileIdentifierFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/unknownframe.cpp���������������������������������������������0000664�0000000�0000000�00000005714�14447736377�0022710�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "unknownframe.h" using namespace TagLib; using namespace ID3v2; class UnknownFrame::UnknownFramePrivate { public: ByteVector fieldData; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// UnknownFrame::UnknownFrame(const ByteVector &data) : Frame(data), d(new UnknownFramePrivate()) { setData(data); } UnknownFrame::~UnknownFrame() { delete d; } String UnknownFrame::toString() const { return String(); } ByteVector UnknownFrame::data() const { return d->fieldData; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void UnknownFrame::parseFields(const ByteVector &data) { d->fieldData = data; } ByteVector UnknownFrame::renderFields() const { return d->fieldData; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// UnknownFrame::UnknownFrame(const ByteVector &data, Header *h) : Frame(h), d(new UnknownFramePrivate()) { parseFields(fieldData(data)); } ����������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/unknownframe.h�����������������������������������������������0000664�0000000�0000000�00000006200�14447736377�0022344�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_UNKNOWNFRAME_H #define TAGLIB_UNKNOWNFRAME_H #include "id3v2frame.h" #include "taglib_export.h" namespace TagLib { namespace ID3v2 { //! A frame type \e unknown to TagLib. /*! * This class represents a frame type not known (or more often simply * unimplemented) in TagLib. This is here provide a basic API for * manipulating the binary data of unknown frames and to provide a means * of rendering such \e unknown frames. * * Please note that a cleaner way of handling frame types that TagLib * does not understand is to subclass ID3v2::Frame and ID3v2::FrameFactory * to have your frame type supported through the standard ID3v2 mechanism. */ class TAGLIB_EXPORT UnknownFrame : public Frame { friend class FrameFactory; public: UnknownFrame(const ByteVector &data); virtual ~UnknownFrame(); virtual String toString() const; /*! * Returns the field data (everything but the header) for this frame. */ ByteVector data() const; protected: virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: UnknownFrame(const ByteVector &data, Header *h); UnknownFrame(const UnknownFrame &); UnknownFrame &operator=(const UnknownFrame &); class UnknownFramePrivate; UnknownFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.cpp��������������������������������0000664�0000000�0000000�00000014016�14447736377�0025514�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org copyright : (C) 2006 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "unsynchronizedlyricsframe.h" #include <tbytevectorlist.h> #include <id3v2tag.h> #include <tdebug.h> #include <tpropertymap.h> using namespace TagLib; using namespace ID3v2; class UnsynchronizedLyricsFrame::UnsynchronizedLyricsFramePrivate { public: UnsynchronizedLyricsFramePrivate() : textEncoding(String::Latin1) {} String::Type textEncoding; ByteVector language; String description; String text; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(String::Type encoding) : Frame("USLT"), d(new UnsynchronizedLyricsFramePrivate()) { d->textEncoding = encoding; } UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(const ByteVector &data) : Frame(data), d(new UnsynchronizedLyricsFramePrivate()) { setData(data); } UnsynchronizedLyricsFrame::~UnsynchronizedLyricsFrame() { delete d; } String UnsynchronizedLyricsFrame::toString() const { return d->text; } ByteVector UnsynchronizedLyricsFrame::language() const { return d->language; } String UnsynchronizedLyricsFrame::description() const { return d->description; } String UnsynchronizedLyricsFrame::text() const { return d->text; } void UnsynchronizedLyricsFrame::setLanguage(const ByteVector &languageEncoding) { d->language = languageEncoding.mid(0, 3); } void UnsynchronizedLyricsFrame::setDescription(const String &s) { d->description = s; } void UnsynchronizedLyricsFrame::setText(const String &s) { d->text = s; } String::Type UnsynchronizedLyricsFrame::textEncoding() const { return d->textEncoding; } void UnsynchronizedLyricsFrame::setTextEncoding(String::Type encoding) { d->textEncoding = encoding; } PropertyMap UnsynchronizedLyricsFrame::asProperties() const { PropertyMap map; String key = description().upper(); if(key.isEmpty() || key == "LYRICS") map.insert("LYRICS", text()); else map.insert("LYRICS:" + key, text()); return map; } UnsynchronizedLyricsFrame *UnsynchronizedLyricsFrame::findByDescription(const ID3v2::Tag *tag, const String &d) // static { ID3v2::FrameList lyrics = tag->frameList("USLT"); for(ID3v2::FrameList::ConstIterator it = lyrics.begin(); it != lyrics.end(); ++it){ UnsynchronizedLyricsFrame *frame = dynamic_cast<UnsynchronizedLyricsFrame *>(*it); if(frame && frame->description() == d) return frame; } return 0; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void UnsynchronizedLyricsFrame::parseFields(const ByteVector &data) { if(data.size() < 5) { debug("An unsynchronized lyrics frame must contain at least 5 bytes."); return; } d->textEncoding = static_cast<String::Type>(data[0]); d->language = data.mid(1, 3); int byteAlign = d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8 ? 1 : 2; ByteVectorList l = ByteVectorList::split(data.mid(4), textDelimiter(d->textEncoding), byteAlign, 2); if(l.size() == 2) { if(d->textEncoding == String::Latin1) { d->description = Tag::latin1StringHandler()->parse(l.front()); d->text = Tag::latin1StringHandler()->parse(l.back()); } else { d->description = String(l.front(), d->textEncoding); d->text = String(l.back(), d->textEncoding); } } } ByteVector UnsynchronizedLyricsFrame::renderFields() const { StringList sl; sl.append(d->description); sl.append(d->text); const String::Type encoding = checkTextEncoding(sl, d->textEncoding); ByteVector v; v.append(static_cast<char>(encoding)); v.append(d->language.size() == 3 ? d->language : "XXX"); v.append(d->description.data(encoding)); v.append(textDelimiter(encoding)); v.append(d->text.data(encoding)); return v; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// UnsynchronizedLyricsFrame::UnsynchronizedLyricsFrame(const ByteVector &data, Header *h) : Frame(h), d(new UnsynchronizedLyricsFramePrivate()) { parseFields(fieldData(data)); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/unsynchronizedlyricsframe.h����������������������������������0000664�0000000�0000000�00000014271�14447736377�0025164�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org copyright : (C) 2006 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H #define TAGLIB_UNSYNCHRONIZEDLYRICSFRAME_H #include "id3v2frame.h" namespace TagLib { namespace ID3v2 { //! ID3v2 unsynchronized lyrics frame /*! * An implementation of ID3v2 unsynchronized lyrics. */ class TAGLIB_EXPORT UnsynchronizedLyricsFrame : public Frame { friend class FrameFactory; public: /*! * Construct an empty unsynchronized lyrics frame that will use the text encoding * \a encoding. */ explicit UnsynchronizedLyricsFrame(String::Type encoding = String::Latin1); /*! * Construct a unsynchronized lyrics frame based on the data in \a data. */ explicit UnsynchronizedLyricsFrame(const ByteVector &data); /*! * Destroys this UnsynchronizedLyricsFrame instance. */ virtual ~UnsynchronizedLyricsFrame(); /*! * Returns the text of this unsynchronized lyrics frame. * * \see text() */ virtual String toString() const; /*! * Returns the language encoding as a 3 byte encoding as specified by * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a>. * * \note Most taggers simply ignore this value. * * \see setLanguage() */ ByteVector language() const; /*! * Returns the description of this unsynchronized lyrics frame. * * \note Most taggers simply ignore this value. * * \see setDescription() */ String description() const; /*! * Returns the text of this unsynchronized lyrics frame. * * \see setText() */ String text() const; /*! * Set the language using the 3 byte language code from * <a href="http://en.wikipedia.org/wiki/ISO_639">ISO-639-2</a> to * \a languageCode. * * \see language() */ void setLanguage(const ByteVector &languageCode); /*! * Sets the description of the unsynchronized lyrics frame to \a s. * * \see description() */ void setDescription(const String &s); /*! * Sets the text portion of the unsynchronized lyrics frame to \a s. * * \see text() */ virtual void setText(const String &s); /*! * Returns the text encoding that will be used in rendering this frame. * This defaults to the type that was either specified in the constructor * or read from the frame when parsed. * * \see setTextEncoding() * \see render() */ String::Type textEncoding() const; /*! * Sets the text encoding to be used when rendering this frame to * \a encoding. * * \see textEncoding() * \see render() */ void setTextEncoding(String::Type encoding); /*! Parses this frame as PropertyMap with a single key. * - if description() is empty or "LYRICS", the key will be "LYRICS" * - if description() is not a valid PropertyMap key, the frame will be * marked unsupported by an entry "USLT/<description>" in the unsupportedData() * attribute of the returned map. * - otherwise, the key will be "LYRICS:<description>" * - The single value will be the frame's text(). * Note that currently the language() field is not supported by the PropertyMap * interface. */ PropertyMap asProperties() const; /*! * LyricsFrames each have a unique description. This searches for a lyrics * frame with the description \a d and returns a pointer to it. If no * frame is found that matches the given description null is returned. * * \see description() */ static UnsynchronizedLyricsFrame *findByDescription(const Tag *tag, const String &d); protected: // Reimplementations. virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; private: /*! * The constructor used by the FrameFactory. */ UnsynchronizedLyricsFrame(const ByteVector &data, Header *h); UnsynchronizedLyricsFrame(const UnsynchronizedLyricsFrame &); UnsynchronizedLyricsFrame &operator=(const UnsynchronizedLyricsFrame &); class UnsynchronizedLyricsFramePrivate; UnsynchronizedLyricsFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/urllinkframe.cpp���������������������������������������������0000664�0000000�0000000�00000015023�14447736377�0022663�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org copyright : (C) 2006 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "urllinkframe.h" #include "id3v2tag.h" #include <tdebug.h> #include <tstringlist.h> #include <tpropertymap.h> using namespace TagLib; using namespace ID3v2; class UrlLinkFrame::UrlLinkFramePrivate { public: String url; }; class UserUrlLinkFrame::UserUrlLinkFramePrivate { public: UserUrlLinkFramePrivate() : textEncoding(String::Latin1) {} String::Type textEncoding; String description; }; //////////////////////////////////////////////////////////////////////////////// // UrlLinkFrame public members //////////////////////////////////////////////////////////////////////////////// UrlLinkFrame::UrlLinkFrame(const ByteVector &data) : Frame(data), d(new UrlLinkFramePrivate()) { setData(data); } UrlLinkFrame::~UrlLinkFrame() { delete d; } void UrlLinkFrame::setUrl(const String &s) { d->url = s; } String UrlLinkFrame::url() const { return d->url; } void UrlLinkFrame::setText(const String &s) { setUrl(s); } String UrlLinkFrame::toString() const { return url(); } PropertyMap UrlLinkFrame::asProperties() const { String key = frameIDToKey(frameID()); PropertyMap map; if(key.isEmpty()) // unknown W*** frame - this normally shouldn't happen map.unsupportedData().append(frameID()); else map.insert(key, url()); return map; } //////////////////////////////////////////////////////////////////////////////// // UrlLinkFrame protected members //////////////////////////////////////////////////////////////////////////////// void UrlLinkFrame::parseFields(const ByteVector &data) { d->url = String(data); } ByteVector UrlLinkFrame::renderFields() const { return d->url.data(String::Latin1); } UrlLinkFrame::UrlLinkFrame(const ByteVector &data, Header *h) : Frame(h), d(new UrlLinkFramePrivate()) { parseFields(fieldData(data)); } //////////////////////////////////////////////////////////////////////////////// // UserUrlLinkFrame public members //////////////////////////////////////////////////////////////////////////////// UserUrlLinkFrame::UserUrlLinkFrame(String::Type encoding) : UrlLinkFrame("WXXX"), d(new UserUrlLinkFramePrivate()) { d->textEncoding = encoding; } UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data) : UrlLinkFrame(data), d(new UserUrlLinkFramePrivate()) { setData(data); } UserUrlLinkFrame::~UserUrlLinkFrame() { delete d; } String UserUrlLinkFrame::toString() const { return "[" + description() + "] " + url(); } String::Type UserUrlLinkFrame::textEncoding() const { return d->textEncoding; } void UserUrlLinkFrame::setTextEncoding(String::Type encoding) { d->textEncoding = encoding; } String UserUrlLinkFrame::description() const { return d->description; } void UserUrlLinkFrame::setDescription(const String &s) { d->description = s; } PropertyMap UserUrlLinkFrame::asProperties() const { PropertyMap map; String key = description().upper(); if(key.isEmpty() || key == "URL") map.insert("URL", url()); else map.insert("URL:" + key, url()); return map; } UserUrlLinkFrame *UserUrlLinkFrame::find(ID3v2::Tag *tag, const String &description) // static { FrameList l = tag->frameList("WXXX"); for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) { UserUrlLinkFrame *f = dynamic_cast<UserUrlLinkFrame *>(*it); if(f && f->description() == description) return f; } return 0; } //////////////////////////////////////////////////////////////////////////////// // UserUrlLinkFrame protected members //////////////////////////////////////////////////////////////////////////////// void UserUrlLinkFrame::parseFields(const ByteVector &data) { if(data.size() < 2) { debug("A user URL link frame must contain at least 2 bytes."); return; } int pos = 0; d->textEncoding = static_cast<String::Type>(data[0]); pos += 1; if(d->textEncoding == String::Latin1 || d->textEncoding == String::UTF8) { int offset = data.find(textDelimiter(d->textEncoding), pos); if(offset < pos) return; d->description = String(data.mid(pos, offset - pos), d->textEncoding); pos = offset + 1; } else { int len = data.mid(pos).find(textDelimiter(d->textEncoding), 0, 2); if(len < 0) return; d->description = String(data.mid(pos, len), d->textEncoding); pos += len + 2; } setUrl(String(data.mid(pos))); } ByteVector UserUrlLinkFrame::renderFields() const { ByteVector v; String::Type encoding = checkTextEncoding(d->description, d->textEncoding); v.append(static_cast<char>(encoding)); v.append(d->description.data(encoding)); v.append(textDelimiter(encoding)); v.append(url().data(String::Latin1)); return v; } UserUrlLinkFrame::UserUrlLinkFrame(const ByteVector &data, Header *h) : UrlLinkFrame(data, h), d(new UserUrlLinkFramePrivate()) { parseFields(fieldData(data)); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/frames/urllinkframe.h�����������������������������������������������0000664�0000000�0000000�00000014256�14447736377�0022337�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org copyright : (C) 2006 by Urs Fleisch email : ufleisch@users.sourceforge.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_URLLINKFRAME_H #define TAGLIB_URLLINKFRAME_H #include "id3v2frame.h" namespace TagLib { namespace ID3v2 { //! ID3v2 URL frame /*! * An implementation of ID3v2 URL link frames. */ class TAGLIB_EXPORT UrlLinkFrame : public Frame { friend class FrameFactory; public: /*! * This is a dual purpose constructor. \a data can either be binary data * that should be parsed or (at a minimum) the frame ID. */ explicit UrlLinkFrame(const ByteVector &data); /*! * Destroys this UrlLinkFrame instance. */ virtual ~UrlLinkFrame(); /*! * Returns the URL. */ virtual String url() const; /*! * Sets the URL to \a s. */ virtual void setUrl(const String &s); // Reimplementations. virtual void setText(const String &s); virtual String toString() const; PropertyMap asProperties() const; protected: virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; /*! * The constructor used by the FrameFactory. */ UrlLinkFrame(const ByteVector &data, Header *h); private: UrlLinkFrame(const UrlLinkFrame &); UrlLinkFrame &operator=(const UrlLinkFrame &); class UrlLinkFramePrivate; UrlLinkFramePrivate *d; }; //! ID3v2 User defined URL frame /*! * This is a specialization of URL link frames that allows for * user defined entries. Each entry has a description in addition to the * normal list of fields that a URL link frame has. * * This description identifies the frame and must be unique. */ class TAGLIB_EXPORT UserUrlLinkFrame : public UrlLinkFrame { friend class FrameFactory; public: /*! * Constructs an empty user defined URL link frame. For this to be * a useful frame both a description and text must be set. */ explicit UserUrlLinkFrame(String::Type encoding = String::Latin1); /*! * This is a dual purpose constructor. \a data can either be binary data * that should be parsed or (at a minimum) the frame ID. */ explicit UserUrlLinkFrame(const ByteVector &data); /*! * Destroys this UserUrlLinkFrame instance. */ virtual ~UserUrlLinkFrame(); // Reimplementations. virtual String toString() const; /*! * Returns the text encoding that will be used in rendering this frame. * This defaults to the type that was either specified in the constructor * or read from the frame when parsed. * * \see setTextEncoding() * \see render() */ String::Type textEncoding() const; /*! * Sets the text encoding to be used when rendering this frame to * \a encoding. * * \see textEncoding() * \see render() */ void setTextEncoding(String::Type encoding); /*! * Returns the description for this frame. */ String description() const; /*! * Sets the description of the frame to \a s. \a s must be unique. */ void setDescription(const String &s); /*! * Parses the UserUrlLinkFrame as PropertyMap. The description() is taken as key, * and the URL as single value. * - if description() is empty, the key will be "URL". * - otherwise, if description() is not a valid key (e.g. containing non-ASCII * characters), the returned map will contain an entry "WXXX/<description>" * in its unsupportedData() list. */ PropertyMap asProperties() const; /*! * Searches for the user defined url frame with the description \a description * in \a tag. This returns null if no matching frames were found. */ static UserUrlLinkFrame *find(Tag *tag, const String &description); protected: virtual void parseFields(const ByteVector &data); virtual ByteVector renderFields() const; /*! * The constructor used by the FrameFactory. */ UserUrlLinkFrame(const ByteVector &data, Header *h); private: UserUrlLinkFrame(const UserUrlLinkFrame &); UserUrlLinkFrame &operator=(const UserUrlLinkFrame &); class UserUrlLinkFramePrivate; UserUrlLinkFramePrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2.2.0.txt�������������������������������������������������������0000664�0000000�0000000�00000171531�14447736377�0020204�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Informal standard M. Nilsson Document: id3v2-00.txt 26th March 1998 ID3 tag version 2 Status of this document This document is an Informal standard and is released so that implementors could have a set standard before the formal standard is set. The formal standard will use another version number if not identical to what is described in this document. The contents in this document may change for clarifications but never for added or altered functionallity. Distribution of this document is unlimited. Abstract The recent gain of popularity for MPEG layer III audio files on the internet forced a standardised way of storing information about an audio file within itself to determinate its origin and contents. Today the most accepted way to do this is with the so called ID3 tag, which is simple but very limited and in some cases very unsuitable. The ID3 tag has very limited space in every field, very limited numbers of fields, not expandable or upgradeable and is placed at the end of a the file, which is unsuitable for streaming audio. This draft is an attempt to answer these issues with a new version of the ID3 tag. 1. Table of contents 2. Conventions in this document 3. ID3v2 overview 3.1. ID3v2 header 3.2. ID3v2 frames overview 4. Declared ID3v2 frames 4.1. Unique file identifier 4.2. Text information frames 4.2.1. Text information frames - details 4.2.2. User defined text information frame 4.3. URL link frames 4.3.1. URL link frames - details 4.3.2. User defined URL link frame 4.4. Involved people list 4.5. Music CD Identifier 4.6. Event timing codes 4.7. MPEG location lookup table 4.8. Synced tempo codes 4.9. Unsychronised lyrics/text transcription 4.10. Synchronised lyrics/text 4.11. Comments 4.12. Relative volume adjustment 4.13. Equalisation 4.14. Reverb 4.15. Attached picture 4.16. General encapsulated object 4.17. Play counter 4.18. Popularimeter 4.19. Recommended buffer size 4.20. Encrypted meta frame 4.21. Audio encryption 4.22. Linked information 5. The 'unsynchronisation scheme' 6. Copyright 7. References 8. Appendix A. Appendix A - ID3-Tag Specification V1.1 A.1. Overview A.2. ID3v1 Implementation A.3. Genre List A.4. Track addition - ID3v1.1 9. Author's Address 2. Conventions in this document In the examples, text within "" is a text string exactly as it appears in a file. Numbers preceded with $ are hexadecimal and numbers preceded with % are binary. $xx is used to indicate a byte with unknown content. %x is used to indicate a bit with unknown content. The most significant bit (MSB) of a byte is called 'bit 7' and the least significant bit (LSB) is called 'bit 0'. A tag is the whole tag described in this document. A frame is a block of information in the tag. The tag consists of a header, frames and optional padding. A field is a piece of information; one value, a string etc. A numeric string is a string that consists of the characters 0-9 only. 3. ID3v2 overview The two biggest design goals were to be able to implement ID3v2 without disturbing old software too much and that ID3v2 should be expandable. The first criterion is met by the simple fact that the MPEG [MPEG] decoding software uses a syncsignal, embedded in the audiostream, to 'lock on to' the audio. Since the ID3v2 tag doesn't contain a valid syncsignal, no software will attempt to play the tag. If, for any reason, coincidence make a syncsignal appear within the tag it will be taken care of by the 'unsynchronisation scheme' described in section 5. The second criterion has made a more noticeable impact on the design of the ID3v2 tag. It is constructed as a container for several information blocks, called frames, whose format need not be known to the software that encounters them. At the start of every frame there is an identifier that explains the frames's format and content, and a size descriptor that allows software to skip unknown frames. If a total revision of the ID3v2 tag should be needed, there is a version number and a size descriptor in the ID3v2 header. The ID3 tag described in this document is mainly targeted to files encoded with MPEG-2 layer I, MPEG-2 layer II, MPEG-2 layer III and MPEG-2.5, but may work with other types of encoded audio. The bitorder in ID3v2 is most significant bit first (MSB). The byteorder in multibyte numbers is most significant byte first (e.g. $12345678 would be encoded $12 34 56 78). It is permitted to include padding after all the final frame (at the end of the ID3 tag), making the size of all the frames together smaller than the size given in the head of the tag. A possible purpose of this padding is to allow for adding a few additional frames or enlarge existing frames within the tag without having to rewrite the entire file. The value of the padding bytes must be $00. 3.1. ID3v2 header The ID3v2 tag header, which should be the first information in the file, is 10 bytes as follows: ID3/file identifier "ID3" ID3 version $02 00 ID3 flags %xx000000 ID3 size 4 * %0xxxxxxx The first three bytes of the tag are always "ID3" to indicate that this is an ID3 tag, directly followed by the two version bytes. The first byte of ID3 version is it's major version, while the second byte is its revision number. All revisions are backwards compatible while major versions are not. If software with ID3v2 and below support should encounter version three or higher it should simply ignore the whole tag. Version and revision will never be $FF. The first bit (bit 7) in the 'ID3 flags' is indicating whether or not unsynchronisation is used (see section 5 for details); a set bit indicates usage. The second bit (bit 6) is indicating whether or not compression is used; a set bit indicates usage. Since no compression scheme has been decided yet, the ID3 decoder (for now) should just ignore the entire tag if the compression bit is set. The ID3 tag size is encoded with four bytes where the first bit (bit 7) is set to zero in every byte, making a total of 28 bits. The zeroed bits are ignored, so a 257 bytes long tag is represented as $00 00 02 01. The ID3 tag size is the size of the complete tag after unsychronisation, including padding, excluding the header (total tag size - 10). The reason to use 28 bits (representing up to 256MB) for size description is that we don't want to run out of space here. A ID3v2 tag can be detected with the following pattern: $49 44 33 yy yy xx zz zz zz zz Where yy is less than $FF, xx is the 'flags' byte and zz is less than $80. 3.2. ID3v2 frames overview The headers of the frames are similar in their construction. They consist of one three character identifier (capital A-Z and 0-9) and one three byte size field, making a total of six bytes. The header is excluded from the size. Identifiers beginning with "X", "Y" and "Z" are for experimental use and free for everyone to use. Have in mind that someone else might have used the same identifier as you. All other identifiers are either used or reserved for future use. The three character frame identifier is followed by a three byte size descriptor, making a total header size of six bytes in every frame. The size is calculated as framesize excluding frame identifier and size descriptor (frame size - 6). There is no fixed order of the frames' appearance in the tag, although it is desired that the frames are arranged in order of significance concerning the recognition of the file. An example of such order: UFI, MCI, TT2 ... A tag must contain at least one frame. A frame must be at least 1 byte big, excluding the 6-byte header. If nothing else is said a string is represented as ISO-8859-1 [ISO-8859-1] characters in the range $20 - $FF. All unicode strings [UNICODE] use 16-bit unicode 2.0 (ISO/IEC 10646-1:1993, UCS-2). All numeric strings are always encoded as ISO-8859-1. Terminated strings are terminated with $00 if encoded with ISO-8859-1 and $00 00 if encoded as unicode. If nothing else is said newline character is forbidden. In ISO-8859-1 a new line is represented, when allowed, with $0A only. Frames that allow different types of text encoding have a text encoding description byte directly after the frame size. If ISO-8859-1 is used this byte should be $00, if unicode is used it should be $01. The three byte language field is used to describe the language of the frame's content, according to ISO-639-2 [ISO-639-2]. All URLs [URL] may be relative, e.g. "picture.png", "../doc.txt". If a frame is longer than it should be, e.g. having more fields than specified in this document, that indicates that additions to the frame have been made in a later version of the ID3 standard. This is reflected by the revision number in the header of the tag. 4. Declared ID3v2 frames The following frames are declared in this draft. 4.19 BUF Recommended buffer size 4.17 CNT Play counter 4.11 COM Comments 4.21 CRA Audio encryption 4.20 CRM Encrypted meta frame 4.6 ETC Event timing codes 4.13 EQU Equalization 4.16 GEO General encapsulated object 4.4 IPL Involved people list 4.22 LNK Linked information 4.5 MCI Music CD Identifier 4.7 MLL MPEG location lookup table 4.15 PIC Attached picture 4.18 POP Popularimeter 4.14 REV Reverb 4.12 RVA Relative volume adjustment 4.10 SLT Synchronized lyric/text 4.8 STC Synced tempo codes 4.2.1 TAL Album/Movie/Show title 4.2.1 TBP BPM (Beats Per Minute) 4.2.1 TCM Composer 4.2.1 TCO Content type 4.2.1 TCR Copyright message 4.2.1 TDA Date 4.2.1 TDY Playlist delay 4.2.1 TEN Encoded by 4.2.1 TFT File type 4.2.1 TIM Time 4.2.1 TKE Initial key 4.2.1 TLA Language(s) 4.2.1 TLE Length 4.2.1 TMT Media type 4.2.1 TOA Original artist(s)/performer(s) 4.2.1 TOF Original filename 4.2.1 TOL Original Lyricist(s)/text writer(s) 4.2.1 TOR Original release year 4.2.1 TOT Original album/Movie/Show title 4.2.1 TP1 Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group 4.2.1 TP2 Band/Orchestra/Accompaniment 4.2.1 TP3 Conductor/Performer refinement 4.2.1 TP4 Interpreted, remixed, or otherwise modified by 4.2.1 TPA Part of a set 4.2.1 TPB Publisher 4.2.1 TRC ISRC (International Standard Recording Code) 4.2.1 TRD Recording dates 4.2.1 TRK Track number/Position in set 4.2.1 TSI Size 4.2.1 TSS Software/hardware and settings used for encoding 4.2.1 TT1 Content group description 4.2.1 TT2 Title/Songname/Content description 4.2.1 TT3 Subtitle/Description refinement 4.2.1 TXT Lyricist/text writer 4.2.2 TXX User defined text information frame 4.2.1 TYE Year 4.1 UFI Unique file identifier 4.9 ULT Unsychronized lyric/text transcription 4.3.1 WAF Official audio file webpage 4.3.1 WAR Official artist/performer webpage 4.3.1 WAS Official audio source webpage 4.3.1 WCM Commercial information 4.3.1 WCP Copyright/Legal information 4.3.1 WPB Publishers official webpage 4.3.2 WXX User defined URL link frame 4.1. Unique file identifier This frame's purpose is to be able to identify the audio file in a database that may contain more information relevant to the content. Since standardisation of such a database is beyond this document, all frames begin with a null-terminated string with a URL [URL] containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific database implementation. Questions regarding the database should be sent to the indicated email address. The URL should not be used for the actual database queries. If a $00 is found directly after the 'Frame size' the whole frame should be ignored, and preferably be removed. The 'Owner identifier' is then followed by the actual identifier, which may be up to 64 bytes. There may be more than one "UFI" frame in a tag, but only one with the same 'Owner identifier'. Unique file identifier "UFI" Frame size $xx xx xx Owner identifier <textstring> $00 Identifier <up to 64 bytes binary data> 4.2. Text information frames The text information frames are the most important frames, containing information like artist, album and more. There may only be one text information frame of its kind in an tag. If the textstring is followed by a termination ($00 (00)) all the following information should be ignored and not be displayed. All the text information frames have the following format: Text information identifier "T00" - "TZZ" , excluding "TXX", described in 4.2.2. Frame size $xx xx xx Text encoding $xx Information <textstring> 4.2.1. Text information frames - details TT1 The 'Content group description' frame is used if the sound belongs to a larger category of sounds/music. For example, classical music is often sorted in different musical sections (e.g. "Piano Concerto", "Weather - Hurricane"). TT2 The 'Title/Songname/Content description' frame is the actual name of the piece (e.g. "Adagio", "Hurricane Donna"). TT3 The 'Subtitle/Description refinement' frame is used for information directly related to the contents title (e.g. "Op. 16" or "Performed live at wembley"). TP1 The 'Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group' is used for the main artist(s). They are seperated with the "/" character. TP2 The 'Band/Orchestra/Accompaniment' frame is used for additional information about the performers in the recording. TP3 The 'Conductor' frame is used for the name of the conductor. TP4 The 'Interpreted, remixed, or otherwise modified by' frame contains more information about the people behind a remix and similar interpretations of another existing piece. TCM The 'Composer(s)' frame is intended for the name of the composer(s). They are seperated with the "/" character. TXT The 'Lyricist(s)/text writer(s)' frame is intended for the writer(s) of the text or lyrics in the recording. They are seperated with the "/" character. TLA The 'Language(s)' frame should contain the languages of the text or lyrics in the audio file. The language is represented with three characters according to ISO-639-2. If more than one language is used in the text their language codes should follow according to their usage. TCO The content type, which previously (in ID3v1.1, see appendix A) was stored as a one byte numeric value only, is now a numeric string. You may use one or several of the types as ID3v1.1 did or, since the category list would be impossible to maintain with accurate and up to date categories, define your own. References to the ID3v1 genres can be made by, as first byte, enter "(" followed by a number from the genres list (section A.3.) and ended with a ")" character. This is optionally followed by a refinement, e.g. "(21)" or "(4)Eurodisco". Several references can be made in the same frame, e.g. "(51)(39)". If the refinement should begin with a "(" character it should be replaced with "((", e.g. "((I can figure out any genre)" or "(55)((I think...)". The following new content types is defined in ID3v2 and is implemented in the same way as the numerig content types, e.g. "(RX)". RX Remix CR Cover TAL The 'Album/Movie/Show title' frame is intended for the title of the recording(/source of sound) which the audio in the file is taken from. TPA The 'Part of a set' frame is a numeric string that describes which part of a set the audio came from. This frame is used if the source described in the "TAL" frame is divided into several mediums, e.g. a double CD. The value may be extended with a "/" character and a numeric string containing the total number of parts in the set. E.g. "1/2". TRK The 'Track number/Position in set' frame is a numeric string containing the order number of the audio-file on its original recording. This may be extended with a "/" character and a numeric string containing the total numer of tracks/elements on the original recording. E.g. "4/9". TRC The 'ISRC' frame should contian the International Standard Recording Code [ISRC]. TYE The 'Year' frame is a numeric string with a year of the recording. This frames is always four characters long (until the year 10000). TDA The 'Date' frame is a numeric string in the DDMM format containing the date for the recording. This field is always four characters long. TIM The 'Time' frame is a numeric string in the HHMM format containing the time for the recording. This field is always four characters long. TRD The 'Recording dates' frame is a intended to be used as complement to the "TYE", "TDA" and "TIM" frames. E.g. "4th-7th June, 12th June" in combination with the "TYE" frame. TMT The 'Media type' frame describes from which media the sound originated. This may be a textstring or a reference to the predefined media types found in the list below. References are made within "(" and ")" and are optionally followed by a text refinement, e.g. "(MC) with four channels". If a text refinement should begin with a "(" character it should be replaced with "((" in the same way as in the "TCO" frame. Predefined refinements is appended after the media type, e.g. "(CD/S)" or "(VID/PAL/VHS)". DIG Other digital media /A Analog transfer from media ANA Other analog media /WAC Wax cylinder /8CA 8-track tape cassette CD CD /A Analog transfer from media /DD DDD /AD ADD /AA AAD LD Laserdisc /A Analog transfer from media TT Turntable records /33 33.33 rpm /45 45 rpm /71 71.29 rpm /76 76.59 rpm /78 78.26 rpm /80 80 rpm MD MiniDisc /A Analog transfer from media DAT DAT /A Analog transfer from media /1 standard, 48 kHz/16 bits, linear /2 mode 2, 32 kHz/16 bits, linear /3 mode 3, 32 kHz/12 bits, nonlinear, low speed /4 mode 4, 32 kHz/12 bits, 4 channels /5 mode 5, 44.1 kHz/16 bits, linear /6 mode 6, 44.1 kHz/16 bits, 'wide track' play DCC DCC /A Analog transfer from media DVD DVD /A Analog transfer from media TV Television /PAL PAL /NTSC NTSC /SECAM SECAM VID Video /PAL PAL /NTSC NTSC /SECAM SECAM /VHS VHS /SVHS S-VHS /BETA BETAMAX RAD Radio /FM FM /AM AM /LW LW /MW MW TEL Telephone /I ISDN MC MC (normal cassette) /4 4.75 cm/s (normal speed for a two sided cassette) /9 9.5 cm/s /I Type I cassette (ferric/normal) /II Type II cassette (chrome) /III Type III cassette (ferric chrome) /IV Type IV cassette (metal) REE Reel /9 9.5 cm/s /19 19 cm/s /38 38 cm/s /76 76 cm/s /I Type I cassette (ferric/normal) /II Type II cassette (chrome) /III Type III cassette (ferric chrome) /IV Type IV cassette (metal) TFT The 'File type' frame indicates which type of audio this tag defines. The following type and refinements are defined: MPG MPEG Audio /1 MPEG 2 layer I /2 MPEG 2 layer II /3 MPEG 2 layer III /2.5 MPEG 2.5 /AAC Advanced audio compression but other types may be used, not for these types though. This is used in a similar way to the predefined types in the "TMT" frame, but without parenthesis. If this frame is not present audio type is assumed to be "MPG". TBP BPM is short for beats per minute, and is easily computed by dividing the number of beats in a musical piece with its length. To get a more accurate result, do the BPM calculation on the main-part only. To acquire best result measure the time between each beat and calculate individual BPM for each beat and use the median value as result. BPM is an integer and represented as a numerical string. TCR The 'Copyright message' frame, which must begin with a year and a space character (making five characters), is intended for the copyright holder of the original sound, not the audio file itself. The absence of this frame means only that the copyright information is unavailable or has been removed, and must not be interpreted to mean that the sound is public domain. Every time this field is displayed the field must be preceded with "Copyright " (C) " ", where (C) is one character showing a C in a circle. TPB The 'Publisher' frame simply contains the name of the label or publisher. TEN The 'Encoded by' frame contains the name of the person or organisation that encoded the audio file. This field may contain a copyright message, if the audio file also is copyrighted by the encoder. TSS The 'Software/hardware and settings used for encoding' frame includes the used audio encoder and its settings when the file was encoded. Hardware refers to hardware encoders, not the computer on which a program was run. TOF The 'Original filename' frame contains the preferred filename for the file, since some media doesn't allow the desired length of the filename. The filename is case sensitive and includes its suffix. TLE The 'Length' frame contains the length of the audiofile in milliseconds, represented as a numeric string. TSI The 'Size' frame contains the size of the audiofile in bytes excluding the tag, represented as a numeric string. TDY The 'Playlist delay' defines the numbers of milliseconds of silence between every song in a playlist. The player should use the "ETC" frame, if present, to skip initial silence and silence at the end of the audio to match the 'Playlist delay' time. The time is represented as a numeric string. TKE The 'Initial key' frame contains the musical key in which the sound starts. It is represented as a string with a maximum length of three characters. The ground keys are represented with "A","B","C","D","E", "F" and "G" and halfkeys represented with "b" and "#". Minor is represented as "m". Example "Cbm". Off key is represented with an "o" only. TOT The 'Original album/Movie/Show title' frame is intended for the title of the original recording(/source of sound), if for example the music in the file should be a cover of a previously released song. TOA The 'Original artist(s)/performer(s)' frame is intended for the performer(s) of the original recording, if for example the music in the file should be a cover of a previously released song. The performers are seperated with the "/" character. TOL The 'Original Lyricist(s)/text writer(s)' frame is intended for the text writer(s) of the original recording, if for example the music in the file should be a cover of a previously released song. The text writers are seperated with the "/" character. TOR The 'Original release year' frame is intended for the year when the original recording, if for example the music in the file should be a cover of a previously released song, was released. The field is formatted as in the "TDY" frame. 4.2.2. User defined text information frame This frame is intended for one-string text information concerning the audiofile in a similar way to the other "T"xx frames. The frame body consists of a description of the string, represented as a terminated string, followed by the actual string. There may be more than one "TXX" frame in each tag, but only one with the same description. User defined... "TXX" Frame size $xx xx xx Text encoding $xx Description <textstring> $00 (00) Value <textstring> 4.3. URL link frames With these frames dynamic data such as webpages with touring information, price information or plain ordinary news can be added to the tag. There may only be one URL [URL] link frame of its kind in an tag, except when stated otherwise in the frame description. If the textstring is followed by a termination ($00 (00)) all the following information should be ignored and not be displayed. All URL link frames have the following format: URL link frame "W00" - "WZZ" , excluding "WXX" (described in 4.3.2.) Frame size $xx xx xx URL <textstring> 4.3.1. URL link frames - details WAF The 'Official audio file webpage' frame is a URL pointing at a file specific webpage. WAR The 'Official artist/performer webpage' frame is a URL pointing at the artists official webpage. There may be more than one "WAR" frame in a tag if the audio contains more than one performer. WAS The 'Official audio source webpage' frame is a URL pointing at the official webpage for the source of the audio file, e.g. a movie. WCM The 'Commercial information' frame is a URL pointing at a webpage with information such as where the album can be bought. There may be more than one "WCM" frame in a tag. WCP The 'Copyright/Legal information' frame is a URL pointing at a webpage where the terms of use and ownership of the file is described. WPB The 'Publishers official webpage' frame is a URL pointing at the official wepage for the publisher. 4.3.2. User defined URL link frame This frame is intended for URL [URL] links concerning the audiofile in a similar way to the other "W"xx frames. The frame body consists of a description of the string, represented as a terminated string, followed by the actual URL. The URL is always encoded with ISO-8859-1 [ISO-8859-1]. There may be more than one "WXX" frame in each tag, but only one with the same description. User defined... "WXX" Frame size $xx xx xx Text encoding $xx Description <textstring> $00 (00) URL <textstring> 4.4. Involved people list Since there might be a lot of people contributing to an audio file in various ways, such as musicians and technicians, the 'Text information frames' are often insufficient to list everyone involved in a project. The 'Involved people list' is a frame containing the names of those involved, and how they were involved. The body simply contains a terminated string with the involvement directly followed by a terminated string with the involvee followed by a new involvement and so on. There may only be one "IPL" frame in each tag. Involved people list "IPL" Frame size $xx xx xx Text encoding $xx People list strings <textstrings> 4.5. Music CD Identifier This frame is intended for music that comes from a CD, so that the CD can be identified in databases such as the CDDB [CDDB]. The frame consists of a binary dump of the Table Of Contents, TOC, from the CD, which is a header of 4 bytes and then 8 bytes/track on the CD making a maximum of 804 bytes. This frame requires a present and valid "TRK" frame. There may only be one "MCI" frame in each tag. Music CD identifier "MCI" Frame size $xx xx xx CD TOC <binary data> 4.6. Event timing codes This frame allows synchronisation with key events in a song or sound. The head is: Event timing codes "ETC" Frame size $xx xx xx Time stamp format $xx Where time stamp format is: $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit Abolute time means that every stamp contains the time from the beginning of the file. Followed by a list of key events in the following format: Type of event $xx Time stamp $xx (xx ...) The 'Time stamp' is set to zero if directly at the beginning of the sound or after the previous event. All events should be sorted in chronological order. The type of event is as follows: $00 padding (has no meaning) $01 end of initial silence $02 intro start $03 mainpart start $04 outro start $05 outro end $06 verse begins $07 refrain begins $08 interlude $09 theme start $0A variation $0B key change $0C time change $0D unwanted noise (Snap, Crackle & Pop) $0E-$DF reserved for future use $E0-$EF not predefined sync 0-F $F0-$FC reserved for future use $FD audio end (start of silence) $FE audio file ends $FF one more byte of events follows (all the following bytes with the value $FF have the same function) The 'Not predefined sync's ($E0-EF) are for user events. You might want to synchronise your music to something, like setting of an explosion on-stage, turning on your screensaver etc. There may only be one "ETC" frame in each tag. 4.7. MPEG location lookup table To increase performance and accuracy of jumps within a MPEG [MPEG] audio file, frames with timecodes in different locations in the file might be useful. The ID3 frame includes references that the software can use to calculate positions in the file. After the frame header is a descriptor of how much the 'frame counter' should increase for every reference. If this value is two then the first reference points out the second frame, the 2nd reference the 4th frame, the 3rd reference the 6th frame etc. In a similar way the 'bytes between reference' and 'milliseconds between reference' points out bytes and milliseconds respectively. Each reference consists of two parts; a certain number of bits, as defined in 'bits for bytes deviation', that describes the difference between what is said in 'bytes between reference' and the reality and a certain number of bits, as defined in 'bits for milliseconds deviation', that describes the difference between what is said in 'milliseconds between reference' and the reality. The number of bits in every reference, i.e. 'bits for bytes deviation'+'bits for milliseconds deviation', must be a multiple of four. There may only be one "MLL" frame in each tag. Location lookup table "MLL" ID3 frame size $xx xx xx MPEG frames between reference $xx xx Bytes between reference $xx xx xx Milliseconds between reference $xx xx xx Bits for bytes deviation $xx Bits for milliseconds dev. $xx Then for every reference the following data is included; Deviation in bytes %xxx.... Deviation in milliseconds %xxx.... 4.8. Synced tempo codes For a more accurate description of the tempo of a musical piece this frame might be used. After the header follows one byte describing which time stamp format should be used. Then follows one or more tempo codes. Each tempo code consists of one tempo part and one time part. The tempo is in BPM described with one or two bytes. If the first byte has the value $FF, one more byte follows, which is added to the first giving a range from 2 - 510 BPM, since $00 and $01 is reserved. $00 is used to describe a beat-free time period, which is not the same as a music-free time period. $01 is used to indicate one single beat-stroke followed by a beat-free period. The tempo descriptor is followed by a time stamp. Every time the tempo in the music changes, a tempo descriptor may indicate this for the player. All tempo descriptors should be sorted in chronological order. The first beat-stroke in a time-period is at the same time as the beat description occurs. There may only be one "STC" frame in each tag. Synced tempo codes "STC" Frame size $xx xx xx Time stamp format $xx Tempo data <binary data> Where time stamp format is: $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit Abolute time means that every stamp contains the time from the beginning of the file. 4.9. Unsychronised lyrics/text transcription This frame contains the lyrics of the song or a text transcription of other vocal activities. The head includes an encoding descriptor and a content descriptor. The body consists of the actual text. The 'Content descriptor' is a terminated string. If no descriptor is entered, 'Content descriptor' is $00 (00) only. Newline characters are allowed in the text. Maximum length for the descriptor is 64 bytes. There may be more than one lyrics/text frame in each tag, but only one with the same language and content descriptor. Unsynced lyrics/text "ULT" Frame size $xx xx xx Text encoding $xx Language $xx xx xx Content descriptor <textstring> $00 (00) Lyrics/text <textstring> 4.10. Synchronised lyrics/text This is another way of incorporating the words, said or sung lyrics, in the audio file as text, this time, however, in sync with the audio. It might also be used to describing events e.g. occurring on a stage or on the screen in sync with the audio. The header includes a content descriptor, represented with as terminated textstring. If no descriptor is entered, 'Content descriptor' is $00 (00) only. Synced lyrics/text "SLT" Frame size $xx xx xx Text encoding $xx Language $xx xx xx Time stamp format $xx Content type $xx Content descriptor <textstring> $00 (00) Encoding: $00 ISO-8859-1 [ISO-8859-1] character set is used => $00 is sync identifier. $01 Unicode [UNICODE] character set is used => $00 00 is sync identifier. Content type: $00 is other $01 is lyrics $02 is text transcription $03 is movement/part name (e.g. "Adagio") $04 is events (e.g. "Don Quijote enters the stage") $05 is chord (e.g. "Bb F Fsus") Time stamp format is: $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit Abolute time means that every stamp contains the time from the beginning of the file. The text that follows the frame header differs from that of the unsynchronised lyrics/text transcription in one major way. Each syllable (or whatever size of text is considered to be convenient by the encoder) is a null terminated string followed by a time stamp denoting where in the sound file it belongs. Each sync thus has the following structure: Terminated text to be synced (typically a syllable) Sync identifier (terminator to above string) $00 (00) Time stamp $xx (xx ...) The 'time stamp' is set to zero or the whole sync is omitted if located directly at the beginning of the sound. All time stamps should be sorted in chronological order. The sync can be considered as a validator of the subsequent string. Newline characters are allowed in all "SLT" frames and should be used after every entry (name, event etc.) in a frame with the content type $03 - $04. A few considerations regarding whitespace characters: Whitespace separating words should mark the beginning of a new word, thus occurring in front of the first syllable of a new word. This is also valid for new line characters. A syllable followed by a comma should not be broken apart with a sync (both the syllable and the comma should be before the sync). An example: The "ULT" passage "Strangers in the night" $0A "Exchanging glances" would be "SLT" encoded as: "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx xx "glan" $00 xx xx "ces" $00 xx xx There may be more than one "SLT" frame in each tag, but only one with the same language and content descriptor. 4.11. Comments This frame replaces the old 30-character comment field in ID3v1. It consists of a frame head followed by encoding, language and content descriptors and is ended with the actual comment as a text string. Newline characters are allowed in the comment text string. There may be more than one comment frame in each tag, but only one with the same language and content descriptor. Comment "COM" Frame size $xx xx xx Text encoding $xx Language $xx xx xx Short content description <textstring> $00 (00) The actual text <textstring> 4.12. Relative volume adjustment This is a more subjective function than the previous ones. It allows the user to say how much he wants to increase/decrease the volume on each channel while the file is played. The purpose is to be able to align all files to a reference volume, so that you don't have to change the volume constantly. This frame may also be used to balance adjust the audio. If the volume peak levels are known then this could be described with the 'Peak volume right' and 'Peak volume left' field. If Peakvolume is not known these fields could be left zeroed or completely omitted. There may only be one "RVA" frame in each tag. Relative volume adjustment "RVA" Frame size $xx xx xx Increment/decrement %000000xx Bits used for volume descr. $xx Relative volume change, right $xx xx (xx ...) Relative volume change, left $xx xx (xx ...) Peak volume right $xx xx (xx ...) Peak volume left $xx xx (xx ...) In the increment/decrement field bit 0 is used to indicate the right channel and bit 1 is used to indicate the left channel. 1 is increment and 0 is decrement. The 'bits used for volume description' field is normally $10 (16 bits) for MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not be $00. The volume is always represented with whole bytes, padded in the beginning (highest bits) when 'bits used for volume description' is not a multiple of eight. 4.13. Equalisation This is another subjective, alignment frame. It allows the user to predefine an equalisation curve within the audio file. There may only be one "EQU" frame in each tag. Equalisation "EQU" Frame size $xx xx xx Adjustment bits $xx The 'adjustment bits' field defines the number of bits used for representation of the adjustment. This is normally $10 (16 bits) for MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not be $00. This is followed by 2 bytes + ('adjustment bits' rounded up to the nearest byte) for every equalisation band in the following format, giving a frequency range of 0 - 32767Hz: Increment/decrement %x (MSB of the Frequency) Frequency (lower 15 bits) Adjustment $xx (xx ...) The increment/decrement bit is 1 for increment and 0 for decrement. The equalisation bands should be ordered increasingly with reference to frequency. All frequencies don't have to be declared. Adjustments with the value $00 should be omitted. A frequency should only be described once in the frame. 4.14. Reverb Yet another subjective one. You may here adjust echoes of different kinds. Reverb left/right is the delay between every bounce in ms. Reverb bounces left/right is the number of bounces that should be made. $FF equals an infinite number of bounces. Feedback is the amount of volume that should be returned to the next echo bounce. $00 is 0%, $FF is 100%. If this value were $7F, there would be 50% volume reduction on the first bounce, yet 50% on the second and so on. Left to left means the sound from the left bounce to be played in the left speaker, while left to right means sound from the left bounce to be played in the right speaker. 'Premix left to right' is the amount of left sound to be mixed in the right before any reverb is applied, where $00 id 0% and $FF is 100%. 'Premix right to left' does the same thing, but right to left. Setting both premix to $FF would result in a mono output (if the reverb is applied symmetric). There may only be one "REV" frame in each tag. Reverb settings "REV" Frame size $00 00 0C Reverb left (ms) $xx xx Reverb right (ms) $xx xx Reverb bounces, left $xx Reverb bounces, right $xx Reverb feedback, left to left $xx Reverb feedback, left to right $xx Reverb feedback, right to right $xx Reverb feedback, right to left $xx Premix left to right $xx Premix right to left $xx 4.15. Attached picture This frame contains a picture directly related to the audio file. Image format is preferably "PNG" [PNG] or "JPG" [JFIF]. Description is a short description of the picture, represented as a terminated textstring. The description has a maximum length of 64 characters, but may be empty. There may be several pictures attached to one file, each in their individual "PIC" frame, but only one with the same content descriptor. There may only be one picture with the picture type declared as picture type $01 and $02 respectively. There is a possibility to put only a link to the image file by using the 'image format' "-->" and having a complete URL [URL] instead of picture data. The use of linked files should however be used restrictively since there is the risk of separation of files. Attached picture "PIC" Frame size $xx xx xx Text encoding $xx Image format $xx xx xx Picture type $xx Description <textstring> $00 (00) Picture data <binary data> Picture type: $00 Other $01 32x32 pixels 'file icon' (PNG only) $02 Other file icon $03 Cover (front) $04 Cover (back) $05 Leaflet page $06 Media (e.g. lable side of CD) $07 Lead artist/lead performer/soloist $08 Artist/performer $09 Conductor $0A Band/Orchestra $0B Composer $0C Lyricist/text writer $0D Recording Location $0E During recording $0F During performance $10 Movie/video screen capture $11 A bright coloured fish $12 Illustration $13 Band/artist logotype $14 Publisher/Studio logotype 4.16. General encapsulated object In this frame any type of file can be encapsulated. After the header, 'Frame size' and 'Encoding' follows 'MIME type' [MIME] and 'Filename' for the encapsulated object, both represented as terminated strings encoded with ISO 8859-1 [ISO-8859-1]. The filename is case sensitive. Then follows a content description as terminated string, encoded as 'Encoding'. The last thing in the frame is the actual object. The first two strings may be omitted, leaving only their terminations. MIME type is always an ISO-8859-1 text string. There may be more than one "GEO" frame in each tag, but only one with the same content descriptor. General encapsulated object "GEO" Frame size $xx xx xx Text encoding $xx MIME type <textstring> $00 Filename <textstring> $00 (00) Content description <textstring> $00 (00) Encapsulated object <binary data> 4.17. Play counter This is simply a counter of the number of times a file has been played. The value is increased by one every time the file begins to play. There may only be one "CNT" frame in each tag. When the counter reaches all one's, one byte is inserted in front of the counter thus making the counter eight bits bigger. The counter must be at least 32-bits long to begin with. Play counter "CNT" Frame size $xx xx xx Counter $xx xx xx xx (xx ...) 4.18. Popularimeter The purpose of this frame is to specify how good an audio file is. Many interesting applications could be found to this frame such as a playlist that features better audiofiles more often than others or it could be used to profile a persons taste and find other 'good' files by comparing people's profiles. The frame is very simple. It contains the email address to the user, one rating byte and a four byte play counter, intended to be increased with one for every time the file is played. The email is a terminated string. The rating is 1-255 where 1 is worst and 255 is best. 0 is unknown. If no personal counter is wanted it may be omitted. When the counter reaches all one's, one byte is inserted in front of the counter thus making the counter eight bits bigger in the same away as the play counter ("CNT"). There may be more than one "POP" frame in each tag, but only one with the same email address. Popularimeter "POP" Frame size $xx xx xx Email to user <textstring> $00 Rating $xx Counter $xx xx xx xx (xx ...) 4.19. Recommended buffer size Sometimes the server from which a audio file is streamed is aware of transmission or coding problems resulting in interruptions in the audio stream. In these cases, the size of the buffer can be recommended by the server using this frame. If the 'embedded info flag' is true (1) then this indicates that an ID3 tag with the maximum size described in 'Buffer size' may occur in the audiostream. In such case the tag should reside between two MPEG [MPEG] frames, if the audio is MPEG encoded. If the position of the next tag is known, 'offset to next tag' may be used. The offset is calculated from the end of tag in which this frame resides to the first byte of the header in the next. This field may be omitted. Embedded tags is currently not recommended since this could render unpredictable behaviour from present software/hardware. The 'Buffer size' should be kept to a minimum. There may only be one "BUF" frame in each tag. Recommended buffer size "BUF" Frame size $xx xx xx Buffer size $xx xx xx Embedded info flag %0000000x Offset to next tag $xx xx xx xx 4.20. Encrypted meta frame This frame contains one or more encrypted frames. This enables protection of copyrighted information such as pictures and text, that people might want to pay extra for. Since standardisation of such an encryption scheme is beyond this document, all "CRM" frames begin with a terminated string with a URL [URL] containing an email address, or a link to a location where an email adress can be found, that belongs to the organisation responsible for this specific encrypted meta frame. Questions regarding the encrypted frame should be sent to the indicated email address. If a $00 is found directly after the 'Frame size', the whole frame should be ignored, and preferably be removed. The 'Owner identifier' is then followed by a short content description and explanation as to why it's encrypted. After the 'content/explanation' description, the actual encrypted block follows. When an ID3v2 decoder encounters a "CRM" frame, it should send the datablock to the 'plugin' with the corresponding 'owner identifier' and expect to receive either a datablock with one or several ID3v2 frames after each other or an error. There may be more than one "CRM" frames in a tag, but only one with the same 'owner identifier'. Encrypted meta frame "CRM" Frame size $xx xx xx Owner identifier <textstring> $00 (00) Content/explanation <textstring> $00 (00) Encrypted datablock <binary data> 4.21. Audio encryption This frame indicates if the actual audio stream is encrypted, and by whom. Since standardisation of such encrypion scheme is beyond this document, all "CRA" frames begin with a terminated string with a URL containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific encrypted audio file. Questions regarding the encrypted audio should be sent to the email address specified. If a $00 is found directly after the 'Frame size' and the audiofile indeed is encrypted, the whole file may be considered useless. After the 'Owner identifier', a pointer to an unencrypted part of the audio can be specified. The 'Preview start' and 'Preview length' is described in frames. If no part is unencrypted, these fields should be left zeroed. After the 'preview length' field follows optionally a datablock required for decryption of the audio. There may be more than one "CRA" frames in a tag, but only one with the same 'Owner identifier'. Audio encryption "CRA" Frame size $xx xx xx Owner identifier <textstring> $00 (00) Preview start $xx xx Preview length $xx xx Encryption info <binary data> 4.22. Linked information To keep space waste as low as possible this frame may be used to link information from another ID3v2 tag that might reside in another audio file or alone in a binary file. It is recommended that this method is only used when the files are stored on a CD-ROM or other circumstances when the risk of file seperation is low. The frame contains a frame identifier, which is the frame that should be linked into this tag, a URL [URL] field, where a reference to the file where the frame is given, and additional ID data, if needed. Data should be retrieved from the first tag found in the file to which this link points. There may be more than one "LNK" frame in a tag, but only one with the same contents. A linked frame is to be considered as part of the tag and has the same restrictions as if it was a physical part of the tag (i.e. only one "REV" frame allowed, whether it's linked or not). Linked information "LNK" Frame size $xx xx xx Frame identifier $xx xx xx URL <textstring> $00 (00) Additional ID data <textstring(s)> Frames that may be linked and need no additional data are "IPL", "MCI", "ETC", "LLT", "STC", "RVA", "EQU", "REV", "BUF", the text information frames and the URL link frames. The "TXX", "PIC", "GEO", "CRM" and "CRA" frames may be linked with the content descriptor as additional ID data. The "COM", "SLT" and "ULT" frames may be linked with three bytes of language descriptor directly followed by a content descriptor as additional ID data. 5. The 'unsynchronisation scheme' The only purpose of the 'unsychronisation scheme' is to make the ID3v2 tag as compatible as possible with existing software. There is no use in 'unsynchronising' tags if the file is only to be processed by new software. Unsynchronisation may only be made with MPEG 2 layer I, II and III and MPEG 2.5 files. Whenever a false synchronisation is found within the tag, one zeroed byte is inserted after the first false synchronisation byte. The format of a correct sync that should be altered by ID3 encoders is as follows: %11111111 111xxxxx And should be replaced with: %11111111 00000000 111xxxxx This has the side effect that all $FF 00 combinations have to be altered, so they won't be affected by the decoding process. Therefore all the $FF 00 combinations have to be replaced with the $FF 00 00 combination during the unsynchonisation. To indicate usage of the unsynchronisation, the first bit in 'ID3 flags' should be set. This bit should only be set if the tag contained a, now corrected, false synchronisation. The bit should only be clear if the tag does not contain any false synchronisations. Do bear in mind, that if a compression scheme is used by the encoder, the unsyncronisation scheme should be applied *afterwards*. When decoding a compressed, 'unsyncronised' file, the 'unsyncronisation scheme' should be parsed first, compression afterwards. 6. Copyright Copyright (C) Martin Nilsson 1998. All Rights Reserved. This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that a reference to this document is included on all such copies and derivative works. However, this document itself may not be modified in any way and reissued as the original document. The limited permissions granted above are perpetual and will not be revoked. This document and the information contained herein is provided on an "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 7. References [CDDB] Compact Disc Data Base <url:http://www.cddb.com> [ISO-639-2] ISO/FDIS 639-2. Codes for the representation of names of languages, Part 2: Alpha-3 code. Technical committee / subcommittee: TC 37 / SC 2 [ISO-8859-1] ISO/IEC DIS 8859-1. 8-bit single-byte coded graphic character sets, Part 1: Latin alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2 [ISRC] ISO 3901:1986 International Standard Recording Code (ISRC). Technical committee / subcommittee: TC 46 / SC 9 [JFIF] JPEG File Interchange Format, version 1.02 <url:http://www.w3.org/Graphics/JPEG/jfif.txt> [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies", RFC 2045, November 1996. <url:ftp://ftp.isi.edu/in-notes/rfc2045.txt> [MPEG] ISO/IEC 11172-3:1993. Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s, Part 3: Audio. Technical committee / subcommittee: JTC 1 / SC 29 and ISO/IEC 13818-3:1995 Generic coding of moving pictures and associated audio information, Part 3: Audio. Technical committee / subcommittee: JTC 1 / SC 29 and ISO/IEC DIS 13818-3 Generic coding of moving pictures and associated audio information, Part 3: Audio (Revision of ISO/IEC 13818-3:1995) [PNG] Portable Network Graphics, version 1.0 <url:http://www.w3.org/TR/REC-png-multi.html> [UNICODE] ISO/IEC 10646-1:1993. Universal Multiple-Octet Coded Character Set (UCS), Part 1: Architecture and Basic Multilingual Plane. Technical committee / subcommittee: JTC 1 / SC 2 <url:http://www.unicode.org> [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource Locators (URL).", RFC 1738, December 1994. <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt> 8. Appendix A. Appendix A - ID3-Tag Specification V1.1 ID3-Tag Specification V1.1 (12 dec 1997) by Michael Mutschler <amiga2@info2.rus.uni-stuttgart.de>, edited for space and clarity reasons. A.1. Overview The ID3-Tag is an information field for MPEG Layer 3 audio files. Since a standalone MP3 doesn't provide a method of storing other information than those directly needed for replay reasons, the ID3-tag was invented by Eric Kemp in 1996. A revision from ID3v1 to ID3v1.1 was made by Michael Mutschler to support track number information is described in A.4. A.2. ID3v1 Implementation The Information is stored in the last 128 bytes of an MP3. The Tag has got the following fields, and the offsets given here, are from 0-127. Field Length Offsets Tag 3 0-2 Songname 30 3-32 Artist 30 33-62 Album 30 63-92 Year 4 93-96 Comment 30 97-126 Genre 1 127 The string-fields contain ASCII-data, coded in ISO-Latin 1 codepage. Strings which are smaller than the field length are padded with zero- bytes. Tag: The tag is valid if this field contains the string "TAG". This has to be uppercase! Songname: This field contains the title of the MP3 (string as above). Artist: This field contains the artist of the MP3 (string as above). Album: this field contains the album where the MP3 comes from (string as above). Year: this field contains the year when this song has originally been released (string as above). Comment: this field contains a comment for the MP3 (string as above). Revision to this field has been made in ID3v1.1. See A.4. Genre: this byte contains the offset of a genre in a predefined list the byte is treated as an unsigned byte. The offset is starting from 0. See A.3. A.3. Genre List The following genres is defined in ID3v1 0.Blues 1.Classic Rock 2.Country 3.Dance 4.Disco 5.Funk 6.Grunge 7.Hip-Hop 8.Jazz 9.Metal 10.New Age 11.Oldies 12.Other 13.Pop 14.R&B 15.Rap 16.Reggae 17.Rock 18.Techno 19.Industrial 20.Alternative 21.Ska 22.Death Metal 23.Pranks 24.Soundtrack 25.Euro-Techno 26.Ambient 27.Trip-Hop 28.Vocal 29.Jazz+Funk 30.Fusion 31.Trance 32.Classical 33.Instrumental 34.Acid 35.House 36.Game 37.Sound Clip 38.Gospel 39.Noise 40.AlternRock 41.Bass 42.Soul 43.Punk 44.Space 45.Meditative 46.Instrumental Pop 47.Instrumental Rock 48.Ethnic 49.Gothic 50.Darkwave 51.Techno-Industrial 52.Electronic 53.Pop-Folk 54.Eurodance 55.Dream 56.Southern Rock 57.Comedy 58.Cult 59.Gangsta 60.Top 40 61.Christian Rap 62.Pop/Funk 63.Jungle 64.Native American 65.Cabaret 66.New Wave 67.Psychadelic 68.Rave 69.Showtunes 70.Trailer 71.Lo-Fi 72.Tribal 73.Acid Punk 74.Acid Jazz 75.Polka 76.Retro 77.Musical 78.Rock & Roll 79.Hard Rock The following genres are Winamp extensions 80.Folk 81.Folk-Rock 82.National Folk 83.Swing 84.Fast Fusion 85.Bebob 86.Latin 87.Revival 88.Celtic 89.Bluegrass 90.Avantgarde 91.Gothic Rock 92.Progressive Rock 93.Psychedelic Rock 94.Symphonic Rock 95.Slow Rock 96.Big Band 97.Chorus 98.Easy Listening 99.Acoustic 100.Humour 101.Speech 102.Chanson 103.Opera 104.Chamber Music 105.Sonata 106.Symphony 107.Booty Bass 108.Primus 109.Porn Groove 110.Satire 111.Slow Jam 112.Club 113.Tango 114.Samba 115.Folklore 116.Ballad 117.Power Ballad 118.Rhythmic Soul 119.Freestyle 120.Duet 121.Punk Rock 122.Drum Solo 123.A capella 124.Euro-House 125.Dance Hall A.4. Track addition - ID3v1.1 In ID3v1.1, Michael Mutschler revised the specification of the comment field in order to implement the track number. The new format of the comment field is a 28 character string followed by a mandatory null ($00) character and the original album tracknumber stored as an unsigned byte-size integer. In such cases where the 29th byte is not the null character or when the 30th is a null character, the tracknumber is to be considered undefined. 9. Author's Address Martin Nilsson Rydsvägen 246 C. 30 S-584 34 Linköping Sweden Email: nilsson@id3.org Co-authors: Johan Sundström Email: johan@id3.org �����������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2.3.0.txt�������������������������������������������������������0000664�0000000�0000000�00000226714�14447736377�0020211�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Informal standard M. Nilsson Document: id3v2.3.0.txt 3rd February 1999 ID3 tag version 2.3.0 Status of this document This document is an informal standard and replaces the ID3v2.2.0 standard [ID3v2]. The informal standard is released so that implementors could have a set standard before a formal standard is set. The formal standard will use another version or revision number if not identical to what is described in this document. The contents in this document may change for clarifications but never for added or altered functionallity. Distribution of this document is unlimited. Abstract This document describes the ID3v2.3.0, which is a more developed version of the ID3v2 informal standard [ID3v2] (version 2.2.0), evolved from the ID3 tagging system. The ID3v2 offers a flexible way of storing information about an audio file within itself to determine its origin and contents. The information may be technical information, such as equalisation curves, as well as related meta information, such as title, performer, copyright etc. 1. Table of contents 2. Conventions in this document 3. ID3v2 overview 3.1. ID3v2 header 3.2. ID3v2 extended header 3.3. ID3v2 frames overview 3.3.1. Frame header flags 3.3.2. Default flags 4. Declared ID3v2 frames 4.1. Unique file identifier 4.2. Text information frames 4.2.1. Text information frames - details 4.2.2. User defined text information frame 4.3. URL link frames 4.3.1. URL link frames - details 4.3.2. User defined URL link frame 4.4. Involved people list 4.5. Music CD Identifier 4.6. Event timing codes 4.7. MPEG location lookup table 4.8. Synced tempo codes 4.9. Unsychronised lyrics/text transcription 4.10. Synchronised lyrics/text 4.11. Comments 4.12. Relative volume adjustment 4.13. Equalisation 4.14. Reverb 4.15. Attached picture 4.16. General encapsulated object 4.17. Play counter 4.18. Popularimeter 4.19. Recommended buffer size 4.20. Audio encryption 4.21. Linked information 4.22. Position synchronisation frame 4.23. Terms of use 4.24. Ownership frame 4.25. Commercial frame 4.26. Encryption method registration 4.27. Group identification registration 4.28. Private frame 5. The 'unsynchronisation scheme' 6. Copyright 7. References 8. Appendix A. Appendix A - Genre List from ID3v1 9. Author's Address 2. Conventions in this document In the examples, text within "" is a text string exactly as it appears in a file. Numbers preceded with $ are hexadecimal and numbers preceded with % are binary. $xx is used to indicate a byte with unknown content. %x is used to indicate a bit with unknown content. The most significant bit (MSB) of a byte is called 'bit 7' and the least significant bit (LSB) is called 'bit 0'. A tag is the whole tag described in this document. A frame is a block of information in the tag. The tag consists of a header, frames and optional padding. A field is a piece of information; one value, a string etc. A numeric string is a string that consists of the characters 0-9 only. 3. ID3v2 overview The two biggest design goals were to be able to implement ID3v2 without disturbing old software too much and that ID3v2 should be as flexible and expandable as possible. The first criterion is met by the simple fact that the MPEG [MPEG] decoding software uses a syncsignal, embedded in the audiostream, to 'lock on to' the audio. Since the ID3v2 tag doesn't contain a valid syncsignal, no software will attempt to play the tag. If, for any reason, coincidence make a syncsignal appear within the tag it will be taken care of by the 'unsynchronisation scheme' described in section 5. The second criterion has made a more noticeable impact on the design of the ID3v2 tag. It is constructed as a container for several information blocks, called frames, whose format need not be known to the software that encounters them. At the start of every frame there is an identifier that explains the frames' format and content, and a size descriptor that allows software to skip unknown frames. If a total revision of the ID3v2 tag should be needed, there is a version number and a size descriptor in the ID3v2 header. The ID3 tag described in this document is mainly targeted at files encoded with MPEG-1/2 layer I, MPEG-1/2 layer II, MPEG-1/2 layer III and MPEG-2.5, but may work with other types of encoded audio. The bitorder in ID3v2 is most significant bit first (MSB). The byteorder in multibyte numbers is most significant byte first (e.g. $12345678 would be encoded $12 34 56 78). It is permitted to include padding after all the final frame (at the end of the ID3 tag), making the size of all the frames together smaller than the size given in the head of the tag. A possible purpose of this padding is to allow for adding a few additional frames or enlarge existing frames within the tag without having to rewrite the entire file. The value of the padding bytes must be $00. 3.1. ID3v2 header The ID3v2 tag header, which should be the first information in the file, is 10 bytes as follows: ID3v2/file identifier "ID3" ID3v2 version $03 00 ID3v2 flags %abc00000 ID3v2 size 4 * %0xxxxxxx The first three bytes of the tag are always "ID3" to indicate that this is an ID3v2 tag, directly followed by the two version bytes. The first byte of ID3v2 version is it's major version, while the second byte is its revision number. In this case this is ID3v2.3.0. All revisions are backwards compatible while major versions are not. If software with ID3v2.2.0 and below support should encounter version three or higher it should simply ignore the whole tag. Version and revision will never be $FF. The version is followed by one the ID3v2 flags field, of which currently only three flags are used. a - Unsynchronisation Bit 7 in the 'ID3v2 flags' indicates whether or not unsynchronisation is used (see section 5 for details); a set bit indicates usage. b - Extended header The second bit (bit 6) indicates whether or not the header is followed by an extended header. The extended header is described in section 3.2. c - Experimental indicator The third bit (bit 5) should be used as an 'experimental indicator'. This flag should always be set when the tag is in an experimental stage. All the other flags should be cleared. If one of these undefined flags are set that might mean that the tag is not readable for a parser that does not know the flags function. The ID3v2 tag size is encoded with four bytes where the most significant bit (bit 7) is set to zero in every byte, making a total of 28 bits. The zeroed bits are ignored, so a 257 bytes long tag is represented as $00 00 02 01. The ID3v2 tag size is the size of the complete tag after unsychronisation, including padding, excluding the header but not excluding the extended header (total tag size - 10). Only 28 bits (representing up to 256MB) are used in the size description to avoid the introducuction of 'false syncsignals'. An ID3v2 tag can be detected with the following pattern: $49 44 33 yy yy xx zz zz zz zz Where yy is less than $FF, xx is the 'flags' byte and zz is less than $80. 3.2. ID3v2 extended header The extended header contains information that is not vital to the correct parsing of the tag information, hence the extended header is optional. Extended header size $xx xx xx xx Extended Flags $xx xx Size of padding $xx xx xx xx Where the 'Extended header size', currently 6 or 10 bytes, excludes itself. The 'Size of padding' is simply the total tag size excluding the frames and the headers, in other words the padding. The extended header is considered separate from the header proper, and as such is subject to unsynchronisation. The extended flags are a secondary flag set which describes further attributes of the tag. These attributes are currently defined as follows %x0000000 00000000 x - CRC data present If this flag is set four bytes of CRC-32 data is appended to the extended header. The CRC should be calculated before unsynchronisation on the data between the extended header and the padding, i.e. the frames and only the frames. Total frame CRC $xx xx xx xx 3.3. ID3v2 frame overview As the tag consists of a tag header and a tag body with one or more frames, all the frames consists of a frame header followed by one or more fields containing the actual information. The layout of the frame header: Frame ID $xx xx xx xx (four characters) Size $xx xx xx xx Flags $xx xx The frame ID made out of the characters capital A-Z and 0-9. Identifiers beginning with "X", "Y" and "Z" are for experimental use and free for everyone to use, without the need to set the experimental bit in the tag header. Have in mind that someone else might have used the same identifier as you. All other identifiers are either used or reserved for future use. The frame ID is followed by a size descriptor, making a total header size of ten bytes in every frame. The size is calculated as frame size excluding frame header (frame size - 10). In the frame header the size descriptor is followed by two flags bytes. These flags are described in section 3.3.1. There is no fixed order of the frames' appearance in the tag, although it is desired that the frames are arranged in order of significance concerning the recognition of the file. An example of such order: UFID, TIT2, MCDI, TRCK ... A tag must contain at least one frame. A frame must be at least 1 byte big, excluding the header. If nothing else is said a string is represented as ISO-8859-1 [ISO-8859-1] characters in the range $20 - $FF. Such strings are represented as <text string>, or <full text string> if newlines are allowed, in the frame descriptions. All Unicode strings [UNICODE] use 16-bit unicode 2.0 (ISO/IEC 10646-1:1993, UCS-2). Unicode strings must begin with the Unicode BOM ($FF FE or $FE FF) to identify the byte order. All numeric strings and URLs [URL] are always encoded as ISO-8859-1. Terminated strings are terminated with $00 if encoded with ISO-8859-1 and $00 00 if encoded as unicode. If nothing else is said newline character is forbidden. In ISO-8859-1 a new line is represented, when allowed, with $0A only. Frames that allow different types of text encoding have a text encoding description byte directly after the frame size. If ISO-8859-1 is used this byte should be $00, if Unicode is used it should be $01. Strings dependent on encoding is represented as <text string according to encoding>, or <full text string according to encoding> if newlines are allowed. Any empty Unicode strings which are NULL-terminated may have the Unicode BOM followed by a Unicode NULL ($FF FE 00 00 or $FE FF 00 00). The three byte language field is used to describe the language of the frame's content, according to ISO-639-2 [ISO-639-2]. All URLs [URL] may be relative, e.g. "picture.png", "../doc.txt". If a frame is longer than it should be, e.g. having more fields than specified in this document, that indicates that additions to the frame have been made in a later version of the ID3v2 standard. This is reflected by the revision number in the header of the tag. 3.3.1. Frame header flags In the frame header the size descriptor is followed by two flags bytes. All unused flags must be cleared. The first byte is for 'status messages' and the second byte is for encoding purposes. If an unknown flag is set in the first byte the frame may not be changed without the bit cleared. If an unknown flag is set in the second byte it is likely to not be readable. The flags field is defined as follows. %abc00000 %ijk00000 a - Tag alter preservation This flag tells the software what to do with this frame if it is unknown and the tag is altered in any way. This applies to all kinds of alterations, including adding more padding and reordering the frames. 0 Frame should be preserved. 1 Frame should be discarded. b - File alter preservation This flag tells the software what to do with this frame if it is unknown and the file, excluding the tag, is altered. This does not apply when the audio is completely replaced with other audio data. 0 Frame should be preserved. 1 Frame should be discarded. c - Read only This flag, if set, tells the software that the contents of this frame is intended to be read only. Changing the contents might break something, e.g. a signature. If the contents are changed, without knowledge in why the frame was flagged read only and without taking the proper means to compensate, e.g. recalculating the signature, the bit should be cleared. i - Compression This flag indicates whether or not the frame is compressed. 0 Frame is not compressed. 1 Frame is compressed using zlib [zlib] with 4 bytes for 'decompressed size' appended to the frame header. j - Encryption This flag indicates wether or not the frame is enrypted. If set one byte indicating with which method it was encrypted will be appended to the frame header. See section 4.26. for more information about encryption method registration. 0 Frame is not encrypted. 1 Frame is encrypted. k - Grouping identity This flag indicates whether or not this frame belongs in a group with other frames. If set a group identifier byte is added to the frame header. Every frame with the same group identifier belongs to the same group. 0 Frame does not contain group information 1 Frame contains group information Some flags indicates that the frame header is extended with additional information. This information will be added to the frame header in the same order as the flags indicating the additions. I.e. the four bytes of decompressed size will preceed the encryption method byte. These additions to the frame header, while not included in the frame header size but are included in the 'frame size' field, are not subject to encryption or compression. 3.3.2. Default flags The default settings for the frames described in this document can be divided into the following classes. The flags may be set differently if found more suitable by the software. 1. Discarded if tag is altered, discarded if file is altered. None. 2. Discarded if tag is altered, preserved if file is altered. None. 3. Preserved if tag is altered, discarded if file is altered. AENC, ETCO, EQUA, MLLT, POSS, SYLT, SYTC, RVAD, TENC, TLEN, TSIZ 4. Preserved if tag is altered, preserved if file is altered. The rest of the frames. 4. Declared ID3v2 frames The following frames are declared in this draft. 4.21 AENC Audio encryption 4.15 APIC Attached picture 4.11 COMM Comments 4.25 COMR Commercial frame 4.26 ENCR Encryption method registration 4.13 EQUA Equalization 4.6 ETCO Event timing codes 4.16 GEOB General encapsulated object 4.27 GRID Group identification registration 4.4 IPLS Involved people list 4.21 LINK Linked information 4.5 MCDI Music CD identifier 4.7 MLLT MPEG location lookup table 4.24 OWNE Ownership frame 4.28. PRIV Private frame 4.17 PCNT Play counter 4.18 POPM Popularimeter 4.22 POSS Position synchronisation frame 4.19 RBUF Recommended buffer size 4.12 RVAD Relative volume adjustment 4.14 RVRB Reverb 4.10 SYLT Synchronized lyric/text 4.8 SYTC Synchronized tempo codes 4.2.1 TALB Album/Movie/Show title 4.2.1 TBPM BPM (beats per minute) 4.2.1 TCOM Composer 4.2.1 TCON Content type 4.2.1 TCOP Copyright message 4.2.1 TDAT Date 4.2.1 TDLY Playlist delay 4.2.1 TENC Encoded by 4.2.1 TEXT Lyricist/Text writer 4.2.1 TFLT File type 4.2.1 TIME Time 4.2.1 TIT1 Content group description 4.2.1 TIT2 Title/songname/content description 4.2.1 TIT3 Subtitle/Description refinement 4.2.1 TKEY Initial key 4.2.1 TLAN Language(s) 4.2.1 TLEN Length 4.2.1 TMED Media type 4.2.1 TOAL Original album/movie/show title 4.2.1 TOFN Original filename 4.2.1 TOLY Original lyricist(s)/text writer(s) 4.2.1 TOPE Original artist(s)/performer(s) 4.2.1 TORY Original release year 4.2.1 TOWN File owner/licensee 4.2.1 TPE1 Lead performer(s)/Soloist(s) 4.2.1 TPE2 Band/orchestra/accompaniment 4.2.1 TPE3 Conductor/performer refinement 4.2.1 TPE4 Interpreted, remixed, or otherwise modified by 4.2.1 TPOS Part of a set 4.2.1 TPUB Publisher 4.2.1 TRCK Track number/Position in set 4.2.1 TRDA Recording dates 4.2.1 TRSN Internet radio station name 4.2.1 TRSO Internet radio station owner 4.2.1 TSIZ Size 4.2.1 TSRC ISRC (international standard recording code) 4.2.1 TSSE Software/Hardware and settings used for encoding 4.2.1 TYER Year 4.2.2 TXXX User defined text information frame 4.1 UFID Unique file identifier 4.23 USER Terms of use 4.9 USLT Unsychronized lyric/text transcription 4.3.1 WCOM Commercial information 4.3.1 WCOP Copyright/Legal information 4.3.1 WOAF Official audio file webpage 4.3.1 WOAR Official artist/performer webpage 4.3.1 WOAS Official audio source webpage 4.3.1 WORS Official internet radio station homepage 4.3.1 WPAY Payment 4.3.1 WPUB Publishers official webpage 4.3.2 WXXX User defined URL link frame 4.1. Unique file identifier This frame's purpose is to be able to identify the audio file in a database that may contain more information relevant to the content. Since standardisation of such a database is beyond this document, all frames begin with a null-terminated string with a URL [URL] containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific database implementation. Questions regarding the database should be sent to the indicated email address. The URL should not be used for the actual database queries. The string "<a href="http://www.id3.org/dummy/ufid.html">http://www.id3.org/dummy/ufid.html</a>" should be used for tests. Software that isn't told otherwise may safely remove such frames. The 'Owner identifier' must be non-empty (more than just a termination). The 'Owner identifier' is then followed by the actual identifier, which may be up to 64 bytes. There may be more than one "UFID" frame in a tag, but only one with the same 'Owner identifier'. <Header for 'Unique file identifier', ID: "UFID"> Owner identifier <text string> $00 Identifier <up to 64 bytes binary data> 4.2. Text information frames The text information frames are the most important frames, containing information like artist, album and more. There may only be one text information frame of its kind in an tag. If the textstring is followed by a termination ($00 (00)) all the following information should be ignored and not be displayed. All text frame identifiers begin with "T". Only text frame identifiers begin with "T", with the exception of the "TXXX" frame. All the text information frames have the following format: <Header for 'Text information frame', ID: "T000" - "TZZZ", excluding "TXXX" described in 4.2.2.> Text encoding $xx Information <text string according to encoding> 4.2.1. Text information frames - details TALB The 'Album/Movie/Show title' frame is intended for the title of the recording(/source of sound) which the audio in the file is taken from. TBPM The 'BPM' frame contains the number of beats per minute in the mainpart of the audio. The BPM is an integer and represented as a numerical string. TCOM The 'Composer(s)' frame is intended for the name of the composer(s). They are seperated with the "/" character. TCON The 'Content type', which previously was stored as a one byte numeric value only, is now a numeric string. You may use one or several of the types as ID3v1.1 did or, since the category list would be impossible to maintain with accurate and up to date categories, define your own. References to the ID3v1 genres can be made by, as first byte, enter "(" followed by a number from the genres list (appendix A.) and ended with a ")" character. This is optionally followed by a refinement, e.g. "(21)" or "(4)Eurodisco". Several references can be made in the same frame, e.g. "(51)(39)". If the refinement should begin with a "(" character it should be replaced with "((", e.g. "((I can figure out any genre)" or "(55)((I think...)". The following new content types is defined in ID3v2 and is implemented in the same way as the numerig content types, e.g. "(RX)". RX Remix CR Cover TCOP The 'Copyright message' frame, which must begin with a year and a space character (making five characters), is intended for the copyright holder of the original sound, not the audio file itself. The absence of this frame means only that the copyright information is unavailable or has been removed, and must not be interpreted to mean that the sound is public domain. Every time this field is displayed the field must be preceded with "Copyright " (C) " ", where (C) is one character showing a C in a circle. TDAT The 'Date' frame is a numeric string in the DDMM format containing the date for the recording. This field is always four characters long. TDLY The 'Playlist delay' defines the numbers of milliseconds of silence between every song in a playlist. The player should use the "ETC" frame, if present, to skip initial silence and silence at the end of the audio to match the 'Playlist delay' time. The time is represented as a numeric string. TENC The 'Encoded by' frame contains the name of the person or organisation that encoded the audio file. This field may contain a copyright message, if the audio file also is copyrighted by the encoder. TEXT The 'Lyricist(s)/Text writer(s)' frame is intended for the writer(s) of the text or lyrics in the recording. They are seperated with the "/" character. TFLT The 'File type' frame indicates which type of audio this tag defines. The following type and refinements are defined: MPG MPEG Audio /1 MPEG 1/2 layer I /2 MPEG 1/2 layer II /3 MPEG 1/2 layer III /2.5 MPEG 2.5 /AAC Advanced audio compression VQF Transform-domain Weighted Interleave Vector Quantization PCM Pulse Code Modulated audio but other types may be used, not for these types though. This is used in a similar way to the predefined types in the "TMED" frame, but without parentheses. If this frame is not present audio type is assumed to be "MPG". TIME The 'Time' frame is a numeric string in the HHMM format containing the time for the recording. This field is always four characters long. TIT1 The 'Content group description' frame is used if the sound belongs to a larger category of sounds/music. For example, classical music is often sorted in different musical sections (e.g. "Piano Concerto", "Weather - Hurricane"). TIT2 The 'Title/Songname/Content description' frame is the actual name of the piece (e.g. "Adagio", "Hurricane Donna"). TIT3 The 'Subtitle/Description refinement' frame is used for information directly related to the contents title (e.g. "Op. 16" or "Performed live at Wembley"). TKEY The 'Initial key' frame contains the musical key in which the sound starts. It is represented as a string with a maximum length of three characters. The ground keys are represented with "A","B","C","D","E", "F" and "G" and halfkeys represented with "b" and "#". Minor is represented as "m". Example "Cbm". Off key is represented with an "o" only. TLAN The 'Language(s)' frame should contain the languages of the text or lyrics spoken or sung in the audio. The language is represented with three characters according to ISO-639-2. If more than one language is used in the text their language codes should follow according to their usage. TLEN The 'Length' frame contains the length of the audiofile in milliseconds, represented as a numeric string. TMED The 'Media type' frame describes from which media the sound originated. This may be a text string or a reference to the predefined media types found in the list below. References are made within "(" and ")" and are optionally followed by a text refinement, e.g. "(MC) with four channels". If a text refinement should begin with a "(" character it should be replaced with "((" in the same way as in the "TCO" frame. Predefined refinements is appended after the media type, e.g. "(CD/A)" or "(VID/PAL/VHS)". DIG Other digital media /A Analog transfer from media ANA Other analog media /WAC Wax cylinder /8CA 8-track tape cassette CD CD /A Analog transfer from media /DD DDD /AD ADD /AA AAD LD Laserdisc /A Analog transfer from media TT Turntable records /33 33.33 rpm /45 45 rpm /71 71.29 rpm /76 76.59 rpm /78 78.26 rpm /80 80 rpm MD MiniDisc /A Analog transfer from media DAT DAT /A Analog transfer from media /1 standard, 48 kHz/16 bits, linear /2 mode 2, 32 kHz/16 bits, linear /3 mode 3, 32 kHz/12 bits, nonlinear, low speed /4 mode 4, 32 kHz/12 bits, 4 channels /5 mode 5, 44.1 kHz/16 bits, linear /6 mode 6, 44.1 kHz/16 bits, 'wide track' play DCC DCC /A Analog transfer from media DVD DVD /A Analog transfer from media TV Television /PAL PAL /NTSC NTSC /SECAM SECAM VID Video /PAL PAL /NTSC NTSC /SECAM SECAM /VHS VHS /SVHS S-VHS /BETA BETAMAX RAD Radio /FM FM /AM AM /LW LW /MW MW TEL Telephone /I ISDN MC MC (normal cassette) /4 4.75 cm/s (normal speed for a two sided cassette) /9 9.5 cm/s /I Type I cassette (ferric/normal) /II Type II cassette (chrome) /III Type III cassette (ferric chrome) /IV Type IV cassette (metal) REE Reel /9 9.5 cm/s /19 19 cm/s /38 38 cm/s /76 76 cm/s /I Type I cassette (ferric/normal) /II Type II cassette (chrome) /III Type III cassette (ferric chrome) /IV Type IV cassette (metal) TOAL The 'Original album/movie/show title' frame is intended for the title of the original recording (or source of sound), if for example the music in the file should be a cover of a previously released song. TOFN The 'Original filename' frame contains the preferred filename for the file, since some media doesn't allow the desired length of the filename. The filename is case sensitive and includes its suffix. TOLY The 'Original lyricist(s)/text writer(s)' frame is intended for the text writer(s) of the original recording, if for example the music in the file should be a cover of a previously released song. The text writers are seperated with the "/" character. TOPE The 'Original artist(s)/performer(s)' frame is intended for the performer(s) of the original recording, if for example the music in the file should be a cover of a previously released song. The performers are seperated with the "/" character. TORY The 'Original release year' frame is intended for the year when the original recording, if for example the music in the file should be a cover of a previously released song, was released. The field is formatted as in the "TYER" frame. TOWN The 'File owner/licensee' frame contains the name of the owner or licensee of the file and it's contents. TPE1 The 'Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group' is used for the main artist(s). They are seperated with the "/" character. TPE2 The 'Band/Orchestra/Accompaniment' frame is used for additional information about the performers in the recording. TPE3 The 'Conductor' frame is used for the name of the conductor. TPE4 The 'Interpreted, remixed, or otherwise modified by' frame contains more information about the people behind a remix and similar interpretations of another existing piece. TPOS The 'Part of a set' frame is a numeric string that describes which part of a set the audio came from. This frame is used if the source described in the "TALB" frame is divided into several mediums, e.g. a double CD. The value may be extended with a "/" character and a numeric string containing the total number of parts in the set. E.g. "1/2". TPUB The 'Publisher' frame simply contains the name of the label or publisher. TRCK The 'Track number/Position in set' frame is a numeric string containing the order number of the audio-file on its original recording. This may be extended with a "/" character and a numeric string containing the total numer of tracks/elements on the original recording. E.g. "4/9". TRDA The 'Recording dates' frame is a intended to be used as complement to the "TYER", "TDAT" and "TIME" frames. E.g. "4th-7th June, 12th June" in combination with the "TYER" frame. TRSN The 'Internet radio station name' frame contains the name of the internet radio station from which the audio is streamed. TRSO The 'Internet radio station owner' frame contains the name of the owner of the internet radio station from which the audio is streamed. TSIZ The 'Size' frame contains the size of the audiofile in bytes, excluding the ID3v2 tag, represented as a numeric string. TSRC The 'ISRC' frame should contain the International Standard Recording Code [ISRC] (12 characters). TSSE The 'Software/Hardware and settings used for encoding' frame includes the used audio encoder and its settings when the file was encoded. Hardware refers to hardware encoders, not the computer on which a program was run. TYER The 'Year' frame is a numeric string with a year of the recording. This frames is always four characters long (until the year 10000). 4.2.2. User defined text information frame This frame is intended for one-string text information concerning the audiofile in a similar way to the other "T"-frames. The frame body consists of a description of the string, represented as a terminated string, followed by the actual string. There may be more than one "TXXX" frame in each tag, but only one with the same description. <Header for 'User defined text information frame', ID: "TXXX"> Text encoding $xx Description <text string according to encoding> $00 (00) Value <text string according to encoding> 4.3. URL link frames With these frames dynamic data such as webpages with touring information, price information or plain ordinary news can be added to the tag. There may only be one URL [URL] link frame of its kind in an tag, except when stated otherwise in the frame description. If the textstring is followed by a termination ($00 (00)) all the following information should be ignored and not be displayed. All URL link frame identifiers begins with "W". Only URL link frame identifiers begins with "W". All URL link frames have the following format: <Header for 'URL link frame', ID: "W000" - "WZZZ", excluding "WXXX" described in 4.3.2.> URL <text string> 4.3.1. URL link frames - details WCOM The 'Commercial information' frame is a URL pointing at a webpage with information such as where the album can be bought. There may be more than one "WCOM" frame in a tag, but not with the same content. WCOP The 'Copyright/Legal information' frame is a URL pointing at a webpage where the terms of use and ownership of the file is described. WOAF The 'Official audio file webpage' frame is a URL pointing at a file specific webpage. WOAR The 'Official artist/performer webpage' frame is a URL pointing at the artists official webpage. There may be more than one "WOAR" frame in a tag if the audio contains more than one performer, but not with the same content. WOAS The 'Official audio source webpage' frame is a URL pointing at the official webpage for the source of the audio file, e.g. a movie. WORS The 'Official internet radio station homepage' contains a URL pointing at the homepage of the internet radio station. WPAY The 'Payment' frame is a URL pointing at a webpage that will handle the process of paying for this file. WPUB The 'Publishers official webpage' frame is a URL pointing at the official wepage for the publisher. 4.3.2. User defined URL link frame This frame is intended for URL [URL] links concerning the audiofile in a similar way to the other "W"-frames. The frame body consists of a description of the string, represented as a terminated string, followed by the actual URL. The URL is always encoded with ISO-8859-1 [ISO-8859-1]. There may be more than one "WXXX" frame in each tag, but only one with the same description. <Header for 'User defined URL link frame', ID: "WXXX"> Text encoding $xx Description <text string according to encoding> $00 (00) URL <text string> 4.4. Involved people list Since there might be a lot of people contributing to an audio file in various ways, such as musicians and technicians, the 'Text information frames' are often insufficient to list everyone involved in a project. The 'Involved people list' is a frame containing the names of those involved, and how they were involved. The body simply contains a terminated string with the involvement directly followed by a terminated string with the involvee followed by a new involvement and so on. There may only be one "IPLS" frame in each tag. <Header for 'Involved people list', ID: "IPLS"> Text encoding $xx People list strings <text strings according to encoding> 4.5. Music CD identifier This frame is intended for music that comes from a CD, so that the CD can be identified in databases such as the CDDB [CDDB]. The frame consists of a binary dump of the Table Of Contents, TOC, from the CD, which is a header of 4 bytes and then 8 bytes/track on the CD plus 8 bytes for the 'lead out' making a maximum of 804 bytes. The offset to the beginning of every track on the CD should be described with a four bytes absolute CD-frame address per track, and not with absolute time. This frame requires a present and valid "TRCK" frame, even if the CD's only got one track. There may only be one "MCDI" frame in each tag. <Header for 'Music CD identifier', ID: "MCDI"> CD TOC <binary data> 4.6. Event timing codes This frame allows synchronisation with key events in a song or sound. The header is: <Header for 'Event timing codes', ID: "ETCO"> Time stamp format $xx Where time stamp format is: $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit Abolute time means that every stamp contains the time from the beginning of the file. Followed by a list of key events in the following format: Type of event $xx Time stamp $xx (xx ...) The 'Time stamp' is set to zero if directly at the beginning of the sound or after the previous event. All events should be sorted in chronological order. The type of event is as follows: $00 padding (has no meaning) $01 end of initial silence $02 intro start $03 mainpart start $04 outro start $05 outro end $06 verse start $07 refrain start $08 interlude start $09 theme start $0A variation start $0B key change $0C time change $0D momentary unwanted noise (Snap, Crackle & Pop) $0E sustained noise $0F sustained noise end $10 intro end $11 mainpart end $12 verse end $13 refrain end $14 theme end $15-$DF reserved for future use $E0-$EF not predefined sync 0-F $F0-$FC reserved for future use $FD audio end (start of silence) $FE audio file ends $FF one more byte of events follows (all the following bytes with the value $FF have the same function) Terminating the start events such as "intro start" is not required. The 'Not predefined sync's ($E0-EF) are for user events. You might want to synchronise your music to something, like setting of an explosion on-stage, turning on your screensaver etc. There may only be one "ETCO" frame in each tag. 4.7. MPEG location lookup table To increase performance and accuracy of jumps within a MPEG [MPEG] audio file, frames with timecodes in different locations in the file might be useful. The ID3v2 frame includes references that the software can use to calculate positions in the file. After the frame header is a descriptor of how much the 'frame counter' should increase for every reference. If this value is two then the first reference points out the second frame, the 2nd reference the 4th frame, the 3rd reference the 6th frame etc. In a similar way the 'bytes between reference' and 'milliseconds between reference' points out bytes and milliseconds respectively. Each reference consists of two parts; a certain number of bits, as defined in 'bits for bytes deviation', that describes the difference between what is said in 'bytes between reference' and the reality and a certain number of bits, as defined in 'bits for milliseconds deviation', that describes the difference between what is said in 'milliseconds between reference' and the reality. The number of bits in every reference, i.e. 'bits for bytes deviation'+'bits for milliseconds deviation', must be a multiple of four. There may only be one "MLLT" frame in each tag. <Header for 'Location lookup table', ID: "MLLT"> MPEG frames between reference $xx xx Bytes between reference $xx xx xx Milliseconds between reference $xx xx xx Bits for bytes deviation $xx Bits for milliseconds dev. $xx Then for every reference the following data is included; Deviation in bytes %xxx.... Deviation in milliseconds %xxx.... 4.8. Synchronised tempo codes For a more accurate description of the tempo of a musical piece this frame might be used. After the header follows one byte describing which time stamp format should be used. Then follows one or more tempo codes. Each tempo code consists of one tempo part and one time part. The tempo is in BPM described with one or two bytes. If the first byte has the value $FF, one more byte follows, which is added to the first giving a range from 2 - 510 BPM, since $00 and $01 is reserved. $00 is used to describe a beat-free time period, which is not the same as a music-free time period. $01 is used to indicate one single beat-stroke followed by a beat-free period. The tempo descriptor is followed by a time stamp. Every time the tempo in the music changes, a tempo descriptor may indicate this for the player. All tempo descriptors should be sorted in chronological order. The first beat-stroke in a time-period is at the same time as the beat description occurs. There may only be one "SYTC" frame in each tag. <Header for 'Synchronised tempo codes', ID: "SYTC"> Time stamp format $xx Tempo data <binary data> Where time stamp format is: $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit Abolute time means that every stamp contains the time from the beginning of the file. 4.9. Unsychronised lyrics/text transcription This frame contains the lyrics of the song or a text transcription of other vocal activities. The head includes an encoding descriptor and a content descriptor. The body consists of the actual text. The 'Content descriptor' is a terminated string. If no descriptor is entered, 'Content descriptor' is $00 (00) only. Newline characters are allowed in the text. There may be more than one 'Unsynchronised lyrics/text transcription' frame in each tag, but only one with the same language and content descriptor. <Header for 'Unsynchronised lyrics/text transcription', ID: "USLT"> Text encoding $xx Language $xx xx xx Content descriptor <text string according to encoding> $00 (00) Lyrics/text <full text string according to encoding> 4.10. Synchronised lyrics/text This is another way of incorporating the words, said or sung lyrics, in the audio file as text, this time, however, in sync with the audio. It might also be used to describing events e.g. occurring on a stage or on the screen in sync with the audio. The header includes a content descriptor, represented with as terminated textstring. If no descriptor is entered, 'Content descriptor' is $00 (00) only. <Header for 'Synchronised lyrics/text', ID: "SYLT"> Text encoding $xx Language $xx xx xx Time stamp format $xx Content type $xx Content descriptor <text string according to encoding> $00 (00) Encoding: $00 ISO-8859-1 [ISO-8859-1] character set is used => $00 is sync identifier. $01 Unicode [UNICODE] character set is used => $00 00 is sync identifier. Content type: $00 is other $01 is lyrics $02 is text transcription $03 is movement/part name (e.g. "Adagio") $04 is events (e.g. "Don Quijote enters the stage") $05 is chord (e.g. "Bb F Fsus") $06 is trivia/'pop up' information Time stamp format is: $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit Abolute time means that every stamp contains the time from the beginning of the file. The text that follows the frame header differs from that of the unsynchronised lyrics/text transcription in one major way. Each syllable (or whatever size of text is considered to be convenient by the encoder) is a null terminated string followed by a time stamp denoting where in the sound file it belongs. Each sync thus has the following structure: Terminated text to be synced (typically a syllable) Sync identifier (terminator to above string) $00 (00) Time stamp $xx (xx ...) The 'time stamp' is set to zero or the whole sync is omitted if located directly at the beginning of the sound. All time stamps should be sorted in chronological order. The sync can be considered as a validator of the subsequent string. Newline ($0A) characters are allowed in all "SYLT" frames and should be used after every entry (name, event etc.) in a frame with the content type $03 - $04. A few considerations regarding whitespace characters: Whitespace separating words should mark the beginning of a new word, thus occurring in front of the first syllable of a new word. This is also valid for new line characters. A syllable followed by a comma should not be broken apart with a sync (both the syllable and the comma should be before the sync). An example: The "USLT" passage "Strangers in the night" $0A "Exchanging glances" would be "SYLT" encoded as: "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx xx "glan" $00 xx xx "ces" $00 xx xx There may be more than one "SYLT" frame in each tag, but only one with the same language and content descriptor. 4.11. Comments This frame is indended for any kind of full text information that does not fit in any other frame. It consists of a frame header followed by encoding, language and content descriptors and is ended with the actual comment as a text string. Newline characters are allowed in the comment text string. There may be more than one comment frame in each tag, but only one with the same language and content descriptor. <Header for 'Comment', ID: "COMM"> Text encoding $xx Language $xx xx xx Short content descrip. <text string according to encoding> $00 (00) The actual text <full text string according to encoding> 4.12. Relative volume adjustment This is a more subjective function than the previous ones. It allows the user to say how much he wants to increase/decrease the volume on each channel while the file is played. The purpose is to be able to align all files to a reference volume, so that you don't have to change the volume constantly. This frame may also be used to balance adjust the audio. If the volume peak levels are known then this could be described with the 'Peak volume right' and 'Peak volume left' field. If Peakvolume is not known these fields could be left zeroed or, if no other data follows, be completely omitted. There may only be one "RVAD" frame in each tag. <Header for 'Relative volume adjustment', ID: "RVAD"> Increment/decrement %00xxxxxx Bits used for volume descr. $xx Relative volume change, right $xx xx (xx ...) Relative volume change, left $xx xx (xx ...) Peak volume right $xx xx (xx ...) Peak volume left $xx xx (xx ...) In the increment/decrement field bit 0 is used to indicate the right channel and bit 1 is used to indicate the left channel. 1 is increment and 0 is decrement. The 'bits used for volume description' field is normally $10 (16 bits) for MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not be $00. The volume is always represented with whole bytes, padded in the beginning (highest bits) when 'bits used for volume description' is not a multiple of eight. This datablock is then optionally followed by a volume definition for the left and right back channels. If this information is appended to the frame the first two channels will be treated as front channels. In the increment/decrement field bit 2 is used to indicate the right back channel and bit 3 for the left back channel. Relative volume change, right back $xx xx (xx ...) Relative volume change, left back $xx xx (xx ...) Peak volume right back $xx xx (xx ...) Peak volume left back $xx xx (xx ...) If the center channel adjustment is present the following is appended to the existing frame, after the left and right back channels. The center channel is represented by bit 4 in the increase/decrease field. Relative volume change, center $xx xx (xx ...) Peak volume center $xx xx (xx ...) If the bass channel adjustment is present the following is appended to the existing frame, after the center channel. The bass channel is represented by bit 5 in the increase/decrease field. Relative volume change, bass $xx xx (xx ...) Peak volume bass $xx xx (xx ...) 4.13. Equalisation This is another subjective, alignment frame. It allows the user to predefine an equalisation curve within the audio file. There may only be one "EQUA" frame in each tag. <Header of 'Equalisation', ID: "EQUA"> Adjustment bits $xx The 'adjustment bits' field defines the number of bits used for representation of the adjustment. This is normally $10 (16 bits) for MPEG 2 layer I, II and III [MPEG] and MPEG 2.5. This value may not be $00. This is followed by 2 bytes + ('adjustment bits' rounded up to the nearest byte) for every equalisation band in the following format, giving a frequency range of 0 - 32767Hz: Increment/decrement %x (MSB of the Frequency) Frequency (lower 15 bits) Adjustment $xx (xx ...) The increment/decrement bit is 1 for increment and 0 for decrement. The equalisation bands should be ordered increasingly with reference to frequency. All frequencies don't have to be declared. The equalisation curve in the reading software should be interpolated between the values in this frame. Three equal adjustments for three subsequent frequencies. A frequency should only be described once in the frame. 4.14. Reverb Yet another subjective one. You may here adjust echoes of different kinds. Reverb left/right is the delay between every bounce in ms. Reverb bounces left/right is the number of bounces that should be made. $FF equals an infinite number of bounces. Feedback is the amount of volume that should be returned to the next echo bounce. $00 is 0%, $FF is 100%. If this value were $7F, there would be 50% volume reduction on the first bounce, 50% of that on the second and so on. Left to left means the sound from the left bounce to be played in the left speaker, while left to right means sound from the left bounce to be played in the right speaker. 'Premix left to right' is the amount of left sound to be mixed in the right before any reverb is applied, where $00 id 0% and $FF is 100%. 'Premix right to left' does the same thing, but right to left. Setting both premix to $FF would result in a mono output (if the reverb is applied symmetric). There may only be one "RVRB" frame in each tag. <Header for 'Reverb', ID: "RVRB"> Reverb left (ms) $xx xx Reverb right (ms) $xx xx Reverb bounces, left $xx Reverb bounces, right $xx Reverb feedback, left to left $xx Reverb feedback, left to right $xx Reverb feedback, right to right $xx Reverb feedback, right to left $xx Premix left to right $xx Premix right to left $xx 4.15. Attached picture This frame contains a picture directly related to the audio file. Image format is the MIME type and subtype [MIME] for the image. In the event that the MIME media type name is omitted, "image/" will be implied. The "image/png" [PNG] or "image/jpeg" [JFIF] picture format should be used when interoperability is wanted. Description is a short description of the picture, represented as a terminated textstring. The description has a maximum length of 64 characters, but may be empty. There may be several pictures attached to one file, each in their individual "APIC" frame, but only one with the same content descriptor. There may only be one picture with the picture type declared as picture type $01 and $02 respectively. There is the possibility to put only a link to the image file by using the 'MIME type' "-->" and having a complete URL [URL] instead of picture data. The use of linked files should however be used sparingly since there is the risk of separation of files. <Header for 'Attached picture', ID: "APIC"> Text encoding $xx MIME type <text string> $00 Picture type $xx Description <text string according to encoding> $00 (00) Picture data <binary data> Picture type: $00 Other $01 32x32 pixels 'file icon' (PNG only) $02 Other file icon $03 Cover (front) $04 Cover (back) $05 Leaflet page $06 Media (e.g. lable side of CD) $07 Lead artist/lead performer/soloist $08 Artist/performer $09 Conductor $0A Band/Orchestra $0B Composer $0C Lyricist/text writer $0D Recording Location $0E During recording $0F During performance $10 Movie/video screen capture $11 A bright coloured fish $12 Illustration $13 Band/artist logotype $14 Publisher/Studio logotype 4.16. General encapsulated object In this frame any type of file can be encapsulated. After the header, 'Frame size' and 'Encoding' follows 'MIME type' [MIME] represented as as a terminated string encoded with ISO 8859-1 [ISO-8859-1]. The filename is case sensitive and is encoded as 'Encoding'. Then follows a content description as terminated string, encoded as 'Encoding'. The last thing in the frame is the actual object. The first two strings may be omitted, leaving only their terminations. MIME type is always an ISO-8859-1 text string. There may be more than one "GEOB" frame in each tag, but only one with the same content descriptor. <Header for 'General encapsulated object', ID: "GEOB"> Text encoding $xx MIME type <text string> $00 Filename <text string according to encoding> $00 (00) Content description <text string according to encóding> $00 (00) Encapsulated object <binary data> 4.17. Play counter This is simply a counter of the number of times a file has been played. The value is increased by one every time the file begins to play. There may only be one "PCNT" frame in each tag. When the counter reaches all one's, one byte is inserted in front of the counter thus making the counter eight bits bigger. The counter must be at least 32-bits long to begin with. <Header for 'Play counter', ID: "PCNT"> Counter $xx xx xx xx (xx ...) 4.18. Popularimeter The purpose of this frame is to specify how good an audio file is. Many interesting applications could be found to this frame such as a playlist that features better audiofiles more often than others or it could be used to profile a person's taste and find other 'good' files by comparing people's profiles. The frame is very simple. It contains the email address to the user, one rating byte and a four byte play counter, intended to be increased with one for every time the file is played. The email is a terminated string. The rating is 1-255 where 1 is worst and 255 is best. 0 is unknown. If no personal counter is wanted it may be omitted. When the counter reaches all one's, one byte is inserted in front of the counter thus making the counter eight bits bigger in the same away as the play counter ("PCNT"). There may be more than one "POPM" frame in each tag, but only one with the same email address. <Header for 'Popularimeter', ID: "POPM"> Email to user <text string> $00 Rating $xx Counter $xx xx xx xx (xx ...) 4.19. Recommended buffer size Sometimes the server from which a audio file is streamed is aware of transmission or coding problems resulting in interruptions in the audio stream. In these cases, the size of the buffer can be recommended by the server using this frame. If the 'embedded info flag' is true (1) then this indicates that an ID3 tag with the maximum size described in 'Buffer size' may occur in the audiostream. In such case the tag should reside between two MPEG [MPEG] frames, if the audio is MPEG encoded. If the position of the next tag is known, 'offset to next tag' may be used. The offset is calculated from the end of tag in which this frame resides to the first byte of the header in the next. This field may be omitted. Embedded tags are generally not recommended since this could render unpredictable behaviour from present software/hardware. For applications like streaming audio it might be an idea to embed tags into the audio stream though. If the clients connects to individual connections like HTTP and there is a possibility to begin every transmission with a tag, then this tag should include a 'recommended buffer size' frame. If the client is connected to a arbitrary point in the stream, such as radio or multicast, then the 'recommended buffer size' frame should be included in every tag. Every tag that is picked up after the initial/first tag is to be considered as an update of the previous one. E.g. if there is a "TIT2" frame in the first received tag and one in the second tag, then the first should be 'replaced' with the second. The 'Buffer size' should be kept to a minimum. There may only be one "RBUF" frame in each tag. <Header for 'Recommended buffer size', ID: "RBUF"> Buffer size $xx xx xx Embedded info flag %0000000x Offset to next tag $xx xx xx xx 4.20. Audio encryption This frame indicates if the actual audio stream is encrypted, and by whom. Since standardisation of such encrypion scheme is beyond this document, all "AENC" frames begin with a terminated string with a URL containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific encrypted audio file. Questions regarding the encrypted audio should be sent to the email address specified. If a $00 is found directly after the 'Frame size' and the audiofile indeed is encrypted, the whole file may be considered useless. After the 'Owner identifier', a pointer to an unencrypted part of the audio can be specified. The 'Preview start' and 'Preview length' is described in frames. If no part is unencrypted, these fields should be left zeroed. After the 'preview length' field follows optionally a datablock required for decryption of the audio. There may be more than one "AENC" frames in a tag, but only one with the same 'Owner identifier'. <Header for 'Audio encryption', ID: "AENC"> Owner identifier <text string> $00 Preview start $xx xx Preview length $xx xx Encryption info <binary data> 4.21. Linked information To keep space waste as low as possible this frame may be used to link information from another ID3v2 tag that might reside in another audio file or alone in a binary file. It is recommended that this method is only used when the files are stored on a CD-ROM or other circumstances when the risk of file seperation is low. The frame contains a frame identifier, which is the frame that should be linked into this tag, a URL [URL] field, where a reference to the file where the frame is given, and additional ID data, if needed. Data should be retrieved from the first tag found in the file to which this link points. There may be more than one "LINK" frame in a tag, but only one with the same contents. A linked frame is to be considered as part of the tag and has the same restrictions as if it was a physical part of the tag (i.e. only one "RVRB" frame allowed, whether it's linked or not). <Header for 'Linked information', ID: "LINK"> Frame identifier $xx xx xx URL <text string> $00 ID and additional data <text string(s)> Frames that may be linked and need no additional data are "IPLS", "MCID", "ETCO", "MLLT", "SYTC", "RVAD", "EQUA", "RVRB", "RBUF", the text information frames and the URL link frames. The "TXXX", "APIC", "GEOB" and "AENC" frames may be linked with the content descriptor as additional ID data. The "COMM", "SYLT" and "USLT" frames may be linked with three bytes of language descriptor directly followed by a content descriptor as additional ID data. 4.22. Position synchronisation frame This frame delivers information to the listener of how far into the audio stream he picked up; in effect, it states the time offset of the first frame in the stream. The frame layout is: <Head for 'Position synchronisation', ID: "POSS"> Time stamp format $xx Position $xx (xx ...) Where time stamp format is: $01 Absolute time, 32 bit sized, using MPEG frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit and position is where in the audio the listener starts to receive, i.e. the beginning of the next frame. If this frame is used in the beginning of a file the value is always 0. There may only be one "POSS" frame in each tag. 4.23. Terms of use frame This frame contains a brief description of the terms of use and ownership of the file. More detailed information concerning the legal terms might be available through the "WCOP" frame. Newlines are allowed in the text. There may only be one "USER" frame in a tag. <Header for 'Terms of use frame', ID: "USER"> Text encoding $xx Language $xx xx xx The actual text <text string according to encoding> 4.24. Ownership frame The ownership frame might be used as a reminder of a made transaction or, if signed, as proof. Note that the "USER" and "TOWN" frames are good to use in conjunction with this one. The frame begins, after the frame ID, size and encoding fields, with a 'price payed' field. The first three characters of this field contains the currency used for the transaction, encoded according to ISO 4217 [ISO-4217] alphabetic currency code. Concatenated to this is the actual price payed, as a numerical string using "." as the decimal separator. Next is an 8 character date string (YYYYMMDD) followed by a string with the name of the seller as the last field in the frame. There may only be one "OWNE" frame in a tag. <Header for 'Ownership frame', ID: "OWNE"> Text encoding $xx Price payed <text string> $00 Date of purch. <text string> Seller <text string according to encoding> 4.25. Commercial frame This frame enables several competing offers in the same tag by bundling all needed information. That makes this frame rather complex but it's an easier solution than if one tries to achieve the same result with several frames. The frame begins, after the frame ID, size and encoding fields, with a price string field. A price is constructed by one three character currency code, encoded according to ISO 4217 [ISO-4217] alphabetic currency code, followed by a numerical value where "." is used as decimal seperator. In the price string several prices may be concatenated, seperated by a "/" character, but there may only be one currency of each type. The price string is followed by an 8 character date string in the format YYYYMMDD, describing for how long the price is valid. After that is a contact URL, with which the user can contact the seller, followed by a one byte 'received as' field. It describes how the audio is delivered when bought according to the following list: $00 Other $01 Standard CD album with other songs $02 Compressed audio on CD $03 File over the Internet $04 Stream over the Internet $05 As note sheets $06 As note sheets in a book with other sheets $07 Music on other media $08 Non-musical merchandise Next follows a terminated string with the name of the seller followed by a terminated string with a short description of the product. The last thing is the ability to include a company logotype. The first of them is the 'Picture MIME type' field containing information about which picture format is used. In the event that the MIME media type name is omitted, "image/" will be implied. Currently only "image/png" and "image/jpeg" are allowed. This format string is followed by the binary picture data. This two last fields may be omitted if no picture is to attach. <Header for 'Commercial frame', ID: "COMR"> Text encoding $xx Price string <text string> $00 Valid until <text string> Contact URL <text string> $00 Received as $xx Name of seller <text string according to encoding> $00 (00) Description <text string according to encoding> $00 (00) Picture MIME type <string> $00 Seller logo <binary data> 4.26. Encryption method registration To identify with which method a frame has been encrypted the encryption method must be registered in the tag with this frame. The 'Owner identifier' is a null-terminated string with a URL [URL] containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific encryption method. Questions regarding the encryption method should be sent to the indicated email address. The 'Method symbol' contains a value that is associated with this method throughout the whole tag. Values below $80 are reserved. The 'Method symbol' may optionally be followed by encryption specific data. There may be several "ENCR" frames in a tag but only one containing the same symbol and only one containing the same owner identifier. The method must be used somewhere in the tag. See section 3.3.1, flag j for more information. <Header for 'Encryption method registration', ID: "ENCR"> Owner identifier <text string> $00 Method symbol $xx Encryption data <binary data> 4.27. Group identification registration This frame enables grouping of otherwise unrelated frames. This can be used when some frames are to be signed. To identify which frames belongs to a set of frames a group identifier must be registered in the tag with this frame. The 'Owner identifier' is a null-terminated string with a URL [URL] containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this grouping. Questions regarding the grouping should be sent to the indicated email address. The 'Group symbol' contains a value that associates the frame with this group throughout the whole tag. Values below $80 are reserved. The 'Group symbol' may optionally be followed by some group specific data, e.g. a digital signature. There may be several "GRID" frames in a tag but only one containing the same symbol and only one containing the same owner identifier. The group symbol must be used somewhere in the tag. See section 3.3.1, flag j for more information. <Header for 'Group ID registration', ID: "GRID"> Owner identifier <text string> $00 Group symbol $xx Group dependent data <binary data> 4.28. Private frame This frame is used to contain information from a software producer that its program uses and does not fit into the other frames. The frame consists of an 'Owner identifier' string and the binary data. The 'Owner identifier' is a null-terminated string with a URL [URL] containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for the frame. Questions regarding the frame should be sent to the indicated email address. The tag may contain more than one "PRIV" frame but only with different contents. It is recommended to keep the number of "PRIV" frames as low as possible. <Header for 'Private frame', ID: "PRIV"> Owner identifier <text string> $00 The private data <binary data> 5. The 'unsynchronisation scheme' The only purpose of the 'unsynchronisation scheme' is to make the ID3v2 tag as compatible as possible with existing software. There is no use in 'unsynchronising' tags if the file is only to be processed by new software. Unsynchronisation may only be made with MPEG 2 layer I, II and III and MPEG 2.5 files. Whenever a false synchronisation is found within the tag, one zeroed byte is inserted after the first false synchronisation byte. The format of a correct sync that should be altered by ID3 encoders is as follows: %11111111 111xxxxx And should be replaced with: %11111111 00000000 111xxxxx This has the side effect that all $FF 00 combinations have to be altered, so they won't be affected by the decoding process. Therefore all the $FF 00 combinations have to be replaced with the $FF 00 00 combination during the unsynchronisation. To indicate usage of the unsynchronisation, the first bit in 'ID3 flags' should be set. This bit should only be set if the tag contains a, now corrected, false synchronisation. The bit should only be clear if the tag does not contain any false synchronisations. Do bear in mind, that if a compression scheme is used by the encoder, the unsynchronisation scheme should be applied *afterwards*. When decoding a compressed, 'unsynchronised' file, the 'unsynchronisation scheme' should be parsed first, decompression afterwards. If the last byte in the tag is $FF, and there is a need to eliminate false synchronisations in the tag, at least one byte of padding should be added. 6. Copyright Copyright (C) Martin Nilsson 1998. All Rights Reserved. This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that a reference to this document is included on all such copies and derivative works. However, this document itself may not be modified in any way and reissued as the original document. The limited permissions granted above are perpetual and will not be revoked. This document and the information contained herein is provided on an "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 7. References [CDDB] Compact Disc Data Base http://www.cddb.com [ID3v2] Martin Nilsson, "ID3v2 informal standard". http://www.id3lib.org/id3/id3v2-00.txt [ISO-639-2] ISO/FDIS 639-2. Codes for the representation of names of languages, Part 2: Alpha-3 code. Technical committee / subcommittee: TC 37 / SC 2 [ISO-4217] ISO 4217:1995. Codes for the representation of currencies and funds. Technical committee / subcommittee: TC 68 [ISO-8859-1] ISO/IEC DIS 8859-1. 8-bit single-byte coded graphic character sets, Part 1: Latin alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2 [ISRC] ISO 3901:1986 International Standard Recording Code (ISRC). Technical committee / subcommittee: TC 46 / SC 9 [JFIF] JPEG File Interchange Format, version 1.02 http://www.w3.org/Graphics/JPEG/jfif.txt">http://www.w3.org/Graphics/JPEG/jfif.txt [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies", RFC 2045, November 1996. ftp://ftp.isi.edu/in-notes/rfc2045.txt">ftp://ftp.isi.edu/in-notes/rfc2045.txt [MPEG] ISO/IEC 11172-3:1993. Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s, Part 3: Audio. Technical committee / subcommittee: JTC 1 / SC 29 and ISO/IEC 13818-3:1995 Generic coding of moving pictures and associated audio information, Part 3: Audio. Technical committee / subcommittee: JTC 1 / SC 29 and ISO/IEC DIS 13818-3 Generic coding of moving pictures and associated audio information, Part 3: Audio (Revision of ISO/IEC 13818-3:1995) [PNG] Portable Network Graphics, version 1.0 http://www.w3.org/TR/REC-png-multi.html [UNICODE] ISO/IEC 10646-1:1993. Universal Multiple-Octet Coded Character Set (UCS), Part 1: Architecture and Basic Multilingual Plane. Technical committee / subcommittee: JTC 1 / SC 2 http://www.unicode.org/ [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource Locators (URL).", RFC 1738, December 1994. ftp://ftp.isi.edu/in-notes/rfc1738.txt [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, "ZLIB Compressed Data Format Specification version 3.3", RFC 1950, May 1996. ftp://ftp.isi.edu/in-notes/rfc1950.txt 8. Appendix A. Appendix A - Genre List from ID3v1 The following genres is defined in ID3v1 0.Blues 1.Classic Rock 2.Country 3.Dance 4.Disco 5.Funk 6.Grunge 7.Hip-Hop 8.Jazz 9.Metal 10.New Age 11.Oldies 12.Other 13.Pop 14.R&B 15.Rap 16.Reggae 17.Rock 18.Techno 19.Industrial 20.Alternative 21.Ska 22.Death Metal 23.Pranks 24.Soundtrack 25.Euro-Techno 26.Ambient 27.Trip-Hop 28.Vocal 29.Jazz+Funk 30.Fusion 31.Trance 32.Classical 33.Instrumental 34.Acid 35.House 36.Game 37.Sound Clip 38.Gospel 39.Noise 40.AlternRock 41.Bass 42.Soul 43.Punk 44.Space 45.Meditative 46.Instrumental Pop 47.Instrumental Rock 48.Ethnic 49.Gothic 50.Darkwave 51.Techno-Industrial 52.Electronic 53.Pop-Folk 54.Eurodance 55.Dream 56.Southern Rock 57.Comedy 58.Cult 59.Gangsta 60.Top 40 61.Christian Rap 62.Pop/Funk 63.Jungle 64.Native American 65.Cabaret 66.New Wave 67.Psychadelic 68.Rave 69.Showtunes 70.Trailer 71.Lo-Fi 72.Tribal 73.Acid Punk 74.Acid Jazz 75.Polka 76.Retro 77.Musical 78.Rock & Roll 79.Hard Rock The following genres are Winamp extensions 80.Folk 81.Folk-Rock 82.National Folk 83.Swing 84.Fast Fusion 85.Bebob 86.Latin 87.Revival 88.Celtic 89.Bluegrass 90.Avantgarde 91.Gothic Rock 92.Progressive Rock 93.Psychedelic Rock 94.Symphonic Rock 95.Slow Rock 96.Big Band 97.Chorus 98.Easy Listening 99.Acoustic 100.Humour 101.Speech 102.Chanson 103.Opera 104.Chamber Music 105.Sonata 106.Symphony 107.Booty Bass 108.Primus 109.Porn Groove 110.Satire 111.Slow Jam 112.Club 113.Tango 114.Samba 115.Folklore 116.Ballad 117.Power Ballad 118.Rhythmic Soul 119.Freestyle 120.Duet 121.Punk Rock 122.Drum Solo 123.Acapella 124.Euro-House 125.Dance Hall 9. Author's Address Written by Martin Nilsson Rydsvägen 246 C. 30 S-584 34 Linköping Sweden Email: nilsson@id3.org Edited by Dirk Mahoney 57 Pechey Street Chermside Q Australia 4032 Email: dirk@id3.org Johan Sundström Alsättersgatan 5 A. 34 S-584 35 Linköping Sweden Email: johan@id3.org ����������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2.4.0-frames.txt������������������������������������������������0000664�0000000�0000000�00000200067�14447736377�0021456�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������$Id$ Informal standard M. Nilsson Document: id3v2.4.0-frames.txt 1st November 2000 ID3 tag version 2.4.0 - Native Frames Status of this document This document is an informal standard and replaces the ID3v2.3.0 standard [ID3v2]. A formal standard will use another revision number even if the content is identical to document. The contents in this document may change for clarifications but never for added or altered functionallity. Distribution of this document is unlimited. Abstract This document describes the frames natively supported by ID3v2.4.0, which is a revised version of the ID3v2 informal standard [ID3v2.3.0] version 2.3.0. The ID3v2 offers a flexible way of storing audio meta information within audio file itself. The information may be technical information, such as equalisation curves, as well as title, performer, copyright etc. ID3v2.4.0 is meant to be as close as possible to ID3v2.3.0 in order to allow for implementations to be revised as easily as possible. 1. Table of contents 2. Conventions in this document 3. Default flags 4. Declared ID3v2 frames 4.1. Unique file identifier 4.2. Text information frames 4.2.1. Identification frames 4.2.2. Involved persons frames 4.2.3. Derived and subjective properties frames 4.2.4. Rights and license frames 4.2.5. Other text frames 4.2.6. User defined text information frame 4.3. URL link frames 4.3.1. URL link frames - details 4.3.2. User defined URL link frame 4.4. Music CD Identifier 4.5. Event timing codes 4.6. MPEG location lookup table 4.7. Synced tempo codes 4.8. Unsynchronised lyrics/text transcription 4.9. Synchronised lyrics/text 4.10. Comments 4.11. Relative volume adjustment (2) 4.12. Equalisation (2) 4.13. Reverb 4.14. Attached picture 4.15. General encapsulated object 4.16. Play counter 4.17. Popularimeter 4.18. Recommended buffer size 4.19. Audio encryption 4.20. Linked information 4.21. Position synchronisation frame 4.22. Terms of use 4.23. Ownership frame 4.24. Commercial frame 4.25. Encryption method registration 4.26. Group identification registration 4.27. Private frame 4.28. Signature frame 4.29. Seek frame 4.30. Audio seek point index 5. Copyright 6. References 7. Appendix A. Appendix A - Genre List from ID3v1 8. Author's Address 2. Conventions in this document Text within "" is a text string exactly as it appears in a tag. Numbers preceded with $ are hexadecimal and numbers preceded with % are binary. $xx is used to indicate a byte with unknown content. %x is used to indicate a bit with unknown content. The most significant bit (MSB) of a byte is called 'bit 7' and the least significant bit (LSB) is called 'bit 0'. A tag is the whole tag described the ID3v2 main structure document [ID3v2-strct]. A frame is a block of information in the tag. The tag consists of a header, frames and optional padding. A field is a piece of information; one value, a string etc. A numeric string is a string that consists of the characters "0123456789" only. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [KEYWORDS]. 3. Default flags The default settings for the frames described in this document can be divided into the following classes. The flags may be set differently if found more suitable by the software. 1. Discarded if tag is altered, discarded if file is altered. None. 2. Discarded if tag is altered, preserved if file is altered. None. 3. Preserved if tag is altered, discarded if file is altered. ASPI, AENC, ETCO, EQU2, MLLT, POSS, SEEK, SYLT, SYTC, RVA2, TENC, TLEN 4. Preserved if tag is altered, preserved if file is altered. The rest of the frames. 4. Declared ID3v2 frames The following frames are declared in this draft. 4.19 AENC Audio encryption 4.14 APIC Attached picture 4.30 ASPI Audio seek point index 4.10 COMM Comments 4.24 COMR Commercial frame 4.25 ENCR Encryption method registration 4.12 EQU2 Equalisation (2) 4.5 ETCO Event timing codes 4.15 GEOB General encapsulated object 4.26 GRID Group identification registration 4.20 LINK Linked information 4.4 MCDI Music CD identifier 4.6 MLLT MPEG location lookup table 4.23 OWNE Ownership frame 4.27 PRIV Private frame 4.16 PCNT Play counter 4.17 POPM Popularimeter 4.21 POSS Position synchronisation frame 4.18 RBUF Recommended buffer size 4.11 RVA2 Relative volume adjustment (2) 4.13 RVRB Reverb 4.29 SEEK Seek frame 4.28 SIGN Signature frame 4.9 SYLT Synchronised lyric/text 4.7 SYTC Synchronised tempo codes 4.2.1 TALB Album/Movie/Show title 4.2.3 TBPM BPM (beats per minute) 4.2.2 TCOM Composer 4.2.3 TCON Content type 4.2.4 TCOP Copyright message 4.2.5 TDEN Encoding time 4.2.5 TDLY Playlist delay 4.2.5 TDOR Original release time 4.2.5 TDRC Recording time 4.2.5 TDRL Release time 4.2.5 TDTG Tagging time 4.2.2 TENC Encoded by 4.2.2 TEXT Lyricist/Text writer 4.2.3 TFLT File type 4.2.2 TIPL Involved people list 4.2.1 TIT1 Content group description 4.2.1 TIT2 Title/songname/content description 4.2.1 TIT3 Subtitle/Description refinement 4.2.3 TKEY Initial key 4.2.3 TLAN Language(s) 4.2.3 TLEN Length 4.2.2 TMCL Musician credits list 4.2.3 TMED Media type 4.2.3 TMOO Mood 4.2.1 TOAL Original album/movie/show title 4.2.5 TOFN Original filename 4.2.2 TOLY Original lyricist(s)/text writer(s) 4.2.2 TOPE Original artist(s)/performer(s) 4.2.4 TOWN File owner/licensee 4.2.2 TPE1 Lead performer(s)/Soloist(s) 4.2.2 TPE2 Band/orchestra/accompaniment 4.2.2 TPE3 Conductor/performer refinement 4.2.2 TPE4 Interpreted, remixed, or otherwise modified by 4.2.1 TPOS Part of a set 4.2.4 TPRO Produced notice 4.2.4 TPUB Publisher 4.2.1 TRCK Track number/Position in set 4.2.4 TRSN Internet radio station name 4.2.4 TRSO Internet radio station owner 4.2.5 TSOA Album sort order 4.2.5 TSOP Performer sort order 4.2.5 TSOT Title sort order 4.2.1 TSRC ISRC (international standard recording code) 4.2.5 TSSE Software/Hardware and settings used for encoding 4.2.1 TSST Set subtitle 4.2.2 TXXX User defined text information frame 4.1 UFID Unique file identifier 4.22 USER Terms of use 4.8 USLT Unsynchronised lyric/text transcription 4.3.1 WCOM Commercial information 4.3.1 WCOP Copyright/Legal information 4.3.1 WOAF Official audio file webpage 4.3.1 WOAR Official artist/performer webpage 4.3.1 WOAS Official audio source webpage 4.3.1 WORS Official Internet radio station homepage 4.3.1 WPAY Payment 4.3.1 WPUB Publishers official webpage 4.3.2 WXXX User defined URL link frame 4.1. Unique file identifier This frame's purpose is to be able to identify the audio file in a database, that may provide more information relevant to the content. Since standardisation of such a database is beyond this document, all UFID frames begin with an 'owner identifier' field. It is a null- terminated string with a URL [URL] containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific database implementation. Questions regarding the database should be sent to the indicated email address. The URL should not be used for the actual database queries. The string "http://www.id3.org/dummy/ufid.html" should be used for tests. The 'Owner identifier' must be non-empty (more than just a termination). The 'Owner identifier' is then followed by the actual identifier, which may be up to 64 bytes. There may be more than one "UFID" frame in a tag, but only one with the same 'Owner identifier'. <Header for 'Unique file identifier', ID: "UFID"> Owner identifier <text string> $00 Identifier <up to 64 bytes binary data> 4.2. Text information frames The text information frames are often the most important frames, containing information like artist, album and more. There may only be one text information frame of its kind in an tag. All text information frames supports multiple strings, stored as a null separated list, where null is reperesented by the termination code for the charater encoding. All text frame identifiers begin with "T". Only text frame identifiers begin with "T", with the exception of the "TXXX" frame. All the text information frames have the following format: <Header for 'Text information frame', ID: "T000" - "TZZZ", excluding "TXXX" described in 4.2.6.> Text encoding $xx Information <text string(s) according to encoding> 4.2.1. Identification frames TIT1 The 'Content group description' frame is used if the sound belongs to a larger category of sounds/music. For example, classical music is often sorted in different musical sections (e.g. "Piano Concerto", "Weather - Hurricane"). TIT2 The 'Title/Songname/Content description' frame is the actual name of the piece (e.g. "Adagio", "Hurricane Donna"). TIT3 The 'Subtitle/Description refinement' frame is used for information directly related to the contents title (e.g. "Op. 16" or "Performed live at Wembley"). TALB The 'Album/Movie/Show title' frame is intended for the title of the recording (or source of sound) from which the audio in the file is taken. TOAL The 'Original album/movie/show title' frame is intended for the title of the original recording (or source of sound), if for example the music in the file should be a cover of a previously released song. TRCK The 'Track number/Position in set' frame is a numeric string containing the order number of the audio-file on its original recording. This MAY be extended with a "/" character and a numeric string containing the total number of tracks/elements on the original recording. E.g. "4/9". TPOS The 'Part of a set' frame is a numeric string that describes which part of a set the audio came from. This frame is used if the source described in the "TALB" frame is divided into several mediums, e.g. a double CD. The value MAY be extended with a "/" character and a numeric string containing the total number of parts in the set. E.g. "1/2". TSST The 'Set subtitle' frame is intended for the subtitle of the part of a set this track belongs to. TSRC The 'ISRC' frame should contain the International Standard Recording Code [ISRC] (12 characters). 4.2.2. Involved persons frames TPE1 The 'Lead artist/Lead performer/Soloist/Performing group' is used for the main artist. TPE2 The 'Band/Orchestra/Accompaniment' frame is used for additional information about the performers in the recording. TPE3 The 'Conductor' frame is used for the name of the conductor. TPE4 The 'Interpreted, remixed, or otherwise modified by' frame contains more information about the people behind a remix and similar interpretations of another existing piece. TOPE The 'Original artist/performer' frame is intended for the performer of the original recording, if for example the music in the file should be a cover of a previously released song. TEXT The 'Lyricist/Text writer' frame is intended for the writer of the text or lyrics in the recording. TOLY The 'Original lyricist/text writer' frame is intended for the text writer of the original recording, if for example the music in the file should be a cover of a previously released song. TCOM The 'Composer' frame is intended for the name of the composer. TMCL The 'Musician credits list' is intended as a mapping between instruments and the musician that played it. Every odd field is an instrument and every even is an artist or a comma delimited list of artists. TIPL The 'Involved people list' is very similar to the musician credits list, but maps between functions, like producer, and names. TENC The 'Encoded by' frame contains the name of the person or organisation that encoded the audio file. This field may contain a copyright message, if the audio file also is copyrighted by the encoder. 4.2.3. Derived and subjective properties frames TBPM The 'BPM' frame contains the number of beats per minute in the main part of the audio. The BPM is an integer and represented as a numerical string. TLEN The 'Length' frame contains the length of the audio file in milliseconds, represented as a numeric string. TKEY The 'Initial key' frame contains the musical key in which the sound starts. It is represented as a string with a maximum length of three characters. The ground keys are represented with "A","B","C","D","E", "F" and "G" and halfkeys represented with "b" and "#". Minor is represented as "m", e.g. "Dbm" $00. Off key is represented with an "o" only. TLAN The 'Language' frame should contain the languages of the text or lyrics spoken or sung in the audio. The language is represented with three characters according to ISO-639-2 [ISO-639-2]. If more than one language is used in the text their language codes should follow according to the amount of their usage, e.g. "eng" $00 "sve" $00. TCON The 'Content type', which ID3v1 was stored as a one byte numeric value only, is now a string. You may use one or several of the ID3v1 types as numerical strings, or, since the category list would be impossible to maintain with accurate and up to date categories, define your own. Example: "21" $00 "Eurodisco" $00 You may also use any of the following keywords: RX Remix CR Cover TFLT The 'File type' frame indicates which type of audio this tag defines. The following types and refinements are defined: MIME MIME type follows MPG MPEG Audio /1 MPEG 1/2 layer I /2 MPEG 1/2 layer II /3 MPEG 1/2 layer III /2.5 MPEG 2.5 /AAC Advanced audio compression VQF Transform-domain Weighted Interleave Vector Quantisation PCM Pulse Code Modulated audio but other types may be used, but not for these types though. This is used in a similar way to the predefined types in the "TMED" frame, but without parentheses. If this frame is not present audio type is assumed to be "MPG". TMED The 'Media type' frame describes from which media the sound originated. This may be a text string or a reference to the predefined media types found in the list below. Example: "VID/PAL/VHS" $00. DIG Other digital media /A Analogue transfer from media ANA Other analogue media /WAC Wax cylinder /8CA 8-track tape cassette CD CD /A Analogue transfer from media /DD DDD /AD ADD /AA AAD LD Laserdisc TT Turntable records /33 33.33 rpm /45 45 rpm /71 71.29 rpm /76 76.59 rpm /78 78.26 rpm /80 80 rpm MD MiniDisc /A Analogue transfer from media DAT DAT /A Analogue transfer from media /1 standard, 48 kHz/16 bits, linear /2 mode 2, 32 kHz/16 bits, linear /3 mode 3, 32 kHz/12 bits, non-linear, low speed /4 mode 4, 32 kHz/12 bits, 4 channels /5 mode 5, 44.1 kHz/16 bits, linear /6 mode 6, 44.1 kHz/16 bits, 'wide track' play DCC DCC /A Analogue transfer from media DVD DVD /A Analogue transfer from media TV Television /PAL PAL /NTSC NTSC /SECAM SECAM VID Video /PAL PAL /NTSC NTSC /SECAM SECAM /VHS VHS /SVHS S-VHS /BETA BETAMAX RAD Radio /FM FM /AM AM /LW LW /MW MW TEL Telephone /I ISDN MC MC (normal cassette) /4 4.75 cm/s (normal speed for a two sided cassette) /9 9.5 cm/s /I Type I cassette (ferric/normal) /II Type II cassette (chrome) /III Type III cassette (ferric chrome) /IV Type IV cassette (metal) REE Reel /9 9.5 cm/s /19 19 cm/s /38 38 cm/s /76 76 cm/s /I Type I cassette (ferric/normal) /II Type II cassette (chrome) /III Type III cassette (ferric chrome) /IV Type IV cassette (metal) TMOO The 'Mood' frame is intended to reflect the mood of the audio with a few keywords, e.g. "Romantic" or "Sad". 4.2.4. Rights and license frames TCOP The 'Copyright message' frame, in which the string must begin with a year and a space character (making five characters), is intended for the copyright holder of the original sound, not the audio file itself. The absence of this frame means only that the copyright information is unavailable or has been removed, and must not be interpreted to mean that the audio is public domain. Every time this field is displayed the field must be preceded with "Copyright " (C) " ", where (C) is one character showing a C in a circle. TPRO The 'Produced notice' frame, in which the string must begin with a year and a space character (making five characters), is intended for the production copyright holder of the original sound, not the audio file itself. The absence of this frame means only that the production copyright information is unavailable or has been removed, and must not be interpreted to mean that the audio is public domain. Every time this field is displayed the field must be preceded with "Produced " (P) " ", where (P) is one character showing a P in a circle. TPUB The 'Publisher' frame simply contains the name of the label or publisher. TOWN The 'File owner/licensee' frame contains the name of the owner or licensee of the file and it's contents. TRSN The 'Internet radio station name' frame contains the name of the internet radio station from which the audio is streamed. TRSO The 'Internet radio station owner' frame contains the name of the owner of the internet radio station from which the audio is streamed. 4.2.5. Other text frames TOFN The 'Original filename' frame contains the preferred filename for the file, since some media doesn't allow the desired length of the filename. The filename is case sensitive and includes its suffix. TDLY The 'Playlist delay' defines the numbers of milliseconds of silence that should be inserted before this audio. The value zero indicates that this is a part of a multifile audio track that should be played continuously. TDEN The 'Encoding time' frame contains a timestamp describing when the audio was encoded. Timestamp format is described in the ID3v2 structure document [ID3v2-strct]. TDOR The 'Original release time' frame contains a timestamp describing when the original recording of the audio was released. Timestamp format is described in the ID3v2 structure document [ID3v2-strct]. TDRC The 'Recording time' frame contains a timestamp describing when the audio was recorded. Timestamp format is described in the ID3v2 structure document [ID3v2-strct]. TDRL The 'Release time' frame contains a timestamp describing when the audio was first released. Timestamp format is described in the ID3v2 structure document [ID3v2-strct]. TDTG The 'Tagging time' frame contains a timestamp describing then the audio was tagged. Timestamp format is described in the ID3v2 structure document [ID3v2-strct]. TSSE The 'Software/Hardware and settings used for encoding' frame includes the used audio encoder and its settings when the file was encoded. Hardware refers to hardware encoders, not the computer on which a program was run. TSOA The 'Album sort order' frame defines a string which should be used instead of the album name (TALB) for sorting purposes. E.g. an album named "A Soundtrack" might preferably be sorted as "Soundtrack". TSOP The 'Performer sort order' frame defines a string which should be used instead of the performer (TPE2) for sorting purposes. TSOT The 'Title sort order' frame defines a string which should be used instead of the title (TIT2) for sorting purposes. 4.2.6. User defined text information frame This frame is intended for one-string text information concerning the audio file in a similar way to the other "T"-frames. The frame body consists of a description of the string, represented as a terminated string, followed by the actual string. There may be more than one "TXXX" frame in each tag, but only one with the same description. <Header for 'User defined text information frame', ID: "TXXX"> Text encoding $xx Description <text string according to encoding> $00 (00) Value <text string according to encoding> 4.3. URL link frames With these frames dynamic data such as webpages with touring information, price information or plain ordinary news can be added to the tag. There may only be one URL [URL] link frame of its kind in an tag, except when stated otherwise in the frame description. If the text string is followed by a string termination, all the following information should be ignored and not be displayed. All URL link frame identifiers begins with "W". Only URL link frame identifiers begins with "W", except for "WXXX". All URL link frames have the following format: <Header for 'URL link frame', ID: "W000" - "WZZZ", excluding "WXXX" described in 4.3.2.> URL <text string> 4.3.1. URL link frames - details WCOM The 'Commercial information' frame is a URL pointing at a webpage with information such as where the album can be bought. There may be more than one "WCOM" frame in a tag, but not with the same content. WCOP The 'Copyright/Legal information' frame is a URL pointing at a webpage where the terms of use and ownership of the file is described. WOAF The 'Official audio file webpage' frame is a URL pointing at a file specific webpage. WOAR The 'Official artist/performer webpage' frame is a URL pointing at the artists official webpage. There may be more than one "WOAR" frame in a tag if the audio contains more than one performer, but not with the same content. WOAS The 'Official audio source webpage' frame is a URL pointing at the official webpage for the source of the audio file, e.g. a movie. WORS The 'Official Internet radio station homepage' contains a URL pointing at the homepage of the internet radio station. WPAY The 'Payment' frame is a URL pointing at a webpage that will handle the process of paying for this file. WPUB The 'Publishers official webpage' frame is a URL pointing at the official webpage for the publisher. 4.3.2. User defined URL link frame This frame is intended for URL [URL] links concerning the audio file in a similar way to the other "W"-frames. The frame body consists of a description of the string, represented as a terminated string, followed by the actual URL. The URL is always encoded with ISO-8859-1 [ISO-8859-1]. There may be more than one "WXXX" frame in each tag, but only one with the same description. <Header for 'User defined URL link frame', ID: "WXXX"> Text encoding $xx Description <text string according to encoding> $00 (00) URL <text string> 4.4. Music CD identifier This frame is intended for music that comes from a CD, so that the CD can be identified in databases such as the CDDB [CDDB]. The frame consists of a binary dump of the Table Of Contents, TOC, from the CD, which is a header of 4 bytes and then 8 bytes/track on the CD plus 8 bytes for the 'lead out', making a maximum of 804 bytes. The offset to the beginning of every track on the CD should be described with a four bytes absolute CD-frame address per track, and not with absolute time. When this frame is used the presence of a valid "TRCK" frame is REQUIRED, even if the CD's only got one track. It is recommended that this frame is always added to tags originating from CDs. There may only be one "MCDI" frame in each tag. <Header for 'Music CD identifier', ID: "MCDI"> CD TOC <binary data> 4.5. Event timing codes This frame allows synchronisation with key events in the audio. The header is: <Header for 'Event timing codes', ID: "ETCO"> Time stamp format $xx Where time stamp format is: $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit Absolute time means that every stamp contains the time from the beginning of the file. Followed by a list of key events in the following format: Type of event $xx Time stamp $xx (xx ...) The 'Time stamp' is set to zero if directly at the beginning of the sound or after the previous event. All events MUST be sorted in chronological order. The type of event is as follows: $00 padding (has no meaning) $01 end of initial silence $02 intro start $03 main part start $04 outro start $05 outro end $06 verse start $07 refrain start $08 interlude start $09 theme start $0A variation start $0B key change $0C time change $0D momentary unwanted noise (Snap, Crackle & Pop) $0E sustained noise $0F sustained noise end $10 intro end $11 main part end $12 verse end $13 refrain end $14 theme end $15 profanity $16 profanity end $17-$DF reserved for future use $E0-$EF not predefined synch 0-F $F0-$FC reserved for future use $FD audio end (start of silence) $FE audio file ends $FF one more byte of events follows (all the following bytes with the value $FF have the same function) Terminating the start events such as "intro start" is OPTIONAL. The 'Not predefined synch's ($E0-EF) are for user events. You might want to synchronise your music to something, like setting off an explosion on-stage, activating a screensaver etc. There may only be one "ETCO" frame in each tag. 4.6. MPEG location lookup table To increase performance and accuracy of jumps within a MPEG [MPEG] audio file, frames with time codes in different locations in the file might be useful. This ID3v2 frame includes references that the software can use to calculate positions in the file. After the frame header follows a descriptor of how much the 'frame counter' should be increased for every reference. If this value is two then the first reference points out the second frame, the 2nd reference the 4th frame, the 3rd reference the 6th frame etc. In a similar way the 'bytes between reference' and 'milliseconds between reference' points out bytes and milliseconds respectively. Each reference consists of two parts; a certain number of bits, as defined in 'bits for bytes deviation', that describes the difference between what is said in 'bytes between reference' and the reality and a certain number of bits, as defined in 'bits for milliseconds deviation', that describes the difference between what is said in 'milliseconds between reference' and the reality. The number of bits in every reference, i.e. 'bits for bytes deviation'+'bits for milliseconds deviation', must be a multiple of four. There may only be one "MLLT" frame in each tag. <Header for 'Location lookup table', ID: "MLLT"> MPEG frames between reference $xx xx Bytes between reference $xx xx xx Milliseconds between reference $xx xx xx Bits for bytes deviation $xx Bits for milliseconds dev. $xx Then for every reference the following data is included; Deviation in bytes %xxx.... Deviation in milliseconds %xxx.... 4.7. Synchronised tempo codes For a more accurate description of the tempo of a musical piece, this frame might be used. After the header follows one byte describing which time stamp format should be used. Then follows one or more tempo codes. Each tempo code consists of one tempo part and one time part. The tempo is in BPM described with one or two bytes. If the first byte has the value $FF, one more byte follows, which is added to the first giving a range from 2 - 510 BPM, since $00 and $01 is reserved. $00 is used to describe a beat-free time period, which is not the same as a music-free time period. $01 is used to indicate one single beat-stroke followed by a beat-free period. The tempo descriptor is followed by a time stamp. Every time the tempo in the music changes, a tempo descriptor may indicate this for the player. All tempo descriptors MUST be sorted in chronological order. The first beat-stroke in a time-period is at the same time as the beat description occurs. There may only be one "SYTC" frame in each tag. <Header for 'Synchronised tempo codes', ID: "SYTC"> Time stamp format $xx Tempo data <binary data> Where time stamp format is: $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit Absolute time means that every stamp contains the time from the beginning of the file. 4.8. Unsynchronised lyrics/text transcription This frame contains the lyrics of the song or a text transcription of other vocal activities. The head includes an encoding descriptor and a content descriptor. The body consists of the actual text. The 'Content descriptor' is a terminated string. If no descriptor is entered, 'Content descriptor' is $00 (00) only. Newline characters are allowed in the text. There may be more than one 'Unsynchronised lyrics/text transcription' frame in each tag, but only one with the same language and content descriptor. <Header for 'Unsynchronised lyrics/text transcription', ID: "USLT"> Text encoding $xx Language $xx xx xx Content descriptor <text string according to encoding> $00 (00) Lyrics/text <full text string according to encoding> 4.9. Synchronised lyrics/text This is another way of incorporating the words, said or sung lyrics, in the audio file as text, this time, however, in sync with the audio. It might also be used to describing events e.g. occurring on a stage or on the screen in sync with the audio. The header includes a content descriptor, represented with as terminated text string. If no descriptor is entered, 'Content descriptor' is $00 (00) only. <Header for 'Synchronised lyrics/text', ID: "SYLT"> Text encoding $xx Language $xx xx xx Time stamp format $xx Content type $xx Content descriptor <text string according to encoding> $00 (00) Content type: $00 is other $01 is lyrics $02 is text transcription $03 is movement/part name (e.g. "Adagio") $04 is events (e.g. "Don Quijote enters the stage") $05 is chord (e.g. "Bb F Fsus") $06 is trivia/'pop up' information $07 is URLs to webpages $08 is URLs to images Time stamp format: $01 Absolute time, 32 bit sized, using MPEG [MPEG] frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit Absolute time means that every stamp contains the time from the beginning of the file. The text that follows the frame header differs from that of the unsynchronised lyrics/text transcription in one major way. Each syllable (or whatever size of text is considered to be convenient by the encoder) is a null terminated string followed by a time stamp denoting where in the sound file it belongs. Each sync thus has the following structure: Terminated text to be synced (typically a syllable) Sync identifier (terminator to above string) $00 (00) Time stamp $xx (xx ...) The 'time stamp' is set to zero or the whole sync is omitted if located directly at the beginning of the sound. All time stamps should be sorted in chronological order. The sync can be considered as a validator of the subsequent string. Newline characters are allowed in all "SYLT" frames and MUST be used after every entry (name, event etc.) in a frame with the content type $03 - $04. A few considerations regarding whitespace characters: Whitespace separating words should mark the beginning of a new word, thus occurring in front of the first syllable of a new word. This is also valid for new line characters. A syllable followed by a comma should not be broken apart with a sync (both the syllable and the comma should be before the sync). An example: The "USLT" passage "Strangers in the night" $0A "Exchanging glances" would be "SYLT" encoded as: "Strang" $00 xx xx "ers" $00 xx xx " in" $00 xx xx " the" $00 xx xx " night" $00 xx xx 0A "Ex" $00 xx xx "chang" $00 xx xx "ing" $00 xx xx "glan" $00 xx xx "ces" $00 xx xx There may be more than one "SYLT" frame in each tag, but only one with the same language and content descriptor. 4.10. Comments This frame is intended for any kind of full text information that does not fit in any other frame. It consists of a frame header followed by encoding, language and content descriptors and is ended with the actual comment as a text string. Newline characters are allowed in the comment text string. There may be more than one comment frame in each tag, but only one with the same language and content descriptor. <Header for 'Comment', ID: "COMM"> Text encoding $xx Language $xx xx xx Short content descrip. <text string according to encoding> $00 (00) The actual text <full text string according to encoding> 4.11. Relative volume adjustment (2) This is a more subjective frame than the previous ones. It allows the user to say how much he wants to increase/decrease the volume on each channel when the file is played. The purpose is to be able to align all files to a reference volume, so that you don't have to change the volume constantly. This frame may also be used to balance adjust the audio. The volume adjustment is encoded as a fixed point decibel value, 16 bit signed integer representing (adjustment*512), giving +/- 64 dB with a precision of 0.001953125 dB. E.g. +2 dB is stored as $04 00 and -2 dB is $FC 00. There may be more than one "RVA2" frame in each tag, but only one with the same identification string. <Header for 'Relative volume adjustment (2)', ID: "RVA2"> Identification <text string> $00 The 'identification' string is used to identify the situation and/or device where this adjustment should apply. The following is then repeated for every channel Type of channel $xx Volume adjustment $xx xx Bits representing peak $xx Peak volume $xx (xx ...) Type of channel: $00 Other $01 Master volume $02 Front right $03 Front left $04 Back right $05 Back left $06 Front centre $07 Back centre $08 Subwoofer Bits representing peak can be any number between 0 and 255. 0 means that there is no peak volume field. The peak volume field is always padded to whole bytes, setting the most significant bits to zero. 4.12. Equalisation (2) This is another subjective, alignment frame. It allows the user to predefine an equalisation curve within the audio file. There may be more than one "EQU2" frame in each tag, but only one with the same identification string. <Header of 'Equalisation (2)', ID: "EQU2"> Interpolation method $xx Identification <text string> $00 The 'interpolation method' describes which method is preferred when an interpolation between the adjustment point that follows. The following methods are currently defined: $00 Band No interpolation is made. A jump from one adjustment level to another occurs in the middle between two adjustment points. $01 Linear Interpolation between adjustment points is linear. The 'identification' string is used to identify the situation and/or device where this adjustment should apply. The following is then repeated for every adjustment point Frequency $xx xx Volume adjustment $xx xx The frequency is stored in units of 1/2 Hz, giving it a range from 0 to 32767 Hz. The volume adjustment is encoded as a fixed point decibel value, 16 bit signed integer representing (adjustment*512), giving +/- 64 dB with a precision of 0.001953125 dB. E.g. +2 dB is stored as $04 00 and -2 dB is $FC 00. Adjustment points should be ordered by frequency and one frequency should only be described once in the frame. 4.13. Reverb Yet another subjective frame, with which you can adjust echoes of different kinds. Reverb left/right is the delay between every bounce in ms. Reverb bounces left/right is the number of bounces that should be made. $FF equals an infinite number of bounces. Feedback is the amount of volume that should be returned to the next echo bounce. $00 is 0%, $FF is 100%. If this value were $7F, there would be 50% volume reduction on the first bounce, 50% of that on the second and so on. Left to left means the sound from the left bounce to be played in the left speaker, while left to right means sound from the left bounce to be played in the right speaker. 'Premix left to right' is the amount of left sound to be mixed in the right before any reverb is applied, where $00 id 0% and $FF is 100%. 'Premix right to left' does the same thing, but right to left. Setting both premix to $FF would result in a mono output (if the reverb is applied symmetric). There may only be one "RVRB" frame in each tag. <Header for 'Reverb', ID: "RVRB"> Reverb left (ms) $xx xx Reverb right (ms) $xx xx Reverb bounces, left $xx Reverb bounces, right $xx Reverb feedback, left to left $xx Reverb feedback, left to right $xx Reverb feedback, right to right $xx Reverb feedback, right to left $xx Premix left to right $xx Premix right to left $xx 4.14. Attached picture This frame contains a picture directly related to the audio file. Image format is the MIME type and subtype [MIME] for the image. In the event that the MIME media type name is omitted, "image/" will be implied. The "image/png" [PNG] or "image/jpeg" [JFIF] picture format should be used when interoperability is wanted. Description is a short description of the picture, represented as a terminated text string. There may be several pictures attached to one file, each in their individual "APIC" frame, but only one with the same content descriptor. There may only be one picture with the picture type declared as picture type $01 and $02 respectively. There is the possibility to put only a link to the image file by using the 'MIME type' "-->" and having a complete URL [URL] instead of picture data. The use of linked files should however be used sparingly since there is the risk of separation of files. <Header for 'Attached picture', ID: "APIC"> Text encoding $xx MIME type <text string> $00 Picture type $xx Description <text string according to encoding> $00 (00) Picture data <binary data> Picture type: $00 Other $01 32x32 pixels 'file icon' (PNG only) $02 Other file icon $03 Cover (front) $04 Cover (back) $05 Leaflet page $06 Media (e.g. label side of CD) $07 Lead artist/lead performer/soloist $08 Artist/performer $09 Conductor $0A Band/Orchestra $0B Composer $0C Lyricist/text writer $0D Recording Location $0E During recording $0F During performance $10 Movie/video screen capture $11 A bright coloured fish $12 Illustration $13 Band/artist logotype $14 Publisher/Studio logotype 4.15. General encapsulated object In this frame any type of file can be encapsulated. After the header, 'Frame size' and 'Encoding' follows 'MIME type' [MIME] represented as as a terminated string encoded with ISO 8859-1 [ISO-8859-1]. The filename is case sensitive and is encoded as 'Encoding'. Then follows a content description as terminated string, encoded as 'Encoding'. The last thing in the frame is the actual object. The first two strings may be omitted, leaving only their terminations. MIME type is always an ISO-8859-1 text string. There may be more than one "GEOB" frame in each tag, but only one with the same content descriptor. <Header for 'General encapsulated object', ID: "GEOB"> Text encoding $xx MIME type <text string> $00 Filename <text string according to encoding> $00 (00) Content description <text string according to encoding> $00 (00) Encapsulated object <binary data> 4.16. Play counter This is simply a counter of the number of times a file has been played. The value is increased by one every time the file begins to play. There may only be one "PCNT" frame in each tag. When the counter reaches all one's, one byte is inserted in front of the counter thus making the counter eight bits bigger. The counter must be at least 32-bits long to begin with. <Header for 'Play counter', ID: "PCNT"> Counter $xx xx xx xx (xx ...) 4.17. Popularimeter The purpose of this frame is to specify how good an audio file is. Many interesting applications could be found to this frame such as a playlist that features better audio files more often than others or it could be used to profile a person's taste and find other 'good' files by comparing people's profiles. The frame contains the email address to the user, one rating byte and a four byte play counter, intended to be increased with one for every time the file is played. The email is a terminated string. The rating is 1-255 where 1 is worst and 255 is best. 0 is unknown. If no personal counter is wanted it may be omitted. When the counter reaches all one's, one byte is inserted in front of the counter thus making the counter eight bits bigger in the same away as the play counter ("PCNT"). There may be more than one "POPM" frame in each tag, but only one with the same email address. <Header for 'Popularimeter', ID: "POPM"> Email to user <text string> $00 Rating $xx Counter $xx xx xx xx (xx ...) 4.18. Recommended buffer size Sometimes the server from which an audio file is streamed is aware of transmission or coding problems resulting in interruptions in the audio stream. In these cases, the size of the buffer can be recommended by the server using this frame. If the 'embedded info flag' is true (1) then this indicates that an ID3 tag with the maximum size described in 'Buffer size' may occur in the audio stream. In such case the tag should reside between two MPEG [MPEG] frames, if the audio is MPEG encoded. If the position of the next tag is known, 'offset to next tag' may be used. The offset is calculated from the end of tag in which this frame resides to the first byte of the header in the next. This field may be omitted. Embedded tags are generally not recommended since this could render unpredictable behaviour from present software/hardware. For applications like streaming audio it might be an idea to embed tags into the audio stream though. If the clients connects to individual connections like HTTP and there is a possibility to begin every transmission with a tag, then this tag should include a 'recommended buffer size' frame. If the client is connected to a arbitrary point in the stream, such as radio or multicast, then the 'recommended buffer size' frame SHOULD be included in every tag. The 'Buffer size' should be kept to a minimum. There may only be one "RBUF" frame in each tag. <Header for 'Recommended buffer size', ID: "RBUF"> Buffer size $xx xx xx Embedded info flag %0000000x Offset to next tag $xx xx xx xx 4.19. Audio encryption This frame indicates if the actual audio stream is encrypted, and by whom. Since standardisation of such encryption scheme is beyond this document, all "AENC" frames begin with a terminated string with a URL containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific encrypted audio file. Questions regarding the encrypted audio should be sent to the email address specified. If a $00 is found directly after the 'Frame size' and the audio file indeed is encrypted, the whole file may be considered useless. After the 'Owner identifier', a pointer to an unencrypted part of the audio can be specified. The 'Preview start' and 'Preview length' is described in frames. If no part is unencrypted, these fields should be left zeroed. After the 'preview length' field follows optionally a data block required for decryption of the audio. There may be more than one "AENC" frames in a tag, but only one with the same 'Owner identifier'. <Header for 'Audio encryption', ID: "AENC"> Owner identifier <text string> $00 Preview start $xx xx Preview length $xx xx Encryption info <binary data> 4.20. Linked information To keep information duplication as low as possible this frame may be used to link information from another ID3v2 tag that might reside in another audio file or alone in a binary file. It is RECOMMENDED that this method is only used when the files are stored on a CD-ROM or other circumstances when the risk of file separation is low. The frame contains a frame identifier, which is the frame that should be linked into this tag, a URL [URL] field, where a reference to the file where the frame is given, and additional ID data, if needed. Data should be retrieved from the first tag found in the file to which this link points. There may be more than one "LINK" frame in a tag, but only one with the same contents. A linked frame is to be considered as part of the tag and has the same restrictions as if it was a physical part of the tag (i.e. only one "RVRB" frame allowed, whether it's linked or not). <Header for 'Linked information', ID: "LINK"> Frame identifier $xx xx xx xx URL <text string> $00 ID and additional data <text string(s)> Frames that may be linked and need no additional data are "ASPI", "ETCO", "EQU2", "MCID", "MLLT", "OWNE", "RVA2", "RVRB", "SYTC", the text information frames and the URL link frames. The "AENC", "APIC", "GEOB" and "TXXX" frames may be linked with the content descriptor as additional ID data. The "USER" frame may be linked with the language field as additional ID data. The "PRIV" frame may be linked with the owner identifier as additional ID data. The "COMM", "SYLT" and "USLT" frames may be linked with three bytes of language descriptor directly followed by a content descriptor as additional ID data. 4.21. Position synchronisation frame This frame delivers information to the listener of how far into the audio stream he picked up; in effect, it states the time offset from the first frame in the stream. The frame layout is: <Head for 'Position synchronisation', ID: "POSS"> Time stamp format $xx Position $xx (xx ...) Where time stamp format is: $01 Absolute time, 32 bit sized, using MPEG frames as unit $02 Absolute time, 32 bit sized, using milliseconds as unit and position is where in the audio the listener starts to receive, i.e. the beginning of the next frame. If this frame is used in the beginning of a file the value is always 0. There may only be one "POSS" frame in each tag. 4.22. Terms of use frame This frame contains a brief description of the terms of use and ownership of the file. More detailed information concerning the legal terms might be available through the "WCOP" frame. Newlines are allowed in the text. There may be more than one 'Terms of use' frame in a tag, but only one with the same 'Language'. <Header for 'Terms of use frame', ID: "USER"> Text encoding $xx Language $xx xx xx The actual text <text string according to encoding> 4.23. Ownership frame The ownership frame might be used as a reminder of a made transaction or, if signed, as proof. Note that the "USER" and "TOWN" frames are good to use in conjunction with this one. The frame begins, after the frame ID, size and encoding fields, with a 'price paid' field. The first three characters of this field contains the currency used for the transaction, encoded according to ISO 4217 [ISO-4217] alphabetic currency code. Concatenated to this is the actual price paid, as a numerical string using "." as the decimal separator. Next is an 8 character date string (YYYYMMDD) followed by a string with the name of the seller as the last field in the frame. There may only be one "OWNE" frame in a tag. <Header for 'Ownership frame', ID: "OWNE"> Text encoding $xx Price paid <text string> $00 Date of purch. <text string> Seller <text string according to encoding> 4.24. Commercial frame This frame enables several competing offers in the same tag by bundling all needed information. That makes this frame rather complex but it's an easier solution than if one tries to achieve the same result with several frames. The frame begins, after the frame ID, size and encoding fields, with a price string field. A price is constructed by one three character currency code, encoded according to ISO 4217 [ISO-4217] alphabetic currency code, followed by a numerical value where "." is used as decimal separator. In the price string several prices may be concatenated, separated by a "/" character, but there may only be one currency of each type. The price string is followed by an 8 character date string in the format YYYYMMDD, describing for how long the price is valid. After that is a contact URL, with which the user can contact the seller, followed by a one byte 'received as' field. It describes how the audio is delivered when bought according to the following list: $00 Other $01 Standard CD album with other songs $02 Compressed audio on CD $03 File over the Internet $04 Stream over the Internet $05 As note sheets $06 As note sheets in a book with other sheets $07 Music on other media $08 Non-musical merchandise Next follows a terminated string with the name of the seller followed by a terminated string with a short description of the product. The last thing is the ability to include a company logotype. The first of them is the 'Picture MIME type' field containing information about which picture format is used. In the event that the MIME media type name is omitted, "image/" will be implied. Currently only "image/png" and "image/jpeg" are allowed. This format string is followed by the binary picture data. This two last fields may be omitted if no picture is attached. There may be more than one 'commercial frame' in a tag, but no two may be identical. <Header for 'Commercial frame', ID: "COMR"> Text encoding $xx Price string <text string> $00 Valid until <text string> Contact URL <text string> $00 Received as $xx Name of seller <text string according to encoding> $00 (00) Description <text string according to encoding> $00 (00) Picture MIME type <string> $00 Seller logo <binary data> 4.25. Encryption method registration To identify with which method a frame has been encrypted the encryption method must be registered in the tag with this frame. The 'Owner identifier' is a null-terminated string with a URL [URL] containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this specific encryption method. Questions regarding the encryption method should be sent to the indicated email address. The 'Method symbol' contains a value that is associated with this method throughout the whole tag, in the range $80-F0. All other values are reserved. The 'Method symbol' may optionally be followed by encryption specific data. There may be several "ENCR" frames in a tag but only one containing the same symbol and only one containing the same owner identifier. The method must be used somewhere in the tag. See the description of the frame encryption flag in the ID3v2 structure document [ID3v2-strct] for more information. <Header for 'Encryption method registration', ID: "ENCR"> Owner identifier <text string> $00 Method symbol $xx Encryption data <binary data> 4.26. Group identification registration This frame enables grouping of otherwise unrelated frames. This can be used when some frames are to be signed. To identify which frames belongs to a set of frames a group identifier must be registered in the tag with this frame. The 'Owner identifier' is a null-terminated string with a URL [URL] containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for this grouping. Questions regarding the grouping should be sent to the indicated email address. The 'Group symbol' contains a value that associates the frame with this group throughout the whole tag, in the range $80-F0. All other values are reserved. The 'Group symbol' may optionally be followed by some group specific data, e.g. a digital signature. There may be several "GRID" frames in a tag but only one containing the same symbol and only one containing the same owner identifier. The group symbol must be used somewhere in the tag. See the description of the frame grouping flag in the ID3v2 structure document [ID3v2-strct] for more information. <Header for 'Group ID registration', ID: "GRID"> Owner identifier <text string> $00 Group symbol $xx Group dependent data <binary data> 4.27. Private frame This frame is used to contain information from a software producer that its program uses and does not fit into the other frames. The frame consists of an 'Owner identifier' string and the binary data. The 'Owner identifier' is a null-terminated string with a URL [URL] containing an email address, or a link to a location where an email address can be found, that belongs to the organisation responsible for the frame. Questions regarding the frame should be sent to the indicated email address. The tag may contain more than one "PRIV" frame but only with different contents. <Header for 'Private frame', ID: "PRIV"> Owner identifier <text string> $00 The private data <binary data> 4.28. Signature frame This frame enables a group of frames, grouped with the 'Group identification registration', to be signed. Although signatures can reside inside the registration frame, it might be desired to store the signature elsewhere, e.g. in watermarks. There may be more than one 'signature frame' in a tag, but no two may be identical. <Header for 'Signature frame', ID: "SIGN"> Group symbol $xx Signature <binary data> 4.29. Seek frame This frame indicates where other tags in a file/stream can be found. The 'minimum offset to next tag' is calculated from the end of this tag to the beginning of the next. There may only be one 'seek frame' in a tag. <Header for 'Seek frame', ID: "SEEK"> Minimum offset to next tag $xx xx xx xx 4.30. Audio seek point index Audio files with variable bit rates are intrinsically difficult to deal with in the case of seeking within the file. The ASPI frame makes seeking easier by providing a list a seek points within the audio file. The seek points are a fractional offset within the audio data, providing a starting point from which to find an appropriate point to start decoding. The presence of an ASPI frame requires the existence of a TLEN frame, indicating the duration of the file in milliseconds. There may only be one 'audio seek point index' frame in a tag. <Header for 'Seek Point Index', ID: "ASPI"> Indexed data start (S) $xx xx xx xx Indexed data length (L) $xx xx xx xx Number of index points (N) $xx xx Bits per index point (b) $xx Then for every index point the following data is included; Fraction at index (Fi) $xx (xx) 'Indexed data start' is a byte offset from the beginning of the file. 'Indexed data length' is the byte length of the audio data being indexed. 'Number of index points' is the number of index points, as the name implies. The recommended number is 100. 'Bits per index point' is 8 or 16, depending on the chosen precision. 8 bits works well for short files (less than 5 minutes of audio), while 16 bits is advantageous for long files. 'Fraction at index' is the numerator of the fraction representing a relative position in the data. The denominator is 2 to the power of b. Here are the algorithms to be used in the calculation. The known data must be the offset of the start of the indexed data (S), the offset of the end of the indexed data (E), the number of index points (N), the offset at index i (Oi). We calculate the fraction at index i (Fi). Oi is the offset of the frame whose start is soonest after the point for which the time offset is (i/N * duration). The frame data should be calculated as follows: Fi = Oi/L * 2^b (rounded down to the nearest integer) Offset calculation should be calculated as follows from data in the frame: Oi = (Fi/2^b)*L (rounded up to the nearest integer) 5. Copyright Copyright (C) Martin Nilsson 2000. All Rights Reserved. This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that a reference to this document is included on all such copies and derivative works. However, this document itself may not be modified in any way and reissued as the original document. The limited permissions granted above are perpetual and will not be revoked. This document and the information contained herein is provided on an "AS IS" basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 6. References [CDDB] Compact Disc Data Base <url:http://www.cddb.com> [ID3v2.3.0] Martin Nilsson, "ID3v2 informal standard". <url:http://www.id3.org/id3v2.3.0.txt> [ID3v2-strct] Martin Nilsson, "ID3 tag version 2.4.0 - Main Structure" <url:http//www.id3.org/id3v2.4.0-structure.txt> [ISO-639-2] ISO/FDIS 639-2. Codes for the representation of names of languages, Part 2: Alpha-3 code. Technical committee / subcommittee: TC 37 / SC 2 [ISO-4217] ISO 4217:1995. Codes for the representation of currencies and funds. Technical committee / subcommittee: TC 68 [ISO-8859-1] ISO/IEC DIS 8859-1. 8-bit single-byte coded graphic character sets, Part 1: Latin alphabet No. 1. Technical committee / subcommittee: JTC 1 / SC 2 [ISRC] ISO 3901:1986 International Standard Recording Code (ISRC). Technical committee / subcommittee: TC 46 / SC 9 [JFIF] JPEG File Interchange Format, version 1.02 <url:http://www.w3.org/Graphics/JPEG/jfif.txt> [KEYWORDS] S. Bradner, 'Key words for use in RFCs to Indicate Requirement Levels', RFC 2119, March 1997. <url:ftp://ftp.isi.edu/in-notes/rfc2119.txt> [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies", RFC 2045, November 1996. <url:ftp://ftp.isi.edu/in-notes/rfc2045.txt> [MPEG] ISO/IEC 11172-3:1993. Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s, Part 3: Audio. Technical committee / subcommittee: JTC 1 / SC 29 and ISO/IEC 13818-3:1995 Generic coding of moving pictures and associated audio information, Part 3: Audio. Technical committee / subcommittee: JTC 1 / SC 29 and ISO/IEC DIS 13818-3 Generic coding of moving pictures and associated audio information, Part 3: Audio (Revision of ISO/IEC 13818-3:1995) [PNG] Portable Network Graphics, version 1.0 <url:http://www.w3.org/TR/REC-png-multi.html> [URL] T. Berners-Lee, L. Masinter & M. McCahill, "Uniform Resource Locators (URL).", RFC 1738, December 1994. <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt> [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, "ZLIB Compressed Data Format Specification version 3.3", RFC 1950, May 1996. <url:ftp://ftp.isi.edu/in-notes/rfc1950.txt> 7. Appendix A. Appendix A - Genre List from ID3v1 The following genres is defined in ID3v1 0.Blues 1.Classic Rock 2.Country 3.Dance 4.Disco 5.Funk 6.Grunge 7.Hip-Hop 8.Jazz 9.Metal 10.New Age 11.Oldies 12.Other 13.Pop 14.R&B 15.Rap 16.Reggae 17.Rock 18.Techno 19.Industrial 20.Alternative 21.Ska 22.Death Metal 23.Pranks 24.Soundtrack 25.Euro-Techno 26.Ambient 27.Trip-Hop 28.Vocal 29.Jazz+Funk 30.Fusion 31.Trance 32.Classical 33.Instrumental 34.Acid 35.House 36.Game 37.Sound Clip 38.Gospel 39.Noise 40.AlternRock 41.Bass 42.Soul 43.Punk 44.Space 45.Meditative 46.Instrumental Pop 47.Instrumental Rock 48.Ethnic 49.Gothic 50.Darkwave 51.Techno-Industrial 52.Electronic 53.Pop-Folk 54.Eurodance 55.Dream 56.Southern Rock 57.Comedy 58.Cult 59.Gangsta 60.Top 40 61.Christian Rap 62.Pop/Funk 63.Jungle 64.Native American 65.Cabaret 66.New Wave 67.Psychadelic 68.Rave 69.Showtunes 70.Trailer 71.Lo-Fi 72.Tribal 73.Acid Punk 74.Acid Jazz 75.Polka 76.Retro 77.Musical 78.Rock & Roll 79.Hard Rock 8. Author's Address Written by Martin Nilsson Rydsvägen 246 C. 30 SE-584 34 Linköping Sweden Email: nilsson@id3.org �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2.4.0-structure.txt���������������������������������������������0000664�0000000�0000000�00000067445�14447736377�0022254�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Informal standard M. Nilsson Document: id3v2.4.0-structure.txt 16 September 2001 ID3 tag version 2.4.0 - Main Structure Status of this document This document is an informal standard and replaces the ID3v2.3.0 standard [ID3v2]. A formal standard will use another revision number even if the content is identical to document. The contents in this document may change for clarifications but never for added or altered functionallity. Distribution of this document is unlimited. Abstract This document describes the main structure of ID3v2.4.0, which is a revised version of the ID3v2 informal standard [ID3v2] version 2.3.0. The ID3v2 offers a flexible way of storing audio meta information within the audio file itself. The information may be technical information, such as equalisation curves, as well as title, performer, copyright etc. ID3v2.4.0 is meant to be as close as possible to ID3v2.3.0 in order to allow for implementations to be revised as easily as possible. 1. Table of contents Status of this document Abstract 1. Table of contents 2. Conventions in this document 2. Standard overview 3. ID3v2 overview 3.1. ID3v2 header 3.2. ID3v2 extended header 3.3. Padding 3.4. ID3v2 footer 4. ID3v2 frames overview 4.1. Frame header flags 4.1.1. Frame status flags 4.1.2. Frame format flags 5. Tag location 6. Unsynchronisation 6.1. The unsynchronisation scheme 6.2. Synchsafe integers 7. Copyright 8. References 9. Author's Address 2. Conventions in this document Text within "" is a text string exactly as it appears in a tag. Numbers preceded with $ are hexadecimal and numbers preceded with % are binary. $xx is used to indicate a byte with unknown content. %x is used to indicate a bit with unknown content. The most significant bit (MSB) of a byte is called 'bit 7' and the least significant bit (LSB) is called 'bit 0'. A tag is the whole tag described in this document. A frame is a block of information in the tag. The tag consists of a header, frames and optional padding. A field is a piece of information; one value, a string etc. A numeric string is a string that consists of the characters "0123456789" only. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 [KEYWORDS]. 3. ID3v2 overview ID3v2 is a general tagging format for audio, which makes it possible to store meta data about the audio inside the audio file itself. The ID3 tag described in this document is mainly targeted at files encoded with MPEG-1/2 layer I, MPEG-1/2 layer II, MPEG-1/2 layer III and MPEG-2.5, but may work with other types of encoded audio or as a stand alone format for audio meta data. ID3v2 is designed to be as flexible and expandable as possible to meet new meta information needs that might arise. To achieve that ID3v2 is constructed as a container for several information blocks, called frames, whose format need not be known to the software that encounters them. At the start of every frame is an unique and predefined identifier, a size descriptor that allows software to skip unknown frames and a flags field. The flags describes encoding details and if the frame should remain in the tag, should it be unknown to the software, if the file is altered. The bitorder in ID3v2 is most significant bit first (MSB). The byteorder in multibyte numbers is most significant byte first (e.g. $12345678 would be encoded $12 34 56 78), also known as big endian and network byte order. Overall tag structure: +-----------------------------+ | Header (10 bytes) | +-----------------------------+ | Extended Header | | (variable length, OPTIONAL) | +-----------------------------+ | Frames (variable length) | +-----------------------------+ | Padding | | (variable length, OPTIONAL) | +-----------------------------+ | Footer (10 bytes, OPTIONAL) | +-----------------------------+ In general, padding and footer are mutually exclusive. See details in sections 3.3, 3.4 and 5. 3.1. ID3v2 header The first part of the ID3v2 tag is the 10 byte tag header, laid out as follows: ID3v2/file identifier "ID3" ID3v2 version $04 00 ID3v2 flags %abcd0000 ID3v2 size 4 * %0xxxxxxx The first three bytes of the tag are always "ID3", to indicate that this is an ID3v2 tag, directly followed by the two version bytes. The first byte of ID3v2 version is its major version, while the second byte is its revision number. In this case this is ID3v2.4.0. All revisions are backwards compatible while major versions are not. If software with ID3v2.4.0 and below support should encounter version five or higher it should simply ignore the whole tag. Version or revision will never be $FF. The version is followed by the ID3v2 flags field, of which currently four flags are used. a - Unsynchronisation Bit 7 in the 'ID3v2 flags' indicates whether or not unsynchronisation is applied on all frames (see section 6.1 for details); a set bit indicates usage. b - Extended header The second bit (bit 6) indicates whether or not the header is followed by an extended header. The extended header is described in section 3.2. A set bit indicates the presence of an extended header. c - Experimental indicator The third bit (bit 5) is used as an 'experimental indicator'. This flag SHALL always be set when the tag is in an experimental stage. d - Footer present Bit 4 indicates that a footer (section 3.4) is present at the very end of the tag. A set bit indicates the presence of a footer. All the other flags MUST be cleared. If one of these undefined flags are set, the tag might not be readable for a parser that does not know the flags function. The ID3v2 tag size is stored as a 32 bit synchsafe integer (section 6.2), making a total of 28 effective bits (representing up to 256MB). The ID3v2 tag size is the sum of the byte length of the extended header, the padding and the frames after unsynchronisation. If a footer is present this equals to ('total size' - 20) bytes, otherwise ('total size' - 10) bytes. An ID3v2 tag can be detected with the following pattern: $49 44 33 yy yy xx zz zz zz zz Where yy is less than $FF, xx is the 'flags' byte and zz is less than $80. 3.2. Extended header The extended header contains information that can provide further insight in the structure of the tag, but is not vital to the correct parsing of the tag information; hence the extended header is optional. Extended header size 4 * %0xxxxxxx Number of flag bytes $01 Extended Flags $xx Where the 'Extended header size' is the size of the whole extended header, stored as a 32 bit synchsafe integer. An extended header can thus never have a size of fewer than six bytes. The extended flags field, with its size described by 'number of flag bytes', is defined as: %0bcd0000 Each flag that is set in the extended header has data attached, which comes in the order in which the flags are encountered (i.e. the data for flag 'b' comes before the data for flag 'c'). Unset flags cannot have any attached data. All unknown flags MUST be unset and their corresponding data removed when a tag is modified. Every set flag's data starts with a length byte, which contains a value between 0 and 127 ($00 - $7f), followed by data that has the field length indicated by the length byte. If a flag has no attached data, the value $00 is used as length byte. b - Tag is an update If this flag is set, the present tag is an update of a tag found earlier in the present file or stream. If frames defined as unique are found in the present tag, they are to override any corresponding ones found in the earlier tag. This flag has no corresponding data. Flag data length $00 c - CRC data present If this flag is set, a CRC-32 [ISO-3309] data is included in the extended header. The CRC is calculated on all the data between the header and footer as indicated by the header's tag length field, minus the extended header. Note that this includes the padding (if there is any), but excludes the footer. The CRC-32 is stored as an 35 bit synchsafe integer, leaving the upper four bits always zeroed. Flag data length $05 Total frame CRC 5 * %0xxxxxxx d - Tag restrictions For some applications it might be desired to restrict a tag in more ways than imposed by the ID3v2 specification. Note that the presence of these restrictions does not affect how the tag is decoded, merely how it was restricted before encoding. If this flag is set the tag is restricted as follows: Flag data length $01 Restrictions %ppqrrstt p - Tag size restrictions 00 No more than 128 frames and 1 MB total tag size. 01 No more than 64 frames and 128 KB total tag size. 10 No more than 32 frames and 40 KB total tag size. 11 No more than 32 frames and 4 KB total tag size. q - Text encoding restrictions 0 No restrictions 1 Strings are only encoded with ISO-8859-1 [ISO-8859-1] or UTF-8 [UTF-8]. r - Text fields size restrictions 00 No restrictions 01 No string is longer than 1024 characters. 10 No string is longer than 128 characters. 11 No string is longer than 30 characters. Note that nothing is said about how many bytes is used to represent those characters, since it is encoding dependent. If a text frame consists of more than one string, the sum of the strungs is restricted as stated. s - Image encoding restrictions 0 No restrictions 1 Images are encoded only with PNG [PNG] or JPEG [JFIF]. t - Image size restrictions 00 No restrictions 01 All images are 256x256 pixels or smaller. 10 All images are 64x64 pixels or smaller. 11 All images are exactly 64x64 pixels, unless required otherwise. 3.3. Padding It is OPTIONAL to include padding after the final frame (at the end of the ID3 tag), making the size of all the frames together smaller than the size given in the tag header. A possible purpose of this padding is to allow for adding a few additional frames or enlarge existing frames within the tag without having to rewrite the entire file. The value of the padding bytes must be $00. A tag MUST NOT have any padding between the frames or between the tag header and the frames. Furthermore it MUST NOT have any padding when a tag footer is added to the tag. 3.4. ID3v2 footer To speed up the process of locating an ID3v2 tag when searching from the end of a file, a footer can be added to the tag. It is REQUIRED to add a footer to an appended tag, i.e. a tag located after all audio data. The footer is a copy of the header, but with a different identifier. ID3v2 identifier "3DI" ID3v2 version $04 00 ID3v2 flags %abcd0000 ID3v2 size 4 * %0xxxxxxx 4. ID3v2 frame overview All ID3v2 frames consists of one frame header followed by one or more fields containing the actual information. The header is always 10 bytes and laid out as follows: Frame ID $xx xx xx xx (four characters) Size 4 * %0xxxxxxx Flags $xx xx The frame ID is made out of the characters capital A-Z and 0-9. Identifiers beginning with "X", "Y" and "Z" are for experimental frames and free for everyone to use, without the need to set the experimental bit in the tag header. Bear in mind that someone else might have used the same identifier as you. All other identifiers are either used or reserved for future use. The frame ID is followed by a size descriptor containing the size of the data in the final frame, after encryption, compression and unsynchronisation. The size is excluding the frame header ('total frame size' - 10 bytes) and stored as a 32 bit synchsafe integer. In the frame header the size descriptor is followed by two flag bytes. These flags are described in section 4.1. There is no fixed order of the frames' appearance in the tag, although it is desired that the frames are arranged in order of significance concerning the recognition of the file. An example of such order: UFID, TIT2, MCDI, TRCK ... A tag MUST contain at least one frame. A frame must be at least 1 byte big, excluding the header. If nothing else is said, strings, including numeric strings and URLs [URL], are represented as ISO-8859-1 [ISO-8859-1] characters in the range $20 - $FF. Such strings are represented in frame descriptions as <text string>, or <full text string> if newlines are allowed. If nothing else is said newline character is forbidden. In ISO-8859-1 a newline is represented, when allowed, with $0A only. Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: $00 ISO-8859-1 [ISO-8859-1]. Terminated with $00. $01 UTF-16 [UTF-16] encoded Unicode [UNICODE] with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. $02 UTF-16BE [UTF-16] encoded Unicode [UNICODE] without BOM. Terminated with $00 00. $03 UTF-8 [UTF-8] encoded Unicode [UNICODE]. Terminated with $00. Strings dependent on encoding are represented in frame descriptions as <text string according to encoding>, or <full text string according to encoding> if newlines are allowed. Any empty strings of type $01 which are NULL-terminated may have the Unicode BOM followed by a Unicode NULL ($FF FE 00 00 or $FE FF 00 00). The timestamp fields are based on a subset of ISO 8601. When being as precise as possible the format of a time string is yyyy-MM-ddTHH:mm:ss (year, "-", month, "-", day, "T", hour (out of 24), ":", minutes, ":", seconds), but the precision may be reduced by removing as many time indicators as wanted. Hence valid timestamps are yyyy, yyyy-MM, yyyy-MM-dd, yyyy-MM-ddTHH, yyyy-MM-ddTHH:mm and yyyy-MM-ddTHH:mm:ss. All time stamps are UTC. For durations, use the slash character as described in 8601, and for multiple non- contiguous dates, use multiple strings, if allowed by the frame definition. The three byte language field, present in several frames, is used to describe the language of the frame's content, according to ISO-639-2 [ISO-639-2]. The language should be represented in lower case. If the language is not known the string "XXX" should be used. All URLs [URL] MAY be relative, e.g. "picture.png", "../doc.txt". If a frame is longer than it should be, e.g. having more fields than specified in this document, that indicates that additions to the frame have been made in a later version of the ID3v2 standard. This is reflected by the revision number in the header of the tag. 4.1. Frame header flags In the frame header the size descriptor is followed by two flag bytes. All unused flags MUST be cleared. The first byte is for 'status messages' and the second byte is a format description. If an unknown flag is set in the first byte the frame MUST NOT be changed without that bit cleared. If an unknown flag is set in the second byte the frame is likely to not be readable. Some flags in the second byte indicates that extra information is added to the header. These fields of extra information is ordered as the flags that indicates them. The flags field is defined as follows (l and o left out because ther resemblence to one and zero): %0abc0000 %0h00kmnp Some frame format flags indicate that additional information fields are added to the frame. This information is added after the frame header and before the frame data in the same order as the flags that indicates them. I.e. the four bytes of decompressed size will precede the encryption method byte. These additions affects the 'frame size' field, but are not subject to encryption or compression. The default status flags setting for a frame is, unless stated otherwise, 'preserved if tag is altered' and 'preserved if file is altered', i.e. %00000000. 4.1.1. Frame status flags a - Tag alter preservation This flag tells the tag parser what to do with this frame if it is unknown and the tag is altered in any way. This applies to all kinds of alterations, including adding more padding and reordering the frames. 0 Frame should be preserved. 1 Frame should be discarded. b - File alter preservation This flag tells the tag parser what to do with this frame if it is unknown and the file, excluding the tag, is altered. This does not apply when the audio is completely replaced with other audio data. 0 Frame should be preserved. 1 Frame should be discarded. c - Read only This flag, if set, tells the software that the contents of this frame are intended to be read only. Changing the contents might break something, e.g. a signature. If the contents are changed, without knowledge of why the frame was flagged read only and without taking the proper means to compensate, e.g. recalculating the signature, the bit MUST be cleared. 4.1.2. Frame format flags h - Grouping identity This flag indicates whether or not this frame belongs in a group with other frames. If set, a group identifier byte is added to the frame. Every frame with the same group identifier belongs to the same group. 0 Frame does not contain group information 1 Frame contains group information k - Compression This flag indicates whether or not the frame is compressed. A 'Data Length Indicator' byte MUST be included in the frame. 0 Frame is not compressed. 1 Frame is compressed using zlib [zlib] deflate method. If set, this requires the 'Data Length Indicator' bit to be set as well. m - Encryption This flag indicates whether or not the frame is encrypted. If set, one byte indicating with which method it was encrypted will be added to the frame. See description of the ENCR frame for more information about encryption method registration. Encryption should be done after compression. Whether or not setting this flag requires the presence of a 'Data Length Indicator' depends on the specific algorithm used. 0 Frame is not encrypted. 1 Frame is encrypted. n - Unsynchronisation This flag indicates whether or not unsynchronisation was applied to this frame. See section 6 for details on unsynchronisation. If this flag is set all data from the end of this header to the end of this frame has been unsynchronised. Although desirable, the presence of a 'Data Length Indicator' is not made mandatory by unsynchronisation. 0 Frame has not been unsynchronised. 1 Frame has been unsyrchronised. p - Data length indicator This flag indicates that a data length indicator has been added to the frame. The data length indicator is the value one would write as the 'Frame length' if all of the frame format flags were zeroed, represented as a 32 bit synchsafe integer. 0 There is no Data Length Indicator. 1 A data length Indicator has been added to the frame. 5. Tag location The default location of an ID3v2 tag is prepended to the audio so that players can benefit from the information when the data is streamed. It is however possible to append the tag, or make a prepend/append combination. When deciding upon where an unembedded tag should be located, the following order of preference SHOULD be considered. 1. Prepend the tag. 2. Prepend a tag with all vital information and add a second tag at the end of the file, before tags from other tagging systems. The first tag is required to have a SEEK frame. 3. Add a tag at the end of the file, before tags from other tagging systems. In case 2 and 3 the tag can simply be appended if no other known tags are present. The suggested method to find ID3v2 tags are: 1. Look for a prepended tag using the pattern found in section 3.1. 2. If a SEEK frame was found, use its values to guide further searching. 3. Look for a tag footer, scanning from the back of the file. For every new tag that is found, the old tag should be discarded unless the update flag in the extended header (section 3.2) is set. 6. Unsynchronisation The only purpose of unsynchronisation is to make the ID3v2 tag as compatible as possible with existing software and hardware. There is no use in 'unsynchronising' tags if the file is only to be processed only by ID3v2 aware software and hardware. Unsynchronisation is only useful with tags in MPEG 1/2 layer I, II and III, MPEG 2.5 and AAC files. 6.1. The unsynchronisation scheme Whenever a false synchronisation is found within the tag, one zeroed byte is inserted after the first false synchronisation byte. The format of synchronisations that should be altered by ID3 encoders is as follows: %11111111 111xxxxx and should be replaced with: %11111111 00000000 111xxxxx This has the side effect that all $FF 00 combinations have to be altered, so they will not be affected by the decoding process. Therefore all the $FF 00 combinations have to be replaced with the $FF 00 00 combination during the unsynchronisation. To indicate usage of the unsynchronisation, the unsynchronisation flag in the frame header should be set. This bit MUST be set if the frame was altered by the unsynchronisation and SHOULD NOT be set if unaltered. If all frames in the tag are unsynchronised the unsynchronisation flag in the tag header SHOULD be set. It MUST NOT be set if the tag has a frame which is not unsynchronised. Assume the first byte of the audio to be $FF. The special case when the last byte of the last frame is $FF and no padding nor footer is used will then introduce a false synchronisation. This can be solved by adding a footer, adding padding or unsynchronising the frame and add $00 to the end of the frame data, thus adding more byte to the frame size than a normal unsynchronisation would. Although not preferred, it is allowed to apply the last method on all frames ending with $FF. It is preferred that the tag is either completely unsynchronised or not unsynchronised at all. A completely unsynchronised tag has no false synchonisations in it, as defined above, and does not end with $FF. A completely non-unsynchronised tag contains no unsynchronised frames, and thus the unsynchronisation flag in the header is cleared. Do bear in mind, that if compression or encryption is used, the unsynchronisation scheme MUST be applied afterwards. When decoding an unsynchronised frame, the unsynchronisation scheme MUST be reversed first, encryption and decompression afterwards. 6.2. Synchsafe integers In some parts of the tag it is inconvenient to use the unsychronisation scheme because the size of unsynchronised data is not known in advance, which is particularly problematic with size descriptors. The solution in ID3v2 is to use synchsafe integers, in which there can never be any false synchs. Synchsafe integers are integers that keep its highest bit (bit 7) zeroed, making seven bits out of eight available. Thus a 32 bit synchsafe integer can store 28 bits of information. Example: 255 (%11111111) encoded as a 16 bit synchsafe integer is 383 (%00000001 01111111). 7. Copyright Copyright (C) Martin Nilsson 2000. All Rights Reserved. This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that a reference to this document is included on all such copies and derivative works. However, this document itself may not be modified in any way and reissued as the original document. The limited permissions granted above are perpetual and will not be revoked. This document and the information contained herein is provided on an 'AS IS' basis and THE AUTHORS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. 8. References [ID3v2] Martin Nilsson, 'ID3v2 informal standard'. <url:http://www.id3.org/id3v2.3.0.txt> [ISO-639-2] ISO/FDIS 639-2. 'Codes for the representation of names of languages, Part 2: Alpha-3 code.' Technical committee / subcommittee: TC 37 / SC 2 [ISO-3309] ISO 3309 'Information Processing Systems--Data Communication High-Level Data Link Control Procedure--Frame Structure', IS 3309, October 1984, 3rd Edition. [ISO-8859-1] ISO/IEC DIS 8859-1. '8-bit single-byte coded graphic character sets, Part 1: Latin alphabet No. 1.' Technical committee / subcommittee: JTC 1 / SC 2 [JFIF] 'JPEG File Interchange Format, version 1.02' <url:http://www.w3.org/Graphics/JPEG/jfif.txt> [KEYWORDS] S. Bradner, 'Key words for use in RFCs to Indicate Requirement Levels', RFC 2119, March 1997. <url:ftp://ftp.isi.edu/in-notes/rfc2119.txt> [MPEG] ISO/IEC 11172-3:1993. 'Coding of moving pictures and associated audio for digital storage media at up to about 1,5 Mbit/s, Part 3: Audio.' Technical committee / subcommittee: JTC 1 / SC 29 and ISO/IEC 13818-3:1995 'Generic coding of moving pictures and associated audio information, Part 3: Audio.' Technical committee / subcommittee: JTC 1 / SC 29 and ISO/IEC DIS 13818-3 'Generic coding of moving pictures and associated audio information, Part 3: Audio (Revision of ISO/IEC 13818-3:1995)' [PNG] 'Portable Network Graphics, version 1.0' <url:http://www.w3.org/TR/REC-png-multi.html> [UNICODE] The Unicode Consortium, 'The Unicode Standard Version 3.0', ISBN 0-201-61633-5. <url:http://www.unicode.org/unicode/standard/versions/Unicode3.0.htm> [URL] T. Berners-Lee, L. Masinter & M. McCahill, 'Uniform Resource Locators (URL)', RFC 1738, December 1994. <url:ftp://ftp.isi.edu/in-notes/rfc1738.txt> [UTF-8] F. Yergeau, 'UTF-8, a transformation format of ISO 10646', RFC 2279, January 1998. <url:ftp://ftp.isi.edu/in-notes/rfc2279.txt> [UTF-16] F. Yergeau, 'UTF-16, an encoding of ISO 10646', RFC 2781, February 2000. <url:ftp://ftp.isi.edu/in-notes/rfc2781.txt> [ZLIB] P. Deutsch, Aladdin Enterprises & J-L. Gailly, 'ZLIB Compressed Data Format Specification version 3.3', RFC 1950, May 1996. <url:ftp://ftp.isi.edu/in-notes/rfc1950.txt> 9. Author's Address Written by Martin Nilsson Rydsvägen 246 C. 30 SE-584 34 Linköping Sweden Email: nilsson@id3.org ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2.h�������������������������������������������������������������0000664�0000000�0000000�00000000737�14447736377�0017315�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef TAGLIB_ID3V2_H #define TAGLIB_ID3V2_H namespace TagLib { //! An ID3v2 implementation /*! * This is a relatively complete and flexible framework for working with ID3v2 * tags. * * \see ID3v2::Tag */ namespace ID3v2 { /*! * Used to specify which version of the ID3 standard to use when saving tags. */ enum Version { v3 = 3, //<! ID3v2.3 v4 = 4 //<! ID3v2.4 }; } // namespace ID3v2 } // namespace TagLib #endif ���������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2extendedheader.cpp���������������������������������������������0000664�0000000�0000000�00000005244�14447736377�0022540�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "id3v2extendedheader.h" #include "id3v2synchdata.h" using namespace TagLib; using namespace ID3v2; class ExtendedHeader::ExtendedHeaderPrivate { public: ExtendedHeaderPrivate() : size(0) {} unsigned int size; }; //////////////////////////////////////////////////////////////////////////////// // public methods //////////////////////////////////////////////////////////////////////////////// ExtendedHeader::ExtendedHeader() : d(new ExtendedHeaderPrivate()) { } ExtendedHeader::~ExtendedHeader() { delete d; } unsigned int ExtendedHeader::size() const { return d->size; } void ExtendedHeader::setData(const ByteVector &data) { parse(data); } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void ExtendedHeader::parse(const ByteVector &data) { d->size = SynchData::toUInt(data.mid(0, 4)); // (structure 3.2 "Extended header size") } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2extendedheader.h�����������������������������������������������0000664�0000000�0000000�00000007137�14447736377�0022210�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ID3V2EXTENDEDHEADER_H #define TAGLIB_ID3V2EXTENDEDHEADER_H #include "taglib_export.h" #include "tbytevector.h" #include "taglib.h" namespace TagLib { namespace ID3v2 { //! ID3v2 extended header implementation /*! * This class implements ID3v2 extended headers. It attempts to follow, * both semantically and programmatically, the structure specified in * the ID3v2 standard. The API is based on the properties of ID3v2 extended * headers specified there. If any of the terms used in this documentation * are unclear please check the specification in the linked section. * (Structure, <a href="id3v2-structure.html#3.2">3.2</a>) */ class TAGLIB_EXPORT ExtendedHeader { public: /*! * Constructs an empty ID3v2 extended header. */ ExtendedHeader(); /*! * Destroys the extended header. */ virtual ~ExtendedHeader(); /*! * Returns the size of the extended header. This is variable for the * extended header. */ unsigned int size() const; /*! * Sets the data that will be used as the extended header. Since the * length is not known before the extended header has been parsed, this * should just be a pointer to the first byte of the extended header. It * will determine the length internally and make that available through * size(). */ void setData(const ByteVector &data); protected: /*! * Called by setData() to parse the extended header data. It makes this * information available through the public API. */ void parse(const ByteVector &data); private: ExtendedHeader(const ExtendedHeader &); ExtendedHeader &operator=(const ExtendedHeader &); class ExtendedHeaderPrivate; ExtendedHeaderPrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2footer.cpp�����������������������������������������������������0000664�0000000�0000000�00000004145�14447736377�0021064�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "id3v2footer.h" #include "id3v2header.h" using namespace TagLib; using namespace ID3v2; class Footer::FooterPrivate { }; Footer::Footer() : d(0) { } Footer::~Footer() { } unsigned int Footer::size() { return 10; } ByteVector Footer::render(const Header *header) const { ByteVector headerData = header->render(); headerData[0] = '3'; headerData[1] = 'D'; headerData[2] = 'I'; return headerData; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2footer.h�������������������������������������������������������0000664�0000000�0000000�00000006000�14447736377�0020521�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ID3V2FOOTER_H #define TAGLIB_ID3V2FOOTER_H #include "taglib_export.h" #include "tbytevector.h" namespace TagLib { namespace ID3v2 { class Header; //! ID3v2 footer implementation /*! * Per the ID3v2 specification, the tag's footer is just a copy of the * information in the header. As such there is no API for reading the * data from the header, it can just as easily be done from the header. * * In fact, at this point, TagLib does not even parse the footer since * it is not useful internally. However, if the flag to include a footer * has been set in the ID3v2::Tag, TagLib will render a footer. */ class TAGLIB_EXPORT Footer { public: /*! * Constructs an empty ID3v2 footer. */ Footer(); /*! * Destroys the footer. */ virtual ~Footer(); /*! * Returns the size of the footer. Presently this is always 10 bytes. */ static unsigned int size(); /*! * Renders the footer based on the data in \a header. */ ByteVector render(const Header *header) const; private: Footer(const Footer &); Footer &operator=(const Footer &); class FooterPrivate; FooterPrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif taglib-1.13.1/taglib/mpeg/id3v2/id3v2frame.cpp������������������������������������������������������0000664�0000000�0000000�00000060634�14447736377�0020665�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <bitset> #include <tdebug.h> #include <tstringlist.h> #include <tzlib.h> #include "id3v2tag.h" #include "id3v2frame.h" #include "id3v2synchdata.h" #include "tpropertymap.h" #include "frames/textidentificationframe.h" #include "frames/urllinkframe.h" #include "frames/unsynchronizedlyricsframe.h" #include "frames/commentsframe.h" #include "frames/uniquefileidentifierframe.h" #include "frames/unknownframe.h" #include "frames/podcastframe.h" using namespace TagLib; using namespace ID3v2; class Frame::FramePrivate { public: FramePrivate() : header(0) {} ~FramePrivate() { delete header; } Frame::Header *header; }; namespace { bool isValidFrameID(const ByteVector &frameID) { if(frameID.size() != 4) return false; for(ByteVector::ConstIterator it = frameID.begin(); it != frameID.end(); it++) { if( (*it < 'A' || *it > 'Z') && (*it < '0' || *it > '9') ) { return false; } } return true; } } // namespace //////////////////////////////////////////////////////////////////////////////// // static methods //////////////////////////////////////////////////////////////////////////////// unsigned int Frame::headerSize() { return Header::size(); } unsigned int Frame::headerSize(unsigned int version) { return Header::size(version); } ByteVector Frame::textDelimiter(String::Type t) { if(t == String::UTF16 || t == String::UTF16BE || t == String::UTF16LE) return ByteVector(2, '\0'); return ByteVector(1, '\0'); } const String Frame::instrumentPrefix("PERFORMER:"); const String Frame::commentPrefix("COMMENT:"); const String Frame::lyricsPrefix("LYRICS:"); const String Frame::urlPrefix("URL:"); //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Frame *Frame::createTextualFrame(const String &key, const StringList &values) //static { // check if the key is contained in the key<=>frameID mapping ByteVector frameID = keyToFrameID(key); if(!frameID.isEmpty()) { // Apple proprietary WFED (Podcast URL), MVNM (Movement Name), MVIN (Movement Number), GRP1 (Grouping) are in fact text frames. if(frameID[0] == 'T' || frameID == "WFED" || frameID == "MVNM" || frameID == "MVIN" || frameID == "GRP1"){ // text frame TextIdentificationFrame *frame = new TextIdentificationFrame(frameID, String::UTF8); frame->setText(values); return frame; } if((frameID[0] == 'W') && (values.size() == 1)){ // URL frame (not WXXX); support only one value UrlLinkFrame* frame = new UrlLinkFrame(frameID); frame->setUrl(values.front()); return frame; } if(frameID == "PCST") { return new PodcastFrame(); } } if(key == "MUSICBRAINZ_TRACKID" && values.size() == 1) { UniqueFileIdentifierFrame *frame = new UniqueFileIdentifierFrame("http://musicbrainz.org", values.front().data(String::UTF8)); return frame; } // now we check if it's one of the "special" cases: // -LYRICS: depending on the number of values, use USLT or TXXX (with description=LYRICS) if((key == "LYRICS" || key.startsWith(lyricsPrefix)) && values.size() == 1){ UnsynchronizedLyricsFrame *frame = new UnsynchronizedLyricsFrame(String::UTF8); frame->setDescription(key == "LYRICS" ? key : key.substr(lyricsPrefix.size())); frame->setText(values.front()); return frame; } // -URL: depending on the number of values, use WXXX or TXXX (with description=URL) if((key == "URL" || key.startsWith(urlPrefix)) && values.size() == 1){ UserUrlLinkFrame *frame = new UserUrlLinkFrame(String::UTF8); frame->setDescription(key == "URL" ? key : key.substr(urlPrefix.size())); frame->setUrl(values.front()); return frame; } // -COMMENT: depending on the number of values, use COMM or TXXX (with description=COMMENT) if((key == "COMMENT" || key.startsWith(commentPrefix)) && values.size() == 1){ CommentsFrame *frame = new CommentsFrame(String::UTF8); if (key != "COMMENT"){ frame->setDescription(key.substr(commentPrefix.size())); } frame->setText(values.front()); return frame; } // if non of the above cases apply, we use a TXXX frame with the key as description return new UserTextIdentificationFrame(keyToTXXX(key), values, String::UTF8); } Frame::~Frame() { delete d; } ByteVector Frame::frameID() const { if(d->header) return d->header->frameID(); return ByteVector(); } unsigned int Frame::size() const { if(d->header) return d->header->frameSize(); return 0; } void Frame::setData(const ByteVector &data) { parse(data); } void Frame::setText(const String &) { } ByteVector Frame::render() const { ByteVector fieldData = renderFields(); d->header->setFrameSize(fieldData.size()); ByteVector headerData = d->header->render(); return headerData + fieldData; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// Frame::Frame(const ByteVector &data) : d(new FramePrivate()) { d->header = new Header(data); } Frame::Frame(Header *h) : d(new FramePrivate()) { d->header = h; } Frame::Header *Frame::header() const { return d->header; } void Frame::setHeader(Header *h, bool deleteCurrent) { if(deleteCurrent) delete d->header; d->header = h; } void Frame::parse(const ByteVector &data) { if(d->header) d->header->setData(data); else d->header = new Header(data); parseFields(fieldData(data)); } ByteVector Frame::fieldData(const ByteVector &frameData) const { unsigned int headerSize = Header::size(d->header->version()); unsigned int frameDataOffset = headerSize; unsigned int frameDataLength = size(); if(d->header->compression() || d->header->dataLengthIndicator()) { frameDataLength = SynchData::toUInt(frameData.mid(headerSize, 4)); frameDataOffset += 4; } if(zlib::isAvailable() && d->header->compression() && !d->header->encryption()) { if(frameData.size() <= frameDataOffset) { debug("Compressed frame doesn't have enough data to decode"); return ByteVector(); } const ByteVector outData = zlib::decompress(frameData.mid(frameDataOffset)); if(!outData.isEmpty() && frameDataLength != outData.size()) { debug("frameDataLength does not match the data length returned by zlib"); } return outData; } return frameData.mid(frameDataOffset, frameDataLength); } String Frame::readStringField(const ByteVector &data, String::Type encoding, int *position) { int start = 0; if(!position) position = &start; ByteVector delimiter = textDelimiter(encoding); int end = data.find(delimiter, *position, delimiter.size()); if(end < *position) return String(); String str; if(encoding == String::Latin1) str = Tag::latin1StringHandler()->parse(data.mid(*position, end - *position)); else str = String(data.mid(*position, end - *position), encoding); *position = end + delimiter.size(); return str; } String::Type Frame::checkEncoding(const StringList &fields, String::Type encoding) // static { return checkEncoding(fields, encoding, 4); } String::Type Frame::checkEncoding(const StringList &fields, String::Type encoding, unsigned int version) // static { if((encoding == String::UTF8 || encoding == String::UTF16BE) && version != 4) return String::UTF16; if(encoding != String::Latin1) return encoding; for(StringList::ConstIterator it = fields.begin(); it != fields.end(); ++it) { if(!(*it).isLatin1()) { if(version == 4) { debug("Frame::checkEncoding() -- Rendering using UTF8."); return String::UTF8; } debug("Frame::checkEncoding() -- Rendering using UTF16."); return String::UTF16; } } return String::Latin1; } String::Type Frame::checkTextEncoding(const StringList &fields, String::Type encoding) const { return checkEncoding(fields, encoding, header()->version()); } namespace { const std::pair<const char *, const char *> frameTranslation[] = { // Text information frames std::make_pair("TALB", "ALBUM"), std::make_pair("TBPM", "BPM"), std::make_pair("TCOM", "COMPOSER"), std::make_pair("TCON", "GENRE"), std::make_pair("TCOP", "COPYRIGHT"), std::make_pair("TDEN", "ENCODINGTIME"), std::make_pair("TDLY", "PLAYLISTDELAY"), std::make_pair("TDOR", "ORIGINALDATE"), std::make_pair("TDRC", "DATE"), // std::make_pair("TRDA", "DATE"), // id3 v2.3, replaced by TDRC in v2.4 // std::make_pair("TDAT", "DATE"), // id3 v2.3, replaced by TDRC in v2.4 // std::make_pair("TYER", "DATE"), // id3 v2.3, replaced by TDRC in v2.4 // std::make_pair("TIME", "DATE"), // id3 v2.3, replaced by TDRC in v2.4 std::make_pair("TDRL", "RELEASEDATE"), std::make_pair("TDTG", "TAGGINGDATE"), std::make_pair("TENC", "ENCODEDBY"), std::make_pair("TEXT", "LYRICIST"), std::make_pair("TFLT", "FILETYPE"), //std::make_pair("TIPL", "INVOLVEDPEOPLE"), handled separately std::make_pair("TIT1", "WORK"), // 'Work' in iTunes std::make_pair("TIT2", "TITLE"), std::make_pair("TIT3", "SUBTITLE"), std::make_pair("TKEY", "INITIALKEY"), std::make_pair("TLAN", "LANGUAGE"), std::make_pair("TLEN", "LENGTH"), //std::make_pair("TMCL", "MUSICIANCREDITS"), handled separately std::make_pair("TMED", "MEDIA"), std::make_pair("TMOO", "MOOD"), std::make_pair("TOAL", "ORIGINALALBUM"), std::make_pair("TOFN", "ORIGINALFILENAME"), std::make_pair("TOLY", "ORIGINALLYRICIST"), std::make_pair("TOPE", "ORIGINALARTIST"), std::make_pair("TOWN", "OWNER"), std::make_pair("TPE1", "ARTIST"), std::make_pair("TPE2", "ALBUMARTIST"), // id3's spec says 'PERFORMER', but most programs use 'ALBUMARTIST' std::make_pair("TPE3", "CONDUCTOR"), std::make_pair("TPE4", "REMIXER"), // could also be ARRANGER std::make_pair("TPOS", "DISCNUMBER"), std::make_pair("TPRO", "PRODUCEDNOTICE"), std::make_pair("TPUB", "LABEL"), std::make_pair("TRCK", "TRACKNUMBER"), std::make_pair("TRSN", "RADIOSTATION"), std::make_pair("TRSO", "RADIOSTATIONOWNER"), std::make_pair("TSOA", "ALBUMSORT"), std::make_pair("TSOC", "COMPOSERSORT"), std::make_pair("TSOP", "ARTISTSORT"), std::make_pair("TSOT", "TITLESORT"), std::make_pair("TSO2", "ALBUMARTISTSORT"), // non-standard, used by iTunes std::make_pair("TSRC", "ISRC"), std::make_pair("TSSE", "ENCODING"), std::make_pair("TSST", "DISCSUBTITLE"), // URL frames std::make_pair("WCOP", "COPYRIGHTURL"), std::make_pair("WOAF", "FILEWEBPAGE"), std::make_pair("WOAR", "ARTISTWEBPAGE"), std::make_pair("WOAS", "AUDIOSOURCEWEBPAGE"), std::make_pair("WORS", "RADIOSTATIONWEBPAGE"), std::make_pair("WPAY", "PAYMENTWEBPAGE"), std::make_pair("WPUB", "PUBLISHERWEBPAGE"), //std::make_pair("WXXX", "URL"), handled specially // Other frames std::make_pair("COMM", "COMMENT"), //std::make_pair("USLT", "LYRICS"), handled specially // Apple iTunes proprietary frames std::make_pair("PCST", "PODCAST"), std::make_pair("TCAT", "PODCASTCATEGORY"), std::make_pair("TDES", "PODCASTDESC"), std::make_pair("TGID", "PODCASTID"), std::make_pair("WFED", "PODCASTURL"), std::make_pair("MVNM", "MOVEMENTNAME"), std::make_pair("MVIN", "MOVEMENTNUMBER"), std::make_pair("GRP1", "GROUPING"), std::make_pair("TCMP", "COMPILATION"), }; const size_t frameTranslationSize = sizeof(frameTranslation) / sizeof(frameTranslation[0]); const std::pair<const char *, const char *> txxxFrameTranslation[] = { std::make_pair("MUSICBRAINZ ALBUM ID", "MUSICBRAINZ_ALBUMID"), std::make_pair("MUSICBRAINZ ARTIST ID", "MUSICBRAINZ_ARTISTID"), std::make_pair("MUSICBRAINZ ALBUM ARTIST ID", "MUSICBRAINZ_ALBUMARTISTID"), std::make_pair("MUSICBRAINZ ALBUM RELEASE COUNTRY", "RELEASECOUNTRY"), std::make_pair("MUSICBRAINZ ALBUM STATUS", "RELEASESTATUS"), std::make_pair("MUSICBRAINZ ALBUM TYPE", "RELEASETYPE"), std::make_pair("MUSICBRAINZ RELEASE GROUP ID", "MUSICBRAINZ_RELEASEGROUPID"), std::make_pair("MUSICBRAINZ RELEASE TRACK ID", "MUSICBRAINZ_RELEASETRACKID"), std::make_pair("MUSICBRAINZ WORK ID", "MUSICBRAINZ_WORKID"), std::make_pair("ACOUSTID ID", "ACOUSTID_ID"), std::make_pair("ACOUSTID FINGERPRINT", "ACOUSTID_FINGERPRINT"), std::make_pair("MUSICIP PUID", "MUSICIP_PUID"), }; const size_t txxxFrameTranslationSize = sizeof(txxxFrameTranslation) / sizeof(txxxFrameTranslation[0]); // list of deprecated frames and their successors const std::pair<const char *, const char *> deprecatedFrames[] = { std::make_pair("TRDA", "TDRC"), // 2.3 -> 2.4 (http://en.wikipedia.org/wiki/ID3) std::make_pair("TDAT", "TDRC"), // 2.3 -> 2.4 std::make_pair("TYER", "TDRC"), // 2.3 -> 2.4 std::make_pair("TIME", "TDRC"), // 2.3 -> 2.4 }; const size_t deprecatedFramesSize = sizeof(deprecatedFrames) / sizeof(deprecatedFrames[0]); } // namespace String Frame::frameIDToKey(const ByteVector &id) { ByteVector id24 = id; for(size_t i = 0; i < deprecatedFramesSize; ++i) { if(id24 == deprecatedFrames[i].first) { id24 = deprecatedFrames[i].second; break; } } for(size_t i = 0; i < frameTranslationSize; ++i) { if(id24 == frameTranslation[i].first) return frameTranslation[i].second; } return String(); } ByteVector Frame::keyToFrameID(const String &s) { const String key = s.upper(); for(size_t i = 0; i < frameTranslationSize; ++i) { if(key == frameTranslation[i].second) return frameTranslation[i].first; } return ByteVector(); } String Frame::txxxToKey(const String &description) { const String d = description.upper(); for(size_t i = 0; i < txxxFrameTranslationSize; ++i) { if(d == txxxFrameTranslation[i].first) return txxxFrameTranslation[i].second; } return d; } String Frame::keyToTXXX(const String &s) { const String key = s.upper(); for(size_t i = 0; i < txxxFrameTranslationSize; ++i) { if(key == txxxFrameTranslation[i].second) return txxxFrameTranslation[i].first; } return s; } PropertyMap Frame::asProperties() const { if(dynamic_cast< const UnknownFrame *>(this)) { PropertyMap m; m.unsupportedData().append("UNKNOWN/" + frameID()); return m; } const ByteVector &id = frameID(); // workaround until this function is virtual if(id == "TXXX") return dynamic_cast< const UserTextIdentificationFrame* >(this)->asProperties(); // Apple proprietary WFED (Podcast URL), MVNM (Movement Name), MVIN (Movement Number), GRP1 (Grouping) are in fact text frames. if(id[0] == 'T' || id == "WFED" || id == "MVNM" || id == "MVIN" || id == "GRP1") return dynamic_cast< const TextIdentificationFrame* >(this)->asProperties(); if(id == "WXXX") return dynamic_cast< const UserUrlLinkFrame* >(this)->asProperties(); if(id[0] == 'W') return dynamic_cast< const UrlLinkFrame* >(this)->asProperties(); if(id == "COMM") return dynamic_cast< const CommentsFrame* >(this)->asProperties(); if(id == "USLT") return dynamic_cast< const UnsynchronizedLyricsFrame* >(this)->asProperties(); if(id == "UFID") return dynamic_cast< const UniqueFileIdentifierFrame* >(this)->asProperties(); if(id == "PCST") return dynamic_cast< const PodcastFrame* >(this)->asProperties(); PropertyMap m; m.unsupportedData().append(id); return m; } void Frame::splitProperties(const PropertyMap &original, PropertyMap &singleFrameProperties, PropertyMap &tiplProperties, PropertyMap &tmclProperties) { singleFrameProperties.clear(); tiplProperties.clear(); tmclProperties.clear(); for(PropertyMap::ConstIterator it = original.begin(); it != original.end(); ++it) { if(TextIdentificationFrame::involvedPeopleMap().contains(it->first)) tiplProperties.insert(it->first, it->second); else if(it->first.startsWith(TextIdentificationFrame::instrumentPrefix)) tmclProperties.insert(it->first, it->second); else singleFrameProperties.insert(it->first, it->second); } } //////////////////////////////////////////////////////////////////////////////// // Frame::Header class //////////////////////////////////////////////////////////////////////////////// class Frame::Header::HeaderPrivate { public: HeaderPrivate() : frameSize(0), version(4), tagAlterPreservation(false), fileAlterPreservation(false), readOnly(false), groupingIdentity(false), compression(false), encryption(false), unsynchronisation(false), dataLengthIndicator(false) {} ByteVector frameID; unsigned int frameSize; unsigned int version; // flags bool tagAlterPreservation; bool fileAlterPreservation; bool readOnly; bool groupingIdentity; bool compression; bool encryption; bool unsynchronisation; bool dataLengthIndicator; }; //////////////////////////////////////////////////////////////////////////////// // static members (Frame::Header) //////////////////////////////////////////////////////////////////////////////// unsigned int Frame::Header::size() { return size(4); } unsigned int Frame::Header::size(unsigned int version) { switch(version) { case 0: case 1: case 2: return 6; case 3: case 4: default: return 10; } } //////////////////////////////////////////////////////////////////////////////// // public members (Frame::Header) //////////////////////////////////////////////////////////////////////////////// Frame::Header::Header(const ByteVector &data, bool synchSafeInts) : d(new HeaderPrivate()) { setData(data, synchSafeInts); } Frame::Header::Header(const ByteVector &data, unsigned int version) : d(new HeaderPrivate()) { setData(data, version); } Frame::Header::~Header() { delete d; } void Frame::Header::setData(const ByteVector &data, bool synchSafeInts) { setData(data, static_cast<unsigned int>(synchSafeInts ? 4 : 3)); } void Frame::Header::setData(const ByteVector &data, unsigned int version) { d->version = version; switch(version) { case 0: case 1: case 2: { // ID3v2.2 if(data.size() < 3) { debug("You must at least specify a frame ID."); return; } // Set the frame ID -- the first three bytes d->frameID = data.mid(0, 3); // If the full header information was not passed in, do not continue to the // steps to parse the frame size and flags. if(data.size() < 6) { d->frameSize = 0; return; } d->frameSize = data.toUInt(3, 3, true); break; } case 3: { // ID3v2.3 if(data.size() < 4) { debug("You must at least specify a frame ID."); return; } // Set the frame ID -- the first four bytes d->frameID = data.mid(0, 4); // If the full header information was not passed in, do not continue to the // steps to parse the frame size and flags. if(data.size() < 10) { d->frameSize = 0; return; } // Set the size -- the frame size is the four bytes starting at byte four in // the frame header (structure 4) d->frameSize = data.toUInt(4U); { // read the first byte of flags std::bitset<8> flags(data[8]); d->tagAlterPreservation = flags[7]; // (structure 3.3.1.a) d->fileAlterPreservation = flags[6]; // (structure 3.3.1.b) d->readOnly = flags[5]; // (structure 3.3.1.c) } { // read the second byte of flags std::bitset<8> flags(data[9]); d->compression = flags[7]; // (structure 3.3.1.i) d->encryption = flags[6]; // (structure 3.3.1.j) d->groupingIdentity = flags[5]; // (structure 3.3.1.k) } break; } case 4: default: { // ID3v2.4 if(data.size() < 4) { debug("You must at least specify a frame ID."); return; } // Set the frame ID -- the first four bytes d->frameID = data.mid(0, 4); // If the full header information was not passed in, do not continue to the // steps to parse the frame size and flags. if(data.size() < 10) { d->frameSize = 0; return; } // Set the size -- the frame size is the four bytes starting at byte four in // the frame header (structure 4) d->frameSize = SynchData::toUInt(data.mid(4, 4)); #ifndef NO_ITUNES_HACKS // iTunes writes v2.4 tags with v2.3-like frame sizes if(d->frameSize > 127) { if(!isValidFrameID(data.mid(d->frameSize + 10, 4))) { unsigned int uintSize = data.toUInt(4U); if(isValidFrameID(data.mid(uintSize + 10, 4))) { d->frameSize = uintSize; } } } #endif { // read the first byte of flags std::bitset<8> flags(data[8]); d->tagAlterPreservation = flags[6]; // (structure 4.1.1.a) d->fileAlterPreservation = flags[5]; // (structure 4.1.1.b) d->readOnly = flags[4]; // (structure 4.1.1.c) } { // read the second byte of flags std::bitset<8> flags(data[9]); d->groupingIdentity = flags[6]; // (structure 4.1.2.h) d->compression = flags[3]; // (structure 4.1.2.k) d->encryption = flags[2]; // (structure 4.1.2.m) d->unsynchronisation = flags[1]; // (structure 4.1.2.n) d->dataLengthIndicator = flags[0]; // (structure 4.1.2.p) } break; } } } ByteVector Frame::Header::frameID() const { return d->frameID; } void Frame::Header::setFrameID(const ByteVector &id) { d->frameID = id.mid(0, 4); } unsigned int Frame::Header::frameSize() const { return d->frameSize; } void Frame::Header::setFrameSize(unsigned int size) { d->frameSize = size; } unsigned int Frame::Header::version() const { return d->version; } void Frame::Header::setVersion(unsigned int version) { d->version = version; } bool Frame::Header::tagAlterPreservation() const { return d->tagAlterPreservation; } void Frame::Header::setTagAlterPreservation(bool preserve) { d->tagAlterPreservation = preserve; } bool Frame::Header::fileAlterPreservation() const { return d->fileAlterPreservation; } bool Frame::Header::readOnly() const { return d->readOnly; } bool Frame::Header::groupingIdentity() const { return d->groupingIdentity; } bool Frame::Header::compression() const { return d->compression; } bool Frame::Header::encryption() const { return d->encryption; } bool Frame::Header::unsycronisation() const { return unsynchronisation(); } bool Frame::Header::unsynchronisation() const { return d->unsynchronisation; } bool Frame::Header::dataLengthIndicator() const { return d->dataLengthIndicator; } ByteVector Frame::Header::render() const { ByteVector flags(2, static_cast<char>(0)); // just blank for the moment ByteVector v = d->frameID + (d->version == 3 ? ByteVector::fromUInt(d->frameSize) : SynchData::fromUInt(d->frameSize)) + flags; return v; } bool Frame::Header::frameAlterPreservation() const { return fileAlterPreservation(); } ����������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2frame.h��������������������������������������������������������0000664�0000000�0000000�00000045240�14447736377�0020326�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ID3V2FRAME_H #define TAGLIB_ID3V2FRAME_H #include "tstring.h" #include "tbytevector.h" #include "taglib_export.h" namespace TagLib { class StringList; class PropertyMap; namespace ID3v2 { class Tag; class FrameFactory; //! ID3v2 frame implementation /*! * This class is the main ID3v2 frame implementation. In ID3v2, a tag is * split between a collection of frames (which are in turn split into fields * (Structure, <a href="id3v2-structure.html#4">4</a>) * (<a href="id3v2-frames.html">Frames</a>). This class provides an API for * gathering information about and modifying ID3v2 frames. Functionality * specific to a given frame type is handed in one of the many subclasses. */ class TAGLIB_EXPORT Frame { friend class Tag; friend class FrameFactory; friend class TableOfContentsFrame; friend class ChapterFrame; public: /*! * Creates a textual frame which corresponds to a single key in the PropertyMap * interface. These are all (User)TextIdentificationFrames except TIPL and TMCL, * all (User)URLLinkFrames, CommentsFrames, and UnsynchronizedLyricsFrame. */ static Frame *createTextualFrame(const String &key, const StringList &values); /*! * Destroys this Frame instance. */ virtual ~Frame(); /*! * Returns the Frame ID (Structure, <a href="id3v2-structure.html#4">4</a>) * (Frames, <a href="id3v2-frames.html#4">4</a>) */ ByteVector frameID() const; /*! * Returns the size of the frame. */ unsigned int size() const; /*! * Returns the size of the frame header * * \deprecated This is only accurate for ID3v2.3 or ID3v2.4. Please use * the call below which accepts an ID3v2 version number. In the next * non-binary compatible release this will be made into a non-static * member that checks the internal ID3v2 version. */ static unsigned int headerSize(); // BIC: make non-static /*! * Returns the size of the frame header for the given ID3v2 version. * * \deprecated Please see the explanation above. */ // BIC: remove static unsigned int headerSize(unsigned int version); /*! * Sets the data that will be used as the frame. Since the length is not * known before the frame has been parsed, this should just be a pointer to * the first byte of the frame. It will determine the length internally * and make that available through size(). */ void setData(const ByteVector &data); /*! * Set the text of frame in the sanest way possible. This should only be * reimplemented in frames where there is some logical mapping to text. * * \note If the frame type supports multiple text encodings, this will not * change the text encoding of the frame; the string will be converted to * that frame's encoding. Please use the specific APIs of the frame types * to set the encoding if that is desired. */ virtual void setText(const String &text); /*! * This returns the textual representation of the data in the frame. * Subclasses must reimplement this method to provide a string * representation of the frame's data. */ virtual String toString() const = 0; /*! * Render the frame back to its binary format in a ByteVector. */ ByteVector render() const; /*! * Returns the text delimiter that is used between fields for the string * type \a t. */ static ByteVector textDelimiter(String::Type t); /*! * The string with which an instrument name is prefixed to build a key in a PropertyMap; * used to translate PropertyMaps to TMCL frames. In the current implementation, this * is "PERFORMER:". */ static const String instrumentPrefix; /*! * The PropertyMap key prefix which triggers the use of a COMM frame instead of a TXXX * frame for a non-standard key. In the current implementation, this is "COMMENT:". */ static const String commentPrefix; /*! * The PropertyMap key prefix which triggers the use of a USLT frame instead of a TXXX * frame for a non-standard key. In the current implementation, this is "LYRICS:". */ static const String lyricsPrefix; /*! * The PropertyMap key prefix which triggers the use of a WXXX frame instead of a TXX * frame for a non-standard key. In the current implementation, this is "URL:". */ static const String urlPrefix; protected: class Header; /*! * Constructs an ID3v2 frame using \a data to read the header information. * All other processing of \a data should be handled in a subclass. * * \note This need not contain anything more than a frame ID, but * \e must contain at least that. */ explicit Frame(const ByteVector &data); /*! * This creates an Frame using the header \a h. * * The ownership of this header will be assigned to the frame and the * header will be deleted when the frame is destroyed. */ Frame(Header *h); /*! * Returns a pointer to the frame header. */ Header *header() const; /*! * Sets the header to \a h. If \a deleteCurrent is true, this will free * the memory of the current header. * * The ownership of this header will be assigned to the frame and the * header will be deleted when the frame is destroyed. */ void setHeader(Header *h, bool deleteCurrent = true); /*! * Called by setData() to parse the frame data. It makes this information * available through the public API. */ void parse(const ByteVector &data); /*! * Called by parse() to parse the field data. It makes this information * available through the public API. This must be overridden by the * subclasses. */ virtual void parseFields(const ByteVector &data) = 0; /*! * Render the field data back to a binary format in a ByteVector. This * must be overridden by subclasses. */ virtual ByteVector renderFields() const = 0; /*! * Returns a ByteVector containing the field data given the frame data. * This correctly adjusts for the header size plus any additional frame * data that's specified in the frame header flags. */ ByteVector fieldData(const ByteVector &frameData) const; /*! * Reads a String of type \a encoding from the ByteVector \a data. If \a * position is passed in it is used both as the starting point and is * updated to return the position just after the string that has been read. * This is useful for reading strings sequentially. */ String readStringField(const ByteVector &data, String::Type encoding, int *position = 0); /*! * Checks a the list of string values to see if they can be used with the * specified encoding and returns the recommended encoding. */ // BIC: remove and make non-static static String::Type checkEncoding(const StringList &fields, String::Type encoding); /*! * Checks a the list of string values to see if they can be used with the * specified encoding and returns the recommended encoding. This method * also checks the ID3v2 version and makes sure the encoding can be used * in the specified version. */ // BIC: remove and make non-static static String::Type checkEncoding(const StringList &fields, String::Type encoding, unsigned int version); /*! * Checks a the list of string values to see if they can be used with the * specified encoding and returns the recommended encoding. This method * also checks the ID3v2 version and makes sure the encoding can be used * in the version specified by the frame's header. */ String::Type checkTextEncoding(const StringList &fields, String::Type encoding) const; /*! * Parses the contents of this frame as PropertyMap. If that fails, the returned * PropertyMap will be empty, and its unsupportedData() will contain this frame's * ID. * BIC: Will be a virtual function in future releases. */ PropertyMap asProperties() const; /*! * Returns an appropriate ID3 frame ID for the given free-form tag key. This method * will return an empty ByteVector if no specialized translation is found. */ static ByteVector keyToFrameID(const String &); /*! * Returns a free-form tag name for the given ID3 frame ID. Note that this does not work * for general frame IDs such as TXXX or WXXX; in such a case an empty string is returned. */ static String frameIDToKey(const ByteVector &); /*! * Returns an appropriate TXXX frame description for the given free-form tag key. */ static String keyToTXXX(const String &); /*! * Returns a free-form tag name for the given ID3 frame description. */ static String txxxToKey(const String &); /*! * This helper function splits the PropertyMap \a original into three ProperytMaps * \a singleFrameProperties, \a tiplProperties, and \a tmclProperties, such that: * - \a singleFrameProperties contains only of keys which can be represented with * exactly one ID3 frame per key. In the current implementation * this is everything except for the fixed "involved people" keys and keys of the * form "TextIdentificationFrame::instrumentPrefix" + "instrument", which are * mapped to a TMCL frame. * - \a tiplProperties will consist of those keys that are present in * TextIdentificationFrame::involvedPeopleMap() * - \a tmclProperties contains the "musician credits" keys which should be mapped * to a TMCL frame */ static void splitProperties(const PropertyMap &original, PropertyMap &singleFrameProperties, PropertyMap &tiplProperties, PropertyMap &tmclProperties); private: Frame(const Frame &); Frame &operator=(const Frame &); class FramePrivate; friend class FramePrivate; FramePrivate *d; }; //! ID3v2 frame header implementation /*! * The ID3v2 Frame Header (Structure, <a href="id3v2-structure.html#4">4</a>) * * Every ID3v2::Frame has an associated header that gives some general * properties of the frame and also makes it possible to identify the frame * type. * * As such when reading an ID3v2 tag ID3v2::FrameFactory first creates the * frame headers and then creates the appropriate Frame subclass based on * the type and attaches the header. */ class TAGLIB_EXPORT Frame::Header { public: /*! * Construct a Frame Header based on \a data. \a data must at least * contain a 4 byte frame ID, and optionally can contain flag data and the * frame size. i.e. Just the frame id -- "TALB" -- is a valid value. * * \deprecated Please use the constructor below that accepts a version * number. */ TAGLIB_DEPRECATED Header(const ByteVector &data, bool synchSafeInts); /*! * Construct a Frame Header based on \a data. \a data must at least * contain a 4 byte frame ID, and optionally can contain flag data and the * frame size. i.e. Just the frame id -- "TALB" -- is a valid value. * * \a version should be the ID3v2 version of the tag. */ explicit Header(const ByteVector &data, unsigned int version = 4); /*! * Destroys this Header instance. */ virtual ~Header(); /*! * Sets the data for the Header. * * \deprecated Please use the version below that accepts an ID3v2 version * number. */ TAGLIB_DEPRECATED void setData(const ByteVector &data, bool synchSafeInts); /*! * Sets the data for the Header. \a version should indicate the ID3v2 * version number of the tag that this frame is contained in. */ void setData(const ByteVector &data, unsigned int version = 4); /*! * Returns the Frame ID (Structure, <a href="id3v2-structure.html#4">4</a>) * (Frames, <a href="id3v2-frames.html#4">4</a>) */ ByteVector frameID() const; /*! * Sets the frame's ID to \a id. Only the first four bytes of \a id will * be used. * * \warning This method should in general be avoided. It exists simply to * provide a mechanism for transforming frames from a deprecated frame type * to a newer one -- i.e. TYER to TDRC from ID3v2.3 to ID3v2.4. */ void setFrameID(const ByteVector &id); /*! * Returns the size of the frame data portion, as set when setData() was * called or set explicitly via setFrameSize(). */ unsigned int frameSize() const; /*! * Sets the size of the frame data portion. */ void setFrameSize(unsigned int size); /*! * Returns the ID3v2 version of the header, as passed in from the * construction of the header or set via setVersion(). */ unsigned int version() const; /*! * Sets the ID3v2 version of the header, changing has impact on the * correct parsing/rendering of frame data. */ void setVersion(unsigned int version); /*! * Returns the size of the frame header in bytes. * * \deprecated Please use the version of this method that accepts a * version. This is only accurate for ID3v2.3 and ID3v2.4. This will be * removed in the next binary incompatible release (2.0) and will be * replaced with a non-static method that checks the frame version. */ // BIC: make non-static static unsigned int size(); /*! * Returns the size of the frame header in bytes for the ID3v2 version * that's given. * * \deprecated Please see the explanation in the version above. */ // BIC: remove static unsigned int size(unsigned int version); /*! * Returns true if the flag for tag alter preservation is set. * * The semantics are a little backwards from what would seem natural * (setting the preservation flag to throw away the frame), but this * follows the ID3v2 standard. * * \see setTagAlterPreservation() */ bool tagAlterPreservation() const; /*! * Sets the flag for preservation of this frame if the tag is set. If * this is set to true the frame will not be written when the tag is * saved. * * The semantics are a little backwards from what would seem natural * (setting the preservation flag to throw away the frame), but this * follows the ID3v2 standard. * * \see tagAlterPreservation() */ void setTagAlterPreservation(bool discard); /*! * Returns true if the flag for file alter preservation is set. * * \note This flag is currently ignored internally in TagLib. */ bool fileAlterPreservation() const; /*! * Returns true if the frame is meant to be read only. * * \note This flag is currently ignored internally in TagLib. */ bool readOnly() const; /*! * Returns true if the flag for the grouping identity is set. * * \note This flag is currently ignored internally in TagLib. */ bool groupingIdentity() const; /*! * Returns true if compression is enabled for this frame. * * \note This flag is currently ignored internally in TagLib. */ bool compression() const; /*! * Returns true if encryption is enabled for this frame. * * \note This flag is currently ignored internally in TagLib. */ bool encryption() const; #ifndef DO_NOT_DOCUMENT bool unsycronisation() const; #endif /*! * Returns true if unsynchronisation is enabled for this frame. */ bool unsynchronisation() const; /*! * Returns true if the flag for a data length indicator is set. */ bool dataLengthIndicator() const; /*! * Render the Header back to binary format in a ByteVector. */ ByteVector render() const; /*! * \deprecated Use fileAlterPreservation(). */ TAGLIB_DEPRECATED bool frameAlterPreservation() const; private: Header(const Header &); Header &operator=(const Header &); class HeaderPrivate; HeaderPrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2framefactory.cpp�����������������������������������������������0000664�0000000�0000000�00000040525�14447736377�0022252�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tzlib.h> #include "id3v2framefactory.h" #include "id3v2synchdata.h" #include "id3v1genres.h" #include "frames/attachedpictureframe.h" #include "frames/commentsframe.h" #include "frames/relativevolumeframe.h" #include "frames/textidentificationframe.h" #include "frames/uniquefileidentifierframe.h" #include "frames/unknownframe.h" #include "frames/generalencapsulatedobjectframe.h" #include "frames/urllinkframe.h" #include "frames/unsynchronizedlyricsframe.h" #include "frames/popularimeterframe.h" #include "frames/privateframe.h" #include "frames/ownershipframe.h" #include "frames/synchronizedlyricsframe.h" #include "frames/eventtimingcodesframe.h" #include "frames/chapterframe.h" #include "frames/tableofcontentsframe.h" #include "frames/podcastframe.h" using namespace TagLib; using namespace ID3v2; namespace { void updateGenre(TextIdentificationFrame *frame) { StringList fields = frame->fieldList(); StringList newfields; for(StringList::ConstIterator it = fields.begin(); it != fields.end(); ++it) { String s = *it; int offset = 0; int end = 0; while(s.length() > offset && s[offset] == '(' && (end = s.find(")", offset + 1)) > offset) { // "(12)Genre" const String genreCode = s.substr(offset + 1, end - 1); s = s.substr(end + 1); bool ok; int number = genreCode.toInt(&ok); if((ok && number >= 0 && number <= 255 && !(ID3v1::genre(number) == s)) || genreCode == "RX" || genreCode == "CR") newfields.append(genreCode); } if(!s.isEmpty()) // "Genre" or "12" newfields.append(s); } if(newfields.isEmpty()) fields.append(String()); frame->setText(newfields); } } // namespace class FrameFactory::FrameFactoryPrivate { public: FrameFactoryPrivate() : defaultEncoding(String::Latin1), useDefaultEncoding(false) {} String::Type defaultEncoding; bool useDefaultEncoding; template <class T> void setTextEncoding(T *frame) { if(useDefaultEncoding) frame->setTextEncoding(defaultEncoding); } }; FrameFactory FrameFactory::factory; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// FrameFactory *FrameFactory::instance() { return &factory; } Frame *FrameFactory::createFrame(const ByteVector &data, bool synchSafeInts) const { return createFrame(data, static_cast<unsigned int>(synchSafeInts ? 4 : 3)); } Frame *FrameFactory::createFrame(const ByteVector &data, unsigned int version) const { Header tagHeader; tagHeader.setMajorVersion(version); return createFrame(data, &tagHeader); } Frame *FrameFactory::createFrame(const ByteVector &origData, Header *tagHeader) const { return createFrame(origData, const_cast<const Header *>(tagHeader)); } Frame *FrameFactory::createFrame(const ByteVector &origData, const Header *tagHeader) const { ByteVector data = origData; unsigned int version = tagHeader->majorVersion(); Frame::Header *header = new Frame::Header(data, version); ByteVector frameID = header->frameID(); // A quick sanity check -- make sure that the frameID is 4 uppercase Latin1 // characters. Also make sure that there is data in the frame. if(frameID.size() != (version < 3 ? 3 : 4) || header->frameSize() <= static_cast<unsigned int>(header->dataLengthIndicator() ? 4 : 0) || header->frameSize() > data.size()) { delete header; return 0; } #ifndef NO_ITUNES_HACKS if(version == 3 && frameID.size() == 4 && frameID[3] == '\0') { // iTunes v2.3 tags store v2.2 frames - convert now frameID = frameID.mid(0, 3); header->setFrameID(frameID); header->setVersion(2); updateFrame(header); header->setVersion(3); } #endif for(ByteVector::ConstIterator it = frameID.begin(); it != frameID.end(); it++) { if( (*it < 'A' || *it > 'Z') && (*it < '0' || *it > '9') ) { delete header; return 0; } } if(version > 3 && (tagHeader->unsynchronisation() || header->unsynchronisation())) { // Data lengths are not part of the encoded data, but since they are synch-safe // integers they will be never actually encoded. ByteVector frameData = data.mid(Frame::Header::size(version), header->frameSize()); frameData = SynchData::decode(frameData); data = data.mid(0, Frame::Header::size(version)) + frameData; } // TagLib doesn't mess with encrypted frames, so just treat them // as unknown frames. if(!zlib::isAvailable() && header->compression()) { debug("Compressed frames are currently not supported."); return new UnknownFrame(data, header); } if(header->encryption()) { debug("Encrypted frames are currently not supported."); return new UnknownFrame(data, header); } if(!updateFrame(header)) { header->setTagAlterPreservation(true); return new UnknownFrame(data, header); } // updateFrame() might have updated the frame ID. frameID = header->frameID(); // This is where things get necissarily nasty. Here we determine which // Frame subclass (or if none is found simply an Frame) based // on the frame ID. Since there are a lot of possibilities, that means // a lot of if blocks. // Text Identification (frames 4.2) // Apple proprietary WFED (Podcast URL), MVNM (Movement Name), MVIN (Movement Number), GRP1 (Grouping) are in fact text frames. if(frameID.startsWith("T") || frameID == "WFED" || frameID == "MVNM" || frameID == "MVIN" || frameID == "GRP1") { TextIdentificationFrame *f = frameID != "TXXX" ? new TextIdentificationFrame(data, header) : new UserTextIdentificationFrame(data, header); d->setTextEncoding(f); if(frameID == "TCON") updateGenre(f); return f; } // Comments (frames 4.10) if(frameID == "COMM") { CommentsFrame *f = new CommentsFrame(data, header); d->setTextEncoding(f); return f; } // Attached Picture (frames 4.14) if(frameID == "APIC") { AttachedPictureFrame *f = new AttachedPictureFrame(data, header); d->setTextEncoding(f); return f; } // ID3v2.2 Attached Picture if(frameID == "PIC") { AttachedPictureFrame *f = new AttachedPictureFrameV22(data, header); d->setTextEncoding(f); return f; } // Relative Volume Adjustment (frames 4.11) if(frameID == "RVA2") return new RelativeVolumeFrame(data, header); // Unique File Identifier (frames 4.1) if(frameID == "UFID") return new UniqueFileIdentifierFrame(data, header); // General Encapsulated Object (frames 4.15) if(frameID == "GEOB") { GeneralEncapsulatedObjectFrame *f = new GeneralEncapsulatedObjectFrame(data, header); d->setTextEncoding(f); return f; } // URL link (frames 4.3) if(frameID.startsWith("W")) { if(frameID != "WXXX") { return new UrlLinkFrame(data, header); } UserUrlLinkFrame *f = new UserUrlLinkFrame(data, header); d->setTextEncoding(f); return f; } // Unsynchronized lyric/text transcription (frames 4.8) if(frameID == "USLT") { UnsynchronizedLyricsFrame *f = new UnsynchronizedLyricsFrame(data, header); if(d->useDefaultEncoding) f->setTextEncoding(d->defaultEncoding); return f; } // Synchronized lyrics/text (frames 4.9) if(frameID == "SYLT") { SynchronizedLyricsFrame *f = new SynchronizedLyricsFrame(data, header); if(d->useDefaultEncoding) f->setTextEncoding(d->defaultEncoding); return f; } // Event timing codes (frames 4.5) if(frameID == "ETCO") return new EventTimingCodesFrame(data, header); // Popularimeter (frames 4.17) if(frameID == "POPM") return new PopularimeterFrame(data, header); // Private (frames 4.27) if(frameID == "PRIV") return new PrivateFrame(data, header); // Ownership (frames 4.22) if(frameID == "OWNE") { OwnershipFrame *f = new OwnershipFrame(data, header); d->setTextEncoding(f); return f; } // Chapter (ID3v2 chapters 1.0) if(frameID == "CHAP") return new ChapterFrame(tagHeader, data, header); // Table of contents (ID3v2 chapters 1.0) if(frameID == "CTOC") return new TableOfContentsFrame(tagHeader, data, header); // Apple proprietary PCST (Podcast) if(frameID == "PCST") return new PodcastFrame(data, header); return new UnknownFrame(data, header); } void FrameFactory::rebuildAggregateFrames(ID3v2::Tag *tag) const { if(tag->header()->majorVersion() < 4 && tag->frameList("TDRC").size() == 1 && tag->frameList("TDAT").size() == 1) { TextIdentificationFrame *tdrc = dynamic_cast<TextIdentificationFrame *>(tag->frameList("TDRC").front()); UnknownFrame *tdat = dynamic_cast<UnknownFrame *>(tag->frameList("TDAT").front()); if(tdrc && tdrc->fieldList().size() == 1 && tdrc->fieldList().front().size() == 4 && tdat && tdat->data().size() >= 5) { String date(tdat->data().mid(1), static_cast<String::Type>(tdat->data()[0])); if(date.length() == 4) { tdrc->setText(tdrc->toString() + '-' + date.substr(2, 2) + '-' + date.substr(0, 2)); if(tag->frameList("TIME").size() == 1) { UnknownFrame *timeframe = dynamic_cast<UnknownFrame *>(tag->frameList("TIME").front()); if(timeframe && timeframe->data().size() >= 5) { String time(timeframe->data().mid(1), static_cast<String::Type>(timeframe->data()[0])); if(time.length() == 4) { tdrc->setText(tdrc->toString() + 'T' + time.substr(0, 2) + ':' + time.substr(2, 2)); } } } } } } } String::Type FrameFactory::defaultTextEncoding() const { return d->defaultEncoding; } void FrameFactory::setDefaultTextEncoding(String::Type encoding) { d->useDefaultEncoding = true; d->defaultEncoding = encoding; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// FrameFactory::FrameFactory() : d(new FrameFactoryPrivate()) { } FrameFactory::~FrameFactory() { delete d; } namespace { // Frame conversion table ID3v2.2 -> 2.4 const std::pair<const char *, const char *> frameConversion2[] = { std::make_pair("BUF", "RBUF"), std::make_pair("CNT", "PCNT"), std::make_pair("COM", "COMM"), std::make_pair("CRA", "AENC"), std::make_pair("ETC", "ETCO"), std::make_pair("GEO", "GEOB"), std::make_pair("IPL", "TIPL"), std::make_pair("MCI", "MCDI"), std::make_pair("MLL", "MLLT"), std::make_pair("POP", "POPM"), std::make_pair("REV", "RVRB"), std::make_pair("SLT", "SYLT"), std::make_pair("STC", "SYTC"), std::make_pair("TAL", "TALB"), std::make_pair("TBP", "TBPM"), std::make_pair("TCM", "TCOM"), std::make_pair("TCO", "TCON"), std::make_pair("TCP", "TCMP"), std::make_pair("TCR", "TCOP"), std::make_pair("TDY", "TDLY"), std::make_pair("TEN", "TENC"), std::make_pair("TFT", "TFLT"), std::make_pair("TKE", "TKEY"), std::make_pair("TLA", "TLAN"), std::make_pair("TLE", "TLEN"), std::make_pair("TMT", "TMED"), std::make_pair("TOA", "TOAL"), std::make_pair("TOF", "TOFN"), std::make_pair("TOL", "TOLY"), std::make_pair("TOR", "TDOR"), std::make_pair("TOT", "TOAL"), std::make_pair("TP1", "TPE1"), std::make_pair("TP2", "TPE2"), std::make_pair("TP3", "TPE3"), std::make_pair("TP4", "TPE4"), std::make_pair("TPA", "TPOS"), std::make_pair("TPB", "TPUB"), std::make_pair("TRC", "TSRC"), std::make_pair("TRD", "TDRC"), std::make_pair("TRK", "TRCK"), std::make_pair("TS2", "TSO2"), std::make_pair("TSA", "TSOA"), std::make_pair("TSC", "TSOC"), std::make_pair("TSP", "TSOP"), std::make_pair("TSS", "TSSE"), std::make_pair("TST", "TSOT"), std::make_pair("TT1", "TIT1"), std::make_pair("TT2", "TIT2"), std::make_pair("TT3", "TIT3"), std::make_pair("TXT", "TOLY"), std::make_pair("TXX", "TXXX"), std::make_pair("TYE", "TDRC"), std::make_pair("UFI", "UFID"), std::make_pair("ULT", "USLT"), std::make_pair("WAF", "WOAF"), std::make_pair("WAR", "WOAR"), std::make_pair("WAS", "WOAS"), std::make_pair("WCM", "WCOM"), std::make_pair("WCP", "WCOP"), std::make_pair("WPB", "WPUB"), std::make_pair("WXX", "WXXX"), // Apple iTunes nonstandard frames std::make_pair("PCS", "PCST"), std::make_pair("TCT", "TCAT"), std::make_pair("TDR", "TDRL"), std::make_pair("TDS", "TDES"), std::make_pair("TID", "TGID"), std::make_pair("WFD", "WFED"), std::make_pair("MVN", "MVNM"), std::make_pair("MVI", "MVIN"), std::make_pair("GP1", "GRP1"), }; const size_t frameConversion2Size = sizeof(frameConversion2) / sizeof(frameConversion2[0]); // Frame conversion table ID3v2.3 -> 2.4 const std::pair<const char *, const char *> frameConversion3[] = { std::make_pair("TORY", "TDOR"), std::make_pair("TYER", "TDRC"), std::make_pair("IPLS", "TIPL"), }; const size_t frameConversion3Size = sizeof(frameConversion3) / sizeof(frameConversion3[0]); } // namespace bool FrameFactory::updateFrame(Frame::Header *header) const { const ByteVector frameID = header->frameID(); switch(header->version()) { case 2: // ID3v2.2 { if(frameID == "CRM" || frameID == "EQU" || frameID == "LNK" || frameID == "RVA" || frameID == "TIM" || frameID == "TSI" || frameID == "TDA") { debug("ID3v2.4 no longer supports the frame type " + String(frameID) + ". It will be discarded from the tag."); return false; } // ID3v2.2 only used 3 bytes for the frame ID, so we need to convert all of // the frames to their 4 byte ID3v2.4 equivalent. for(size_t i = 0; i < frameConversion2Size; ++i) { if(frameID == frameConversion2[i].first) { header->setFrameID(frameConversion2[i].second); break; } } break; } case 3: // ID3v2.3 { if(frameID == "EQUA" || frameID == "RVAD" || frameID == "TIME" || frameID == "TRDA" || frameID == "TSIZ" || frameID == "TDAT") { debug("ID3v2.4 no longer supports the frame type " + String(frameID) + ". It will be discarded from the tag."); return false; } for(size_t i = 0; i < frameConversion3Size; ++i) { if(frameID == frameConversion3[i].first) { header->setFrameID(frameConversion3[i].second); break; } } break; } default: // This should catch a typo that existed in TagLib up to and including // version 1.1 where TRDC was used for the year rather than TDRC. if(frameID == "TRDC") header->setFrameID("TDRC"); break; } return true; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2framefactory.h�������������������������������������������������0000664�0000000�0000000�00000015436�14447736377�0021722�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ /*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ID3V2FRAMEFACTORY_H #define TAGLIB_ID3V2FRAMEFACTORY_H #include "taglib_export.h" #include "tbytevector.h" #include "id3v2frame.h" #include "id3v2header.h" namespace TagLib { namespace ID3v2 { class TextIdentificationFrame; //! A factory for creating ID3v2 frames during parsing /*! * This factory abstracts away the frame creation process and instantiates * the appropriate ID3v2::Frame subclasses based on the contents of the * data. * * Reimplementing this factory is the key to adding support for frame types * not directly supported by TagLib to your application. To do so you would * subclass this factory and reimplement createFrame(). Then by setting your * factory to be the default factory in ID3v2::Tag constructor you can * implement behavior that will allow for new ID3v2::Frame subclasses (also * provided by you) to be used. * * This implements both <i>abstract factory</i> and <i>singleton</i> patterns * of which more information is available on the web and in software design * textbooks (Notably <i>Design Patters</i>). * * \note You do not need to use this factory to create new frames to add to * an ID3v2::Tag. You can instantiate frame subclasses directly (with new) * and add them to a tag using ID3v2::Tag::addFrame() * * \see ID3v2::Tag::addFrame() */ class TAGLIB_EXPORT FrameFactory { public: static FrameFactory *instance(); /*! * Create a frame based on \a data. \a synchSafeInts should only be set * false if we are parsing an old tag (v2.3 or older) that does not support * synchsafe ints. * * \deprecated Please use the method below that accepts a ID3v2::Header * instance in new code. */ TAGLIB_DEPRECATED Frame *createFrame(const ByteVector &data, bool synchSafeInts) const; /*! * Create a frame based on \a data. \a version should indicate the ID3v2 * version of the tag. As ID3v2.4 is the most current version of the * standard 4 is the default. * * \deprecated Please use the method below that accepts a ID3v2::Header * instance in new code. */ TAGLIB_DEPRECATED Frame *createFrame(const ByteVector &data, unsigned int version = 4) const; /*! * \deprecated Use createFrame(const ByteVector &, const Header *) const. */ // BIC: remove Frame *createFrame(const ByteVector &data, Header *tagHeader) const; /*! * Create a frame based on \a data. \a tagHeader should be a valid * ID3v2::Header instance. */ // BIC: make virtual Frame *createFrame(const ByteVector &data, const Header *tagHeader) const; /*! * After a tag has been read, this tries to rebuild some of them * information, most notably the recording date, from frames that * have been deprecated and can't be upgraded directly. */ // BIC: Make virtual void rebuildAggregateFrames(ID3v2::Tag *tag) const; /*! * Returns the default text encoding for text frames. If setTextEncoding() * has not been explicitly called this will only be used for new text * frames. However, if this value has been set explicitly all frames will be * converted to this type (unless it's explicitly set differently for the * individual frame) when being rendered. * * \see setDefaultTextEncoding() */ String::Type defaultTextEncoding() const; /*! * Set the default text encoding for all text frames that are created to * \a encoding. If no value is set the frames with either default to the * encoding type that was parsed and new frames default to Latin1. * * Valid string types for ID3v2 tags are Latin1, UTF8, UTF16 and UTF16BE. * * \see defaultTextEncoding() */ void setDefaultTextEncoding(String::Type encoding); protected: /*! * Constructs a frame factory. Because this is a singleton this method is * protected, but may be used for subclasses. */ FrameFactory(); /*! * Destroys the frame factory. */ virtual ~FrameFactory(); /*! * This method checks for compliance to the current ID3v2 standard (2.4) * and does nothing in the common case. However if a frame is found that * is not compatible with the current standard, this method either updates * the frame or indicates that it should be discarded. * * This method with return true (with or without changes to the frame) if * this frame should be kept or false if it should be discarded. * * See the id3v2.4.0-changes.txt document for further information. */ virtual bool updateFrame(Frame::Header *header) const; private: FrameFactory(const FrameFactory &); FrameFactory &operator=(const FrameFactory &); static FrameFactory factory; class FrameFactoryPrivate; FrameFactoryPrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2header.cpp�����������������������������������������������������0000664�0000000�0000000�00000014736�14447736377�0021025�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <iostream> #include <bitset> #include <tstring.h> #include <tdebug.h> #include "id3v2header.h" #include "id3v2footer.h" #include "id3v2synchdata.h" using namespace TagLib; using namespace ID3v2; class Header::HeaderPrivate { public: HeaderPrivate() : majorVersion(4), revisionNumber(0), unsynchronisation(false), extendedHeader(false), experimentalIndicator(false), footerPresent(false), tagSize(0) {} unsigned int majorVersion; unsigned int revisionNumber; bool unsynchronisation; bool extendedHeader; bool experimentalIndicator; bool footerPresent; unsigned int tagSize; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// unsigned int Header::size() { return 10; } ByteVector Header::fileIdentifier() { return ByteVector::fromCString("ID3"); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Header::Header() : d(new HeaderPrivate()) { } Header::Header(const ByteVector &data) : d(new HeaderPrivate()) { parse(data); } Header::~Header() { delete d; } unsigned int Header::majorVersion() const { return d->majorVersion; } void Header::setMajorVersion(unsigned int version) { d->majorVersion = version; } unsigned int Header::revisionNumber() const { return d->revisionNumber; } bool Header::unsynchronisation() const { return d->unsynchronisation; } bool Header::extendedHeader() const { return d->extendedHeader; } bool Header::experimentalIndicator() const { return d->experimentalIndicator; } bool Header::footerPresent() const { return d->footerPresent; } unsigned int Header::tagSize() const { return d->tagSize; } unsigned int Header::completeTagSize() const { if(d->footerPresent) return d->tagSize + size() + Footer::size(); return d->tagSize + size(); } void Header::setTagSize(unsigned int s) { d->tagSize = s; } void Header::setData(const ByteVector &data) { parse(data); } ByteVector Header::render() const { ByteVector v; // add the file identifier -- "ID3" v.append(fileIdentifier()); // add the version number -- we always render a 2.4.0 tag regardless of what // the tag originally was. v.append(static_cast<char>(majorVersion())); v.append(static_cast<char>(0)); // Currently we don't actually support writing extended headers, footers or // unsynchronized tags, make sure that the flags are set accordingly. d->extendedHeader = false; d->footerPresent = false; d->unsynchronisation = false; // render and add the flags std::bitset<8> flags; flags[7] = d->unsynchronisation; flags[6] = d->extendedHeader; flags[5] = d->experimentalIndicator; flags[4] = d->footerPresent; v.append(static_cast<char>(flags.to_ulong())); // add the size v.append(SynchData::fromUInt(d->tagSize)); return v; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void Header::parse(const ByteVector &data) { if(data.size() < size()) return; // do some sanity checking -- even in ID3v2.3.0 and less the tag size is a // synch-safe integer, so all bytes must be less than 128. If this is not // true then this is an invalid tag. // note that we're doing things a little out of order here -- the size is // later in the bytestream than the version ByteVector sizeData = data.mid(6, 4); if(sizeData.size() != 4) { d->tagSize = 0; debug("TagLib::ID3v2::Header::parse() - The tag size as read was 0 bytes!"); return; } for(ByteVector::ConstIterator it = sizeData.begin(); it != sizeData.end(); it++) { if(static_cast<unsigned char>(*it) >= 128) { d->tagSize = 0; debug("TagLib::ID3v2::Header::parse() - One of the size bytes in the id3v2 header was greater than the allowed 128."); return; } } // The first three bytes, data[0..2], are the File Identifier, "ID3". (structure 3.1 "file identifier") // Read the version number from the fourth and fifth bytes. d->majorVersion = data[3]; // (structure 3.1 "major version") d->revisionNumber = data[4]; // (structure 3.1 "revision number") // Read the flags, the first four bits of the sixth byte. std::bitset<8> flags(data[5]); d->unsynchronisation = flags[7]; // (structure 3.1.a) d->extendedHeader = flags[6]; // (structure 3.1.b) d->experimentalIndicator = flags[5]; // (structure 3.1.c) d->footerPresent = flags[4]; // (structure 3.1.d) // Get the size from the remaining four bytes (read above) d->tagSize = SynchData::toUInt(sizeData); // (structure 3.1 "size") } ����������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2header.h�������������������������������������������������������0000664�0000000�0000000�00000013436�14447736377�0020466�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ID3V2HEADER_H #define TAGLIB_ID3V2HEADER_H #include "tbytevector.h" #include "taglib_export.h" #include "id3v2.h" namespace TagLib { namespace ID3v2 { //! An implementation of ID3v2 headers /*! * This class implements ID3v2 headers. It attempts to follow, both * semantically and programmatically, the structure specified in * the ID3v2 standard. The API is based on the properties of ID3v2 headers * specified there. If any of the terms used in this documentation are * unclear please check the specification in the linked section. * (Structure, <a href="id3v2-structure.html#3.1">3.1</a>) */ class TAGLIB_EXPORT Header { public: /*! * Constructs an empty ID3v2 header. */ Header(); /*! * Constructs an ID3v2 header based on \a data. parse() is called * immediately. */ Header(const ByteVector &data); /*! * Destroys the header. */ virtual ~Header(); /*! * Returns the major version number. (Note: This is the 4, not the 2 in * ID3v2.4.0. The 2 is implied.) */ unsigned int majorVersion() const; /*! * Set the the major version number to \a version. (Note: This is * the 4, not the 2 in ID3v2.4.0. The 2 is implied.) * \see majorVersion() * * \note This is used by the internal parser; this will not change the * version which is written and in general should not be called by API * users. */ void setMajorVersion(unsigned int version); /*! * Returns the revision number. (Note: This is the 0, not the 4 in * ID3v2.4.0. The 2 is implied.) */ unsigned int revisionNumber() const; /*! * Returns true if unsynchronisation has been applied to all frames. */ bool unsynchronisation() const; /*! * Returns true if an extended header is present in the tag. */ bool extendedHeader() const; /*! * Returns true if the experimental indicator flag is set. */ bool experimentalIndicator() const; /*! * Returns true if a footer is present in the tag. */ bool footerPresent() const; /*! * Returns the tag size in bytes. This is the size of the frame content. * The size of the \e entire tag will be this plus the header size (10 * bytes) and, if present, the footer size (potentially another 10 bytes). * * \note This is the value as read from the header to which TagLib attempts * to provide an API to; it was not a design decision on the part of TagLib * to not include the mentioned portions of the tag in the \e size. * * \see completeTagSize() */ unsigned int tagSize() const; /*! * Returns the tag size, including the header and, if present, the footer * size. * * \see tagSize() */ unsigned int completeTagSize() const; /*! * Set the tag size to \a s. * \see tagSize() */ void setTagSize(unsigned int s); /*! * Returns the size of the header. Presently this is always 10 bytes. */ static unsigned int size(); /*! * Returns the string used to identify and ID3v2 tag inside of a file. * Presently this is always "ID3". */ static ByteVector fileIdentifier(); /*! * Sets the data that will be used as the header. 10 bytes, starting from * the beginning of \a data are used. */ void setData(const ByteVector &data); /*! * Renders the Header back to binary format. */ ByteVector render() const; protected: /*! * Called by setData() to parse the header data. It makes this information * available through the public API. */ void parse(const ByteVector &data); private: Header(const Header &); Header &operator=(const Header &); class HeaderPrivate; HeaderPrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2synchdata.cpp��������������������������������������������������0000664�0000000�0000000�00000006436�14447736377�0021551�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <iostream> #include "id3v2synchdata.h" using namespace TagLib; using namespace ID3v2; unsigned int SynchData::toUInt(const ByteVector &data) { unsigned int sum = 0; bool notSynchSafe = false; int last = data.size() > 4 ? 3 : data.size() - 1; for(int i = 0; i <= last; i++) { if(data[i] & 0x80) { notSynchSafe = true; break; } sum |= (data[i] & 0x7f) << ((last - i) * 7); } if(notSynchSafe) { // Invalid data; assume this was created by some buggy software that just // put normal integers here rather than syncsafe ones, and try it that // way. if(data.size() >= 4) { sum = data.toUInt(0, true); } else { ByteVector tmp(data); tmp.resize(4); sum = tmp.toUInt(0, true); } } return sum; } ByteVector SynchData::fromUInt(unsigned int value) { ByteVector v(4, 0); for(int i = 0; i < 4; i++) v[i] = static_cast<unsigned char>(value >> ((3 - i) * 7) & 0x7f); return v; } ByteVector SynchData::decode(const ByteVector &data) { if (data.size() == 0) { return ByteVector(); } // We have this optimized method instead of using ByteVector::replace(), // since it makes a great difference when decoding huge unsynchronized frames. ByteVector result(data.size()); ByteVector::ConstIterator src = data.begin(); ByteVector::Iterator dst = result.begin(); while(src < data.end() - 1) { *dst++ = *src++; if(*(src - 1) == '\xff' && *src == '\x00') src++; } if(src < data.end()) *dst++ = *src++; result.resize(static_cast<unsigned int>(dst - result.begin())); return result; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2synchdata.h����������������������������������������������������0000664�0000000�0000000�00000006045�14447736377�0021212�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ID3V2SYNCHDATA_H #define TAGLIB_ID3V2SYNCHDATA_H #include "tbytevector.h" #include "taglib.h" namespace TagLib { namespace ID3v2 { //! A few functions for ID3v2 synch safe integer conversion /*! * In the ID3v2.4 standard most integer values are encoded as "synch safe" * integers which are encoded in such a way that they will not give false * MPEG syncs and confuse MPEG decoders. This namespace provides some * methods for converting to and from these values to ByteVectors for * things rendering and parsing ID3v2 data. */ namespace SynchData { /*! * This returns the unsigned integer value of \a data where \a data is a * ByteVector that contains a \e synchsafe integer (Structure, * <a href="id3v2-structure.html#6.2">6.2</a>). The default \a length of * 4 is used if another value is not specified. */ TAGLIB_EXPORT unsigned int toUInt(const ByteVector &data); /*! * Returns a 4 byte (32 bit) synchsafe integer based on \a value. */ TAGLIB_EXPORT ByteVector fromUInt(unsigned int value); /*! * Convert the data from unsynchronized data to its original format. */ TAGLIB_EXPORT ByteVector decode(const ByteVector &input); } // namespace SynchData } // namespace ID3v2 } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2tag.cpp��������������������������������������������������������0000664�0000000�0000000�00000057572�14447736377�0020355�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <algorithm> #include <tfile.h> #include <tbytevector.h> #include <tpropertymap.h> #include <tdebug.h> #include "id3v2tag.h" #include "id3v2header.h" #include "id3v2extendedheader.h" #include "id3v2footer.h" #include "id3v2synchdata.h" #include "id3v1genres.h" #include "frames/textidentificationframe.h" #include "frames/commentsframe.h" #include "frames/urllinkframe.h" #include "frames/uniquefileidentifierframe.h" #include "frames/unsynchronizedlyricsframe.h" #include "frames/unknownframe.h" using namespace TagLib; using namespace ID3v2; namespace { const ID3v2::Latin1StringHandler defaultStringHandler; const ID3v2::Latin1StringHandler *stringHandler = &defaultStringHandler; const long MinPaddingSize = 1024; const long MaxPaddingSize = 1024 * 1024; bool contains(const char **a, const ByteVector &v) { for(int i = 0; a[i]; i++) { if(v == a[i]) return true; } return false; } } // namespace class ID3v2::Tag::TagPrivate { public: TagPrivate() : factory(0), file(0), tagOffset(0), extendedHeader(0), footer(0) { frameList.setAutoDelete(true); } ~TagPrivate() { delete extendedHeader; delete footer; } const FrameFactory *factory; File *file; long tagOffset; Header header; ExtendedHeader *extendedHeader; Footer *footer; FrameListMap frameListMap; FrameList frameList; }; //////////////////////////////////////////////////////////////////////////////// // StringHandler implementation //////////////////////////////////////////////////////////////////////////////// Latin1StringHandler::Latin1StringHandler() { } Latin1StringHandler::~Latin1StringHandler() { } String Latin1StringHandler::parse(const ByteVector &data) const { return String(data, String::Latin1); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// ID3v2::Tag::Tag() : d(new TagPrivate()) { d->factory = FrameFactory::instance(); } ID3v2::Tag::Tag(File *file, long tagOffset, const FrameFactory *factory) : d(new TagPrivate()) { d->factory = factory; d->file = file; d->tagOffset = tagOffset; read(); } ID3v2::Tag::~Tag() { delete d; } String ID3v2::Tag::title() const { if(!d->frameListMap["TIT2"].isEmpty()) return d->frameListMap["TIT2"].front()->toString(); return String(); } String ID3v2::Tag::artist() const { if(!d->frameListMap["TPE1"].isEmpty()) return d->frameListMap["TPE1"].front()->toString(); return String(); } String ID3v2::Tag::album() const { if(!d->frameListMap["TALB"].isEmpty()) return d->frameListMap["TALB"].front()->toString(); return String(); } String ID3v2::Tag::comment() const { const FrameList &comments = d->frameListMap["COMM"]; if(comments.isEmpty()) return String(); for(FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) { CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it); if(frame && frame->description().isEmpty()) return (*it)->toString(); } return comments.front()->toString(); } String ID3v2::Tag::genre() const { // TODO: In the next major version (TagLib 2.0) a list of multiple genres // should be separated by " / " instead of " ". For the moment to keep // the behavior the same as released versions it is being left with " ". const FrameList &tconFrames = d->frameListMap["TCON"]; if(tconFrames.isEmpty()) { return String(); } TextIdentificationFrame *f = dynamic_cast<TextIdentificationFrame *>(tconFrames.front()); if(!f) { return String(); } // ID3v2.4 lists genres as the fields in its frames field list. If the field // is simply a number it can be assumed that it is an ID3v1 genre number. // Here was assume that if an ID3v1 string is present that it should be // appended to the genre string. Multiple fields will be appended as the // string is built. StringList fields = f->fieldList(); StringList genres; for(StringList::Iterator it = fields.begin(); it != fields.end(); ++it) { if((*it).isEmpty()) continue; bool ok; int number = (*it).toInt(&ok); if(ok && number >= 0 && number <= 255) { *it = ID3v1::genre(number); } if(std::find(genres.begin(), genres.end(), *it) == genres.end()) genres.append(*it); } return genres.toString(); } unsigned int ID3v2::Tag::year() const { if(!d->frameListMap["TDRC"].isEmpty()) return d->frameListMap["TDRC"].front()->toString().substr(0, 4).toInt(); return 0; } unsigned int ID3v2::Tag::track() const { if(!d->frameListMap["TRCK"].isEmpty()) return d->frameListMap["TRCK"].front()->toString().toInt(); return 0; } void ID3v2::Tag::setTitle(const String &s) { setTextFrame("TIT2", s); } void ID3v2::Tag::setArtist(const String &s) { setTextFrame("TPE1", s); } void ID3v2::Tag::setAlbum(const String &s) { setTextFrame("TALB", s); } void ID3v2::Tag::setComment(const String &s) { if(s.isEmpty()) { removeFrames("COMM"); return; } const FrameList &comments = d->frameListMap["COMM"]; if(!comments.isEmpty()) { for(FrameList::ConstIterator it = comments.begin(); it != comments.end(); ++it) { CommentsFrame *frame = dynamic_cast<CommentsFrame *>(*it); if(frame && frame->description().isEmpty()) { (*it)->setText(s); return; } } comments.front()->setText(s); return; } CommentsFrame *f = new CommentsFrame(d->factory->defaultTextEncoding()); addFrame(f); f->setText(s); } void ID3v2::Tag::setGenre(const String &s) { if(s.isEmpty()) { removeFrames("TCON"); return; } // iTunes can't handle correctly encoded ID3v2.4 numerical genres. Just use // strings until iTunes sucks less. #ifdef NO_ITUNES_HACKS int index = ID3v1::genreIndex(s); if(index != 255) setTextFrame("TCON", String::number(index)); else setTextFrame("TCON", s); #else setTextFrame("TCON", s); #endif } void ID3v2::Tag::setYear(unsigned int i) { if(i == 0) { removeFrames("TDRC"); return; } setTextFrame("TDRC", String::number(i)); } void ID3v2::Tag::setTrack(unsigned int i) { if(i == 0) { removeFrames("TRCK"); return; } setTextFrame("TRCK", String::number(i)); } bool ID3v2::Tag::isEmpty() const { return d->frameList.isEmpty(); } Header *ID3v2::Tag::header() const { return &(d->header); } ExtendedHeader *ID3v2::Tag::extendedHeader() const { return d->extendedHeader; } Footer *ID3v2::Tag::footer() const { return d->footer; } const FrameListMap &ID3v2::Tag::frameListMap() const { return d->frameListMap; } const FrameList &ID3v2::Tag::frameList() const { return d->frameList; } const FrameList &ID3v2::Tag::frameList(const ByteVector &frameID) const { return d->frameListMap[frameID]; } void ID3v2::Tag::addFrame(Frame *frame) { d->frameList.append(frame); d->frameListMap[frame->frameID()].append(frame); } void ID3v2::Tag::removeFrame(Frame *frame, bool del) { // remove the frame from the frame list FrameList::Iterator it = d->frameList.find(frame); d->frameList.erase(it); // ...and from the frame list map it = d->frameListMap[frame->frameID()].find(frame); d->frameListMap[frame->frameID()].erase(it); // ...and delete as desired if(del) delete frame; } void ID3v2::Tag::removeFrames(const ByteVector &id) { FrameList l = d->frameListMap[id]; for(FrameList::ConstIterator it = l.begin(); it != l.end(); ++it) removeFrame(*it, true); } PropertyMap ID3v2::Tag::properties() const { PropertyMap properties; for(FrameList::ConstIterator it = frameList().begin(); it != frameList().end(); ++it) { PropertyMap props = (*it)->asProperties(); properties.merge(props); } return properties; } void ID3v2::Tag::removeUnsupportedProperties(const StringList &properties) { for(StringList::ConstIterator it = properties.begin(); it != properties.end(); ++it){ if(it->startsWith("UNKNOWN/")) { String frameID = it->substr(String("UNKNOWN/").size()); if(frameID.size() != 4) continue; // invalid specification ByteVector id = frameID.data(String::Latin1); // delete all unknown frames of given type FrameList l = frameList(id); for(FrameList::ConstIterator fit = l.begin(); fit != l.end(); fit++) if (dynamic_cast<const UnknownFrame *>(*fit) != 0) removeFrame(*fit); } else if(it->size() == 4){ ByteVector id = it->data(String::Latin1); removeFrames(id); } else { ByteVector id = it->substr(0,4).data(String::Latin1); if(it->size() <= 5) continue; // invalid specification String description = it->substr(5); Frame *frame = 0; if(id == "TXXX") frame = UserTextIdentificationFrame::find(this, description); else if(id == "WXXX") frame = UserUrlLinkFrame::find(this, description); else if(id == "COMM") frame = CommentsFrame::findByDescription(this, description); else if(id == "USLT") frame = UnsynchronizedLyricsFrame::findByDescription(this, description); else if(id == "UFID") frame = UniqueFileIdentifierFrame::findByOwner(this, description); if(frame) removeFrame(frame); } } } PropertyMap ID3v2::Tag::setProperties(const PropertyMap &origProps) { FrameList framesToDelete; // we split up the PropertyMap into the "normal" keys and the "complicated" ones, // which are those according to TIPL or TMCL frames. PropertyMap properties; PropertyMap tiplProperties; PropertyMap tmclProperties; Frame::splitProperties(origProps, properties, tiplProperties, tmclProperties); for(FrameListMap::ConstIterator it = frameListMap().begin(); it != frameListMap().end(); ++it){ for(FrameList::ConstIterator lit = it->second.begin(); lit != it->second.end(); ++lit){ PropertyMap frameProperties = (*lit)->asProperties(); if(it->first == "TIPL") { if (tiplProperties != frameProperties) framesToDelete.append(*lit); else tiplProperties.erase(frameProperties); } else if(it->first == "TMCL") { if (tmclProperties != frameProperties) framesToDelete.append(*lit); else tmclProperties.erase(frameProperties); } else if(!properties.contains(frameProperties)) framesToDelete.append(*lit); else properties.erase(frameProperties); } } for(FrameList::ConstIterator it = framesToDelete.begin(); it != framesToDelete.end(); ++it) removeFrame(*it); // now create remaining frames: // start with the involved people list (TIPL) if(!tiplProperties.isEmpty()) addFrame(TextIdentificationFrame::createTIPLFrame(tiplProperties)); // proceed with the musician credit list (TMCL) if(!tmclProperties.isEmpty()) addFrame(TextIdentificationFrame::createTMCLFrame(tmclProperties)); // now create the "one key per frame" frames for(PropertyMap::ConstIterator it = properties.begin(); it != properties.end(); ++it) addFrame(Frame::createTextualFrame(it->first, it->second)); return PropertyMap(); // ID3 implements the complete PropertyMap interface, so an empty map is returned } ByteVector ID3v2::Tag::render() const { return render(ID3v2::v4); } void ID3v2::Tag::downgradeFrames(FrameList *frames, FrameList *newFrames) const { #ifdef NO_ITUNES_HACKS static const char *unsupportedFrames[] = { "ASPI", "EQU2", "RVA2", "SEEK", "SIGN", "TDRL", "TDTG", "TMOO", "TPRO", "TSOA", "TSOT", "TSST", "TSOP", 0 }; #else // iTunes writes and reads TSOA, TSOT, TSOP to ID3v2.3. static const char *unsupportedFrames[] = { "ASPI", "EQU2", "RVA2", "SEEK", "SIGN", "TDRL", "TDTG", "TMOO", "TPRO", "TSST", 0 }; #endif ID3v2::TextIdentificationFrame *frameTDOR = 0; ID3v2::TextIdentificationFrame *frameTDRC = 0; ID3v2::TextIdentificationFrame *frameTIPL = 0; ID3v2::TextIdentificationFrame *frameTMCL = 0; ID3v2::TextIdentificationFrame *frameTCON = 0; for(FrameList::ConstIterator it = d->frameList.begin(); it != d->frameList.end(); it++) { ID3v2::Frame *frame = *it; ByteVector frameID = frame->header()->frameID(); if(contains(unsupportedFrames, frameID)) { debug("A frame that is not supported in ID3v2.3 \'" + String(frameID) + "\' has been discarded"); continue; } if(frameID == "TDOR") frameTDOR = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); else if(frameID == "TDRC") frameTDRC = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); else if(frameID == "TIPL") frameTIPL = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); else if(frameID == "TMCL") frameTMCL = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); else if(frame && frameID == "TCON") frameTCON = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); else frames->append(frame); } if(frameTDOR) { String content = frameTDOR->toString(); if(content.size() >= 4) { ID3v2::TextIdentificationFrame *frameTORY = new ID3v2::TextIdentificationFrame("TORY", String::Latin1); frameTORY->setText(content.substr(0, 4)); frames->append(frameTORY); newFrames->append(frameTORY); } } if(frameTDRC) { String content = frameTDRC->toString(); if(content.size() >= 4) { ID3v2::TextIdentificationFrame *frameTYER = new ID3v2::TextIdentificationFrame("TYER", String::Latin1); frameTYER->setText(content.substr(0, 4)); frames->append(frameTYER); newFrames->append(frameTYER); if(content.size() >= 10 && content[4] == '-' && content[7] == '-') { ID3v2::TextIdentificationFrame *frameTDAT = new ID3v2::TextIdentificationFrame("TDAT", String::Latin1); frameTDAT->setText(content.substr(8, 2) + content.substr(5, 2)); frames->append(frameTDAT); newFrames->append(frameTDAT); if(content.size() >= 16 && content[10] == 'T' && content[13] == ':') { ID3v2::TextIdentificationFrame *frameTIME = new ID3v2::TextIdentificationFrame("TIME", String::Latin1); frameTIME->setText(content.substr(11, 2) + content.substr(14, 2)); frames->append(frameTIME); newFrames->append(frameTIME); } } } } if(frameTIPL || frameTMCL) { ID3v2::TextIdentificationFrame *frameIPLS = new ID3v2::TextIdentificationFrame("IPLS", String::Latin1); StringList people; if(frameTMCL) { StringList v24People = frameTMCL->fieldList(); for(unsigned int i = 0; i + 1 < v24People.size(); i += 2) { people.append(v24People[i]); people.append(v24People[i+1]); } } if(frameTIPL) { StringList v24People = frameTIPL->fieldList(); for(unsigned int i = 0; i + 1 < v24People.size(); i += 2) { people.append(v24People[i]); people.append(v24People[i+1]); } } frameIPLS->setText(people); frames->append(frameIPLS); newFrames->append(frameIPLS); } if(frameTCON) { StringList genres = frameTCON->fieldList(); String combined; String genreText; const bool hasMultipleGenres = genres.size() > 1; // If there are multiple genres, add them as multiple references to ID3v1 // genres if such a reference exists. The first genre for which no ID3v1 // genre number exists can be finally added as a refinement. for(StringList::ConstIterator it = genres.begin(); it != genres.end(); ++it) { bool ok = false; int number = it->toInt(&ok); if((ok && number >= 0 && number <= 255) || *it == "RX" || *it == "CR") combined += '(' + *it + ')'; else if(hasMultipleGenres && (number = ID3v1::genreIndex(*it)) != 255) combined += '(' + String::number(number) + ')'; else if(genreText.isEmpty()) genreText = *it; } if(!genreText.isEmpty()) combined += genreText; frameTCON = new ID3v2::TextIdentificationFrame("TCON", String::Latin1); frameTCON->setText(combined); frames->append(frameTCON); newFrames->append(frameTCON); } } ByteVector ID3v2::Tag::render(int version) const { return render(version == 3 ? v3 : v4); } ByteVector ID3v2::Tag::render(Version version) const { // We need to render the "tag data" first so that we have to correct size to // render in the tag's header. The "tag data" -- everything that is included // in ID3v2::Header::tagSize() -- includes the extended header, frames and // padding, but does not include the tag's header or footer. // TODO: Render the extended header. // Downgrade the frames that ID3v2.3 doesn't support. FrameList newFrames; newFrames.setAutoDelete(true); FrameList frameList; if(version == v4) { frameList = d->frameList; } else { downgradeFrames(&frameList, &newFrames); } // Reserve a 10-byte blank space for an ID3v2 tag header. ByteVector tagData(Header::size(), '\0'); // Loop through the frames rendering them and adding them to the tagData. for(FrameList::ConstIterator it = frameList.begin(); it != frameList.end(); it++) { (*it)->header()->setVersion(version == v3 ? 3 : 4); if((*it)->header()->frameID().size() != 4) { debug("An ID3v2 frame of unsupported or unknown type \'" + String((*it)->header()->frameID()) + "\' has been discarded"); continue; } if(!(*it)->header()->tagAlterPreservation()) { const ByteVector frameData = (*it)->render(); if(frameData.size() == Frame::headerSize((*it)->header()->version())) { debug("An empty ID3v2 frame \'" + String((*it)->header()->frameID()) + "\' has been discarded"); continue; } tagData.append(frameData); } } // Compute the amount of padding, and append that to tagData. long originalSize = d->header.tagSize(); long paddingSize = originalSize - (tagData.size() - Header::size()); if(paddingSize <= 0) { paddingSize = MinPaddingSize; } else { // Padding won't increase beyond 1% of the file size or 1MB. long threshold = d->file ? d->file->length() / 100 : 0; threshold = std::max(threshold, MinPaddingSize); threshold = std::min(threshold, MaxPaddingSize); if(paddingSize > threshold) paddingSize = MinPaddingSize; } tagData.resize(static_cast<unsigned int>(tagData.size() + paddingSize), '\0'); // Set the version and data size. d->header.setMajorVersion(version); d->header.setTagSize(tagData.size() - Header::size()); // TODO: This should eventually include d->footer->render(). const ByteVector headerData = d->header.render(); std::copy(headerData.begin(), headerData.end(), tagData.begin()); return tagData; } Latin1StringHandler const *ID3v2::Tag::latin1StringHandler() { return stringHandler; } void ID3v2::Tag::setLatin1StringHandler(const Latin1StringHandler *handler) { if(handler) stringHandler = handler; else stringHandler = &defaultStringHandler; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void ID3v2::Tag::read() { if(!d->file) return; if(!d->file->isOpen()) return; d->file->seek(d->tagOffset); d->header.setData(d->file->readBlock(Header::size())); // If the tag size is 0, then this is an invalid tag (tags must contain at // least one frame) if(d->header.tagSize() != 0) parse(d->file->readBlock(d->header.tagSize())); // Look for duplicate ID3v2 tags and treat them as an extra blank of this one. // It leads to overwriting them with zero when saving the tag. // This is a workaround for some faulty files that have duplicate ID3v2 tags. // Unfortunately, TagLib itself may write such duplicate tags until v1.10. unsigned int extraSize = 0; while(true) { d->file->seek(d->tagOffset + d->header.completeTagSize() + extraSize); const ByteVector data = d->file->readBlock(Header::size()); if(data.size() < Header::size() || !data.startsWith(Header::fileIdentifier())) break; extraSize += Header(data).completeTagSize(); } if(extraSize != 0) { debug("ID3v2::Tag::read() - Duplicate ID3v2 tags found."); d->header.setTagSize(d->header.tagSize() + extraSize); } } void ID3v2::Tag::parse(const ByteVector &origData) { ByteVector data = origData; if(d->header.unsynchronisation() && d->header.majorVersion() <= 3) data = SynchData::decode(data); unsigned int frameDataPosition = 0; unsigned int frameDataLength = data.size(); // check for extended header if(d->header.extendedHeader()) { if(!d->extendedHeader) d->extendedHeader = new ExtendedHeader(); d->extendedHeader->setData(data); if(d->extendedHeader->size() <= data.size()) { frameDataPosition += d->extendedHeader->size(); } } // check for footer -- we don't actually need to parse it, as it *must* // contain the same data as the header, but we do need to account for its // size. if(d->header.footerPresent() && Footer::size() <= frameDataLength) frameDataLength -= Footer::size(); // parse frames // Make sure that there is at least enough room in the remaining frame data for // a frame header. while(frameDataPosition < frameDataLength - Frame::headerSize(d->header.majorVersion())) { // If the next data is position is 0, assume that we've hit the padding // portion of the frame data. if(data.at(frameDataPosition) == 0) { if(d->header.footerPresent()) { debug("Padding *and* a footer found. This is not allowed by the spec."); } break; } Frame *frame = d->factory->createFrame(data.mid(frameDataPosition), &d->header); if(!frame) return; // Checks to make sure that frame parsed correctly. if(frame->size() <= 0) { delete frame; return; } frameDataPosition += frame->size() + Frame::headerSize(d->header.majorVersion()); addFrame(frame); } d->factory->rebuildAggregateFrames(this); } void ID3v2::Tag::setTextFrame(const ByteVector &id, const String &value) { if(value.isEmpty()) { removeFrames(id); return; } if(!d->frameListMap[id].isEmpty()) d->frameListMap[id].front()->setText(value); else { const String::Type encoding = d->factory->defaultTextEncoding(); TextIdentificationFrame *f = new TextIdentificationFrame(id, encoding); addFrame(f); f->setText(value); } } ��������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/id3v2/id3v2tag.h����������������������������������������������������������0000664�0000000�0000000�00000037617�14447736377�0020020�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_ID3V2TAG_H #define TAGLIB_ID3V2TAG_H #include "tag.h" #include "tbytevector.h" #include "tstring.h" #include "tlist.h" #include "tmap.h" #include "taglib_export.h" #include "id3v2.h" #include "id3v2framefactory.h" namespace TagLib { class File; namespace ID3v2 { class Header; class ExtendedHeader; class Footer; typedef List<Frame *> FrameList; typedef Map<ByteVector, FrameList> FrameListMap; //! An abstraction for the ISO-8859-1 string to data encoding in ID3v2 tags. /*! * ID3v2 tag can store strings in ISO-8859-1 (Latin1), and TagLib only * supports genuine ISO-8859-1 by default. However, in practice, non * ISO-8859-1 encodings are often used instead of ISO-8859-1, such as * Windows-1252 for western languages, Shift_JIS for Japanese and so on. * * Here is an option to read such tags by subclassing this class, * reimplementing parse() and setting your reimplementation as the default * with ID3v2::Tag::setStringHandler(). * * \note Writing non-ISO-8859-1 tags is not implemented intentionally. * Use UTF-16 or UTF-8 instead. * * \see ID3v2::Tag::setStringHandler() */ class TAGLIB_EXPORT Latin1StringHandler { public: Latin1StringHandler(); virtual ~Latin1StringHandler(); /*! * Decode a string from \a data. The default implementation assumes that * \a data is an ISO-8859-1 (Latin1) character array. */ virtual String parse(const ByteVector &data) const; }; //! The main class in the ID3v2 implementation /*! * This is the main class in the ID3v2 implementation. It serves two * functions. This first, as is obvious from the public API, is to provide a * container for the other ID3v2 related classes. In addition, through the * read() and parse() protected methods, it provides the most basic level of * parsing. In these methods the ID3v2 tag is extracted from the file and * split into data components. * * ID3v2 tags have several parts, TagLib attempts to provide an interface * for them all. header(), footer() and extendedHeader() correspond to those * data structures in the ID3v2 standard and the APIs for the classes that * they return attempt to reflect this. * * Also ID3v2 tags are built up from a list of frames, which are in turn * have a header and a list of fields. TagLib provides two ways of accessing * the list of frames that are in a given ID3v2 tag. The first is simply * via the frameList() method. This is just a list of pointers to the frames. * The second is a map from the frame type -- i.e. "COMM" for comments -- and * a list of frames of that type. (In some cases ID3v2 allows for multiple * frames of the same type, hence this being a map to a list rather than just * a map to an individual frame.) * * More information on the structure of frames can be found in the ID3v2::Frame * class. * * read() and parse() pass binary data to the other ID3v2 class structures, * they do not handle parsing of flags or fields, for instance. Those are * handled by similar functions within those classes. * * \note All pointers to data structures within the tag will become invalid * when the tag is destroyed. * * \warning Dealing with the nasty details of ID3v2 is not for the faint of * heart and should not be done without much meditation on the spec. It's * rather long, but if you're planning on messing with this class and others * that deal with the details of ID3v2 (rather than the nice, safe, abstract * TagLib::Tag and friends), it's worth your time to familiarize yourself * with said spec (which is distributed with the TagLib sources). TagLib * tries to do most of the work, but with a little luck, you can still * convince it to generate invalid ID3v2 tags. The APIs for ID3v2 assume a * working knowledge of ID3v2 structure. You're been warned. */ class TAGLIB_EXPORT Tag : public TagLib::Tag { public: /*! * Constructs an empty ID3v2 tag. * * \note You must create at least one frame for this tag to be valid. */ Tag(); /*! * Constructs an ID3v2 tag read from \a file starting at \a tagOffset. * \a factory specifies which FrameFactory will be used for the * construction of new frames. * * \note You should be able to ignore the \a factory parameter in almost * all situations. You would want to specify your own FrameFactory * subclass in the case that you are extending TagLib to support additional * frame types, which would be incorporated into your factory. * * \see FrameFactory */ Tag(File *file, long tagOffset, const FrameFactory *factory = FrameFactory::instance()); /*! * Destroys this Tag instance. */ virtual ~Tag(); // Reimplementations. virtual String title() const; virtual String artist() const; virtual String album() const; virtual String comment() const; virtual String genre() const; virtual unsigned int year() const; virtual unsigned int track() const; virtual void setTitle(const String &s); virtual void setArtist(const String &s); virtual void setAlbum(const String &s); virtual void setComment(const String &s); virtual void setGenre(const String &s); virtual void setYear(unsigned int i); virtual void setTrack(unsigned int i); virtual bool isEmpty() const; /*! * Returns a pointer to the tag's header. */ Header *header() const; /*! * Returns a pointer to the tag's extended header or null if there is no * extended header. */ ExtendedHeader *extendedHeader() const; /*! * Returns a pointer to the tag's footer or null if there is no footer. * * \deprecated I don't see any reason to keep this around since there's * nothing useful to be retrieved from the footer, but well, again, I'm * prone to change my mind, so this gets to stay around until near a * release. */ TAGLIB_DEPRECATED Footer *footer() const; /*! * Returns a reference to the frame list map. This is an FrameListMap of * all of the frames in the tag. * * This is the most convenient structure for accessing the tag's frames. * Many frame types allow multiple instances of the same frame type so this * is a map of lists. In most cases however there will only be a single * frame of a certain type. * * Let's say for instance that you wanted to access the frame for total * beats per minute -- the TBPM frame. * * \code * TagLib::MPEG::File f("foo.mp3"); * * // Check to make sure that it has an ID3v2 tag * * if(f.ID3v2Tag()) { * * // Get the list of frames for a specific frame type * * TagLib::ID3v2::FrameList l = f.ID3v2Tag()->frameListMap()["TBPM"]; * * if(!l.isEmpty()) * std::cout << l.front()->toString() << std::endl; * } * * \endcode * * \warning You should not modify this data structure directly, instead * use addFrame() and removeFrame(). * * \see frameList() */ const FrameListMap &frameListMap() const; /*! * Returns a reference to the frame list. This is an FrameList of all of * the frames in the tag in the order that they were parsed. * * This can be useful if for example you want iterate over the tag's frames * in the order that they occur in the tag. * * \warning You should not modify this data structure directly, instead * use addFrame() and removeFrame(). */ const FrameList &frameList() const; /*! * Returns the frame list for frames with the id \a frameID or an empty * list if there are no frames of that type. This is just a convenience * and is equivalent to: * * \code * frameListMap()[frameID]; * \endcode * * \see frameListMap() */ const FrameList &frameList(const ByteVector &frameID) const; /*! * Add a frame to the tag. At this point the tag takes ownership of * the frame and will handle freeing its memory. * * \note Using this method will invalidate any pointers on the list * returned by frameList() */ void addFrame(Frame *frame); /*! * Remove a frame from the tag. If \a del is true the frame's memory * will be freed; if it is false, it must be deleted by the user. * * \note Using this method will invalidate any pointers on the list * returned by frameList() */ void removeFrame(Frame *frame, bool del = true); /*! * Remove all frames of type \a id from the tag and free their memory. * * \note Using this method will invalidate any pointers on the list * returned by frameList() */ void removeFrames(const ByteVector &id); /*! * Implements the unified property interface -- export function. * This function does some work to translate the hard-specified ID3v2 * frame types into a free-form string-to-stringlist PropertyMap: * - if ID3v2 frame ID is known by Frame::frameIDToKey(), the returned * key is used * - if the frame ID is "TXXX" (user text frame), the description() is * used as key * - if the frame ID is "WXXX" (user url frame), * - if the description is empty or "URL", the key "URL" is used * - otherwise, the key "URL:<description>" is used; * - if the frame ID is "COMM" (comments frame), * - if the description is empty or "COMMENT", the key "COMMENT" * is used * - otherwise, the key "COMMENT:<description>" is used; * - if the frame ID is "USLT" (unsynchronized lyrics), * - if the description is empty or "LYRICS", the key "LYRICS" is used * - otherwise, the key "LYRICS:<description>" is used; * - if the frame ID is "TIPL" (involved peoples list), and if all the * roles defined in the frame are known in TextIdentificationFrame::involvedPeopleMap(), * then "<role>=<name>" will be contained in the returned object for each * - if the frame ID is "TMCL" (musician credit list), then * "PERFORMER:<instrument>=<name>" will be contained in the returned * PropertyMap for each defined musician * In any other case, the unsupportedData() of the returned object will contain * the frame's ID and, in case of a frame ID which is allowed to appear more than * once, the description, separated by a "/". * */ PropertyMap properties() const; /*! * Removes unsupported frames given by \a properties. The elements of * \a properties must be taken from properties().unsupportedData(); they * are of one of the following forms: * - a four-character frame ID, if the ID3 specification allows only one * frame with that ID (thus, the frame is uniquely determined) * - frameID + "/" + description(), when the ID is one of "TXXX", "WXXX", * "COMM", or "USLT", * - "UNKNOWN/" + frameID, for frames that could not be parsed by TagLib. * In that case, *all* unknown frames with the given ID will be removed. */ void removeUnsupportedProperties(const StringList &properties); /*! * Implements the unified property interface -- import function. * See the comments in properties(). */ PropertyMap setProperties(const PropertyMap &); /*! * Render the tag back to binary data, suitable to be written to disk. */ ByteVector render() const; /*! * \deprecated Use render(Version) const. */ TAGLIB_DEPRECATED ByteVector render(int version) const; /*! * Render the tag back to binary data, suitable to be written to disk. * * The \a version parameter specifies whether ID3v2.4 (default) or ID3v2.3 * should be used. */ ByteVector render(Version version) const; /*! * Gets the current string handler that decides how the "Latin-1" data * will be converted to and from binary data. * * \see Latin1StringHandler */ static Latin1StringHandler const *latin1StringHandler(); /*! * Sets the string handler that decides how the "Latin-1" data will be * converted to and from binary data. * If the parameter \a handler is null, the previous handler is * released and default ISO-8859-1 handler is restored. * * \note The caller is responsible for deleting the previous handler * as needed after it is released. * * \see Latin1StringHandler */ static void setLatin1StringHandler(const Latin1StringHandler *handler); protected: /*! * Reads data from the file specified in the constructor. It does basic * parsing of the data in the largest chunks. It partitions the tag into * the Header, the body of the tag (which contains the ExtendedHeader and * frames) and Footer. */ void read(); /*! * This is called by read to parse the body of the tag. It determines if an * extended header exists and adds frames to the FrameListMap. */ void parse(const ByteVector &data); /*! * Sets the value of the text frame with the Frame ID \a id to \a value. * If the frame does not exist, it is created. */ void setTextFrame(const ByteVector &id, const String &value); /*! * Downgrade frames from ID3v2.4 (used internally and by default) to ID3v2.3. */ void downgradeFrames(FrameList *existingFrames, FrameList *newFrames) const; private: Tag(const Tag &); Tag &operator=(const Tag &); class TagPrivate; TagPrivate *d; }; } // namespace ID3v2 } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/mpegfile.cpp��������������������������������������������������������������0000664�0000000�0000000�00000034426�14447736377�0017564�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tagunion.h> #include <tagutils.h> #include <id3v2tag.h> #include <id3v2header.h> #include <id3v1tag.h> #include <apefooter.h> #include <apetag.h> #include <tdebug.h> #include "mpegfile.h" #include "mpegheader.h" #include "mpegutils.h" #include "tpropertymap.h" using namespace TagLib; namespace { enum { ID3v2Index = 0, APEIndex = 1, ID3v1Index = 2 }; } // namespace class MPEG::File::FilePrivate { public: FilePrivate(const ID3v2::FrameFactory *frameFactory = ID3v2::FrameFactory::instance()) : ID3v2FrameFactory(frameFactory), ID3v2Location(-1), ID3v2OriginalSize(0), APELocation(-1), APEOriginalSize(0), ID3v1Location(-1), properties(0) {} ~FilePrivate() { delete properties; } const ID3v2::FrameFactory *ID3v2FrameFactory; long ID3v2Location; long ID3v2OriginalSize; long APELocation; long APEOriginalSize; long ID3v1Location; TagUnion tag; Properties *properties; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// namespace { // Dummy file class to make a stream work with MPEG::Header. class AdapterFile : public TagLib::File { public: AdapterFile(IOStream *stream) : File(stream) {} Tag *tag() const { return 0; } AudioProperties *audioProperties() const { return 0; } bool save() { return false; } }; } // namespace bool MPEG::File::isSupported(IOStream *stream) { if(!stream || !stream->isOpen()) return false; // An MPEG file has MPEG frame headers. An ID3v2 tag may precede. // MPEG frame headers are really confusing with irrelevant binary data. // So we check if a frame header is really valid. long headerOffset; const ByteVector buffer = Utils::readHeader(stream, bufferSize(), true, &headerOffset); if(buffer.isEmpty()) return false; const long originalPosition = stream->tell(); AdapterFile file(stream); for(unsigned int i = 0; i < buffer.size() - 1; ++i) { if(isFrameSync(buffer, i)) { const Header header(&file, headerOffset + i, true); if(header.isValid()) { stream->seek(originalPosition); return true; } } } stream->seek(originalPosition); return false; } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// MPEG::File::File(FileName file, bool readProperties, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } MPEG::File::File(FileName file, ID3v2::FrameFactory *frameFactory, bool readProperties, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate(frameFactory)) { if(isOpen()) read(readProperties); } MPEG::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory, bool readProperties, Properties::ReadStyle) : TagLib::File(stream), d(new FilePrivate(frameFactory)) { if(isOpen()) read(readProperties); } MPEG::File::~File() { delete d; } TagLib::Tag *MPEG::File::tag() const { return &d->tag; } PropertyMap MPEG::File::properties() const { return d->tag.properties(); } void MPEG::File::removeUnsupportedProperties(const StringList &properties) { d->tag.removeUnsupportedProperties(properties); } PropertyMap MPEG::File::setProperties(const PropertyMap &properties) { // update ID3v1 tag if it exists, but ignore the return value if(ID3v1Tag()) ID3v1Tag()->setProperties(properties); return ID3v2Tag(true)->setProperties(properties); } MPEG::Properties *MPEG::File::audioProperties() const { return d->properties; } bool MPEG::File::save() { return save(AllTags); } bool MPEG::File::save(int tags) { return save(tags, StripOthers); } bool MPEG::File::save(int tags, bool stripOthers) { return save(tags, stripOthers ? StripOthers : StripNone, ID3v2::v4); } bool MPEG::File::save(int tags, bool stripOthers, int id3v2Version) { return save(tags, stripOthers ? StripOthers : StripNone, id3v2Version == 3 ? ID3v2::v3 : ID3v2::v4); } bool MPEG::File::save(int tags, bool stripOthers, int id3v2Version, bool duplicateTags) { return save(tags, stripOthers ? StripOthers : StripNone, id3v2Version == 3 ? ID3v2::v3 : ID3v2::v4, duplicateTags ? Duplicate : DoNotDuplicate); } bool MPEG::File::save(int tags, StripTags strip, ID3v2::Version version, DuplicateTags duplicate) { if(readOnly()) { debug("MPEG::File::save() -- File is read only."); return false; } // Create the tags if we've been asked to. if(duplicate == Duplicate) { // Copy the values from the tag that does exist into the new tag, // except if the existing tag is to be stripped. if((tags & ID3v2) && ID3v1Tag() && (strip != StripOthers || (tags & ID3v1))) Tag::duplicate(ID3v1Tag(), ID3v2Tag(true), false); if((tags & ID3v1) && d->tag[ID3v2Index] && (strip != StripOthers || (tags & ID3v2))) Tag::duplicate(ID3v2Tag(), ID3v1Tag(true), false); } // Remove all the tags not going to be saved. if(strip == StripOthers) File::strip(~tags, false); if(ID3v2 & tags) { if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { // ID3v2 tag is not empty. Update the old one or create a new one. if(d->ID3v2Location < 0) d->ID3v2Location = 0; const ByteVector data = ID3v2Tag()->render(version); insert(data, d->ID3v2Location, d->ID3v2OriginalSize); if(d->APELocation >= 0) d->APELocation += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); if(d->ID3v1Location >= 0) d->ID3v1Location += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); d->ID3v2OriginalSize = data.size(); } else { // ID3v2 tag is empty. Remove the old one. File::strip(ID3v2, false); } } if(ID3v1 & tags) { if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { // ID3v1 tag is not empty. Update the old one or create a new one. if(d->ID3v1Location >= 0) { seek(d->ID3v1Location); } else { seek(0, End); d->ID3v1Location = tell(); } writeBlock(ID3v1Tag()->render()); } else { // ID3v1 tag is empty. Remove the old one. File::strip(ID3v1, false); } } if(APE & tags) { if(APETag() && !APETag()->isEmpty()) { // APE tag is not empty. Update the old one or create a new one. if(d->APELocation < 0) { if(d->ID3v1Location >= 0) d->APELocation = d->ID3v1Location; else d->APELocation = length(); } const ByteVector data = APETag()->render(); insert(data, d->APELocation, d->APEOriginalSize); if(d->ID3v1Location >= 0) d->ID3v1Location += (static_cast<long>(data.size()) - d->APEOriginalSize); d->APEOriginalSize = data.size(); } else { // APE tag is empty. Remove the old one. File::strip(APE, false); } } return true; } ID3v2::Tag *MPEG::File::ID3v2Tag(bool create) { return d->tag.access<ID3v2::Tag>(ID3v2Index, create); } ID3v1::Tag *MPEG::File::ID3v1Tag(bool create) { return d->tag.access<ID3v1::Tag>(ID3v1Index, create); } APE::Tag *MPEG::File::APETag(bool create) { return d->tag.access<APE::Tag>(APEIndex, create); } bool MPEG::File::strip(int tags) { return strip(tags, true); } bool MPEG::File::strip(int tags, bool freeMemory) { if(readOnly()) { debug("MPEG::File::strip() - Cannot strip tags from a read only file."); return false; } if((tags & ID3v2) && d->ID3v2Location >= 0) { removeBlock(d->ID3v2Location, d->ID3v2OriginalSize); if(d->APELocation >= 0) d->APELocation -= d->ID3v2OriginalSize; if(d->ID3v1Location >= 0) d->ID3v1Location -= d->ID3v2OriginalSize; d->ID3v2Location = -1; d->ID3v2OriginalSize = 0; if(freeMemory) d->tag.set(ID3v2Index, 0); } if((tags & ID3v1) && d->ID3v1Location >= 0) { truncate(d->ID3v1Location); d->ID3v1Location = -1; if(freeMemory) d->tag.set(ID3v1Index, 0); } if((tags & APE) && d->APELocation >= 0) { removeBlock(d->APELocation, d->APEOriginalSize); if(d->ID3v1Location >= 0) d->ID3v1Location -= d->APEOriginalSize; d->APELocation = -1; d->APEOriginalSize = 0; if(freeMemory) d->tag.set(APEIndex, 0); } return true; } void MPEG::File::setID3v2FrameFactory(const ID3v2::FrameFactory *factory) { d->ID3v2FrameFactory = factory; } long MPEG::File::nextFrameOffset(long position) { ByteVector frameSyncBytes(2, '\0'); while(true) { seek(position); const ByteVector buffer = readBlock(bufferSize()); if(buffer.isEmpty()) return -1; for(unsigned int i = 0; i < buffer.size(); ++i) { frameSyncBytes[0] = frameSyncBytes[1]; frameSyncBytes[1] = buffer[i]; if(isFrameSync(frameSyncBytes)) { const Header header(this, position + i - 1, true); if(header.isValid()) return position + i - 1; } } position += bufferSize(); } } long MPEG::File::previousFrameOffset(long position) { ByteVector frameSyncBytes(2, '\0'); while(position > 0) { const long bufferLength = std::min<long>(position, bufferSize()); position -= bufferLength; seek(position); const ByteVector buffer = readBlock(bufferLength); for(int i = buffer.size() - 1; i >= 0; --i) { frameSyncBytes[1] = frameSyncBytes[0]; frameSyncBytes[0] = buffer[i]; if(isFrameSync(frameSyncBytes)) { const Header header(this, position + i, true); if(header.isValid()) return position + i + header.frameLength(); } } } return -1; } long MPEG::File::firstFrameOffset() { long position = 0; if(hasID3v2Tag()) position = d->ID3v2Location + ID3v2Tag()->header()->completeTagSize(); return nextFrameOffset(position); } long MPEG::File::lastFrameOffset() { long position; if(hasAPETag()) position = d->APELocation - 1; else if(hasID3v1Tag()) position = d->ID3v1Location - 1; else position = length(); return previousFrameOffset(position); } bool MPEG::File::hasID3v1Tag() const { return (d->ID3v1Location >= 0); } bool MPEG::File::hasID3v2Tag() const { return (d->ID3v2Location >= 0); } bool MPEG::File::hasAPETag() const { return (d->APELocation >= 0); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void MPEG::File::read(bool readProperties) { // Look for an ID3v2 tag d->ID3v2Location = findID3v2(); if(d->ID3v2Location >= 0) { d->tag.set(ID3v2Index, new ID3v2::Tag(this, d->ID3v2Location, d->ID3v2FrameFactory)); d->ID3v2OriginalSize = ID3v2Tag()->header()->completeTagSize(); } // Look for an ID3v1 tag d->ID3v1Location = Utils::findID3v1(this); if(d->ID3v1Location >= 0) d->tag.set(ID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); // Look for an APE tag d->APELocation = Utils::findAPE(this, d->ID3v1Location); if(d->APELocation >= 0) { d->tag.set(APEIndex, new APE::Tag(this, d->APELocation)); d->APEOriginalSize = APETag()->footer()->completeTagSize(); d->APELocation = d->APELocation + APE::Footer::size() - d->APEOriginalSize; } if(readProperties) d->properties = new Properties(this); // Make sure that we have our default tag types available. ID3v2Tag(true); ID3v1Tag(true); } long MPEG::File::findID3v2() { if(!isValid()) return -1; // An ID3v2 tag or MPEG frame is most likely be at the beginning of the file. const ByteVector headerID = ID3v2::Header::fileIdentifier(); seek(0); if(readBlock(headerID.size()) == headerID) return 0; const Header firstHeader(this, 0, true); if(firstHeader.isValid()) return -1; // Look for an ID3v2 tag until reaching the first valid MPEG frame. ByteVector frameSyncBytes(2, '\0'); ByteVector tagHeaderBytes(3, '\0'); long position = 0; while(true) { seek(position); const ByteVector buffer = readBlock(bufferSize()); if(buffer.isEmpty()) return -1; for(unsigned int i = 0; i < buffer.size(); ++i) { frameSyncBytes[0] = frameSyncBytes[1]; frameSyncBytes[1] = buffer[i]; if(isFrameSync(frameSyncBytes)) { const Header header(this, position + i - 1, true); if(header.isValid()) return -1; } tagHeaderBytes[0] = tagHeaderBytes[1]; tagHeaderBytes[1] = tagHeaderBytes[2]; tagHeaderBytes[2] = buffer[i]; if(tagHeaderBytes == headerID) return position + i - 2; } position += bufferSize(); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/mpegfile.h����������������������������������������������������������������0000664�0000000�0000000�00000034100�14447736377�0017216�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MPEGFILE_H #define TAGLIB_MPEGFILE_H #include "taglib_export.h" #include "tfile.h" #include "tag.h" #include "mpegproperties.h" #include "id3v2.h" namespace TagLib { namespace ID3v2 { class Tag; class FrameFactory; } namespace ID3v1 { class Tag; } namespace APE { class Tag; } //! An implementation of TagLib::File with MPEG (MP3) specific methods namespace MPEG { //! An MPEG file class with some useful methods specific to MPEG /*! * This implements the generic TagLib::File API and additionally provides * access to properties that are distinct to MPEG files, notably access * to the different ID3 tags. */ class TAGLIB_EXPORT File : public TagLib::File { public: /*! * This set of flags is used for various operations and is suitable for * being OR-ed together. */ enum TagTypes { //! Empty set. Matches no tag types. NoTags = 0x0000, //! Matches ID3v1 tags. ID3v1 = 0x0001, //! Matches ID3v2 tags. ID3v2 = 0x0002, //! Matches APE tags. APE = 0x0004, //! Matches all tag types. AllTags = 0xffff }; /*! * Constructs an MPEG file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. * * \deprecated This constructor will be dropped in favor of the one below * in a future version. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an MPEG file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * If this file contains and ID3v2 tag the frames will be created using * \a frameFactory. * * \note In the current implementation, \a propertiesStyle is ignored. */ // BIC: merge with the above constructor File(FileName file, ID3v2::FrameFactory *frameFactory, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an MPEG file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * If this file contains and ID3v2 tag the frames will be created using * \a frameFactory. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, ID3v2::FrameFactory *frameFactory, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns a pointer to a tag that is the union of the ID3v2 and ID3v1 * tags. The ID3v2 tag is given priority in reading the information -- if * requested information exists in both the ID3v2 tag and the ID3v1 tag, * the information from the ID3v2 tag will be returned. * * If you would like more granular control over the content of the tags, * with the concession of generality, use the tag-type specific calls. * * \note As this tag is not implemented as an ID3v2 tag or an ID3v1 tag, * but a union of the two this pointer may not be cast to the specific * tag types. * * \see ID3v1Tag() * \see ID3v2Tag() * \see APETag() */ virtual Tag *tag() const; /*! * Implements the reading part of the unified property interface. * If the file contains more than one tag, only the * first one (in the order ID3v2, APE, ID3v1) will be converted to the * PropertyMap. */ PropertyMap properties() const; void removeUnsupportedProperties(const StringList &properties); /*! * Implements the writing part of the unified tag dictionary interface. * In order to avoid problems with deprecated tag formats, this method * always creates an ID3v2 tag if necessary. * If an ID3v1 tag exists, it will be updated as well, within the * limitations of that format. * The returned PropertyMap refers to the ID3v2 tag only. */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the MPEG::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Save the file. If at least one tag -- ID3v1 or ID3v2 -- exists this * will duplicate its content into the other tag. This returns true * if saving was successful. * * If neither exists or if both tags are empty, this will strip the tags * from the file. * * This is the same as calling save(AllTags); * * If you would like more granular control over the content of the tags, * with the concession of generality, use parameterized save call below. * * \see save(int tags) */ virtual bool save(); /*! * Save the file. This will attempt to save all of the tag types that are * specified by OR-ing together TagTypes values. The save() method above * uses AllTags. This returns true if saving was successful. * * This strips all tags not included in the mask, but does not modify them * in memory, so later calls to save() which make use of these tags will * remain valid. This also strips empty tags. */ bool save(int tags); /*! * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags). */ // BIC: combine with the above method TAGLIB_DEPRECATED bool save(int tags, bool stripOthers); /*! * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags). */ // BIC: combine with the above method TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version); /*! * \deprecated Use save(int, StripTags, ID3v2::Version, DuplicateTags). */ // BIC: combine with the above method TAGLIB_DEPRECATED bool save(int tags, bool stripOthers, int id3v2Version, bool duplicateTags); /*! * Save the file. This will attempt to save all of the tag types that are * specified by OR-ing together TagTypes values. * * \a strip can be set to strip all tags except those in \a tags. Those * tags will not be modified in memory, and thus remain valid. * * \a version specifies the ID3v2 version to be used for writing tags. By * default, the latest standard, ID3v2.4 is used. * * If \a duplicate is set to DuplicateTags and at least one tag -- ID3v1 * or ID3v2 -- exists this will duplicate its content into the other tag. */ bool save(int tags, StripTags strip, ID3v2::Version version = ID3v2::v4, DuplicateTags duplicate = Duplicate); /*! * Returns a pointer to the ID3v2 tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid ID3v2 tag. If \a create is true it will create * an ID3v2 tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file * on disk actually has an ID3v2 tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasID3v2Tag() */ ID3v2::Tag *ID3v2Tag(bool create = false); /*! * Returns a pointer to the ID3v1 tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid ID3v1 tag. If \a create is true it will create * an ID3v1 tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file * on disk actually has an ID3v1 tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasID3v1Tag() */ ID3v1::Tag *ID3v1Tag(bool create = false); /*! * Returns a pointer to the APE tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid APE tag. If \a create is true it will create * an APE tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an APE tag. Use hasAPETag() to check if the file * on disk actually has an APE tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasAPETag() */ APE::Tag *APETag(bool create = false); /*! * This will strip the tags that match the OR-ed together TagTypes from the * file. By default it strips all tags. It returns true if the tags are * successfully stripped. * * This is equivalent to strip(tags, true) * * \note This will also invalidate pointers to the ID3 and APE tags * as their memory will be freed. * * \note This will update the file immediately. */ bool strip(int tags = AllTags); /*! * This will strip the tags that match the OR-ed together TagTypes from the * file. By default it strips all tags. It returns true if the tags are * successfully stripped. * * If \a freeMemory is true the ID3 and APE tags will be deleted and * pointers to them will be invalidated. * * \note This will update the file immediately. */ // BIC: merge with the method above bool strip(int tags, bool freeMemory); /*! * Set the ID3v2::FrameFactory to something other than the default. * * \see ID3v2FrameFactory * \deprecated This value should be passed in via the constructor. */ TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); /*! * Returns the position in the file of the first MPEG frame. */ long firstFrameOffset(); /*! * Returns the position in the file of the next MPEG frame, * using the current position as start */ long nextFrameOffset(long position); /*! * Returns the position in the file of the previous MPEG frame, * using the current position as start */ long previousFrameOffset(long position); /*! * Returns the position in the file of the last MPEG frame. */ long lastFrameOffset(); /*! * Returns whether or not the file on disk actually has an ID3v1 tag. * * \see ID3v1Tag() */ bool hasID3v1Tag() const; /*! * Returns whether or not the file on disk actually has an ID3v2 tag. * * \see ID3v2Tag() */ bool hasID3v2Tag() const; /*! * Returns whether or not the file on disk actually has an APE tag. * * \see APETag() */ bool hasAPETag() const; /*! * Returns whether or not the given \a stream can be opened as an MPEG * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); long findID3v2(); class FilePrivate; FilePrivate *d; }; } // namespace MPEG } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/mpegheader.cpp������������������������������������������������������������0000664�0000000�0000000�00000020650�14447736377�0020067�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tstring.h> #include <tfile.h> #include <tdebug.h> #include <trefcounter.h> #include "mpegheader.h" #include "mpegutils.h" using namespace TagLib; class MPEG::Header::HeaderPrivate : public RefCounter { public: HeaderPrivate() : isValid(false), version(Version1), layer(0), protectionEnabled(false), bitrate(0), sampleRate(0), isPadded(false), channelMode(Stereo), isCopyrighted(false), isOriginal(false), frameLength(0), samplesPerFrame(0) {} bool isValid; Version version; int layer; bool protectionEnabled; int bitrate; int sampleRate; bool isPadded; ChannelMode channelMode; bool isCopyrighted; bool isOriginal; int frameLength; int samplesPerFrame; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// MPEG::Header::Header(const ByteVector &data) : d(new HeaderPrivate()) { debug("MPEG::Header::Header() - This constructor is no longer used."); } MPEG::Header::Header(File *file, long offset, bool checkLength) : d(new HeaderPrivate()) { parse(file, offset, checkLength); } MPEG::Header::Header(const Header &h) : d(h.d) { d->ref(); } MPEG::Header::~Header() { if(d->deref()) delete d; } bool MPEG::Header::isValid() const { return d->isValid; } MPEG::Header::Version MPEG::Header::version() const { return d->version; } int MPEG::Header::layer() const { return d->layer; } bool MPEG::Header::protectionEnabled() const { return d->protectionEnabled; } int MPEG::Header::bitrate() const { return d->bitrate; } int MPEG::Header::sampleRate() const { return d->sampleRate; } bool MPEG::Header::isPadded() const { return d->isPadded; } MPEG::Header::ChannelMode MPEG::Header::channelMode() const { return d->channelMode; } bool MPEG::Header::isCopyrighted() const { return d->isCopyrighted; } bool MPEG::Header::isOriginal() const { return d->isOriginal; } int MPEG::Header::frameLength() const { return d->frameLength; } int MPEG::Header::samplesPerFrame() const { return d->samplesPerFrame; } MPEG::Header &MPEG::Header::operator=(const Header &h) { if(&h == this) return *this; if(d->deref()) delete d; d = h.d; d->ref(); return *this; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void MPEG::Header::parse(File *file, long offset, bool checkLength) { file->seek(offset); const ByteVector data = file->readBlock(4); if(data.size() < 4) { debug("MPEG::Header::parse() -- data is too short for an MPEG frame header."); return; } // Check for the MPEG synch bytes. if(!isFrameSync(data)) { debug("MPEG::Header::parse() -- MPEG header did not match MPEG synch."); return; } // Set the MPEG version const int versionBits = (static_cast<unsigned char>(data[1]) >> 3) & 0x03; if(versionBits == 0) d->version = Version2_5; else if(versionBits == 2) d->version = Version2; else if(versionBits == 3) d->version = Version1; else return; // Set the MPEG layer const int layerBits = (static_cast<unsigned char>(data[1]) >> 1) & 0x03; if(layerBits == 1) d->layer = 3; else if(layerBits == 2) d->layer = 2; else if(layerBits == 3) d->layer = 1; else return; d->protectionEnabled = (static_cast<unsigned char>(data[1] & 0x01) == 0); // Set the bitrate static const int bitrates[2][3][16] = { { // Version 1 { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0 }, // layer 1 { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0 }, // layer 2 { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0 } // layer 3 }, { // Version 2 or 2.5 { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 0 }, // layer 1 { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 }, // layer 2 { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, 0 } // layer 3 } }; const int versionIndex = (d->version == Version1) ? 0 : 1; const int layerIndex = (d->layer > 0) ? d->layer - 1 : 0; // The bitrate index is encoded as the first 4 bits of the 3rd byte, // i.e. 1111xxxx const int bitrateIndex = (static_cast<unsigned char>(data[2]) >> 4) & 0x0F; d->bitrate = bitrates[versionIndex][layerIndex][bitrateIndex]; if(d->bitrate == 0) return; // Set the sample rate static const int sampleRates[3][4] = { { 44100, 48000, 32000, 0 }, // Version 1 { 22050, 24000, 16000, 0 }, // Version 2 { 11025, 12000, 8000, 0 } // Version 2.5 }; // The sample rate index is encoded as two bits in the 3nd byte, i.e. xxxx11xx const int samplerateIndex = (static_cast<unsigned char>(data[2]) >> 2) & 0x03; d->sampleRate = sampleRates[d->version][samplerateIndex]; if(d->sampleRate == 0) { return; } // The channel mode is encoded as a 2 bit value at the end of the 3nd byte, // i.e. xxxxxx11 d->channelMode = static_cast<ChannelMode>((static_cast<unsigned char>(data[3]) >> 6) & 0x03); // TODO: Add mode extension for completeness d->isOriginal = ((static_cast<unsigned char>(data[3]) & 0x04) != 0); d->isCopyrighted = ((static_cast<unsigned char>(data[3]) & 0x08) != 0); d->isPadded = ((static_cast<unsigned char>(data[2]) & 0x02) != 0); // Samples per frame static const int samplesPerFrame[3][2] = { // MPEG1, 2/2.5 { 384, 384 }, // Layer I { 1152, 1152 }, // Layer II { 1152, 576 } // Layer III }; d->samplesPerFrame = samplesPerFrame[layerIndex][versionIndex]; // Calculate the frame length static const int paddingSize[3] = { 4, 1, 1 }; d->frameLength = d->samplesPerFrame * d->bitrate * 125 / d->sampleRate; if(d->isPadded) d->frameLength += paddingSize[layerIndex]; if(checkLength) { // Check if the frame length has been calculated correctly, or the next frame // header is right next to the end of this frame. // The MPEG versions, layers and sample rates of the two frames should be // consistent. Otherwise, we assume that either or both of the frames are // broken. file->seek(offset + d->frameLength); const ByteVector nextData = file->readBlock(4); if(nextData.size() < 4) return; const unsigned int HeaderMask = 0xfffe0c00; const unsigned int header = data.toUInt(0, true) & HeaderMask; const unsigned int nextHeader = nextData.toUInt(0, true) & HeaderMask; if(header != nextHeader) return; } // Now that we're done parsing, set this to be a valid frame. d->isValid = true; } ����������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/mpegheader.h��������������������������������������������������������������0000664�0000000�0000000�00000012031�14447736377�0017526�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MPEGHEADER_H #define TAGLIB_MPEGHEADER_H #include "taglib_export.h" namespace TagLib { class ByteVector; class File; namespace MPEG { //! An implementation of MP3 frame headers /*! * This is an implementation of MPEG Layer III headers. The API follows more * or less the binary format of these headers. I've used * <a href="http://www.mp3-tech.org/programmer/frame_header.html">this</a> * document as a reference. */ class TAGLIB_EXPORT Header { public: /*! * Parses an MPEG header based on \a data. * * \deprecated Use Header(File *, long, bool). */ TAGLIB_DEPRECATED Header(const ByteVector &data); /*! * Parses an MPEG header based on \a file and \a offset. * * \note If \a checkLength is true, this requires the next MPEG frame to * check if the frame length is parsed and calculated correctly. So it's * suitable for seeking for the first valid frame. */ Header(File *file, long offset, bool checkLength = true); /*! * Does a shallow copy of \a h. */ Header(const Header &h); /*! * Destroys this Header instance. */ virtual ~Header(); /*! * Returns true if the frame is at least an appropriate size and has * legal values. */ bool isValid() const; /*! * The MPEG Version. */ enum Version { //! MPEG Version 1 Version1 = 0, //! MPEG Version 2 Version2 = 1, //! MPEG Version 2.5 Version2_5 = 2 }; /*! * Returns the MPEG Version of the header. */ Version version() const; /*! * Returns the layer version. This will be between the values 1-3. */ int layer() const; /*! * Returns true if the MPEG protection bit is enabled. */ bool protectionEnabled() const; /*! * Returns the bitrate encoded in the header. */ int bitrate() const; /*! * Returns the sample rate in Hz. */ int sampleRate() const; /*! * Returns true if the frame is padded. */ bool isPadded() const; /*! * There are a few combinations or one or two channel audio that are * possible: */ enum ChannelMode { //! Stereo Stereo = 0, //! Stereo JointStereo = 1, //! Dual Mono DualChannel = 2, //! Mono SingleChannel = 3 }; /*! * Returns the channel mode for this frame. */ ChannelMode channelMode() const; /*! * Returns true if the copyrighted bit is set. */ bool isCopyrighted() const; /*! * Returns true if the "original" bit is set. */ bool isOriginal() const; /*! * Returns the frame length in bytes. */ int frameLength() const; /*! * Returns the number of frames per sample. */ int samplesPerFrame() const; /*! * Makes a shallow copy of the header. */ Header &operator=(const Header &h); private: void parse(File *file, long offset, bool checkLength); class HeaderPrivate; HeaderPrivate *d; }; } // namespace MPEG } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/mpegproperties.cpp��������������������������������������������������������0000664�0000000�0000000�00000014461�14447736377�0021036�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tstring.h> #include "mpegproperties.h" #include "mpegfile.h" #include "xingheader.h" #include "apetag.h" #include "apefooter.h" using namespace TagLib; class MPEG::Properties::PropertiesPrivate { public: PropertiesPrivate() : xingHeader(0), length(0), bitrate(0), sampleRate(0), channels(0), layer(0), version(Header::Version1), channelMode(Header::Stereo), protectionEnabled(false), isCopyrighted(false), isOriginal(false) {} ~PropertiesPrivate() { delete xingHeader; } XingHeader *xingHeader; int length; int bitrate; int sampleRate; int channels; int layer; Header::Version version; Header::ChannelMode channelMode; bool protectionEnabled; bool isCopyrighted; bool isOriginal; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// MPEG::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(file); } MPEG::Properties::~Properties() { delete d; } int MPEG::Properties::length() const { return lengthInSeconds(); } int MPEG::Properties::lengthInSeconds() const { return d->length / 1000; } int MPEG::Properties::lengthInMilliseconds() const { return d->length; } int MPEG::Properties::bitrate() const { return d->bitrate; } int MPEG::Properties::sampleRate() const { return d->sampleRate; } int MPEG::Properties::channels() const { return d->channels; } const MPEG::XingHeader *MPEG::Properties::xingHeader() const { return d->xingHeader; } MPEG::Header::Version MPEG::Properties::version() const { return d->version; } int MPEG::Properties::layer() const { return d->layer; } bool MPEG::Properties::protectionEnabled() const { return d->protectionEnabled; } MPEG::Header::ChannelMode MPEG::Properties::channelMode() const { return d->channelMode; } bool MPEG::Properties::isCopyrighted() const { return d->isCopyrighted; } bool MPEG::Properties::isOriginal() const { return d->isOriginal; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void MPEG::Properties::read(File *file) { // Only the first valid frame is required if we have a VBR header. const long firstFrameOffset = file->firstFrameOffset(); if(firstFrameOffset < 0) { debug("MPEG::Properties::read() -- Could not find an MPEG frame in the stream."); return; } const Header firstHeader(file, firstFrameOffset, false); // Check for a VBR header that will help us in gathering information about a // VBR stream. file->seek(firstFrameOffset); d->xingHeader = new XingHeader(file->readBlock(firstHeader.frameLength())); if(!d->xingHeader->isValid()) { delete d->xingHeader; d->xingHeader = 0; } if(d->xingHeader && firstHeader.samplesPerFrame() > 0 && firstHeader.sampleRate() > 0) { // Read the length and the bitrate from the VBR header. const double timePerFrame = firstHeader.samplesPerFrame() * 1000.0 / firstHeader.sampleRate(); const double length = timePerFrame * d->xingHeader->totalFrames(); d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(d->xingHeader->totalSize() * 8.0 / length + 0.5); } else if(firstHeader.bitrate() > 0) { // Since there was no valid VBR header found, we hope that we're in a constant // bitrate file. // TODO: Make this more robust with audio property detection for VBR without a // Xing header. d->bitrate = firstHeader.bitrate(); // Look for the last MPEG audio frame to calculate the stream length. const long lastFrameOffset = file->lastFrameOffset(); if(lastFrameOffset < 0) { debug("MPEG::Properties::read() -- Could not find an MPEG frame in the stream."); } else { const Header lastHeader(file, lastFrameOffset, false); const long streamLength = lastFrameOffset - firstFrameOffset + lastHeader.frameLength(); if (streamLength > 0) d->length = static_cast<int>(streamLength * 8.0 / d->bitrate + 0.5); } } d->sampleRate = firstHeader.sampleRate(); d->channels = firstHeader.channelMode() == Header::SingleChannel ? 1 : 2; d->version = firstHeader.version(); d->layer = firstHeader.layer(); d->protectionEnabled = firstHeader.protectionEnabled(); d->channelMode = firstHeader.channelMode(); d->isCopyrighted = firstHeader.isCopyrighted(); d->isOriginal = firstHeader.isOriginal(); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/mpegproperties.h����������������������������������������������������������0000664�0000000�0000000�00000011071�14447736377�0020475�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MPEGPROPERTIES_H #define TAGLIB_MPEGPROPERTIES_H #include "taglib_export.h" #include "audioproperties.h" #include "mpegheader.h" namespace TagLib { namespace MPEG { class File; class XingHeader; //! An implementation of audio property reading for MP3 /*! * This reads the data from an MPEG Layer III stream found in the * AudioProperties API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of MPEG::Properties with the data read from the * MPEG::File \a file. */ Properties(File *file, ReadStyle style = Average); /*! * Destroys this MPEG Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns a pointer to the Xing/VBRI header if one exists or null if no * Xing/VBRI header was found. */ const XingHeader *xingHeader() const; /*! * Returns the MPEG Version of the file. */ Header::Version version() const; /*! * Returns the layer version. This will be between the values 1-3. */ int layer() const; /*! * Returns true if the MPEG protection bit is enabled. */ bool protectionEnabled() const; /*! * Returns the channel mode for this frame. */ Header::ChannelMode channelMode() const; /*! * Returns true if the copyrighted bit is set. */ bool isCopyrighted() const; /*! * Returns true if the "original" bit is set. */ bool isOriginal() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(File *file); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace MPEG } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/mpegutils.h���������������������������������������������������������������0000664�0000000�0000000�00000005317�14447736377�0017447�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MPEGUTILS_H #define TAGLIB_MPEGUTILS_H // THIS FILE IS NOT A PART OF THE TAGLIB API #ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header namespace TagLib { namespace MPEG { namespace { /*! * MPEG frames can be recognized by the bit pattern 11111111 111, so the * first byte is easy to check for, however checking to see if the second byte * starts with \e 111 is a bit more tricky, hence these functions. * * \note This does not check the length of the vector, since this is an * internal utility function. */ inline bool isFrameSync(const ByteVector &bytes, unsigned int offset = 0) { // 0xFF in the second byte is possible in theory, but it's very unlikely. const unsigned char b1 = bytes[offset + 0]; const unsigned char b2 = bytes[offset + 1]; return (b1 == 0xFF && b2 != 0xFF && (b2 & 0xE0) == 0xE0); } } // namespace } // namespace MPEG } // namespace TagLib #endif #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/xingheader.cpp������������������������������������������������������������0000664�0000000�0000000�00000010227�14447736377�0020103�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2003 by Ismael Orenstein email : orenstein@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tstring.h> #include <tdebug.h> #include "xingheader.h" #include "mpegfile.h" using namespace TagLib; class MPEG::XingHeader::XingHeaderPrivate { public: XingHeaderPrivate() : frames(0), size(0), type(MPEG::XingHeader::Invalid) {} unsigned int frames; unsigned int size; MPEG::XingHeader::HeaderType type; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// MPEG::XingHeader::XingHeader(const ByteVector &data) : d(new XingHeaderPrivate()) { parse(data); } MPEG::XingHeader::~XingHeader() { delete d; } bool MPEG::XingHeader::isValid() const { return (d->type != Invalid && d->frames > 0 && d->size > 0); } unsigned int MPEG::XingHeader::totalFrames() const { return d->frames; } unsigned int MPEG::XingHeader::totalSize() const { return d->size; } MPEG::XingHeader::HeaderType MPEG::XingHeader::type() const { return d->type; } int MPEG::XingHeader::xingHeaderOffset(TagLib::MPEG::Header::Version /*v*/, TagLib::MPEG::Header::ChannelMode /*c*/) { return 0; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void MPEG::XingHeader::parse(const ByteVector &data) { // Look for a Xing header. long offset = data.find("Xing"); if(offset < 0) offset = data.find("Info"); if(offset >= 0) { // Xing header found. if(data.size() < static_cast<unsigned long>(offset + 16)) { debug("MPEG::XingHeader::parse() -- Xing header found but too short."); return; } if((data[offset + 7] & 0x03) != 0x03) { debug("MPEG::XingHeader::parse() -- Xing header doesn't contain the required information."); return; } d->frames = data.toUInt(offset + 8, true); d->size = data.toUInt(offset + 12, true); d->type = Xing; } else { // Xing header not found. Then look for a VBRI header. offset = data.find("VBRI"); if(offset >= 0) { // VBRI header found. if(data.size() < static_cast<unsigned long>(offset + 32)) { debug("MPEG::XingHeader::parse() -- VBRI header found but too short."); return; } d->frames = data.toUInt(offset + 14, true); d->size = data.toUInt(offset + 10, true); d->type = VBRI; } } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/mpeg/xingheader.h��������������������������������������������������������������0000664�0000000�0000000�00000010232�14447736377�0017544�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2003 by Ismael Orenstein email : orenstein@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_XINGHEADER_H #define TAGLIB_XINGHEADER_H #include "mpegheader.h" #include "taglib_export.h" namespace TagLib { class ByteVector; namespace MPEG { class File; //! An implementation of the Xing/VBRI headers /*! * This is a minimalistic implementation of the Xing/VBRI VBR headers. * Xing/VBRI headers are often added to VBR (variable bit rate) MP3 streams * to make it easy to compute the length and quality of a VBR stream. Our * implementation is only concerned with the total size of the stream (so * that we can calculate the total playing time and the average bitrate). * It uses <a href="http://home.pcisys.net/~melanson/codecs/mp3extensions.txt"> * this text</a> and the XMMS sources as references. */ class TAGLIB_EXPORT XingHeader { public: /*! * The type of the VBR header. */ enum HeaderType { /*! * Invalid header or no VBR header found. */ Invalid = 0, /*! * Xing header. */ Xing = 1, /*! * VBRI header. */ VBRI = 2, }; /*! * Parses an Xing/VBRI header based on \a data which contains the entire * first MPEG frame. */ XingHeader(const ByteVector &data); /*! * Destroy this XingHeader instance. */ virtual ~XingHeader(); /*! * Returns true if the data was parsed properly and if there is a valid * Xing/VBRI header present. */ bool isValid() const; /*! * Returns the total number of frames. */ unsigned int totalFrames() const; /*! * Returns the total size of stream in bytes. */ unsigned int totalSize() const; /*! * Returns the type of the VBR header. */ HeaderType type() const; /*! * Returns the offset for the start of this Xing header, given the * version and channels of the frame * * \deprecated Always returns 0. */ TAGLIB_DEPRECATED static int xingHeaderOffset(TagLib::MPEG::Header::Version v, TagLib::MPEG::Header::ChannelMode c); private: XingHeader(const XingHeader &); XingHeader &operator=(const XingHeader &); void parse(const ByteVector &data); class XingHeaderPrivate; XingHeaderPrivate *d; }; } // namespace MPEG } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/���������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015103�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/flac/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016010�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/flac/oggflacfile.cpp�������������������������������������������������������0000664�0000000�0000000�00000020176�14447736377�0020764�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004-2005 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tstring.h> #include <tdebug.h> #include <tpropertymap.h> #include <tagutils.h> #include <xiphcomment.h> #include "oggflacfile.h" using namespace TagLib; using TagLib::FLAC::Properties; class Ogg::FLAC::File::FilePrivate { public: FilePrivate() : comment(0), properties(0), streamStart(0), streamLength(0), scanned(false), hasXiphComment(false), commentPacket(0) {} ~FilePrivate() { delete comment; delete properties; } Ogg::XiphComment *comment; Properties *properties; ByteVector streamInfoData; ByteVector xiphCommentData; long streamStart; long streamLength; bool scanned; bool hasXiphComment; int commentPacket; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool Ogg::FLAC::File::isSupported(IOStream *stream) { // An Ogg FLAC file has IDs "OggS" and "fLaC" somewhere. const ByteVector buffer = Utils::readHeader(stream, bufferSize(), false); return (buffer.find("OggS") >= 0 && buffer.find("fLaC") >= 0); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Ogg::FLAC::File::File(FileName file, bool readProperties, Properties::ReadStyle propertiesStyle) : Ogg::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties, propertiesStyle); } Ogg::FLAC::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle propertiesStyle) : Ogg::File(stream), d(new FilePrivate()) { if(isOpen()) read(readProperties, propertiesStyle); } Ogg::FLAC::File::~File() { delete d; } Ogg::XiphComment *Ogg::FLAC::File::tag() const { return d->comment; } PropertyMap Ogg::FLAC::File::properties() const { return d->comment->properties(); } PropertyMap Ogg::FLAC::File::setProperties(const PropertyMap &properties) { return d->comment->setProperties(properties); } Properties *Ogg::FLAC::File::audioProperties() const { return d->properties; } bool Ogg::FLAC::File::save() { d->xiphCommentData = d->comment->render(false); // Create FLAC metadata-block: // Put the size in the first 32 bit (I assume no more than 24 bit are used) ByteVector v = ByteVector::fromUInt(d->xiphCommentData.size()); // Set the type of the metadata-block to be a Xiph / Vorbis comment v[0] = 4; // Append the comment-data after the 32 bit header v.append(d->xiphCommentData); // Save the packet at the old spot // FIXME: Use padding if size is increasing setPacket(d->commentPacket, v); return Ogg::File::save(); } bool Ogg::FLAC::File::hasXiphComment() const { return d->hasXiphComment; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void Ogg::FLAC::File::read(bool readProperties, Properties::ReadStyle propertiesStyle) { // Sanity: Check if we really have an Ogg/FLAC file /* ByteVector oggHeader = packet(0); if (oggHeader.mid(28,4) != "fLaC") { debug("Ogg::FLAC::File::read() -- Not an Ogg/FLAC file"); setValid(false); return; }*/ // Look for FLAC metadata, including vorbis comments scan(); if (!d->scanned) { setValid(false); return; } if(d->hasXiphComment) d->comment = new Ogg::XiphComment(xiphCommentData()); else d->comment = new Ogg::XiphComment(); if(readProperties) d->properties = new Properties(streamInfoData(), streamLength(), propertiesStyle); } ByteVector Ogg::FLAC::File::streamInfoData() { scan(); return d->streamInfoData; } ByteVector Ogg::FLAC::File::xiphCommentData() { scan(); return d->xiphCommentData; } long Ogg::FLAC::File::streamLength() { scan(); return d->streamLength; } void Ogg::FLAC::File::scan() { // Scan the metadata pages if(d->scanned) return; if(!isValid()) return; int ipacket = 0; long overhead = 0; ByteVector metadataHeader = packet(ipacket); if(metadataHeader.isEmpty()) return; if(!metadataHeader.startsWith("fLaC")) { // FLAC 1.1.2+ // See https://xiph.org/flac/ogg_mapping.html for the header specification. if(metadataHeader.size() < 13) return; if(metadataHeader[0] != 0x7f) return; if(metadataHeader.mid(1, 4) != "FLAC") return; if(metadataHeader[5] != 1 && metadataHeader[6] != 0) return; // not version 1.0 if(metadataHeader.mid(9, 4) != "fLaC") return; metadataHeader = metadataHeader.mid(13); } else { // FLAC 1.1.0 & 1.1.1 metadataHeader = packet(++ipacket); } ByteVector header = metadataHeader.mid(0, 4); if(header.size() != 4) { debug("Ogg::FLAC::File::scan() -- Invalid Ogg/FLAC metadata header"); return; } // Header format (from spec): // <1> Last-metadata-block flag // <7> BLOCK_TYPE // 0 : STREAMINFO // 1 : PADDING // .. // 4 : VORBIS_COMMENT // .. // <24> Length of metadata to follow char blockType = header[0] & 0x7f; bool lastBlock = (header[0] & 0x80) != 0; unsigned int length = header.toUInt(1, 3, true); overhead += length; // Sanity: First block should be the stream_info metadata if(blockType != 0) { debug("Ogg::FLAC::File::scan() -- Invalid Ogg/FLAC stream"); return; } d->streamInfoData = metadataHeader.mid(4, length); // Search through the remaining metadata while(!lastBlock) { metadataHeader = packet(++ipacket); header = metadataHeader.mid(0, 4); if(header.size() != 4) { debug("Ogg::FLAC::File::scan() -- Invalid Ogg/FLAC metadata header"); return; } blockType = header[0] & 0x7f; lastBlock = (header[0] & 0x80) != 0; length = header.toUInt(1, 3, true); overhead += length; if(blockType == 1) { // debug("Ogg::FLAC::File::scan() -- Padding found"); } else if(blockType == 4) { // debug("Ogg::FLAC::File::scan() -- Vorbis-comments found"); d->xiphCommentData = metadataHeader.mid(4, length); d->hasXiphComment = true; d->commentPacket = ipacket; } else if(blockType > 5) { debug("Ogg::FLAC::File::scan() -- Unknown metadata block"); } } // End of metadata, now comes the datastream d->streamStart = overhead; d->streamLength = File::length() - d->streamStart; d->scanned = true; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/flac/oggflacfile.h���������������������������������������������������������0000664�0000000�0000000�00000013656�14447736377�0020436�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_OGGFLACFILE_H #define TAGLIB_OGGFLACFILE_H #include "taglib_export.h" #include "oggfile.h" #include "xiphcomment.h" #include "flacproperties.h" namespace TagLib { class Tag; namespace Ogg { //! An implementation of Ogg FLAC metadata /*! * This is implementation of FLAC metadata for Ogg FLAC files. For "pure" * FLAC files look under the FLAC hierarchy. * * Unlike "pure" FLAC-files, Ogg FLAC only supports Xiph-comments, * while the audio-properties are the same. */ namespace FLAC { using TagLib::FLAC::Properties; //! An implementation of TagLib::File with Ogg/FLAC specific methods /*! * This implements and provides an interface for Ogg/FLAC files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to Ogg FLAC files. */ class TAGLIB_EXPORT File : public Ogg::File { public: /*! * Constructs an Ogg/FLAC file from \a file. If \a readProperties is true * the file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an Ogg/FLAC file from \a stream. If \a readProperties is true * the file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the Tag for this file. This will always be a XiphComment. * * \note This always returns a valid pointer regardless of whether or not * the file on disk has a XiphComment. Use hasXiphComment() to check if * the file on disk actually has a XiphComment. * * \note The Tag <b>is still</b> owned by the FLAC::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasXiphComment() */ virtual XiphComment *tag() const; /*! * Returns the FLAC::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Implements the unified property interface -- export function. * This forwards directly to XiphComment::properties(). */ PropertyMap properties() const; /*! * Implements the unified tag dictionary interface -- import function. * Like properties(), this is a forwarder to the file's XiphComment. */ PropertyMap setProperties(const PropertyMap &); /*! * Save the file. This will primarily save and update the XiphComment. * Returns true if the save is successful. */ virtual bool save(); /*! * Returns the length of the audio-stream, used by FLAC::Properties for * calculating the bitrate. */ long streamLength(); /*! * Returns whether or not the file on disk actually has a XiphComment. * * \see tag() */ bool hasXiphComment() const; /*! * Check if the given \a stream can be opened as an Ogg FLAC file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties, Properties::ReadStyle propertiesStyle); void scan(); ByteVector streamInfoData(); ByteVector xiphCommentData(); class FilePrivate; FilePrivate *d; }; } // namespace FLAC } // namespace Ogg } // namespace TagLib #endif ����������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/oggfile.cpp����������������������������������������������������������������0000664�0000000�0000000�00000022057�14447736377�0017231�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevectorlist.h> #include <tmap.h> #include <tstring.h> #include <tdebug.h> #include "oggfile.h" #include "oggpage.h" #include "oggpageheader.h" using namespace TagLib; namespace { // Returns the first packet index of the right next page to the given one. unsigned int nextPacketIndex(const Ogg::Page *page) { if(page->header()->lastPacketCompleted()) return page->firstPacketIndex() + page->packetCount(); return page->firstPacketIndex() + page->packetCount() - 1; } } // namespace class Ogg::File::FilePrivate { public: FilePrivate() : firstPageHeader(0), lastPageHeader(0) { pages.setAutoDelete(true); } ~FilePrivate() { delete firstPageHeader; delete lastPageHeader; } unsigned int streamSerialNumber; List<Page *> pages; PageHeader *firstPageHeader; PageHeader *lastPageHeader; Map<unsigned int, ByteVector> dirtyPackets; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Ogg::File::~File() { delete d; } ByteVector Ogg::File::packet(unsigned int i) { // Check to see if we're called setPacket() for this packet since the last // save: if(d->dirtyPackets.contains(i)) return d->dirtyPackets[i]; // If we haven't indexed the page where the packet we're interested in starts, // begin reading pages until we have. if(!readPages(i)) { debug("Ogg::File::packet() -- Could not find the requested packet."); return ByteVector(); } // Look for the first page in which the requested packet starts. List<Page *>::ConstIterator it = d->pages.begin(); while((*it)->containsPacket(i) == Page::DoesNotContainPacket) ++it; // If the packet is completely contained in the first page that it's in. // If the packet is *not* completely contained in the first page that it's a // part of then that packet trails off the end of the page. Continue appending // the pages' packet data until we hit a page that either does not end with the // packet that we're fetching or where the last packet is complete. ByteVector packet = (*it)->packets()[i - (*it)->firstPacketIndex()]; while(nextPacketIndex(*it) <= i) { ++it; packet.append((*it)->packets().front()); } return packet; } void Ogg::File::setPacket(unsigned int i, const ByteVector &p) { if(!readPages(i)) { debug("Ogg::File::setPacket() -- Could not set the requested packet."); return; } d->dirtyPackets[i] = p; } const Ogg::PageHeader *Ogg::File::firstPageHeader() { if(!d->firstPageHeader) { const long firstPageHeaderOffset = find("OggS"); if(firstPageHeaderOffset < 0) return 0; d->firstPageHeader = new PageHeader(this, firstPageHeaderOffset); } return d->firstPageHeader->isValid() ? d->firstPageHeader : 0; } const Ogg::PageHeader *Ogg::File::lastPageHeader() { if(!d->lastPageHeader) { const long lastPageHeaderOffset = rfind("OggS"); if(lastPageHeaderOffset < 0) return 0; d->lastPageHeader = new PageHeader(this, lastPageHeaderOffset); } return d->lastPageHeader->isValid() ? d->lastPageHeader : 0; } bool Ogg::File::save() { if(readOnly()) { debug("Ogg::File::save() - Cannot save to a read only file."); return false; } Map<unsigned int, ByteVector>::ConstIterator it; for(it = d->dirtyPackets.begin(); it != d->dirtyPackets.end(); ++it) writePacket(it->first, it->second); d->dirtyPackets.clear(); return true; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// Ogg::File::File(FileName file) : TagLib::File(file), d(new FilePrivate()) { } Ogg::File::File(IOStream *stream) : TagLib::File(stream), d(new FilePrivate()) { } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// bool Ogg::File::readPages(unsigned int i) { while(true) { unsigned int packetIndex; long offset; if(d->pages.isEmpty()) { packetIndex = 0; offset = find("OggS"); if(offset < 0) return false; } else { const Page *page = d->pages.back(); packetIndex = nextPacketIndex(page); offset = page->fileOffset() + page->size(); } // Enough pages have been fetched. if(packetIndex > i) return true; // Read the next page and add it to the page list. Page *nextPage = new Page(this, offset); if(!nextPage->header()->isValid()) { delete nextPage; return false; } nextPage->setFirstPacketIndex(packetIndex); d->pages.append(nextPage); if(nextPage->header()->lastPageOfStream()) return false; } } void Ogg::File::writePacket(unsigned int i, const ByteVector &packet) { if(!readPages(i)) { debug("Ogg::File::writePacket() -- Could not find the requested packet."); return; } // Look for the pages where the requested packet should belong to. List<Page *>::ConstIterator it = d->pages.begin(); while((*it)->containsPacket(i) == Page::DoesNotContainPacket) ++it; const Page *firstPage = *it; while(nextPacketIndex(*it) <= i) ++it; const Page *lastPage = *it; // Replace the requested packet and create new pages to replace the located pages. ByteVectorList packets = firstPage->packets(); packets[i - firstPage->firstPacketIndex()] = packet; if(firstPage != lastPage && lastPage->packetCount() > 1) { ByteVectorList lastPagePackets = lastPage->packets(); lastPagePackets.erase(lastPagePackets.begin()); packets.append(lastPagePackets); } // TODO: This pagination method isn't accurate for what's being done here. // This should account for real possibilities like non-aligned packets and such. List<Page *> pages = Page::paginate(packets, Page::SinglePagePerGroup, firstPage->header()->streamSerialNumber(), firstPage->pageSequenceNumber(), firstPage->header()->firstPacketContinued(), lastPage->header()->lastPacketCompleted()); pages.setAutoDelete(true); // Write the pages. ByteVector data; for(it = pages.begin(); it != pages.end(); ++it) data.append((*it)->render()); const unsigned long originalOffset = firstPage->fileOffset(); const unsigned long originalLength = lastPage->fileOffset() + lastPage->size() - originalOffset; insert(data, originalOffset, originalLength); // Renumber the following pages if the pages have been split or merged. const int numberOfNewPages = pages.back()->pageSequenceNumber() - lastPage->pageSequenceNumber(); if(numberOfNewPages != 0) { long pageOffset = originalOffset + data.size(); while(true) { Page page(this, pageOffset); if(!page.header()->isValid()) break; page.setPageSequenceNumber(page.pageSequenceNumber() + numberOfNewPages); const ByteVector data = page.render(); seek(pageOffset + 18); writeBlock(data.mid(18, 8)); if(page.header()->lastPageOfStream()) break; pageOffset += page.size(); } } // Discard all the pages to keep them up-to-date by fetching them again. d->pages.clear(); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/oggfile.h������������������������������������������������������������������0000664�0000000�0000000�00000010714�14447736377�0016673�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "taglib_export.h" #include "tfile.h" #include "tbytevectorlist.h" #ifndef TAGLIB_OGGFILE_H #define TAGLIB_OGGFILE_H namespace TagLib { //! A namespace for the classes used by Ogg-based metadata files namespace Ogg { class PageHeader; //! An implementation of TagLib::File with some helpers for Ogg based formats /*! * This is an implementation of Ogg file page and packet rendering and is of * use to Ogg based formats. While the API is small this handles the * non-trivial details of breaking up an Ogg stream into packets and makes * these available (via subclassing) to the codec meta data implementations. */ class TAGLIB_EXPORT File : public TagLib::File { public: virtual ~File(); /*! * Returns the packet contents for the i-th packet (starting from zero) * in the Ogg bitstream. * * \warning This requires reading at least the packet header for every page * up to the requested page. */ ByteVector packet(unsigned int i); /*! * Sets the packet with index \a i to the value \a p. */ void setPacket(unsigned int i, const ByteVector &p); /*! * Returns a pointer to the PageHeader for the first page in the stream or * null if the page could not be found. */ const PageHeader *firstPageHeader(); /*! * Returns a pointer to the PageHeader for the last page in the stream or * null if the page could not be found. */ const PageHeader *lastPageHeader(); virtual bool save(); protected: /*! * Constructs an Ogg file from \a file. * * \note This constructor is protected since Ogg::File shouldn't be * instantiated directly but rather should be used through the codec * specific subclasses. */ File(FileName file); /*! * Constructs an Ogg file from \a stream. * * \note This constructor is protected since Ogg::File shouldn't be * instantiated directly but rather should be used through the codec * specific subclasses. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. */ File(IOStream *stream); private: File(const File &); File &operator=(const File &); /*! * Reads the pages from the beginning of the file until enough to compose * the requested packet. */ bool readPages(unsigned int i); /*! * Writes the requested packet to the file. */ void writePacket(unsigned int i, const ByteVector &packet); class FilePrivate; FilePrivate *d; }; } // namespace Ogg } // namespace TagLib #endif ����������������������������������������������������taglib-1.13.1/taglib/ogg/oggpage.cpp����������������������������������������������������������������0000664�0000000�0000000�00000022647�14447736377�0017233�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <algorithm> #include <tstring.h> #include <tdebug.h> #include "oggpage.h" #include "oggpageheader.h" #include "oggfile.h" using namespace TagLib; class Ogg::Page::PagePrivate { public: PagePrivate(File *f = 0, long pageOffset = -1) : file(f), fileOffset(pageOffset), header(f, pageOffset), firstPacketIndex(-1) {} File *file; long fileOffset; PageHeader header; int firstPacketIndex; ByteVectorList packets; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Ogg::Page::Page(Ogg::File *file, long pageOffset) : d(new PagePrivate(file, pageOffset)) { } Ogg::Page::~Page() { delete d; } long Ogg::Page::fileOffset() const { return d->fileOffset; } const Ogg::PageHeader *Ogg::Page::header() const { return &d->header; } int Ogg::Page::pageSequenceNumber() const { return d->header.pageSequenceNumber(); } void Ogg::Page::setPageSequenceNumber(int sequenceNumber) { d->header.setPageSequenceNumber(sequenceNumber); } int Ogg::Page::firstPacketIndex() const { return d->firstPacketIndex; } void Ogg::Page::setFirstPacketIndex(int index) { d->firstPacketIndex = index; } Ogg::Page::ContainsPacketFlags Ogg::Page::containsPacket(int index) const { const int lastPacketIndex = d->firstPacketIndex + packetCount() - 1; if(index < d->firstPacketIndex || index > lastPacketIndex) return DoesNotContainPacket; ContainsPacketFlags flags = DoesNotContainPacket; if(index == d->firstPacketIndex) flags = static_cast<ContainsPacketFlags>(flags | BeginsWithPacket); if(index == lastPacketIndex) flags = static_cast<ContainsPacketFlags>(flags | EndsWithPacket); // If there's only one page and it's complete: if(packetCount() == 1 && !d->header.firstPacketContinued() && d->header.lastPacketCompleted()) { flags = static_cast<ContainsPacketFlags>(flags | CompletePacket); } // Or if there is more than one page and the page is // (a) the first page and it's complete or // (b) the last page and it's complete or // (c) a page in the middle. else if(packetCount() > 1 && ((flags & BeginsWithPacket && !d->header.firstPacketContinued()) || (flags & EndsWithPacket && d->header.lastPacketCompleted()) || (!(flags & BeginsWithPacket) && !(flags & EndsWithPacket)))) { flags = static_cast<ContainsPacketFlags>(flags | CompletePacket); } return flags; } unsigned int Ogg::Page::packetCount() const { return d->header.packetSizes().size(); } ByteVectorList Ogg::Page::packets() const { if(!d->packets.isEmpty()) return d->packets; ByteVectorList l; if(d->file && d->header.isValid()) { d->file->seek(d->fileOffset + d->header.size()); List<int> packetSizes = d->header.packetSizes(); List<int>::ConstIterator it = packetSizes.begin(); for(; it != packetSizes.end(); ++it) l.append(d->file->readBlock(*it)); } else debug("Ogg::Page::packets() -- attempting to read packets from an invalid page."); return l; } int Ogg::Page::size() const { return d->header.size() + d->header.dataSize(); } ByteVector Ogg::Page::render() const { ByteVector data; data.append(d->header.render()); if(d->packets.isEmpty()) { if(d->file) { d->file->seek(d->fileOffset + d->header.size()); data.append(d->file->readBlock(d->header.dataSize())); } else debug("Ogg::Page::render() -- this page is empty!"); } else { ByteVectorList::ConstIterator it = d->packets.begin(); for(; it != d->packets.end(); ++it) data.append(*it); } // Compute and set the checksum for the Ogg page. The checksum is taken over // the entire page with the 4 bytes reserved for the checksum zeroed and then // inserted in bytes 22-25 of the page header. const ByteVector checksum = ByteVector::fromUInt(data.checksum(), false); std::copy(checksum.begin(), checksum.end(), data.begin() + 22); return data; } List<Ogg::Page *> Ogg::Page::paginate(const ByteVectorList &packets, PaginationStrategy strategy, unsigned int streamSerialNumber, int firstPage, bool firstPacketContinued, bool lastPacketCompleted, bool containsLastPacket) { // SplitSize must be a multiple of 255 in order to get the lacing values right // create pages of about 8KB each static const unsigned int SplitSize = 32 * 255; // Force repagination if the segment table will exceed the size limit. if(strategy != Repaginate) { size_t tableSize = 0; for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) tableSize += it->size() / 255 + 1; if(tableSize > 255) strategy = Repaginate; } List<Page *> l; // Handle creation of multiple pages with appropriate pagination. if(strategy == Repaginate) { int pageIndex = firstPage; for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) { const bool lastPacketInList = (it == --packets.end()); // mark very first packet? bool continued = (firstPacketContinued && it == packets.begin()); unsigned int pos = 0; while(pos < it->size()) { const bool lastSplit = (pos + SplitSize >= it->size()); ByteVectorList packetList; packetList.append(it->mid(pos, SplitSize)); l.append(new Page(packetList, streamSerialNumber, pageIndex, continued, lastSplit && (lastPacketInList ? lastPacketCompleted : true), lastSplit && (containsLastPacket && lastPacketInList))); pageIndex++; continued = true; pos += SplitSize; } } } else { l.append(new Page(packets, streamSerialNumber, firstPage, firstPacketContinued, lastPacketCompleted, containsLastPacket)); } return l; } Ogg::Page* Ogg::Page::getCopyWithNewPageSequenceNumber(int /*sequenceNumber*/) { debug("Ogg::Page::getCopyWithNewPageSequenceNumber() -- This function is obsolete. Returning null."); return 0; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// Ogg::Page::Page(const ByteVectorList &packets, unsigned int streamSerialNumber, int pageNumber, bool firstPacketContinued, bool lastPacketCompleted, bool containsLastPacket) : d(new PagePrivate()) { d->header.setFirstPageOfStream(pageNumber == 0 && !firstPacketContinued); d->header.setLastPageOfStream(containsLastPacket); d->header.setFirstPacketContinued(firstPacketContinued); d->header.setLastPacketCompleted(lastPacketCompleted); d->header.setStreamSerialNumber(streamSerialNumber); d->header.setPageSequenceNumber(pageNumber); // Build a page from the list of packets. ByteVector data; List<int> packetSizes; for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) { packetSizes.append((*it).size()); data.append(*it); } d->packets = packets; d->header.setPacketSizes(packetSizes); // https://xiph.org/ogg/doc/framing.html, absolute granule position: // A special value of '-1' (in two's complement) indicates that no packets // finish on this page. if(!lastPacketCompleted && packets.size() <= 1) d->header.setAbsoluteGranularPosition(-1); } �����������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/oggpage.h������������������������������������������������������������������0000664�0000000�0000000�00000020151�14447736377�0016664�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_OGGPAGE_H #define TAGLIB_OGGPAGE_H #include "taglib_export.h" #include "tbytevectorlist.h" namespace TagLib { namespace Ogg { class File; class PageHeader; //! An implementation of Ogg pages /*! * This is an implementation of the pages that make up an Ogg stream. * This handles parsing pages and breaking them down into packets and handles * the details of packets spanning multiple pages and pages that contain * multiple packets. * * In most Xiph.org formats the comments are found in the first few packets, * this however is a reasonably complete implementation of Ogg pages that * could potentially be useful for non-meta data purposes. */ class TAGLIB_EXPORT Page { public: /*! * Read an Ogg page from the \a file at the position \a pageOffset. */ Page(File *file, long pageOffset); virtual ~Page(); /*! * Returns the page's position within the file (in bytes). */ long fileOffset() const; /*! * Returns a pointer to the header for this page. This pointer will become * invalid when the page is deleted. */ const PageHeader *header() const; /*! * Returns the index of the page within the Ogg stream. This helps make it * possible to determine if pages have been lost. * * \see setPageSequenceNumber() */ int pageSequenceNumber() const; /*! * Sets the page's position in the stream to \a sequenceNumber. * * \see pageSequenceNumber() */ void setPageSequenceNumber(int sequenceNumber); /*! * Returns a copy of the page with \a sequenceNumber set as sequence number. * * \see header() * \see PageHeader::setPageSequenceNumber() * * \deprecated Always returns null. */ TAGLIB_DEPRECATED Page *getCopyWithNewPageSequenceNumber(int sequenceNumber); /*! * Returns the index of the first packet wholly or partially contained in * this page. * * \see setFirstPacketIndex() */ int firstPacketIndex() const; /*! * Sets the index of the first packet in the page. * * \see firstPacketIndex() */ void setFirstPacketIndex(int index); /*! * When checking to see if a page contains a given packet this set of flags * represents the possible values for that packets status in the page. * * \see containsPacket() */ enum ContainsPacketFlags { //! No part of the packet is contained in the page DoesNotContainPacket = 0x0000, //! The packet is wholly contained in the page CompletePacket = 0x0001, //! The page starts with the given packet BeginsWithPacket = 0x0002, //! The page ends with the given packet EndsWithPacket = 0x0004 }; /*! * Checks to see if the specified \a packet is contained in the current * page. * * \see ContainsPacketFlags */ ContainsPacketFlags containsPacket(int index) const; /*! * Returns the number of packets (whole or partial) in this page. */ unsigned int packetCount() const; /*! * Returns a list of the packets in this page. * * \note Either or both the first and last packets may be only partial. * \see PageHeader::firstPacketContinued() */ ByteVectorList packets() const; /*! * Returns the size of the page in bytes. */ int size() const; ByteVector render() const; /*! * Defines a strategy for pagination, or grouping pages into Ogg packets, * for use with pagination methods. * * \note Yes, I'm aware that this is not a canonical "Strategy Pattern", * the term was simply convenient. */ enum PaginationStrategy { /*! * Attempt to put the specified set of packets into a single Ogg packet. * If the sum of the packet data is greater than will fit into a single * Ogg page -- 65280 bytes -- this will fall back to repagination using * the recommended page sizes. */ SinglePagePerGroup, /*! * Split the packet or group of packets into pages that conform to the * sizes recommended in the Ogg standard. */ Repaginate }; /*! * Pack \a packets into Ogg pages using the \a strategy for pagination. * The page number indicator inside of the rendered packets will start * with \a firstPage and be incremented for each page rendered. * \a containsLastPacket should be set to true if \a packets contains the * last page in the stream and will set the appropriate flag in the last * rendered Ogg page's header. \a streamSerialNumber should be set to * the serial number for this stream. * * \note The "absolute granule position" is currently always zeroed using * this method as this suffices for the comment headers. * * \warning The pages returned by this method must be deleted by the user. * You can use List<T>::setAutoDelete(true) to set these pages to be * automatically deleted when this list passes out of scope. * * \see PaginationStrategy * \see List::setAutoDelete() */ static List<Page *> paginate(const ByteVectorList &packets, PaginationStrategy strategy, unsigned int streamSerialNumber, int firstPage, bool firstPacketContinued = false, bool lastPacketCompleted = true, bool containsLastPacket = false); protected: /*! * Creates an Ogg packet based on the data in \a packets. The page number * for each page will be set to \a pageNumber. */ Page(const ByteVectorList &packets, unsigned int streamSerialNumber, int pageNumber, bool firstPacketContinued = false, bool lastPacketCompleted = true, bool containsLastPacket = false); private: Page(const Page &); Page &operator=(const Page &); class PagePrivate; PagePrivate *d; }; } // namespace Ogg } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/oggpageheader.cpp����������������������������������������������������������0000664�0000000�0000000�00000020300�14447736377�0020364�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <bitset> #include <tstring.h> #include <tdebug.h> #include <taglib.h> #include "oggpageheader.h" #include "oggfile.h" using namespace TagLib; class Ogg::PageHeader::PageHeaderPrivate { public: PageHeaderPrivate() : isValid(false), firstPacketContinued(false), lastPacketCompleted(false), firstPageOfStream(false), lastPageOfStream(false), absoluteGranularPosition(0), streamSerialNumber(0), pageSequenceNumber(-1), size(0), dataSize(0) {} bool isValid; List<int> packetSizes; bool firstPacketContinued; bool lastPacketCompleted; bool firstPageOfStream; bool lastPageOfStream; long long absoluteGranularPosition; unsigned int streamSerialNumber; int pageSequenceNumber; int size; int dataSize; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Ogg::PageHeader::PageHeader(Ogg::File *file, long pageOffset) : d(new PageHeaderPrivate()) { if(file && pageOffset >= 0) read(file, pageOffset); } Ogg::PageHeader::~PageHeader() { delete d; } bool Ogg::PageHeader::isValid() const { return d->isValid; } List<int> Ogg::PageHeader::packetSizes() const { return d->packetSizes; } void Ogg::PageHeader::setPacketSizes(const List<int> &sizes) { d->packetSizes = sizes; } bool Ogg::PageHeader::firstPacketContinued() const { return d->firstPacketContinued; } void Ogg::PageHeader::setFirstPacketContinued(bool continued) { d->firstPacketContinued = continued; } bool Ogg::PageHeader::lastPacketCompleted() const { return d->lastPacketCompleted; } void Ogg::PageHeader::setLastPacketCompleted(bool completed) { d->lastPacketCompleted = completed; } bool Ogg::PageHeader::firstPageOfStream() const { return d->firstPageOfStream; } void Ogg::PageHeader::setFirstPageOfStream(bool first) { d->firstPageOfStream = first; } bool Ogg::PageHeader::lastPageOfStream() const { return d->lastPageOfStream; } void Ogg::PageHeader::setLastPageOfStream(bool last) { d->lastPageOfStream = last; } long long Ogg::PageHeader::absoluteGranularPosition() const { return d->absoluteGranularPosition; } void Ogg::PageHeader::setAbsoluteGranularPosition(long long agp) { d->absoluteGranularPosition = agp; } int Ogg::PageHeader::pageSequenceNumber() const { return d->pageSequenceNumber; } void Ogg::PageHeader::setPageSequenceNumber(int sequenceNumber) { d->pageSequenceNumber = sequenceNumber; } unsigned int Ogg::PageHeader::streamSerialNumber() const { return d->streamSerialNumber; } void Ogg::PageHeader::setStreamSerialNumber(unsigned int n) { d->streamSerialNumber = n; } int Ogg::PageHeader::size() const { return d->size; } int Ogg::PageHeader::dataSize() const { return d->dataSize; } ByteVector Ogg::PageHeader::render() const { ByteVector data; // capture pattern data.append("OggS"); // stream structure version data.append(static_cast<char>(0)); // header type flag std::bitset<8> flags; flags[0] = d->firstPacketContinued; flags[1] = d->pageSequenceNumber == 0; flags[2] = d->lastPageOfStream; data.append(static_cast<char>(flags.to_ulong())); // absolute granular position data.append(ByteVector::fromLongLong(d->absoluteGranularPosition, false)); // stream serial number data.append(ByteVector::fromUInt(d->streamSerialNumber, false)); // page sequence number data.append(ByteVector::fromUInt(d->pageSequenceNumber, false)); // checksum -- this is left empty and should be filled in by the Ogg::Page // class data.append(ByteVector(4, 0)); // page segment count and page segment table ByteVector pageSegments = lacingValues(); data.append(static_cast<unsigned char>(pageSegments.size())); data.append(pageSegments); return data; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void Ogg::PageHeader::read(Ogg::File *file, long pageOffset) { file->seek(pageOffset); // An Ogg page header is at least 27 bytes, so we'll go ahead and read that // much and then get the rest when we're ready for it. const ByteVector data = file->readBlock(27); // Sanity check -- make sure that we were in fact able to read as much data as // we asked for and that the page begins with "OggS". if(data.size() != 27 || !data.startsWith("OggS")) { debug("Ogg::PageHeader::read() -- error reading page header"); return; } const std::bitset<8> flags(data[5]); d->firstPacketContinued = flags.test(0); d->firstPageOfStream = flags.test(1); d->lastPageOfStream = flags.test(2); d->absoluteGranularPosition = data.toLongLong(6, false); d->streamSerialNumber = data.toUInt(14, false); d->pageSequenceNumber = data.toUInt(18, false); // Byte number 27 is the number of page segments, which is the only variable // length portion of the page header. After reading the number of page // segments we'll then read in the corresponding data for this count. int pageSegmentCount = static_cast<unsigned char>(data[26]); const ByteVector pageSegments = file->readBlock(pageSegmentCount); // Another sanity check. if(pageSegmentCount < 1 || static_cast<int>(pageSegments.size()) != pageSegmentCount) return; // The base size of an Ogg page 27 bytes plus the number of lacing values. d->size = 27 + pageSegmentCount; int packetSize = 0; for(int i = 0; i < pageSegmentCount; i++) { d->dataSize += static_cast<unsigned char>(pageSegments[i]); packetSize += static_cast<unsigned char>(pageSegments[i]); if(static_cast<unsigned char>(pageSegments[i]) < 255) { d->packetSizes.append(packetSize); packetSize = 0; } } if(packetSize > 0) { d->packetSizes.append(packetSize); d->lastPacketCompleted = false; } else d->lastPacketCompleted = true; d->isValid = true; } ByteVector Ogg::PageHeader::lacingValues() const { ByteVector data; for(List<int>::ConstIterator it = d->packetSizes.begin(); it != d->packetSizes.end(); ++it) { // The size of a packet in an Ogg page is indicated by a series of "lacing // values" where the sum of the values is the packet size in bytes. Each of // these values is a byte. A value of less than 255 (0xff) indicates the end // of the packet. data.resize(data.size() + (*it / 255), '\xff'); if(it != --d->packetSizes.end() || d->lastPacketCompleted) data.append(static_cast<unsigned char>(*it % 255)); } return data; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/oggpageheader.h������������������������������������������������������������0000664�0000000�0000000�00000016756�14447736377�0020055�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_OGGPAGEHEADER_H #define TAGLIB_OGGPAGEHEADER_H #include "tlist.h" #include "tbytevector.h" #include "taglib_export.h" namespace TagLib { namespace Ogg { class File; //! An implementation of the page headers associated with each Ogg::Page /*! * This class implements Ogg page headers which contain the information * about Ogg pages needed to break them into packets which can be passed on * to the codecs. */ class TAGLIB_EXPORT PageHeader { public: /*! * Reads a PageHeader from \a file starting at \a pageOffset. The defaults * create a page with no (and as such, invalid) data that must be set * later. */ PageHeader(File *file = 0, long pageOffset = -1); /*! * Deletes this instance of the PageHeader. */ virtual ~PageHeader(); /*! * Returns true if the header parsed properly and is valid. */ bool isValid() const; /*! * Ogg pages contain a list of packets (which are used by the contained * codecs). The sizes of these pages is encoded in the page header. This * returns a list of the packet sizes in bytes. * * \see setPacketSizes() */ List<int> packetSizes() const; /*! * Sets the sizes of the packets in this page to \a sizes. Internally this * updates the lacing values in the header. * * \see packetSizes() */ void setPacketSizes(const List<int> &sizes); /*! * Some packets can be <i>continued</i> across multiple pages. If the * first packet in the current page is a continuation this will return * true. If this is page starts with a new packet this will return false. * * \see lastPacketCompleted() * \see setFirstPacketContinued() */ bool firstPacketContinued() const; /*! * Sets the internal flag indicating if the first packet in this page is * continued to \a continued. * * \see firstPacketContinued() */ void setFirstPacketContinued(bool continued); /*! * Returns true if the last packet of this page is completely contained in * this page. * * \see firstPacketContinued() * \see setLastPacketCompleted() */ bool lastPacketCompleted() const; /*! * Sets the internal flag indicating if the last packet in this page is * complete to \a completed. * * \see lastPacketCompleted() */ void setLastPacketCompleted(bool completed); /*! * This returns true if this is the first page of the Ogg (logical) stream. * * \see setFirstPageOfStream() */ bool firstPageOfStream() const; /*! * Marks this page as the first page of the Ogg stream. * * \see firstPageOfStream() */ void setFirstPageOfStream(bool first); /*! * This returns true if this is the last page of the Ogg (logical) stream. * * \see setLastPageOfStream() */ bool lastPageOfStream() const; /*! * Marks this page as the last page of the Ogg stream. * * \see lastPageOfStream() */ void setLastPageOfStream(bool last); /*! * A special value of containing the position of the packet to be * interpreted by the codec. In the case of Vorbis this contains the PCM * value and is used to calculate the length of the stream. * * \see setAbsoluteGranularPosition() */ long long absoluteGranularPosition() const; /*! * A special value of containing the position of the packet to be * interpreted by the codec. It is only supported here so that it may be * copied from one page to another. * * \see absoluteGranularPosition() */ void setAbsoluteGranularPosition(long long agp); /*! * Every Ogg logical stream is given a random serial number which is common * to every page in that logical stream. This returns the serial number of * the stream associated with this packet. * * \see setStreamSerialNumber() */ unsigned int streamSerialNumber() const; /*! * Every Ogg logical stream is given a random serial number which is common * to every page in that logical stream. This sets this pages serial * number. This method should be used when adding new pages to a logical * stream. * * \see streamSerialNumber() */ void setStreamSerialNumber(unsigned int n); /*! * Returns the index of the page within the Ogg stream. This helps make it * possible to determine if pages have been lost. * * \see setPageSequenceNumber() */ int pageSequenceNumber() const; /*! * Sets the page's position in the stream to \a sequenceNumber. * * \see pageSequenceNumber() */ void setPageSequenceNumber(int sequenceNumber); /*! * Returns the complete header size. */ int size() const; /*! * Returns the size of the data portion of the page -- i.e. the size of the * page less the header size. */ int dataSize() const; /*! * Render the page header to binary data. * * \note The checksum -- bytes 22 - 25 -- will be left empty and must be * filled in when rendering the entire page. */ ByteVector render() const; private: PageHeader(const PageHeader &); PageHeader &operator=(const PageHeader &); void read(Ogg::File *file, long pageOffset); ByteVector lacingValues() const; class PageHeaderPrivate; PageHeaderPrivate *d; }; } // namespace Ogg } // namespace TagLib #endif ������������������taglib-1.13.1/taglib/ogg/opus/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016071�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/opus/opusfile.cpp����������������������������������������������������������0000664�0000000�0000000�00000010732�14447736377�0020426�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org (original Vorbis implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include <tpropertymap.h> #include <tagutils.h> #include "opusfile.h" using namespace TagLib; using namespace TagLib::Ogg; class Opus::File::FilePrivate { public: FilePrivate() : comment(0), properties(0) {} ~FilePrivate() { delete comment; delete properties; } Ogg::XiphComment *comment; Properties *properties; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool Ogg::Opus::File::isSupported(IOStream *stream) { // An Opus file has IDs "OggS" and "OpusHead" somewhere. const ByteVector buffer = Utils::readHeader(stream, bufferSize(), false); return (buffer.find("OggS") >= 0 && buffer.find("OpusHead") >= 0); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Opus::File::File(FileName file, bool readProperties, Properties::ReadStyle) : Ogg::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } Opus::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : Ogg::File(stream), d(new FilePrivate()) { if(isOpen()) read(readProperties); } Opus::File::~File() { delete d; } Ogg::XiphComment *Opus::File::tag() const { return d->comment; } PropertyMap Opus::File::properties() const { return d->comment->properties(); } PropertyMap Opus::File::setProperties(const PropertyMap &properties) { return d->comment->setProperties(properties); } Opus::Properties *Opus::File::audioProperties() const { return d->properties; } bool Opus::File::save() { if(!d->comment) d->comment = new Ogg::XiphComment(); setPacket(1, ByteVector("OpusTags", 8) + d->comment->render(false)); return Ogg::File::save(); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void Opus::File::read(bool readProperties) { ByteVector opusHeaderData = packet(0); if(!opusHeaderData.startsWith("OpusHead")) { setValid(false); debug("Opus::File::read() -- invalid Opus identification header"); return; } ByteVector commentHeaderData = packet(1); if(!commentHeaderData.startsWith("OpusTags")) { setValid(false); debug("Opus::File::read() -- invalid Opus tags header"); return; } d->comment = new Ogg::XiphComment(commentHeaderData.mid(8)); if(readProperties) d->properties = new Properties(this); } ��������������������������������������taglib-1.13.1/taglib/ogg/opus/opusfile.h������������������������������������������������������������0000664�0000000�0000000�00000012176�14447736377�0020077�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org (original Vorbis implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_OPUSFILE_H #define TAGLIB_OPUSFILE_H #include "oggfile.h" #include "xiphcomment.h" #include "opusproperties.h" namespace TagLib { namespace Ogg { //! A namespace containing classes for Opus metadata namespace Opus { //! An implementation of Ogg::File with Opus specific methods /*! * This is the central class in the Ogg Opus metadata processing collection * of classes. It's built upon Ogg::File which handles processing of the Ogg * logical bitstream and breaking it down into pages which are handled by * the codec implementations, in this case Opus specifically. */ class TAGLIB_EXPORT File : public Ogg::File { public: /*! * Constructs an Opus file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an Opus file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the XiphComment for this file. XiphComment implements the tag * interface, so this serves as the reimplementation of * TagLib::File::tag(). */ virtual Ogg::XiphComment *tag() const; /*! * Implements the unified property interface -- export function. * This forwards directly to XiphComment::properties(). */ PropertyMap properties() const; /*! * Implements the unified tag dictionary interface -- import function. * Like properties(), this is a forwarder to the file's XiphComment. */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the Opus::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Save the file. * * This returns true if the save was successful. */ virtual bool save(); /*! * Returns whether or not the given \a stream can be opened as an Opus * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace Opus } // namespace Ogg } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/opus/opusproperties.cpp����������������������������������������������������0000664�0000000�0000000�00000013011�14447736377�0021674�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org (original Vorbis implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include <oggpageheader.h> #include "opusproperties.h" #include "opusfile.h" using namespace TagLib; using namespace TagLib::Ogg; class Opus::Properties::PropertiesPrivate { public: PropertiesPrivate() : length(0), bitrate(0), inputSampleRate(0), channels(0), opusVersion(0) {} int length; int bitrate; int inputSampleRate; int channels; int opusVersion; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Opus::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(file); } Opus::Properties::~Properties() { delete d; } int Opus::Properties::length() const { return lengthInSeconds(); } int Ogg::Opus::Properties::lengthInSeconds() const { return d->length / 1000; } int Ogg::Opus::Properties::lengthInMilliseconds() const { return d->length; } int Opus::Properties::bitrate() const { return d->bitrate; } int Opus::Properties::sampleRate() const { // Opus can decode any stream at a sample rate of 8, 12, 16, 24, or 48 kHz, // so there is no single sample rate. Let's assume it's the highest // possible. return 48000; } int Opus::Properties::channels() const { return d->channels; } int Opus::Properties::inputSampleRate() const { return d->inputSampleRate; } int Opus::Properties::opusVersion() const { return d->opusVersion; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void Opus::Properties::read(File *file) { // Get the identification header from the Ogg implementation. // http://tools.ietf.org/html/draft-terriberry-oggopus-01#section-5.1 const ByteVector data = file->packet(0); // *Magic Signature* unsigned int pos = 8; // *Version* (8 bits, unsigned) d->opusVersion = static_cast<unsigned char>(data.at(pos)); pos += 1; // *Output Channel Count* 'C' (8 bits, unsigned) d->channels = static_cast<unsigned char>(data.at(pos)); pos += 1; // *Pre-skip* (16 bits, unsigned, little endian) const unsigned short preSkip = data.toUShort(pos, false); pos += 2; // *Input Sample Rate* (32 bits, unsigned, little endian) d->inputSampleRate = data.toUInt(pos, false); pos += 4; // *Output Gain* (16 bits, signed, little endian) pos += 2; // *Channel Mapping Family* (8 bits, unsigned) pos += 1; const Ogg::PageHeader *first = file->firstPageHeader(); const Ogg::PageHeader *last = file->lastPageHeader(); if(first && last) { const long long start = first->absoluteGranularPosition(); const long long end = last->absoluteGranularPosition(); if(start >= 0 && end >= 0) { const long long frameCount = (end - start - preSkip); if(frameCount > 0) { const double length = frameCount * 1000.0 / 48000.0; long fileLengthWithoutOverhead = file->length(); // Ignore the two mandatory header packets, see "3. Packet Organization" // in https://tools.ietf.org/html/rfc7845.html for (unsigned int i = 0; i < 2; ++i) { fileLengthWithoutOverhead -= file->packet(i).size(); } d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(fileLengthWithoutOverhead * 8.0 / length + 0.5); } } else { debug("Opus::Properties::read() -- The PCM values for the start or " "end of this file was incorrect."); } } else debug("Opus::Properties::read() -- Could not find valid first and last Ogg pages."); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/opus/opusproperties.h������������������������������������������������������0000664�0000000�0000000�00000010755�14447736377�0021355�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org (original Vorbis implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_OPUSPROPERTIES_H #define TAGLIB_OPUSPROPERTIES_H #include "audioproperties.h" namespace TagLib { namespace Ogg { namespace Opus { class File; //! An implementation of audio property reading for Ogg Opus /*! * This reads the data from an Ogg Opus stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of Opus::Properties with the data read from the * Opus::File \a file. */ Properties(File *file, ReadStyle style = Average); /*! * Destroys this Opus::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. * * \note Always returns 48000, because Opus can decode any stream at a * sample rate of 8, 12, 16, 24, or 48 kHz, */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * The Opus codec supports decoding at multiple sample rates, there is no * single sample rate of the encoded stream. This returns the sample rate * of the original audio stream. */ int inputSampleRate() const; /*! * Returns the Opus version, in the range 0...255. */ int opusVersion() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(File *file); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace Opus } // namespace Ogg } // namespace TagLib #endif �������������������taglib-1.13.1/taglib/ogg/speex/���������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016227�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/speex/speexfile.cpp��������������������������������������������������������0000664�0000000�0000000�00000010456�14447736377�0020725�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org (original Vorbis implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include <tpropertymap.h> #include <tagutils.h> #include "speexfile.h" using namespace TagLib; using namespace TagLib::Ogg; class Speex::File::FilePrivate { public: FilePrivate() : comment(0), properties(0) {} ~FilePrivate() { delete comment; delete properties; } Ogg::XiphComment *comment; Properties *properties; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool Ogg::Speex::File::isSupported(IOStream *stream) { // A Speex file has IDs "OggS" and "Speex " somewhere. const ByteVector buffer = Utils::readHeader(stream, bufferSize(), false); return (buffer.find("OggS") >= 0 && buffer.find("Speex ") >= 0); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Speex::File::File(FileName file, bool readProperties, Properties::ReadStyle) : Ogg::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } Speex::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : Ogg::File(stream), d(new FilePrivate()) { if(isOpen()) read(readProperties); } Speex::File::~File() { delete d; } Ogg::XiphComment *Speex::File::tag() const { return d->comment; } PropertyMap Speex::File::properties() const { return d->comment->properties(); } PropertyMap Speex::File::setProperties(const PropertyMap &properties) { return d->comment->setProperties(properties); } Speex::Properties *Speex::File::audioProperties() const { return d->properties; } bool Speex::File::save() { if(!d->comment) d->comment = new Ogg::XiphComment(); setPacket(1, d->comment->render()); return Ogg::File::save(); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void Speex::File::read(bool readProperties) { ByteVector speexHeaderData = packet(0); if(!speexHeaderData.startsWith("Speex ")) { debug("Speex::File::read() -- invalid Speex identification header"); setValid(false); return; } ByteVector commentHeaderData = packet(1); d->comment = new Ogg::XiphComment(commentHeaderData); if(readProperties) d->properties = new Properties(this); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/speex/speexfile.h����������������������������������������������������������0000664�0000000�0000000�00000012210�14447736377�0020360�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org (original Vorbis implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_SPEEXFILE_H #define TAGLIB_SPEEXFILE_H #include "oggfile.h" #include "xiphcomment.h" #include "speexproperties.h" namespace TagLib { namespace Ogg { //! A namespace containing classes for Speex metadata namespace Speex { //! An implementation of Ogg::File with Speex specific methods /*! * This is the central class in the Ogg Speex metadata processing collection * of classes. It's built upon Ogg::File which handles processing of the Ogg * logical bitstream and breaking it down into pages which are handled by * the codec implementations, in this case Speex specifically. */ class TAGLIB_EXPORT File : public Ogg::File { public: /*! * Constructs a Speex file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs a Speex file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the XiphComment for this file. XiphComment implements the tag * interface, so this serves as the reimplementation of * TagLib::File::tag(). */ virtual Ogg::XiphComment *tag() const; /*! * Implements the unified property interface -- export function. * This forwards directly to XiphComment::properties(). */ PropertyMap properties() const; /*! * Implements the unified tag dictionary interface -- import function. * Like properties(), this is a forwarder to the file's XiphComment. */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the Speex::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Save the file. * * This returns true if the save was successful. */ virtual bool save(); /*! * Returns whether or not the given \a stream can be opened as a Speex * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace Speex } // namespace Ogg } // namespace TagLib #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/speex/speexproperties.cpp��������������������������������������������������0000664�0000000�0000000�00000014371�14447736377�0022202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org (original Vorbis implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include <oggpageheader.h> #include "speexproperties.h" #include "speexfile.h" using namespace TagLib; using namespace TagLib::Ogg; class Speex::Properties::PropertiesPrivate { public: PropertiesPrivate() : length(0), bitrate(0), bitrateNominal(0), sampleRate(0), channels(0), speexVersion(0), vbr(false), mode(0) {} int length; int bitrate; int bitrateNominal; int sampleRate; int channels; int speexVersion; bool vbr; int mode; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Speex::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(file); } Speex::Properties::~Properties() { delete d; } int Speex::Properties::length() const { return lengthInSeconds(); } int Speex::Properties::lengthInSeconds() const { return d->length / 1000; } int Speex::Properties::lengthInMilliseconds() const { return d->length; } int Speex::Properties::bitrate() const { return d->bitrate; } int Speex::Properties::bitrateNominal() const { return d->bitrateNominal; } int Speex::Properties::sampleRate() const { return d->sampleRate; } int Speex::Properties::channels() const { return d->channels; } int Speex::Properties::speexVersion() const { return d->speexVersion; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void Speex::Properties::read(File *file) { // Get the identification header from the Ogg implementation. const ByteVector data = file->packet(0); if(data.size() < 64) { debug("Speex::Properties::read() -- data is too short."); return; } unsigned int pos = 28; // speex_version_id; /**< Version for Speex (for checking compatibility) */ d->speexVersion = data.toUInt(pos, false); pos += 4; // header_size; /**< Total size of the header ( sizeof(SpeexHeader) ) */ pos += 4; // rate; /**< Sampling rate used */ d->sampleRate = data.toUInt(pos, false); pos += 4; // mode; /**< Mode used (0 for narrowband, 1 for wideband) */ d->mode = data.toUInt(pos, false); pos += 4; // mode_bitstream_version; /**< Version ID of the bit-stream */ pos += 4; // nb_channels; /**< Number of channels encoded */ d->channels = data.toUInt(pos, false); pos += 4; // bitrate; /**< Bit-rate used */ d->bitrateNominal = data.toUInt(pos, false); pos += 4; // frame_size; /**< Size of frames */ // unsigned int frameSize = data.mid(pos, 4).toUInt(false); pos += 4; // vbr; /**< 1 for a VBR encoding, 0 otherwise */ d->vbr = data.toUInt(pos, false) == 1; pos += 4; // frames_per_packet; /**< Number of frames stored per Ogg packet */ // unsigned int framesPerPacket = data.mid(pos, 4).toUInt(false); const Ogg::PageHeader *first = file->firstPageHeader(); const Ogg::PageHeader *last = file->lastPageHeader(); if(first && last) { const long long start = first->absoluteGranularPosition(); const long long end = last->absoluteGranularPosition(); if(start >= 0 && end >= 0 && d->sampleRate > 0) { const long long frameCount = end - start; if(frameCount > 0) { const double length = frameCount * 1000.0 / d->sampleRate; long fileLengthWithoutOverhead = file->length(); // Ignore the two header packets, see "Ogg file format" in // https://www.speex.org/docs/manual/speex-manual/node8.html for (unsigned int i = 0; i < 2; ++i) { fileLengthWithoutOverhead -= file->packet(i).size(); } d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(fileLengthWithoutOverhead * 8.0 / length + 0.5); } } else { debug("Speex::Properties::read() -- Either the PCM values for the start or " "end of this file was incorrect or the sample rate is zero."); } } else debug("Speex::Properties::read() -- Could not find valid first and last Ogg pages."); // Alternative to the actual average bitrate. if(d->bitrate == 0 && d->bitrateNominal > 0) d->bitrate = static_cast<int>(d->bitrateNominal / 1000.0 + 0.5); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/speex/speexproperties.h����������������������������������������������������0000664�0000000�0000000�00000010377�14447736377�0021651�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org (original Vorbis implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_SPEEXPROPERTIES_H #define TAGLIB_SPEEXPROPERTIES_H #include "audioproperties.h" namespace TagLib { namespace Ogg { namespace Speex { class File; //! An implementation of audio property reading for Ogg Speex /*! * This reads the data from an Ogg Speex stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of Speex::Properties with the data read from the * Speex::File \a file. */ Properties(File *file, ReadStyle style = Average); /*! * Destroys this Speex::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the nominal bit rate as read from the Speex header in kb/s. */ int bitrateNominal() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the Speex version, currently "0" (as specified by the spec). */ int speexVersion() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(File *file); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace Speex } // namespace Ogg } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/vorbis/��������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016407�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/vorbis/vorbisfile.cpp������������������������������������������������������0000664�0000000�0000000�00000010721�14447736377�0021260�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <bitset> #include <tstring.h> #include <tdebug.h> #include <tpropertymap.h> #include <tagutils.h> #include "vorbisfile.h" using namespace TagLib; class Vorbis::File::FilePrivate { public: FilePrivate() : comment(0), properties(0) {} ~FilePrivate() { delete comment; delete properties; } Ogg::XiphComment *comment; Properties *properties; }; namespace TagLib { /*! * Vorbis headers can be found with one type ID byte and the string "vorbis" in * an Ogg stream. 0x03 indicates the comment header. */ static const char vorbisCommentHeaderID[] = { 0x03, 'v', 'o', 'r', 'b', 'i', 's', 0 }; } // namespace TagLib //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool Vorbis::File::isSupported(IOStream *stream) { // An Ogg Vorbis file has IDs "OggS" and "\x01vorbis" somewhere. const ByteVector buffer = Utils::readHeader(stream, bufferSize(), false); return (buffer.find("OggS") >= 0 && buffer.find("\x01vorbis") >= 0); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Vorbis::File::File(FileName file, bool readProperties, Properties::ReadStyle) : Ogg::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } Vorbis::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : Ogg::File(stream), d(new FilePrivate()) { if(isOpen()) read(readProperties); } Vorbis::File::~File() { delete d; } Ogg::XiphComment *Vorbis::File::tag() const { return d->comment; } PropertyMap Vorbis::File::properties() const { return d->comment->properties(); } PropertyMap Vorbis::File::setProperties(const PropertyMap &properties) { return d->comment->setProperties(properties); } Vorbis::Properties *Vorbis::File::audioProperties() const { return d->properties; } bool Vorbis::File::save() { ByteVector v(vorbisCommentHeaderID); if(!d->comment) d->comment = new Ogg::XiphComment(); v.append(d->comment->render()); setPacket(1, v); return Ogg::File::save(); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void Vorbis::File::read(bool readProperties) { ByteVector commentHeaderData = packet(1); if(commentHeaderData.mid(0, 7) != vorbisCommentHeaderID) { debug("Vorbis::File::read() - Could not find the Vorbis comment header."); setValid(false); return; } d->comment = new Ogg::XiphComment(commentHeaderData.mid(7)); if(readProperties) d->properties = new Properties(this); } �����������������������������������������������taglib-1.13.1/taglib/ogg/vorbis/vorbisfile.h��������������������������������������������������������0000664�0000000�0000000�00000012672�14447736377�0020734�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_VORBISFILE_H #define TAGLIB_VORBISFILE_H #include "taglib_export.h" #include "oggfile.h" #include "xiphcomment.h" #include "vorbisproperties.h" namespace TagLib { /* * This is just to make this appear to be in the Ogg namespace in the * documentation. The typedef below will make this work with the current code. * In the next BIC version of TagLib this will be really moved into the Ogg * namespace. */ #ifdef DOXYGEN namespace Ogg { #endif //! A namespace containing classes for Vorbis metadata namespace Vorbis { //! An implementation of Ogg::File with Vorbis specific methods /*! * This is the central class in the Ogg Vorbis metadata processing collection * of classes. It's built upon Ogg::File which handles processing of the Ogg * logical bitstream and breaking it down into pages which are handled by * the codec implementations, in this case Vorbis specifically. */ class TAGLIB_EXPORT File : public Ogg::File { public: /*! * Constructs a Vorbis file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs a Vorbis file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the XiphComment for this file. XiphComment implements the tag * interface, so this serves as the reimplementation of * TagLib::File::tag(). */ virtual Ogg::XiphComment *tag() const; /*! * Implements the unified property interface -- export function. * This forwards directly to XiphComment::properties(). */ PropertyMap properties() const; /*! * Implements the unified tag dictionary interface -- import function. * Like properties(), this is a forwarder to the file's XiphComment. */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the Vorbis::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Save the file. * * This returns true if the save was successful. */ virtual bool save(); /*! * Check if the given \a stream can be opened as an Ogg Vorbis file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace Vorbis /* * To keep compatibility with the current version put Vorbis in the Ogg namespace * only in the docs and provide a typedef to make it work. In the next BIC * version this will be removed and it will only exist in the Ogg namespace. */ #ifdef DOXYGEN } #else namespace Ogg { namespace Vorbis { typedef TagLib::Vorbis::File File; } } #endif } // namespace TagLib #endif ����������������������������������������������������������������������taglib-1.13.1/taglib/ogg/vorbis/vorbisproperties.cpp������������������������������������������������0000664�0000000�0000000�00000013776�14447736377�0022552�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include <oggpageheader.h> #include "vorbisproperties.h" #include "vorbisfile.h" using namespace TagLib; class Vorbis::Properties::PropertiesPrivate { public: PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), channels(0), vorbisVersion(0), bitrateMaximum(0), bitrateNominal(0), bitrateMinimum(0) {} int length; int bitrate; int sampleRate; int channels; int vorbisVersion; int bitrateMaximum; int bitrateNominal; int bitrateMinimum; }; namespace TagLib { /*! * Vorbis headers can be found with one type ID byte and the string "vorbis" in * an Ogg stream. 0x01 indicates the setup header. */ static const char vorbisSetupHeaderID[] = { 0x01, 'v', 'o', 'r', 'b', 'i', 's', 0 }; } // namespace TagLib //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Vorbis::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(file); } Vorbis::Properties::~Properties() { delete d; } int Vorbis::Properties::length() const { return lengthInSeconds(); } int Vorbis::Properties::lengthInSeconds() const { return d->length / 1000; } int Vorbis::Properties::lengthInMilliseconds() const { return d->length; } int Vorbis::Properties::bitrate() const { return d->bitrate; } int Vorbis::Properties::sampleRate() const { return d->sampleRate; } int Vorbis::Properties::channels() const { return d->channels; } int Vorbis::Properties::vorbisVersion() const { return d->vorbisVersion; } int Vorbis::Properties::bitrateMaximum() const { return d->bitrateMaximum; } int Vorbis::Properties::bitrateNominal() const { return d->bitrateNominal; } int Vorbis::Properties::bitrateMinimum() const { return d->bitrateMinimum; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void Vorbis::Properties::read(File *file) { // Get the identification header from the Ogg implementation. const ByteVector data = file->packet(0); if(data.size() < 28) { debug("Vorbis::Properties::read() -- data is too short."); return; } unsigned int pos = 0; if(data.mid(pos, 7) != vorbisSetupHeaderID) { debug("Vorbis::Properties::read() -- invalid Vorbis identification header"); return; } pos += 7; d->vorbisVersion = data.toUInt(pos, false); pos += 4; d->channels = static_cast<unsigned char>(data[pos]); pos += 1; d->sampleRate = data.toUInt(pos, false); pos += 4; d->bitrateMaximum = data.toUInt(pos, false); pos += 4; d->bitrateNominal = data.toUInt(pos, false); pos += 4; d->bitrateMinimum = data.toUInt(pos, false); pos += 4; // Find the length of the file. See http://wiki.xiph.org/VorbisStreamLength/ // for my notes on the topic. const Ogg::PageHeader *first = file->firstPageHeader(); const Ogg::PageHeader *last = file->lastPageHeader(); if(first && last) { const long long start = first->absoluteGranularPosition(); const long long end = last->absoluteGranularPosition(); if(start >= 0 && end >= 0 && d->sampleRate > 0) { const long long frameCount = end - start; if(frameCount > 0) { const double length = frameCount * 1000.0 / d->sampleRate; long fileLengthWithoutOverhead = file->length(); // Ignore the three initial header packets, see "1.3.1. Decode Setup" in // https://xiph.org/vorbis/doc/Vorbis_I_spec.html for (unsigned int i = 0; i < 3; ++i) { fileLengthWithoutOverhead -= file->packet(i).size(); } d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(fileLengthWithoutOverhead * 8.0 / length + 0.5); } } else { debug("Vorbis::Properties::read() -- Either the PCM values for the start or " "end of this file was incorrect or the sample rate is zero."); } } else debug("Vorbis::Properties::read() -- Could not find valid first and last Ogg pages."); // Alternative to the actual average bitrate. if(d->bitrate == 0 && d->bitrateNominal > 0) d->bitrate = static_cast<int>(d->bitrateNominal / 1000.0 + 0.5); } ��taglib-1.13.1/taglib/ogg/vorbis/vorbisproperties.h��������������������������������������������������0000664�0000000�0000000�00000011621�14447736377�0022202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_VORBISPROPERTIES_H #define TAGLIB_VORBISPROPERTIES_H #include "taglib_export.h" #include "audioproperties.h" namespace TagLib { /* * This is just to make this appear to be in the Ogg namespace in the * documentation. The typedef below will make this work with the current code. * In the next BIC version of TagLib this will be really moved into the Ogg * namespace. */ #ifdef DOXYGEN namespace Ogg { #endif namespace Vorbis { class File; //! An implementation of audio property reading for Ogg Vorbis /*! * This reads the data from an Ogg Vorbis stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of Vorbis::Properties with the data read from the * Vorbis::File \a file. */ Properties(File *file, ReadStyle style = Average); /*! * Destroys this VorbisProperties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the Vorbis version, currently "0" (as specified by the spec). */ int vorbisVersion() const; /*! * Returns the maximum bitrate as read from the Vorbis identification * header. */ int bitrateMaximum() const; /*! * Returns the nominal bitrate as read from the Vorbis identification * header. */ int bitrateNominal() const; /*! * Returns the minimum bitrate as read from the Vorbis identification * header. */ int bitrateMinimum() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(File *file); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace Vorbis /* * To keep compatibility with the current version put Vorbis in the Ogg namespace * only in the docs and provide a typedef to make it work. In the next BIC * version this will be removed and it will only exist in the Ogg namespace. */ #ifdef DOXYGEN } #else namespace Ogg { namespace Vorbis { typedef TagLib::AudioProperties AudioProperties; } } #endif } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/xiphcomment.cpp������������������������������������������������������������0000664�0000000�0000000�00000032653�14447736377�0020153�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tdebug.h> #include <flacpicture.h> #include <xiphcomment.h> #include <tpropertymap.h> using namespace TagLib; namespace { typedef Ogg::FieldListMap::Iterator FieldIterator; typedef Ogg::FieldListMap::ConstIterator FieldConstIterator; typedef List<FLAC::Picture *> PictureList; typedef PictureList::Iterator PictureIterator; typedef PictureList::Iterator PictureConstIterator; } // namespace class Ogg::XiphComment::XiphCommentPrivate { public: XiphCommentPrivate() { pictureList.setAutoDelete(true); } FieldListMap fieldListMap; String vendorID; String commentField; PictureList pictureList; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// Ogg::XiphComment::XiphComment() : d(new XiphCommentPrivate()) { } Ogg::XiphComment::XiphComment(const ByteVector &data) : d(new XiphCommentPrivate()) { parse(data); } Ogg::XiphComment::~XiphComment() { delete d; } String Ogg::XiphComment::title() const { StringList value = d->fieldListMap.value("TITLE"); return value.isEmpty() ? String() : value.toString(); } String Ogg::XiphComment::artist() const { StringList value = d->fieldListMap.value("ARTIST"); return value.isEmpty() ? String() : value.toString(); } String Ogg::XiphComment::album() const { StringList value = d->fieldListMap.value("ALBUM"); return value.isEmpty() ? String() : value.toString(); } String Ogg::XiphComment::comment() const { StringList value = d->fieldListMap.value("DESCRIPTION"); if(!value.isEmpty()) { d->commentField = "DESCRIPTION"; return value.toString(); } value = d->fieldListMap.value("COMMENT"); if(!value.isEmpty()) { d->commentField = "COMMENT"; return value.toString(); } return String(); } String Ogg::XiphComment::genre() const { StringList value = d->fieldListMap.value("GENRE"); return value.isEmpty() ? String() : value.toString(); } unsigned int Ogg::XiphComment::year() const { StringList value = d->fieldListMap.value("DATE"); if(!value.isEmpty()) return value.front().toInt(); value = d->fieldListMap.value("YEAR"); if(!value.isEmpty()) return value.front().toInt(); return 0; } unsigned int Ogg::XiphComment::track() const { StringList value = d->fieldListMap.value("TRACKNUMBER"); if(!value.isEmpty()) return value.front().toInt(); value = d->fieldListMap.value("TRACKNUM"); if(!value.isEmpty()) return value.front().toInt(); return 0; } void Ogg::XiphComment::setTitle(const String &s) { addField("TITLE", s); } void Ogg::XiphComment::setArtist(const String &s) { addField("ARTIST", s); } void Ogg::XiphComment::setAlbum(const String &s) { addField("ALBUM", s); } void Ogg::XiphComment::setComment(const String &s) { if(d->commentField.isEmpty()) { if(!d->fieldListMap.value("DESCRIPTION").isEmpty()) d->commentField = "DESCRIPTION"; else d->commentField = "COMMENT"; } addField(d->commentField, s); } void Ogg::XiphComment::setGenre(const String &s) { addField("GENRE", s); } void Ogg::XiphComment::setYear(unsigned int i) { removeFields("YEAR"); if(i == 0) removeFields("DATE"); else addField("DATE", String::number(i)); } void Ogg::XiphComment::setTrack(unsigned int i) { removeFields("TRACKNUM"); if(i == 0) removeFields("TRACKNUMBER"); else addField("TRACKNUMBER", String::number(i)); } bool Ogg::XiphComment::isEmpty() const { for(FieldConstIterator it = d->fieldListMap.begin(); it != d->fieldListMap.end(); ++it) { if(!(*it).second.isEmpty()) return false; } return true; } unsigned int Ogg::XiphComment::fieldCount() const { unsigned int count = 0; for(FieldConstIterator it = d->fieldListMap.begin(); it != d->fieldListMap.end(); ++it) count += (*it).second.size(); count += d->pictureList.size(); return count; } const Ogg::FieldListMap &Ogg::XiphComment::fieldListMap() const { return d->fieldListMap; } PropertyMap Ogg::XiphComment::properties() const { return d->fieldListMap; } PropertyMap Ogg::XiphComment::setProperties(const PropertyMap &properties) { // check which keys are to be deleted StringList toRemove; for(FieldConstIterator it = d->fieldListMap.begin(); it != d->fieldListMap.end(); ++it) if (!properties.contains(it->first)) toRemove.append(it->first); for(StringList::ConstIterator it = toRemove.begin(); it != toRemove.end(); ++it) removeFields(*it); // now go through keys in \a properties and check that the values match those in the xiph comment PropertyMap invalid; PropertyMap::ConstIterator it = properties.begin(); for(; it != properties.end(); ++it) { if(!checkKey(it->first)) invalid.insert(it->first, it->second); else if(!d->fieldListMap.contains(it->first) || !(it->second == d->fieldListMap[it->first])) { const StringList &sl = it->second; if(sl.isEmpty()) // zero size string list -> remove the tag with all values removeFields(it->first); else { // replace all strings in the list for the tag StringList::ConstIterator valueIterator = sl.begin(); addField(it->first, *valueIterator, true); ++valueIterator; for(; valueIterator != sl.end(); ++valueIterator) addField(it->first, *valueIterator, false); } } } return invalid; } bool Ogg::XiphComment::checkKey(const String &key) { if(key.size() < 1) return false; // A key may consist of ASCII 0x20 through 0x7D, 0x3D ('=') excluded. for(String::ConstIterator it = key.begin(); it != key.end(); it++) { if(*it < 0x20 || *it > 0x7D || *it == 0x3D) return false; } return true; } String Ogg::XiphComment::vendorID() const { return d->vendorID; } void Ogg::XiphComment::addField(const String &key, const String &value, bool replace) { if(!checkKey(key)) { debug("Ogg::XiphComment::addField() - Invalid key. Field not added."); return; } const String upperKey = key.upper(); if(replace) removeFields(upperKey); if(!key.isEmpty() && !value.isEmpty()) d->fieldListMap[upperKey].append(value); } void Ogg::XiphComment::removeField(const String &key, const String &value) { if(!value.isNull()) removeFields(key, value); else removeFields(key); } void Ogg::XiphComment::removeFields(const String &key) { d->fieldListMap.erase(key.upper()); } void Ogg::XiphComment::removeFields(const String &key, const String &value) { StringList &fields = d->fieldListMap[key.upper()]; for(StringList::Iterator it = fields.begin(); it != fields.end(); ) { if(*it == value) it = fields.erase(it); else ++it; } } void Ogg::XiphComment::removeAllFields() { d->fieldListMap.clear(); } bool Ogg::XiphComment::contains(const String &key) const { return !d->fieldListMap.value(key.upper()).isEmpty(); } void Ogg::XiphComment::removePicture(FLAC::Picture *picture, bool del) { PictureIterator it = d->pictureList.find(picture); if(it != d->pictureList.end()) d->pictureList.erase(it); if(del) delete picture; } void Ogg::XiphComment::removeAllPictures() { d->pictureList.clear(); } void Ogg::XiphComment::addPicture(FLAC::Picture * picture) { d->pictureList.append(picture); } List<FLAC::Picture *> Ogg::XiphComment::pictureList() { return d->pictureList; } ByteVector Ogg::XiphComment::render() const { return render(true); } ByteVector Ogg::XiphComment::render(bool addFramingBit) const { ByteVector data; // Add the vendor ID length and the vendor ID. It's important to use the // length of the data(String::UTF8) rather than the length of the the string // since this is UTF8 text and there may be more characters in the data than // in the UTF16 string. ByteVector vendorData = d->vendorID.data(String::UTF8); data.append(ByteVector::fromUInt(vendorData.size(), false)); data.append(vendorData); // Add the number of fields. data.append(ByteVector::fromUInt(fieldCount(), false)); // Iterate over the the field lists. Our iterator returns a // std::pair<String, StringList> where the first String is the field name and // the StringList is the values associated with that field. FieldListMap::ConstIterator it = d->fieldListMap.begin(); for(; it != d->fieldListMap.end(); ++it) { // And now iterate over the values of the current list. String fieldName = (*it).first; StringList values = (*it).second; StringList::ConstIterator valuesIt = values.begin(); for(; valuesIt != values.end(); ++valuesIt) { ByteVector fieldData = fieldName.data(String::UTF8); fieldData.append('='); fieldData.append((*valuesIt).data(String::UTF8)); data.append(ByteVector::fromUInt(fieldData.size(), false)); data.append(fieldData); } } for(PictureConstIterator it = d->pictureList.begin(); it != d->pictureList.end(); ++it) { ByteVector picture = (*it)->render().toBase64(); data.append(ByteVector::fromUInt(picture.size() + 23, false)); data.append("METADATA_BLOCK_PICTURE="); data.append(picture); } // Append the "framing bit". if(addFramingBit) data.append(static_cast<char>(1)); return data; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void Ogg::XiphComment::parse(const ByteVector &data) { // The first thing in the comment data is the vendor ID length, followed by a // UTF8 string with the vendor ID. unsigned int pos = 0; const unsigned int vendorLength = data.toUInt(0, false); pos += 4; d->vendorID = String(data.mid(pos, vendorLength), String::UTF8); pos += vendorLength; // Next the number of fields in the comment vector. const unsigned int commentFields = data.toUInt(pos, false); pos += 4; if(commentFields > (data.size() - 8) / 4) { return; } for(unsigned int i = 0; i < commentFields; i++) { // Each comment field is in the format "KEY=value" in a UTF8 string and has // 4 bytes before the text starts that gives the length. const unsigned int commentLength = data.toUInt(pos, false); pos += 4; const ByteVector entry = data.mid(pos, commentLength); pos += commentLength; // Don't go past data end if(pos > data.size()) break; // Check for field separator const int sep = entry.find('='); if(sep < 1) { debug("Ogg::XiphComment::parse() - Discarding a field. Separator not found."); continue; } // Parse the key const String key = String(entry.mid(0, sep), String::UTF8).upper(); if(!checkKey(key)) { debug("Ogg::XiphComment::parse() - Discarding a field. Invalid key."); continue; } if(key == "METADATA_BLOCK_PICTURE" || key == "COVERART") { // Handle Pictures separately const ByteVector picturedata = ByteVector::fromBase64(entry.mid(sep + 1)); if(picturedata.isEmpty()) { debug("Ogg::XiphComment::parse() - Discarding a field. Invalid base64 data"); continue; } if(key[0] == L'M') { // Decode FLAC Picture FLAC::Picture * picture = new FLAC::Picture(); if(picture->parse(picturedata)) { d->pictureList.append(picture); } else { delete picture; debug("Ogg::XiphComment::parse() - Failed to decode FLAC Picture block"); } } else { // Assume it's some type of image file FLAC::Picture * picture = new FLAC::Picture(); picture->setData(picturedata); picture->setMimeType("image/"); picture->setType(FLAC::Picture::Other); d->pictureList.append(picture); } } else { // Parse the text addField(key, String(entry.mid(sep + 1), String::UTF8), false); } } } �������������������������������������������������������������������������������������taglib-1.13.1/taglib/ogg/xiphcomment.h��������������������������������������������������������������0000664�0000000�0000000�00000023173�14447736377�0017615�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_VORBISCOMMENT_H #define TAGLIB_VORBISCOMMENT_H #include "tag.h" #include "tlist.h" #include "tmap.h" #include "tstring.h" #include "tstringlist.h" #include "tbytevector.h" #include "flacpicture.h" #include "taglib_export.h" #ifdef _MSC_VER // Explained at end of tpropertymap.cpp extern template class TAGLIB_EXPORT TagLib::Map<TagLib::String, TagLib::StringList>; #endif namespace TagLib { namespace Ogg { /*! * A mapping between a list of field names, or keys, and a list of values * associated with that field. * * \see XiphComment::fieldListMap() */ typedef Map<String, StringList> FieldListMap; //! Ogg Vorbis comment implementation /*! * This class is an implementation of the Ogg Vorbis comment specification, * to be found in section 5 of the Ogg Vorbis specification. Because this * format is also used in other (currently unsupported) Xiph.org formats, it * has been made part of a generic implementation rather than being limited * to strictly Vorbis. * * Vorbis comments are a simple vector of keys and values, called fields. * Multiple values for a given key are supported. * * \see fieldListMap() */ class TAGLIB_EXPORT XiphComment : public TagLib::Tag { public: /*! * Constructs an empty Vorbis comment. */ XiphComment(); /*! * Constructs a Vorbis comment from \a data. */ XiphComment(const ByteVector &data); /*! * Destroys this instance of the XiphComment. */ virtual ~XiphComment(); virtual String title() const; virtual String artist() const; virtual String album() const; virtual String comment() const; virtual String genre() const; virtual unsigned int year() const; virtual unsigned int track() const; virtual void setTitle(const String &s); virtual void setArtist(const String &s); virtual void setAlbum(const String &s); virtual void setComment(const String &s); virtual void setGenre(const String &s); virtual void setYear(unsigned int i); virtual void setTrack(unsigned int i); virtual bool isEmpty() const; /*! * Returns the number of fields present in the comment. */ unsigned int fieldCount() const; /*! * Returns a reference to the map of field lists. Because Xiph comments * support multiple fields with the same key, a pure Map would not work. * As such this is a Map of string lists, keyed on the comment field name. * * The standard set of Xiph/Vorbis fields (which may or may not be * contained in any specific comment) is: * * <ul> * <li>TITLE</li> * <li>VERSION</li> * <li>ALBUM</li> * <li>ARTIST</li> * <li>PERFORMER</li> * <li>COPYRIGHT</li> * <li>ORGANIZATION</li> * <li>DESCRIPTION</li> * <li>GENRE</li> * <li>DATE</li> * <li>LOCATION</li> * <li>CONTACT</li> * <li>ISRC</li> * </ul> * * For a more detailed description of these fields, please see the Ogg * Vorbis specification, section 5.2.2.1. * * \note The Ogg Vorbis comment specification does allow these key values * to be either upper or lower case. However, it is conventional for them * to be upper case. As such, TagLib, when parsing a Xiph/Vorbis comment, * converts all fields to uppercase. When you are using this data * structure, you will need to specify the field name in upper case. * * \warning You should not modify this data structure directly, instead * use addField() and removeField(). */ const FieldListMap &fieldListMap() const; /*! * Implements the unified property interface -- export function. * The result is a one-to-one match of the Xiph comment, since it is * completely compatible with the property interface (in fact, a Xiph * comment is nothing more than a map from tag names to list of values, * as is the dict interface). */ PropertyMap properties() const; /*! * Implements the unified property interface -- import function. * The tags from the given map will be stored one-to-one in the file, * except for invalid keys (less than one character, non-ASCII, or * containing '=' or '~') in which case the according values will * be contained in the returned PropertyMap. */ PropertyMap setProperties(const PropertyMap&); /*! * Check if the given String is a valid Xiph comment key. */ static bool checkKey(const String&); /*! * Returns the vendor ID of the Ogg Vorbis encoder. libvorbis 1.0 as the * most common case always returns "Xiph.Org libVorbis I 20020717". */ String vendorID() const; /*! * Add the field specified by \a key with the data \a value. If \a replace * is true, then all of the other fields with the same key will be removed * first. * * If the field value is empty, the field will be removed. */ void addField(const String &key, const String &value, bool replace = true); /*! * Remove the field specified by \a key with the data \a value. If * \a value is null, all of the fields with the given key will be removed. * * \deprecated Using this method may lead to a linkage error. */ // BIC: remove and merge with below TAGLIB_DEPRECATED void removeField(const String &key, const String &value = String()); /*! * Remove all the fields specified by \a key. * * \see removeAllFields() */ void removeFields(const String &key); /*! * Remove all the fields specified by \a key with the data \a value. * * \see removeAllFields() */ void removeFields(const String &key, const String &value); /*! * Remove all the fields in the comment. * * \see removeFields() */ void removeAllFields(); /*! * Returns true if the field is contained within the comment. * * \note This is safer than checking for membership in the FieldListMap. */ bool contains(const String &key) const; /*! * Renders the comment to a ByteVector suitable for inserting into a file. */ ByteVector render() const; // BIC: remove and merge with below /*! * Renders the comment to a ByteVector suitable for inserting into a file. * * If \a addFramingBit is true the standard Vorbis comment framing bit will * be appended. However some formats (notably FLAC) do not work with this * in place. */ ByteVector render(bool addFramingBit) const; /*! * Returns a list of pictures attached to the xiph comment. */ List<FLAC::Picture *> pictureList(); /*! * Removes an picture. If \a del is true the picture's memory * will be freed; if it is false, it must be deleted by the user. */ void removePicture(FLAC::Picture *picture, bool del = true); /*! * Remove all pictures. */ void removeAllPictures(); /*! * Add a new picture to the comment block. The comment block takes ownership of the * picture and will handle freeing its memory. * * \note The file will be saved only after calling save(). */ void addPicture(FLAC::Picture *picture); protected: /*! * Reads the tag from the file specified in the constructor and fills the * FieldListMap. */ void parse(const ByteVector &data); private: XiphComment(const XiphComment &); XiphComment &operator=(const XiphComment &); class XiphCommentPrivate; XiphCommentPrivate *d; }; } // namespace Ogg } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/��������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015255�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/aiff/���������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016162�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/aiff/aifffile.cpp���������������������������������������������������������0000664�0000000�0000000�00000011725�14447736377�0020441�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tdebug.h> #include <id3v2tag.h> #include <tstringlist.h> #include <tpropertymap.h> #include <tagutils.h> #include "aifffile.h" using namespace TagLib; class RIFF::AIFF::File::FilePrivate { public: FilePrivate() : properties(0), tag(0), hasID3v2(false) {} ~FilePrivate() { delete properties; delete tag; } Properties *properties; ID3v2::Tag *tag; bool hasID3v2; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool RIFF::AIFF::File::isSupported(IOStream *stream) { // An AIFF file has to start with "FORM????AIFF" or "FORM????AIFC". const ByteVector id = Utils::readHeader(stream, 12, false); return (id.startsWith("FORM") && (id.containsAt("AIFF", 8) || id.containsAt("AIFC", 8))); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// RIFF::AIFF::File::File(FileName file, bool readProperties, Properties::ReadStyle) : RIFF::File(file, BigEndian), d(new FilePrivate()) { if(isOpen()) read(readProperties); } RIFF::AIFF::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : RIFF::File(stream, BigEndian), d(new FilePrivate()) { if(isOpen()) read(readProperties); } RIFF::AIFF::File::~File() { delete d; } ID3v2::Tag *RIFF::AIFF::File::tag() const { return d->tag; } PropertyMap RIFF::AIFF::File::properties() const { return d->tag->properties(); } void RIFF::AIFF::File::removeUnsupportedProperties(const StringList &unsupported) { d->tag->removeUnsupportedProperties(unsupported); } PropertyMap RIFF::AIFF::File::setProperties(const PropertyMap &properties) { return d->tag->setProperties(properties); } RIFF::AIFF::Properties *RIFF::AIFF::File::audioProperties() const { return d->properties; } bool RIFF::AIFF::File::save() { return save(ID3v2::v4); } bool RIFF::AIFF::File::save(ID3v2::Version version) { if(readOnly()) { debug("RIFF::AIFF::File::save() -- File is read only."); return false; } if(!isValid()) { debug("RIFF::AIFF::File::save() -- Trying to save invalid file."); return false; } if(d->hasID3v2) { removeChunk("ID3 "); removeChunk("id3 "); d->hasID3v2 = false; } if(tag() && !tag()->isEmpty()) { setChunkData("ID3 ", d->tag->render(version)); d->hasID3v2 = true; } return true; } bool RIFF::AIFF::File::hasID3v2Tag() const { return d->hasID3v2; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void RIFF::AIFF::File::read(bool readProperties) { for(unsigned int i = 0; i < chunkCount(); ++i) { const ByteVector name = chunkName(i); if(name == "ID3 " || name == "id3 ") { if(!d->tag) { d->tag = new ID3v2::Tag(this, chunkOffset(i)); d->hasID3v2 = true; } else { debug("RIFF::AIFF::File::read() - Duplicate ID3v2 tag found."); } } } if(!d->tag) d->tag = new ID3v2::Tag(); if(readProperties) d->properties = new Properties(this, Properties::Average); } �������������������������������������������taglib-1.13.1/taglib/riff/aiff/aifffile.h�����������������������������������������������������������0000664�0000000�0000000�00000013024�14447736377�0020100�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_AIFFFILE_H #define TAGLIB_AIFFFILE_H #include "rifffile.h" #include "id3v2tag.h" #include "aiffproperties.h" namespace TagLib { namespace RIFF { //! An implementation of AIFF metadata /*! * This is implementation of AIFF metadata. * * This supports an ID3v2 tag as well as reading stream from the ID3 RIFF * chunk as well as properties from the file. */ namespace AIFF { //! An implementation of TagLib::File with AIFF specific methods /*! * This implements and provides an interface for AIFF files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to AIFF files. */ class TAGLIB_EXPORT File : public TagLib::RIFF::File { public: /*! * Constructs an AIFF file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an AIFF file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the Tag for this file. * * \note This always returns a valid pointer regardless of whether or not * the file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file * on disk actually has an ID3v2 tag. * * \see hasID3v2Tag() */ virtual ID3v2::Tag *tag() const; /*! * Implements the unified property interface -- export function. * This method forwards to ID3v2::Tag::properties(). */ PropertyMap properties() const; void removeUnsupportedProperties(const StringList &properties); /*! * Implements the unified property interface -- import function. * This method forwards to ID3v2::Tag::setProperties(). */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the AIFF::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Saves the file. */ virtual bool save(); /*! * Save using a specific ID3v2 version (e.g. v3) */ bool save(ID3v2::Version version); /*! * Returns whether or not the file on disk actually has an ID3v2 tag. * * \see ID3v2Tag() */ bool hasID3v2Tag() const; /*! * Check if the given \a stream can be opened as an AIFF file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); friend class Properties; class FilePrivate; FilePrivate *d; }; } // namespace AIFF } // namespace RIFF } // namespace TagLib #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/aiff/aiffproperties.cpp���������������������������������������������������0000664�0000000�0000000�00000012572�14447736377�0021717�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include "aifffile.h" #include "aiffproperties.h" using namespace TagLib; class RIFF::AIFF::Properties::PropertiesPrivate { public: PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), channels(0), bitsPerSample(0), sampleFrames(0) {} int length; int bitrate; int sampleRate; int channels; int bitsPerSample; ByteVector compressionType; String compressionName; unsigned int sampleFrames; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// RIFF::AIFF::Properties::Properties(const ByteVector &, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { debug("RIFF::AIFF::Properties::Properties() - This constructor is no longer used."); } RIFF::AIFF::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(file); } RIFF::AIFF::Properties::~Properties() { delete d; } int RIFF::AIFF::Properties::length() const { return lengthInSeconds(); } int RIFF::AIFF::Properties::lengthInSeconds() const { return d->length / 1000; } int RIFF::AIFF::Properties::lengthInMilliseconds() const { return d->length; } int RIFF::AIFF::Properties::bitrate() const { return d->bitrate; } int RIFF::AIFF::Properties::sampleRate() const { return d->sampleRate; } int RIFF::AIFF::Properties::channels() const { return d->channels; } int RIFF::AIFF::Properties::bitsPerSample() const { return d->bitsPerSample; } int RIFF::AIFF::Properties::sampleWidth() const { return bitsPerSample(); } unsigned int RIFF::AIFF::Properties::sampleFrames() const { return d->sampleFrames; } bool RIFF::AIFF::Properties::isAiffC() const { return (!d->compressionType.isEmpty()); } ByteVector RIFF::AIFF::Properties::compressionType() const { return d->compressionType; } String RIFF::AIFF::Properties::compressionName() const { return d->compressionName; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void RIFF::AIFF::Properties::read(File *file) { ByteVector data; unsigned int streamLength = 0; for(unsigned int i = 0; i < file->chunkCount(); i++) { const ByteVector name = file->chunkName(i); if(name == "COMM") { if(data.isEmpty()) data = file->chunkData(i); else debug("RIFF::AIFF::Properties::read() - Duplicate 'COMM' chunk found."); } else if(name == "SSND") { if(streamLength == 0) streamLength = file->chunkDataSize(i) + file->chunkPadding(i); else debug("RIFF::AIFF::Properties::read() - Duplicate 'SSND' chunk found."); } } if(data.size() < 18) { debug("RIFF::AIFF::Properties::read() - 'COMM' chunk not found or too short."); return; } if(streamLength == 0) { debug("RIFF::AIFF::Properties::read() - 'SSND' chunk not found."); return; } d->channels = data.toShort(0U); d->sampleFrames = data.toUInt(2U); d->bitsPerSample = data.toShort(6U); const long double sampleRate = data.toFloat80BE(8); if(sampleRate >= 1.0) d->sampleRate = static_cast<int>(sampleRate + 0.5); if(d->sampleFrames > 0 && d->sampleRate > 0) { const double length = d->sampleFrames * 1000.0 / sampleRate; d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); } if(data.size() >= 23) { d->compressionType = data.mid(18, 4); d->compressionName = String(data.mid(23, static_cast<unsigned char>(data[22])), String::Latin1); } } ��������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/aiff/aiffproperties.h�����������������������������������������������������0000664�0000000�0000000�00000012371�14447736377�0021361�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_AIFFPROPERTIES_H #define TAGLIB_AIFFPROPERTIES_H #include "audioproperties.h" namespace TagLib { namespace RIFF { namespace AIFF { class File; //! An implementation of audio property reading for AIFF /*! * This reads the data from an AIFF stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of AIFF::Properties with the data read from the * ByteVector \a data. * * \deprecated Use Properties(File *, ReadStyle). */ TAGLIB_DEPRECATED Properties(const ByteVector &data, ReadStyle style); /*! * Create an instance of AIFF::Properties with the data read from the * AIFF::File \a file. */ Properties(File *file, ReadStyle style); /*! * Destroys this AIFF::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the number of bits per audio sample. */ int bitsPerSample() const; /*! * Returns the number of bits per audio sample. * * \note This method is just an alias of bitsPerSample(). * * \deprecated Use bitsPerSample(). */ TAGLIB_DEPRECATED int sampleWidth() const; /*! * Returns the number of sample frames */ unsigned int sampleFrames() const; /*! * Returns true if the file is in AIFF-C format, false if AIFF format. */ bool isAiffC() const; /*! * Returns the compression type of the AIFF-C file. For example, "NONE" for * not compressed, "ACE2" for ACE 2-to-1. * * If the file is in AIFF format, always returns an empty vector. * * \see isAiffC() */ ByteVector compressionType() const; /*! * Returns the concrete compression name of the AIFF-C file. * * If the file is in AIFF format, always returns an empty string. * * \see isAiffC() */ String compressionName() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(File *file); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace AIFF } // namespace RIFF } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/rifffile.cpp��������������������������������������������������������������0000664�0000000�0000000�00000023125�14447736377�0017552�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <algorithm> #include <vector> #include <tbytevector.h> #include <tdebug.h> #include <tstring.h> #include "rifffile.h" #include "riffutils.h" using namespace TagLib; struct Chunk { ByteVector name; unsigned int offset; unsigned int size; unsigned int padding; }; class RIFF::File::FilePrivate { public: FilePrivate(Endianness endianness) : endianness(endianness), size(0), sizeOffset(0) {} const Endianness endianness; unsigned int size; long sizeOffset; std::vector<Chunk> chunks; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// RIFF::File::~File() { delete d; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// RIFF::File::File(FileName file, Endianness endianness) : TagLib::File(file), d(new FilePrivate(endianness)) { if(isOpen()) read(); } RIFF::File::File(IOStream *stream, Endianness endianness) : TagLib::File(stream), d(new FilePrivate(endianness)) { if(isOpen()) read(); } unsigned int RIFF::File::riffSize() const { return d->size; } unsigned int RIFF::File::chunkCount() const { return static_cast<unsigned int>(d->chunks.size()); } unsigned int RIFF::File::chunkDataSize(unsigned int i) const { if(i >= d->chunks.size()) { debug("RIFF::File::chunkDataSize() - Index out of range. Returning 0."); return 0; } return d->chunks[i].size; } unsigned int RIFF::File::chunkOffset(unsigned int i) const { if(i >= d->chunks.size()) { debug("RIFF::File::chunkOffset() - Index out of range. Returning 0."); return 0; } return d->chunks[i].offset; } unsigned int RIFF::File::chunkPadding(unsigned int i) const { if(i >= d->chunks.size()) { debug("RIFF::File::chunkPadding() - Index out of range. Returning 0."); return 0; } return d->chunks[i].padding; } ByteVector RIFF::File::chunkName(unsigned int i) const { if(i >= d->chunks.size()) { debug("RIFF::File::chunkName() - Index out of range. Returning an empty vector."); return ByteVector(); } return d->chunks[i].name; } ByteVector RIFF::File::chunkData(unsigned int i) { if(i >= d->chunks.size()) { debug("RIFF::File::chunkData() - Index out of range. Returning an empty vector."); return ByteVector(); } seek(d->chunks[i].offset); return readBlock(d->chunks[i].size); } void RIFF::File::setChunkData(unsigned int i, const ByteVector &data) { if(i >= d->chunks.size()) { debug("RIFF::File::setChunkData() - Index out of range."); return; } // Now update the specific chunk std::vector<Chunk>::iterator it = d->chunks.begin(); std::advance(it, i); const long long originalSize = static_cast<long long>(it->size) + it->padding; writeChunk(it->name, data, it->offset - 8, it->size + it->padding + 8); it->size = data.size(); it->padding = data.size() % 2; const long long diff = static_cast<long long>(it->size) + it->padding - originalSize; // Now update the internal offsets for(++it; it != d->chunks.end(); ++it) it->offset += static_cast<int>(diff); // Update the global size. updateGlobalSize(); } void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data) { setChunkData(name, data, false); } void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data, bool alwaysCreate) { if(d->chunks.empty()) { debug("RIFF::File::setChunkData - No valid chunks found."); return; } if(alwaysCreate && name != "LIST") { debug("RIFF::File::setChunkData - alwaysCreate should be used for only \"LIST\" chunks."); return; } if(!alwaysCreate) { for(unsigned int i = 0; i < d->chunks.size(); i++) { if(d->chunks[i].name == name) { setChunkData(i, data); return; } } } // Couldn't find an existing chunk, so let's create a new one. // Adjust the padding of the last chunk to place the new chunk at even position. Chunk &last = d->chunks.back(); long offset = last.offset + last.size + last.padding; if(offset & 1) { if(last.padding == 1) { last.padding = 0; // This should not happen unless the file is corrupted. offset--; removeBlock(offset, 1); } else { insert(ByteVector("\0", 1), offset, 0); last.padding = 1; offset++; } } // Now add the chunk to the file. writeChunk(name, data, offset, 0); // And update our internal structure Chunk chunk; chunk.name = name; chunk.size = data.size(); chunk.offset = offset + 8; chunk.padding = data.size() % 2; d->chunks.push_back(chunk); // Update the global size. updateGlobalSize(); } void RIFF::File::removeChunk(unsigned int i) { if(i >= d->chunks.size()) { debug("RIFF::File::removeChunk() - Index out of range."); return; } std::vector<Chunk>::iterator it = d->chunks.begin(); std::advance(it, i); const unsigned int removeSize = it->size + it->padding + 8; removeBlock(it->offset - 8, removeSize); it = d->chunks.erase(it); for(; it != d->chunks.end(); ++it) it->offset -= removeSize; // Update the global size. updateGlobalSize(); } void RIFF::File::removeChunk(const ByteVector &name) { for(int i = static_cast<int>(d->chunks.size()) - 1; i >= 0; --i) { if(d->chunks[i].name == name) removeChunk(i); } } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void RIFF::File::read() { const bool bigEndian = (d->endianness == BigEndian); long offset = tell(); offset += 4; d->sizeOffset = offset; seek(offset); d->size = readBlock(4).toUInt(bigEndian); offset += 8; // + 8: chunk header at least, fix for additional junk bytes while(offset + 8 <= length()) { seek(offset); const ByteVector chunkName = readBlock(4); const unsigned int chunkSize = readBlock(4).toUInt(bigEndian); if(!isValidChunkName(chunkName)) { debug("RIFF::File::read() -- Chunk '" + chunkName + "' has invalid ID"); break; } if(static_cast<long long>(offset) + 8 + chunkSize > length()) { debug("RIFF::File::read() -- Chunk '" + chunkName + "' has invalid size (larger than the file size)"); break; } Chunk chunk; chunk.name = chunkName; chunk.size = chunkSize; chunk.offset = offset + 8; chunk.padding = 0; offset = chunk.offset + chunk.size; // Check padding if(offset & 1) { seek(offset); const ByteVector iByte = readBlock(1); if(iByte.size() == 1) { bool skipPadding = iByte[0] == '\0'; if(!skipPadding) { // Padding byte is not zero, check if it is good to ignore it const ByteVector fourCcAfterPadding = readBlock(4); if(isValidChunkName(fourCcAfterPadding)) { // Use the padding, it is followed by a valid chunk name. skipPadding = true; } } if(skipPadding) { chunk.padding = 1; offset++; } } } d->chunks.push_back(chunk); } } void RIFF::File::writeChunk(const ByteVector &name, const ByteVector &data, unsigned long offset, unsigned long replace) { ByteVector combined; combined.append(name); combined.append(ByteVector::fromUInt(data.size(), d->endianness == BigEndian)); combined.append(data); if(data.size() & 1) combined.resize(combined.size() + 1, '\0'); insert(combined, offset, replace); } void RIFF::File::updateGlobalSize() { const Chunk first = d->chunks.front(); const Chunk last = d->chunks.back(); d->size = last.offset + last.size + last.padding - first.offset + 12; const ByteVector data = ByteVector::fromUInt(d->size, d->endianness == BigEndian); insert(data, d->sizeOffset, 4); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/rifffile.h����������������������������������������������������������������0000664�0000000�0000000�00000012667�14447736377�0017230�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_RIFFFILE_H #define TAGLIB_RIFFFILE_H #include "taglib_export.h" #include "tfile.h" namespace TagLib { //! An implementation of TagLib::File with RIFF specific methods namespace RIFF { //! An RIFF file class with some useful methods specific to RIFF /*! * This implements the generic TagLib::File API and additionally provides * access to properties that are distinct to RIFF files, notably access * to the different ID3 tags. */ class TAGLIB_EXPORT File : public TagLib::File { public: /*! * Destroys this instance of the File. */ virtual ~File(); protected: enum Endianness { BigEndian, LittleEndian }; File(FileName file, Endianness endianness); File(IOStream *stream, Endianness endianness); /*! * \return The size of the main RIFF chunk. */ unsigned int riffSize() const; /*! * \return The number of chunks in the file. */ unsigned int chunkCount() const; /*! * \return The offset within the file for the selected chunk number. */ unsigned int chunkOffset(unsigned int i) const; /*! * \return The size of the chunk data. */ unsigned int chunkDataSize(unsigned int i) const; /*! * \return The size of the padding after the chunk (can be either 0 or 1). */ unsigned int chunkPadding(unsigned int i) const; /*! * \return The name of the specified chunk, for instance, "COMM" or "ID3 " */ ByteVector chunkName(unsigned int i) const; /*! * Reads the chunk data from the file and returns it. * * \note This \e will move the read pointer for the file. */ ByteVector chunkData(unsigned int i); /*! * Sets the data for the specified chunk to \a data. * * \warning This will update the file immediately. */ void setChunkData(unsigned int i, const ByteVector &data); /*! * Sets the data for the chunk \a name to \a data. If a chunk with the * given name already exists it will be overwritten, otherwise it will be * created after the existing chunks. * * \warning This will update the file immediately. */ void setChunkData(const ByteVector &name, const ByteVector &data); /*! * Sets the data for the chunk \a name to \a data. If a chunk with the * given name already exists it will be overwritten, otherwise it will be * created after the existing chunks. * * \note If \a alwaysCreate is true, a new chunk is created regardless of * whether or not the chunk \a name exists. It should only be used for * "LIST" chunks. * * \warning This will update the file immediately. */ void setChunkData(const ByteVector &name, const ByteVector &data, bool alwaysCreate); /*! * Removes the specified chunk. * * \warning This will update the file immediately. */ void removeChunk(unsigned int i); /*! * Removes the chunk \a name. * * \warning This will update the file immediately. * \warning This removes all the chunks with the given name. */ void removeChunk(const ByteVector &name); private: File(const File &); File &operator=(const File &); void read(); void writeChunk(const ByteVector &name, const ByteVector &data, unsigned long offset, unsigned long replace = 0); /*! * Update the global RIFF size based on the current internal structure. */ void updateGlobalSize(); class FilePrivate; FilePrivate *d; }; } // namespace RIFF } // namespace TagLib #endif �������������������������������������������������������������������������taglib-1.13.1/taglib/riff/riffutils.h���������������������������������������������������������������0000664�0000000�0000000�00000004535�14447736377�0017444�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_RIFFUTILS_H #define TAGLIB_RIFFUTILS_H // THIS FILE IS NOT A PART OF THE TAGLIB API #ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header namespace TagLib { namespace RIFF { namespace { inline bool isValidChunkName(const ByteVector &name) { if(name.size() != 4) return false; for(ByteVector::ConstIterator it = name.begin(); it != name.end(); ++it) { const int c = static_cast<unsigned char>(*it); if(c < 32 || 127 < c) return false; } return true; } } // namespace } // namespace RIFF } // namespace TagLib #endif #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/wav/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016052�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/wav/infotag.cpp�����������������������������������������������������������0000664�0000000�0000000�00000014060�14447736377�0020206�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include <tfile.h> #include "infotag.h" #include "riffutils.h" using namespace TagLib; using namespace RIFF::Info; namespace { const RIFF::Info::StringHandler defaultStringHandler; const RIFF::Info::StringHandler *stringHandler = &defaultStringHandler; } // namespace class RIFF::Info::Tag::TagPrivate { public: FieldListMap fieldListMap; }; //////////////////////////////////////////////////////////////////////////////// // StringHandler implementation //////////////////////////////////////////////////////////////////////////////// StringHandler::StringHandler() { } StringHandler::~StringHandler() { } String RIFF::Info::StringHandler::parse(const ByteVector &data) const { return String(data, String::UTF8); } ByteVector RIFF::Info::StringHandler::render(const String &s) const { return s.data(String::UTF8); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// RIFF::Info::Tag::Tag(const ByteVector &data) : d(new TagPrivate()) { parse(data); } RIFF::Info::Tag::Tag() : d(new TagPrivate()) { } RIFF::Info::Tag::~Tag() { delete d; } String RIFF::Info::Tag::title() const { return fieldText("INAM"); } String RIFF::Info::Tag::artist() const { return fieldText("IART"); } String RIFF::Info::Tag::album() const { return fieldText("IPRD"); } String RIFF::Info::Tag::comment() const { return fieldText("ICMT"); } String RIFF::Info::Tag::genre() const { return fieldText("IGNR"); } unsigned int RIFF::Info::Tag::year() const { return fieldText("ICRD").substr(0, 4).toInt(); } unsigned int RIFF::Info::Tag::track() const { return fieldText("IPRT").toInt(); } void RIFF::Info::Tag::setTitle(const String &s) { setFieldText("INAM", s); } void RIFF::Info::Tag::setArtist(const String &s) { setFieldText("IART", s); } void RIFF::Info::Tag::setAlbum(const String &s) { setFieldText("IPRD", s); } void RIFF::Info::Tag::setComment(const String &s) { setFieldText("ICMT", s); } void RIFF::Info::Tag::setGenre(const String &s) { setFieldText("IGNR", s); } void RIFF::Info::Tag::setYear(unsigned int i) { if(i != 0) setFieldText("ICRD", String::number(i)); else d->fieldListMap.erase("ICRD"); } void RIFF::Info::Tag::setTrack(unsigned int i) { if(i != 0) setFieldText("IPRT", String::number(i)); else d->fieldListMap.erase("IPRT"); } bool RIFF::Info::Tag::isEmpty() const { return d->fieldListMap.isEmpty(); } FieldListMap RIFF::Info::Tag::fieldListMap() const { return d->fieldListMap; } String RIFF::Info::Tag::fieldText(const ByteVector &id) const { if(d->fieldListMap.contains(id)) return String(d->fieldListMap[id]); return String(); } void RIFF::Info::Tag::setFieldText(const ByteVector &id, const String &s) { // id must be four-byte long pure ascii string. if(!isValidChunkName(id)) return; if(!s.isEmpty()) d->fieldListMap[id] = s; else removeField(id); } void RIFF::Info::Tag::removeField(const ByteVector &id) { if(d->fieldListMap.contains(id)) d->fieldListMap.erase(id); } ByteVector RIFF::Info::Tag::render() const { ByteVector data("INFO"); FieldListMap::ConstIterator it = d->fieldListMap.begin(); for(; it != d->fieldListMap.end(); ++it) { ByteVector text = stringHandler->render(it->second); if(text.isEmpty()) continue; data.append(it->first); data.append(ByteVector::fromUInt(text.size() + 1, false)); data.append(text); do { data.append('\0'); } while(data.size() & 1); } if(data.size() == 4) return ByteVector(); return data; } void RIFF::Info::Tag::setStringHandler(const StringHandler *handler) { if(handler) stringHandler = handler; else stringHandler = &defaultStringHandler; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void RIFF::Info::Tag::parse(const ByteVector &data) { unsigned int p = 4; while(p < data.size()) { const unsigned int size = data.toUInt(p + 4, false); if(size > data.size() - p - 8) break; const ByteVector id = data.mid(p, 4); if(isValidChunkName(id)) { const String text = stringHandler->parse(data.mid(p + 8, size)); d->fieldListMap[id] = text; } p += ((size + 1) & ~1) + 8; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/wav/infotag.h�������������������������������������������������������������0000664�0000000�0000000�00000015001�14447736377�0017647�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_INFOTAG_H #define TAGLIB_INFOTAG_H #include "tag.h" #include "tmap.h" #include "tstring.h" #include "tstringlist.h" #include "tbytevector.h" #include "taglib_export.h" namespace TagLib { class File; //! A RIFF INFO tag implementation. namespace RIFF { namespace Info { typedef Map<ByteVector, String> FieldListMap; //! A abstraction for the string to data encoding in Info tags. /*! * RIFF INFO tag has no clear definitions about character encodings. * In practice, local encoding of each system is largely used and UTF-8 is * popular too. * * Here is an option to read and write tags in your preferred encoding * by subclassing this class, reimplementing parse() and render() and setting * your reimplementation as the default with Info::Tag::setStringHandler(). * * \see ID3v1::Tag::setStringHandler() */ class TAGLIB_EXPORT StringHandler { public: StringHandler(); ~StringHandler(); /*! * Decode a string from \a data. The default implementation assumes that * \a data is an UTF-8 character array. */ virtual String parse(const ByteVector &data) const; /*! * Encode a ByteVector with the data from \a s. The default implementation * assumes that \a s is an UTF-8 string. */ virtual ByteVector render(const String &s) const; }; //! The main class in the ID3v2 implementation /*! * This is the main class in the INFO tag implementation. RIFF INFO tag is a * metadata format found in WAV audio and AVI video files. Though it is a part * of Microsoft/IBM's RIFF specification, the author could not find the official * documents about it. So, this implementation is referring to unofficial documents * online and some applications' behaviors especially Windows Explorer. */ class TAGLIB_EXPORT Tag : public TagLib::Tag { public: /*! * Constructs an empty INFO tag. */ Tag(); /*! * Constructs an INFO tag read from \a data which is contents of "LIST" chunk. */ Tag(const ByteVector &data); virtual ~Tag(); // Reimplementations virtual String title() const; virtual String artist() const; virtual String album() const; virtual String comment() const; virtual String genre() const; virtual unsigned int year() const; virtual unsigned int track() const; virtual void setTitle(const String &s); virtual void setArtist(const String &s); virtual void setAlbum(const String &s); virtual void setComment(const String &s); virtual void setGenre(const String &s); virtual void setYear(unsigned int i); virtual void setTrack(unsigned int i); virtual bool isEmpty() const; /*! * Returns a copy of the internal fields of the tag. The returned map directly * reflects the contents of the "INFO" chunk. * * \note Modifying this map does not affect the tag's internal data. * Use setFieldText() and removeField() instead. * * \see setFieldText() * \see removeField() */ FieldListMap fieldListMap() const; /* * Gets the value of the field with the ID \a id. */ String fieldText(const ByteVector &id) const; /* * Sets the value of the field with the ID \a id to \a s. * If the field does not exist, it is created. * If \s is empty, the field is removed. * * \note fieldId must be four-byte long pure ASCII string. This function * performs nothing if fieldId is invalid. */ void setFieldText(const ByteVector &id, const String &s); /* * Removes the field with the ID \a id. */ void removeField(const ByteVector &id); /*! * Render the tag back to binary data, suitable to be written to disk. * * \note Returns empty ByteVector is the tag contains no fields. */ ByteVector render() const; /*! * Sets the string handler that decides how the text data will be * converted to and from binary data. * If the parameter \a handler is null, the previous handler is * released and default UTF-8 handler is restored. * * \note The caller is responsible for deleting the previous handler * as needed after it is released. * * \see StringHandler */ static void setStringHandler(const StringHandler *handler); protected: /*! * Pareses the body of the tag in \a data. */ void parse(const ByteVector &data); private: Tag(const Tag &); Tag &operator=(const Tag &); class TagPrivate; TagPrivate *d; }; } // namespace Info } // namespace RIFF } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/wav/wavfile.cpp�����������������������������������������������������������0000664�0000000�0000000�00000015633�14447736377�0020223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tdebug.h> #include <tstringlist.h> #include <tpropertymap.h> #include <tagutils.h> #include "wavfile.h" #include "id3v2tag.h" #include "infotag.h" #include "tagunion.h" using namespace TagLib; namespace { enum { ID3v2Index = 0, InfoIndex = 1 }; } // namespace class RIFF::WAV::File::FilePrivate { public: FilePrivate() : properties(0), hasID3v2(false), hasInfo(false) {} ~FilePrivate() { delete properties; } Properties *properties; TagUnion tag; bool hasID3v2; bool hasInfo; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool RIFF::WAV::File::isSupported(IOStream *stream) { // A WAV file has to start with "RIFF????WAVE". const ByteVector id = Utils::readHeader(stream, 12, false); return (id.startsWith("RIFF") && id.containsAt("WAVE", 8)); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// RIFF::WAV::File::File(FileName file, bool readProperties, Properties::ReadStyle) : RIFF::File(file, LittleEndian), d(new FilePrivate()) { if(isOpen()) read(readProperties); } RIFF::WAV::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : RIFF::File(stream, LittleEndian), d(new FilePrivate()) { if(isOpen()) read(readProperties); } RIFF::WAV::File::~File() { delete d; } ID3v2::Tag *RIFF::WAV::File::tag() const { return ID3v2Tag(); } ID3v2::Tag *RIFF::WAV::File::ID3v2Tag() const { return d->tag.access<ID3v2::Tag>(ID3v2Index, false); } RIFF::Info::Tag *RIFF::WAV::File::InfoTag() const { return d->tag.access<RIFF::Info::Tag>(InfoIndex, false); } void RIFF::WAV::File::strip(TagTypes tags) { removeTagChunks(tags); if(tags & ID3v2) d->tag.set(ID3v2Index, new ID3v2::Tag()); if(tags & Info) d->tag.set(InfoIndex, new RIFF::Info::Tag()); } PropertyMap RIFF::WAV::File::properties() const { return d->tag.properties(); } void RIFF::WAV::File::removeUnsupportedProperties(const StringList &unsupported) { d->tag.removeUnsupportedProperties(unsupported); } PropertyMap RIFF::WAV::File::setProperties(const PropertyMap &properties) { InfoTag()->setProperties(properties); return ID3v2Tag()->setProperties(properties); } RIFF::WAV::Properties *RIFF::WAV::File::audioProperties() const { return d->properties; } bool RIFF::WAV::File::save() { return RIFF::WAV::File::save(AllTags); } bool RIFF::WAV::File::save(TagTypes tags, bool stripOthers, int id3v2Version) { return save(tags, stripOthers ? StripOthers : StripNone, id3v2Version == 3 ? ID3v2::v3 : ID3v2::v4); } bool RIFF::WAV::File::save(TagTypes tags, StripTags strip, ID3v2::Version version) { if(readOnly()) { debug("RIFF::WAV::File::save() -- File is read only."); return false; } if(!isValid()) { debug("RIFF::WAV::File::save() -- Trying to save invalid file."); return false; } if(strip == StripOthers) File::strip(static_cast<TagTypes>(AllTags & ~tags)); if(tags & ID3v2) { removeTagChunks(ID3v2); if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { setChunkData("ID3 ", ID3v2Tag()->render(version)); d->hasID3v2 = true; } } if(tags & Info) { removeTagChunks(Info); if(InfoTag() && !InfoTag()->isEmpty()) { setChunkData("LIST", InfoTag()->render(), true); d->hasInfo = true; } } return true; } bool RIFF::WAV::File::hasID3v2Tag() const { return d->hasID3v2; } bool RIFF::WAV::File::hasInfoTag() const { return d->hasInfo; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void RIFF::WAV::File::read(bool readProperties) { for(unsigned int i = 0; i < chunkCount(); ++i) { const ByteVector name = chunkName(i); if(name == "ID3 " || name == "id3 ") { if(!d->tag[ID3v2Index]) { d->tag.set(ID3v2Index, new ID3v2::Tag(this, chunkOffset(i))); d->hasID3v2 = true; } else { debug("RIFF::WAV::File::read() - Duplicate ID3v2 tag found."); } } else if(name == "LIST") { const ByteVector data = chunkData(i); if(data.startsWith("INFO")) { if(!d->tag[InfoIndex]) { d->tag.set(InfoIndex, new RIFF::Info::Tag(data)); d->hasInfo = true; } else { debug("RIFF::WAV::File::read() - Duplicate INFO tag found."); } } } } if(!d->tag[ID3v2Index]) d->tag.set(ID3v2Index, new ID3v2::Tag()); if(!d->tag[InfoIndex]) d->tag.set(InfoIndex, new RIFF::Info::Tag()); if(readProperties) d->properties = new Properties(this, Properties::Average); } void RIFF::WAV::File::removeTagChunks(TagTypes tags) { if((tags & ID3v2) && d->hasID3v2) { removeChunk("ID3 "); removeChunk("id3 "); d->hasID3v2 = false; } if((tags & Info) && d->hasInfo) { for(int i = static_cast<int>(chunkCount()) - 1; i >= 0; --i) { if(chunkName(i) == "LIST" && chunkData(i).startsWith("INFO")) removeChunk(i); } d->hasInfo = false; } } �����������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/riff/wav/wavfile.h�������������������������������������������������������������0000664�0000000�0000000�00000016761�14447736377�0017673�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_WAVFILE_H #define TAGLIB_WAVFILE_H #include "rifffile.h" #include "id3v2tag.h" #include "infotag.h" #include "wavproperties.h" namespace TagLib { namespace RIFF { //! An implementation of WAV metadata /*! * This is implementation of WAV metadata. * * This supports an ID3v2 tag as well as reading stream from the ID3 RIFF * chunk as well as properties from the file. */ namespace WAV { //! An implementation of TagLib::File with WAV specific methods /*! * This implements and provides an interface for WAV files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to WAV files. */ class TAGLIB_EXPORT File : public TagLib::RIFF::File { public: enum TagTypes { //! Empty set. Matches no tag types. NoTags = 0x0000, //! Matches ID3v2 tags. ID3v2 = 0x0001, //! Matches INFO tags. Info = 0x0002, //! Matches all tag types. AllTags = 0xffff }; /*! * Constructs a WAV file from \a file. If \a readProperties is true the * file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs a WAV file from \a stream. If \a readProperties is true the * file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the ID3v2 Tag for this file. * * \note This method does not return all the tags for this file for * backward compatibility. Will be fixed in TagLib 2.0. */ ID3v2::Tag *tag() const; /*! * Returns the ID3v2 Tag for this file. * * \note This always returns a valid pointer regardless of whether or not * the file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the * file on disk actually has an ID3v2 tag. * * \see hasID3v2Tag() */ ID3v2::Tag *ID3v2Tag() const; /*! * Returns the RIFF INFO Tag for this file. * * \note This always returns a valid pointer regardless of whether or not * the file on disk has a RIFF INFO tag. Use hasInfoTag() to check if the * file on disk actually has a RIFF INFO tag. * * \see hasInfoTag() */ Info::Tag *InfoTag() const; /*! * This will strip the tags that match the OR-ed together TagTypes from the * file. By default it strips all tags. It returns true if the tags are * successfully stripped. * * \note This will update the file immediately. */ void strip(TagTypes tags = AllTags); /*! * Implements the unified property interface -- export function. * This method forwards to ID3v2::Tag::properties(). */ PropertyMap properties() const; void removeUnsupportedProperties(const StringList &properties); /*! * Implements the unified property interface -- import function. * This method forwards to ID3v2::Tag::setProperties(). */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the WAV::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Saves the file. */ virtual bool save(); /*! * \deprecated Use save(TagTypes, StripTags, ID3v2::Version). */ TAGLIB_DEPRECATED bool save(TagTypes tags, bool stripOthers, int id3v2Version = 4); /*! * Save the file. If \a strip is specified, it is possible to choose if * tags not specified in \a tags should be stripped from the file or * retained. With \a version, it is possible to specify whether ID3v2.4 * or ID3v2.3 should be used. */ bool save(TagTypes tags, StripTags strip = StripOthers, ID3v2::Version version = ID3v2::v4); /*! * Returns whether or not the file on disk actually has an ID3v2 tag. * * \see ID3v2Tag() */ bool hasID3v2Tag() const; /*! * Returns whether or not the file on disk actually has a RIFF INFO tag. * * \see InfoTag() */ bool hasInfoTag() const; /*! * Returns whether or not the given \a stream can be opened as a WAV * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); void removeTagChunks(TagTypes tags); friend class Properties; class FilePrivate; FilePrivate *d; }; } // namespace WAV } // namespace RIFF } // namespace TagLib #endif ���������������taglib-1.13.1/taglib/riff/wav/wavproperties.cpp�����������������������������������������������������0000664�0000000�0000000�00000014677�14447736377�0021507�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tdebug.h> #include "wavfile.h" #include "wavproperties.h" using namespace TagLib; namespace { // Quoted from RFC 2361. enum WaveFormat { FORMAT_UNKNOWN = 0x0000, FORMAT_PCM = 0x0001, FORMAT_IEEE_FLOAT = 0x0003 }; } // namespace class RIFF::WAV::Properties::PropertiesPrivate { public: PropertiesPrivate() : format(0), length(0), bitrate(0), sampleRate(0), channels(0), bitsPerSample(0), sampleFrames(0) {} int format; int length; int bitrate; int sampleRate; int channels; int bitsPerSample; unsigned int sampleFrames; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// RIFF::WAV::Properties::Properties(const ByteVector &, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { debug("RIFF::WAV::Properties::Properties() -- This constructor is no longer used."); } RIFF::WAV::Properties::Properties(const ByteVector &, unsigned int, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { debug("RIFF::WAV::Properties::Properties() -- This constructor is no longer used."); } TagLib::RIFF::WAV::Properties::Properties(File *file, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(file); } RIFF::WAV::Properties::~Properties() { delete d; } int RIFF::WAV::Properties::length() const { return lengthInSeconds(); } int RIFF::WAV::Properties::lengthInSeconds() const { return d->length / 1000; } int RIFF::WAV::Properties::lengthInMilliseconds() const { return d->length; } int RIFF::WAV::Properties::bitrate() const { return d->bitrate; } int RIFF::WAV::Properties::sampleRate() const { return d->sampleRate; } int RIFF::WAV::Properties::channels() const { return d->channels; } int RIFF::WAV::Properties::bitsPerSample() const { return d->bitsPerSample; } int RIFF::WAV::Properties::sampleWidth() const { return bitsPerSample(); } unsigned int RIFF::WAV::Properties::sampleFrames() const { return d->sampleFrames; } int RIFF::WAV::Properties::format() const { return d->format; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void RIFF::WAV::Properties::read(File *file) { ByteVector data; unsigned int streamLength = 0; unsigned int totalSamples = 0; for(unsigned int i = 0; i < file->chunkCount(); ++i) { const ByteVector name = file->chunkName(i); if(name == "fmt ") { if(data.isEmpty()) data = file->chunkData(i); else debug("RIFF::WAV::Properties::read() - Duplicate 'fmt ' chunk found."); } else if(name == "data") { if(streamLength == 0) streamLength = file->chunkDataSize(i) + file->chunkPadding(i); else debug("RIFF::WAV::Properties::read() - Duplicate 'data' chunk found."); } else if(name == "fact") { if(totalSamples == 0) totalSamples = file->chunkData(i).toUInt(0, false); else debug("RIFF::WAV::Properties::read() - Duplicate 'fact' chunk found."); } } if(data.size() < 16) { debug("RIFF::WAV::Properties::read() - 'fmt ' chunk not found or too short."); return; } if(streamLength == 0) { debug("RIFF::WAV::Properties::read() - 'data' chunk not found."); return; } d->format = data.toShort(0, false); if((d->format & 0xffff) == 0xfffe) { // if extensible then read the format from the subformat if(data.size() != 40) { debug("RIFF::WAV::Properties::read() - extensible size incorrect"); return; } d->format = data.toShort(24, false); } if(d->format != FORMAT_PCM && d->format != FORMAT_IEEE_FLOAT && totalSamples == 0) { debug("RIFF::WAV::Properties::read() - Non-PCM format, but 'fact' chunk not found."); return; } d->channels = data.toShort(2, false); d->sampleRate = data.toUInt(4, false); d->bitsPerSample = data.toShort(14, false); if(d->format != FORMAT_PCM && (d->format != FORMAT_IEEE_FLOAT || totalSamples != 0)) d->sampleFrames = totalSamples; else if(d->channels > 0 && d->bitsPerSample > 0) d->sampleFrames = streamLength / (d->channels * ((d->bitsPerSample + 7) / 8)); if(d->sampleFrames > 0 && d->sampleRate > 0) { const double length = d->sampleFrames * 1000.0 / d->sampleRate; d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); } else { const unsigned int byteRate = data.toUInt(8, false); if(byteRate > 0) { d->length = static_cast<int>(streamLength * 1000.0 / byteRate + 0.5); d->bitrate = static_cast<int>(byteRate * 8.0 / 1000.0 + 0.5); } } } �����������������������������������������������������������������taglib-1.13.1/taglib/riff/wav/wavproperties.h�������������������������������������������������������0000664�0000000�0000000�00000012361�14447736377�0021140�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_WAVPROPERTIES_H #define TAGLIB_WAVPROPERTIES_H #include "taglib.h" #include "audioproperties.h" namespace TagLib { class ByteVector; namespace RIFF { namespace WAV { class File; //! An implementation of audio property reading for WAV /*! * This reads the data from an WAV stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of WAV::Properties with the data read from the * ByteVector \a data. * * \deprecated Use Properties(File *, ReadStyle). */ TAGLIB_DEPRECATED Properties(const ByteVector &data, ReadStyle style); /*! * Create an instance of WAV::Properties with the data read from the * ByteVector \a data and the length calculated using \a streamLength. * * \deprecated Use Properties(File *, ReadStyle). */ TAGLIB_DEPRECATED Properties(const ByteVector &data, unsigned int streamLength, ReadStyle style); /*! * Create an instance of WAV::Properties with the data read from the * WAV::File \a file. */ Properties(File *file, ReadStyle style); /*! * Destroys this WAV::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the number of bits per audio sample. */ int bitsPerSample() const; /*! * Returns the number of bits per audio sample. * * \note This method is just an alias of bitsPerSample(). * * \deprecated Use bitsPerSample(). */ TAGLIB_DEPRECATED int sampleWidth() const; /*! * Returns the number of sample frames. */ unsigned int sampleFrames() const; /*! * Returns the format ID of the file. * 0 for unknown, 1 for PCM, 2 for ADPCM, 3 for 32/64-bit IEEE754, and * so forth. * * \note For further information, refer to the WAVE Form Registration * Numbers in RFC 2361. */ int format() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(File *file); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace WAV } // namespace RIFF } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/s3m/���������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015031�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/s3m/s3mfile.cpp����������������������������������������������������������������0000664�0000000�0000000�00000015470�14447736377�0017106�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "s3mfile.h" #include "tstringlist.h" #include "tdebug.h" #include "modfileprivate.h" #include "tpropertymap.h" #include <iostream> using namespace TagLib; using namespace S3M; class S3M::File::FilePrivate { public: FilePrivate(AudioProperties::ReadStyle propertiesStyle) : properties(propertiesStyle) { } Mod::Tag tag; S3M::Properties properties; }; S3M::File::File(FileName file, bool readProperties, AudioProperties::ReadStyle propertiesStyle) : Mod::FileBase(file), d(new FilePrivate(propertiesStyle)) { if(isOpen()) read(readProperties); } S3M::File::File(IOStream *stream, bool readProperties, AudioProperties::ReadStyle propertiesStyle) : Mod::FileBase(stream), d(new FilePrivate(propertiesStyle)) { if(isOpen()) read(readProperties); } S3M::File::~File() { delete d; } Mod::Tag *S3M::File::tag() const { return &d->tag; } PropertyMap S3M::File::properties() const { return d->tag.properties(); } PropertyMap S3M::File::setProperties(const PropertyMap &properties) { return d->tag.setProperties(properties); } S3M::Properties *S3M::File::audioProperties() const { return &d->properties; } bool S3M::File::save() { if(readOnly()) { debug("S3M::File::save() - Cannot save to a read only file."); return false; } // note: if title starts with "Extended Module: " // the file would look like an .xm file seek(0); writeString(d->tag.title(), 27); // string terminating NUL is not optional: writeByte(0); seek(32); unsigned short length = 0; unsigned short sampleCount = 0; if(!readU16L(length) || !readU16L(sampleCount)) return false; seek(28, Current); int channels = 0; for(int i = 0; i < 32; ++ i) { unsigned char setting = 0; if(!readByte(setting)) return false; // or if(setting >= 128)? // or channels = i + 1;? // need a better spec! if(setting != 0xff) ++ channels; } seek(channels, Current); StringList lines = d->tag.comment().split("\n"); // write comment as sample names: for(unsigned short i = 0; i < sampleCount; ++ i) { seek(96L + length + (static_cast<long>(i) << 1)); unsigned short instrumentOffset = 0; if(!readU16L(instrumentOffset)) return false; seek((static_cast<long>(instrumentOffset) << 4) + 48); if(i < lines.size()) writeString(lines[i], 27); else writeString(String(), 27); // string terminating NUL is not optional: writeByte(0); } return true; } void S3M::File::read(bool) { if(!isOpen()) return; READ_STRING(d->tag.setTitle, 28); READ_BYTE_AS(mark); READ_BYTE_AS(type); READ_ASSERT(mark == 0x1A && type == 0x10); seek(32); READ_U16L_AS(length); READ_U16L_AS(sampleCount); d->properties.setSampleCount(sampleCount); READ_U16L(d->properties.setPatternCount); READ_U16L(d->properties.setFlags); READ_U16L(d->properties.setTrackerVersion); READ_U16L(d->properties.setFileFormatVersion); READ_ASSERT(readBlock(4) == "SCRM"); READ_BYTE(d->properties.setGlobalVolume); READ_BYTE(d->properties.setBpmSpeed); READ_BYTE(d->properties.setTempo); READ_BYTE_AS(masterVolume); d->properties.setMasterVolume(masterVolume & 0x7f); d->properties.setStereo((masterVolume & 0x80) != 0); // I've seen players who call the next two bytes // "ultra click" and "use panning values" (if == 0xFC). // I don't see them in any spec, though. // Hm, but there is "UltraClick-removal" and some other // variables in ScreamTracker III's GUI. seek(12, Current); int channels = 0; for(int i = 0; i < 32; ++ i) { READ_BYTE_AS(setting); // or if(setting >= 128)? // or channels = i + 1;? // need a better spec! if(setting != 0xff) ++ channels; } d->properties.setChannels(channels); seek(96); unsigned short realLength = 0; for(unsigned short i = 0; i < length; ++ i) { READ_BYTE_AS(order); if(order == 255) break; if(order != 254) ++ realLength; } d->properties.setLengthInPatterns(realLength); seek(channels, Current); // Note: The S3M spec mentions samples and instruments, but in // the header there are only pointers to instruments. // However, there I never found instruments (SCRI) but // instead samples (SCRS). StringList comment; for(unsigned short i = 0; i < sampleCount; ++ i) { seek(96L + length + (static_cast<long>(i) << 1)); READ_U16L_AS(sampleHeaderOffset); seek(static_cast<long>(sampleHeaderOffset) << 4); READ_BYTE_AS(sampleType); READ_STRING_AS(dosFileName, 13); READ_U16L_AS(sampleDataOffset); READ_U32L_AS(sampleLength); READ_U32L_AS(repeatStart); READ_U32L_AS(repeatStop); READ_BYTE_AS(sampleVolume); seek(1, Current); READ_BYTE_AS(packing); READ_BYTE_AS(sampleFlags); READ_U32L_AS(baseFrequency); seek(12, Current); READ_STRING_AS(sampleName, 28); // The next 4 bytes should be "SCRS", but I've found // files that are otherwise ok with 4 nils instead. // READ_ASSERT(readBlock(4) == "SCRS"); comment.append(sampleName); } d->tag.setComment(comment.toString("\n")); d->tag.setTrackerName("ScreamTracker III"); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/s3m/s3mfile.h������������������������������������������������������������������0000664�0000000�0000000�00000010145�14447736377�0016545�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_S3MFILE_H #define TAGLIB_S3MFILE_H #include "tfile.h" #include "audioproperties.h" #include "taglib_export.h" #include "modfilebase.h" #include "modtag.h" #include "s3mproperties.h" namespace TagLib { namespace S3M { class TAGLIB_EXPORT File : public Mod::FileBase { public: /*! * Constructs a ScreamTracker III from \a file. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. */ File(FileName file, bool readProperties = true, AudioProperties::ReadStyle propertiesStyle = AudioProperties::Average); /*! * Constructs a ScreamTracker III file from \a stream. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. */ File(IOStream *stream, bool readProperties = true, AudioProperties::ReadStyle propertiesStyle = AudioProperties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); Mod::Tag *tag() const; /*! * Implements the unified property interface -- export function. * Forwards to Mod::Tag::properties(). */ PropertyMap properties() const; /*! * Implements the unified property interface -- import function. * Forwards to Mod::Tag::setProperties(). */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the S3M::Properties for this file. If no audio properties * were read then this will return a null pointer. */ S3M::Properties *audioProperties() const; /*! * Save the file. * This is the same as calling save(AllTags); * * \note Saving ScreamTracker III tags is not supported. */ bool save(); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace S3M } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/s3m/s3mproperties.cpp����������������������������������������������������������0000664�0000000�0000000�00000011747�14447736377�0020366�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "s3mproperties.h" using namespace TagLib; using namespace S3M; class S3M::Properties::PropertiesPrivate { public: PropertiesPrivate() : lengthInPatterns(0), channels(0), stereo(false), sampleCount(0), patternCount(0), flags(0), trackerVersion(0), fileFormatVersion(0), globalVolume(0), masterVolume(0), tempo(0), bpmSpeed(0) { } unsigned short lengthInPatterns; int channels; bool stereo; unsigned short sampleCount; unsigned short patternCount; unsigned short flags; unsigned short trackerVersion; unsigned short fileFormatVersion; unsigned char globalVolume; unsigned char masterVolume; unsigned char tempo; unsigned char bpmSpeed; }; S3M::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : AudioProperties(propertiesStyle), d(new PropertiesPrivate()) { } S3M::Properties::~Properties() { delete d; } int S3M::Properties::length() const { return 0; } int S3M::Properties::lengthInSeconds() const { return 0; } int S3M::Properties::lengthInMilliseconds() const { return 0; } int S3M::Properties::bitrate() const { return 0; } int S3M::Properties::sampleRate() const { return 0; } int S3M::Properties::channels() const { return d->channels; } unsigned short S3M::Properties::lengthInPatterns() const { return d->lengthInPatterns; } bool S3M::Properties::stereo() const { return d->stereo; } unsigned short S3M::Properties::sampleCount() const { return d->sampleCount; } unsigned short S3M::Properties::patternCount() const { return d->patternCount; } unsigned short S3M::Properties::flags() const { return d->flags; } unsigned short S3M::Properties::trackerVersion() const { return d->trackerVersion; } unsigned short S3M::Properties::fileFormatVersion() const { return d->fileFormatVersion; } unsigned char S3M::Properties::globalVolume() const { return d->globalVolume; } unsigned char S3M::Properties::masterVolume() const { return d->masterVolume; } unsigned char S3M::Properties::tempo() const { return d->tempo; } unsigned char S3M::Properties::bpmSpeed() const { return d->bpmSpeed; } void S3M::Properties::setLengthInPatterns(unsigned short lengthInPatterns) { d->lengthInPatterns = lengthInPatterns; } void S3M::Properties::setChannels(int channels) { d->channels = channels; } void S3M::Properties::setStereo(bool stereo) { d->stereo = stereo; } void S3M::Properties::setSampleCount(unsigned short sampleCount) { d->sampleCount = sampleCount; } void S3M::Properties::setPatternCount(unsigned short patternCount) { d->patternCount = patternCount; } void S3M::Properties::setFlags(unsigned short flags) { d->flags = flags; } void S3M::Properties::setTrackerVersion(unsigned short trackerVersion) { d->trackerVersion = trackerVersion; } void S3M::Properties::setFileFormatVersion(unsigned short fileFormatVersion) { d->fileFormatVersion = fileFormatVersion; } void S3M::Properties::setGlobalVolume(unsigned char globalVolume) { d->globalVolume = globalVolume; } void S3M::Properties::setMasterVolume(unsigned char masterVolume) { d->masterVolume = masterVolume; } void S3M::Properties::setTempo(unsigned char tempo) { d->tempo = tempo; } void S3M::Properties::setBpmSpeed(unsigned char bpmSpeed) { d->bpmSpeed = bpmSpeed; } �������������������������taglib-1.13.1/taglib/s3m/s3mproperties.h������������������������������������������������������������0000664�0000000�0000000�00000007730�14447736377�0020030�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_S3MPROPERTIES_H #define TAGLIB_S3MPROPERTIES_H #include "taglib.h" #include "audioproperties.h" namespace TagLib { namespace S3M { class TAGLIB_EXPORT Properties : public AudioProperties { friend class File; public: /*! Flag bits. */ enum { ST2Vibrato = 1, ST2Tempo = 2, AmigaSlides = 4, Vol0MixOptimizations = 8, AmigaLimits = 16, EnableFilter = 32, CustomData = 128 }; Properties(AudioProperties::ReadStyle propertiesStyle); virtual ~Properties(); int length() const; int lengthInSeconds() const; int lengthInMilliseconds() const; int bitrate() const; int sampleRate() const; int channels() const; unsigned short lengthInPatterns() const; bool stereo() const; unsigned short sampleCount() const; unsigned short patternCount() const; unsigned short flags() const; unsigned short trackerVersion() const; unsigned short fileFormatVersion() const; unsigned char globalVolume() const; unsigned char masterVolume() const; unsigned char tempo() const; unsigned char bpmSpeed() const; void setChannels(int channels); void setLengthInPatterns (unsigned short lengthInPatterns); void setStereo (bool stereo); void setSampleCount (unsigned short sampleCount); void setPatternCount (unsigned short patternCount); void setFlags (unsigned short flags); void setTrackerVersion (unsigned short trackerVersion); void setFileFormatVersion(unsigned short fileFormatVersion); void setGlobalVolume (unsigned char globalVolume); void setMasterVolume (unsigned char masterVolume); void setTempo (unsigned char tempo); void setBpmSpeed (unsigned char bpmSpeed); private: Properties(const Properties&); Properties &operator=(const Properties&); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace S3M } // namespace TagLib #endif ����������������������������������������taglib-1.13.1/taglib/tag.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000012613�14447736377�0015611�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tag.h" #include "tstringlist.h" #include "tpropertymap.h" using namespace TagLib; class Tag::TagPrivate { }; Tag::Tag() { } Tag::~Tag() { } bool Tag::isEmpty() const { return (title().isEmpty() && artist().isEmpty() && album().isEmpty() && comment().isEmpty() && genre().isEmpty() && year() == 0 && track() == 0); } PropertyMap Tag::properties() const { PropertyMap map; if(!(title().isEmpty())) map["TITLE"].append(title()); if(!(artist().isEmpty())) map["ARTIST"].append(artist()); if(!(album().isEmpty())) map["ALBUM"].append(album()); if(!(comment().isEmpty())) map["COMMENT"].append(comment()); if(!(genre().isEmpty())) map["GENRE"].append(genre()); if(!(year() == 0)) map["DATE"].append(String::number(year())); if(!(track() == 0)) map["TRACKNUMBER"].append(String::number(track())); return map; } void Tag::removeUnsupportedProperties(const StringList&) { } PropertyMap Tag::setProperties(const PropertyMap &origProps) { PropertyMap properties(origProps); properties.removeEmpty(); StringList oneValueSet; // can this be simplified by using some preprocessor defines / function pointers? if(properties.contains("TITLE")) { setTitle(properties["TITLE"].front()); oneValueSet.append("TITLE"); } else setTitle(String()); if(properties.contains("ARTIST")) { setArtist(properties["ARTIST"].front()); oneValueSet.append("ARTIST"); } else setArtist(String()); if(properties.contains("ALBUM")) { setAlbum(properties["ALBUM"].front()); oneValueSet.append("ALBUM"); } else setAlbum(String()); if(properties.contains("COMMENT")) { setComment(properties["COMMENT"].front()); oneValueSet.append("COMMENT"); } else setComment(String()); if(properties.contains("GENRE")) { setGenre(properties["GENRE"].front()); oneValueSet.append("GENRE"); } else setGenre(String()); if(properties.contains("DATE")) { bool ok; int date = properties["DATE"].front().toInt(&ok); if(ok) { setYear(date); oneValueSet.append("DATE"); } else setYear(0); } else setYear(0); if(properties.contains("TRACKNUMBER")) { bool ok; int track = properties["TRACKNUMBER"].front().toInt(&ok); if(ok) { setTrack(track); oneValueSet.append("TRACKNUMBER"); } else setTrack(0); } else setTrack(0); // for each tag that has been set above, remove the first entry in the corresponding // value list. The others will be returned as unsupported by this format. for(StringList::ConstIterator it = oneValueSet.begin(); it != oneValueSet.end(); ++it) { if(properties[*it].size() == 1) properties.erase(*it); else properties[*it].erase( properties[*it].begin() ); } return properties; } void Tag::duplicate(const Tag *source, Tag *target, bool overwrite) // static { if(overwrite) { target->setTitle(source->title()); target->setArtist(source->artist()); target->setAlbum(source->album()); target->setComment(source->comment()); target->setGenre(source->genre()); target->setYear(source->year()); target->setTrack(source->track()); } else { if(target->title().isEmpty()) target->setTitle(source->title()); if(target->artist().isEmpty()) target->setArtist(source->artist()); if(target->album().isEmpty()) target->setAlbum(source->album()); if(target->comment().isEmpty()) target->setComment(source->comment()); if(target->genre().isEmpty()) target->setGenre(source->genre()); if(target->year() <= 0) target->setYear(source->year()); if(target->track() <= 0) target->setTrack(source->track()); } } ���������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/tag.h��������������������������������������������������������������������������0000664�0000000�0000000�00000015701�14447736377�0015257�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_TAG_H #define TAGLIB_TAG_H #include "taglib_export.h" #include "tstring.h" namespace TagLib { //! A simple, generic interface to common audio meta data fields /*! * This is an attempt to abstract away the difference in the meta data formats * of various audio codecs and tagging schemes. As such it is generally a * subset of what is available in the specific formats but should be suitable * for most applications. This is meant to compliment the generic APIs found * in TagLib::AudioProperties, TagLib::File and TagLib::FileRef. */ class PropertyMap; class TAGLIB_EXPORT Tag { public: /*! * Destroys this Tag instance. */ virtual ~Tag(); /*! * Exports the tags of the file as dictionary mapping (human readable) tag * names (Strings) to StringLists of tag values. * The default implementation in this class considers only the usual built-in * tags (artist, album, ...) and only one value per key. */ PropertyMap properties() const; /*! * Removes unsupported properties, or a subset of them, from the tag. * The parameter \a properties must contain only entries from * properties().unsupportedData(). * BIC: Will become virtual in future releases. Currently the non-virtual * standard implementation of TagLib::Tag does nothing, since there are * no unsupported elements. */ void removeUnsupportedProperties(const StringList& properties); /*! * Sets the tags of this File to those specified in \a properties. This default * implementation sets only the tags for which setter methods exist in this class * (artist, album, ...), and only one value per key; the rest will be contained * in the returned PropertyMap. */ PropertyMap setProperties(const PropertyMap &properties); /*! * Returns the track name; if no track name is present in the tag * String::null will be returned. */ virtual String title() const = 0; /*! * Returns the artist name; if no artist name is present in the tag * String::null will be returned. */ virtual String artist() const = 0; /*! * Returns the album name; if no album name is present in the tag * String::null will be returned. */ virtual String album() const = 0; /*! * Returns the track comment; if no comment is present in the tag * String::null will be returned. */ virtual String comment() const = 0; /*! * Returns the genre name; if no genre is present in the tag String::null * will be returned. */ virtual String genre() const = 0; /*! * Returns the year; if there is no year set, this will return 0. */ virtual unsigned int year() const = 0; /*! * Returns the track number; if there is no track number set, this will * return 0. */ virtual unsigned int track() const = 0; /*! * Sets the title to \a s. If \a s is String::null then this value will be * cleared. */ virtual void setTitle(const String &s) = 0; /*! * Sets the artist to \a s. If \a s is String::null then this value will be * cleared. */ virtual void setArtist(const String &s) = 0; /*! * Sets the album to \a s. If \a s is String::null then this value will be * cleared. */ virtual void setAlbum(const String &s) = 0; /*! * Sets the comment to \a s. If \a s is String::null then this value will be * cleared. */ virtual void setComment(const String &s) = 0; /*! * Sets the genre to \a s. If \a s is String::null then this value will be * cleared. For tag formats that use a fixed set of genres, the appropriate * value will be selected based on a string comparison. A list of available * genres for those formats should be available in that type's * implementation. */ virtual void setGenre(const String &s) = 0; /*! * Sets the year to \a i. If \a s is 0 then this value will be cleared. */ virtual void setYear(unsigned int i) = 0; /*! * Sets the track to \a i. If \a s is 0 then this value will be cleared. */ virtual void setTrack(unsigned int i) = 0; /*! * Returns true if the tag does not contain any data. This should be * reimplemented in subclasses that provide more than the basic tagging * abilities in this class. */ virtual bool isEmpty() const; /*! * Copies the generic data from one tag to another. * * \note This will no affect any of the lower level details of the tag. For * instance if any of the tag type specific data (maybe a URL for a band) is * set, this will not modify or copy that. This just copies using the API * in this class. * * If \a overwrite is true then the values will be unconditionally copied. * If false only empty values will be overwritten. */ static void duplicate(const Tag *source, Tag *target, bool overwrite = true); protected: /*! * Construct a Tag. This is protected since tags should only be instantiated * through subclasses. */ Tag(); private: Tag(const Tag &); Tag &operator=(const Tag &); class TagPrivate; TagPrivate *d; }; } // namespace TagLib #endif ���������������������������������������������������������������taglib-1.13.1/taglib/taglib_config.h.cmake����������������������������������������������������������0000664�0000000�0000000�00000000442�14447736377�0020346�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* taglib_config.h. Generated by cmake from taglib_config.h.cmake */ #ifndef TAGLIB_TAGLIB_CONFIG_H #define TAGLIB_TAGLIB_CONFIG_H /* These values are no longer used. This file is present only for compatibility reasons. */ #define TAGLIB_WITH_ASF 1 #define TAGLIB_WITH_MP4 1 #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/taglib_export.h����������������������������������������������������������������0000664�0000000�0000000�00000004200�14447736377�0017337�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_EXPORT_H #define TAGLIB_EXPORT_H #if defined(TAGLIB_STATIC) #define TAGLIB_EXPORT #elif (defined(_WIN32) || defined(_WIN64)) #ifdef MAKE_TAGLIB_LIB #define TAGLIB_EXPORT __declspec(dllexport) #else #define TAGLIB_EXPORT __declspec(dllimport) #endif #elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1) #define TAGLIB_EXPORT __attribute__ ((visibility("default"))) #else #define TAGLIB_EXPORT #endif #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/tagunion.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000016071�14447736377�0016664�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tagunion.h> #include <tstringlist.h> #include <tpropertymap.h> #include "id3v1tag.h" #include "id3v2tag.h" #include "apetag.h" #include "xiphcomment.h" #include "infotag.h" using namespace TagLib; #define stringUnion(method) \ if(tag(0) && !tag(0)->method().isEmpty()) \ return tag(0)->method(); \ if(tag(1) && !tag(1)->method().isEmpty()) \ return tag(1)->method(); \ if(tag(2) && !tag(2)->method().isEmpty()) \ return tag(2)->method(); \ return String(); \ #define numberUnion(method) \ if(tag(0) && tag(0)->method() > 0) \ return tag(0)->method(); \ if(tag(1) && tag(1)->method() > 0) \ return tag(1)->method(); \ if(tag(2) && tag(2)->method() > 0) \ return tag(2)->method(); \ return 0 #define setUnion(method, value) \ if(tag(0)) \ tag(0)->set##method(value); \ if(tag(1)) \ tag(1)->set##method(value); \ if(tag(2)) \ tag(2)->set##method(value); \ class TagUnion::TagUnionPrivate { public: TagUnionPrivate() : tags(3, static_cast<Tag *>(0)) { } ~TagUnionPrivate() { delete tags[0]; delete tags[1]; delete tags[2]; } std::vector<Tag *> tags; }; TagUnion::TagUnion(Tag *first, Tag *second, Tag *third) : d(new TagUnionPrivate()) { d->tags[0] = first; d->tags[1] = second; d->tags[2] = third; } TagUnion::~TagUnion() { delete d; } Tag *TagUnion::operator[](int index) const { return tag(index); } Tag *TagUnion::tag(int index) const { return d->tags[index]; } void TagUnion::set(int index, Tag *tag) { delete d->tags[index]; d->tags[index] = tag; } PropertyMap TagUnion::properties() const { // This is an ugly workaround but we can't add a virtual function. // Should be virtual in taglib2. for(size_t i = 0; i < 3; ++i) { if(d->tags[i] && !d->tags[i]->isEmpty()) { if(dynamic_cast<const ID3v1::Tag *>(d->tags[i])) return dynamic_cast<const ID3v1::Tag *>(d->tags[i])->properties(); if(dynamic_cast<const ID3v2::Tag *>(d->tags[i])) return dynamic_cast<const ID3v2::Tag *>(d->tags[i])->properties(); if(dynamic_cast<const APE::Tag *>(d->tags[i])) return dynamic_cast<const APE::Tag *>(d->tags[i])->properties(); if(dynamic_cast<const Ogg::XiphComment *>(d->tags[i])) return dynamic_cast<const Ogg::XiphComment *>(d->tags[i])->properties(); if(dynamic_cast<const RIFF::Info::Tag *>(d->tags[i])) return dynamic_cast<const RIFF::Info::Tag *>(d->tags[i])->properties(); } } return PropertyMap(); } void TagUnion::removeUnsupportedProperties(const StringList &unsupported) { // This is an ugly workaround but we can't add a virtual function. // Should be virtual in taglib2. for(size_t i = 0; i < 3; ++i) { if(d->tags[i]) { if(dynamic_cast<ID3v1::Tag *>(d->tags[i])) dynamic_cast<ID3v1::Tag *>(d->tags[i])->removeUnsupportedProperties(unsupported); else if(dynamic_cast<ID3v2::Tag *>(d->tags[i])) dynamic_cast<ID3v2::Tag *>(d->tags[i])->removeUnsupportedProperties(unsupported); else if(dynamic_cast<APE::Tag *>(d->tags[i])) dynamic_cast<APE::Tag *>(d->tags[i])->removeUnsupportedProperties(unsupported); else if(dynamic_cast<Ogg::XiphComment *>(d->tags[i])) dynamic_cast<Ogg::XiphComment *>(d->tags[i])->removeUnsupportedProperties(unsupported); else if(dynamic_cast<RIFF::Info::Tag *>(d->tags[i])) dynamic_cast<RIFF::Info::Tag *>(d->tags[i])->removeUnsupportedProperties(unsupported); } } } String TagUnion::title() const { stringUnion(title); } String TagUnion::artist() const { stringUnion(artist); } String TagUnion::album() const { stringUnion(album); } String TagUnion::comment() const { stringUnion(comment); } String TagUnion::genre() const { stringUnion(genre); } unsigned int TagUnion::year() const { numberUnion(year); } unsigned int TagUnion::track() const { numberUnion(track); } void TagUnion::setTitle(const String &s) { setUnion(Title, s); } void TagUnion::setArtist(const String &s) { setUnion(Artist, s); } void TagUnion::setAlbum(const String &s) { setUnion(Album, s); } void TagUnion::setComment(const String &s) { setUnion(Comment, s); } void TagUnion::setGenre(const String &s) { setUnion(Genre, s); } void TagUnion::setYear(unsigned int i) { setUnion(Year, i); } void TagUnion::setTrack(unsigned int i) { setUnion(Track, i); } bool TagUnion::isEmpty() const { if(d->tags[0] && !d->tags[0]->isEmpty()) return false; if(d->tags[1] && !d->tags[1]->isEmpty()) return false; if(d->tags[2] && !d->tags[2]->isEmpty()) return false; return true; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/tagunion.h���������������������������������������������������������������������0000664�0000000�0000000�00000006543�14447736377�0016334�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_TAGUNION_H #define TAGLIB_TAGUNION_H #include "tag.h" #ifndef DO_NOT_DOCUMENT namespace TagLib { /*! * \internal */ class TagUnion : public Tag { public: enum AccessType { Read, Write }; /*! * Creates a TagLib::Tag that is the union of \a first, \a second, and * \a third. The TagUnion takes ownership of these tags and will handle * their deletion. */ TagUnion(Tag *first = 0, Tag *second = 0, Tag *third = 0); virtual ~TagUnion(); Tag *operator[](int index) const; Tag *tag(int index) const; void set(int index, Tag *tag); PropertyMap properties() const; void removeUnsupportedProperties(const StringList &unsupported); virtual String title() const; virtual String artist() const; virtual String album() const; virtual String comment() const; virtual String genre() const; virtual unsigned int year() const; virtual unsigned int track() const; virtual void setTitle(const String &s); virtual void setArtist(const String &s); virtual void setAlbum(const String &s); virtual void setComment(const String &s); virtual void setGenre(const String &s); virtual void setYear(unsigned int i); virtual void setTrack(unsigned int i); virtual bool isEmpty() const; template <class T> T *access(int index, bool create) { if(!create || tag(index)) return static_cast<T *>(tag(index)); set(index, new T); return static_cast<T *>(tag(index)); } private: TagUnion(const Tag &); TagUnion &operator=(const Tag &); class TagUnionPrivate; TagUnionPrivate *d; }; } // namespace TagLib #endif #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/tagutils.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000007141�14447736377�0016672�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tfile.h> #include "id3v1tag.h" #include "id3v2header.h" #include "apetag.h" #include "tagutils.h" using namespace TagLib; long Utils::findID3v1(File *file) { if(!file->isValid()) return -1; // Differentiate between a match of APEv2 magic and a match of ID3v1 magic. if (file->length() >= 131) { file->seek(-131, File::End); const long p = file->tell() + 3; const TagLib::ByteVector data = file->readBlock(8); if(data.containsAt(ID3v1::Tag::fileIdentifier(), 3) && (data != APE::Tag::fileIdentifier())) return p; } else { file->seek(-128, File::End); const long p = file->tell(); if(file->readBlock(3) == ID3v1::Tag::fileIdentifier()) return p; } return -1; } long Utils::findID3v2(File *file) { if(!file->isValid()) return -1; file->seek(0); if(file->readBlock(3) == ID3v2::Header::fileIdentifier()) return 0; return -1; } long Utils::findAPE(File *file, long id3v1Location) { if(!file->isValid()) return -1; if(id3v1Location >= 0) file->seek(id3v1Location - 32, File::Beginning); else file->seek(-32, File::End); const long p = file->tell(); if(file->readBlock(8) == APE::Tag::fileIdentifier()) return p; return -1; } ByteVector TagLib::Utils::readHeader(IOStream *stream, unsigned int length, bool skipID3v2, long *headerOffset) { if(!stream || !stream->isOpen()) return ByteVector(); const long originalPosition = stream->tell(); long bufferOffset = 0; if(skipID3v2) { stream->seek(0); const ByteVector data = stream->readBlock(ID3v2::Header::size()); if(data.startsWith(ID3v2::Header::fileIdentifier())) bufferOffset = ID3v2::Header(data).completeTagSize(); } stream->seek(bufferOffset); const ByteVector header = stream->readBlock(length); stream->seek(originalPosition); if(headerOffset) *headerOffset = bufferOffset; return header; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/tagutils.h���������������������������������������������������������������������0000664�0000000�0000000�00000004400�14447736377�0016332�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_TAGUTILS_H #define TAGLIB_TAGUTILS_H // THIS FILE IS NOT A PART OF THE TAGLIB API #ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header #include <tbytevector.h> namespace TagLib { class File; class IOStream; namespace Utils { long findID3v1(File *file); long findID3v2(File *file); long findAPE(File *file, long id3v1Location); ByteVector readHeader(IOStream *stream, unsigned int length, bool skipID3v2, long *headerOffset = 0); } // namespace Utils } // namespace TagLib #endif #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/�����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016014�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/taglib.h���������������������������������������������������������������0000664�0000000�0000000�00000017125�14447736377�0017435�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_H #define TAGLIB_H #include "taglib_config.h" #define TAGLIB_MAJOR_VERSION 1 #define TAGLIB_MINOR_VERSION 13 #define TAGLIB_PATCH_VERSION 1 #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 1)) || defined(__clang__) #define TAGLIB_IGNORE_MISSING_DESTRUCTOR _Pragma("GCC diagnostic ignored \"-Wnon-virtual-dtor\"") #else #define TAGLIB_IGNORE_MISSING_DESTRUCTOR #endif #if (defined(_MSC_VER) && _MSC_VER >= 1600) #define TAGLIB_CONSTRUCT_BITSET(x) static_cast<unsigned long long>(x) #else #define TAGLIB_CONSTRUCT_BITSET(x) static_cast<unsigned long>(x) #endif #if __cplusplus >= 201402 #define TAGLIB_DEPRECATED [[deprecated]] #elif defined(__GNUC__) || defined(__clang__) #define TAGLIB_DEPRECATED __attribute__((deprecated)) #elif defined(_MSC_VER) #define TAGLIB_DEPRECATED __declspec(deprecated) #else #define TAGLIB_DEPRECATED #endif #include <string> //! A namespace for all TagLib related classes and functions /*! * This namespace contains everything in TagLib. For projects working with * TagLib extensively it may be convenient to add a * \code * using namespace TagLib; * \endcode */ namespace TagLib { class String; // These integer types are deprecated. Do not use them. typedef wchar_t wchar; // Assumed to be sufficient to store a UTF-16 char. typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; typedef unsigned long long ulonglong; /*! * Unfortunately std::wstring isn't defined on some systems, (i.e. GCC < 3) * so I'm providing something here that should be constant. */ typedef std::basic_string<wchar_t> wstring; } // namespace TagLib /*! * \mainpage TagLib * * \section intro Introduction * * TagLib is a library for reading and editing audio meta data, commonly know as \e tags. * * Features: * - A clean, high level, C++ API to handling audio meta data. * - Format specific APIs for advanced API users. * - ID3v1, ID3v2, APE, FLAC, Xiph, iTunes-style MP4 and WMA tag formats. * - MP3, MPC, FLAC, MP4, ASF, AIFF, WAV, TrueAudio, WavPack, Ogg FLAC, Ogg Vorbis, Speex and Opus file formats. * - Basic audio file properties such as length, sample rate, etc. * - Long term binary and source compatibility. * - Extensible design, notably the ability to add other formats or extend current formats as a library user. * - Full support for unicode and internationalized tags. * - Dual <a href="http://www.mozilla.org/MPL/MPL-1.1.html">MPL</a> and * <a href="http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html">LGPL</a> licenses. * - No external toolkit dependencies. * * \section why Why TagLib? * * TagLib originally was written to provide an updated and improved ID3v2 implementation in C++ for use * in a variety of Open Source projects. Since development began in 2002 and the 1.0 release in 2004 * it has expanded to cover a wide variety of tag and file formats and is used in a wide variety of * Open Source and proprietary applications. It now supports a variety of UNIXes, including Apple's OS * X, as well as Microsoft Windows. * * \section commercial Usage in Commercial Applications * * TagLib's licenses \e do allow usage within propriety (\e closed) applications, however TagLib is \e not * public domain. Please note the requirements of the LGPL or MPL, and adhere to at least one of them. * In simple terms, you must at a minimum note your usage of TagLib, note the licensing terms of TagLib and * if you make changes to TagLib publish them. Please review the licenses above before using TagLib in your * software. Note that you may choose either the MPL or the LGPL, you do not have to fulfill the * requirements of both. * * \section installing Installing TagLib * * Please see the <a href="http://taglib.org/">TagLib website</a> for the latest * downloads. * * TagLib can be built using the CMake build system. TagLib installs a taglib-config and pkg-config file to * make it easier to integrate into various build systems. Note that TagLib's include install directory \e must * be included in the header include path. Simply adding <taglib/tag.h> will \e not work. * * \section start Getting Started * * TagLib provides both simple, abstract APIs which make it possible to ignore the differences between tagging * formats and format specific APIs which allow programmers to work with the features of specific tagging * schemes. There is a similar abstraction mechanism for AudioProperties. * * The best place to start is with the <b>Class Hierarchy</b> linked at the top of the page. The File and * AudioProperties classes and their subclasses are the core of TagLib. The FileRef class is also a convenient * way for using a value-based handle. * * \note When working with FileRef please consider that it has only the most basic (extension-based) file * type resolution. Please see its documentation on how to plug in more advanced file type resolution. (Such * resolution may be part of later TagLib releases by default.) * * Here's a very simple example with TagLib: * * \code * * TagLib::FileRef f("Latex Solar Beef.mp3"); * TagLib::String artist = f.tag()->artist(); // artist == "Frank Zappa" * * f.tag()->setAlbum("Fillmore East"); * f.save(); * * TagLib::FileRef g("Free City Rhymes.ogg"); * TagLib::String album = g.tag()->album(); // album == "NYC Ghosts & Flowers" * * g.tag()->setTrack(1); * g.save(); * * \endcode * * More examples can be found in the \e examples directory of the source distribution. * * \section Contact * * Questions about TagLib should be directed to the TagLib mailing list, not directly to the author. * * - <a href="http://taglib.org/">TagLib Homepage</a> * - <a href="https://mail.kde.org/mailman/listinfo/taglib-devel">TagLib Mailing List (taglib-devel@kde.org)</a> * * \author <a href="https://github.com/taglib/taglib/blob/master/AUTHORS">TagLib authors</a>. */ #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tbytevector.cpp��������������������������������������������������������0000664�0000000�0000000�00000071646�14447736377�0021110�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <algorithm> #include <iostream> #include <limits> #include <cmath> #include <cstdio> #include <cstring> #include <tstring.h> #include <tdebug.h> #include <trefcounter.h> #include <tutils.h> #include "tbytevector.h" // This is a bit ugly to keep writing over and over again. // A rather obscure feature of the C++ spec that I hadn't thought of that makes // working with C libs much more efficient. There's more here: // // http://www.informit.com/isapi/product_id~{9C84DAB4-FE6E-49C5-BB0A-FB50331233EA}/content/index.asp namespace TagLib { template <class TIterator> int findChar( const TIterator dataBegin, const TIterator dataEnd, char c, unsigned int offset, int byteAlign) { const size_t dataSize = dataEnd - dataBegin; if(offset + 1 > dataSize) return -1; // n % 0 is invalid if(byteAlign == 0) return -1; for(TIterator it = dataBegin + offset; it < dataEnd; it += byteAlign) { if(*it == c) return static_cast<int>(it - dataBegin); } return -1; } template <class TIterator> int findVector( const TIterator dataBegin, const TIterator dataEnd, const TIterator patternBegin, const TIterator patternEnd, unsigned int offset, int byteAlign) { const size_t dataSize = dataEnd - dataBegin; const size_t patternSize = patternEnd - patternBegin; if(patternSize == 0 || offset + patternSize > dataSize) return -1; // Special case that pattern contains just single char. if(patternSize == 1) return findChar(dataBegin, dataEnd, *patternBegin, offset, byteAlign); // n % 0 is invalid if(byteAlign == 0) return -1; // We don't use sophisticated algorithms like Knuth-Morris-Pratt here. // In the current implementation of TagLib, data and patterns are too small // for such algorithms to work effectively. for(TIterator it = dataBegin + offset; it < dataEnd - patternSize + 1; it += byteAlign) { TIterator itData = it; TIterator itPattern = patternBegin; while(*itData == *itPattern) { ++itData; ++itPattern; if(itPattern == patternEnd) return static_cast<int>(it - dataBegin); } } return -1; } template <class T> T toNumber(const ByteVector &v, size_t offset, size_t length, bool mostSignificantByteFirst) { if(offset >= v.size()) { debug("toNumber<T>() -- No data to convert. Returning 0."); return 0; } length = std::min(length, v.size() - offset); T sum = 0; for(size_t i = 0; i < length; i++) { const size_t shift = (mostSignificantByteFirst ? length - 1 - i : i) * 8; sum |= static_cast<T>(static_cast<unsigned char>(v[static_cast<int>(offset + i)])) << shift; } return sum; } template <class T> T toNumber(const ByteVector &v, size_t offset, bool mostSignificantByteFirst) { const bool isBigEndian = (Utils::systemByteOrder() == Utils::BigEndian); const bool swap = (mostSignificantByteFirst != isBigEndian); if(offset + sizeof(T) > v.size()) return toNumber<T>(v, offset, v.size() - offset, mostSignificantByteFirst); // Uses memcpy instead of reinterpret_cast to avoid an alignment exception. T tmp; ::memcpy(&tmp, v.data() + offset, sizeof(T)); if(swap) return Utils::byteSwap(tmp); return tmp; } template <class T> ByteVector fromNumber(T value, bool mostSignificantByteFirst) { const bool isBigEndian = (Utils::systemByteOrder() == Utils::BigEndian); const bool swap = (mostSignificantByteFirst != isBigEndian); if(swap) value = Utils::byteSwap(value); return ByteVector(reinterpret_cast<const char *>(&value), sizeof(T)); } template <typename TFloat, typename TInt, Utils::ByteOrder ENDIAN> TFloat toFloat(const ByteVector &v, size_t offset) { if(offset > v.size() - sizeof(TInt)) { debug("toFloat() - offset is out of range. Returning 0."); return 0.0; } union { TInt i; TFloat f; } tmp; ::memcpy(&tmp, v.data() + offset, sizeof(TInt)); if(ENDIAN != Utils::systemByteOrder()) tmp.i = Utils::byteSwap(tmp.i); return tmp.f; } template <typename TFloat, typename TInt, Utils::ByteOrder ENDIAN> ByteVector fromFloat(TFloat value) { union { TInt i; TFloat f; } tmp; tmp.f = value; if(ENDIAN != Utils::systemByteOrder()) tmp.i = Utils::byteSwap(tmp.i); return ByteVector(reinterpret_cast<char *>(&tmp), sizeof(TInt)); } template <Utils::ByteOrder ENDIAN> long double toFloat80(const ByteVector &v, size_t offset) { using std::swap; if(offset > v.size() - 10) { debug("toFloat80() - offset is out of range. Returning 0."); return 0.0; } unsigned char bytes[10]; ::memcpy(bytes, v.data() + offset, 10); if(ENDIAN == Utils::LittleEndian) { swap(bytes[0], bytes[9]); swap(bytes[1], bytes[8]); swap(bytes[2], bytes[7]); swap(bytes[3], bytes[6]); swap(bytes[4], bytes[5]); } // 1-bit sign const bool negative = ((bytes[0] & 0x80) != 0); // 15-bit exponent const int exponent = ((bytes[0] & 0x7F) << 8) | bytes[1]; // 64-bit fraction. Leading 1 is explicit. const unsigned long long fraction = (static_cast<unsigned long long>(bytes[2]) << 56) | (static_cast<unsigned long long>(bytes[3]) << 48) | (static_cast<unsigned long long>(bytes[4]) << 40) | (static_cast<unsigned long long>(bytes[5]) << 32) | (static_cast<unsigned long long>(bytes[6]) << 24) | (static_cast<unsigned long long>(bytes[7]) << 16) | (static_cast<unsigned long long>(bytes[8]) << 8) | (static_cast<unsigned long long>(bytes[9])); long double val; if(exponent == 0 && fraction == 0) val = 0; else { if(exponent == 0x7FFF) { debug("toFloat80() - can't handle the infinity or NaN. Returning 0."); return 0.0; } val = ::ldexp(static_cast<long double>(fraction), exponent - 16383 - 63); } if(negative) return -val; return val; } class ByteVector::ByteVectorPrivate { public: ByteVectorPrivate(unsigned int l, char c) : counter(new RefCounter()), data(new std::vector<char>(l, c)), offset(0), length(l) {} ByteVectorPrivate(const char *s, unsigned int l) : counter(new RefCounter()), data(new std::vector<char>(s, s + l)), offset(0), length(l) {} ByteVectorPrivate(const ByteVectorPrivate &d, unsigned int o, unsigned int l) : counter(d.counter), data(d.data), offset(d.offset + o), length(l) { counter->ref(); } ~ByteVectorPrivate() { if(counter->deref()) { delete counter; delete data; } } RefCounter *counter; std::vector<char> *data; unsigned int offset; unsigned int length; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// ByteVector ByteVector::null; ByteVector ByteVector::fromCString(const char *s, unsigned int length) { if(length == 0xffffffff) return ByteVector(s, static_cast<unsigned int>(::strlen(s))); return ByteVector(s, length); } ByteVector ByteVector::fromUInt(unsigned int value, bool mostSignificantByteFirst) { return fromNumber<unsigned int>(value, mostSignificantByteFirst); } ByteVector ByteVector::fromShort(short value, bool mostSignificantByteFirst) { return fromNumber<unsigned short>(value, mostSignificantByteFirst); } ByteVector ByteVector::fromLongLong(long long value, bool mostSignificantByteFirst) { return fromNumber<unsigned long long>(value, mostSignificantByteFirst); } ByteVector ByteVector::fromFloat32LE(float value) { return fromFloat<float, unsigned int, Utils::LittleEndian>(value); } ByteVector ByteVector::fromFloat32BE(float value) { return fromFloat<float, unsigned int, Utils::BigEndian>(value); } ByteVector ByteVector::fromFloat64LE(double value) { return fromFloat<double, unsigned long long, Utils::LittleEndian>(value); } ByteVector ByteVector::fromFloat64BE(double value) { return fromFloat<double, unsigned long long, Utils::BigEndian>(value); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// ByteVector::ByteVector() : d(new ByteVectorPrivate(0, '\0')) { } ByteVector::ByteVector(unsigned int size, char value) : d(new ByteVectorPrivate(size, value)) { } ByteVector::ByteVector(const ByteVector &v) : d(new ByteVectorPrivate(*v.d, 0, v.d->length)) { } ByteVector::ByteVector(const ByteVector &v, unsigned int offset, unsigned int length) : d(new ByteVectorPrivate(*v.d, offset, length)) { } ByteVector::ByteVector(char c) : d(new ByteVectorPrivate(1, c)) { } ByteVector::ByteVector(const char *data, unsigned int length) : d(new ByteVectorPrivate(data, length)) { } ByteVector::ByteVector(const char *data) : d(new ByteVectorPrivate(data, static_cast<unsigned int>(::strlen(data)))) { } ByteVector::~ByteVector() { delete d; } ByteVector &ByteVector::setData(const char *s, unsigned int length) { ByteVector(s, length).swap(*this); return *this; } ByteVector &ByteVector::setData(const char *data) { ByteVector(data).swap(*this); return *this; } char *ByteVector::data() { detach(); return (size() > 0) ? (&(*d->data)[d->offset]) : 0; } const char *ByteVector::data() const { return (size() > 0) ? (&(*d->data)[d->offset]) : 0; } ByteVector ByteVector::mid(unsigned int index, unsigned int length) const { index = std::min(index, size()); length = std::min(length, size() - index); return ByteVector(*this, index, length); } char ByteVector::at(unsigned int index) const { return (index < size()) ? (*d->data)[d->offset + index] : 0; } int ByteVector::find(const ByteVector &pattern, unsigned int offset, int byteAlign) const { return findVector<ConstIterator>( begin(), end(), pattern.begin(), pattern.end(), offset, byteAlign); } int ByteVector::find(char c, unsigned int offset, int byteAlign) const { return findChar<ConstIterator>(begin(), end(), c, offset, byteAlign); } int ByteVector::rfind(const ByteVector &pattern, unsigned int offset, int byteAlign) const { if(offset > 0) { offset = size() - offset - pattern.size(); if(offset >= size()) offset = 0; } const int pos = findVector<ConstReverseIterator>( rbegin(), rend(), pattern.rbegin(), pattern.rend(), offset, byteAlign); if(pos == -1) return -1; return size() - pos - pattern.size(); } bool ByteVector::containsAt(const ByteVector &pattern, unsigned int offset, unsigned int patternOffset, unsigned int patternLength) const { if(pattern.size() < patternLength) patternLength = pattern.size(); // do some sanity checking -- all of these things are needed for the search to be valid const unsigned int compareLength = patternLength - patternOffset; if(offset + compareLength > size() || patternOffset >= pattern.size() || patternLength == 0) return false; return (::memcmp(data() + offset, pattern.data() + patternOffset, compareLength) == 0); } bool ByteVector::startsWith(const ByteVector &pattern) const { return containsAt(pattern, 0); } bool ByteVector::endsWith(const ByteVector &pattern) const { return containsAt(pattern, size() - pattern.size()); } ByteVector &ByteVector::replace(char oldByte, char newByte) { detach(); for(ByteVector::Iterator it = begin(); it != end(); ++it) { if(*it == oldByte) *it = newByte; } return *this; } ByteVector &ByteVector::replace(const ByteVector &pattern, const ByteVector &with) { if(pattern.size() == 1 && with.size() == 1) return replace(pattern[0], with[0]); // Check if there is at least one occurrence of the pattern. int offset = find(pattern, 0); if(offset == -1) return *this; if(pattern.size() == with.size()) { // We think this case might be common enough to optimize it. detach(); do { ::memcpy(data() + offset, with.data(), with.size()); offset = find(pattern, offset + pattern.size()); } while(offset != -1); } else { // Loop once to calculate the result size. unsigned int dstSize = size(); do { dstSize += with.size() - pattern.size(); offset = find(pattern, offset + pattern.size()); } while(offset != -1); // Loop again to copy modified data to the new vector. ByteVector dst(dstSize); int dstOffset = 0; offset = 0; while(true) { const int next = find(pattern, offset); if(next == -1) { ::memcpy(dst.data() + dstOffset, data() + offset, size() - offset); break; } ::memcpy(dst.data() + dstOffset, data() + offset, next - offset); dstOffset += next - offset; ::memcpy(dst.data() + dstOffset, with.data(), with.size()); dstOffset += with.size(); offset = next + pattern.size(); } swap(dst); } return *this; } int ByteVector::endsWithPartialMatch(const ByteVector &pattern) const { if(pattern.size() > size()) return -1; const int startIndex = size() - pattern.size(); // try to match the last n-1 bytes from the vector (where n is the pattern // size) -- continue trying to match n-2, n-3...1 bytes for(unsigned int i = 1; i < pattern.size(); i++) { if(containsAt(pattern, startIndex + i, 0, pattern.size() - i)) return startIndex + i; } return -1; } ByteVector &ByteVector::append(const ByteVector &v) { if(v.isEmpty()) return *this; detach(); const unsigned int originalSize = size(); const unsigned int appendSize = v.size(); resize(originalSize + appendSize); ::memcpy(data() + originalSize, v.data(), appendSize); return *this; } ByteVector &ByteVector::append(char c) { resize(size() + 1, c); return *this; } ByteVector &ByteVector::clear() { ByteVector().swap(*this); return *this; } unsigned int ByteVector::size() const { return d->length; } ByteVector &ByteVector::resize(unsigned int size, char padding) { if(size != d->length) { detach(); // Remove the excessive length of the internal buffer first to pad correctly. // This doesn't reallocate the buffer, since std::vector::resize() doesn't // reallocate the buffer when shrinking. d->data->resize(d->offset + d->length); d->data->resize(d->offset + size, padding); d->length = size; } return *this; } ByteVector::Iterator ByteVector::begin() { detach(); return d->data->begin() + d->offset; } ByteVector::ConstIterator ByteVector::begin() const { return d->data->begin() + d->offset; } ByteVector::Iterator ByteVector::end() { detach(); return d->data->begin() + d->offset + d->length; } ByteVector::ConstIterator ByteVector::end() const { return d->data->begin() + d->offset + d->length; } ByteVector::ReverseIterator ByteVector::rbegin() { detach(); return d->data->rbegin() + (d->data->size() - (d->offset + d->length)); } ByteVector::ConstReverseIterator ByteVector::rbegin() const { // Workaround for the Solaris Studio 12.4 compiler. // We need a const reference to the data vector so we can ensure the const version of rbegin() is called. const std::vector<char> &v = *d->data; return v.rbegin() + (v.size() - (d->offset + d->length)); } ByteVector::ReverseIterator ByteVector::rend() { detach(); return d->data->rbegin() + (d->data->size() - d->offset); } ByteVector::ConstReverseIterator ByteVector::rend() const { // Workaround for the Solaris Studio 12.4 compiler. // We need a const reference to the data vector so we can ensure the const version of rbegin() is called. const std::vector<char> &v = *d->data; return v.rbegin() + (v.size() - d->offset); } bool ByteVector::isNull() const { return (d == null.d); } bool ByteVector::isEmpty() const { return (d->length == 0); } unsigned int ByteVector::checksum() const { static const unsigned int crcTable[256] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 }; unsigned int sum = 0; for(ByteVector::ConstIterator it = begin(); it != end(); ++it) sum = (sum << 8) ^ crcTable[((sum >> 24) & 0xff) ^ static_cast<unsigned char>(*it)]; return sum; } unsigned int ByteVector::toUInt(bool mostSignificantByteFirst) const { return toNumber<unsigned int>(*this, 0, mostSignificantByteFirst); } unsigned int ByteVector::toUInt(unsigned int offset, bool mostSignificantByteFirst) const { return toNumber<unsigned int>(*this, offset, mostSignificantByteFirst); } unsigned int ByteVector::toUInt(unsigned int offset, unsigned int length, bool mostSignificantByteFirst) const { return toNumber<unsigned int>(*this, offset, length, mostSignificantByteFirst); } short ByteVector::toShort(bool mostSignificantByteFirst) const { return toNumber<unsigned short>(*this, 0, mostSignificantByteFirst); } short ByteVector::toShort(unsigned int offset, bool mostSignificantByteFirst) const { return toNumber<unsigned short>(*this, offset, mostSignificantByteFirst); } unsigned short ByteVector::toUShort(bool mostSignificantByteFirst) const { return toNumber<unsigned short>(*this, 0, mostSignificantByteFirst); } unsigned short ByteVector::toUShort(unsigned int offset, bool mostSignificantByteFirst) const { return toNumber<unsigned short>(*this, offset, mostSignificantByteFirst); } long long ByteVector::toLongLong(bool mostSignificantByteFirst) const { return toNumber<unsigned long long>(*this, 0, mostSignificantByteFirst); } long long ByteVector::toLongLong(unsigned int offset, bool mostSignificantByteFirst) const { return toNumber<unsigned long long>(*this, offset, mostSignificantByteFirst); } float ByteVector::toFloat32LE(size_t offset) const { return toFloat<float, unsigned int, Utils::LittleEndian>(*this, offset); } float ByteVector::toFloat32BE(size_t offset) const { return toFloat<float, unsigned int, Utils::BigEndian>(*this, offset); } double ByteVector::toFloat64LE(size_t offset) const { return toFloat<double, unsigned long long, Utils::LittleEndian>(*this, offset); } double ByteVector::toFloat64BE(size_t offset) const { return toFloat<double, unsigned long long, Utils::BigEndian>(*this, offset); } long double ByteVector::toFloat80LE(size_t offset) const { return toFloat80<Utils::LittleEndian>(*this, offset); } long double ByteVector::toFloat80BE(size_t offset) const { return toFloat80<Utils::BigEndian>(*this, offset); } const char &ByteVector::operator[](int index) const { return (*d->data)[d->offset + index]; } char &ByteVector::operator[](int index) { detach(); return (*d->data)[d->offset + index]; } bool ByteVector::operator==(const ByteVector &v) const { if(size() != v.size()) return false; return (::memcmp(data(), v.data(), size()) == 0); } bool ByteVector::operator!=(const ByteVector &v) const { return !(*this == v); } bool ByteVector::operator==(const char *s) const { if(size() != ::strlen(s)) return false; return (::memcmp(data(), s, size()) == 0); } bool ByteVector::operator!=(const char *s) const { return !(*this == s); } bool ByteVector::operator<(const ByteVector &v) const { const int result = ::memcmp(data(), v.data(), std::min(size(), v.size())); if(result != 0) return result < 0; return size() < v.size(); } bool ByteVector::operator>(const ByteVector &v) const { return (v < *this); } ByteVector ByteVector::operator+(const ByteVector &v) const { ByteVector sum(*this); sum.append(v); return sum; } ByteVector &ByteVector::operator=(const ByteVector &v) { ByteVector(v).swap(*this); return *this; } ByteVector &ByteVector::operator=(char c) { ByteVector(c).swap(*this); return *this; } ByteVector &ByteVector::operator=(const char *data) { ByteVector(data).swap(*this); return *this; } void ByteVector::swap(ByteVector &v) { using std::swap; swap(d, v.d); } ByteVector ByteVector::toHex() const { static const char hexTable[17] = "0123456789abcdef"; ByteVector encoded(size() * 2); char *p = encoded.data(); for(unsigned int i = 0; i < size(); i++) { unsigned char c = data()[i]; *p++ = hexTable[(c >> 4) & 0x0F]; *p++ = hexTable[(c ) & 0x0F]; } return encoded; } ByteVector ByteVector::fromBase64(const ByteVector & input) { static const unsigned char base64[256] = { 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x3e,0x80,0x80,0x80,0x3f, 0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e, 0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x80,0x80,0x80,0x80,0x80, 0x80,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28, 0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80 }; unsigned int len = input.size(); ByteVector output(len); const unsigned char * src = reinterpret_cast<const unsigned char*>(input.data()); unsigned char * dst = reinterpret_cast<unsigned char*>(output.data()); while(4 <= len) { // Check invalid character if(base64[src[0]] == 0x80) break; // Check invalid character if(base64[src[1]] == 0x80) break; // Decode first byte *dst++ = ((base64[src[0]] << 2) & 0xfc) | ((base64[src[1]] >> 4) & 0x03); if(src[2] != '=') { // Check invalid character if(base64[src[2]] == 0x80) break; // Decode second byte *dst++ = ((base64[src[1]] & 0x0f) << 4) | ((base64[src[2]] >> 2) & 0x0f); if(src[3] != '=') { // Check invalid character if(base64[src[3]] == 0x80) break; // Decode third byte *dst++ = ((base64[src[2]] & 0x03) << 6) | (base64[src[3]] & 0x3f); } else { // assume end of data len -= 4; break; } } else { // assume end of data len -= 4; break; } src += 4; len -= 4; } // Only return output if we processed all bytes if(len == 0) { output.resize(static_cast<unsigned int>(dst - reinterpret_cast<unsigned char*>(output.data()))); return output; } return ByteVector(); } ByteVector ByteVector::toBase64() const { static const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; if(!isEmpty()) { unsigned int len = size(); ByteVector output(4 * ((len - 1) / 3 + 1)); // note roundup const char * src = data(); char * dst = output.data(); while(3 <= len) { *dst++ = alphabet[(src[0] >> 2) & 0x3f]; *dst++ = alphabet[((src[0] & 0x03) << 4) | ((src[1] >> 4) & 0x0f)]; *dst++ = alphabet[((src[1] & 0x0f) << 2) | ((src[2] >> 6) & 0x03)]; *dst++ = alphabet[src[2] & 0x3f]; src += 3; len -= 3; } if(len) { *dst++ = alphabet[(src[0] >> 2) & 0x3f]; if(len>1) { *dst++ = alphabet[((src[0] & 0x03) << 4) | ((src[1] >> 4) & 0x0f)]; *dst++ = alphabet[((src[1] & 0x0f) << 2)]; } else { *dst++ = alphabet[(src[0] & 0x03) << 4]; *dst++ = '='; } *dst++ = '='; } return output; } return ByteVector(); } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void ByteVector::detach() { if(d->counter->count() > 1) { if(!isEmpty()) ByteVector(&d->data->front() + d->offset, d->length).swap(*this); else ByteVector().swap(*this); } } } // namespace TagLib //////////////////////////////////////////////////////////////////////////////// // related functions //////////////////////////////////////////////////////////////////////////////// std::ostream &operator<<(std::ostream &s, const TagLib::ByteVector &v) { for(unsigned int i = 0; i < v.size(); i++) s << v[i]; return s; } ������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tbytevector.h����������������������������������������������������������0000664�0000000�0000000�00000051752�14447736377�0020551�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_BYTEVECTOR_H #define TAGLIB_BYTEVECTOR_H #include "taglib.h" #include "taglib_export.h" #include <vector> #include <iostream> namespace TagLib { //! A byte vector /*! * This class provides a byte vector with some methods that are useful for * tagging purposes. Many of the search functions are tailored to what is * useful for finding tag related patterns in a data array. */ class TAGLIB_EXPORT ByteVector { public: #ifndef DO_NOT_DOCUMENT typedef std::vector<char>::iterator Iterator; typedef std::vector<char>::const_iterator ConstIterator; typedef std::vector<char>::reverse_iterator ReverseIterator; typedef std::vector<char>::const_reverse_iterator ConstReverseIterator; #endif /*! * Constructs an empty byte vector. */ ByteVector(); /*! * Construct a vector of size \a size with all values set to \a value by * default. */ ByteVector(unsigned int size, char value = 0); /*! * Constructs a byte vector that is a copy of \a v. */ ByteVector(const ByteVector &v); /*! * Constructs a byte vector that is a copy of \a v. */ ByteVector(const ByteVector &v, unsigned int offset, unsigned int length); /*! * Constructs a byte vector that contains \a c. */ ByteVector(char c); /*! * Constructs a byte vector that copies \a data for up to \a length bytes. */ ByteVector(const char *data, unsigned int length); /*! * Constructs a byte vector that copies \a data up to the first null * byte. This is particularly useful for constructing byte arrays from * string constants. * * \warning The behavior is undefined if \a data is not null terminated. */ ByteVector(const char *data); /*! * Destroys this ByteVector instance. */ virtual ~ByteVector(); /*! * Sets the data for the byte array using the first \a length bytes of \a data */ ByteVector &setData(const char *data, unsigned int length); /*! * Sets the data for the byte array copies \a data up to the first null * byte. The behavior is undefined if \a data is not null terminated. */ ByteVector &setData(const char *data); /*! * Returns a pointer to the internal data structure. * * \warning Care should be taken when modifying this data structure as it is * easy to corrupt the ByteVector when doing so. Specifically, while the * data may be changed, its length may not be. */ char *data(); /*! * Returns a pointer to the internal data structure which may not be modified. */ const char *data() const; /*! * Returns a byte vector made up of the bytes starting at \a index and * for \a length bytes. If \a length is not specified it will return the bytes * from \a index to the end of the vector. */ ByteVector mid(unsigned int index, unsigned int length = 0xffffffff) const; /*! * This essentially performs the same as operator[](), but instead of causing * a runtime error if the index is out of bounds, it will return a null byte. */ char at(unsigned int index) const; /*! * Searches the ByteVector for \a pattern starting at \a offset and returns * the offset. Returns -1 if the pattern was not found. If \a byteAlign is * specified the pattern will only be matched if it starts on a byte divisible * by \a byteAlign (starting from \a offset). */ int find(const ByteVector &pattern, unsigned int offset = 0, int byteAlign = 1) const; /*! * Searches the char for \a c starting at \a offset and returns * the offset. Returns \a -1 if the pattern was not found. If \a byteAlign is * specified the pattern will only be matched if it starts on a byte divisible * by \a byteAlign (starting from \a offset). */ int find(char c, unsigned int offset = 0, int byteAlign = 1) const; /*! * Searches the ByteVector for \a pattern starting from either the end of the * vector or \a offset and returns the offset. Returns -1 if the pattern was * not found. If \a byteAlign is specified the pattern will only be matched * if it starts on a byte divisible by \a byteAlign (starting from \a offset). */ int rfind(const ByteVector &pattern, unsigned int offset = 0, int byteAlign = 1) const; /*! * Checks to see if the vector contains the \a pattern starting at position * \a offset. Optionally, if you only want to search for part of the pattern * you can specify an offset within the pattern to start from. Also, you can * specify to only check for the first \a patternLength bytes of \a pattern with * the \a patternLength argument. */ bool containsAt(const ByteVector &pattern, unsigned int offset, unsigned int patternOffset = 0, unsigned int patternLength = 0xffffffff) const; /*! * Returns true if the vector starts with \a pattern. */ bool startsWith(const ByteVector &pattern) const; /*! * Returns true if the vector ends with \a pattern. */ bool endsWith(const ByteVector &pattern) const; /*! * Replaces \a oldByte with \a newByte and returns a reference to the * ByteVector after the operation. This \e does modify the vector. */ ByteVector &replace(char oldByte, char newByte); /*! * Replaces \a pattern with \a with and returns a reference to the ByteVector * after the operation. This \e does modify the vector. */ ByteVector &replace(const ByteVector &pattern, const ByteVector &with); /*! * Checks for a partial match of \a pattern at the end of the vector. It * returns the offset of the partial match within the vector, or -1 if the * pattern is not found. This method is particularly useful when searching for * patterns that start in one vector and end in another. When combined with * startsWith() it can be used to find a pattern that overlaps two buffers. * * \note This will not match the complete pattern at the end of the string; use * endsWith() for that. */ int endsWithPartialMatch(const ByteVector &pattern) const; /*! * Appends \a v to the end of the ByteVector. */ ByteVector &append(const ByteVector &v); /*! * Appends \a c to the end of the ByteVector. */ ByteVector &append(char c); /*! * Clears the data. */ ByteVector &clear(); /*! * Returns the size of the array. */ unsigned int size() const; /*! * Resize the vector to \a size. If the vector is currently less than * \a size, pad the remaining spaces with \a padding. Returns a reference * to the resized vector. */ ByteVector &resize(unsigned int size, char padding = 0); /*! * Returns an Iterator that points to the front of the vector. */ Iterator begin(); /*! * Returns a ConstIterator that points to the front of the vector. */ ConstIterator begin() const; /*! * Returns an Iterator that points to the back of the vector. */ Iterator end(); /*! * Returns a ConstIterator that points to the back of the vector. */ ConstIterator end() const; /*! * Returns a ReverseIterator that points to the front of the vector. */ ReverseIterator rbegin(); /*! * Returns a ConstReverseIterator that points to the front of the vector. */ ConstReverseIterator rbegin() const; /*! * Returns a ReverseIterator that points to the back of the vector. */ ReverseIterator rend(); /*! * Returns a ConstReverseIterator that points to the back of the vector. */ ConstReverseIterator rend() const; /*! * Returns true if the vector is null. * * \note A vector may be empty without being null. So do not use this * method to check if the vector is empty. * * \see isEmpty() * * \deprecated Use isEmpty(), do not differentiate between null and empty. */ // BIC: remove TAGLIB_DEPRECATED bool isNull() const; /*! * Returns true if the ByteVector is empty. * * \see size() * \see isNull() */ bool isEmpty() const; /*! * Returns a CRC checksum of the byte vector's data. * * \note This uses an uncommon variant of CRC32 specializes in Ogg. */ // BIC: Remove or make generic. unsigned int checksum() const; /*! * Converts the first 4 bytes of the vector to an unsigned integer. * * If \a mostSignificantByteFirst is true this will operate left to right * evaluating the integer. For example if \a mostSignificantByteFirst is * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == * 0x01000000 == 1. * * \see fromUInt() */ unsigned int toUInt(bool mostSignificantByteFirst = true) const; /*! * Converts the 4 bytes at \a offset of the vector to an unsigned integer. * * If \a mostSignificantByteFirst is true this will operate left to right * evaluating the integer. For example if \a mostSignificantByteFirst is * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == * 0x01000000 == 1. * * \see fromUInt() */ unsigned int toUInt(unsigned int offset, bool mostSignificantByteFirst = true) const; /*! * Converts the \a length bytes at \a offset of the vector to an unsigned * integer. If \a length is larger than 4, the excess is ignored. * * If \a mostSignificantByteFirst is true this will operate left to right * evaluating the integer. For example if \a mostSignificantByteFirst is * true then $00 $00 $00 $01 == 0x00000001 == 1, if false, $01 00 00 00 == * 0x01000000 == 1. * * \see fromUInt() */ unsigned int toUInt(unsigned int offset, unsigned int length, bool mostSignificantByteFirst = true) const; /*! * Converts the first 2 bytes of the vector to a (signed) short. * * If \a mostSignificantByteFirst is true this will operate left to right * evaluating the integer. For example if \a mostSignificantByteFirst is * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. * * \see fromShort() */ short toShort(bool mostSignificantByteFirst = true) const; /*! * Converts the 2 bytes at \a offset of the vector to a (signed) short. * * If \a mostSignificantByteFirst is true this will operate left to right * evaluating the integer. For example if \a mostSignificantByteFirst is * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. * * \see fromShort() */ short toShort(unsigned int offset, bool mostSignificantByteFirst = true) const; /*! * Converts the first 2 bytes of the vector to a unsigned short. * * If \a mostSignificantByteFirst is true this will operate left to right * evaluating the integer. For example if \a mostSignificantByteFirst is * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. * * \see fromShort() */ unsigned short toUShort(bool mostSignificantByteFirst = true) const; /*! * Converts the 2 bytes at \a offset of the vector to a unsigned short. * * If \a mostSignificantByteFirst is true this will operate left to right * evaluating the integer. For example if \a mostSignificantByteFirst is * true then $00 $01 == 0x0001 == 1, if false, $01 00 == 0x01000000 == 1. * * \see fromShort() */ unsigned short toUShort(unsigned int offset, bool mostSignificantByteFirst = true) const; /*! * Converts the first 8 bytes of the vector to a (signed) long long. * * If \a mostSignificantByteFirst is true this will operate left to right * evaluating the integer. For example if \a mostSignificantByteFirst is * true then $00 00 00 00 00 00 00 01 == 0x0000000000000001 == 1, * if false, $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. * * \see fromUInt() */ long long toLongLong(bool mostSignificantByteFirst = true) const; /*! * Converts the 8 bytes at \a offset of the vector to a (signed) long long. * * If \a mostSignificantByteFirst is true this will operate left to right * evaluating the integer. For example if \a mostSignificantByteFirst is * true then $00 00 00 00 00 00 00 01 == 0x0000000000000001 == 1, * if false, $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. * * \see fromUInt() */ long long toLongLong(unsigned int offset, bool mostSignificantByteFirst = true) const; /* * Converts the 4 bytes at \a offset of the vector to a float as an IEEE754 * 32-bit little-endian floating point number. */ float toFloat32LE(size_t offset) const; /* * Converts the 4 bytes at \a offset of the vector to a float as an IEEE754 * 32-bit big-endian floating point number. */ float toFloat32BE(size_t offset) const; /* * Converts the 8 bytes at \a offset of the vector to a double as an IEEE754 * 64-bit little-endian floating point number. */ double toFloat64LE(size_t offset) const; /* * Converts the 8 bytes at \a offset of the vector to a double as an IEEE754 * 64-bit big-endian floating point number. */ double toFloat64BE(size_t offset) const; /* * Converts the 10 bytes at \a offset of the vector to a long double as an * IEEE754 80-bit little-endian floating point number. * * \note This may compromise the precision depends on the size of long double. */ long double toFloat80LE(size_t offset) const; /* * Converts the 10 bytes at \a offset of the vector to a long double as an * IEEE754 80-bit big-endian floating point number. * * \note This may compromise the precision depends on the size of long double. */ long double toFloat80BE(size_t offset) const; /*! * Creates a 4 byte ByteVector based on \a value. If * \a mostSignificantByteFirst is true, then this will operate left to right * in building the ByteVector. For example if \a mostSignificantByteFirst is * true then $00 00 00 01 == 0x00000001 == 1, if false, $01 00 00 00 == * 0x01000000 == 1. * * \see toUInt() */ static ByteVector fromUInt(unsigned int value, bool mostSignificantByteFirst = true); /*! * Creates a 2 byte ByteVector based on \a value. If * \a mostSignificantByteFirst is true, then this will operate left to right * in building the ByteVector. For example if \a mostSignificantByteFirst is * true then $00 01 == 0x0001 == 1, if false, $01 00 == 0x0100 == 1. * * \see toShort() */ static ByteVector fromShort(short value, bool mostSignificantByteFirst = true); /*! * Creates a 8 byte ByteVector based on \a value. If * \a mostSignificantByteFirst is true, then this will operate left to right * in building the ByteVector. For example if \a mostSignificantByteFirst is * true then $00 00 00 01 == 0x0000000000000001 == 1, if false, * $01 00 00 00 00 00 00 00 == 0x0100000000000000 == 1. * * \see toLongLong() */ static ByteVector fromLongLong(long long value, bool mostSignificantByteFirst = true); /*! * Creates a 4 byte ByteVector based on \a value as an IEEE754 32-bit * little-endian floating point number. * * \see fromFloat32BE() */ static ByteVector fromFloat32LE(float value); /*! * Creates a 4 byte ByteVector based on \a value as an IEEE754 32-bit * big-endian floating point number. * * \see fromFloat32LE() */ static ByteVector fromFloat32BE(float value); /*! * Creates a 8 byte ByteVector based on \a value as an IEEE754 64-bit * little-endian floating point number. * * \see fromFloat64BE() */ static ByteVector fromFloat64LE(double value); /*! * Creates a 8 byte ByteVector based on \a value as an IEEE754 64-bit * big-endian floating point number. * * \see fromFloat64LE() */ static ByteVector fromFloat64BE(double value); /*! * Returns a ByteVector based on the CString \a s. */ static ByteVector fromCString(const char *s, unsigned int length = 0xffffffff); /*! * Returns a const reference to the byte at \a index. */ const char &operator[](int index) const; /*! * Returns a reference to the byte at \a index. */ char &operator[](int index); /*! * Returns true if this ByteVector and \a v are equal. */ bool operator==(const ByteVector &v) const; /*! * Returns true if this ByteVector and \a v are not equal. */ bool operator!=(const ByteVector &v) const; /*! * Returns true if this ByteVector and the null terminated C string \a s * contain the same data. */ bool operator==(const char *s) const; /*! * Returns true if this ByteVector and the null terminated C string \a s * do not contain the same data. */ bool operator!=(const char *s) const; /*! * Returns true if this ByteVector is less than \a v. The value of the * vectors is determined by evaluating the character from left to right, and * in the event one vector is a superset of the other, the size is used. */ bool operator<(const ByteVector &v) const; /*! * Returns true if this ByteVector is greater than \a v. */ bool operator>(const ByteVector &v) const; /*! * Returns a vector that is \a v appended to this vector. */ ByteVector operator+(const ByteVector &v) const; /*! * Copies ByteVector \a v. */ ByteVector &operator=(const ByteVector &v); /*! * Copies a byte \a c. */ ByteVector &operator=(char c); /*! * Copies \a data up to the first null byte. * * \warning The behavior is undefined if \a data is not null terminated. */ ByteVector &operator=(const char *data); /*! * Exchanges the content of the ByteVector by the content of \a v. */ void swap(ByteVector &v); /*! * A static, empty ByteVector which is convenient and fast (since returning * an empty or "null" value does not require instantiating a new ByteVector). * * \warning Do not modify this variable. It will mess up the internal state * of TagLib. * * \deprecated Use ByteVector(). */ // BIC: remove TAGLIB_DEPRECATED static ByteVector null; /*! * Returns a hex-encoded copy of the byte vector. */ ByteVector toHex() const; /*! * Returns a base64 encoded copy of the byte vector */ ByteVector toBase64() const; /*! * Decodes the base64 encoded byte vector. */ static ByteVector fromBase64(const ByteVector &); protected: /* * If this ByteVector is being shared via implicit sharing, do a deep copy * of the data and separate from the shared members. This should be called * by all non-const subclass members. */ void detach(); private: class ByteVectorPrivate; ByteVectorPrivate *d; }; } // namespace TagLib /*! * \relates TagLib::ByteVector * Streams the ByteVector \a v to the output stream \a s. */ TAGLIB_EXPORT std::ostream &operator<<(std::ostream &s, const TagLib::ByteVector &v); #endif ����������������������taglib-1.13.1/taglib/toolkit/tbytevectorlist.cpp����������������������������������������������������0000664�0000000�0000000�00000006616�14447736377�0021777�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tbytevectorlist.h" using namespace TagLib; class ByteVectorListPrivate { }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// ByteVectorList ByteVectorList::split(const ByteVector &v, const ByteVector &pattern, int byteAlign) { return split(v, pattern, byteAlign, 0); } ByteVectorList ByteVectorList::split(const ByteVector &v, const ByteVector &pattern, int byteAlign, int max) { ByteVectorList l; unsigned int previousOffset = 0; for(int offset = v.find(pattern, 0, byteAlign); offset != -1 && (max == 0 || max > static_cast<int>(l.size()) + 1); offset = v.find(pattern, offset + pattern.size(), byteAlign)) { if(offset - previousOffset >= 1) l.append(v.mid(previousOffset, offset - previousOffset)); else l.append(ByteVector()); previousOffset = offset + pattern.size(); } if(previousOffset < v.size()) l.append(v.mid(previousOffset, v.size() - previousOffset)); return l; } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// ByteVectorList::ByteVectorList() { } ByteVectorList::ByteVectorList(const ByteVectorList &l) : List<ByteVector>(l) { } ByteVectorList::~ByteVectorList() { } ByteVector ByteVectorList::toByteVector(const ByteVector &separator) const { ByteVector v; ConstIterator it = begin(); while(it != end()) { v.append(*it); it++; if(it != end()) v.append(separator); } return v; } ������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tbytevectorlist.h������������������������������������������������������0000664�0000000�0000000�00000007044�14447736377�0021440�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_BYTEVECTORLIST_H #define TAGLIB_BYTEVECTORLIST_H #include "taglib_export.h" #include "tbytevector.h" #include "tlist.h" namespace TagLib { //! A list of ByteVectors /*! * A List specialization with some handy features useful for ByteVectors. */ class TAGLIB_EXPORT ByteVectorList : public List<ByteVector> { public: /*! * Construct an empty ByteVectorList. */ ByteVectorList(); /*! * Destroys this ByteVectorList instance. */ virtual ~ByteVectorList(); /*! * Make a shallow, implicitly shared, copy of \a l. Because this is * implicitly shared, this method is lightweight and suitable for * pass-by-value usage. */ ByteVectorList(const ByteVectorList &l); /*! * Convert the ByteVectorList to a ByteVector separated by \a separator. By * default a space is used. */ ByteVector toByteVector(const ByteVector &separator = " ") const; /*! * Splits the ByteVector \a v into several strings at \a pattern. This will * not include the pattern in the returned ByteVectors. */ static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, int byteAlign = 1); /*! * Splits the ByteVector \a v into several strings at \a pattern. This will * not include the pattern in the returned ByteVectors. \a max is the * maximum number of entries that will be separated. If \a max for instance * is 2 then a maximum of 1 match will be found and the vector will be split * on that match. */ // BIC: merge with the function above static ByteVectorList split(const ByteVector &v, const ByteVector &pattern, int byteAlign, int max); private: class ByteVectorListPrivate; ByteVectorListPrivate *d; }; } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tbytevectorstream.cpp��������������������������������������������������0000664�0000000�0000000�00000011252�14447736377�0022307�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Lukas Lalinsky email : lalinsky@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tbytevectorstream.h" #include "tstring.h" #include "tdebug.h" #include <stdio.h> #include <string.h> #include <stdlib.h> using namespace TagLib; class ByteVectorStream::ByteVectorStreamPrivate { public: ByteVectorStreamPrivate(const ByteVector &data); ByteVector data; long position; }; ByteVectorStream::ByteVectorStreamPrivate::ByteVectorStreamPrivate(const ByteVector &data) : data(data), position(0) { } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// ByteVectorStream::ByteVectorStream(const ByteVector &data) : d(new ByteVectorStreamPrivate(data)) { } ByteVectorStream::~ByteVectorStream() { delete d; } FileName ByteVectorStream::name() const { return ""; // XXX do we need a name? } ByteVector ByteVectorStream::readBlock(unsigned long length) { if(length == 0) return ByteVector(); ByteVector v = d->data.mid(d->position, length); d->position += v.size(); return v; } void ByteVectorStream::writeBlock(const ByteVector &data) { unsigned int size = data.size(); if(d->position + size > length()) { truncate(d->position + size); } memcpy(d->data.data() + d->position, data.data(), size); d->position += size; } void ByteVectorStream::insert(const ByteVector &data, unsigned long start, unsigned long replace) { long sizeDiff = data.size() - replace; if(sizeDiff < 0) { removeBlock(start + data.size(), -sizeDiff); } else if(sizeDiff > 0) { truncate(length() + sizeDiff); unsigned long readPosition = start + replace; unsigned long writePosition = start + data.size(); memmove(d->data.data() + writePosition, d->data.data() + readPosition, length() - sizeDiff - readPosition); } seek(start); writeBlock(data); } void ByteVectorStream::removeBlock(unsigned long start, unsigned long length) { unsigned long readPosition = start + length; unsigned long writePosition = start; if(readPosition < static_cast<unsigned long>(ByteVectorStream::length())) { unsigned long bytesToMove = ByteVectorStream::length() - readPosition; memmove(d->data.data() + writePosition, d->data.data() + readPosition, bytesToMove); writePosition += bytesToMove; } d->position = writePosition; truncate(writePosition); } bool ByteVectorStream::readOnly() const { return false; } bool ByteVectorStream::isOpen() const { return true; } void ByteVectorStream::seek(long offset, Position p) { switch(p) { case Beginning: d->position = offset; break; case Current: d->position += offset; break; case End: d->position = length() + offset; // offset is expected to be negative break; } } void ByteVectorStream::clear() { } long ByteVectorStream::tell() const { return d->position; } long ByteVectorStream::length() { return d->data.size(); } void ByteVectorStream::truncate(long length) { d->data.resize(length); } ByteVector *ByteVectorStream::data() { return &d->data; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tbytevectorstream.h����������������������������������������������������0000664�0000000�0000000�00000011321�14447736377�0021751�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Lukas Lalinsky email : lalinsky@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_BYTEVECTORSTREAM_H #define TAGLIB_BYTEVECTORSTREAM_H #include "taglib_export.h" #include "taglib.h" #include "tbytevector.h" #include "tiostream.h" namespace TagLib { class String; class Tag; class AudioProperties; //! In-memory Stream class using ByteVector for its storage. class TAGLIB_EXPORT ByteVectorStream : public IOStream { public: /*! * Construct a File object and opens the \a file. \a file should be a * be a C-string in the local file system encoding. */ ByteVectorStream(const ByteVector &data); /*! * Destroys this ByteVectorStream instance. */ virtual ~ByteVectorStream(); /*! * Returns the file name in the local file system encoding. */ FileName name() const; /*! * Reads a block of size \a length at the current get pointer. */ ByteVector readBlock(unsigned long length); /*! * Attempts to write the block \a data at the current get pointer. If the * file is currently only opened read only -- i.e. readOnly() returns true -- * this attempts to reopen the file in read/write mode. * * \note This should be used instead of using the streaming output operator * for a ByteVector. And even this function is significantly slower than * doing output with a char[]. */ void writeBlock(const ByteVector &data); /*! * Insert \a data at position \a start in the file overwriting \a replace * bytes of the original content. * * \note This method is slow since it requires rewriting all of the file * after the insertion point. */ void insert(const ByteVector &data, unsigned long start = 0, unsigned long replace = 0); /*! * Removes a block of the file starting a \a start and continuing for * \a length bytes. * * \note This method is slow since it involves rewriting all of the file * after the removed portion. */ void removeBlock(unsigned long start = 0, unsigned long length = 0); /*! * Returns true if the file is read only (or if the file can not be opened). */ bool readOnly() const; /*! * Since the file can currently only be opened as an argument to the * constructor (sort-of by design), this returns if that open succeeded. */ bool isOpen() const; /*! * Move the I/O pointer to \a offset in the file from position \a p. This * defaults to seeking from the beginning of the file. * * \see Position */ void seek(long offset, Position p = Beginning); /*! * Reset the end-of-file and error flags on the file. */ void clear(); /*! * Returns the current offset within the file. */ long tell() const; /*! * Returns the length of the file. */ long length(); /*! * Truncates the file to a \a length. */ void truncate(long length); ByteVector *data(); protected: private: class ByteVectorStreamPrivate; ByteVectorStreamPrivate *d; }; } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tdebug.cpp�������������������������������������������������������������0000664�0000000�0000000�00000005001�14447736377�0017766�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifdef HAVE_CONFIG_H #include <config.h> #endif #if !defined(NDEBUG) || defined(TRACE_IN_RELEASE) #include "tdebug.h" #include "tstring.h" #include "tdebuglistener.h" #include "tutils.h" #include <bitset> #include <cstdio> #include <cstdarg> namespace TagLib { // The instance is defined in tdebuglistener.cpp. extern DebugListener *debugListener; void debug(const String &s) { debugListener->printMessage("TagLib: " + s + "\n"); } void debugData(const ByteVector &v) { for(unsigned int i = 0; i < v.size(); ++i) { const std::string bits = std::bitset<8>(v[i]).to_string(); const String msg = Utils::formatString( "*** [%u] - char '%c' - int %d, 0x%02x, 0b%s\n", i, v[i], v[i], v[i], bits.c_str()); debugListener->printMessage(msg); } } } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tdebug.h���������������������������������������������������������������0000664�0000000�0000000�00000005241�14447736377�0017441�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_DEBUG_H #define TAGLIB_DEBUG_H namespace TagLib { class String; class ByteVector; #ifndef DO_NOT_DOCUMENT #if !defined(NDEBUG) || defined(TRACE_IN_RELEASE) /*! * A simple function that outputs the debug messages to the listener. * The default listener redirects the messages to \a stderr when NDEBUG is * not defined. * * \warning Do not use this outside of TagLib, it could lead to undefined * symbols in your build if TagLib is built with NDEBUG defined and your * application is not. * * \internal */ void debug(const String &s); /*! * For debugging binary data. * * \warning Do not use this outside of TagLib, it could lead to undefined * symbols in your build if TagLib is built with NDEBUG defined and your * application is not. * * \internal */ void debugData(const ByteVector &v); #else #define debug(x) ((void)0) #define debugData(x) ((void)0) #endif } // namespace TagLib #endif #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tdebuglistener.cpp�����������������������������������������������������0000664�0000000�0000000�00000005324�14447736377�0021544�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2013 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tdebuglistener.h" #include <iostream> #include <bitset> #ifdef _WIN32 # include <windows.h> #endif using namespace TagLib; namespace { class DefaultListener : public DebugListener { public: virtual void printMessage(const String &msg) { #ifdef _WIN32 const wstring wstr = msg.toWString(); const int len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL); if(len != 0) { std::vector<char> buf(len); WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &buf[0], len, NULL, NULL); std::cerr << std::string(&buf[0]); } #else std::cerr << msg; #endif } }; DefaultListener defaultListener; } // namespace namespace TagLib { DebugListener *debugListener = &defaultListener; DebugListener::DebugListener() { } DebugListener::~DebugListener() { } void setDebugListener(DebugListener *listener) { if(listener) debugListener = listener; else debugListener = &defaultListener; } } // namespace TagLib ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tdebuglistener.h�������������������������������������������������������0000664�0000000�0000000�00000006001�14447736377�0021202�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2013 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_DEBUGLISTENER_H #define TAGLIB_DEBUGLISTENER_H #include "taglib_export.h" #include "tstring.h" namespace TagLib { //! An abstraction for the listener to the debug messages. /*! * This class enables you to handle the debug messages in your preferred * way by subclassing this class, reimplementing printMessage() and setting * your reimplementation as the default with setDebugListener(). * * \see setDebugListener() */ class TAGLIB_EXPORT DebugListener { public: DebugListener(); virtual ~DebugListener(); /*! * When overridden in a derived class, redirects \a msg to your preferred * channel such as stderr, Windows debugger or so forth. */ virtual void printMessage(const String &msg) = 0; private: // Noncopyable DebugListener(const DebugListener &); DebugListener &operator=(const DebugListener &); }; /*! * Sets the listener that decides how the debug messages are redirected. * If the parameter \a listener is null, the previous listener is released * and default stderr listener is restored. * * \note The caller is responsible for deleting the previous listener * as needed after it is released. * * \see DebugListener */ TAGLIB_EXPORT void setDebugListener(DebugListener *listener); } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tfile.cpp��������������������������������������������������������������0000664�0000000�0000000�00000035714�14447736377�0017635�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tfile.h" #include "tfilestream.h" #include "tstring.h" #include "tdebug.h" #include "tpropertymap.h" #ifdef _WIN32 # include <windows.h> # include <io.h> #else # include <stdio.h> # include <unistd.h> #endif #ifndef R_OK # define R_OK 4 #endif #ifndef W_OK # define W_OK 2 #endif #include "asffile.h" #include "mpegfile.h" #include "vorbisfile.h" #include "flacfile.h" #include "oggflacfile.h" #include "mpcfile.h" #include "mp4file.h" #include "wavpackfile.h" #include "speexfile.h" #include "opusfile.h" #include "trueaudiofile.h" #include "aifffile.h" #include "wavfile.h" #include "apefile.h" #include "modfile.h" #include "s3mfile.h" #include "itfile.h" #include "xmfile.h" using namespace TagLib; class File::FilePrivate { public: FilePrivate(IOStream *stream, bool owner) : stream(stream), streamOwner(owner), valid(true) {} ~FilePrivate() { if(streamOwner) delete stream; } IOStream *stream; bool streamOwner; bool valid; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// File::File(FileName fileName) : d(new FilePrivate(new FileStream(fileName), true)) { } File::File(IOStream *stream) : d(new FilePrivate(stream, false)) { } File::~File() { delete d; } FileName File::name() const { return d->stream->name(); } PropertyMap File::properties() const { // ugly workaround until this method is virtual if(dynamic_cast<const APE::File* >(this)) return dynamic_cast<const APE::File* >(this)->properties(); if(dynamic_cast<const FLAC::File* >(this)) return dynamic_cast<const FLAC::File* >(this)->properties(); if(dynamic_cast<const IT::File* >(this)) return dynamic_cast<const IT::File* >(this)->properties(); if(dynamic_cast<const Mod::File* >(this)) return dynamic_cast<const Mod::File* >(this)->properties(); if(dynamic_cast<const MPC::File* >(this)) return dynamic_cast<const MPC::File* >(this)->properties(); if(dynamic_cast<const MPEG::File* >(this)) return dynamic_cast<const MPEG::File* >(this)->properties(); if(dynamic_cast<const Ogg::FLAC::File* >(this)) return dynamic_cast<const Ogg::FLAC::File* >(this)->properties(); if(dynamic_cast<const Ogg::Speex::File* >(this)) return dynamic_cast<const Ogg::Speex::File* >(this)->properties(); if(dynamic_cast<const Ogg::Opus::File* >(this)) return dynamic_cast<const Ogg::Opus::File* >(this)->properties(); if(dynamic_cast<const Ogg::Vorbis::File* >(this)) return dynamic_cast<const Ogg::Vorbis::File* >(this)->properties(); if(dynamic_cast<const RIFF::AIFF::File* >(this)) return dynamic_cast<const RIFF::AIFF::File* >(this)->properties(); if(dynamic_cast<const RIFF::WAV::File* >(this)) return dynamic_cast<const RIFF::WAV::File* >(this)->properties(); if(dynamic_cast<const S3M::File* >(this)) return dynamic_cast<const S3M::File* >(this)->properties(); if(dynamic_cast<const TrueAudio::File* >(this)) return dynamic_cast<const TrueAudio::File* >(this)->properties(); if(dynamic_cast<const WavPack::File* >(this)) return dynamic_cast<const WavPack::File* >(this)->properties(); if(dynamic_cast<const XM::File* >(this)) return dynamic_cast<const XM::File* >(this)->properties(); if(dynamic_cast<const MP4::File* >(this)) return dynamic_cast<const MP4::File* >(this)->properties(); if(dynamic_cast<const ASF::File* >(this)) return dynamic_cast<const ASF::File* >(this)->properties(); return tag()->properties(); } void File::removeUnsupportedProperties(const StringList &properties) { // here we only consider those formats that could possibly contain // unsupported properties if(dynamic_cast<APE::File* >(this)) dynamic_cast<APE::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<FLAC::File* >(this)) dynamic_cast<FLAC::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<MPC::File* >(this)) dynamic_cast<MPC::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<MPEG::File* >(this)) dynamic_cast<MPEG::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<Ogg::Vorbis::File* >(this)) dynamic_cast<Ogg::Vorbis::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<RIFF::AIFF::File* >(this)) dynamic_cast<RIFF::AIFF::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<RIFF::WAV::File* >(this)) dynamic_cast<RIFF::WAV::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<TrueAudio::File* >(this)) dynamic_cast<TrueAudio::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<WavPack::File* >(this)) dynamic_cast<WavPack::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<MP4::File* >(this)) dynamic_cast<MP4::File* >(this)->removeUnsupportedProperties(properties); else if(dynamic_cast<ASF::File* >(this)) dynamic_cast<ASF::File* >(this)->removeUnsupportedProperties(properties); else tag()->removeUnsupportedProperties(properties); } PropertyMap File::setProperties(const PropertyMap &properties) { if(dynamic_cast<APE::File* >(this)) return dynamic_cast<APE::File* >(this)->setProperties(properties); if(dynamic_cast<FLAC::File* >(this)) return dynamic_cast<FLAC::File* >(this)->setProperties(properties); if(dynamic_cast<IT::File* >(this)) return dynamic_cast<IT::File* >(this)->setProperties(properties); if(dynamic_cast<Mod::File* >(this)) return dynamic_cast<Mod::File* >(this)->setProperties(properties); if(dynamic_cast<MPC::File* >(this)) return dynamic_cast<MPC::File* >(this)->setProperties(properties); if(dynamic_cast<MPEG::File* >(this)) return dynamic_cast<MPEG::File* >(this)->setProperties(properties); if(dynamic_cast<Ogg::FLAC::File* >(this)) return dynamic_cast<Ogg::FLAC::File* >(this)->setProperties(properties); if(dynamic_cast<Ogg::Speex::File* >(this)) return dynamic_cast<Ogg::Speex::File* >(this)->setProperties(properties); if(dynamic_cast<Ogg::Opus::File* >(this)) return dynamic_cast<Ogg::Opus::File* >(this)->setProperties(properties); if(dynamic_cast<Ogg::Vorbis::File* >(this)) return dynamic_cast<Ogg::Vorbis::File* >(this)->setProperties(properties); if(dynamic_cast<RIFF::AIFF::File* >(this)) return dynamic_cast<RIFF::AIFF::File* >(this)->setProperties(properties); if(dynamic_cast<RIFF::WAV::File* >(this)) return dynamic_cast<RIFF::WAV::File* >(this)->setProperties(properties); if(dynamic_cast<S3M::File* >(this)) return dynamic_cast<S3M::File* >(this)->setProperties(properties); if(dynamic_cast<TrueAudio::File* >(this)) return dynamic_cast<TrueAudio::File* >(this)->setProperties(properties); if(dynamic_cast<WavPack::File* >(this)) return dynamic_cast<WavPack::File* >(this)->setProperties(properties); if(dynamic_cast<XM::File* >(this)) return dynamic_cast<XM::File* >(this)->setProperties(properties); if(dynamic_cast<MP4::File* >(this)) return dynamic_cast<MP4::File* >(this)->setProperties(properties); if(dynamic_cast<ASF::File* >(this)) return dynamic_cast<ASF::File* >(this)->setProperties(properties); return tag()->setProperties(properties); } ByteVector File::readBlock(unsigned long length) { return d->stream->readBlock(length); } void File::writeBlock(const ByteVector &data) { d->stream->writeBlock(data); } long File::find(const ByteVector &pattern, long fromOffset, const ByteVector &before) { if(!d->stream || pattern.size() > bufferSize()) return -1; // The position in the file that the current buffer starts at. long bufferOffset = fromOffset; ByteVector buffer; // These variables are used to keep track of a partial match that happens at // the end of a buffer. int previousPartialMatch = -1; int beforePreviousPartialMatch = -1; // Save the location of the current read pointer. We will restore the // position using seek() before all returns. long originalPosition = tell(); // Start the search at the offset. seek(fromOffset); // This loop is the crux of the find method. There are three cases that we // want to account for: // // (1) The previously searched buffer contained a partial match of the search // pattern and we want to see if the next one starts with the remainder of // that pattern. // // (2) The search pattern is wholly contained within the current buffer. // // (3) The current buffer ends with a partial match of the pattern. We will // note this for use in the next iteration, where we will check for the rest // of the pattern. // // All three of these are done in two steps. First we check for the pattern // and do things appropriately if a match (or partial match) is found. We // then check for "before". The order is important because it gives priority // to "real" matches. for(buffer = readBlock(bufferSize()); buffer.size() > 0; buffer = readBlock(bufferSize())) { // (1) previous partial match if(previousPartialMatch >= 0 && static_cast<int>(bufferSize()) > previousPartialMatch) { const int patternOffset = (bufferSize() - previousPartialMatch); if(buffer.containsAt(pattern, 0, patternOffset)) { seek(originalPosition); return bufferOffset - bufferSize() + previousPartialMatch; } } if(!before.isEmpty() && beforePreviousPartialMatch >= 0 && static_cast<int>(bufferSize()) > beforePreviousPartialMatch) { const int beforeOffset = (bufferSize() - beforePreviousPartialMatch); if(buffer.containsAt(before, 0, beforeOffset)) { seek(originalPosition); return -1; } } // (2) pattern contained in current buffer long location = buffer.find(pattern); if(location >= 0) { seek(originalPosition); return bufferOffset + location; } if(!before.isEmpty() && buffer.find(before) >= 0) { seek(originalPosition); return -1; } // (3) partial match previousPartialMatch = buffer.endsWithPartialMatch(pattern); if(!before.isEmpty()) beforePreviousPartialMatch = buffer.endsWithPartialMatch(before); bufferOffset += bufferSize(); } // Since we hit the end of the file, reset the status before continuing. clear(); seek(originalPosition); return -1; } long File::rfind(const ByteVector &pattern, long fromOffset, const ByteVector &before) { if(!d->stream || pattern.size() > bufferSize()) return -1; // The position in the file that the current buffer starts at. ByteVector buffer; // These variables are used to keep track of a partial match that happens at // the end of a buffer. /* int previousPartialMatch = -1; int beforePreviousPartialMatch = -1; */ // Save the location of the current read pointer. We will restore the // position using seek() before all returns. long originalPosition = tell(); // Start the search at the offset. if(fromOffset == 0) fromOffset = length(); long bufferLength = bufferSize(); long bufferOffset = fromOffset + pattern.size(); // See the notes in find() for an explanation of this algorithm. while(true) { if(bufferOffset > bufferLength) { bufferOffset -= bufferLength; } else { bufferLength = bufferOffset; bufferOffset = 0; } seek(bufferOffset); buffer = readBlock(bufferLength); if(buffer.isEmpty()) break; // TODO: (1) previous partial match // (2) pattern contained in current buffer const long location = buffer.rfind(pattern); if(location >= 0) { seek(originalPosition); return bufferOffset + location; } if(!before.isEmpty() && buffer.find(before) >= 0) { seek(originalPosition); return -1; } // TODO: (3) partial match } // Since we hit the end of the file, reset the status before continuing. clear(); seek(originalPosition); return -1; } void File::insert(const ByteVector &data, unsigned long start, unsigned long replace) { d->stream->insert(data, start, replace); } void File::removeBlock(unsigned long start, unsigned long length) { d->stream->removeBlock(start, length); } bool File::readOnly() const { return d->stream->readOnly(); } bool File::isOpen() const { return d->stream->isOpen(); } bool File::isValid() const { return isOpen() && d->valid; } void File::seek(long offset, Position p) { d->stream->seek(offset, static_cast<IOStream::Position>(p)); } void File::truncate(long length) { d->stream->truncate(length); } void File::clear() { d->stream->clear(); } long File::tell() const { return d->stream->tell(); } long File::length() { return d->stream->length(); } bool File::isReadable(const char *file) { #if defined(_MSC_VER) && (_MSC_VER >= 1400) // VC++2005 or later return _access_s(file, R_OK) == 0; #else return access(file, R_OK) == 0; #endif } bool File::isWritable(const char *file) { #if defined(_MSC_VER) && (_MSC_VER >= 1400) // VC++2005 or later return _access_s(file, W_OK) == 0; #else return access(file, W_OK) == 0; #endif } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// unsigned int File::bufferSize() { return 1024; } void File::setValid(bool valid) { d->valid = valid; } ����������������������������������������������������taglib-1.13.1/taglib/toolkit/tfile.h����������������������������������������������������������������0000664�0000000�0000000�00000026700�14447736377�0017275�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_FILE_H #define TAGLIB_FILE_H #include "taglib_export.h" #include "taglib.h" #include "tag.h" #include "tbytevector.h" #include "tiostream.h" namespace TagLib { class String; class Tag; class AudioProperties; class PropertyMap; //! A file class with some useful methods for tag manipulation /*! * This class is a basic file class with some methods that are particularly * useful for tag editors. It has methods to take advantage of * ByteVector and a binary search method for finding patterns in a file. */ class TAGLIB_EXPORT File { public: /*! * Position in the file used for seeking. */ enum Position { //! Seek from the beginning of the file. Beginning, //! Seek from the current position in the file. Current, //! Seek from the end of the file. End }; /*! * Specify which tags to strip either explicitly, or on save. */ enum StripTags { StripNone, //<! Don't strip any tags StripOthers //<! Strip all tags not explicitly referenced in method call }; /*! * Used to specify if when saving files, if values between different tag * types should be synchronized. */ enum DuplicateTags { Duplicate, //<! Synchronize values between different tag types DoNotDuplicate //<! Do not synchronize values between different tag types }; /*! * Destroys this File instance. */ virtual ~File(); /*! * Returns the file name in the local file system encoding. */ FileName name() const; /*! * Returns a pointer to this file's tag. This should be reimplemented in * the concrete subclasses. */ virtual Tag *tag() const = 0; /*! * Exports the tags of the file as dictionary mapping (human readable) tag * names (uppercase Strings) to StringLists of tag values. Calls the according * specialization in the File subclasses. * For each metadata object of the file that could not be parsed into the PropertyMap * format, the returned map's unsupportedData() list will contain one entry identifying * that object (e.g. the frame type for ID3v2 tags). Use removeUnsupportedProperties() * to remove (a subset of) them. * For files that contain more than one tag (e.g. an MP3 with both an ID3v1 and an ID3v2 * tag) only the most "modern" one will be exported (ID3v2 in this case). * BIC: Will be made virtual in future releases. */ PropertyMap properties() const; /*! * Removes unsupported properties, or a subset of them, from the file's metadata. * The parameter \a properties must contain only entries from * properties().unsupportedData(). * BIC: Will be mad virtual in future releases. */ void removeUnsupportedProperties(const StringList& properties); /*! * Sets the tags of this File to those specified in \a properties. Calls the * according specialization method in the subclasses of File to do the translation * into the format-specific details. * If some value(s) could not be written imported to the specific metadata format, * the returned PropertyMap will contain those value(s). Otherwise it will be empty, * indicating that no problems occurred. * With file types that support several tag formats (for instance, MP3 files can have * ID3v1, ID3v2, and APEv2 tags), this function will create the most appropriate one * (ID3v2 for MP3 files). Older formats will be updated as well, if they exist, but won't * be taken into account for the return value of this function. * See the documentation of the subclass implementations for detailed descriptions. * BIC: will become pure virtual in the future */ PropertyMap setProperties(const PropertyMap &properties); /*! * Returns a pointer to this file's audio properties. This should be * reimplemented in the concrete subclasses. If no audio properties were * read then this will return a null pointer. */ virtual AudioProperties *audioProperties() const = 0; /*! * Save the file and its associated tags. This should be reimplemented in * the concrete subclasses. Returns true if the save succeeds. * * \warning On UNIX multiple processes are able to write to the same file at * the same time. This can result in serious file corruption. If you are * developing a program that makes use of TagLib from multiple processes you * must insure that you are only doing writes to a particular file from one * of them. */ virtual bool save() = 0; /*! * Reads a block of size \a length at the current get pointer. */ ByteVector readBlock(unsigned long length); /*! * Attempts to write the block \a data at the current get pointer. If the * file is currently only opened read only -- i.e. readOnly() returns true -- * this attempts to reopen the file in read/write mode. * * \note This should be used instead of using the streaming output operator * for a ByteVector. And even this function is significantly slower than * doing output with a char[]. */ void writeBlock(const ByteVector &data); /*! * Returns the offset in the file that \a pattern occurs at or -1 if it can * not be found. If \a before is set, the search will only continue until the * pattern \a before is found. This is useful for tagging purposes to search * for a tag before the sync frame. * * Searching starts at \a fromOffset, which defaults to the beginning of the * file. * * \note This has the practical limitation that \a pattern can not be longer * than the buffer size used by readBlock(). Currently this is 1024 bytes. */ long find(const ByteVector &pattern, long fromOffset = 0, const ByteVector &before = ByteVector()); /*! * Returns the offset in the file that \a pattern occurs at or -1 if it can * not be found. If \a before is set, the search will only continue until the * pattern \a before is found. This is useful for tagging purposes to search * for a tag before the sync frame. * * Searching starts at \a fromOffset and proceeds from the that point to the * beginning of the file and defaults to the end of the file. * * \note This has the practical limitation that \a pattern can not be longer * than the buffer size used by readBlock(). Currently this is 1024 bytes. */ long rfind(const ByteVector &pattern, long fromOffset = 0, const ByteVector &before = ByteVector()); /*! * Insert \a data at position \a start in the file overwriting \a replace * bytes of the original content. * * \note This method is slow since it requires rewriting all of the file * after the insertion point. */ void insert(const ByteVector &data, unsigned long start = 0, unsigned long replace = 0); /*! * Removes a block of the file starting a \a start and continuing for * \a length bytes. * * \note This method is slow since it involves rewriting all of the file * after the removed portion. */ void removeBlock(unsigned long start = 0, unsigned long length = 0); /*! * Returns true if the file is read only (or if the file can not be opened). */ bool readOnly() const; /*! * Since the file can currently only be opened as an argument to the * constructor (sort-of by design), this returns if that open succeeded. */ bool isOpen() const; /*! * Returns true if the file is open and readable. */ bool isValid() const; /*! * Move the I/O pointer to \a offset in the file from position \a p. This * defaults to seeking from the beginning of the file. * * \see Position */ void seek(long offset, Position p = Beginning); /*! * Reset the end-of-file and error flags on the file. */ void clear(); /*! * Returns the current offset within the file. */ long tell() const; /*! * Returns the length of the file. */ long length(); /*! * Returns true if \a file can be opened for reading. If the file does not * exist, this will return false. * * \deprecated Use system functions, e.g. access() (_access_s() on Windows). */ TAGLIB_DEPRECATED static bool isReadable(const char *file); /*! * Returns true if \a file can be opened for writing. * * \deprecated Use system functions, e.g. access() (_access_s() on Windows). */ TAGLIB_DEPRECATED static bool isWritable(const char *name); protected: /*! * Construct a File object and opens the \a file. \a file should be a * be a C-string in the local file system encoding. * * \note Constructor is protected since this class should only be * instantiated through subclasses. */ File(FileName file); /*! * Construct a File object and use the \a stream instance. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note Constructor is protected since this class should only be * instantiated through subclasses. */ File(IOStream *stream); /*! * Marks the file as valid or invalid. * * \see isValid() */ void setValid(bool valid); /*! * Truncates the file to a \a length. */ void truncate(long length); /*! * Returns the buffer size that is used for internal buffering. */ static unsigned int bufferSize(); private: File(const File &); File &operator=(const File &); class FilePrivate; FilePrivate *d; }; } // namespace TagLib #endif ����������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tfilestream.cpp��������������������������������������������������������0000664�0000000�0000000�00000027552�14447736377�0021052�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tfilestream.h" #include "tstring.h" #include "tdebug.h" #ifdef _WIN32 # include <windows.h> #else # include <stdio.h> # include <unistd.h> #endif using namespace TagLib; namespace { #ifdef _WIN32 // Uses Win32 native API instead of POSIX API to reduce the resource consumption. typedef FileName FileNameHandle; typedef HANDLE FileHandle; const FileHandle InvalidFileHandle = INVALID_HANDLE_VALUE; FileHandle openFile(const FileName &path, bool readOnly) { const DWORD access = readOnly ? GENERIC_READ : (GENERIC_READ | GENERIC_WRITE); #if defined (PLATFORM_WINRT) return CreateFile2(path.wstr().c_str(), access, FILE_SHARE_READ, OPEN_EXISTING, NULL); #else return CreateFileW(path.wstr().c_str(), access, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); #endif } FileHandle openFile(const int fileDescriptor, bool readOnly) { return InvalidFileHandle; } void closeFile(FileHandle file) { CloseHandle(file); } size_t readFile(FileHandle file, ByteVector &buffer) { DWORD length; if(ReadFile(file, buffer.data(), static_cast<DWORD>(buffer.size()), &length, NULL)) return static_cast<size_t>(length); else return 0; } size_t writeFile(FileHandle file, const ByteVector &buffer) { DWORD length; if(WriteFile(file, buffer.data(), static_cast<DWORD>(buffer.size()), &length, NULL)) return static_cast<size_t>(length); else return 0; } #else // _WIN32 struct FileNameHandle : public std::string { FileNameHandle(FileName name) : std::string(name) {} operator FileName () const { return c_str(); } }; typedef FILE* FileHandle; const FileHandle InvalidFileHandle = 0; FileHandle openFile(const FileName &path, bool readOnly) { return fopen(path, readOnly ? "rb" : "rb+"); } FileHandle openFile(const int fileDescriptor, bool readOnly) { return fdopen(fileDescriptor, readOnly ? "rb" : "rb+"); } void closeFile(FileHandle file) { fclose(file); } size_t readFile(FileHandle file, ByteVector &buffer) { return fread(buffer.data(), sizeof(char), buffer.size(), file); } size_t writeFile(FileHandle file, const ByteVector &buffer) { return fwrite(buffer.data(), sizeof(char), buffer.size(), file); } #endif // _WIN32 } // namespace class FileStream::FileStreamPrivate { public: FileStreamPrivate(const FileName &fileName) : file(InvalidFileHandle) , name(fileName) , readOnly(true) { } FileHandle file; FileNameHandle name; bool readOnly; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// FileStream::FileStream(FileName fileName, bool openReadOnly) : d(new FileStreamPrivate(fileName)) { // First try with read / write mode, if that fails, fall back to read only. if(!openReadOnly) d->file = openFile(fileName, false); if(d->file != InvalidFileHandle) d->readOnly = false; else d->file = openFile(fileName, true); if(d->file == InvalidFileHandle) # ifdef _WIN32 debug("Could not open file " + fileName.toString()); # else debug("Could not open file " + String(static_cast<const char *>(d->name))); # endif } FileStream::FileStream(int fileDescriptor, bool openReadOnly) : d(new FileStreamPrivate("")) { // First try with read / write mode, if that fails, fall back to read only. if(!openReadOnly) d->file = openFile(fileDescriptor, false); if(d->file != InvalidFileHandle) d->readOnly = false; else d->file = openFile(fileDescriptor, true); if(d->file == InvalidFileHandle) debug("Could not open file using file descriptor"); } FileStream::~FileStream() { if(isOpen()) closeFile(d->file); delete d; } FileName FileStream::name() const { return d->name; } ByteVector FileStream::readBlock(unsigned long length) { if(!isOpen()) { debug("FileStream::readBlock() -- invalid file."); return ByteVector(); } if(length == 0) return ByteVector(); if(length > bufferSize()) { const unsigned long streamLength = static_cast<unsigned long>(FileStream::length()); if(length > streamLength) { length = streamLength; } } ByteVector buffer(static_cast<unsigned int>(length)); const size_t count = readFile(d->file, buffer); buffer.resize(static_cast<unsigned int>(count)); return buffer; } void FileStream::writeBlock(const ByteVector &data) { if(!isOpen()) { debug("FileStream::writeBlock() -- invalid file."); return; } if(readOnly()) { debug("FileStream::writeBlock() -- read only file."); return; } writeFile(d->file, data); } void FileStream::insert(const ByteVector &data, unsigned long start, unsigned long replace) { if(!isOpen()) { debug("FileStream::insert() -- invalid file."); return; } if(readOnly()) { debug("FileStream::insert() -- read only file."); return; } if(data.size() == replace) { seek(start); writeBlock(data); return; } if(data.size() < replace) { seek(start); writeBlock(data); removeBlock(start + data.size(), replace - data.size()); return; } // Woohoo! Faster (about 20%) than id3lib at last. I had to get hardcore // and avoid TagLib's high level API for rendering just copying parts of // the file that don't contain tag data. // // Now I'll explain the steps in this ugliness: // First, make sure that we're working with a buffer that is longer than // the *difference* in the tag sizes. We want to avoid overwriting parts // that aren't yet in memory, so this is necessary. unsigned long bufferLength = bufferSize(); while(data.size() - replace > bufferLength) bufferLength += bufferSize(); // Set where to start the reading and writing. long readPosition = start + replace; long writePosition = start; ByteVector buffer = data; ByteVector aboutToOverwrite(static_cast<unsigned int>(bufferLength)); while(true) { // Seek to the current read position and read the data that we're about // to overwrite. Appropriately increment the readPosition. seek(readPosition); const unsigned int bytesRead = static_cast<unsigned int>(readFile(d->file, aboutToOverwrite)); aboutToOverwrite.resize(bytesRead); readPosition += bufferLength; // Check to see if we just read the last block. We need to call clear() // if we did so that the last write succeeds. if(bytesRead < bufferLength) clear(); // Seek to the write position and write our buffer. Increment the // writePosition. seek(writePosition); writeBlock(buffer); // We hit the end of the file. if(bytesRead == 0) break; writePosition += buffer.size(); // Make the current buffer the data that we read in the beginning. buffer = aboutToOverwrite; } } void FileStream::removeBlock(unsigned long start, unsigned long length) { if(!isOpen()) { debug("FileStream::removeBlock() -- invalid file."); return; } unsigned long bufferLength = bufferSize(); long readPosition = start + length; long writePosition = start; ByteVector buffer(static_cast<unsigned int>(bufferLength)); for(unsigned int bytesRead = -1; bytesRead != 0;) { seek(readPosition); bytesRead = static_cast<unsigned int>(readFile(d->file, buffer)); readPosition += bytesRead; // Check to see if we just read the last block. We need to call clear() // if we did so that the last write succeeds. if(bytesRead < buffer.size()) { clear(); buffer.resize(bytesRead); } seek(writePosition); writeFile(d->file, buffer); writePosition += bytesRead; } truncate(writePosition); } bool FileStream::readOnly() const { return d->readOnly; } bool FileStream::isOpen() const { return (d->file != InvalidFileHandle); } void FileStream::seek(long offset, Position p) { if(!isOpen()) { debug("FileStream::seek() -- invalid file."); return; } #ifdef _WIN32 if(p != Beginning && p != Current && p != End) { debug("FileStream::seek() -- Invalid Position value."); return; } LARGE_INTEGER liOffset; liOffset.QuadPart = offset; if(!SetFilePointerEx(d->file, liOffset, NULL, static_cast<DWORD>(p))) { debug("FileStream::seek() -- Failed to set the file pointer."); } #else int whence; switch(p) { case Beginning: whence = SEEK_SET; break; case Current: whence = SEEK_CUR; break; case End: whence = SEEK_END; break; default: debug("FileStream::seek() -- Invalid Position value."); return; } fseek(d->file, offset, whence); #endif } void FileStream::clear() { #ifdef _WIN32 // NOP #else clearerr(d->file); #endif } long FileStream::tell() const { #ifdef _WIN32 const LARGE_INTEGER zero = {}; LARGE_INTEGER position; if(SetFilePointerEx(d->file, zero, &position, FILE_CURRENT) && position.QuadPart <= LONG_MAX) { return static_cast<long>(position.QuadPart); } else { debug("FileStream::tell() -- Failed to get the file pointer."); return 0; } #else return ftell(d->file); #endif } long FileStream::length() { if(!isOpen()) { debug("FileStream::length() -- invalid file."); return 0; } #ifdef _WIN32 LARGE_INTEGER fileSize; if(GetFileSizeEx(d->file, &fileSize) && fileSize.QuadPart <= LONG_MAX) { return static_cast<long>(fileSize.QuadPart); } else { debug("FileStream::length() -- Failed to get the file size."); return 0; } #else const long curpos = tell(); seek(0, End); const long endpos = tell(); seek(curpos, Beginning); return endpos; #endif } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void FileStream::truncate(long length) { #ifdef _WIN32 const long currentPos = tell(); seek(length); if(!SetEndOfFile(d->file)) { debug("FileStream::truncate() -- Failed to truncate the file."); } seek(currentPos); #else fflush(d->file); const int error = ftruncate(fileno(d->file), length); if(error != 0) debug("FileStream::truncate() -- Couldn't truncate the file."); #endif } unsigned int FileStream::bufferSize() { return 1024; } ������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tfilestream.h����������������������������������������������������������0000664�0000000�0000000�00000012236�14447736377�0020510�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_FILESTREAM_H #define TAGLIB_FILESTREAM_H #include "taglib_export.h" #include "taglib.h" #include "tbytevector.h" #include "tiostream.h" namespace TagLib { class String; class Tag; class AudioProperties; //! A file class with some useful methods for tag manipulation /*! * This class is a basic file class with some methods that are particularly * useful for tag editors. It has methods to take advantage of * ByteVector and a binary search method for finding patterns in a file. */ class TAGLIB_EXPORT FileStream : public IOStream { public: /*! * Construct a File object and opens the \a file. \a file should be a * be a C-string in the local file system encoding. */ FileStream(FileName file, bool openReadOnly = false); /*! * Construct a File object and opens the \a file using file descriptor. */ FileStream(int fileDescriptor, bool openReadOnly = false); /*! * Destroys this FileStream instance. */ virtual ~FileStream(); /*! * Returns the file name in the local file system encoding. */ FileName name() const; /*! * Reads a block of size \a length at the current get pointer. */ ByteVector readBlock(unsigned long length); /*! * Attempts to write the block \a data at the current get pointer. If the * file is currently only opened read only -- i.e. readOnly() returns true -- * this attempts to reopen the file in read/write mode. * * \note This should be used instead of using the streaming output operator * for a ByteVector. And even this function is significantly slower than * doing output with a char[]. */ void writeBlock(const ByteVector &data); /*! * Insert \a data at position \a start in the file overwriting \a replace * bytes of the original content. * * \note This method is slow since it requires rewriting all of the file * after the insertion point. */ void insert(const ByteVector &data, unsigned long start = 0, unsigned long replace = 0); /*! * Removes a block of the file starting a \a start and continuing for * \a length bytes. * * \note This method is slow since it involves rewriting all of the file * after the removed portion. */ void removeBlock(unsigned long start = 0, unsigned long length = 0); /*! * Returns true if the file is read only (or if the file can not be opened). */ bool readOnly() const; /*! * Since the file can currently only be opened as an argument to the * constructor (sort-of by design), this returns if that open succeeded. */ bool isOpen() const; /*! * Move the I/O pointer to \a offset in the file from position \a p. This * defaults to seeking from the beginning of the file. * * \see Position */ void seek(long offset, Position p = Beginning); /*! * Reset the end-of-file and error flags on the file. */ void clear(); /*! * Returns the current offset within the file. */ long tell() const; /*! * Returns the length of the file. */ long length(); /*! * Truncates the file to a \a length. */ void truncate(long length); protected: /*! * Returns the buffer size that is used for internal buffering. */ static unsigned int bufferSize(); private: class FileStreamPrivate; FileStreamPrivate *d; }; } // namespace TagLib #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tiostream.cpp����������������������������������������������������������0000664�0000000�0000000�00000006026�14447736377�0020533�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Lukas Lalinsky email : lalinsky@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifdef _WIN32 # include <windows.h> # include <tstring.h> #endif #include "tiostream.h" using namespace TagLib; #ifdef _WIN32 namespace { std::wstring ansiToUnicode(const char *str) { const int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); if(len == 0) return std::wstring(); std::wstring wstr(len - 1, L'\0'); MultiByteToWideChar(CP_ACP, 0, str, -1, &wstr[0], len); return wstr; } } // m_name is no longer used, but kept for backward compatibility. FileName::FileName(const wchar_t *name) : m_name(), m_wname(name) { } FileName::FileName(const char *name) : m_name(), m_wname(ansiToUnicode(name)) { } FileName::FileName(const FileName &name) : m_name(), m_wname(name.m_wname) { } FileName::operator const wchar_t *() const { return m_wname.c_str(); } FileName::operator const char *() const { return m_name.c_str(); } const std::wstring &FileName::wstr() const { return m_wname; } const std::string &FileName::str() const { return m_name; } String FileName::toString() const { return String(m_wname.c_str()); } #endif // _WIN32 //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// IOStream::IOStream() { } IOStream::~IOStream() { } void IOStream::clear() { } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tiostream.h������������������������������������������������������������0000664�0000000�0000000�00000012435�14447736377�0020201�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Lukas Lalinsky email : lalinsky@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_IOSTREAM_H #define TAGLIB_IOSTREAM_H #include "taglib_export.h" #include "taglib.h" #include "tbytevector.h" namespace TagLib { #ifdef _WIN32 class TAGLIB_EXPORT FileName { public: FileName(const wchar_t *name); FileName(const char *name); FileName(const FileName &name); operator const wchar_t *() const; operator const char *() const; const std::wstring &wstr() const; const std::string &str() const; String toString() const; private: const std::string m_name; const std::wstring m_wname; }; #else typedef const char *FileName; #endif //! An abstract class that provides operations on a sequence of bytes class TAGLIB_EXPORT IOStream { public: /*! * Position in the file used for seeking. */ enum Position { //! Seek from the beginning of the file. Beginning, //! Seek from the current position in the file. Current, //! Seek from the end of the file. End }; IOStream(); /*! * Destroys this IOStream instance. */ virtual ~IOStream(); /*! * Returns the stream name in the local file system encoding. */ virtual FileName name() const = 0; /*! * Reads a block of size \a length at the current get pointer. */ virtual ByteVector readBlock(unsigned long length) = 0; /*! * Attempts to write the block \a data at the current get pointer. If the * file is currently only opened read only -- i.e. readOnly() returns true -- * this attempts to reopen the file in read/write mode. * * \note This should be used instead of using the streaming output operator * for a ByteVector. And even this function is significantly slower than * doing output with a char[]. */ virtual void writeBlock(const ByteVector &data) = 0; /*! * Insert \a data at position \a start in the file overwriting \a replace * bytes of the original content. * * \note This method is slow since it requires rewriting all of the file * after the insertion point. */ virtual void insert(const ByteVector &data, unsigned long start = 0, unsigned long replace = 0) = 0; /*! * Removes a block of the file starting a \a start and continuing for * \a length bytes. * * \note This method is slow since it involves rewriting all of the file * after the removed portion. */ virtual void removeBlock(unsigned long start = 0, unsigned long length = 0) = 0; /*! * Returns true if the file is read only (or if the file can not be opened). */ virtual bool readOnly() const = 0; /*! * Since the file can currently only be opened as an argument to the * constructor (sort-of by design), this returns if that open succeeded. */ virtual bool isOpen() const = 0; /*! * Move the I/O pointer to \a offset in the stream from position \a p. This * defaults to seeking from the beginning of the stream. * * \see Position */ virtual void seek(long offset, Position p = Beginning) = 0; /*! * Reset the end-of-stream and error flags on the stream. */ virtual void clear(); /*! * Returns the current offset within the stream. */ virtual long tell() const = 0; /*! * Returns the length of the stream. */ virtual long length() = 0; /*! * Truncates the stream to a \a length. */ virtual void truncate(long length) = 0; private: IOStream(const IOStream &); IOStream &operator=(const IOStream &); }; } // namespace TagLib #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tlist.h����������������������������������������������������������������0000664�0000000�0000000�00000017307�14447736377�0017334�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_LIST_H #define TAGLIB_LIST_H #include "taglib.h" #include <list> namespace TagLib { //! A generic, implicitly shared list. /*! * This is basic generic list that's somewhere between a std::list and a * QValueList. This class is implicitly shared. For example: * * \code * * TagLib::List<int> l = someOtherIntList; * * \endcode * * The above example is very cheap. This also makes lists suitable for the * return types of functions. The above example will just copy a pointer rather * than copying the data in the list. When your \e shared list's data changes, * only \e then will the data be copied. */ template <class T> class List { public: #ifndef DO_NOT_DOCUMENT typedef typename std::list<T>::iterator Iterator; typedef typename std::list<T>::const_iterator ConstIterator; #endif /*! * Constructs an empty list. */ List(); /*! * Make a shallow, implicitly shared, copy of \a l. Because this is * implicitly shared, this method is lightweight and suitable for * pass-by-value usage. */ List(const List<T> &l); /*! * Destroys this List instance. If auto deletion is enabled and this list * contains a pointer type all of the members are also deleted. */ virtual ~List(); /*! * Returns an STL style iterator to the beginning of the list. See * std::list::const_iterator for the semantics. */ Iterator begin(); /*! * Returns an STL style constant iterator to the beginning of the list. See * std::list::iterator for the semantics. */ ConstIterator begin() const; /*! * Returns an STL style iterator to the end of the list. See * std::list::iterator for the semantics. */ Iterator end(); /*! * Returns an STL style constant iterator to the end of the list. See * std::list::const_iterator for the semantics. */ ConstIterator end() const; /*! * Inserts a copy of \a value before \a it. */ Iterator insert(Iterator it, const T &value); /*! * Inserts the \a value into the list. This assumes that the list is * currently sorted. If \a unique is true then the value will not * be inserted if it is already in the list. */ List<T> &sortedInsert(const T &value, bool unique = false); /*! * Appends \a item to the end of the list and returns a reference to the * list. */ List<T> &append(const T &item); /*! * Appends all of the values in \a l to the end of the list and returns a * reference to the list. */ List<T> &append(const List<T> &l); /*! * Prepends \a item to the beginning list and returns a reference to the * list. */ List<T> &prepend(const T &item); /*! * Prepends all of the items in \a l to the beginning list and returns a * reference to the list. */ List<T> &prepend(const List<T> &l); /*! * Clears the list. If auto deletion is enabled and this list contains a * pointer type the members are also deleted. * * \see setAutoDelete() */ List<T> &clear(); /*! * Returns the number of elements in the list. * * \see isEmpty() */ unsigned int size() const; /*! * Returns whether or not the list is empty. * * \see size() */ bool isEmpty() const; /*! * Find the first occurrence of \a value. */ Iterator find(const T &value); /*! * Find the first occurrence of \a value. */ ConstIterator find(const T &value) const; /*! * Returns true if the list contains \a value. */ bool contains(const T &value) const; /*! * Erase the item at \a it from the list. */ Iterator erase(Iterator it); /*! * Returns a reference to the first item in the list. */ const T &front() const; /*! * Returns a reference to the first item in the list. */ T &front(); /*! * Returns a reference to the last item in the list. */ const T &back() const; /*! * Returns a reference to the last item in the list. */ T &back(); /*! * Auto delete the members of the list when the last reference to the list * passes out of scope. This will have no effect on lists which do not * contain a pointer type. * * \note This relies on partial template instantiation -- most modern C++ * compilers should now support this. */ void setAutoDelete(bool autoDelete); /*! * Returns a reference to item \a i in the list. * * \warning This method is slow. Use iterators to loop through the list. */ T &operator[](unsigned int i); /*! * Returns a const reference to item \a i in the list. * * \warning This method is slow. Use iterators to loop through the list. */ const T &operator[](unsigned int i) const; /*! * Make a shallow, implicitly shared, copy of \a l. Because this is * implicitly shared, this method is lightweight and suitable for * pass-by-value usage. */ List<T> &operator=(const List<T> &l); /*! * Exchanges the content of this list by the content of \a l. */ void swap(List<T> &l); /*! * Compares this list with \a l and returns true if all of the elements are * the same. */ bool operator==(const List<T> &l) const; /*! * Compares this list with \a l and returns true if the lists differ. */ bool operator!=(const List<T> &l) const; protected: /* * If this List is being shared via implicit sharing, do a deep copy of the * data and separate from the shared members. This should be called by all * non-const subclass members. */ void detach(); private: #ifndef DO_NOT_DOCUMENT template <class TP> class ListPrivate; ListPrivate<T> *d; #endif }; } // namespace TagLib // Since GCC doesn't support the "export" keyword, we have to include the // implementation. #include "tlist.tcc" #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tlist.tcc��������������������������������������������������������������0000664�0000000�0000000�00000016337�14447736377�0017660�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <algorithm> #include "trefcounter.h" namespace TagLib { //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// // The functionality of List<T>::setAutoDelete() is implemented here partial // template specialization. This is implemented in such a way that calling // setAutoDelete() on non-pointer types will simply have no effect. // A base for the generic and specialized private class types. New // non-templatized members should be added here. // BIC change to RefCounter class ListPrivateBase : public RefCounterOld { public: ListPrivateBase() : autoDelete(false) {} bool autoDelete; }; // A generic implementation template <class T> template <class TP> class List<T>::ListPrivate : public ListPrivateBase { public: ListPrivate() : ListPrivateBase() {} ListPrivate(const std::list<TP> &l) : ListPrivateBase(), list(l) {} void clear() { list.clear(); } std::list<TP> list; }; // A partial specialization for all pointer types that implements the // setAutoDelete() functionality. template <class T> template <class TP> class List<T>::ListPrivate<TP *> : public ListPrivateBase { public: ListPrivate() : ListPrivateBase() {} ListPrivate(const std::list<TP *> &l) : ListPrivateBase(), list(l) {} ~ListPrivate() { clear(); } void clear() { if(autoDelete) { typename std::list<TP *>::const_iterator it = list.begin(); for(; it != list.end(); ++it) delete *it; } list.clear(); } std::list<TP *> list; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// template <class T> List<T>::List() : d(new ListPrivate<T>()) { } template <class T> List<T>::List(const List<T> &l) : d(l.d) { d->ref(); } template <class T> List<T>::~List() { if(d->deref()) delete d; } template <class T> typename List<T>::Iterator List<T>::begin() { detach(); return d->list.begin(); } template <class T> typename List<T>::ConstIterator List<T>::begin() const { return d->list.begin(); } template <class T> typename List<T>::Iterator List<T>::end() { detach(); return d->list.end(); } template <class T> typename List<T>::ConstIterator List<T>::end() const { return d->list.end(); } template <class T> typename List<T>::Iterator List<T>::insert(Iterator it, const T &item) { detach(); return d->list.insert(it, item); } template <class T> List<T> &List<T>::sortedInsert(const T &value, bool unique) { detach(); Iterator it = begin(); while(it != end() && *it < value) ++it; if(unique && it != end() && *it == value) return *this; insert(it, value); return *this; } template <class T> List<T> &List<T>::append(const T &item) { detach(); d->list.push_back(item); return *this; } template <class T> List<T> &List<T>::append(const List<T> &l) { detach(); d->list.insert(d->list.end(), l.begin(), l.end()); return *this; } template <class T> List<T> &List<T>::prepend(const T &item) { detach(); d->list.push_front(item); return *this; } template <class T> List<T> &List<T>::prepend(const List<T> &l) { detach(); d->list.insert(d->list.begin(), l.begin(), l.end()); return *this; } template <class T> List<T> &List<T>::clear() { detach(); d->clear(); return *this; } template <class T> unsigned int List<T>::size() const { return static_cast<unsigned int>(d->list.size()); } template <class T> bool List<T>::isEmpty() const { return d->list.empty(); } template <class T> typename List<T>::Iterator List<T>::find(const T &value) { detach(); return std::find(d->list.begin(), d->list.end(), value); } template <class T> typename List<T>::ConstIterator List<T>::find(const T &value) const { return std::find(d->list.begin(), d->list.end(), value); } template <class T> bool List<T>::contains(const T &value) const { return std::find(d->list.begin(), d->list.end(), value) != d->list.end(); } template <class T> typename List<T>::Iterator List<T>::erase(Iterator it) { return d->list.erase(it); } template <class T> const T &List<T>::front() const { return d->list.front(); } template <class T> T &List<T>::front() { detach(); return d->list.front(); } template <class T> const T &List<T>::back() const { return d->list.back(); } template <class T> void List<T>::setAutoDelete(bool autoDelete) { d->autoDelete = autoDelete; } template <class T> T &List<T>::back() { detach(); return d->list.back(); } template <class T> T &List<T>::operator[](unsigned int i) { Iterator it = d->list.begin(); std::advance(it, i); return *it; } template <class T> const T &List<T>::operator[](unsigned int i) const { ConstIterator it = d->list.begin(); std::advance(it, i); return *it; } template <class T> List<T> &List<T>::operator=(const List<T> &l) { List<T>(l).swap(*this); return *this; } template <class T> void List<T>::swap(List<T> &l) { using std::swap; swap(d, l.d); } template <class T> bool List<T>::operator==(const List<T> &l) const { return d->list == l.d->list; } template <class T> bool List<T>::operator!=(const List<T> &l) const { return d->list != l.d->list; } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// template <class T> void List<T>::detach() { if(d->count() > 1) { d->deref(); d = new ListPrivate<T>(d->list); } } } // namespace TagLib �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tmap.h�����������������������������������������������������������������0000664�0000000�0000000�00000015044�14447736377�0017132�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_MAP_H #define TAGLIB_MAP_H #include <map> #include "taglib.h" namespace TagLib { //! A generic, implicitly shared map. /*! * This implements a standard map container that associates a key with a value * and has fast key-based lookups. This map is also implicitly shared making * it suitable for pass-by-value usage. */ template <class Key, class T> class Map { public: #ifndef DO_NOT_DOCUMENT #ifdef WANT_CLASS_INSTANTIATION_OF_MAP // Some STL implementations get snippy over the use of the // class keyword to distinguish different templates; Sun Studio // in particular finds multiple specializations in certain rare // cases and complains about that. GCC doesn't seem to mind, // and uses the typedefs further below without the class keyword. // Not all the specializations of Map can use the class keyword // (when T is not actually a class type), so don't apply this // generally. typedef typename std::map<class Key, class T>::iterator Iterator; typedef typename std::map<class Key, class T>::const_iterator ConstIterator; #else typedef typename std::map<Key, T>::iterator Iterator; typedef typename std::map<Key, T>::const_iterator ConstIterator; #endif #endif /*! * Constructs an empty Map. */ Map(); /*! * Make a shallow, implicitly shared, copy of \a m. Because this is * implicitly shared, this method is lightweight and suitable for * pass-by-value usage. */ Map(const Map<Key, T> &m); /*! * Destroys this instance of the Map. */ virtual ~Map(); /*! * Returns an STL style iterator to the beginning of the map. See * std::map::iterator for the semantics. */ Iterator begin(); /*! * Returns an STL style iterator to the beginning of the map. See * std::map::const_iterator for the semantics. */ ConstIterator begin() const; /*! * Returns an STL style iterator to the end of the map. See * std::map::iterator for the semantics. */ Iterator end(); /*! * Returns an STL style iterator to the end of the map. See * std::map::const_iterator for the semantics. */ ConstIterator end() const; /*! * Inserts \a value under \a key in the map. If a value for \a key already * exists it will be overwritten. */ Map<Key, T> &insert(const Key &key, const T &value); /*! * Removes all of the elements from elements from the map. This however * will not delete pointers if the mapped type is a pointer type. */ Map<Key, T> &clear(); /*! * The number of elements in the map. * * \see isEmpty() */ unsigned int size() const; /*! * Returns true if the map is empty. * * \see size() */ bool isEmpty() const; /*! * Find the first occurrence of \a key. */ Iterator find(const Key &key); /*! * Find the first occurrence of \a key. */ ConstIterator find(const Key &key) const; /*! * Returns true if the map contains an instance of \a key. */ bool contains(const Key &key) const; /*! * Erase the item at \a it from the list. */ Map<Key, T> &erase(Iterator it); /*! * Erase the item with \a key from the list. */ Map<Key, T> &erase(const Key &key); /*! * Returns the value associated with \a key. * * If the map does not contain \a key, it returns defaultValue. * If no defaultValue is specified, it returns a default-constructed value. */ T value(const Key &key, const T &defaultValue = T()) const; /*! * Returns a reference to the value associated with \a key. * * \note This has undefined behavior if the key is not present in the map. */ const T &operator[](const Key &key) const; /*! * Returns a reference to the value associated with \a key. * * \note This has undefined behavior if the key is not present in the map. */ T &operator[](const Key &key); /*! * Make a shallow, implicitly shared, copy of \a m. Because this is * implicitly shared, this method is lightweight and suitable for * pass-by-value usage. */ Map<Key, T> &operator=(const Map<Key, T> &m); /*! * Exchanges the content of this map by the content of \a m. */ void swap(Map<Key, T> &m); protected: /* * If this List is being shared via implicit sharing, do a deep copy of the * data and separate from the shared members. This should be called by all * non-const subclass members. */ void detach(); private: #ifndef DO_NOT_DOCUMENT template <class KeyP, class TP> class MapPrivate; MapPrivate<Key, T> *d; #endif }; } // namespace TagLib // Since GCC doesn't support the "export" keyword, we have to include the // implementation. #include "tmap.tcc" #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tmap.tcc���������������������������������������������������������������0000664�0000000�0000000�00000012327�14447736377�0017455�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "trefcounter.h" namespace TagLib { //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// // BIC change to RefCounter template <class Key, class T> template <class KeyP, class TP> class Map<Key, T>::MapPrivate : public RefCounterOld { public: MapPrivate() : RefCounterOld() {} #ifdef WANT_CLASS_INSTANTIATION_OF_MAP MapPrivate(const std::map<class KeyP, class TP>& m) : RefCounterOld(), map(m) {} std::map<class KeyP, class TP> map; #else MapPrivate(const std::map<KeyP, TP>& m) : RefCounterOld(), map(m) {} std::map<KeyP, TP> map; #endif }; template <class Key, class T> Map<Key, T>::Map() : d(new MapPrivate<Key, T>()) { } template <class Key, class T> Map<Key, T>::Map(const Map<Key, T> &m) : d(m.d) { d->ref(); } template <class Key, class T> Map<Key, T>::~Map() { if(d->deref()) delete(d); } template <class Key, class T> typename Map<Key, T>::Iterator Map<Key, T>::begin() { detach(); return d->map.begin(); } template <class Key, class T> typename Map<Key, T>::ConstIterator Map<Key, T>::begin() const { return d->map.begin(); } template <class Key, class T> typename Map<Key, T>::Iterator Map<Key, T>::end() { detach(); return d->map.end(); } template <class Key, class T> typename Map<Key, T>::ConstIterator Map<Key, T>::end() const { return d->map.end(); } template <class Key, class T> Map<Key, T> &Map<Key, T>::insert(const Key &key, const T &value) { detach(); d->map[key] = value; return *this; } template <class Key, class T> Map<Key, T> &Map<Key, T>::clear() { detach(); d->map.clear(); return *this; } template <class Key, class T> bool Map<Key, T>::isEmpty() const { return d->map.empty(); } template <class Key, class T> typename Map<Key, T>::Iterator Map<Key, T>::find(const Key &key) { detach(); return d->map.find(key); } template <class Key, class T> typename Map<Key,T>::ConstIterator Map<Key, T>::find(const Key &key) const { return d->map.find(key); } template <class Key, class T> bool Map<Key, T>::contains(const Key &key) const { return d->map.find(key) != d->map.end(); } template <class Key, class T> Map<Key, T> &Map<Key,T>::erase(Iterator it) { detach(); d->map.erase(it); return *this; } template <class Key, class T> Map<Key, T> &Map<Key,T>::erase(const Key &key) { detach(); d->map.erase(key); return *this; } template <class Key, class T> unsigned int Map<Key, T>::size() const { return static_cast<unsigned int>(d->map.size()); } template <class Key, class T> T Map<Key, T>::value(const Key &key, const T &defaultValue) const { ConstIterator it = d->map.find(key); return it != d->map.end() ? it->second : defaultValue; } template <class Key, class T> const T &Map<Key, T>::operator[](const Key &key) const { return d->map[key]; } template <class Key, class T> T &Map<Key, T>::operator[](const Key &key) { detach(); return d->map[key]; } template <class Key, class T> Map<Key, T> &Map<Key, T>::operator=(const Map<Key, T> &m) { Map<Key, T>(m).swap(*this); return *this; } template <class Key, class T> void Map<Key, T>::swap(Map<Key, T> &m) { using std::swap; swap(d, m.d); } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// template <class Key, class T> void Map<Key, T>::detach() { if(d->count() > 1) { d->deref(); d = new MapPrivate<Key, T>(d->map); } } } // namespace TagLib ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tpropertymap.cpp�������������������������������������������������������0000664�0000000�0000000�00000013517�14447736377�0021275�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Michael Helmling email : helmling@mathematik.uni-kl.de ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tpropertymap.h" using namespace TagLib; PropertyMap::PropertyMap() { } PropertyMap::PropertyMap(const PropertyMap &m) : SimplePropertyMap(m), unsupported(m.unsupported) { } PropertyMap::PropertyMap(const SimplePropertyMap &m) { for(SimplePropertyMap::ConstIterator it = m.begin(); it != m.end(); ++it){ String key = it->first.upper(); if(!key.isEmpty()) insert(it->first, it->second); else unsupported.append(it->first); } } PropertyMap::~PropertyMap() { } bool PropertyMap::insert(const String &key, const StringList &values) { String realKey = key.upper(); Iterator result = SimplePropertyMap::find(realKey); if(result == end()) SimplePropertyMap::insert(realKey, values); else SimplePropertyMap::operator[](realKey).append(values); return true; } bool PropertyMap::replace(const String &key, const StringList &values) { String realKey = key.upper(); SimplePropertyMap::erase(realKey); SimplePropertyMap::insert(realKey, values); return true; } PropertyMap::Iterator PropertyMap::find(const String &key) { return SimplePropertyMap::find(key.upper()); } PropertyMap::ConstIterator PropertyMap::find(const String &key) const { return SimplePropertyMap::find(key.upper()); } bool PropertyMap::contains(const String &key) const { return SimplePropertyMap::contains(key.upper()); } bool PropertyMap::contains(const PropertyMap &other) const { for(ConstIterator it = other.begin(); it != other.end(); ++it) { if(!SimplePropertyMap::contains(it->first)) return false; if ((*this)[it->first] != it->second) return false; } return true; } PropertyMap &PropertyMap::erase(const String &key) { SimplePropertyMap::erase(key.upper()); return *this; } PropertyMap &PropertyMap::erase(const PropertyMap &other) { for(ConstIterator it = other.begin(); it != other.end(); ++it) erase(it->first); return *this; } PropertyMap &PropertyMap::merge(const PropertyMap &other) { for(PropertyMap::ConstIterator it = other.begin(); it != other.end(); ++it) insert(it->first, it->second); unsupported.append(other.unsupported); return *this; } StringList PropertyMap::value(const String &key, const StringList &defaultValue) const { return SimplePropertyMap::value(key.upper(), defaultValue); } const StringList &PropertyMap::operator[](const String &key) const { return SimplePropertyMap::operator[](key.upper()); } StringList &PropertyMap::operator[](const String &key) { return SimplePropertyMap::operator[](key.upper()); } bool PropertyMap::operator==(const PropertyMap &other) const { for(ConstIterator it = other.begin(); it != other.end(); ++it) { ConstIterator thisFind = find(it->first); if( thisFind == end() || (thisFind->second != it->second) ) return false; } for(ConstIterator it = begin(); it != end(); ++it) { ConstIterator otherFind = other.find(it->first); if( otherFind == other.end() || (otherFind->second != it->second) ) return false; } return unsupported == other.unsupported; } bool PropertyMap::operator!=(const PropertyMap &other) const { return !(*this == other); } String PropertyMap::toString() const { String ret; for(ConstIterator it = begin(); it != end(); ++it) ret += it->first+"="+it->second.toString(", ") + "\n"; if(!unsupported.isEmpty()) ret += "Unsupported Data: " + unsupported.toString(", ") + "\n"; return ret; } void PropertyMap::removeEmpty() { PropertyMap m; for(ConstIterator it = begin(); it != end(); ++it) { if(!it->second.isEmpty()) m.insert(it->first, it->second); } *this = m; } StringList &PropertyMap::unsupportedData() { return unsupported; } const StringList &PropertyMap::unsupportedData() const { return unsupported; } #ifdef _MSC_VER // When building with shared libraries and tests, MSVC will fail with // "already defined in test_opus.obj" as soon as operator[] of // Ogg::FieldListMap is used because this will instantiate the same template // Map<String, StringList>. Therefore this template is instantiated here // and declared extern in the headers using it. template class TagLib::Map<TagLib::String, TagLib::StringList>; #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tpropertymap.h���������������������������������������������������������0000664�0000000�0000000�00000017500�14447736377�0020736�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Michael Helmling email : helmling@mathematik.uni-kl.de ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_PROPERTYMAP_H_ #define TAGLIB_PROPERTYMAP_H_ #include "tmap.h" #include "tstringlist.h" #ifdef _MSC_VER // Explained at end of tpropertymap.cpp extern template class TAGLIB_EXPORT TagLib::Map<TagLib::String, TagLib::StringList>; #endif namespace TagLib { typedef Map<String,StringList> SimplePropertyMap; //! A map for format-independent <key,valuelist> tag representations. /*! * This map implements a generic representation of textual audio metadata * ("tags") realized as pairs of a case-insensitive key * and a nonempty list of corresponding values, each value being an arbitrary * unicode String. * * Note that most metadata formats pose additional conditions on the tag keys. The * most popular ones (Vorbis, APE, ID3v2) should support all ASCII only words of * length between 2 and 16. * * This class can contain any tags, but here is a list of "well-known" tags that * you might want to use: * * Basic tags: * * - TITLE * - ALBUM * - ARTIST * - ALBUMARTIST * - SUBTITLE * - TRACKNUMBER * - DISCNUMBER * - DATE * - ORIGINALDATE * - GENRE * - COMMENT * * Sort names: * * - TITLESORT * - ALBUMSORT * - ARTISTSORT * - ALBUMARTISTSORT * - COMPOSERSORT * * Credits: * * - COMPOSER * - LYRICIST * - CONDUCTOR * - REMIXER * - PERFORMER:\<XXXX> * * Other tags: * * - ISRC * - ASIN * - BPM * - COPYRIGHT * - ENCODEDBY * - MOOD * - COMMENT * - MEDIA * - LABEL * - CATALOGNUMBER * - BARCODE * - RELEASECOUNTRY * - RELEASESTATUS * - RELEASETYPE * * MusicBrainz identifiers: * * - MUSICBRAINZ_TRACKID * - MUSICBRAINZ_ALBUMID * - MUSICBRAINZ_RELEASEGROUPID * - MUSICBRAINZ_RELEASETRACKID * - MUSICBRAINZ_WORKID * - MUSICBRAINZ_ARTISTID * - MUSICBRAINZ_ALBUMARTISTID * - ACOUSTID_ID * - ACOUSTID_FINGERPRINT * - MUSICIP_PUID * */ class TAGLIB_EXPORT PropertyMap: public SimplePropertyMap { public: typedef SimplePropertyMap::Iterator Iterator; typedef SimplePropertyMap::ConstIterator ConstIterator; PropertyMap(); PropertyMap(const PropertyMap &m); /*! * Creates a PropertyMap initialized from a SimplePropertyMap. Copies all * entries from \a m that have valid keys. * Invalid keys will be appended to the unsupportedData() list. */ PropertyMap(const SimplePropertyMap &m); virtual ~PropertyMap(); /*! * Inserts \a values under \a key in the map. If \a key already exists, * then \a values will be appended to the existing StringList. * The returned value indicates success, i.e. whether \a key is a * valid key. */ bool insert(const String &key, const StringList &values); /*! * Replaces any existing values for \a key with the given \a values, * and simply insert them if \a key did not exist before. * The returned value indicates success, i.e. whether \a key is a * valid key. */ bool replace(const String &key, const StringList &values); /*! * Find the first occurrence of \a key. */ Iterator find(const String &key); /*! * Find the first occurrence of \a key. */ ConstIterator find(const String &key) const; /*! * Returns true if the map contains values for \a key. */ bool contains(const String &key) const; /*! * Returns true if this map contains all keys of \a other * and the values coincide for that keys. Does not take * the unsupportedData list into account. */ bool contains(const PropertyMap &other) const; /*! * Erase the \a key and its values from the map. */ PropertyMap &erase(const String &key); /*! * Erases from this map all keys that appear in \a other. */ PropertyMap &erase(const PropertyMap &other); /*! * Merge the contents of \a other into this PropertyMap. * If a key is contained in both maps, the values of the second * are appended to that of the first. * The unsupportedData() lists are concatenated as well. */ PropertyMap &merge(const PropertyMap &other); /*! * Returns the value associated with \a key. * * If the map does not contain \a key, it returns defaultValue. * If no defaultValue is specified, it returns an empty string list. */ StringList value(const String &key, const StringList &defaultValue = StringList()) const; /*! * Returns a reference to the value associated with \a key. * * \note: If \a key is not contained in the map, an empty * StringList is returned without error. */ const StringList &operator[](const String &key) const; /*! * Returns a reference to the value associated with \a key. * * \note: If \a key is not contained in the map, an empty * StringList is returned. You can also directly add entries * by using this function as an lvalue. */ StringList &operator[](const String &key); /*! * Returns true if and only if \a other has the same contents as this map. */ bool operator==(const PropertyMap &other) const; /*! * Returns false if and only \a other has the same contents as this map. */ bool operator!=(const PropertyMap &other) const; /*! * If a PropertyMap is read from a File object using File::properties(), * the StringList returned from this function will represent metadata * that could not be parsed into the PropertyMap representation. This could * be e.g. binary data, unknown ID3 frames, etc. * You can remove items from the returned list, which tells TagLib to remove * those unsupported elements if you call File::setProperties() with the * same PropertyMap as argument. */ StringList &unsupportedData(); const StringList &unsupportedData() const; /*! * Removes all entries which have an empty value list. */ void removeEmpty(); String toString() const; private: StringList unsupported; }; } // namespace TagLib #endif /* TAGLIB_PROPERTYMAP_H_ */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/trefcounter.cpp��������������������������������������������������������0000664�0000000�0000000�00000006163�14447736377�0021066�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2013 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include "trefcounter.h" #if defined(HAVE_GCC_ATOMIC) # define ATOMIC_INT int # define ATOMIC_INC(x) __sync_add_and_fetch(&(x), 1) # define ATOMIC_DEC(x) __sync_sub_and_fetch(&(x), 1) #elif defined(HAVE_WIN_ATOMIC) # if !defined(NOMINMAX) # define NOMINMAX # endif # include <windows.h> # define ATOMIC_INT long # define ATOMIC_INC(x) InterlockedIncrement(&x) # define ATOMIC_DEC(x) InterlockedDecrement(&x) #elif defined(HAVE_MAC_ATOMIC) # include <libkern/OSAtomic.h> # define ATOMIC_INT int32_t # define ATOMIC_INC(x) OSAtomicIncrement32Barrier(&x) # define ATOMIC_DEC(x) OSAtomicDecrement32Barrier(&x) #elif defined(HAVE_IA64_ATOMIC) # include <ia64intrin.h> # define ATOMIC_INT int # define ATOMIC_INC(x) __sync_add_and_fetch(&x, 1) # define ATOMIC_DEC(x) __sync_sub_and_fetch(&x, 1) #else # define ATOMIC_INT int # define ATOMIC_INC(x) (++x) # define ATOMIC_DEC(x) (--x) #endif namespace TagLib { class RefCounter::RefCounterPrivate { public: RefCounterPrivate() : refCount(1) {} volatile ATOMIC_INT refCount; }; RefCounter::RefCounter() : d(new RefCounterPrivate()) { } RefCounter::~RefCounter() { delete d; } void RefCounter::ref() { ATOMIC_INC(d->refCount); } bool RefCounter::deref() { return (ATOMIC_DEC(d->refCount) == 0); } int RefCounter::count() const { return static_cast<int>(d->refCount); } } // namespace TagLib �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/trefcounter.h����������������������������������������������������������0000664�0000000�0000000�00000007750�14447736377�0020536�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2013 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_REFCOUNTER_H #define TAGLIB_REFCOUNTER_H #include "taglib_export.h" #include "taglib.h" #ifdef __APPLE__ # define OSATOMIC_DEPRECATED 0 # include <libkern/OSAtomic.h> # define TAGLIB_ATOMIC_MAC #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # ifndef NOMINMAX # define NOMINMAX # endif # include <windows.h> # define TAGLIB_ATOMIC_WIN #elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 401) \ && (defined(__i386__) || defined(__i486__) || defined(__i586__) || \ defined(__i686__) || defined(__x86_64) || defined(__ia64)) \ && !defined(__INTEL_COMPILER) # define TAGLIB_ATOMIC_GCC #elif defined(__ia64) && defined(__INTEL_COMPILER) # include <ia64intrin.h> # define TAGLIB_ATOMIC_GCC #endif #ifndef DO_NOT_DOCUMENT // Tell Doxygen to skip this class. /*! * \internal * This is just used as a base class for shared classes in TagLib. * * \warning This <b>is not</b> part of the TagLib public API! */ namespace TagLib { class TAGLIB_EXPORT RefCounter { public: RefCounter(); virtual ~RefCounter(); void ref(); bool deref(); int count() const; private: class RefCounterPrivate; RefCounterPrivate *d; }; // BIC this old class is needed by tlist.tcc and tmap.tcc class RefCounterOld { public: RefCounterOld() : refCount(1) {} #ifdef TAGLIB_ATOMIC_MAC void ref() { OSAtomicIncrement32Barrier(const_cast<int32_t*>(&refCount)); } bool deref() { return ! OSAtomicDecrement32Barrier(const_cast<int32_t*>(&refCount)); } int32_t count() { return refCount; } private: volatile int32_t refCount; #elif defined(TAGLIB_ATOMIC_WIN) void ref() { InterlockedIncrement(&refCount); } bool deref() { return ! InterlockedDecrement(&refCount); } long count() { return refCount; } private: volatile long refCount; #elif defined(TAGLIB_ATOMIC_GCC) void ref() { __sync_add_and_fetch(&refCount, 1); } bool deref() { return ! __sync_sub_and_fetch(&refCount, 1); } int count() { return refCount; } private: volatile int refCount; #else void ref() { refCount++; } bool deref() { return ! --refCount; } int count() { return refCount; } private: unsigned int refCount; #endif }; } // namespace TagLib #endif // DO_NOT_DOCUMENT #endif ������������������������taglib-1.13.1/taglib/toolkit/tstring.cpp������������������������������������������������������������0000664�0000000�0000000�00000040075�14447736377�0020220�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <cerrno> #include <climits> #include <utf8-cpp/checked.h> #include <tdebug.h> #include <tstringlist.h> #include <trefcounter.h> #include <tutils.h> #include "tstring.h" namespace { using namespace TagLib; // Returns the native format of std::wstring. String::Type wcharByteOrder() { if(Utils::systemByteOrder() == Utils::LittleEndian) return String::UTF16LE; return String::UTF16BE; } // Converts a Latin-1 string into UTF-16(without BOM/CPU byte order) // and copies it to the internal buffer. void copyFromLatin1(std::wstring &data, const char *s, size_t length) { data.resize(length); for(size_t i = 0; i < length; ++i) data[i] = static_cast<unsigned char>(s[i]); } // Converts a UTF-8 string into UTF-16(without BOM/CPU byte order) // and copies it to the internal buffer. void copyFromUTF8(std::wstring &data, const char *s, size_t length) { data.resize(length); try { const std::wstring::iterator dstEnd = utf8::utf8to16(s, s + length, data.begin()); data.resize(dstEnd - data.begin()); } catch(const utf8::exception &e) { const String message(e.what()); debug("String::copyFromUTF8() - UTF8-CPP error: " + message); data.clear(); } } // Helper functions to read a UTF-16 character from an array. template <typename T> unsigned short nextUTF16(const T **p); template <> unsigned short nextUTF16<wchar_t>(const wchar_t **p) { return static_cast<unsigned short>(*(*p)++); } template <> unsigned short nextUTF16<char>(const char **p) { union { unsigned short w; char c[2]; } u; u.c[0] = *(*p)++; u.c[1] = *(*p)++; return u.w; } // Converts a UTF-16 (with BOM), UTF-16LE or UTF16-BE string into // UTF-16(without BOM/CPU byte order) and copies it to the internal buffer. template <typename T> void copyFromUTF16(std::wstring &data, const T *s, size_t length, String::Type t) { bool swap; if(t == String::UTF16) { if(length < 1) { debug("String::copyFromUTF16() - Invalid UTF16 string. Too short to have a BOM."); return; } const unsigned short bom = nextUTF16(&s); if(bom == 0xfeff) swap = false; // Same as CPU endian. No need to swap bytes. else if(bom == 0xfffe) swap = true; // Not same as CPU endian. Need to swap bytes. else { debug("String::copyFromUTF16() - Invalid UTF16 string. BOM is broken."); return; } length--; } else { swap = (t != wcharByteOrder()); } data.resize(length); for(size_t i = 0; i < length; ++i) { const unsigned short c = nextUTF16(&s); if(swap) data[i] = Utils::byteSwap(c); else data[i] = c; } } } // namespace namespace TagLib { class String::StringPrivate : public RefCounter { public: StringPrivate() {} /*! * Stores string in UTF-16. The byte order depends on the CPU endian. */ TagLib::wstring data; /*! * This is only used to hold the the most recent value of toCString(). */ std::string cstring; }; String String::null; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// String::String() : d(new StringPrivate()) { } String::String(const String &s) : d(s.d) { d->ref(); } String::String(const std::string &s, Type t) : d(new StringPrivate()) { if(t == Latin1) copyFromLatin1(d->data, s.c_str(), s.length()); else if(t == String::UTF8) copyFromUTF8(d->data, s.c_str(), s.length()); else { debug("String::String() -- std::string should not contain UTF16."); } } String::String(const wstring &s, Type t) : d(new StringPrivate()) { if(t == UTF16 || t == UTF16BE || t == UTF16LE) { // This looks ugly but needed for the compatibility with TagLib1.8. // Should be removed in TabLib2.0. if (t == UTF16BE) t = wcharByteOrder(); else if (t == UTF16LE) t = (wcharByteOrder() == UTF16LE ? UTF16BE : UTF16LE); copyFromUTF16(d->data, s.c_str(), s.length(), t); } else { debug("String::String() -- TagLib::wstring should not contain Latin1 or UTF-8."); } } String::String(const wchar_t *s, Type t) : d(new StringPrivate()) { if(t == UTF16 || t == UTF16BE || t == UTF16LE) { // This looks ugly but needed for the compatibility with TagLib1.8. // Should be removed in TabLib2.0. if (t == UTF16BE) t = wcharByteOrder(); else if (t == UTF16LE) t = (wcharByteOrder() == UTF16LE ? UTF16BE : UTF16LE); copyFromUTF16(d->data, s, ::wcslen(s), t); } else { debug("String::String() -- const wchar_t * should not contain Latin1 or UTF-8."); } } String::String(const char *s, Type t) : d(new StringPrivate()) { if(t == Latin1) copyFromLatin1(d->data, s, ::strlen(s)); else if(t == String::UTF8) copyFromUTF8(d->data, s, ::strlen(s)); else { debug("String::String() -- const char * should not contain UTF16."); } } String::String(wchar_t c, Type t) : d(new StringPrivate()) { if(t == UTF16 || t == UTF16BE || t == UTF16LE) copyFromUTF16(d->data, &c, 1, t); else { debug("String::String() -- wchar_t should not contain Latin1 or UTF-8."); } } String::String(char c, Type t) : d(new StringPrivate()) { if(t == Latin1) copyFromLatin1(d->data, &c, 1); else if(t == String::UTF8) copyFromUTF8(d->data, &c, 1); else { debug("String::String() -- char should not contain UTF16."); } } String::String(const ByteVector &v, Type t) : d(new StringPrivate()) { if(v.isEmpty()) return; if(t == Latin1) copyFromLatin1(d->data, v.data(), v.size()); else if(t == UTF8) copyFromUTF8(d->data, v.data(), v.size()); else copyFromUTF16(d->data, v.data(), v.size() / 2, t); // If we hit a null in the ByteVector, shrink the string again. d->data.resize(::wcslen(d->data.c_str())); } //////////////////////////////////////////////////////////////////////////////// String::~String() { if(d->deref()) delete d; } std::string String::to8Bit(bool unicode) const { const ByteVector v = data(unicode ? UTF8 : Latin1); return std::string(v.data(), v.size()); } TagLib::wstring String::toWString() const { return d->data; } const char *String::toCString(bool unicode) const { d->cstring = to8Bit(unicode); return d->cstring.c_str(); } const wchar_t *String::toCWString() const { return d->data.c_str(); } String::Iterator String::begin() { detach(); return d->data.begin(); } String::ConstIterator String::begin() const { return d->data.begin(); } String::Iterator String::end() { detach(); return d->data.end(); } String::ConstIterator String::end() const { return d->data.end(); } int String::find(const String &s, int offset) const { return static_cast<int>(d->data.find(s.d->data, offset)); } int String::rfind(const String &s, int offset) const { return static_cast<int>(d->data.rfind(s.d->data, offset)); } StringList String::split(const String &separator) const { StringList list; for(int index = 0;;) { int sep = find(separator, index); if(sep < 0) { list.append(substr(index, size() - index)); break; } list.append(substr(index, sep - index)); index = sep + separator.size(); } return list; } bool String::startsWith(const String &s) const { if(s.length() > length()) return false; return substr(0, s.length()) == s; } String String::substr(unsigned int position, unsigned int n) const { if(position == 0 && n >= size()) return *this; return String(d->data.substr(position, n)); } String &String::append(const String &s) { detach(); d->data += s.d->data; return *this; } String & String::clear() { *this = String(); return *this; } String String::upper() const { String s; s.d->data.reserve(size()); for(ConstIterator it = begin(); it != end(); ++it) { if(*it >= 'a' && *it <= 'z') s.d->data.push_back(*it + 'A' - 'a'); else s.d->data.push_back(*it); } return s; } unsigned int String::size() const { return static_cast<unsigned int>(d->data.size()); } unsigned int String::length() const { return size(); } bool String::isEmpty() const { return d->data.empty(); } bool String::isNull() const { return d == null.d; } ByteVector String::data(Type t) const { switch(t) { case Latin1: { ByteVector v(size(), 0); char *p = v.data(); for(ConstIterator it = begin(); it != end(); ++it) *p++ = static_cast<char>(*it); return v; } case UTF8: { ByteVector v(size() * 4, 0); try { const ByteVector::Iterator dstEnd = utf8::utf16to8(begin(), end(), v.begin()); v.resize(static_cast<unsigned int>(dstEnd - v.begin())); } catch(const utf8::exception &e) { const String message(e.what()); debug("String::data() - UTF8-CPP error: " + message); v.clear(); } return v; } case UTF16: { ByteVector v(2 + size() * 2, 0); char *p = v.data(); // We use little-endian encoding here and need a BOM. *p++ = '\xff'; *p++ = '\xfe'; for(ConstIterator it = begin(); it != end(); ++it) { *p++ = static_cast<char>(*it & 0xff); *p++ = static_cast<char>(*it >> 8); } return v; } case UTF16BE: { ByteVector v(size() * 2, 0); char *p = v.data(); for(ConstIterator it = begin(); it != end(); ++it) { *p++ = static_cast<char>(*it >> 8); *p++ = static_cast<char>(*it & 0xff); } return v; } case UTF16LE: { ByteVector v(size() * 2, 0); char *p = v.data(); for(ConstIterator it = begin(); it != end(); ++it) { *p++ = static_cast<char>(*it & 0xff); *p++ = static_cast<char>(*it >> 8); } return v; } default: { debug("String::data() - Invalid Type value."); return ByteVector(); } } } int String::toInt() const { return toInt(0); } int String::toInt(bool *ok) const { const wchar_t *begin = d->data.c_str(); wchar_t *end; errno = 0; const long value = ::wcstol(begin, &end, 10); // Has wcstol() consumed the entire string and not overflowed? if(ok) { *ok = (errno == 0 && end > begin && *end == L'\0'); *ok = (*ok && value > INT_MIN && value < INT_MAX); } return static_cast<int>(value); } String String::stripWhiteSpace() const { static const wchar_t *WhiteSpaceChars = L"\t\n\f\r "; const size_t pos1 = d->data.find_first_not_of(WhiteSpaceChars); if(pos1 == std::wstring::npos) return String(); const size_t pos2 = d->data.find_last_not_of(WhiteSpaceChars); return substr(static_cast<unsigned int>(pos1), static_cast<unsigned int>(pos2 - pos1 + 1)); } bool String::isLatin1() const { for(ConstIterator it = begin(); it != end(); ++it) { if(*it >= 256) return false; } return true; } bool String::isAscii() const { for(ConstIterator it = begin(); it != end(); ++it) { if(*it >= 128) return false; } return true; } String String::number(int n) // static { return Utils::formatString("%d", n); } wchar_t &String::operator[](int i) { detach(); return d->data[i]; } const wchar_t &String::operator[](int i) const { return d->data[i]; } bool String::operator==(const String &s) const { return (d == s.d || d->data == s.d->data); } bool String::operator!=(const String &s) const { return !(*this == s); } bool String::operator==(const char *s) const { const wchar_t *p = toCWString(); while(*p != L'\0' || *s != '\0') { if(*p++ != static_cast<unsigned char>(*s++)) return false; } return true; } bool String::operator!=(const char *s) const { return !(*this == s); } bool String::operator==(const wchar_t *s) const { return (d->data == s); } bool String::operator!=(const wchar_t *s) const { return !(*this == s); } String &String::operator+=(const String &s) { detach(); d->data += s.d->data; return *this; } String &String::operator+=(const wchar_t *s) { detach(); d->data += s; return *this; } String &String::operator+=(const char *s) { detach(); for(int i = 0; s[i] != 0; i++) d->data += static_cast<unsigned char>(s[i]); return *this; } String &String::operator+=(wchar_t c) { detach(); d->data += c; return *this; } String &String::operator+=(char c) { detach(); d->data += static_cast<unsigned char>(c); return *this; } String &String::operator=(const String &s) { String(s).swap(*this); return *this; } String &String::operator=(const std::string &s) { String(s).swap(*this); return *this; } String &String::operator=(const wstring &s) { String(s).swap(*this); return *this; } String &String::operator=(const wchar_t *s) { String(s).swap(*this); return *this; } String &String::operator=(char c) { String(c).swap(*this); return *this; } String &String::operator=(wchar_t c) { String(c, wcharByteOrder()).swap(*this); return *this; } String &String::operator=(const char *s) { String(s).swap(*this); return *this; } String &String::operator=(const ByteVector &v) { String(v).swap(*this); return *this; } void String::swap(String &s) { using std::swap; swap(d, s.d); } bool String::operator<(const String &s) const { return (d->data < s.d->data); } //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// void String::detach() { if(d->count() > 1) String(d->data.c_str()).swap(*this); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// const String::Type String::WCharByteOrder = wcharByteOrder(); } // namespace TagLib //////////////////////////////////////////////////////////////////////////////// // related non-member functions //////////////////////////////////////////////////////////////////////////////// TagLib::String operator+(const TagLib::String &s1, const TagLib::String &s2) { TagLib::String s(s1); s.append(s2); return s; } TagLib::String operator+(const char *s1, const TagLib::String &s2) { TagLib::String s(s1); s.append(s2); return s; } TagLib::String operator+(const TagLib::String &s1, const char *s2) { TagLib::String s(s1); s.append(s2); return s; } std::ostream &operator<<(std::ostream &s, const TagLib::String &str) { s << str.to8Bit(); return s; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tstring.h��������������������������������������������������������������0000664�0000000�0000000�00000041366�14447736377�0017671�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_STRING_H #define TAGLIB_STRING_H #include "taglib_export.h" #include "taglib.h" #include "tbytevector.h" #include <string> #include <iostream> /*! * \relates TagLib::String * * Converts a QString to a TagLib::String without a requirement to link to Qt. * * \note consider conversion via usual char-by-char for loop to avoid UTF16->UTF8->UTF16 * conversion happening in the background */ #if defined(QT_VERSION) && (QT_VERSION >= 0x040000) #define QStringToTString(s) TagLib::String(s.toUtf8().data(), TagLib::String::UTF8) #else #define QStringToTString(s) TagLib::String((s).utf8().data(), TagLib::String::UTF8) #endif /*! * \relates TagLib::String * * Converts a TagLib::String to a QString without a requirement to link to Qt. * * \note consider conversion via usual char-by-char for loop to avoid UTF16->UTF8->UTF16 * conversion happening in the background * */ #define TStringToQString(s) QString::fromUtf8((s).toCString(true)) namespace TagLib { class StringList; //! A \e wide string class suitable for unicode. /*! * This is an implicitly shared \e wide string. For storage it uses * TagLib::wstring, but as this is an <i>implementation detail</i> this of * course could change. Strings are stored internally as UTF-16(without BOM/ * CPU byte order) * * The use of implicit sharing means that copying a string is cheap, the only * \e cost comes into play when the copy is modified. Prior to that the string * just has a pointer to the data of the \e parent String. This also makes * this class suitable as a function return type. * * In addition to adding implicit sharing, this class keeps track of four * possible encodings, which are the four supported by the ID3v2 standard. */ class TAGLIB_EXPORT String { public: #ifndef DO_NOT_DOCUMENT typedef TagLib::wstring::iterator Iterator; typedef TagLib::wstring::const_iterator ConstIterator; #endif /** * The four types of string encodings supported by the ID3v2 specification. * ID3v1 is assumed to be Latin1 and Ogg Vorbis comments use UTF8. */ enum Type { /*! * IS08859-1, or <i>Latin1</i> encoding. 8 bit characters. */ Latin1 = 0, /*! * UTF16 with a <i>byte order mark</i>. 16 bit characters. */ UTF16 = 1, /*! * UTF16 <i>big endian</i>. 16 bit characters. This is the encoding used * internally by TagLib. */ UTF16BE = 2, /*! * UTF8 encoding. Characters are usually 8 bits but can be up to 32. */ UTF8 = 3, /*! * UTF16 <i>little endian</i>. 16 bit characters. */ UTF16LE = 4 }; /*! * Constructs an empty String. */ String(); /*! * Make a shallow, implicitly shared, copy of \a s. Because this is * implicitly shared, this method is lightweight and suitable for * pass-by-value usage. */ String(const String &s); /*! * Makes a deep copy of the data in \a s. * * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when * used with other codecs it will simply print a warning and exit. */ String(const std::string &s, Type t = Latin1); /*! * Makes a deep copy of the data in \a s. * * /note If \a t is UTF16LE, the byte order of \a s will be swapped regardless * of the CPU byte order. If UTF16BE, it will not be swapped. This behavior * will be changed in TagLib2.0. */ String(const wstring &s, Type t = UTF16BE); /*! * Makes a deep copy of the data in \a s. * * /note If \a t is UTF16LE, the byte order of \a s will be swapped regardless * of the CPU byte order. If UTF16BE, it will not be swapped. This behavior * will be changed in TagLib2.0. */ String(const wchar_t *s, Type t = UTF16BE); /*! * Makes a deep copy of the data in \a c. * * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when * used with other codecs it will simply print a warning and exit. */ String(char c, Type t = Latin1); /*! * Makes a deep copy of the data in \a c. */ String(wchar_t c, Type t = Latin1); /*! * Makes a deep copy of the data in \a s. * * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when * used with other codecs it will simply print a warning and exit. */ String(const char *s, Type t = Latin1); /*! * Makes a deep copy of the data in \a v. */ String(const ByteVector &v, Type t = Latin1); /*! * Destroys this String instance. */ virtual ~String(); /*! * Returns a deep copy of this String as an std::string. The returned string * is encoded in UTF8 if \a unicode is true, otherwise Latin1. * * \see toCString() */ std::string to8Bit(bool unicode = false) const; /*! * Returns a deep copy of this String as a wstring. The returned string is * encoded in UTF-16 (without BOM/CPU byte order), not UTF-32 even if wchar_t * is 32-bit wide. * * \see toCWString() */ wstring toWString() const; /*! * Creates and returns a standard C-style (null-terminated) version of this * String. The returned string is encoded in UTF8 if \a unicode is true, * otherwise Latin1. * * The returned string is still owned by this String and should not be deleted * by the user. * * The returned pointer remains valid until this String instance is destroyed * or toCString() is called again. * * \warning This however has the side effect that the returned string will remain * in memory <b>in addition to</b> other memory that is consumed by this * String instance. So, this method should not be used on large strings or * where memory is critical. Consider using to8Bit() instead to avoid it. * * \see to8Bit() */ const char *toCString(bool unicode = false) const; /*! * Returns a standard C-style (null-terminated) wide character version of * this String. The returned string is encoded in UTF-16 (without BOM/CPU byte * order), not UTF-32 even if wchar_t is 32-bit wide. * * The returned string is still owned by this String and should not be deleted * by the user. * * The returned pointer remains valid until this String instance is destroyed * or any other method of this String is called. * * \note This returns a pointer to the String's internal data without any * conversions. * * \see toWString() */ const wchar_t *toCWString() const; /*! * Returns an iterator pointing to the beginning of the string. */ Iterator begin(); /*! * Returns a const iterator pointing to the beginning of the string. */ ConstIterator begin() const; /*! * Returns an iterator pointing to the end of the string (the position * after the last character). */ Iterator end(); /*! * Returns a const iterator pointing to the end of the string (the position * after the last character). */ ConstIterator end() const; /*! * Finds the first occurrence of pattern \a s in this string starting from * \a offset. If the pattern is not found, -1 is returned. */ int find(const String &s, int offset = 0) const; /*! * Finds the last occurrence of pattern \a s in this string, searched backwards, * either from the end of the string or starting from \a offset. If the pattern * is not found, -1 is returned. */ int rfind(const String &s, int offset = -1) const; /*! * Splits the string on each occurrence of \a separator. */ StringList split(const String &separator = " ") const; /*! * Returns true if the strings starts with the substring \a s. */ bool startsWith(const String &s) const; /*! * Extract a substring from this string starting at \a position and * continuing for \a n characters. */ String substr(unsigned int position, unsigned int n = 0xffffffff) const; /*! * Append \a s to the current string and return a reference to the current * string. */ String &append(const String &s); /*! * Clears the string. */ String &clear(); /*! * Returns an upper case version of the string. * * \warning This only works for the characters in US-ASCII, i.e. A-Z. */ String upper() const; /*! * Returns the size of the string. */ unsigned int size() const; /*! * Returns the length of the string. Equivalent to size(). */ unsigned int length() const; /*! * Returns true if the string is empty. * * \see isNull() */ bool isEmpty() const; /*! * Returns true if this string is null -- i.e. it is a copy of the * String::null string. * * \note A string can be empty and not null. So do not use this method to * check if the string is empty. * * \see isEmpty() * * \deprecated Use isEmpty(), do not differentiate between null and empty. */ // BIC: remove TAGLIB_DEPRECATED bool isNull() const; /*! * Returns a ByteVector containing the string's data. If \a t is Latin1 or * UTF8, this will return a vector of 8 bit characters, otherwise it will use * 16 bit characters. * * \note If \a t is UTF16, the returned data is encoded in little-endian * format and has a BOM. * * \note The returned data is not null terminated. */ ByteVector data(Type t) const; /*! * Convert the string to an integer. * * Returns the integer if the conversion was successful or 0 if the * string does not represent a number. */ // BIC: merge with the method below int toInt() const; /*! * Convert the string to an integer. * * If the conversion was successful, it sets the value of \a *ok to * true and returns the integer. Otherwise it sets \a *ok to false * and the result is undefined. */ int toInt(bool *ok) const; /*! * Returns a string with the leading and trailing whitespace stripped. */ String stripWhiteSpace() const; /*! * Returns true if the file only uses characters required by Latin1. */ bool isLatin1() const; /*! * Returns true if the file only uses characters required by (7-bit) ASCII. */ bool isAscii() const; /*! * Converts the base-10 integer \a n to a string. */ static String number(int n); /*! * Returns a reference to the character at position \a i. */ wchar_t &operator[](int i); /*! * Returns a const reference to the character at position \a i. */ const wchar_t &operator[](int i) const; /*! * Compares each character of the String with each character of \a s and * returns true if the strings match. */ bool operator==(const String &s) const; /*! * Compares each character of the String with each character of \a s and * returns false if the strings match. */ bool operator!=(const String &s) const; /*! * Compares each character of the String with each character of \a s and * returns true if the strings match. */ bool operator==(const char *s) const; /*! * Compares each character of the String with each character of \a s and * returns false if the strings match. */ bool operator!=(const char *s) const; /*! * Compares each character of the String with each character of \a s and * returns true if the strings match. */ bool operator==(const wchar_t *s) const; /*! * Compares each character of the String with each character of \a s and * returns false if the strings match. */ bool operator!=(const wchar_t *s) const; /*! * Appends \a s to the end of the String. */ String &operator+=(const String &s); /*! * Appends \a s to the end of the String. */ String &operator+=(const wchar_t* s); /*! * Appends \a s to the end of the String. */ String &operator+=(const char* s); /*! * Appends \a s to the end of the String. */ String &operator+=(wchar_t c); /*! * Appends \a c to the end of the String. */ String &operator+=(char c); /*! * Performs a shallow, implicitly shared, copy of \a s, overwriting the * String's current data. */ String &operator=(const String &s); /*! * Performs a deep copy of the data in \a s. */ String &operator=(const std::string &s); /*! * Performs a deep copy of the data in \a s. */ String &operator=(const wstring &s); /*! * Performs a deep copy of the data in \a s. */ String &operator=(const wchar_t *s); /*! * Performs a deep copy of the data in \a s. */ String &operator=(char c); /*! * Performs a deep copy of the data in \a s. */ String &operator=(wchar_t c); /*! * Performs a deep copy of the data in \a s. */ String &operator=(const char *s); /*! * Performs a deep copy of the data in \a v. */ String &operator=(const ByteVector &v); /*! * Exchanges the content of the String by the content of \a s. */ void swap(String &s); /*! * To be able to use this class in a Map, this operator needed to be * implemented. Returns true if \a s is less than this string in a byte-wise * comparison. */ bool operator<(const String &s) const; /*! * A null string provided for convenience. * * \warning Do not modify this variable. It will mess up the internal state * of TagLib. * * \deprecated Use String(). */ // BIC: remove TAGLIB_DEPRECATED static String null; protected: /*! * If this String is being shared via implicit sharing, do a deep copy of the * data and separate from the shared members. This should be called by all * non-const subclass members. */ void detach(); private: /*! * \deprecated This variable is no longer used, but NEVER remove this. It * may lead to a linkage error. */ // BIC: remove TAGLIB_DEPRECATED static const Type WCharByteOrder; class StringPrivate; StringPrivate *d; }; } // namespace TagLib /*! * \relates TagLib::String * * Concatenates \a s1 and \a s2 and returns the result as a string. */ TAGLIB_EXPORT TagLib::String operator+(const TagLib::String &s1, const TagLib::String &s2); /*! * \relates TagLib::String * * Concatenates \a s1 and \a s2 and returns the result as a string. */ TAGLIB_EXPORT TagLib::String operator+(const char *s1, const TagLib::String &s2); /*! * \relates TagLib::String * * Concatenates \a s1 and \a s2 and returns the result as a string. */ TAGLIB_EXPORT TagLib::String operator+(const TagLib::String &s1, const char *s2); /*! * \relates TagLib::String * * Send the string to an output stream. */ TAGLIB_EXPORT std::ostream &operator<<(std::ostream &s, const TagLib::String &str); #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tstringlist.cpp��������������������������������������������������������0000664�0000000�0000000�00000007100�14447736377�0021104�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tstringlist.h" using namespace TagLib; class StringListPrivate { }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// StringList StringList::split(const String &s, const String &pattern) { StringList l; int previousOffset = 0; for(int offset = s.find(pattern); offset != -1; offset = s.find(pattern, offset + 1)) { l.append(s.substr(previousOffset, offset - previousOffset)); previousOffset = offset + 1; } l.append(s.substr(previousOffset, s.size() - previousOffset)); return l; } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// StringList::StringList() { } StringList::StringList(const StringList &l) : List<String>(l) { } StringList::StringList(const String &s) { append(s); } StringList::StringList(const ByteVectorList &bl, String::Type t) { ByteVectorList::ConstIterator i = bl.begin(); for(;i != bl.end(); i++) { append(String(*i, t)); } } StringList::~StringList() { } String StringList::toString(const String &separator) const { String s; ConstIterator it = begin(); ConstIterator itEnd = end(); while(it != itEnd) { s += *it; it++; if(it != itEnd) s += separator; } return s; } StringList &StringList::append(const String &s) { List<String>::append(s); return *this; } StringList &StringList::append(const StringList &l) { List<String>::append(l); return *this; } //////////////////////////////////////////////////////////////////////////////// // related functions //////////////////////////////////////////////////////////////////////////////// std::ostream &operator<<(std::ostream &s, const StringList &l) { s << l.toString(); return s; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tstringlist.h����������������������������������������������������������0000664�0000000�0000000�00000007454�14447736377�0020565�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2002 - 2008 by Scott Wheeler email : wheeler@kde.org ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_STRINGLIST_H #define TAGLIB_STRINGLIST_H #include "tstring.h" #include "tlist.h" #include "tbytevectorlist.h" #include "taglib_export.h" #include <iostream> namespace TagLib { //! A list of strings /*! * This is a specialization of the List class with some members convention for * string operations. */ class TAGLIB_EXPORT StringList : public List<String> { public: /*! * Constructs an empty StringList. */ StringList(); /*! * Make a shallow, implicitly shared, copy of \a l. Because this is * implicitly shared, this method is lightweight and suitable for * pass-by-value usage. */ StringList(const StringList &l); /*! * Constructs a StringList with \a s as a member. */ StringList(const String &s); /*! * Makes a deep copy of the data in \a vl. * * \note This should only be used with the 8-bit codecs Latin1 and UTF8, when * used with other codecs it will simply print a warning and exit. */ StringList(const ByteVectorList &vl, String::Type t = String::Latin1); /*! * Destroys this StringList instance. */ virtual ~StringList(); /*! * Concatenate the list of strings into one string separated by \a separator. */ String toString(const String &separator = " ") const; /*! * Appends \a s to the end of the list and returns a reference to the * list. */ StringList &append(const String &s); /*! * Appends all of the values in \a l to the end of the list and returns a * reference to the list. */ StringList &append(const StringList &l); /*! * Splits the String \a s into several strings at \a pattern. This will not include * the pattern in the returned strings. */ static StringList split(const String &s, const String &pattern); private: class StringListPrivate; StringListPrivate *d; }; } // namespace TagLib /*! * \related TagLib::StringList * Send the StringList to an output stream. */ std::ostream TAGLIB_EXPORT &operator<<(std::ostream &s, const TagLib::StringList &l); #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tutils.h���������������������������������������������������������������0000664�0000000�0000000�00000013723�14447736377�0017517�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2013 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_TUTILS_H #define TAGLIB_TUTILS_H // THIS FILE IS NOT A PART OF THE TAGLIB API #ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header #ifdef HAVE_CONFIG_H # include <config.h> #endif #if defined(HAVE_MSC_BYTESWAP) # include <stdlib.h> #elif defined(HAVE_GLIBC_BYTESWAP) # include <byteswap.h> #elif defined(HAVE_MAC_BYTESWAP) # include <libkern/OSByteOrder.h> #elif defined(HAVE_OPENBSD_BYTESWAP) # include <sys/endian.h> #endif #include <tstring.h> #include <cstdio> #include <cstdarg> #include <cstring> namespace TagLib { namespace Utils { namespace { /*! * Reverses the order of bytes in an 16-bit integer. */ inline unsigned short byteSwap(unsigned short x) { #if defined(HAVE_GCC_BYTESWAP) return __builtin_bswap16(x); #elif defined(HAVE_MSC_BYTESWAP) return _byteswap_ushort(x); #elif defined(HAVE_GLIBC_BYTESWAP) return __bswap_16(x); #elif defined(HAVE_MAC_BYTESWAP) return OSSwapInt16(x); #elif defined(HAVE_OPENBSD_BYTESWAP) return swap16(x); #else return ((x >> 8) & 0xff) | ((x & 0xff) << 8); #endif } /*! * Reverses the order of bytes in an 32-bit integer. */ inline unsigned int byteSwap(unsigned int x) { #if defined(HAVE_GCC_BYTESWAP) return __builtin_bswap32(x); #elif defined(HAVE_MSC_BYTESWAP) return _byteswap_ulong(x); #elif defined(HAVE_GLIBC_BYTESWAP) return __bswap_32(x); #elif defined(HAVE_MAC_BYTESWAP) return OSSwapInt32(x); #elif defined(HAVE_OPENBSD_BYTESWAP) return swap32(x); #else return ((x & 0xff000000u) >> 24) | ((x & 0x00ff0000u) >> 8) | ((x & 0x0000ff00u) << 8) | ((x & 0x000000ffu) << 24); #endif } /*! * Reverses the order of bytes in an 64-bit integer. */ inline unsigned long long byteSwap(unsigned long long x) { #if defined(HAVE_GCC_BYTESWAP) return __builtin_bswap64(x); #elif defined(HAVE_MSC_BYTESWAP) return _byteswap_uint64(x); #elif defined(HAVE_GLIBC_BYTESWAP) return __bswap_64(x); #elif defined(HAVE_MAC_BYTESWAP) return OSSwapInt64(x); #elif defined(HAVE_OPENBSD_BYTESWAP) return swap64(x); #else return ((x & 0xff00000000000000ull) >> 56) | ((x & 0x00ff000000000000ull) >> 40) | ((x & 0x0000ff0000000000ull) >> 24) | ((x & 0x000000ff00000000ull) >> 8) | ((x & 0x00000000ff000000ull) << 8) | ((x & 0x0000000000ff0000ull) << 24) | ((x & 0x000000000000ff00ull) << 40) | ((x & 0x00000000000000ffull) << 56); #endif } /*! * Returns a formatted string just like standard sprintf(), but makes use of * safer functions such as snprintf() if available. */ inline String formatString(const char *format, ...) { // Sufficient buffer size for the current internal uses. // Consider changing this value when you use this function. static const size_t BufferSize = 128; va_list args; va_start(args, format); char buf[BufferSize]; int length; #if defined(HAVE_VSNPRINTF) length = vsnprintf(buf, BufferSize, format, args); #elif defined(HAVE_VSPRINTF_S) length = vsprintf_s(buf, format, args); #else // The last resort. May cause a buffer overflow. length = vsprintf(buf, format, args); if(length >= BufferSize) { debug("Utils::formatString() - Buffer overflow! Returning an empty string."); length = -1; } #endif va_end(args); if(length > 0) return String(buf); return String(); } /*! * The types of byte order of the running system. */ enum ByteOrder { //! Little endian systems. LittleEndian, //! Big endian systems. BigEndian }; /*! * Returns the byte order of the system. */ inline ByteOrder systemByteOrder() { union { int i; char c; } u; u.i = 1; if(u.c == 1) return LittleEndian; return BigEndian; } } // namespace } // namespace Utils } // namespace TagLib #endif #endif ���������������������������������������������taglib-1.13.1/taglib/toolkit/tzlib.cpp��������������������������������������������������������������0000664�0000000�0000000�00000006172�14447736377�0017652�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2016 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifdef HAVE_CONFIG_H # include <config.h> #endif #ifdef HAVE_ZLIB # include <zlib.h> # include <tstring.h> # include <tdebug.h> #endif #include "tzlib.h" using namespace TagLib; bool zlib::isAvailable() { #ifdef HAVE_ZLIB return true; #else return false; #endif } ByteVector zlib::decompress(const ByteVector &data) { #ifdef HAVE_ZLIB z_stream stream = {}; if(inflateInit(&stream) != Z_OK) { debug("zlib::decompress() - Failed to initialize zlib."); return ByteVector(); } ByteVector inData = data; stream.avail_in = static_cast<uInt>(inData.size()); stream.next_in = reinterpret_cast<Bytef *>(inData.data()); const unsigned int chunkSize = 1024; ByteVector outData; do { const size_t offset = outData.size(); outData.resize(outData.size() + chunkSize); stream.avail_out = static_cast<uInt>(chunkSize); stream.next_out = reinterpret_cast<Bytef *>(outData.data() + offset); const int result = inflate(&stream, Z_NO_FLUSH); if(result == Z_STREAM_ERROR || result == Z_NEED_DICT || result == Z_DATA_ERROR || result == Z_MEM_ERROR) { if(result != Z_STREAM_ERROR) inflateEnd(&stream); debug("zlib::decompress() - Error reading compressed stream."); return ByteVector(); } outData.resize(outData.size() - stream.avail_out); } while(stream.avail_out == 0); inflateEnd(&stream); return outData; #else return ByteVector(); #endif } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/toolkit/tzlib.h����������������������������������������������������������������0000664�0000000�0000000�00000004306�14447736377�0017314�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2016 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_TZLIB_H #define TAGLIB_TZLIB_H #include <tbytevector.h> // THIS FILE IS NOT A PART OF THE TAGLIB API #ifndef DO_NOT_DOCUMENT // tell Doxygen not to document this header namespace TagLib { namespace zlib { /*! * Returns whether or not zlib is installed and ready to use. */ bool TAGLIB_EXPORT isAvailable(); /*! * Decompress \a data by zlib. */ ByteVector decompress(const ByteVector &data); } // namespace zlib } // namespace TagLib #endif #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/trueaudio/���������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0016330�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/trueaudio/trueaudiofile.cpp����������������������������������������������������0000664�0000000�0000000�00000017662�14447736377�0021711�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tstring.h> #include <tdebug.h> #include <tagunion.h> #include <tstringlist.h> #include <tpropertymap.h> #include <tagutils.h> #include "trueaudiofile.h" #include "id3v1tag.h" #include "id3v2tag.h" #include "id3v2header.h" using namespace TagLib; namespace { enum { TrueAudioID3v2Index = 0, TrueAudioID3v1Index = 1 }; } // namespace class TrueAudio::File::FilePrivate { public: FilePrivate(const ID3v2::FrameFactory *frameFactory = ID3v2::FrameFactory::instance()) : ID3v2FrameFactory(frameFactory), ID3v2Location(-1), ID3v2OriginalSize(0), ID3v1Location(-1), properties(0) {} ~FilePrivate() { delete properties; } const ID3v2::FrameFactory *ID3v2FrameFactory; long ID3v2Location; long ID3v2OriginalSize; long ID3v1Location; TagUnion tag; Properties *properties; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool TrueAudio::File::isSupported(IOStream *stream) { // A TrueAudio file has to start with "TTA". An ID3v2 tag may precede. const ByteVector id = Utils::readHeader(stream, 3, true); return (id == "TTA"); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// TrueAudio::File::File(FileName file, bool readProperties, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } TrueAudio::File::File(FileName file, ID3v2::FrameFactory *frameFactory, bool readProperties, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate(frameFactory)) { if(isOpen()) read(readProperties); } TrueAudio::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : TagLib::File(stream), d(new FilePrivate()) { if(isOpen()) read(readProperties); } TrueAudio::File::File(IOStream *stream, ID3v2::FrameFactory *frameFactory, bool readProperties, Properties::ReadStyle) : TagLib::File(stream), d(new FilePrivate(frameFactory)) { if(isOpen()) read(readProperties); } TrueAudio::File::~File() { delete d; } TagLib::Tag *TrueAudio::File::tag() const { return &d->tag; } PropertyMap TrueAudio::File::properties() const { return d->tag.properties(); } void TrueAudio::File::removeUnsupportedProperties(const StringList &unsupported) { d->tag.removeUnsupportedProperties(unsupported); } PropertyMap TrueAudio::File::setProperties(const PropertyMap &properties) { if(ID3v1Tag()) ID3v1Tag()->setProperties(properties); return ID3v2Tag(true)->setProperties(properties); } TrueAudio::Properties *TrueAudio::File::audioProperties() const { return d->properties; } void TrueAudio::File::setID3v2FrameFactory(const ID3v2::FrameFactory *factory) { d->ID3v2FrameFactory = factory; } bool TrueAudio::File::save() { if(readOnly()) { debug("TrueAudio::File::save() -- File is read only."); return false; } // Update ID3v2 tag if(ID3v2Tag() && !ID3v2Tag()->isEmpty()) { // ID3v2 tag is not empty. Update the old one or create a new one. if(d->ID3v2Location < 0) d->ID3v2Location = 0; const ByteVector data = ID3v2Tag()->render(); insert(data, d->ID3v2Location, d->ID3v2OriginalSize); if(d->ID3v1Location >= 0) d->ID3v1Location += (static_cast<long>(data.size()) - d->ID3v2OriginalSize); d->ID3v2OriginalSize = data.size(); } else { // ID3v2 tag is empty. Remove the old one. if(d->ID3v2Location >= 0) { removeBlock(d->ID3v2Location, d->ID3v2OriginalSize); if(d->ID3v1Location >= 0) d->ID3v1Location -= d->ID3v2OriginalSize; d->ID3v2Location = -1; d->ID3v2OriginalSize = 0; } } // Update ID3v1 tag if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { // ID3v1 tag is not empty. Update the old one or create a new one. if(d->ID3v1Location >= 0) { seek(d->ID3v1Location); } else { seek(0, End); d->ID3v1Location = tell(); } writeBlock(ID3v1Tag()->render()); } else { // ID3v1 tag is empty. Remove the old one. if(d->ID3v1Location >= 0) { truncate(d->ID3v1Location); d->ID3v1Location = -1; } } return true; } ID3v1::Tag *TrueAudio::File::ID3v1Tag(bool create) { return d->tag.access<ID3v1::Tag>(TrueAudioID3v1Index, create); } ID3v2::Tag *TrueAudio::File::ID3v2Tag(bool create) { return d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, create); } void TrueAudio::File::strip(int tags) { if(tags & ID3v1) d->tag.set(TrueAudioID3v1Index, 0); if(tags & ID3v2) d->tag.set(TrueAudioID3v2Index, 0); if(!ID3v1Tag()) ID3v2Tag(true); } bool TrueAudio::File::hasID3v1Tag() const { return (d->ID3v1Location >= 0); } bool TrueAudio::File::hasID3v2Tag() const { return (d->ID3v2Location >= 0); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void TrueAudio::File::read(bool readProperties) { // Look for an ID3v2 tag d->ID3v2Location = Utils::findID3v2(this); if(d->ID3v2Location >= 0) { d->tag.set(TrueAudioID3v2Index, new ID3v2::Tag(this, d->ID3v2Location, d->ID3v2FrameFactory)); d->ID3v2OriginalSize = ID3v2Tag()->header()->completeTagSize(); } // Look for an ID3v1 tag d->ID3v1Location = Utils::findID3v1(this); if(d->ID3v1Location >= 0) d->tag.set(TrueAudioID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); if(d->ID3v1Location < 0) ID3v2Tag(true); // Look for TrueAudio metadata if(readProperties) { long streamLength; if(d->ID3v1Location >= 0) streamLength = d->ID3v1Location; else streamLength = length(); if(d->ID3v2Location >= 0) { seek(d->ID3v2Location + d->ID3v2OriginalSize); streamLength -= (d->ID3v2Location + d->ID3v2OriginalSize); } else { seek(0); } d->properties = new Properties(readBlock(TrueAudio::HeaderSize), streamLength); } } ������������������������������������������������������������������������������taglib-1.13.1/taglib/trueaudio/trueaudiofile.h������������������������������������������������������0000664�0000000�0000000�00000022446�14447736377�0021352�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_TRUEAUDIOFILE_H #define TAGLIB_TRUEAUDIOFILE_H #include "tfile.h" #include "trueaudioproperties.h" namespace TagLib { class Tag; namespace ID3v2 { class Tag; class FrameFactory; } namespace ID3v1 { class Tag; } //! An implementation of TrueAudio metadata /*! * This is implementation of TrueAudio metadata. * * This supports ID3v1 and ID3v2 tags as well as reading stream * properties from the file. */ namespace TrueAudio { //! An implementation of TagLib::File with TrueAudio specific methods /*! * This implements and provides an interface for TrueAudio files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to TrueAudio files. */ class TAGLIB_EXPORT File : public TagLib::File { public: /*! * This set of flags is used for various operations and is suitable for * being OR-ed together. */ enum TagTypes { //! Empty set. Matches no tag types. NoTags = 0x0000, //! Matches ID3v1 tags. ID3v1 = 0x0001, //! Matches ID3v2 tags. ID3v2 = 0x0002, //! Matches all tag types. AllTags = 0xffff }; /*! * Constructs a TrueAudio file from \a file. If \a readProperties is true * the file's audio properties will also be read. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs a TrueAudio file from \a file. If \a readProperties is true * the file's audio properties will also be read. * * If this file contains and ID3v2 tag the frames will be created using * \a frameFactory. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(FileName file, ID3v2::FrameFactory *frameFactory, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs a TrueAudio file from \a stream. If \a readProperties is true * the file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs a TrueAudio file from \a stream. If \a readProperties is true * the file's audio properties will also be read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. * * If this file contains and ID3v2 tag the frames will be created using * \a frameFactory. * * \note In the current implementation, \a propertiesStyle is ignored. */ File(IOStream *stream, ID3v2::FrameFactory *frameFactory, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the Tag for this file. */ virtual TagLib::Tag *tag() const; /*! * Implements the unified property interface -- export function. * If the file contains both ID3v1 and v2 tags, only ID3v2 will be * converted to the PropertyMap. */ PropertyMap properties() const; /*! * Implements the unified property interface -- import function. * Creates in ID3v2 tag if necessary. If an ID3v1 tag exists, it will * be updated as well, within the limitations of ID3v1. */ PropertyMap setProperties(const PropertyMap &); void removeUnsupportedProperties(const StringList &properties); /*! * Returns the TrueAudio::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Set the ID3v2::FrameFactory to something other than the default. * * \see ID3v2FrameFactory * \deprecated This value should be passed in via the constructor. */ TAGLIB_DEPRECATED void setID3v2FrameFactory(const ID3v2::FrameFactory *factory); /*! * Saves the file. */ virtual bool save(); /*! * Returns a pointer to the ID3v1 tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid ID3v1 tag. If \a create is true it will create * an ID3v1 tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file * on disk actually has an ID3v1 tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasID3v1Tag() */ ID3v1::Tag *ID3v1Tag(bool create = false); /*! * Returns a pointer to the ID3v2 tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid ID3v2 tag. If \a create is true it will create * an ID3v2 tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an ID3v2 tag. Use hasID3v2Tag() to check if the file * on disk actually has an ID3v2 tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasID3v2Tag() */ ID3v2::Tag *ID3v2Tag(bool create = false); /*! * This will remove the tags that match the OR-ed together TagTypes from the * file. By default it removes all tags. * * \note This will also invalidate pointers to the tags * as their memory will be freed. * \note In order to make the removal permanent save() still needs to be called */ void strip(int tags = AllTags); /*! * Returns whether or not the file on disk actually has an ID3v1 tag. * * \see ID3v1Tag() */ bool hasID3v1Tag() const; /*! * Returns whether or not the file on disk actually has an ID3v2 tag. * * \see ID3v2Tag() */ bool hasID3v2Tag() const; /*! * Returns whether or not the given \a stream can be opened as a TrueAudio * file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace TrueAudio } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/trueaudio/trueaudioproperties.cpp����������������������������������������������0000664�0000000�0000000�00000011430�14447736377�0023151�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tdebug.h> #include <bitset> #include "trueaudioproperties.h" #include "trueaudiofile.h" using namespace TagLib; class TrueAudio::Properties::PropertiesPrivate { public: PropertiesPrivate() : version(0), length(0), bitrate(0), sampleRate(0), channels(0), bitsPerSample(0), sampleFrames(0) {} int version; int length; int bitrate; int sampleRate; int channels; int bitsPerSample; unsigned int sampleFrames; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// TrueAudio::Properties::Properties(const ByteVector &data, long streamLength, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(data, streamLength); } TrueAudio::Properties::~Properties() { delete d; } int TrueAudio::Properties::length() const { return lengthInSeconds(); } int TrueAudio::Properties::lengthInSeconds() const { return d->length / 1000; } int TrueAudio::Properties::lengthInMilliseconds() const { return d->length; } int TrueAudio::Properties::bitrate() const { return d->bitrate; } int TrueAudio::Properties::sampleRate() const { return d->sampleRate; } int TrueAudio::Properties::bitsPerSample() const { return d->bitsPerSample; } int TrueAudio::Properties::channels() const { return d->channels; } unsigned int TrueAudio::Properties::sampleFrames() const { return d->sampleFrames; } int TrueAudio::Properties::ttaVersion() const { return d->version; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void TrueAudio::Properties::read(const ByteVector &data, long streamLength) { if(data.size() < 4) { debug("TrueAudio::Properties::read() -- data is too short."); return; } if(!data.startsWith("TTA")) { debug("TrueAudio::Properties::read() -- invalid header signature."); return; } unsigned int pos = 3; d->version = data[pos] - '0'; pos += 1; // According to http://en.true-audio.com/TTA_Lossless_Audio_Codec_-_Format_Description // TTA2 headers are in development, and have a different format if(1 == d->version) { if(data.size() < 18) { debug("TrueAudio::Properties::read() -- data is too short."); return; } // Skip the audio format pos += 2; d->channels = data.toShort(pos, false); pos += 2; d->bitsPerSample = data.toShort(pos, false); pos += 2; d->sampleRate = data.toUInt(pos, false); pos += 4; d->sampleFrames = data.toUInt(pos, false); pos += 4; if(d->sampleFrames > 0 && d->sampleRate > 0) { const double length = d->sampleFrames * 1000.0 / d->sampleRate; d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); } } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/trueaudio/trueaudioproperties.h������������������������������������������������0000664�0000000�0000000�00000010360�14447736377�0022617�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_TRUEAUDIOPROPERTIES_H #define TAGLIB_TRUEAUDIOPROPERTIES_H #include "audioproperties.h" namespace TagLib { namespace TrueAudio { static const unsigned int HeaderSize = 18; //! An implementation of audio property reading for TrueAudio /*! * This reads the data from an TrueAudio stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of TrueAudio::Properties with the data read from the * ByteVector \a data. */ Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); /*! * Destroys this TrueAudio::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the number of bits per audio sample. */ int bitsPerSample() const; /*! * Returns the total number of sample frames */ unsigned int sampleFrames() const; /*! * Returns the major version number. */ int ttaVersion() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(const ByteVector &data, long streamLength); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace TrueAudio } // namespace TagLib #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/wavpack/�����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015763�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/wavpack/wavpackfile.cpp��������������������������������������������������������0000664�0000000�0000000�00000015666�14447736377�0021001�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tstring.h> #include <tdebug.h> #include <tagunion.h> #include <tpropertymap.h> #include <tagutils.h> #include "wavpackfile.h" #include "id3v1tag.h" #include "id3v2header.h" #include "apetag.h" #include "apefooter.h" using namespace TagLib; namespace { enum { WavAPEIndex, WavID3v1Index }; } // namespace class WavPack::File::FilePrivate { public: FilePrivate() : APELocation(-1), APESize(0), ID3v1Location(-1), properties(0) {} ~FilePrivate() { delete properties; } long APELocation; long APESize; long ID3v1Location; TagUnion tag; Properties *properties; }; //////////////////////////////////////////////////////////////////////////////// // static members //////////////////////////////////////////////////////////////////////////////// bool WavPack::File::isSupported(IOStream *stream) { // A WavPack file has to start with "wvpk". const ByteVector id = Utils::readHeader(stream, 4, false); return (id == "wvpk"); } //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// WavPack::File::File(FileName file, bool readProperties, Properties::ReadStyle) : TagLib::File(file), d(new FilePrivate()) { if(isOpen()) read(readProperties); } WavPack::File::File(IOStream *stream, bool readProperties, Properties::ReadStyle) : TagLib::File(stream), d(new FilePrivate()) { if(isOpen()) read(readProperties); } WavPack::File::~File() { delete d; } TagLib::Tag *WavPack::File::tag() const { return &d->tag; } PropertyMap WavPack::File::properties() const { return d->tag.properties(); } void WavPack::File::removeUnsupportedProperties(const StringList &unsupported) { d->tag.removeUnsupportedProperties(unsupported); } PropertyMap WavPack::File::setProperties(const PropertyMap &properties) { if(ID3v1Tag()) ID3v1Tag()->setProperties(properties); return APETag(true)->setProperties(properties); } WavPack::Properties *WavPack::File::audioProperties() const { return d->properties; } bool WavPack::File::save() { if(readOnly()) { debug("WavPack::File::save() -- File is read only."); return false; } // Update ID3v1 tag if(ID3v1Tag() && !ID3v1Tag()->isEmpty()) { // ID3v1 tag is not empty. Update the old one or create a new one. if(d->ID3v1Location >= 0) { seek(d->ID3v1Location); } else { seek(0, End); d->ID3v1Location = tell(); } writeBlock(ID3v1Tag()->render()); } else { // ID3v1 tag is empty. Remove the old one. if(d->ID3v1Location >= 0) { truncate(d->ID3v1Location); d->ID3v1Location = -1; } } // Update APE tag if(APETag() && !APETag()->isEmpty()) { // APE tag is not empty. Update the old one or create a new one. if(d->APELocation < 0) { if(d->ID3v1Location >= 0) d->APELocation = d->ID3v1Location; else d->APELocation = length(); } const ByteVector data = APETag()->render(); insert(data, d->APELocation, d->APESize); if(d->ID3v1Location >= 0) d->ID3v1Location += (static_cast<long>(data.size()) - d->APESize); d->APESize = data.size(); } else { // APE tag is empty. Remove the old one. if(d->APELocation >= 0) { removeBlock(d->APELocation, d->APESize); if(d->ID3v1Location >= 0) d->ID3v1Location -= d->APESize; d->APELocation = -1; d->APESize = 0; } } return true; } ID3v1::Tag *WavPack::File::ID3v1Tag(bool create) { return d->tag.access<ID3v1::Tag>(WavID3v1Index, create); } APE::Tag *WavPack::File::APETag(bool create) { return d->tag.access<APE::Tag>(WavAPEIndex, create); } void WavPack::File::strip(int tags) { if(tags & ID3v1) d->tag.set(WavID3v1Index, 0); if(tags & APE) d->tag.set(WavAPEIndex, 0); if(!ID3v1Tag()) APETag(true); } bool WavPack::File::hasID3v1Tag() const { return (d->ID3v1Location >= 0); } bool WavPack::File::hasAPETag() const { return (d->APELocation >= 0); } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// void WavPack::File::read(bool readProperties) { // Look for an ID3v1 tag d->ID3v1Location = Utils::findID3v1(this); if(d->ID3v1Location >= 0) d->tag.set(WavID3v1Index, new ID3v1::Tag(this, d->ID3v1Location)); // Look for an APE tag d->APELocation = Utils::findAPE(this, d->ID3v1Location); if(d->APELocation >= 0) { d->tag.set(WavAPEIndex, new APE::Tag(this, d->APELocation)); d->APESize = APETag()->footer()->completeTagSize(); d->APELocation = d->APELocation + APE::Footer::size() - d->APESize; } if(d->ID3v1Location < 0) APETag(true); // Look for WavPack audio properties if(readProperties) { long streamLength; if(d->APELocation >= 0) streamLength = d->APELocation; else if(d->ID3v1Location >= 0) streamLength = d->ID3v1Location; else streamLength = length(); d->properties = new Properties(this, streamLength); } } ��������������������������������������������������������������������������taglib-1.13.1/taglib/wavpack/wavpackfile.h����������������������������������������������������������0000664�0000000�0000000�00000017577�14447736377�0020451�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_WVFILE_H #define TAGLIB_WVFILE_H #include "tfile.h" #include "taglib_export.h" #include "wavpackproperties.h" namespace TagLib { class Tag; namespace ID3v1 { class Tag; } namespace APE { class Tag; } //! An implementation of WavPack metadata /*! * This is implementation of WavPack metadata. * * This supports ID3v1 and APE (v1 and v2) style comments as well as reading stream * properties from the file. */ namespace WavPack { //! An implementation of TagLib::File with WavPack specific methods /*! * This implements and provides an interface for WavPack files to the * TagLib::Tag and TagLib::AudioProperties interfaces by way of implementing * the abstract TagLib::File API as well as providing some additional * information specific to WavPack files. */ class TAGLIB_EXPORT File : public TagLib::File { public: /*! * This set of flags is used for various operations and is suitable for * being OR-ed together. */ enum TagTypes { //! Empty set. Matches no tag types. NoTags = 0x0000, //! Matches ID3v1 tags. ID3v1 = 0x0001, //! Matches APE tags. APE = 0x0002, //! Matches all tag types. AllTags = 0xffff }; /*! * Constructs a WavPack file from \a file. If \a readProperties is true the * file's audio properties will also be read using \a propertiesStyle. If * false, \a propertiesStyle is ignored */ File(FileName file, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Constructs an WavPack file from \a file. If \a readProperties is true the * file's audio properties will also be read using \a propertiesStyle. If * false, \a propertiesStyle is ignored. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. */ File(IOStream *stream, bool readProperties = true, Properties::ReadStyle propertiesStyle = Properties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); /*! * Returns the Tag for this file. This will be an APE tag, an ID3v1 tag * or a combination of the two. */ virtual TagLib::Tag *tag() const; /*! * Implements the unified property interface -- export function. * If the file contains both an APE and an ID3v1 tag, only APE * will be converted to the PropertyMap. */ PropertyMap properties() const; void removeUnsupportedProperties(const StringList &properties); /*! * Implements the unified property interface -- import function. * Creates an APE tag if it does not exists and calls setProperties() on * that. Any existing ID3v1 tag will be updated as well. */ PropertyMap setProperties(const PropertyMap&); /*! * Returns the MPC::Properties for this file. If no audio properties * were read then this will return a null pointer. */ virtual Properties *audioProperties() const; /*! * Saves the file. * * This returns true if the save was successful. */ virtual bool save(); /*! * Returns a pointer to the ID3v1 tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid ID3v1 tag. If \a create is true it will create * an ID3v1 tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an ID3v1 tag. Use hasID3v1Tag() to check if the file * on disk actually has an ID3v1 tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasID3v1Tag() */ ID3v1::Tag *ID3v1Tag(bool create = false); /*! * Returns a pointer to the APE tag of the file. * * If \a create is false (the default) this may return a null pointer * if there is no valid APE tag. If \a create is true it will create * an APE tag if one does not exist and returns a valid pointer. * * \note This may return a valid pointer regardless of whether or not the * file on disk has an APE tag. Use hasAPETag() to check if the file * on disk actually has an APE tag. * * \note The Tag <b>is still</b> owned by the MPEG::File and should not be * deleted by the user. It will be deleted when the file (object) is * destroyed. * * \see hasAPETag() */ APE::Tag *APETag(bool create = false); /*! * This will remove the tags that match the OR-ed together TagTypes from the * file. By default it removes all tags. * * \note This will also invalidate pointers to the tags * as their memory will be freed. * \note In order to make the removal permanent save() still needs to be called */ void strip(int tags = AllTags); /*! * Returns whether or not the file on disk actually has an ID3v1 tag. * * \see ID3v1Tag() */ bool hasID3v1Tag() const; /*! * Returns whether or not the file on disk actually has an APE tag. * * \see APETag() */ bool hasAPETag() const; /*! * Check if the given \a stream can be opened as a WavPack file. * * \note This method is designed to do a quick check. The result may * not necessarily be correct. */ static bool isSupported(IOStream *stream); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace WavPack } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/wavpack/wavpackproperties.cpp��������������������������������������������������0000664�0000000�0000000�00000026465�14447736377�0022255�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <stdint.h> #include <tstring.h> #include <tdebug.h> #include "wavpackproperties.h" #include "wavpackfile.h" // Implementation of this class is based on the information at: // http://www.wavpack.com/file_format.txt using namespace TagLib; class WavPack::Properties::PropertiesPrivate { public: PropertiesPrivate() : length(0), bitrate(0), sampleRate(0), channels(0), version(0), bitsPerSample(0), lossless(false), sampleFrames(0) {} int length; int bitrate; int sampleRate; int channels; int version; int bitsPerSample; bool lossless; unsigned int sampleFrames; }; //////////////////////////////////////////////////////////////////////////////// // public members //////////////////////////////////////////////////////////////////////////////// WavPack::Properties::Properties(const ByteVector &, long, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { debug("WavPack::Properties::Properties() -- This constructor is no longer used."); } WavPack::Properties::Properties(File *file, long streamLength, ReadStyle style) : AudioProperties(style), d(new PropertiesPrivate()) { read(file, streamLength); } WavPack::Properties::~Properties() { delete d; } int WavPack::Properties::length() const { return lengthInSeconds(); } int WavPack::Properties::lengthInSeconds() const { return d->length / 1000; } int WavPack::Properties::lengthInMilliseconds() const { return d->length; } int WavPack::Properties::bitrate() const { return d->bitrate; } int WavPack::Properties::sampleRate() const { return d->sampleRate; } int WavPack::Properties::channels() const { return d->channels; } int WavPack::Properties::version() const { return d->version; } int WavPack::Properties::bitsPerSample() const { return d->bitsPerSample; } bool WavPack::Properties::isLossless() const { return d->lossless; } unsigned int WavPack::Properties::sampleFrames() const { return d->sampleFrames; } //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// #define BYTES_STORED 3 #define MONO_FLAG 4 #define HYBRID_FLAG 8 #define DSD_FLAG 0x80000000 // block is encoded DSD (1-bit PCM) #define SHIFT_LSB 13 #define SHIFT_MASK (0x1fL << SHIFT_LSB) #define SRATE_LSB 23 #define SRATE_MASK (0xfL << SRATE_LSB) #define MIN_STREAM_VERS 0x402 #define MAX_STREAM_VERS 0x410 #define INITIAL_BLOCK 0x800 #define FINAL_BLOCK 0x1000 #define ID_DSD_BLOCK 0x0e #define ID_OPTIONAL_DATA 0x20 #define ID_UNIQUE 0x3f #define ID_ODD_SIZE 0x40 #define ID_LARGE 0x80 #define ID_SAMPLE_RATE (ID_OPTIONAL_DATA | 0x7) namespace { const unsigned int sampleRates[] = { 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000, 192000, 0 }; /*! * Given a WavPack \a block (complete, but not including the 32-byte header), * parse the metadata blocks until an \a id block is found and return the * contained data, or zero if no such block is found. * Supported values for \a id are ID_SAMPLE_RATE and ID_DSD_BLOCK. */ int getMetaDataChunk(const ByteVector &block, unsigned char id) { if(id != ID_SAMPLE_RATE && id != ID_DSD_BLOCK) return 0; const int blockSize = static_cast<int>(block.size()); int index = 0; while(index + 1 < blockSize) { const unsigned char metaId = static_cast<unsigned char>(block[index]); int metaBc = static_cast<unsigned char>(block[index + 1]) << 1; index += 2; if(metaId & ID_LARGE) { if(index + 2 > blockSize) return 0; metaBc += (static_cast<uint32_t>(static_cast<unsigned char>(block[index])) << 9) + (static_cast<uint32_t>(static_cast<unsigned char>(block[index + 1])) << 17); index += 2; } if(index + metaBc > blockSize) return 0; // if we got a sample rate, return it if(id == ID_SAMPLE_RATE && (metaId & ID_UNIQUE) == ID_SAMPLE_RATE && metaBc == 4) { int sampleRate = static_cast<int32_t>(static_cast<unsigned char>(block[index])); sampleRate |= static_cast<int32_t>(static_cast<unsigned char>(block[index + 1])) << 8; sampleRate |= static_cast<int32_t>(static_cast<unsigned char>(block[index + 2])) << 16; // only use 4th byte if it's really there if(!(metaId & ID_ODD_SIZE)) sampleRate |= static_cast<int32_t>(static_cast<unsigned char>(block[index + 3]) & 0x7f) << 24; return sampleRate; } // if we got DSD block, return the specified rate shift amount if(id == ID_DSD_BLOCK && (metaId & ID_UNIQUE) == ID_DSD_BLOCK && metaBc > 0) { const unsigned char rateShift = static_cast<unsigned char>(block[index]); if(rateShift <= 31) return rateShift; } index += metaBc; } return 0; } /*! * Given a WavPack block (complete, but not including the 32-byte header), * parse the metadata blocks until an ID_SAMPLE_RATE block is found and * return the non-standard sample rate contained there, or zero if no such * block is found. */ int getNonStandardRate(const ByteVector &block) { return getMetaDataChunk(block, ID_SAMPLE_RATE); } /*! * Given a WavPack block (complete, but not including the 32-byte header), * parse the metadata blocks until a DSD audio data block is found and return * the sample-rate shift value contained there, or zero if no such block is * found. The nominal sample rate of DSD audio files (found in the header) * must be left-shifted by this amount to get the actual "byte" sample rate. * Note that 8-bit bytes are the "atoms" of the DSD audio coding (for * decoding, seeking, etc), so the shifted rate must be further multiplied by * 8 to get the actual DSD bit sample rate. */ int getDsdRateShifter(const ByteVector &block) { return getMetaDataChunk(block, ID_DSD_BLOCK); } } // namespace void WavPack::Properties::read(File *file, long streamLength) { long offset = 0; while(true) { file->seek(offset); const ByteVector data = file->readBlock(32); if(data.size() < 32) { debug("WavPack::Properties::read() -- data is too short."); break; } if(!data.startsWith("wvpk")) { debug("WavPack::Properties::read() -- Block header not found."); break; } const unsigned int blockSize = data.toUInt(4, false); const unsigned int sampleFrames = data.toUInt(12, false); const unsigned int blockSamples = data.toUInt(20, false); const unsigned int flags = data.toUInt(24, false); unsigned int sampleRate = sampleRates[(flags & SRATE_MASK) >> SRATE_LSB]; if(!blockSamples) { // ignore blocks with no samples offset += blockSize + 8; continue; } if(blockSize < 24 || blockSize > 1048576) { debug("WavPack::Properties::read() -- Invalid block header found."); break; } // For non-standard sample rates or DSD audio files, we must read and parse the block // to actually determine the sample rate. if(!sampleRate || (flags & DSD_FLAG)) { const unsigned int adjustedBlockSize = blockSize - 24; const ByteVector block = file->readBlock(adjustedBlockSize); if(block.size() < adjustedBlockSize) { debug("WavPack::Properties::read() -- block is too short."); break; } if(!sampleRate) sampleRate = static_cast<unsigned int>(getNonStandardRate(block)); if(sampleRate && (flags & DSD_FLAG)) sampleRate <<= getDsdRateShifter(block); } if(flags & INITIAL_BLOCK) { d->version = data.toShort(8, false); if(d->version < MIN_STREAM_VERS || d->version > MAX_STREAM_VERS) break; d->bitsPerSample = ((flags & BYTES_STORED) + 1) * 8 - ((flags & SHIFT_MASK) >> SHIFT_LSB); d->sampleRate = static_cast<int>(sampleRate); d->lossless = !(flags & HYBRID_FLAG); d->sampleFrames = sampleFrames; } d->channels += (flags & MONO_FLAG) ? 1 : 2; if(flags & FINAL_BLOCK) break; offset += blockSize + 8; } if(d->sampleFrames == ~0u) d->sampleFrames = seekFinalIndex(file, streamLength); if(d->sampleFrames > 0 && d->sampleRate > 0) { const double length = d->sampleFrames * 1000.0 / d->sampleRate; d->length = static_cast<int>(length + 0.5); d->bitrate = static_cast<int>(streamLength * 8.0 / length + 0.5); } } unsigned int WavPack::Properties::seekFinalIndex(File *file, long streamLength) { long offset = streamLength; while (offset >= 32) { offset = file->rfind("wvpk", offset - 4); if(offset == -1) return 0; file->seek(offset); const ByteVector data = file->readBlock(32); if(data.size() < 32) return 0; const unsigned int blockSize = data.toUInt(4, false); const unsigned int blockIndex = data.toUInt(16, false); const unsigned int blockSamples = data.toUInt(20, false); const unsigned int flags = data.toUInt(24, false); const int version = data.toShort(8, false); // try not to trigger on a spurious "wvpk" in WavPack binary block data if(version < MIN_STREAM_VERS || version > MAX_STREAM_VERS || (blockSize & 1) || blockSize < 24 || blockSize >= 1048576 || blockSamples > 131072) continue; if (blockSamples && (flags & FINAL_BLOCK)) return blockIndex + blockSamples; } return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/wavpack/wavpackproperties.h����������������������������������������������������0000664�0000000�0000000�00000011403�14447736377�0021704�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2006 by Lukáš LalinskĂ˝ email : lalinsky@gmail.com copyright : (C) 2004 by Allan Sandfeld Jensen email : kde@carewolf.org (original MPC implementation) ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_WVPROPERTIES_H #define TAGLIB_WVPROPERTIES_H #include "taglib_export.h" #include "audioproperties.h" namespace TagLib { namespace WavPack { class File; static const unsigned int HeaderSize = 32; //! An implementation of audio property reading for WavPack /*! * This reads the data from an WavPack stream found in the AudioProperties * API. */ class TAGLIB_EXPORT Properties : public AudioProperties { public: /*! * Create an instance of WavPack::Properties with the data read from the * ByteVector \a data. * * \deprecated This constructor will be dropped in favor of the one below * in a future version. */ TAGLIB_DEPRECATED Properties(const ByteVector &data, long streamLength, ReadStyle style = Average); /*! * Create an instance of WavPack::Properties. */ Properties(File *file, long streamLength, ReadStyle style = Average); /*! * Destroys this WavPack::Properties instance. */ virtual ~Properties(); /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \note This method is just an alias of lengthInSeconds(). * * \deprecated Use lengthInSeconds(). */ TAGLIB_DEPRECATED virtual int length() const; /*! * Returns the length of the file in seconds. The length is rounded down to * the nearest whole second. * * \see lengthInMilliseconds() */ // BIC: make virtual int lengthInSeconds() const; /*! * Returns the length of the file in milliseconds. * * \see lengthInSeconds() */ // BIC: make virtual int lengthInMilliseconds() const; /*! * Returns the average bit rate of the file in kb/s. */ virtual int bitrate() const; /*! * Returns the sample rate in Hz. 0 means unknown or custom. */ virtual int sampleRate() const; /*! * Returns the number of audio channels. */ virtual int channels() const; /*! * Returns the number of bits per audio sample. */ int bitsPerSample() const; /*! * Returns whether or not the file is lossless encoded. */ bool isLossless() const; /*! * Returns the total number of audio samples in file. */ unsigned int sampleFrames() const; /*! * Returns WavPack version. */ int version() const; private: Properties(const Properties &); Properties &operator=(const Properties &); void read(File *file, long streamLength); unsigned int seekFinalIndex(File *file, long streamLength); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace WavPack } // namespace TagLib #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/xm/����������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0014753�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/xm/xmfile.cpp������������������������������������������������������������������0000664�0000000�0000000�00000040111�14447736377�0016740�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "tstringlist.h" #include "tdebug.h" #include "xmfile.h" #include "modfileprivate.h" #include "tpropertymap.h" #include <string.h> #include <algorithm> using namespace TagLib; using namespace XM; namespace { /*! * The Reader classes are helpers to make handling of the stripped XM * format more easy. In the stripped XM format certain header sizes might * be smaller than one would expect. The fields that are not included * are then just some predefined valued (e.g. 0). * * Using these classes this code: * * if(headerSize >= 4) { * if(!readU16L(value1)) ERROR(); * if(headerSize >= 8) { * if(!readU16L(value2)) ERROR(); * if(headerSize >= 12) { * if(!readString(value3, 22)) ERROR(); * ... * } * } * } * * Becomes: * * StructReader header; * header.u16L(value1).u16L(value2).string(value3, 22). ...; * if(header.read(*this, headerSize) < std::min(header.size(), headerSize)) * ERROR(); * * Maybe if this is useful to other formats these classes can be moved to * their own public files. */ class Reader { public: virtual ~Reader() { } /*! * Reads associated values from \a file, but never reads more * then \a limit bytes. */ virtual unsigned int read(TagLib::File &file, unsigned int limit) = 0; /*! * Returns the number of bytes this reader would like to read. */ virtual unsigned int size() const = 0; }; class SkipReader : public Reader { public: SkipReader(unsigned int size) : m_size(size) { } unsigned int read(TagLib::File &file, unsigned int limit) { unsigned int count = std::min(m_size, limit); file.seek(count, TagLib::File::Current); return count; } unsigned int size() const { return m_size; } private: unsigned int m_size; }; template<typename T> class ValueReader : public Reader { public: ValueReader(T &value) : value(value) { } protected: T &value; }; class StringReader : public ValueReader<String> { public: StringReader(String &string, unsigned int size) : ValueReader<String>(string), m_size(size) { } unsigned int read(TagLib::File &file, unsigned int limit) { ByteVector data = file.readBlock(std::min(m_size, limit)); unsigned int count = data.size(); int index = data.find(static_cast<char>(0)); if(index > -1) { data.resize(index); } data.replace('\xff', ' '); value = data; return count; } unsigned int size() const { return m_size; } private: unsigned int m_size; }; class ByteReader : public ValueReader<unsigned char> { public: ByteReader(unsigned char &byte) : ValueReader<unsigned char>(byte) {} unsigned int read(TagLib::File &file, unsigned int limit) { ByteVector data = file.readBlock(std::min(1U,limit)); if(data.size() > 0) { value = data[0]; } return data.size(); } unsigned int size() const { return 1; } }; template<typename T> class NumberReader : public ValueReader<T> { public: NumberReader(T &value, bool bigEndian) : ValueReader<T>(value), bigEndian(bigEndian) { } protected: bool bigEndian; }; class U16Reader : public NumberReader<unsigned short> { public: U16Reader(unsigned short &value, bool bigEndian) : NumberReader<unsigned short>(value, bigEndian) {} unsigned int read(TagLib::File &file, unsigned int limit) { ByteVector data = file.readBlock(std::min(2U,limit)); value = data.toUShort(bigEndian); return data.size(); } unsigned int size() const { return 2; } }; class U32Reader : public NumberReader<unsigned long> { public: U32Reader(unsigned long &value, bool bigEndian = true) : NumberReader<unsigned long>(value, bigEndian) { } unsigned int read(TagLib::File &file, unsigned int limit) { ByteVector data = file.readBlock(std::min(4U,limit)); value = data.toUInt(bigEndian); return data.size(); } unsigned int size() const { return 4; } }; class StructReader : public Reader { public: StructReader() { m_readers.setAutoDelete(true); } /*! * Add a nested reader. This reader takes ownership. */ StructReader &reader(Reader *reader) { m_readers.append(reader); return *this; } /*! * Don't read anything but skip \a size bytes. */ StructReader &skip(unsigned int size) { m_readers.append(new SkipReader(size)); return *this; } /*! * Read a string of \a size characters (bytes) into \a string. */ StructReader &string(String &string, unsigned int size) { m_readers.append(new StringReader(string, size)); return *this; } /*! * Read a byte into \a byte. */ StructReader &byte(unsigned char &byte) { m_readers.append(new ByteReader(byte)); return *this; } /*! * Read a unsigned 16 Bit integer into \a number. The byte order * is controlled by \a bigEndian. */ StructReader &u16(unsigned short &number, bool bigEndian) { m_readers.append(new U16Reader(number, bigEndian)); return *this; } /*! * Read a unsigned 16 Bit little endian integer into \a number. */ StructReader &u16L(unsigned short &number) { return u16(number, false); } /*! * Read a unsigned 16 Bit big endian integer into \a number. */ StructReader &u16B(unsigned short &number) { return u16(number, true); } /*! * Read a unsigned 32 Bit integer into \a number. The byte order * is controlled by \a bigEndian. */ StructReader &u32(unsigned long &number, bool bigEndian) { m_readers.append(new U32Reader(number, bigEndian)); return *this; } /*! * Read a unsigned 32 Bit little endian integer into \a number. */ StructReader &u32L(unsigned long &number) { return u32(number, false); } /*! * Read a unsigned 32 Bit big endian integer into \a number. */ StructReader &u32B(unsigned long &number) { return u32(number, true); } unsigned int size() const { unsigned int size = 0; for(List<Reader*>::ConstIterator i = m_readers.begin(); i != m_readers.end(); ++ i) { size += (*i)->size(); } return size; } unsigned int read(TagLib::File &file, unsigned int limit) { unsigned int sumcount = 0; for(List<Reader*>::ConstIterator i = m_readers.begin(); limit > 0 && i != m_readers.end(); ++ i) { unsigned int count = (*i)->read(file, limit); limit -= count; sumcount += count; } return sumcount; } private: List<Reader*> m_readers; }; } // namespace class XM::File::FilePrivate { public: FilePrivate(AudioProperties::ReadStyle propertiesStyle) : properties(propertiesStyle) { } Mod::Tag tag; XM::Properties properties; }; XM::File::File(FileName file, bool readProperties, AudioProperties::ReadStyle propertiesStyle) : Mod::FileBase(file), d(new FilePrivate(propertiesStyle)) { if(isOpen()) read(readProperties); } XM::File::File(IOStream *stream, bool readProperties, AudioProperties::ReadStyle propertiesStyle) : Mod::FileBase(stream), d(new FilePrivate(propertiesStyle)) { if(isOpen()) read(readProperties); } XM::File::~File() { delete d; } Mod::Tag *XM::File::tag() const { return &d->tag; } PropertyMap XM::File::properties() const { return d->tag.properties(); } PropertyMap XM::File::setProperties(const PropertyMap &properties) { return d->tag.setProperties(properties); } XM::Properties *XM::File::audioProperties() const { return &d->properties; } bool XM::File::save() { if(readOnly()) { debug("XM::File::save() - Cannot save to a read only file."); return false; } seek(17); writeString(d->tag.title(), 20); seek(38); writeString(d->tag.trackerName(), 20); seek(60); unsigned long headerSize = 0; if(!readU32L(headerSize)) return false; seek(70); unsigned short patternCount = 0; unsigned short instrumentCount = 0; if(!readU16L(patternCount) || !readU16L(instrumentCount)) return false; long pos = 60 + headerSize; // should be long long in taglib2. // need to read patterns again in order to seek to the instruments: for(unsigned short i = 0; i < patternCount; ++ i) { seek(pos); unsigned long patternHeaderLength = 0; if(!readU32L(patternHeaderLength) || patternHeaderLength < 4) return false; seek(pos + 7); unsigned short dataSize = 0; if (!readU16L(dataSize)) return false; pos += patternHeaderLength + dataSize; } const StringList lines = d->tag.comment().split("\n"); unsigned int sampleNameIndex = instrumentCount; for(unsigned short i = 0; i < instrumentCount; ++ i) { seek(pos); unsigned long instrumentHeaderSize = 0; if(!readU32L(instrumentHeaderSize) || instrumentHeaderSize < 4) return false; seek(pos + 4); const unsigned int len = std::min(22UL, instrumentHeaderSize - 4U); if(i >= lines.size()) writeString(String(), len); else writeString(lines[i], len); unsigned short sampleCount = 0; if(instrumentHeaderSize >= 29U) { seek(pos + 27); if(!readU16L(sampleCount)) return false; } unsigned long sampleHeaderSize = 0; if(sampleCount > 0) { seek(pos + 29); if(instrumentHeaderSize < 33U || !readU32L(sampleHeaderSize)) return false; } pos += instrumentHeaderSize; for(unsigned short j = 0; j < sampleCount; ++ j) { if(sampleHeaderSize > 4U) { seek(pos); unsigned long sampleLength = 0; if(!readU32L(sampleLength)) return false; if(sampleHeaderSize > 18U) { seek(pos + 18); const unsigned int len = std::min(sampleHeaderSize - 18U, 22UL); if(sampleNameIndex >= lines.size()) writeString(String(), len); else writeString(lines[sampleNameIndex ++], len); } } pos += sampleHeaderSize; } } return true; } void XM::File::read(bool) { if(!isOpen()) return; seek(0); ByteVector magic = readBlock(17); // it's all 0x00 for stripped XM files: READ_ASSERT(magic == "Extended Module: " || magic == ByteVector(17, 0)); READ_STRING(d->tag.setTitle, 20); READ_BYTE_AS(escape); // in stripped XM files this is 0x00: READ_ASSERT(escape == 0x1A || escape == 0x00); READ_STRING(d->tag.setTrackerName, 20); READ_U16L(d->properties.setVersion); READ_U32L_AS(headerSize); READ_ASSERT(headerSize >= 4); unsigned short length = 0; unsigned short restartPosition = 0; unsigned short channels = 0; unsigned short patternCount = 0; unsigned short instrumentCount = 0; unsigned short flags = 0; unsigned short tempo = 0; unsigned short bpmSpeed = 0; StructReader header; header.u16L(length) .u16L(restartPosition) .u16L(channels) .u16L(patternCount) .u16L(instrumentCount) .u16L(flags) .u16L(tempo) .u16L(bpmSpeed); unsigned int count = header.read(*this, headerSize - 4U); unsigned int size = std::min(headerSize - 4U, static_cast<unsigned long>(header.size())); READ_ASSERT(count == size); d->properties.setLengthInPatterns(length); d->properties.setRestartPosition(restartPosition); d->properties.setChannels(channels); d->properties.setPatternCount(patternCount); d->properties.setInstrumentCount(instrumentCount); d->properties.setFlags(flags); d->properties.setTempo(tempo); d->properties.setBpmSpeed(bpmSpeed); seek(60 + headerSize); // read patterns: for(unsigned short i = 0; i < patternCount; ++ i) { READ_U32L_AS(patternHeaderLength); READ_ASSERT(patternHeaderLength >= 4); unsigned char packingType = 0; unsigned short rowCount = 0; unsigned short dataSize = 0; StructReader pattern; pattern.byte(packingType).u16L(rowCount).u16L(dataSize); unsigned int count = pattern.read(*this, patternHeaderLength - 4U); READ_ASSERT(count == std::min(patternHeaderLength - 4U, (unsigned long)pattern.size())); seek(patternHeaderLength - (4 + count) + dataSize, Current); } StringList instrumentNames; StringList sampleNames; unsigned int sumSampleCount = 0; // read instruments: for(unsigned short i = 0; i < instrumentCount; ++ i) { READ_U32L_AS(instrumentHeaderSize); READ_ASSERT(instrumentHeaderSize >= 4); String instrumentName; unsigned char instrumentType = 0; unsigned short sampleCount = 0; StructReader instrument; instrument.string(instrumentName, 22).byte(instrumentType).u16L(sampleCount); // 4 for instrumentHeaderSize unsigned int count = 4 + instrument.read(*this, instrumentHeaderSize - 4U); READ_ASSERT(count == std::min(instrumentHeaderSize, (unsigned long)instrument.size() + 4)); long offset = 0; if(sampleCount > 0) { unsigned long sampleHeaderSize = 0; sumSampleCount += sampleCount; // wouldn't know which header size to assume otherwise: READ_ASSERT(instrumentHeaderSize >= count + 4 && readU32L(sampleHeaderSize)); // skip unhandled header proportion: seek(instrumentHeaderSize - count - 4, Current); for(unsigned short j = 0; j < sampleCount; ++ j) { unsigned long sampleLength = 0; unsigned long loopStart = 0; unsigned long loopLength = 0; unsigned char volume = 0; unsigned char finetune = 0; unsigned char sampleType = 0; unsigned char panning = 0; unsigned char noteNumber = 0; unsigned char compression = 0; String sampleName; StructReader sample; sample.u32L(sampleLength) .u32L(loopStart) .u32L(loopLength) .byte(volume) .byte(finetune) .byte(sampleType) .byte(panning) .byte(noteNumber) .byte(compression) .string(sampleName, 22); unsigned int count = sample.read(*this, sampleHeaderSize); READ_ASSERT(count == std::min(sampleHeaderSize, (unsigned long)sample.size())); // skip unhandled header proportion: seek(sampleHeaderSize - count, Current); offset += sampleLength; sampleNames.append(sampleName); } } else { offset = instrumentHeaderSize - count; } instrumentNames.append(instrumentName); seek(offset, Current); } d->properties.setSampleCount(sumSampleCount); String comment(instrumentNames.toString("\n")); if(!sampleNames.isEmpty()) { comment += "\n"; comment += sampleNames.toString("\n"); } d->tag.setComment(comment); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/xm/xmfile.h��������������������������������������������������������������������0000664�0000000�0000000�00000010137�14447736377�0016412�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_XMFILE_H #define TAGLIB_XMFILE_H #include "tfile.h" #include "audioproperties.h" #include "taglib_export.h" #include "modfilebase.h" #include "modtag.h" #include "xmproperties.h" namespace TagLib { namespace XM { class TAGLIB_EXPORT File : public Mod::FileBase { public: /*! * Constructs an Extended Module file from \a file. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. */ File(FileName file, bool readProperties = true, AudioProperties::ReadStyle propertiesStyle = AudioProperties::Average); /*! * Constructs an Extended Module file from \a stream. * * \note In the current implementation, both \a readProperties and * \a propertiesStyle are ignored. The audio properties are always * read. * * \note TagLib will *not* take ownership of the stream, the caller is * responsible for deleting it after the File object. */ File(IOStream *stream, bool readProperties = true, AudioProperties::ReadStyle propertiesStyle = AudioProperties::Average); /*! * Destroys this instance of the File. */ virtual ~File(); Mod::Tag *tag() const; /*! * Implements the unified property interface -- export function. * Forwards to Mod::Tag::properties(). */ PropertyMap properties() const; /*! * Implements the unified property interface -- import function. * Forwards to Mod::Tag::setProperties(). */ PropertyMap setProperties(const PropertyMap &); /*! * Returns the XM::Properties for this file. If no audio properties * were read then this will return a null pointer. */ XM::Properties *audioProperties() const; /*! * Save the file. * This is the same as calling save(AllTags); * * \note Saving Extended Module tags is not supported. */ bool save(); private: File(const File &); File &operator=(const File &); void read(bool readProperties); class FilePrivate; FilePrivate *d; }; } // namespace XM } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/taglib/xm/xmproperties.cpp������������������������������������������������������������0000664�0000000�0000000�00000010771�14447736377�0020226�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include "xmproperties.h" using namespace TagLib; using namespace XM; class XM::Properties::PropertiesPrivate { public: PropertiesPrivate() : lengthInPatterns(0), channels(0), version(0), restartPosition(0), patternCount(0), instrumentCount(0), sampleCount(0), flags(0), tempo(0), bpmSpeed(0) { } unsigned short lengthInPatterns; int channels; unsigned short version; unsigned short restartPosition; unsigned short patternCount; unsigned short instrumentCount; unsigned int sampleCount; unsigned short flags; unsigned short tempo; unsigned short bpmSpeed; }; XM::Properties::Properties(AudioProperties::ReadStyle propertiesStyle) : AudioProperties(propertiesStyle), d(new PropertiesPrivate()) { } XM::Properties::~Properties() { delete d; } int XM::Properties::length() const { return 0; } int XM::Properties::lengthInSeconds() const { return 0; } int XM::Properties::lengthInMilliseconds() const { return 0; } int XM::Properties::bitrate() const { return 0; } int XM::Properties::sampleRate() const { return 0; } int XM::Properties::channels() const { return d->channels; } unsigned short XM::Properties::lengthInPatterns() const { return d->lengthInPatterns; } unsigned short XM::Properties::version() const { return d->version; } unsigned short XM::Properties::restartPosition() const { return d->restartPosition; } unsigned short XM::Properties::patternCount() const { return d->patternCount; } unsigned short XM::Properties::instrumentCount() const { return d->instrumentCount; } unsigned int XM::Properties::sampleCount() const { return d->sampleCount; } unsigned short XM::Properties::flags() const { return d->flags; } unsigned short XM::Properties::tempo() const { return d->tempo; } unsigned short XM::Properties::bpmSpeed() const { return d->bpmSpeed; } void XM::Properties::setLengthInPatterns(unsigned short lengthInPatterns) { d->lengthInPatterns = lengthInPatterns; } void XM::Properties::setChannels(int channels) { d->channels = channels; } void XM::Properties::setVersion(unsigned short version) { d->version = version; } void XM::Properties::setRestartPosition(unsigned short restartPosition) { d->restartPosition = restartPosition; } void XM::Properties::setPatternCount(unsigned short patternCount) { d->patternCount = patternCount; } void XM::Properties::setInstrumentCount(unsigned short instrumentCount) { d->instrumentCount = instrumentCount; } void XM::Properties::setSampleCount(unsigned int sampleCount) { d->sampleCount = sampleCount; } void XM::Properties::setFlags(unsigned short flags) { d->flags = flags; } void XM::Properties::setTempo(unsigned short tempo) { d->tempo = tempo; } void XM::Properties::setBpmSpeed(unsigned short bpmSpeed) { d->bpmSpeed = bpmSpeed; } �������taglib-1.13.1/taglib/xm/xmproperties.h��������������������������������������������������������������0000664�0000000�0000000�00000007035�14447736377�0017672�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_XMPROPERTIES_H #define TAGLIB_XMPROPERTIES_H #include "taglib.h" #include "tstring.h" #include "audioproperties.h" namespace TagLib { namespace XM { class TAGLIB_EXPORT Properties : public AudioProperties { friend class File; public: /*! Flag bits. */ enum { LinearFreqTable = 1 // otherwise its the amiga freq. table }; Properties(AudioProperties::ReadStyle propertiesStyle); virtual ~Properties(); int length() const; int lengthInSeconds() const; int lengthInMilliseconds() const; int bitrate() const; int sampleRate() const; int channels() const; unsigned short lengthInPatterns() const; unsigned short version() const; unsigned short restartPosition() const; unsigned short patternCount() const; unsigned short instrumentCount() const; unsigned int sampleCount() const; unsigned short flags() const; unsigned short tempo() const; unsigned short bpmSpeed() const; void setChannels(int channels); void setLengthInPatterns(unsigned short lengthInPatterns); void setVersion(unsigned short version); void setRestartPosition(unsigned short restartPosition); void setPatternCount(unsigned short patternCount); void setInstrumentCount(unsigned short instrumentCount); void setSampleCount(unsigned int sampleCount); void setFlags(unsigned short flags); void setTempo(unsigned short tempo); void setBpmSpeed(unsigned short bpmSpeed); private: Properties(const Properties&); Properties &operator=(const Properties&); class PropertiesPrivate; PropertiesPrivate *d; }; } // namespace XM } // namespace TagLib #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/��������������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0014227�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/CMakeLists.txt������������������������������������������������������������������0000664�0000000�0000000�00000004305�14447736377�0016771�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������set(CMAKE_CXX_STANDARD 11) INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR}/../taglib ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/toolkit ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ape ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/asf ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v1 ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2 ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg/id3v2/frames ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpeg ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mpc ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mp4 ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/riff ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/riff/aiff ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/riff/wav ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/trueaudio ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/vorbis ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/flac ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/speex ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/ogg/opus ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/flac ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/wavpack ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/mod ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/s3m ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/it ${CMAKE_CURRENT_SOURCE_DIR}/../taglib/xm ) SET(test_runner_SRCS main.cpp test_list.cpp test_map.cpp test_mpeg.cpp test_synchdata.cpp test_trueaudio.cpp test_bytevector.cpp test_bytevectorlist.cpp test_bytevectorstream.cpp test_string.cpp test_propertymap.cpp test_file.cpp test_fileref.cpp test_id3v1.cpp test_id3v2.cpp test_xiphcomment.cpp test_aiff.cpp test_riff.cpp test_ogg.cpp test_oggflac.cpp test_flac.cpp test_flacpicture.cpp test_flacunknownmetadatablock.cpp test_ape.cpp test_apetag.cpp test_wav.cpp test_info.cpp test_wavpack.cpp test_mp4.cpp test_mp4item.cpp test_mp4coverart.cpp test_asf.cpp test_mod.cpp test_s3m.cpp test_it.cpp test_xm.cpp test_mpc.cpp test_opus.cpp test_speex.cpp ) INCLUDE_DIRECTORIES(${CPPUNIT_INCLUDE_DIR}) ADD_EXECUTABLE(test_runner ${test_runner_SRCS}) TARGET_LINK_LIBRARIES(test_runner tag ${CPPUNIT_LIBRARIES}) ADD_TEST(test_runner test_runner) ADD_CUSTOM_TARGET(check COMMAND ${CMAKE_CTEST_COMMAND} -V DEPENDS test_runner) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/���������������������������������������������������������������������������0000775�0000000�0000000�00000000000�14447736377�0015140�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/005411.id3�����������������������������������������������������������������0000664�0000000�0000000�00000113002�14447736377�0016270�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3���+xWCOM���q��http://www.amazon.com/exec/obidos/ASIN/B0000024VP/softpointer-20?dev-t=D17H5OIRRQ5XUC%26camp=2025%26link_code=xm2COMM������eng�APIC��Śę���image/jpg��˙Ř˙ŕ�JFIF������˙Ű�C�  !"$"$˙Ű�C˙Ŕ�,,"�˙Ä����������� ˙Ä�µ���}�!1AQa"q2‘ˇ#B±ÁRŃđ$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚáâăäĺćçčéęńňóôőö÷řůú˙Ä�������� ˙Ä�µ��w�!1AQaq"2B‘ˇ±Á #3RđbrŃ $4á%ń&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚„…†‡‰Š’“”•–—™š˘Ł¤Ą¦§¨©Ş˛ł´µ¶·¸ąşÂĂÄĹĆÇČÉĘŇÓÔŐÖ×ŘŮÚâăäĺćçčéęňóôőö÷řůú˙Ú� ��?�ú9a“ÜQßó¨â(úTŁ…|Ëg¨'ZN §ă= 9ďő¤Ř•ĎQHF1RíďůR=i\d{}‡ăFßaźĄIŽ3ŚR(q‘ěG4®E1Ć?1Fß^j—ĎZP§˝;ŃÉăóĄ 20 HË“Hö íç óH@#×ҤǦ(+Ŕçń¤AqÔR„ŕf¤Ú:)vŚg¤A=F(ŮۦŰőŁo<ă?ZC!+ÓđĄ(O^ ›o·4ĄGÓÖ€! :㿡�ăŐ ^3ÁőĄĆÎhŢzfŤ¸ţů{T¸äűRírOJ.!3Úť´rzzb¤ dRsśôJ�‹`ÉÇŻJ@;g"¦Ú|šP9îAĹ0!ŮĆIÍF>ďéScňő¤Ú¸Ć;RÁ’qALňŻĺSm'#Š0G=)Řö„Ę—Ë\˙�őŞP €F)Ç�đĄ`!1ŹîŠhŹ=Ş| \‚GOĄútëLBqĐPPŔ_ʦĆryÇÖ›śuĆ}é ?w·JťŰ•Faě ¬­f˙�ű/@ľÔ¶ M­»Č¨z;ň©úśƲĂ2„—WűFĄ¨ýüÓĎ(Vnŕ"°U\ç�Ăż5݇Â:é»ŮJj;ťw“/ÉÁM/“'üňÁMxźŚ5-7Dń ú]Ż…´wŽÍ(˛«ç�€1»Ü˙�*É˙�„˘Ř6G„4nxâisŽ{çÜţb»VM7Ş—á˙�\çĐf)7sś˛iŤźĹŹ_”ׯ‹-Ń~O iC8éu6FyőĎaHľ2rľ´ŤşŹ/Rą^Ääa‡­/ěZźÍý}ĺsžô±…éÓĐÓ€'ś}kÂ?á9nŮW8ëâáÇ\}úQă]Ů#KĽÎqÇď€=MüRţĆ«Ü9ĎuÁĎCK°ň@?€Ż>3ąŇoĎý —ŢżďR˙�Âi rú%ÓÓ>"˝?N­íüé˙�cTďý}áĚ{ĆÖĆv¶SŠ6›NzôŻ5µ-–Ń.łÔâĎŻ÷˝˙�QGü&vX*|=;/;×®Žx÷?çóŁű§ëďcŢ<¦˙�žLŕ4yRůdç>€×…Â]Ą1%Ľ*Ĺą9mnŕžŮëMhç+˙�‚OÍ»T•łĎRqš?±Şwţľńs3ÝĽ™ 8ŤÇÔRůRuXßţů5ŕăĹş!űŢ ±Ýµ=O_—Ö•<[ˇäđUŻ88ű{źîűQý‹?ćü?ŕŹ™ö=ÜC7hß?îĐ"“8ňźňŻoř}€xĆ@p×[‡ęźZOřK<< çŔziă©g˙�EŃý‰?ćü?ŕ‹ťö=ëÉ—´oőĹ)GX~+ÁŹ‹ü;Ďü[ý‡űČö—§4‡Ĺž*ü8Đł’:GÇ8˙�ž?Z?±gü߇üć—cŢ„mÎTŢ‚ŕŚW‚'‹|6N?á]čy,}?ďϵ4řÇĂaŔ4,‚:ż?ő>ćźö$˙�›đ˙�‚>gŘ÷łĆsŚľÔnTಯ±5ŕĂĆ>?đ®tMľ"çżüńü*Eń¦Šđ®ôL’1§ýqŁűÍřÁ›ířžčŇGŚ™�9Ë)­=şś5Ä@žąqţ?_ĘĽ;ţŤFĂýŚ˙�Ď1é˙�L˝Ą9|w¤+�Ňüłçżî˝¨ţÄ—ó~đEĎ.߉í­wjć»¶Q×™T_ĆŁmGN ójV űÜ ďŹZń…řĄ�â„ÓqĆyŹĎýrúÔ‹ńKcÁV Ć0˛ ˙�Ú])¬–_ÍřÁ4»~'°¶­¤¨,Ú¶ś `|×iŽ™Ç_JŠOx~6 'tdn¸7đŹćŐć:'Źěݵ˝?O_ Z—WŔdYŠ Ť€HĎ=? Ň>ŇUĺÚİŁ2$Ş"Q& �śí$wÇ8¨žWZÎVţ˝I•V·Źă˙��îÄŢŚ ţ$ŃŰűBńęańw„°ü$Ú/^ר{ă±®#ţ!Śí‹ĂÓl˙�—¤L €)¨ĺř¦ŃÉĺ>ŚčÁ707ý=xŹăůJ… öťČúĹö_‰ÝÂaá&8˙�„źGĎý}Ż®=}hořWň0éÍČnÇSČC\4˙�u8<?‡n-áK@×W2B&r…˘˝xěsL¸řĄl©öŤ&÷ś :„„“×ĺgĄŔĐoIŰëkŘń…Š˙�ČzĐŚu]Ţ™ôŁţ˙� ä®Ydť¸ËgÓ¦3\݇üaâŤ~ÎćďKđő¤¶–ř<š±HË>EfA–çžĂ8'<S.ĽYăh!–âO¶Ś’ó[ę«:ăą0Ěp98­G°Á)¸:ŞëĄŐţ⽤­{sřłĂ!w ^ţěr7ňZŃÓďlµ+aw§]ÁwnÄ$o\‚2;űWťč˙�ĺąľ·ŹP±K{[‡X’ęŢę̌ě@]ŕŞáI nĆ}ó\ÇĆMżŠá–ÖęîÁî­k…¶‘ŁI˝×{�F[j¨ÉçĺşË!5îKőŻŻ˝·‘éţ99đ6¬=m±Á˙�ikĹô˝'WşÓ˘´ąľ»†fŚíeHĂç•ÉËř šßńŢáŐ†3›m¤cŐ”ZńżK,>>ń°\\Dćňq›yY•Š’ąŹŻó­r¸óQ•·żů ˘NZ•î“]×µ‹«ďě­Jîćy7Č °••O@Ł Đ�'<fˇżŇ5ť:s©hşĄĄ°Ć馴uEç©l|ŁëŠéĺđkčµ?ŤY[ű˘XěĂňćšwHN\…ă -× ä4yäŃő%Ô4v[+´l¬‘Żg•qühzzŚ÷®ÚšµÔĄJÍ/'©:˘5`ČĄJC+dµă?ýjôOř{K×|$<wá{5±)›QÓăC·>nĐ>ěrr8eç"ą č—^$×í4‹)„M>Yĺ>\@|Î;Ş âe÷­hăéΔŞ=9w]‹)i–Wš•Ů´Óěno'UËGoŻ[ŹÇ.ݤk8Şé…ŚD…ó.!*™Č�n^ľţźZꏮô+‰ôż XivşE¬Ď&X^i.öť¦Yz’X‚F9Ć+ĽđwŹt Ńu+T´ż¸RŤk7ď ąäFÄ|Ü í`vĎZá­ŹĹŇJ«§î~!Ëćx`ÜF�ääúóšbH™Äl‡ŚđŮ­˙�hŤá\é ’Ń6]YůČdV…ź!ó*Čry�g­z–»«ßǧiÚ>=Ô  ‡B¶ü[%pŞ;±ŕgÔ×{Ĺ·MU‚\­^íŘ“{66ŤÜpAö˙�?çĐěgŹ~úWŃpx+ĂfÖá]KůĚšzgŔ WĺÎ3ś‘^5ń OŇě>"^é–‚ÎĎu˘ˇ;TyŠ›ĘăîđÝşc\xlâäăɲoî)¦–§8®NďČäű d¬ÜeŽ�'’r:ü˙�:ô‰v¶ŇřĆxgEÓ­ńDé ¤Ać–PHĘ’Ş©É óÎT¶ńl^Y´ďŘZHń3Gs¬Ţ!yo$S‚cUa˛<Ź”#�w:C0©V+ŮÓ»zÚý;±ŁgE™"vÚää#‚¤Śú^IŚcëĎů˙�&˝GIř•i«gKńŢ•a5ś§oÚ–&hăí—Ť‰*?ÚSÇ íĚřűÂIáĎYéńÜôťDksqşAÎ\ŽX) ÜI๪yŚŁ?g‡+߽űɅă‚ŔÇŽ w |+áĎĹ©{¨Ąü<‹xF˘&‚Xç‚8�ń‚ÍŹ‰^Ń<'áKX"Ž[íVúčD׳<°Ş]Ľ´V żtśđy&ąoęÍ ř§NŐ•Š)Dw��s ádřČaîŁ5ťLD±YT Üm·ťÔĎÖtëť'ZľŇ®Ř´ö—/lcx|´¤sÖˇ˛¶»»”Ácgsw"Śŕ…ĺeë…Î>¦»ßŹ:jŮřÂŰP »/¬Ę>H›oâJş~Bą}Äľ!Ň´÷´ŃuÉěíe•Ą+ P¶ć8Ë!'§ńí[áń5káŁ:vrë¸kµČˇđżŠ$S"řcZe¨°9ô¬űë;Ë ’BĘęĆVĺćÝâ-Śđ7źÂ˝káN˝ź©ë^+ń˙�fË4vö˛_ÎĽŔ·™ĺŽQpĽdCZ_ĺxüonm–Q6Ł4§¬%UśĎŢmĄsč[=EpG5¬± Ś’zŰK•­ŻsĂŕ°HĂ3 Ş®ćôÎľ?É­$ĐuËËCˇęĚń.ź1ű<ÔŢń· ™±59,ľĐWΑ¸} ăď«t«÷^6ń•Ňę)ž”cç˘×Ţ˝J’Ĺó{Š6óoü…fQń\ÁĽż ë%zäÚ2úr7cҡÖü3â Ý.ő]ęĘÝäňÖi O�•cŚăľ+Üľj·cáĺ®·â}E2Oµ\‡Č.Dlç$®=H+ÜŐĎ%źŠüŞĂ¦Ü[ßCyg'‘$4¨7 =CŞőĆŻ çUăRŇJÉŮî ;]8Ç’ËDŇK$‰h,ě͵T ő$ő5ŃÂăW Â5|ŰyĚ„së'ą®rŢćHă‹P¶?ľŹeĚ%xé޸ü@ŻbřçŞ4Ţ Ń䵥®ˇ}ŽRL+Eĺ<Š2;´ţJôńŞÔ«Bť;Z]ĆŰzžmáKY­<yĄÚ][É Öş¤I4/€Ń¸`pq‘×ÔŰ 6XYG~tň ~cד“Âú“ÇOĄ;Â][ëúF¤4ëŲ‚ö)ĄśŔŰBó7©ăśóřô¨ü5aöűV¸Vß– ei$cťŞ<3¶>l�“ëůS•5)É;on˙�üőJµ¤ŁĘÍěµAil×$Ťż;~mÇň®Űá>“ëj±—ÓuËkî­î­ĘłyŹË Źž=ńČJ°˛‘‚9G°ŐtűŘ-ĽËi­.&XRćIZ5Ř€7“¸ŞťŢ§Đ+Şń7 Wéâru{嵆(mDCĘaűÇlł1HŔ;ďTő"ľW0© ´ý„f”§đčŢÚ»«=:>oČ*`çJ§łq´žź×ů–ţ$Ţj÷ú4 ±Ý]}¦ŢŔíP·rŃ)Ú۶•‘âĘ’ĂćBËÂ_éóé‚%Ĺ˝˘Ím:4±„g…wdĺHŰ:gçŔ šë¬ ¶¸đž• òZéwsh—2ł$V—hżgtÚUÚŘgmb«đŢĂI¸×µm_MŤµxĺ7¨ł;ČŶΕ ’äî;%çšäˇ‰Ž„’WQ˝Ň^vľú]jěť“]‹ĄZXjŽ2Z§ř®źŇÜĺtË Tšîxíě/Ň\©;e »ŕB‚ĹŹ�śÖĂZŤRóJŇ’ÖbĐZŮA$…Nß,m“i,{O_»‘^çă{ >—.§â[[s ˛śĚ2˛ŚŚV\1'€N+ĂőKí ëm5–„m ¸+oi4˛ĆĆf”ç,@*’«“Ô’kŁ(ĹËÍ(Ć_=W˘wűÝ´ů«÷ÔĚăVšŠ…ź“üvü ZŽťź¤Ă'îÖđMĘę ,…ÜoÎ00 %}0:VçÇF˙�ŠŞĎ˙�#ˇ˙�¦ŇÖ6©q=Ć$»·¸ŠmĘźg} ôÜĚTdŕ°ä�9ęy­oŤÓ$ţ%°š)VXäÓŐ‘Đ‚¬ ˛ŕ‚8"ľ»ÍËďjîĎ ¬Ż©ę^6˙�‘7PŠĺ#\ޞ Żńą?đžkmČ'PŽO0Ç_˙�W§í>5]ŢĽ]»·OúoxźŚAoëeHűNb1ţ˙�ůíYäżĂ—ŻčŤę|#˝Ö]“öo°ä°k{ŰĎ�ÜÇÇä+Ë›ä†'?—5é:ó°ýśô”c÷ţĆ=x¸řĺyË?ÝĂgž}Ď_Ö«%ţß÷KučŹWýź®Ą3ëZ{ťÖű-î1Ž“"6~Ş‹˙�|OúHł×ĽUn€ůšqu»wÍq˙�~Łü‡ÖŻüŇf¶Ńou‰×ËŹQh–~ô1nĂűÎŘ=ŔϦrľ ř‚ źřŹ kN÷–Ůăvɤ S˛`}p§ÓŹ7:•Ý=´ü˙�áĘKcʬGú Ś,+gÔ ó˙�ę«‚fŹ$lŻą$O•Ń0=Gq]7Ĺ řĆW!b+c©H÷VŚ>îó̱űů`=zW5 K%ÂG /4Ň0H˘A’îqµ@Ç~źýa_OF˝:¸uSĄ‰KŁ;Ź‰×źŰđgŠ.€[‰í§†í¶ăć]…§Ě˛×řVĄüŹđďŔv¶¶1¬~'ÖŐLó•­Ô`· MÁtŢKri׺Jż‹<ŕ ÓE¶7ş‘©sµČǡ+ʤ˘ąoŠÚ“j59BńزX ˟ĹŮż�+ŔÁÇë.ÂŻ/•ô+Ěë>�ŢČ.µŤ.iĄ™^8®ÔČĺÎâĚŽrNI8OĘą˙�Ť…m> Ý\ŕ éö÷éĘoC÷g|7ÖFń¦—w+*Á9űäŕ�’ŕĎ@$XÉöŇşOŽú]őÁik$˛_Ř=ś8_˝0|íă§}=Ă«MPĚôROň)ü:›Ţł[ŹŹţ*¸r?Ń"Z‘Ѥ†Vđ”Ŕż?Ť–7dŹr>áĐ©ÁĎ> ×˛ŮL–?´ĄIµuM58Ćd ¬=9Űţ•Č|]đÄş.·>ł@éz”ĆFp8·¸s–FôŮ`}Iq—”âT+ňOíF6ůŃÇrF81ďŇ»˝\K¬|´–RÂm2ô[Ćůů‚,¦Ýzcť’(ď÷G~G�JB†YxŤAfďĆĎJôź@ţř9¤xzëjęŤŇË4{€+űĂ<§ţň!=2k»4iÔŁż7áÔ-¸˙�‹×k¬x/ÂZĘ"ć_1°~é{rHϦAçÚĽ®ř'Řn7}Ńçţ™źé]ýÓľˇđ )'DŐ‚É“Ň2í´ýÎŁčµČi6 «ęöZRڵíĚp79±Ďŕ›ŘôŕK-’Ą…©ö[ąę_Ö<q¨3*Ápn® )rަܱŔç®z ˝†|ă»ö׬$şŽ4ąŮ~FÖâá¶«ęĘI dĆA99äpżő4ÔĽ}s yZt hŁa;ßő*ż®ăáČ˙�„sá5Îş!I$WBvîUR#Éô)śűבR‹ˇ…§UI©Kňc˛oSĚü]-ÜŢ%Ľ·Ô †±v´ŽÎ5۬�ü‰öVR?ĹśźAę~ł_ü·ÓŻ%Vşű9µţ®xą=FvŁf5çłx‚ËĹ2Äž4H¬®‚ůpëV1íhA<$ŃäďÔtç¦IŻDřY§ë>{í S€Mm6/¬u _žŢe!©=UŽ€=A8Č;cäăF”ygÇŃ„{3ÄbYPš‚dcŃ‘‚ŽąVSî"·ü áÖń?‰ ÓťIłν`ĺ�¶ö*ľ¸,zŠÜřÓˇ 3űęvŃí¶Ő»ă€.‡˙�ľ”†ú©®żŕV–-<3>®ĐćmFsĺžą†,˘cرv˙�f»ńy•đ*¤w–źć$ŻŁ9ŻŹZ©—U˛đÜVÎĘą™ ¦FČŤqč¨ ď{Tőw´ńMćň ü&ć%'ţ[Ä~l™(yöŚzW;ń:S/ÄOlě¸H†{‚!ŹŔçó¬M7Q¸Ńő[M^ß/-„ÂuPOÎá—ńMËřóîéŕă<ąAnŐţ{”»–|K§˙�cř«UŇBâ;[ĆŹúfç|x˙�€¸ü«˛ŽîmkĂţ´ŽŢÖ_ěŤ.L>_=ł12ŘďĽw�‰>9éqjiž)˛ůí5ÖŢWĎŔÝ ˙�Ŕ°˙�€Źzç|0o.l-ä˛K¨âŠ×É’Y.EĽnë4¬…X+Â:@�×5ÉŠ©í°P©{5¦ż%řŁŻ.‚x¦›Kü´7ˇşít¶›P†î6ó:FA€†AÉ^çˇăiV?-ď'Ńb´¶ZÇÍ"¸ĚŘPp@8 Ię1Ö®Ewlö×F±w§ŔĐĆËi:\Çň†Ť“ Ű†PßÝ�äp+ć(ôű·°˝{â0FścyP]Š`ŕ“ž[P9ëź:Ť.jr§ö´{iĄő[-™îâ+Ęś•D®µ[ŮëmÝó:{Ô]?JĽ’_6á<¦‚r0äđdyÁĆqśU%·˝»­ĹőÍÝוu33:B�;pË•lqÜXśŚś‡Iž24Ý*ě4D‰‘˘9Ť‚¸@ÇvsBňúUą5IĚ/oĄÂöQÄĹ\I)AÉČÁTsĎĚۉČ>ô,4ŇJ-?=4őŐ˙�Áë˛3ž:ŠJ­xňŰMSůŰúĐż.Ąqiw®,7˘>`‘^A4i$3 › ąVSžôčŻu‘6—©FŃE©Ř2–žbĹî•FŐó@ŕ?–J n 7˘°ćf(­!µ˝–[(eI­ă߸O’’Ŕ%ÇÎI=\ő®š9HŇhLeCďÜ?ňkJŘxSŠ÷Vşm䖽úuGĎbÓuĄ)-[oń,xă_Öő¤KËŁcY.ë{hĂ´jO !'¶Ň@ŕ� c$ÖE¶Ąp†OµŔĆ(ܤ’ĆśÄAçzÄś‚x ôć“Ä—‘ŰYy2dĽÄ+(”/údvéÍ`÷«6ź}ťH…­ćÁ#…$`gxÉ�ň9ÁćŠTU*1Ś)űşţťzk}_]ÎĽ•hK™Ůţ?w_BÜ—Pĉ pţkFrefŔq×=+Ćúv٦ÝŘÚę1¶g‚űš(ÚyX#™·B@�ńRNm“\’KkUIsi @”´‘îöČúuëZ_o&źĹ¶rąHŘ.UGËţ¶^žŐěĺôăyuďčźęyUáË7Môv=gĆ  Ü‚ Ź2ŘB>ÓĹxgŤe ă uÇÎcľśŞăČ˙�8Żtńü‹äűŰ^ś}¦óZ–ą§řľę¬tiÖVßf%Ң·Tł)f9ÂzŽŮŁ)•©K×ôGL(ʵNXŰfővŰWřŃřŹá´żm<¨xŽY!ŽÖ(šXl§ $BtĚg:äž:×1lß ¬/ÖćmGÄZÔ(r-žÉR˙�x•MĂ'§�ô9ďÖř›]đG‡ő¦ę>łžěDTµÓa‘c$d[ž z`÷§xSQđw˙�´ XZÇeÉ$—0 ©ÝĎƵTňřB-)ĘĎ}żČ‡JަŞĘ›ĺď­ľóÇŻŁËŁč:tş|y3\Ü2 g ¤qˇ dq¸·<gšóí.úçNż´ľÓĺ\ÚȲBÝ�Ü•#® zĄŻ>Ýč“ę­ˇZE»Ć’ÂÚ\~h2nŮ€;[ˇíÎ*ˇńWÂÂxŃ-ď»G_jꡆˇB›§h÷ó4ŽQľZmŰM:m?ĆžńŽŹýťŻ›+I-Ž˘áT0ţ(Üľ ø^”Ë6ř_ŕ·mNÚóMK­Ś±”Ľ7SŕőX×sžśî@®lř›áYN‹lT»ýŤČďýÚŚx‹áJîčöŁ<şG'˙�˙�8úWšň¦ÔfÔ_Oëü‹ú®*÷te÷?ň.|ÔáÖ|mâ-nöHŁÔ/cV·ÜnXŚŤąWÔ*Ç�8ţč<gž#âÇŹőő†dš/·‘°*7Şą\ŚňĄ¶źq][x‡á3ŤŻĄÚ áô†8÷űżŤ^řMt‹DťŁIqŘ‘ü#Ţ»přUCęĆöjÖ·§_ľ§Šz{)}ĎüŹ6|ňŰp 1•88Áçëýkč/‡ľ3±×<= żÔ­`Ő!AěRJ¨Y‡`+päv®M{á1u©ŚŤ*_ţ'ü˙�(ŰXřC!ĂéV„q’tÉëţîq€ăK0ÂG—FĽŠX\J˙�—Rű™Oâžµ ßßQŃŻP˝ś(¸…ĂŻž¤·pp ‚3ŽŁÖ˝Ă|;ŻŮ}‹Z’ßOş•J\[]śÁ/LívH=•°}ŹZă—Zř>jéÖüq…Ó¦ľ”j|"e#ű>.G9ÓççëĹcW,ŁRŚ)»Ţ;0ú¶%Ë©}Ěři gYŽ-ÓfdYDęáy(™<ńŔQźJňř‘ĽUâyu4óRĘäXĆăi–r;nyçk˘KďÂMĂLXő#NśźS·üćśÚźÂ6l›%<ź±Ýý8çńŞÁeńĂÔöłnO§‘/ ŮRs˙�"/łZŢÜk^Ôy˛Ö,‹*©Á.€«ÇSR=<®ćşk i˙� ôíCĹ—z„şµŐś ,ŇHDj$o” Ë1!Iě¸ë\ÄÚźĂv\i7SiŚ,¶·‘Ú\ą‰ÔäeO ¤d0=CGkWľ3đîĽńŹë—¶çtV:mŇ@ĎČó$. 1áFç<ś†'Vuۧu |@°¸‹kNWôgťyw73m’ä ËÉ€’âFÇďepŰĐn|ý} 㕳Ҿë0BSěvÚL–‘0 ňgÔ’+ĎQř@Á‡Ř“‚­Đâ 2üÇËd, Űâäőđ®Śnë3NĘ=-˙�>­Křrű™Ä§Ęś°ŕă<˙�źóÚ»/†7 Ü®—ŞĚ[A”đý~ÄÄś2˙�Ó3üC·Ţä+{đäůRúś-ď_ΔÝ|!ŕ®sŹKî_óĹvâ©ÓÄÓpšäOŐń ţ]Ëîgoń©´é~\›‹«tž9"¸±Ág—x� ś©a‘ؓҵ<©č’xKI·±Ő,ť!˛†6CpÔ0e'*ss^]ř/Ë$vł#ç† |ę8扛ŕä¬X®ă©§Ś{źN+ĆţÇ˝%7˝ö˙�‚ZĂ×˝ýśľćs~5ą¶ľń–˝{m(š µ Ln˝$PI;NíTtë ÍKP‹MÓ­ŢęöáŠ%yÉ$žÉ']šËđ€`˝ôűo§ÖşŻ‡ú]„:Ž» Yn“Vş:Ds<ŚZ4Ěr\–TŢ$véÂ�9+žśË0ţĚŔóA^JÉ_füü’Mż$g8Nš÷âת±W^´ń—tOkÖ¶G+k›{†¸v† ¸RŤ!¸ŤKŮÉé‘\¬ł[O$‹.­ŞB iŰQ'“řĘ#0‹Ó;yé5đü/{§ę~!żĽ›I°¶ąźQ¸ó¶ b ƤmVůľč$ě I, s粺·ńÄ KK„Ă`†ŰM˛HÔ%´jĄü¨× cľ1śucękăđřďi„öďV»hąś¬’˝őjÍöV{»\o°¤Ú…Őő{z/Áţ&xĺŇĺ´ŇLđBQÁşÓ iT8B"·‰‘yg|d€Bĺ9+]’|1šmF)RößE˛kKxŢÚÎά«ó€äěRYîĂrIęjĂ/‡ô=GR»ąi®®–=Uě$x™ÔC+Go R8„TÁ9Ëą‰Ë±×Ľoy¤h g¨Ű$—{l­Ä±kćKiK‡~ŞŁůJŹşÁŽrTe‹ĹaUl#Śbą®Ţ»ZíÝyiĄí®šś¬Tńç—M—c]đÄşN±´–7VK‰ŇÎĺT xöóŤ”çţń[ć,ĄąÉ5ˇc±¦™e- â„͸ pq±ČŔdÎ9ô ô9®~ÔϬŃj0¬N%™o5?%ŚČX,nŮwČ+˝ňNäWAŻe#ß\,… ş´Ý*:üĐĘ«Ś:öĘ•�ô;8'"˝:ŠĽ\dťä­Ş]}.÷ŢÝuîzŮUjUh:U_Éö¶ŹäôżM6/ Ř_é:~µwâŰ Á h-mď%”lr®0‹€0#€ đ'ąđĆ«˘[YĎk4šMË|Ú’L'¶'>kmU*¸Á\ŕď^Esä¤ÔQ" {,’[É$ÉóFd=�%Ć[qÚ9nśćşß xűRđŢ’höŻmg”ÜÝ:É#Čĺ›U•[~l§$֕猽;M_áj)[]šłşŰVo­OŢK™üß_Ô‹QđFťś·š‡Šě RËvöAŢQÔ,dJr§ű¨2{u¨tŢëö3\Ĺtm!†áŕ¶yt ~Vmžovĺ*ŮGaż7Ž<5l˙�mđ·mSR{pÂííá[Ęɸ nlŰÁÎ3ÔŽlíÖY#:¦ßć,qÉ9ő9'ëő®Ě>=Ő»«K—µěßžťçŘĆ­dšmę»tüŽÂÓáĚđëVÚ„×ÖŃŰĆé$YŘ4^iC˝s—!~`:‡VĆčĎü%|lÍ‚’0G>lž†˛ŢĘĚŚµ¤'Ř =«źńDFČ ń§“‡Ŕ3téôŻG ‰„¤˘•uŐY]î}âě˙�Â5.8>}§ géQvŻ<‰¬¬>$ë—˙�i·ąÓ­#şÔ%‚@ËąŚ p˛UĂŰ—uÇăź K»űE¦r{}Şň]N†[ßjÓÉ(†ŰUΉԬ…€ué–ô8 ¬ă<äc”ŻÝK×üŽŮ+ĘÝěżëúg:ö×úÍÄú™’ ‰'všwűB&Ć?1 ĽŤ€tů°8ŕ‘S¦´4ß_čşuĚSO©2­ĺĚlLpÂŁRĂ3nmĚą\ŮČĘľ°h‘g‘"šâ;„Ło`ŘŕŽŕá‡pŰ�˛ßA2˛´«ąIęÜz} zR—,\¬}Ć&•7çťe:tŐă­v–ŠZýëOĽł ťń±ž%´'ÍhżŚ/Ę»‰'9É\cP.Ź|Ň.aŔé’Ë˙�ŹWQ)ÜKžy'ëLMÂA¸’x{ćĽŹí ¶˝—őó>J‡ăčĘrW“»Đç‹vrYUT–&ADZúÔvź&ˇË "ŞśîA9\‚08®źPrşeÉVĎýňj‡†ŰyĆÄŔ{źÝ®?Ď˝l±U>·;—f“ĂJ·´łŚ’ŮuRňň1uKF°(’H˛;©8B~P^G׏j•t›ćŤ$HŃŐąa‚:Žţ”ď©mc ‚ľZŻőţµł˘H[Mµ%"0GLVµ±)фծ÷;±Yţe„ÁPÄ{E'Sš÷KŁň±…ed÷3IĺVN bGr8ŔçjÚčs’›sÎ\ç˙�A©4 ˙�h˝nĘŤżđ'Ş}KT’Îe‚(c| `ĚřÇĚ}:ô¬ęŐ®ë:tÎ9gůĆ+ěpÓŐě’Źk˝ŃJ}ć8L‚HdŰÉTv'ě6Ś˙�ZŁgl÷S,h››“íÜçë]^ť9žÚ Ř(,ŠÄu=ąúVW†Ę¬÷‹“´‡q—ľ‡˙�×SOSŮÍËuoÄt8ł1ŽŻ3Ľ•¬ě´ď¶ŚŚhw�ŹŢDqĐolŹüv‘´K¤PCDřŞżˇ÷5sWmQ%Fł“íĂŤ€śçŻ#8Ć:TzvŻ–"żb“† ąF9öč}AĹ(ÖÄ8sŧä·1Źç.—¶ŤU%Ő%תµŇó2--%Ľg}ĺĂXd‚O8?J†ňÖ[IŤĘλŕ‚9ľ ţU©˘Čźđ^*¶U÷‘ŹMůţżĘ“Ä–ŇĎz†ä| •Ry Ç·ÔWR®ŐwµŹc/âLTłQŻUF›WŐEZń˝Żnĺ+obvwm¤0\ŚśŹĎŘŇ]ŮMlËĺ•�Ç#×ţ:ÔđÔRBn ¨čNĚ3!űÝ?úŐ[Ĺ!MĚy+ź#Žz’:˙�?jb%,C¦­baÄXéć¢q\Öv]kË ĺŇ/`DÜä6q~ĽńŹÎ ˛µkądDeÝîŘă±Ýż*é•”âBÇ> }?Ćąß3¦˘W f&Č<ôe˙�ëÖ4±S©Nrvş±Ă‡âLÎľµNtś{.®ÝĽË#E¸<‰#Îr $óůR ä +B×~öZ×’háĽň¬K‘Ë “Ň‹{‹{|™Ł”ŮŹJćúĺ{st<÷Ĺy»Wöš†?äsrE"\ýĆÂă8�qĆéÖ˝'Eń†ąŁĂi–ťáŕ-m–Ú7{YZS •2 S’NŢO8é\FşŞnl$ţ#"©8‘ąúő­Ľ�A ź¦k,Â0ĹÓ‡´Šk]?—3ͱŐNu%ŃéeŁ˝´Ó­‘sĆšĎ|TčšťôZBŰăł·FXÁÄÄ’]˝ éÎ�ɦřıřsĂş Ĺ”—L5u/ݰHĺD6»7Âś�Ktă5Wqě?OóëY^!XŇÜđÎÁłŚ¨ËŹ®çYáđôŞB8iEr't–š­z`ń5ń2§oÝ”—E»Ňýö=CG3üG±µŐüK"=µ˝Ëô›xĘ@dn’ZC´ôŕrxäVišvˇ{«AęÚĐ–{->Ü8[{xŘ.ň@ŕČŔ7�’ …\ś jŇé˙� ®c·•ˇžďQ6°˛žT4hdeô!ŕölw¬­˘Šmń.ÍѤ{@@\ăčAé[ă0¸xĐXX«C˛Ń[łőÝ÷°c퇯RščÚ_&H†i^k‹™Ä×3JóÍ"¦Ýň1,ÄĂž¦)ł@$ÜC2HąŮ,gkÇśd‚9×˝?~q=úS‹|ÇÔöú˙�źÂąÓłş<”Ú—2܆ÚÚŢÚ%ŠÚáUB¨ę÷©FҤnS€F#'ŠRAä‘řăŠÉ$śgŹNô]¶C¬i¶$X×°E�wĎ•H8ČÉ=ŔăĄ*‚1ŹaÚ‘˛H#ň϶j­wrF“‚A<zô9®gĹ……ü8mą„¸ţ&úWHěwvÎ1ÁőĚřżiÔ!%ŹúĐgřšş°qýâ.•”ʤ<]“áćŰťßiłÇţĂ^v,nuţ éVD=ŰęqËlŘݶG;rÜvg÷ŻDńr“áÖ`ÝŮŽ™˙�—¨{WŤk:¶µáßë7–,°É-ÄŰăž"ńËHYIqĐ©×ÔŠ×+ţ ő˙�#é°xZ¸šÎ4_ľ•×›M<=ŕß[HÂ=vßCżśf;F»Ű-¨ęĘąĘöç=řŤ¨ŢxŽMq4˝vöbÖ“; GŔF1Ăd1ĎŽ lxKFÖ<Sâkj×»űJĘ'lGżĘ;„p®z �HŕNwÍń6§m¬|B»˝łu’Ü"9¤‚8ö—ÄéŹjď­ü9zcŞTź¶öĽł—-ŰI{®ëf·ě÷ü Ă}ě(<ôă‘Xžą»–í{‰%G„¶Ö Á}ű_ËđÝ2g<gŽ=Çůü+šđÁĹüYn¶ç~ççÓů×›B)Đ›±äŕ©Bx<DÚ»J6ňĽŤíTçJş ‚|‡ú}ÖŞľ At¤ă÷ŘŕÓ5«:Ž[MşçČaڞ{UO †0\óÖaůůk˙�Ö©Źű´˝ČŠm˙�gÔ˙�)Ţ!V:Îŕ06' ńţpůâµtAŤ&ŘźÝŔÇjË×@ţ×Č`3r=?É5ŻŁgű*ӟݎ0}oŠ˙�w‡Ëň=LŮżěśňźćPĐÉűmř#ĺßÜp~w班Sń 7ö¨$˙�Ë5ž¬¨ý~•o@˙�Ź«ˇ¸ç“Î~füŞ {ţBÇ‘:Śwnż­mMµĎÓüŽľ÷s¸ú?ý$ŮĐw *×'9\ă‰?ýjĂŇĹü“K-“€ĘŕH;”çŽzăi=Aúć·t0?˛íxăËN1ţĎé—áŰmçš)¦XŮŐvî#RŮúu{ç¦ÚŤV•ő_™âa›ŤŇJö¶žWëýzld_YM €rQwÜăď~†®]Ai¨[«Śa”ě•O8ţżCý*ËŤII¸ž•F8”ôôŕűšQŇ`…aŠęŤx�ĎřýkAé*Piţ3ű0đ”d·¶ßöďUólËТh5§…Ź+Ź»ťĂ§ĺţMjŢępYH±ĚΆî#Ď?Ôʲě®íŽ·5Ô’¤(űČŢ6Ś3.=»~¸Ł^d–â ahÝL@¬<±Çę+ŞĄk÷×CÖ§‚Y†k 5ýŢdŻemT>íѱa} ę1„>ä ‘v‘ןĐţµ“âU { źÜc§�Ďůá<86]N«Ţ$$tčN?ť;[9ŐPd"@?3˙�ץB’§ŠqŹEţFův8lńáâîŁÍ˙�¤łjŃ‹ŰC!9-’}rŁ˙�Ż\˙�‡A:žqĺżľ~e˙�?…tgüíA�~ę?Oî+źđńƢ€’s}[ˇţ•Ž6ĄU]O7.OęxżđÇ˙�KFľĽq§nÁ$H§  źóřŐO ¶^äžŕ˙�ßçżó«>!�i¤†ŰűĹäzgü˙�ž•|4Ęd¸çuăűßăN+ýŽ_×TuŃ˙�‘Oúřż"]y‚›.BâPxouëůÖ“ŚxŔŕĄexŹĄ«8Č’żŠv?JÓaÉÜHŔç?J¢ýŐ?źćx_îéż'ůłžŐînÓQž8waU% (8=?ĎőŞ3Íu0 =ÍÄ ¨f'žGż5cWăR¸�g÷„đ ě3ÓńýzU`ppśçŰ$˙�Zö©E(+#őěŹ.ÂĽ Κć˛w˛˝űťŽ‘¸xOIČ#ţ&]z˙�Ş€~}ju€ľů?çň¦i€čÄă›űĚăýČ)ČŮ#o'˝+ÉĆŻŢź–ç.řúßâ—ćĹÁ'®8ÉúćĐçŽ=©FsŽs˙�Ö¤Á�ôäśqÓ˙�Ő\MX�XžHôçŢ—‚@Î;éÍpëŽ9#4¤Çˇüé‰ĺyôÉĎ4ÓÂrN>˝)Ă�Ľg~´‡Ť§ śŽ‡Úš„í‚@éŘW5⼛čr¨ßąy±üMô®ŤĆ2TgŚz…s~(Gk芳¨ňG�·÷›Ň»°K÷t߼}âÓť�ă?ńůd?ňn_óĹyżÄŹ_I§AŁhó˝’(7W¶Ţ{‚Ę…#®yĎčŢ-!třŻě@˙�Ŕ¸kËőR¶ţ/ńg–!#i"1l1ö©GxÂüÍß/Ą^TżtýČúL7˛U\ŞGšËEÝŢËó2üI­j6si÷W˛Ď®^ı޸‹b ‹T�mFl‚á@ŔÂňA5ÍčÄ˙�i@ĄpńŽßtńů*Şé33Ldi$v%Ý›,ěNI=ňsšuĽ’ZÜG(]Í–ŔnَüpOăŠôŞGš+±ö•reK(­J•ĄRK[wNö^›Xës“Ütí\­ěŘ_bݲ6řGůĘšęXć„M ÝŚę2(šŢ+¨üą“ŚđTňO ŠńđŐý“jKGąůćU¬ Wí!Í +Iw_ćŚä˝ŽűIş@»eHzÜöä*O !ű=Éăý_řÖfĄi=„Ł’ ڤÁŕçúţ†ż…óöIÎŃÄŁ˙�°µÓ^śiáŰŃłŃĚpT°ř9UĂËš”ĺ×i]?4fř€ílék[DMş]·UůNz`˙�őżĎzZí•Ä—Ë4Q4‘ůArěc$đ? ŇŇѡ±Š)“cĺřÎvĺ‰ő–&qxx$őÓňe^ŤLŻ É9GšëŞ×©“ )[űÄtĆÓ·’†**¦˘Ś\ ŃŻCÉÁ=ż/ŻáUžţâÖ{‘nB™ĺ‡UńÇ˝U�y™`í#vî%Ž{¶z~5čĆ„•iTořĐäyExbÖa7ËY-Ü˝Ű;/żîÚĹŘ5[Ä·ŠÖÜ,{h`śň}x‘éYšŽ§ifZ9Ś—¸¨ őÉ#¦?ţŞĚÖő_( {YXË:ú¸üë›3|ĹąÉîµe)E?Ýčy¸śÇnž]WÖNÍż-n­čtGYş’R!tµ Nh_řçń­}:I'ŤKN¬HŘĹŰH Ź˙�]qĐłgq,3‘ÁéĎ˙�Ş­[Ë<Mş)ĚÜ l÷ăŠĹŢ÷Lň#âŁQUöŹ™yÜë™ íSe¸NŕOéŰĹHĂ6ŘíPĹŘ…·QśzgÔÖö–­onęé–Ŕ"BNP{vďřb®ÚjĐŦ«ĽËą@ÄLÄű`ź~zţĆ®ĽšV>Ĺgr·}ŢŰßDťŻkHٶ¸–ŢRÖR®X|ŃŢ©Ŕ8ů€ŕ`ž©/®Ĺä±8‹cöÉž9ń?JĎÓ%ŽîŇ9^DŤ©ôóÓ<úö«Wj7“űŇzd/nąéAî9őŕ:ŚŞ{Ë^ĺäő(âqJ­[F®­5łÝ5$¶ŇîţZůőšx+ejڤ2Ä€©ęŃšç4%S·'¨ ×)éOŇuIm]c}Ňۆ۵ľň}qíLĐ6 V-¤7`ç€VÁý3řv¬cBTaVýWůś+)ÄeÔ1të­â¬ú?yliř‡L'�ťëŽý˙�ÇůÔľçăŚcďôü˙�SVőőݤą�ś2śc§Ě*ż…@ĹÇ|±ű‘Ë˙�…e÷9zţ¨ĺˇ®AWţľ/Čo‰SĺµĆîŕö ˙�Öü@­†\ç>ť}++ÄŘ)kH,Ýřě=؆'>˙�N•ÍUţęźĎó<:ë÷4ţ™Éë1Jú¤ňm»†r2>ę˙�…TŮ"�LN@Ë Šë¤µ˛’G’Khdg±ŚŻjË×íí­ă€ÁqČŇನ(ŕăŻ5čáńqťˇoé#îr>+҆ŮvŤďň˝­úšöyO x}vźž[ů1îÝť}ęNŞ8Éüj 4/ü"úŚ\_ ˙�É_ëüęÖr9$“ÔăžőĹŽvŞ|voţűWüOócFA<úóÓçő÷¤Ý·…Rr?.Ôđ�ĆWÓ·óţyF$pO§§ç\GGAĐgţ´mÉÝ“ţ4 ç ôăN#Ô˙�/ZdŤUĆ?^ž´Őí»=GţłNPq·˙�őźóřPxÁČüýŞ€‰đF1ówôčkšńCżŰ˘Á_őCř±üMď]•ăŕĂ˙�×\Ď‹šţÜŽăź™«»żx‡OâÔú;ĆANNöŽźžpOúd<WĂŞč±ř“ĹúG‰X¬5 ’¦TBJ<LŘč±ĘŕőŻNń—͡@_í+ ŕd5ä7 ƧăMf{´’×LŽţâ[Ëɤiv' ĆY€Ŕ'ćĎAW•ú˙�‘ôřZt%*ŽłµŁumďud˝MŮčúOĂKU±[Ěęw°ÝŻÚó÷G¨�Ŕüzן[E%ÄÂ8Î �ž<ҶĽwâ/řHµĄšÚ'ŽÂÚ?*Î6]ż'r3ÁcŹî€;VVXjdufřáţµéM¸Sr[ŘúŞTq~IS'jŤ©ëľë^ľ˘i÷óŘJĘ#-oŢDÇç’=ů÷®žÎâ¨DŃľGB=yü˙�J§ŞŘ%ŮóQÂÎäź•Ć:ýýUťá¶xu) }Ŕl+"žĚ¤wőÁ"ĽÚľĎMŐŽ’[ź/}K2ĂKErUŤąăŃÝŰ™|ŢżÓzúäK.—6@Ü‹ć/¨ĆsúdU_ ś[NŞIQő˙�VµŁt–“®pLL;úĘđłfÖr03 #ľZ˙�ő«¶đ­yž]:ŤĺӦފqz•˙�$l;e~^8ŕţ‘ŻęFÚ3ko˙�0xÎĹ?ÔŚŕUíJí,ě%¸#îŻĘ¤çs€?:ăfů­,Ź™äÉ,G^y?Npăň­rü2›ç–Čő8k&XęεUxFÚ3čżĎČhĘ�`çź—ÓńŞšŤĘZé˛J�mä'$ŤŮäŚý�üýęF1¨;›b¨Üîy�c“ţzń\®Ż|ogBČPí‰E˙�랦˝LDŇŹ/sîx—O„t[˝ZŠÚtŹ[v]<÷{\Lf‘Ą?y‰Ć0NĂŇ Ś€Iä·`Oµ/ĘI8'őçÓúS˘…™đ±€Űs÷żÇüâ¸v?2čH3Ś<®}żúő5“Ŕ% ĚB“ÉÁĎ_Ň–ÎĘ{ąDqCćąť§čOҦ—E»‚uŠâ3` Śd}8ă×ň©ć[Ęě9îeŤŽcyˇS·~Ěą<?CÚł—2>B…g'V˝Ý„ńŘ&í\ďŽAĎ• Ť˝´—B0ńEÎáŚuÇnţÔą•®% –ĐÉäÇ"ż–îŤÜ·;wç˙�Ő]—‡­Ł·µ{[¶Y#s¸4l Ďć=çˇÔ-ü×iqMrc(žl¬ŰXŚ ő#'>ý:kéö-g4<’,ŘË ŕ�Ü wďÇ<úÖr“ô4Ăâ'‡«±Ý]D ş–ÂDQą\cˇčqîášv™x¶Wó((r8ÝŐ‡©Çש«ô;dK“)N»÷Ęä| žz·##Meîfůp dciűÜô÷ë^¬-Z’żT~´đ´ł ş<ßŇ˝ľËÓeľ×:Ď•m&FS‘•lŽÜńřźZ«á2»®tŰŕöËzUKł&‰5©#rmxąčĄ×#źzµá"?|HR6§Lc$µyő):XYÁôä|%LLO‰ĂÔ^ôjGňßćXń8+P;Ç>Ăó­Y0ĚzçëĎO­ex«‹kw*6†lśă.§Ň´śŞ±$~ś}k†Żđiü˙�3ć+źĎó3ďµËk[©-ŢË+`ž0r©úžą:î«ü(±Ă$l$–\~‡üńřŐńoí+’H 1ä,˙�źçYŁ+€Üîśđ2kŮĂá)Ĺ)Ą©úfCÂŘ'F†6ň粖ę×ß¶ß3ľŇC hRdk‹Ó‘ëţŤ€?_ÄU˛$őăůT:P_řAô'@k۲Ż˙�,1ç ţuĺfĹgçżűí_ń?Í‹´äp}=0i®Ü»řö§nĎ•°{žŁ‡n '×9íĹqcb‘î1Ó¶(lsÓ#üE41äŽ^xĹÁô={ő¦ha÷yôôÜ“´žrF8ă˝ Ý21ši9*z‚GŇdǦ2?…s>,w„[X®aă¦w5tîG^‡Óđ˙�?ťrţ,VmB"¬Řň�ęGvôŻCüBč¤ć}!ăL Í´iiä“Ř}˛µă<_/‰/RÚŮŰűýĘůnĂţZ°ôçĺ ç©ŻSřĆTü7Ô×pµľ?ďüuŕÉč�xô«ĘRö7óˇú7 ĺÔëÖ–"˘ż-¬Ľűüş ŤŔR ^}?óô«Z.ˇlpNâOOúfŐUŘg€ą#>Ř˙�?…ZŇÂ&§nG$Ę@#©Čaú^ŤáKŃţGÔqćĘë//Ôę=p$űőâąo Ś$ó+dŹ÷IÇó5Őă–�sŔ®SĂHĂT‹ĺÎÝÄ÷ŔÚG?‰öŻ' ×Őę]ĎĚ2Ç‚ĹĆ[¸Ćßř:y4śá†ÉÇ\ŠĹđ‘ i0_ůč¬?úß@ÂtÚ ËŹşqßµr>Ôm¬<átv#F¤¤ä¨éíś÷¨ˇ Tˇ8Ĺ_Tsa0ő+ájĆś[iĹéó_Ş,xŽăĚĽKD…cźâ=ńěżĚúVĂĚ‡Ź€2xńÓÓç¤ŇĘň3Ë&Črr:śäŕôîůĹE#'Ę3íÔtÎG_ŻňŻzŤ5N +ˇúćA—¬R¶±Z˙�‰«·ňM%ó*ęct…@`ś3ŽxÉéřó׍BA<ň9ďś×WŻNđiĺ2«LÂ6´‘üŞxRĂUµ›QŐď$·µ^#1˛«g=y#†�{uăĹ‹«ɶ|WĘ5ł'n’OóýNHĽ>b{öú“]·ü%¨ëšqą‚Khâv)óźź�sŔţ`ţuÍř‡M‹NÔe‚ĹŐ¸ Ç!Ś©`}Aé^ĂđŠÝ“‘HŃ’e‘śr~\ńźÓôŻ?YÂź4O™§ Ę̇ügg§=¤żĽ•ĎÎ~]§¨Á1×éźzÖÔĽm©Z˘\ąÜ2c“řşză˙�ŐĹ.·¬k›Ű»Öi[jEnH'�.;çr~µÍj2i¶ÚśÖ“Íâ; ¨L†K— 22ŁŻôŻ2ŇošćŇ’ZXć|Aá?Ú]˝Śvr\)ÚÉ$Jw2őúđ;ŐĎx'_]..vE áÄ#ćb=ĎAëŚúúׯř úę[(mÖö[˙�9żtň(ß۩ܑ[ěú†–ć [-6ęDĆmĄnIä‘ÓŽsÖ”ńŐ䲥ęŹŐü{e¤ŤJKT·]›‚ äťÄžH?áę*•¶—=ćž°™m?–"lu#ő=ó_E蚎‡©Ĺs5ţŽ4ŰËTiYgŚ0ů‰HŕôíüëçÔäŽęKŘĺĘO9”n' „˙�/ţµk‡­Rµ×S9RMňĹjCâi|Ůŕ´–ÝašŃ<©2N ÝŽŽ˙�ţŞÄÁŽ@űĐ’3×ôüĹ[×oĹýŰJ±Ş»ÇVĆ�'ÜŐ?)'g^řWÖ᩸RŠŘýĂ)Â}_JŚŁkGTőő_yd0Üçc’ĽÝ¦koÁ§"e ŚĽźţżéXśĆŕcrťů#§Żů÷ü÷ĽI’rAĆŔ8íźÖ°Ě4ĂËĺůź-Ĺ´Ł ®Ż~h§çmź­šMů|Yźěř»·>ź!˙�?çŤY>`TĽpOzĚń{Żöd{¤PwŚóŤ­ŰŻĄj‘ĎpŘţ•âŐ¸§óüŃůUfžšó—čqšűíÁ˙�ž„·˙�^ł‚pGsúÖ¶˝É«Ü2ě�IüG8_^Ü檽„°éâí“ä,wAžzzôä×ĐŃśU8¦÷±ű>K™ŕčeŘjs¨ąšŠJúÝé±ŢŘ đËŹ5íď�gwŹnž0>eoL~u_Lx~ÜIšůóěţdÔˇśŽF+ŔÇ˙�źŹćĘŘÚżâ›$Lń“ţy ôőî3ô¤ŹvqÉĆ?,úéŇŁ-Ć;ÓţŞâľ§›¨ŕI�óžý)0Xä஼ůüéz6Áלsţ}i‚3ܟÚd’p1óuÎ=餜sę84čĆá““éďAÉU#ď?:]FV}¤ ôÇCéŽőĘř˝żâcČ_÷ś´ŐŐ?t cŻCŇą?6ÝN0HąŁřš˝< µB¨+ĚúăđßQr7Űz˙�ĎxëçňŔr0ąęIÇoĘľ€řĆ řqßlňb:đŠNXźQĆ::Ó)ţ ő˙�#őžţO_ĐMÇvÜŕzä{ăŹJµĄdęP‘űŔýňÇúUI;ĺOż é‘×ĐźOćjĆ›"C¨ŰÉ<ިŚĹÝŽÜ`Gż'^+Ь›Ą$»?Čőř?ěĘÖíúťYČÎx?Ť;÷ź0Üx¬ÖÖ´ňX‰d`%„ ´ź®)ë¬éD$“§#ěňzű/ŻňŻťXjßČţăňěě^ţĘ_s4" ˛#t Ž:µçj@ڏ#°=úäúăßúWQ}®Ű¬–˘F‘írĄsלýř×>‘¨Ń$›ćÂĎ/ś+ł좽|ľś¨Ĺą«]Łéxnu03“—»)¸E_}e«ű‘�gíË ‘“žú}ri TGÎ0Içi^Gľ8ěIç$k†RsÔ¦7źáĆ}qÉéőíŠYî̱?ű¬Äu<d·^Ă~ç çŐ?TÂüîßćĚÍ ¦Ś «Ś÷‡řvźĄmřRë…BމŃHh€'ťĚwé‡ýÖŞ?ösÇyíÚ[î¶gŤÉ'Uçź_ĐŽqšČ𮢹v­yJ[LÂ9NŇp Ćě{,׏Ť´äí©ůoW§<Ňr§$ÓIiÓK[Öč‡YąIЬn¬2[î€yîN9?Z÷ʇÉxOLň‚‚"8=y'Ü˙�žµć,đ‚i62_y ň" g#ôöŻHř`’Çá«$‘L`€Ó8#źˇväă'ŇN/©âR‹Riť2éĐ\>e†9€ÎwŚ’0?.ź†++Ä:-Ľđ\Is2žYdfăĺďśăĺ_Ó®t Ú 9Ć Îyüy¬ýctQ»¤\ŽzqžÝ˙�źőŻ*%hÍą9žĄ ˇĐo- +yĘÇ#ŚçßéךÓńg‚ä»×µx˘Žĺ'¸qqevł0 IyÇý˝+"Âi.őtŽ ;ŰÂĹGÚDŮőŔŹ;†0:ý@ăźjđüÂëI…±–1’čTĺr÷Ď#Ž ?i(Nër«iÎĽ[gŻxSáĎ%¸ş7ęńE”î–?5ü·Éţ ˇ‰öĆzWđÇOĐő? MĄ^[,Ť2;cyűŔžă·^śő"˝ öŠÔ–ßÁ¶şZ/›=ýÇ >Tńß’żçÄü;ŃŢüEĺË·fâ>ňă†9Ď<ńßđŻc+Ž­÷<|miÓJp•¤ťÓ]Ńć3Đ'đŢż.›rŢaSą$ĺ–3÷\{DZVî<śäőďŢ˝ďâބگ…[P‚?ô˝1L€¦2ĐőpO á‡ĐׂČFćQüşWÔQź2łÝµđ®wý±—Ć´ľ5¤˝W_š×đč:Đ(=3ë[^¸ŠŇ «‰0R$2ÜŽ?<V$ ™cŚ·бi· $hßwçÚ;ŕú`ѧq–Ú~dq.š§R\±|—o˘RwüŃÍĚ×W/qpĘÎA' Çéí]đÁU`z¨ä÷ăüţUĂŮÄ„˛§™;dÚ@Ŕ=A'Ś‘‘ů×Gý¸®2läoűh¦ĽĚĘ”ŞrŞkEsá8Âť*•©ĐÂGݦ­Ą­~ß.ľfĚ™ …'Ź~śV?‹w>”rX=OÓÇçM}j&M¬ťČýâg ő?çůUÖµ(.´ö†5’9Yaמ ŚŽżä×& VbÜO*ÁÖ§ŚĄQÇE(ëóGAb¸đdž~îEµë“雕QźÂ!ŰúŐ€ nÇaéźn}j®™®… HŮd{€§Ż+vůß$ÄUĽs´°Yc˙�ŚÎ×ýň§«üĹ]ą ă€Gn ¦0ůx ô§gqĆOýőKÉŚví\Ks€fŃ÷±ĎŇś}Kp3ĐűŇí q‚ Éţt`î žç·ÓŠw…VÂg sŽť?Ďő¤ä´śtĄ xŕńüżOŇó�Y‰Ç<×úÓD˛ §lçŰüţUÇřĎgöś;żç€č?Újë_íXÝát´¸Wű$Ç9Ś…—Ŕ˛®{ťÝk“ń»˙�ÄÖ.[ý@ç=~fŻGżycŁ Şj}ń“đ­ďóžd¶éâ:đ'l®x8ď˙�Gü[{î1űŰoýx Ü[ĺ;˝Ź'§­k”˙�ć~«Â?Ŕ©ëú!Łqku˙�kĐŚcźNľź…KkÚ.b‰Büě6źNůü�'đÇÖbm|‚\žăü˙�“ZZ ’>«*Ic“ţĂvúÖ˝ óp§).ĚöłÚóĂĺőjAŮĄŁíŻçŘÝeš� ¬rc#|©ąłŹSý1Ok+02m-Ýţçő«ŚOLry÷˙�?ʲl5›mFäEw #î#|`OOóŇľj.¬âĺvŇÜüiF­E)«´·ćI¨ŞC¦ÝIGî_ uăŠĺśáiYHí)Ôc&2??Ňş­Uö]Đcä»g۰­ˇá;Ä_Ľ­»žHŔR@kĐÁMFšŢ_‘éeµ)ľ• ţîcź"V‘Bg~H�~´Ě©HÔ˛ťĽ€@ÇMÇ8=ňNÔb‘ĆĺW ¸ $“Ž?Ç·^˝*BX•Ăäqł8<őü0;pM} űfH[łkńˇgĹÚÂř7LŐ6ČĆI§,@ŕ ( ţ`śűŹJâ0Ľ0Ŕ<˙�őëéí/ĂvÚ×Âë.ë &˛%d�¬Ĺ 8üGjů×Äz-Ö“¬\iÓ‡/o.Ĺm»Cr{NkÄ«u;ľ§áx¬bÄc+?ďKî»±Ţü?oѵ[KÇibFŚ"IĘ€w `źnðŻSҢAlEE�ĘŚ`{ť?Jó€˘]ŘîRđ‚sŔŔ“=?Ď˝GOo"sCŤä)ě9㎕ó¸çűŮ%ýhtĂáLĐ«¸đ0xëŠĂÖo­ěČŽęę(Ř‚Ý!=\Sů×@[ ČäqČ?çův¬[Í&ĎUÁĽ¶ŽY†ŮTşő®Ç˝pÓ’˝äku.řSSÓ´© »ľµ˝µË«ÇrvÉ#� 7cĎOn}~Šv[¨\<R˘°#Ł/cůq^a˘řKCżÓ¤Đď4ɡ†O›íňŘA\uztŕpk­Ôn¬Ľŕ{‹Ł<×XBŘNTĽŽxDŕ üÄ9­8MŢĚë8tßđ8_iwľ+ř…33yvtbŢe'˙�ŚŞŽIÉ “ÇĘ:ÖÍ…’YŰĹnŠĎ´m“źň+řa©ę÷¶rÉ©Ę$iś0�ĺ‰ÉÉy$ţ5Ú· nP0Oż_Ď·á_]‚ŁSV>KZR›‹-ÄĚ­ щ-ć]˛/ ŕţ™úsë_+ë¶M§ę÷–NŰšÚi"ÝŚgk†úŠ)¦ü `řźĘľzř¶«Ä-eä›’ý†7�ÝľµßEÚĄĽŹĐĽ1Ż%Š­CŁŠs·ęrđ2&1Ťăâ¶<"űY í,ÜŽ~éýk"ŃČłd…ăüýkÁ?Ú]ÎvÎO=ŘcůxérĐźˇöü_QC/®źhĄó•ßŕ‰t˘Ö^'¸łŤŘ#ä ăŤËúZßl’§vąéXĄĆ‘ťŁŻŞă˙�­ůÖĺä­¤Ó  ĺŁ0É<¤óţúŢ1sÎë$ŹĘóEĎ*U:ĘżŞ\żˇ`±Úw;ăžGÓéţ–/‰íM6YŔŚ:•.Ę�Č$üĹWŇ5É﯒ÖH!EbrW Śr9ő­Mq·iWYPv9`ŠT§†ŻË}?8á±f:¨ąfšשŁŞřSÁۇÎlďŘă€Aş\vúĐUŽ8ÎĎlóRËóxkÁgvOö}čÜ9ĎúDu¶Ő.ě’IŔ÷>”cUë30WÄÍůżÍ€Ž<‘ůŇ•ŕ¶çŃ˝ŞÜĎ47/ ·µ çÎH` BňŔůŹ=ŔúkxgG:®›ŁŞ—1ĘąŽŢ6d]ą 3`ä“Ô ŕZâŞăJ.S{i箿֧F&ÄâśRVO]{§¸Ž)2ŰĄ|ě‰2Ň9ă�(äžE%¤íqnYˇhX–VRrT†#ň5ÖŰŤčđ´‘Ĺiaĺ›?3Ô˙�:ăd´–âc©]´Úu‹ę$;ľY]— çhޤńŇ–¬+'Ą­×ľú[ţô±\9*0ŠŚŻ'żdżáËŚ¤qŽŕ ©y5ÁÓn.--®¤T‰Čž8IE ›=Ŕ<ädU-ZHţE¶űU¬.čK;Ë'”äŤĎ“¶<Śŕ�Ož z6§ZxŽúkĽ©´M.ŘOv‘8Ů1Á[đq·ĺ,ŢĘ«ÜÓÄVŽ*¬Ö›ż/ř.öZŘ㡖QTçV¤îٵşżźC"÷Q‡Xđ6˛­°®‘wö""Ą-ŐbT@22ŇG/99&Eđ+ÉüIͬNnž/78!A c°=ŔéžýkŮü]¤´ZĆ™«ŢË+G­ŘÁ#SíËÇ¸Ž»Ľ¶Ę®xÚç®1äž=ŮŠ.Ń€F1#§ŘŻţ:Ek‘VŚ“ö{=}6M|š~­›QÂňŃúÂÝ»}ßć{÷ĆS˙�ćű-·A˙�MÓŇĽ^zśžßçüţ•ď0~Ţ€|űld|żţşđS’3ÎO¦}ëŇĘó>ㄥFqoV˙�Eţc1”*ěŚ�9˙�<ăüâ´<9źí¸ÁýáçýÖçő¬×Łîű¸Ć{ú÷ďZ^lkp .3žűOřîĹ~Śő¸ťÂUky~hë‡. |Ç8"¸ß mŹV¶Ř'xÁ㝤cëţ5Ůŕ–8ęGĺÇ˙�ŞąéĎiznˇWű<Źś©#cgžŁžź×ůsŚŁ:-Ű™h~m‘Şuť\$ĄĘę+&öćM4ź­¬tzß§Ü«“ ‚9ô˙�ëóĹeřb/7H’&˙�W##¦T¨yĆĎHôm_í–ĎetŮ›ĘeIţZđrű@sďőë7… :K 7™ž~‹ÇçůRť9С(Ëu%ůµđŐp©F˛´”٧ĘG'w†f‰Á&2F�ü=:THĹZ3ą\†$}ůĎ öFN}…oř¦Ý¤®Šw4ÜŚc©�óě1˙�ë¬)JrN9±ÔdqÓŽçŹZú=­5.čýs Ç}g N¤·š˙�É–ŹďJëŃźB|9›Îđ&”۲R7Ś’sĘČŔž®ăV٧čľIei&ĄvţLLÉ’9=ţčŰśŚnéX_ĽcoŁřvâĆęŢâc†HĽ ĘĐd{ňÇŠĺ|y«ËâżµyŁłµ´fŽ8ËcËR¤žyË<vÇjň±TońĽĎ,©C5­+%&ףw_5~Ďm§Ëwa5Ä?h»TąŹaŔÝ·”Ôüý+Ň"ÚAŤ”�NHÇO^ź‡ç_6Mw ][}Ł€Ť…O9É;»téřĄz?‡Ľe¨y·vWJó IŠů‡$ ŹSŰ­xxĽ$¤ůâvS«r3ÓŇáăŔ‘‹ŻPĂ“úU»IHˇ_ś©ůíŠŔÓu«]Eq ŞÇ2x9?§oÂşżč¶—Ňoo1ź›yúc^UHňüH·tv^–Ţk%_•8ČĎ»öúó\gŤßĆ:•˘Zę?ń(´,bśůógϲŚő&˘řąâ«xjK JęW0ŕo1ťŁĎVž<t沴­úOϦ\MubÚm”eąUŘë w©$�ű•Á§FQĂÚĄEu{]ÎLD%8ľWcŁ°Ň ±¶XŕC…˛ĚIo˝’OŕzÓöíbsňźĺÁŻ™[â‹­®•SZ¸SŘTýA9őŻU🊵k­+űOUլŲâ7 óD€a ĆX¶ö÷ŕ}KĹÓĄä­čx3ËŞIî™éŠJ ‡qn{ž?źů5ó‡Ĺ …¸ńţ¶Čr˘íĐŔNÜgżJ÷‰5;­/HąŐo¬® ŽŇ)2¨ŘÄ»˝I‰ÇísĹ|Ń4“^^É<Ž^i\Čî{’rX×^ ´+ÉÎE§ä~‘áľ_:kâjh’Jý7»ű¬ľń¨­ĺ€î9ăßś~UÜxZÜ[Řl‡”‚29Ú8®:ĺô;?¶ß*•"!ëžrO×éÝ…we D "€1Ž1éý+—7Ä+*KŐšq¦gÎă…[ßš^WVŠőQßÍśÖ¦⬷;›áäwĺEmj{†™qÁ#Éý˙�źÇëX~!V(ŽPűX4\“ŹCźëßé[ššgO»ä ÂŕqţËbąk«:/É1«SĂ?î/ý*G)á|®´‡ÄÜcý–ü««ÖOüJî@ă{{ŹoóÍrľPutäőo ůZş˝d(Ňnw`“í‘‘Çůţuľ;ýî/Ěö¸±ß;˙�Ŕ$h4Ń'…ü'1lG™xĚĺ‰ŔűHĎ·đźŇ¬XX[GzÇZ­ŕťŔH‡\śýç>ť±Ň˛$‰çđĎ…mTŞÉ%±UfP@/¨ČAÇ÷zw­­/HµÔ¦mJá^âŮ›1´Çt—8Ďďăî6Ć0¸�‘ÓY¤Ł IĘV^[ú.××îűç.ÂFXŞ•ynÔšWŮkżâ…żń.Źs¦N ¶ľż´Ů‰$‚±óŚĚTrHŕsíT<55Śşt6z•…őĺĺ¤"€ŰîŽ-¸]Ş€ŕG$Śç®mř€,·:F”8óîÄŽŁ§—ŢxôÝł§¨÷¦ř˘ŘÚ͉m3ŮnW – |ŕű’>žÂĽĘu)rF”SNWk_’Omő[.‡łV9ÝFÓQ˛z|ß^—üÇDöP:˝ż†n„‰’;(Đ‚3Đ–©ęËż©Űé·-w§ÇyÁ%@ŹpřŔŘNT…îFzđ;×R¬®‹,eY\e[łÄ{t¨/­!˝€ŰNˇă$AĂ+ve#G­pQĹrOšÖ}÷kď˙�€uÔùÖé®Öµţăm2Âó_‡E¶…–ÂÁ~Ńr0Oź; ˇ]ŹŢ!O9ő#éŘřPˇ˛ńN›éŰ–+·…Q5˘E =6_«Zâ´­7TÓµI,ŕÔ-’e#g›o¸ÜDů;É2A Oű^ĚM]»¶Ö´dx˘Ň[kÓ-ŮüŁq�@˛F2NAUŕ¨#ž^.Śq˘Ş-—-﫺zÝ[Ţó}»3 RľÚ’mékY]%ň^]Î˙�Ć0ZŢü<Ő5ĆÖŮuO›ĺI´č€ Ă"qٱ^/ă?ęZ÷Šoît‹14P˛Ă#q÷Â)#Ż`ŔW¤ęWWzž‰¦x#C„ĘńĚ^ęF\ˇŮ!hwžp�Ęţb.KŚz„tohpévrĽ» y§ż<¬rň7ą'đ«<“źIÎZ¶Ý—“¶ż…שáŇśˇG‘őiţ ~7ü_ă1 đňĺn_´ŰńëűŐ>žŐ>±ŕ/^x3F‡VhôíF;[[D˝UůšV Ş®żÇ–=ůŕŽj/ŚPµß‚Ć2˘[ÍFÖŢ0Ç™ß�žŔÖĆ]eµ­nßĂÚlŰm4ű¨ăy“o\Š;ź)rçśdŚôŁőgBfáni6ş--ë}­×ä:u*óERm4ŰMyĄţG—ř—E»đţµuĄj«<-Éĺe#!”ăˇýGcYŚE^6xĺVÜ­čA?źÖ˝/â˝ŕńEç‡ćŠÉăÖfY¬.­“źß+Fc q‚§Í,÷[śqĂi6«=áł”:ůŃşĹ7ř>µőXd«a#R˛´­ŞůŮżM»źoý´«ĺnUuśmĎ뛕ú]}ĚŮҵż‡ç@w ü·POçrxăš'ŽhĂŁ¸~_ýn{W"\éף»ž&'ëüÁçŠętŤA/íw„ň¦L¬?„öÇÔgĎŠáĹá}ŤŞSř/ëˇńy¶SőNZô_5)ü/ô~g1«éϧݸ?ęČݨ6oqŽúüořL2éΧ“çc諚ź_eŇ.®âŠdOb?úŮŤEáSť1ŽúŢý ĐzV¸ŚKŻć–éŰđ6Ćć/—ĹŐW©“}ŐťŻçą‹âÜ˙�j¦ňHň�ă<·}A¬ëűfł™ˇ;© ĘË÷H9*/äGn5Ľ[Źí�aÓćoţ˝j\ŰEu GćEjŻĘ™?Ŕ˙�8®ÚxźcNŠ{I[ň=|6iýťC 9|2Ś“¶úMŮŻ5wľęéśLRKk6čśĆáAVčyе|wmˇ<ryN»ž6t‘—k*á ’N:’yˇĹgOPŽŘť„cŽyúÔ–w3Z…xĺ–)b7Ź+ąwŔŕ‚GÇ8ĆÚö© ×őřŻ`ŁšRXĽ;ĽâµKí%Őy®«ułé~<®FČC©+ţxü«¬ŃŁŤő «ż´@’Ü"ş‰%T`®››ŕś’3ÔźzĎÖô‰VâV„4„6î#ŽXc‚żOjˇ(’{vA–€µż –NĽő/ůWšÚšÜüýhÓzťć‹«uŞtŰ{ŰŰ’rÍË"üącŔÜG#Nx<Wwuń�xcJćY&hŐ×÷ląČĎCéśu<éäÓęţ%đÝÍ…Ý˝Ű[\KnUš2®$ÇÍę~¤÷ú OřsÄ–žŃ<_­=µĺľ­—iH|Č@—+€1´3qśgśt<u0Đ©g;Xżk#Ĺ~*¸ÖniŰĚ»•÷M+Ž@Ťedž§Đ}kPŐĺX´´Ö®¤‚ßÄ:=ŞÝ™ŃíäxUKőę9<Ôň<Ďá_ŤĽn–_g™4«fóo_“¶1» »ŐČŰ×ÔőÜüLÓěő/­…î¶%‚ڢǂܸî©Ç@:cĚWt˝¤i.‹_Đq“ÖLĺ<e§xsLşŽ=&ŢyŃĎź4ĚXÉ Ś‘ÔţżZÝ‹TŃîü3kĄµ‚Ç…-’ó“²9Â÷>§“WuüUŻ[ë6öŃčę‘“ÉÇ, şĽaşo"=ĂwsŚúó>/±}ÄfÇOŽhŃ&CńđA)že8 Lš¤˝»Ť5~oësl% ¸Š±ĄB7oúűŠÔž!Ónďôk»™-mćŘŇYE1hŰe,đ9úU€ Ŕ9|fG…ţťO˙�Z¦žâćâîYä”Ü^JĚóLÄg©Ďůö§\Y5”0Ç*Źß)b:;úżČúzŤ(7ŻçÜýUŁ•a!‡»Ő˙�Ť­[˙� ·ý˝d¶ßĄĐí ÓtápĺSxË»6©#�źóÉö­+K«{…-é"‚C9śăůUO¦Íč Ü$|éţťŕ©�¶•8�m'Üś˙�‡˙�ŞĽ SöÔe“Ö˙�ä~kR„±Xję’Ľą’~|É»ţ}sźÄ6cćŚţ®?óÍtZ ˙�‰mË/üđ~•«ť×€˙�„˘7çŚőöá].¨Gö}ĐaäżN?„˙�‡éZâ_đ=čošYŃÂżúw˙�·Hä<2Ş5µó‚ů˙�e««Őwd]ŕno%ńžübą? cűm>SŤĚA˙�€µuş¦?ł.ńó%ö˙�?•kŽípů~g§Ĺźň:˙�Ŕ?$;Z†<1áx$,Dşb(1g~Zńź*9;†ć#׸«ńx¶6’;{ I@-Đ\ gQÇ 2p0FG=k?ĹdOĄx(Ł—ÓD*X™ČFÎ99SŽ~cT´ű1ÄQn±¶’y® Ţ" &BrpˇqÔĺc°ôćÔŞ+üß§GäqPĆÖĂJn›ł“wűÍŹßM¨x®ÓS¸M°Ë ¶đ�Ŕ˘đT%Tś3‘ĹtŢ#›Ęđć¦űAĹ´ŠŞ•!GâHăŢĽîĆćę8’25qo¶ď°’��ĆÇÝs°đIVçĄu—Z’ëkfĘ“=ědçaCň&} |ůôQë^>/ ţ± %¤%Şűöő=<f–¬j?{Wëň{†—©Ă˘Ký“q潤q‰c‘Ww” !•€äچ ŕđyéšÝMSL‘ ±ę6lŁ®&^źź¸ë\Ť´˘îň{áź-ń=Q3óţŃ,G¶?_Ăeö-Rćx 7ÜHňHńhÔ ˇç¶Đ=˛ a‹ĂSW¨ď}/nďÄY6kZ¤ţ®ěŇZ7äXÔ.,îµ].kI-/DdVBă=ˇc[”AáťBHÖX%Ť9Řç*ţú8…PKG¸Öěç15›ěň«Şł‚Ą—r€9GŚ8í]G‡4ă®řŠZ,éúl‰=돹,놎{ŕáŰĐ*÷¸Ę‹©¶ŽŻďoţ=LEeF•IËw˘ői·†|=aá­5të¶•e—řĄ`IÎq““Ś÷?ZÔÚ§®ăéĹ9ştÓs·ÇéZ6Ű»>=»ęp_ĺkÇyD¶ş•¬ńźGV85ÂF’4Ţš6÷’˨J˛‚ۧu$3s6?ŘŻPńµĄľĄ§éú]Ř& ýJ+g ;2HOÓ€yí^A4WÚ>ĄĄhş¤mŁbňZH âhź¤NĚĎnşTă8{%ń$ŰôjKđ‹GV¤#U§ľ–˙�Ŕ‘Ö$véâ˝Q|HDđ/šŔe(`>iÉF;U‰úhź#ş‚0–ş’ć0Ľ…“ióAô;oř+Fő%–vą[v’¤‹NµXČËw$đHÁŕ|‘¦w�9ô8Űřđcţmß1–çŹöLk“ů㯭y4q3†2”/ńBQ%uţ_zîc™T¶&Ż#Ńč˙�_Ĺ}çšęş|:„>\dŠ0’Ł<ŕóČČéüşÖ…™S™apŃy.2ąĂĂqő®WsťrĂ ‚GC´âąĎ ĆR÷nÜ)·rą9ĎĚ ˙�*ú|;oS™éĐx9Mĺ¸Ę~ęĺ´|ŰÝ|—O™ĐjÍť2čśńž{úŞ—…všů&ü˛­ę ›W Óžůük?ÂckV˙�[Ć�Qţy¬cţč×÷—äyĐ—ű,×÷ŁůHˇâÎuXROŮ×ńůŰźĺ˙�Ö­µçAPAł wĎîŤ`řłŤJ  �ăÍţ5˝oÎŚĄ‡[Q»ßä"ş«żÜĐţ»¦`›Ë°~“˙�ŇŚíî´™!¸RČ&b§¸%äßś{÷¬ť[F›OËçÍ·Ý÷ż„ý{©äwúŐ«á]ßٲ!R“Ć?ĺšţ´ű]h˙�lMaqehŇDőÎ0GˇéĹ\jÖĄZن©;´^‹ÂbëOŻŰ’édí~é«îµ^—9¤xă( Čů\…$`ô~ǡÉöëUĽ˝> R9.˘ą0͵匦ÁVr7/nąâş_ŘC Gsm.ç(ÉŰHǦqëÇozŇh7koćŮ“$s(l/9WŻáÍo/«ÖŠ©~W+ţ«^yngS›ŮNWßkőŐiŰ[FýnËzeŽ…ă/‰vßŮvĎŽ‚K™ ¸%ČUBB·^ (ČËp{ś×m}Ł\k0jZź1ŰŰ“¦ÂX*Ć®pUT` .<.=ř5ć6 ¨čÚ¨Ľ±Ť-'Ă~ĹPQ† €:¸«˛ëšü±3h¨¨#ŮUÁ z~µĹ[,­9'NjÉw9VIV?H5ßž?«.iZćąŕźźéq­­ŐĆçľ dyŰ€ŁýŐ@äd1kŮď—HÔ5Ą–MBňB®ßyŰ',ęN×›Zńmôži»rĘCeSy-ĎĚ8<ĺ‰ăśőŞ“é:ŐĚ’=Ä’ČÍ»†;FI$đHÇ$šşx8E·RQMﮬĘ4Jľ&śWř“…É|â‹˙�řvëLk+ižy7ÇçČe1·#>P;s‚ß{בÔ7ͨ^´—·Fg26Ů$Îç~>én€~QÓ*ď‡m-ežxg·hä‹#pÎ2N3śăŽ>•·=ĚÝA§4÷Ş0ľXňŔ°?1é[Ę­<-YF”.÷oČëžiK+©ő|-.k|Mő[ékôęîşňÜ©áÝ>Ů,ăą1ćFů•xÂŕő§ľ}řĹgřČ˙�ÄĆÜp?síĎ-źéZksrţ k2ŔۤXňŐ}O_ÄÚ˛<`âm;XFIă<“źóéYáąĺ‰ć›Ő«ü™ćŕ'Vľ=Ô­+ĘQ›×]á#ÄaF•t{ă#źö××đüë7ÁĘßg¸fĂĘ9<÷üZÖšL)ŕrNWźçüő§FĂć*FrNę3ő®ÖqĂşVÝŢ˙�סćG(á%†¶’’wôM~§;â©âKvnUĽłśăăúWIŞ“ö“»Ę|‘ź”Ösý˝jTsµ2sŚ|íŠÜÔČ7ATm·8ăî·ůük¦ľÔ}čtć›…˙�˙�Ňär~lëQĺy]äžOZşíSM»�ç÷/őĆŢőČxDÄíppŘ?đ®»Ué—%ł·É|ç·ËZă˙�ŢăňüĎ[‹¬ł—éÉ $vz7„ŻLÍr4[ř­R1ć4ŚĚ{óIϨPdë.>Ëkšů‰{k¬Kňɵ•ăŰ€'€‘ÜÖ¶©or<áIm—ĺµŇ.gťŁĎ�,s—äóŚyMśHÚ}˝ĐRLóLŰJÇýܱäöéÉëŠÓۨźoë_Âlj^oÚJË«üŮŻŕë űO×eÔ'ž =:Ú)ę0w(c&Si፧© ‚8Ĺ[X5 LIrę‘ĹpŞe 6G&äŽYů$žB“ݱšŻa,w¶Ď1–-Bř´–ńw1ŰĆ«*ż6Ňfýcö®ËĂŢńeÁd¶Ň¦KmŁÉ—Qc�CČ# …~é)î3ŠÇ'’ZŰwţ}îemlaÇo~̉ě'PąýŰ” v9äőăé[^Đőífµ=2ÁŤˇ‰˘š9ä/B‘u F[Â˙�NN;O |8°°XäÖŻ?µť9Xb;U9Č%9/Ď÷Ž:qŔ®ě @Uh�`�:^UJе¬źáý~5ŁJj¤š<›Â¶së÷óé¶RÍkmŤŻîJm–/‘TB đ˛ťŤźî<dŠő-2ÂĎL°ŠÇO·ŽŢÚňF™<“’I<łÉbI$’ri-lílÚv¶…"73µÄě -$Ś�,ÄňN�Đ�>ŕG^+™ňĄËˇŮĹTÄKšwD8ŽřÍ3v Gá\‡Ťü}§řzC§Y˘j:Ăŕ-°|$e�ĘÝşŹ”|ÇŽ€ćĽţ_ŤÚÖž±$ö:}Ü“'šKÄSfI�R8ă9<ő5ŐKZ¤T’Üçş˝ŹKńSĽSřiŐKíű`Bă81L§©3Ď·ŻJĺ>;\YjpEť§µţ§¤ČZ{¸Ř´PĎyáIQĘő$ŇxîčŮŮč·kČ`Ö"—bŚ–Űä�\ă÷®_C€`[¤ÎnZxĽŰ™7&’AşFĎ}Ĺţ<W“]*8ŞX§öU’ďw+ßĺÓ­őěuŕ0_Z«%{Y~= >ÝęúŚ­¨ŰxzÚâ}!1 Ĺů‚EšlÉ4‰–Ăs“µY™FŐŰ‘–¬ŹÚ•Ö»âëMCě˛ÚŘZ<–0G;›Ěň÷ČZ,es•' Ž5kJ¸˝łąÓďěçvMH˘żľPËĆeHšdž';ä€đJÔ?Ż'ÖµĎëRŘÚZĹyk4–¨MË[€¦7™¸ď%cÇË“óÄ…5{«Ę¬Ô–îéÚöł}~+ŮY7}YÁŤ„iÔ”TŻ˙�úÔŔş…'‚X’’ˇV�ŕŕ‚3R^I}¨^Á}{5ܰŰ}šńĆŠ‘»hTU{ăëÚ•B‘ĎQŽý?<ö¦ĺI*qŽOá^…˙�ŻĎň<äŢĹ[ĺĹŤÓĘőçá`”ŘňÔ€r?Ůü*Ϋ<qŰÉn§Ěžu1C rîĚ�@äőíúńY~˝Š+vµwHŮ:Ř \ŕô<^„)ÍáťSůôčÎXIÍ-Łř©ńťuu}o4Qn@›[g;Ź©¦´Q= +®×Kl7=On;TÂHÂ’d=G<ýj¶«wztçĚŚ»ÄĘ«ćrKdtő4ˇRĄnJmlČ–"µztčZę7¶ťÝŮźá$˙�‰t€ŕ‘'ÔÝŻřźĎŇšÚ>Ł%É‘@yڇś Ŕŕ\qÉ÷ĄđŰ$VÓxÁ2p7 Ś(ĎŹ¨¬ýGTÔÍüËŮŽ4‘•T*‘€ÄpHö˝MvĆç^˘¦íęzŘ|6/ŹŻK $›ćMôqżëˇ«â¬ [hÉĺî_ üE_ÓĂľ‰n±-šŐU[ŢćkŤšiĺĽY®ĄiOV#ĺç<Ź~Ăő®¶ĚăKŠ="›ěĘ÷‚U¶žňÇnj1t=Ť*pľÍ“›ĺ’˨QĄ9'&äÝş^É~Ecľ ?j‰”ô Źč×üńŚ»&śx ™ĄĚ‚FA#'k¶�ý*ëéw,Ř:ś„ŕg3żoÇńüOj©ifĐř rĎż%‹ź—9ÉëÔƵ§*~ÎĄšz=ŁaŕÝŇŻyĹ·˛k[®é#SÄQ+X<ĘY›yŤIă Ź§AÖ¬[Ë%ޞjʂ٠Çć$Ž téTőŰŰ»4‡ě†7ź0mÝž_÷şsĹhZ^[\ۤ„Ć<ŔwĆě3î®{^+—Ë™ćÎVśśW%Ţ«{étßä`řfc>­y3ž`f+čKҧŐäŠÚÉ+Ş�AŔÎî˙�ŤVŃ–7R¸IćEURžwŻ#ëŚâ˘ń‘]Ý íĺYÇ”8‘×őäňkŇtyńRv|®6żŞGąKG›{(;BQ˛}żwežžĄ˝2hî<M;¦í¬Ś•ÎŕFrÝ5SĆ1…ľŚ•ůNGvíG‡k­÷3ĹĐN €rp=yîsôĄń4Ö“ÜĂ$70ľ"*Á`ägó?•T`áŚI'd¬'NŽ 6p„ŻĹ«ůň[óĐÖŐţM*čŻüńe˙�ľ‡·çYž ě·*­…ĘžOBr3ú ŇÔ.lÚÂt[«RíUŕăë늡ᦆÚŚóĹpd�śdźý ô®JQ—ÔçkuúeěĘŃkŢ慾鉯aµË`:Ť€\ł~żçÚ¶ő‹+†by…ĘŽ™ÂźóřVłqk.­ ˘xJ"¦NđqóśźËšŃ›Q°šaűu¦dB€™xsN­9Ú–ŹDşŽĽ¨aŇW´]˙�đ93 Ă ·\P§8.sëňµv Ĺý­Ô6ÓÜ:Ł+˛FqüL8_ÄŽ•ÎxO‹Sńž™§›‘^Ý,R2>ÖňۆÚ{1ßżJőĎÝĂŞ^iVţ‚KM&×v.Ł ŻŮŃÔK$qpZ]rŕ®í­·pÜĂ\to‹ň=^%ś+ćR«NWVŤľIř},aŇt«ŘKqeoá›Ő»·Š"îŔKjvŻS{ö9ă5ŰřF÷Mńm~4Ah"fm®mÔů% ©ĆǧCyąď…ÓI7ü#ÓJŰĄ—æfc÷˛óDI<zס�zqŠósţőĹîxŃ÷•äż«‰îţŕÚ?٤Ćy=~´ć!ŹřVMĹôńř¶ÇMVSĹ…Ěě›yŢ’@ŞAëŇFúWśŁv^Ć č#Ír>+ř˘hFkxĽÍRö"Uâµ#dMé$źuq‘77ű5çţ.ń‡‰µ 6IUűHÁŢÁJpHáĄaćé°{v­éáĺ6“Ňâ”Ôw=WÄ>%Ń4G_Ţ*ÝňÚB¦YßéäîŘ9Ż7ńWŽő˝ZŢ%Ó#m'K¸ŤŢI‘Ă]V3#IźşE-µI?/Ţ:$ł·ńpm>†ŇX"cŚŚĽ‚—q<ĺŽé9Ď8ŞŰ÷…·¶!ěôť6W˝™_†Ď'ĘVîdcĺ’3ţ±±ĘšôhácNş…ŻnŻçÓ×Ô‰TŃŘŇźÂé:tšž¶mLáŐŬ›÷Ž@¬ąs<ď ›ő®[⥤W:MÜ6ʲj\W·q;Ą‘ś±č3Đ�»nöi4_ čěĚË—mwrqŤňö #ĐaŘçąOjäţ!Ž? !Úżń ¶8'ÝëÖ¦ŐÜCž:I¤{oÄ‹ĺÓl4K÷·’äA­Ű·“¤ýÜĂhÉ$žüW¤ëzG‡tŰ‘ŞřRä ‘î-cŠýĄŽ$?2$ĽŚ(bR¤śIě~%©“OŃP“¬DG8ä[Ü{ôŻ*ń ž]„ę¨óϬJŤ*—Ú|ÉŰĎs•çŻĚ}+ĺV‰FśÓłµěÚŮľÍ-˙�#ŘŁB.Ś«6ÓZ^­¤zGŚôĎxáÔ—Fę×ý&5–]ŇĎn!8`ˇŘ–iăh8 \ÖĽ1Ż-Ö©¨Ĺýż¬Ĺ 6Z>–ŃůBLîÁ1† üÁŚ„’ŞÁšß<g4榰†Vm°[XŘź;sµ™ÜĆsów(˘ąű­#Ä7ZťĆ««é‚yî$%ĚvÖňęvgfzó´“Éęk›€©Bź&2Q…›qävzµtŐ•Ó˛Wş}}8–¬×<S~ë4Ďx- SÔ…ýě*©pÚ\ŃÇ'VEB:ç-#źÂ8¬°đärÜĹŃd¶ŤĂC$ą»Ľ ·ć-ıdËĎ|Rh#Jt'\,oˇvň—T$âÝňyk' ¸ÇAÔWYˇYŢřŽííôiŇŢÂÜq¨( @o.ŃźÄm]Æ9TÄGç*˛”—W'hü”W^Šî碲úp «Uť“čµ~‡#Ŷ•p–Údž Žćl®Í/D·µ¸óČb<Ü ö]Łž3šÉ) Ĺ+ZÉŕ٤›t›˙�´uS»r>2Ć,úŠúÇOŃĽ'ŁÜ\A“1´×7KË(UË;ąůŕA€1^¬Űę2YiWë=őűĚ YÎ'şJŞ{1+řUäůüq’Ꞧ ŻnnŻFőôő{ś´˝Ł…IQm$»ľë{X†+»DűCÚxĂb (Ś×9š\*ňS,qĽÇ§ç]gÖ(5†Ňü1áŻBöĘ­uuw§!TfXÔËm!‰?޵ąŻř@Ń<!mg ”w•Ĺýś},{ĺ‘Ţâ0ç? îcŠć´‰¤“\Ő.dm˙�ÚRI}#’‚âx=¶Ăď î§źýg<MöąUÖö¶¶ż©y}8ŚD)Íwż™‰©Ďâ:ÚS{ xRęRVDŃŁt±µ”qŚ@ç8ŻHđŽ•.§áű{ßë^S „‡A »«? äĹžé –(K$Ó¶ŘbŠ6’I2pŞ 8ü€ďQXč~+°ż:Ż…´MWK–l}¦'6ŢEĆ3Ťń4Ŕç¶FÓ^V/6ĹU˘ąk*RÝ7ËË/ż_šżkvë̲şîćŻŮŰúűÎĆ÷Ăţ$6r„˝đýüŔSéNŠÍŘç6=3ÖĽëHşĽÔVĺĎü‘JŃKĆź˛Dcrş€pr{žk§Ö®>(jđ[Zż†%˛Ž9÷Ď%†±2`€Ľ>ĺäŤäľüp7÷ <K*iÉâ9|DżşdiăşW+ü2ťí;óÇLŚqľMŚĚëÂPťhÎ[®^Gmzň˝ž÷¶ź— E7*­rö˝źŞ˙�‡˙�«um§ÝźŔž˝Eî]ílŘy1©ťĆĆ Ŕî 5zöM;Mđĺ¶·uŕ_ ­ĄĘÄáRtĘů ’`ÇN¸'â°uíW^Ňg·mNĆÚ J ÄMk>é"Śń‰PĺJ6Ňwtń€k«Ő<9w…tëH.ěť4ąđÁ}!ň~\˛!pc‹scŹ*ä_S…•gNŐß˝×UoĂő2ĆFŠ©z.ńzőęeÚęËźÂ[C{<+<PŕŃ@vĚ_»ňűzŹjąâkÍ;Ă×VöÚßĂÝ OtŚđÇjĐĚíŚňAďÁĆ<ń\ç„|Gu¦éÚ†­-öˇk{pâKë”°c“çdp3…ĘŻ=;ÖŻ†tę‘Iâ 6ĐŻůÉkŰ»¦iĺ\đË «°Ś`bĽ|ng_ ZU*¸Â’Ń^éÉúíeĺ{ůtŇZ^ë©4˘űkř!Í®h1Z ‹ß†pÚŰ‚I%˝°äőaŤŔ9Çăë}φfUi|­ÜE¸{"őü+'Äš7Ä5Ó®çE€Y•"C`ţk2ú`¶ěÔŞ’jĚ•u%ŃăŐĽ+pëŤí§ĽaĽŁ“¸ <‚ ¨ qĹ*yµJńŚ©Ô†®×M¸ů&Óv{ůzŤ «—łći[mýRířťÓ| ç2ř'R‹<6žŢ‰9ţ_Ö¨\Ú|)YťnľŰ§2•Rł›”T$drrŁôäv5—牥ÓRö÷Pű¤Éş;¨tÓ<,ž˘EĘŽz‚Ć:Ó´;› gŐěĽGŁßÝĚćöŢ9 Ă(&EČČůIëĐô®ć8ĹóZOdŁÍkůĘÍđqćÁÉ˙�ŕI~N˙�ż¬xŔv’@×z˛éĆ`L>mÜ $Ć9RË“Ôt=ĹT—áEŤŇyşV» ŕ‚ІĎŐ‘Źň­?şî“7şž§§X-˝ś±Ýݢ4qˇ‘ń† ŕ sĐě•[Ćţ đţ˝4šW„¬t1e3ęíĂ·ćÎŘĂ»0XqÎ;äc,î˛ÇO ¨ľXÚóč´MôůY6ßCźŤĚT”)T•ý[üŃĘę üElŚ-⵼ŔăÉg˙�Űýk–Őü?¬iyţĐÓć€v3BPÝX�{t'­zŽ›mâX_jE›YP0�”3cţůT_đ±/ě.g´Ő!ŇŻ#ŠA’9ĚL€OĘŰ”žpGńé^ž4Ł]¸ÁŢŢLú7źg|«¨Éyď˙�’˙�‘Á|8Ň-5żiş^¬v÷1_†pŞHL˙�µ´.}ĎzöŹwcűnÓC·“OHl4ó%“Ăe’鈰€eQ[îŤĂn+•Ž÷ᇉÜE:Ǥܳ}ă‹vë϶yĎ˝w> Ňm5�ĎĄK<Żw8xők‰śË7šT+bs´Ć)Î eqĹF>V”j˝¶·o3ÂÎ37™×öÎ.:%mÖťźüźĂ·ŠMNŔøB4±g´\‘Čëś˙�ë®đ‚Aă×'¸đj60G} ĹśÂHUŔó‘®XŤ„gć,É·�Ó˝z{ęźc°šű]Ž4|~öídă¶H�n' (É<wŕy¸ęruy—SËĄnSDôÉ �2I8� äźOĆĽ[âŠo/üBfŇ/<ťÂiżjŤ¶<ĘZ9%*Ü@pŢ^Tŕ“] ń]ŹŠumRŇú ËOivŢ]Ćęcš÷Ë}ĄuXňÉĂ1n2µÇ¤#ĆZ%ˇŚŁx§G·{;›,×öĘÖśn‘ž>ńÁÎ2µŃ…Á¸EĘ[˙�_ŹäLęYčfę°Ä-–$Ž1C ŤáCÂ�1Śn9ÇÓéUőYU¦HwŁ[Kşy6ŤŞĺŤűD3{€:ž!}Nsf ,d™ĺAoqł9euoŢцӑßŰ¶Ź…#ž(Ň$x]ËŽEpCdő#’Ä{{Taé%%›ëoóţşúő&´Źs&ęŢřŰýšEą·ąűTşŕ‡Aöxű·žzZ×sGgŕŁglŞQc|ę ©ű4EŁ´Nś†I(Ć{âÄv săÍ[IGňEä«<Ňţ¦…i‰ěCűnÚ;âŹÚ/üUImĺŰČâöx@ŔŠŢ2ŢŽ€b4÷ŘçžkżŢç׫ü7×ruz3"üşM¨´ň¶ř#Xţ˙�›´,@¨$óp2@é“U~/BÚ~«˘Řľ ŰčÖń1 ´RęOć+Ň#đEżü$m¨Í}$Ö~dS¬ „»:"¨ĺŽĺĘĆ2OSŚçĎ>?3Ú(=4ônĆ?y%tĐŚäűšŃż9ë_EÁ±ŃÚĐÝĘú˛ŞÁĽ/™ţŤpËżµČXxNë]ń=†ź®C›%ĹĽ—!pĎom Eň‘ÇËć;I–aŃTŽkŃ|SĄ]jšL_ŮţZjwŢY™OČeLŤ­ÜFuĎmŮíYw¶×­Ľ?Ú^ŐŁžÝŚ´PyąŕĺI•‡ţ;źC^(ĆXy{9¨TiĄ.«®ß©Ő*Őy}š~îćGŤĽ-ˇé7N‹ˇéVšs\ůł˝đ ÷bŮ…Ť‰űÍĽ“ťÜÇq…}g¨ÝßI¦Úkšž#QçÜ<‰4VgŔĎP�<ç8®›Rđ’k1‹mA|i$*űÖ9Ż’T ŕ»úuęy¬ÔđUµ”„Ůi2‡€Ą­¦ł„?¨ ¤˙�Ŕ‡ÉËęQŁ:ęSWŐë­÷»×n›\d(Ă‘ĹŮ˝Z¦Ĺ]3ĂšM‹y˘&»¸<µÍÓy˛ë“Óđ®§á·ĄÔü;ĹŐ˝ôĎ xÚeVĂ6ŃÓĺmËž“ŤŐ‰'†çeÚÖ_p@Î.ísÔuĂç?ýz¤ľ´Tš'Ž8bŔlŰkťĂ,pŮţ!ÓךÇ’,m ÓŻ]6íg}šţ­cLĂG”-mzoĹmKíŰÂvŇm’óß<ĄŞ·Ý?őцß÷Cţ<鹲¶×4;ŤJhూüK4®p‘íŠB„žĂ~ÎzdŠbřnţ'’â_™Ą ćËplçw ż*ĺŘ‘Ž{ÓŽ‡¬çgń¦Ţ„}‹O=Čţőa†ČŠŁ±µšzŮ·%fö/$‹ĂâpÔđ’˘ďÍ-ŢźćlkŢ-Ó<AŻh¶+Iu śňjsÜyEadŠ'T Ě>oŢIÜkŇă˝×<)ˇŰ_Iť­Ť¸˙�fQö‡'ť¦<…b Ř u'tţŇäđür,^ńeě˛D´×1Űąň ±¨�«É$zőŞ/¤j–0yZW…üIĺ®|»[a¨Uq!`=Czôł)a0ˇ„’Ľwm_[ÝöľľZmcľXXW˝eîôőó±/‚¤Ň|1âčgşy=F±Ĺqq9s»·ËBżLôWűŐëŕqřW„Oá­cWť®5ß ř’%D1Áoe ĽŠűĹĚŤÉ=8Q€O5Ą‘ŞÇj-ľ)-ľÍľXžÇOżŔÁéřvŻ1ágTŤg])Y)]ßnß-;fť\LĄKá:}wWľń<÷:^‡vÚ~Ť47Zś|ËpăďǢŽU¤çś…UÍŤ·„Ľ+vľ˛±†hÓ(.% ˛]ŘŤÄN �ŕ€k×IÔ­l ˛ł‹âEµµşáŠ(­UUr0:őďźçMŐ´ŤGT´kBßÇ÷Pm{3ów‘ϡéíšű żËč*8v’őŐľďĎňčp¸7ý/ó9x®îőű¨ôëýBÚćč+ [‹»‹}Ţfsä–FÉIĺĆaYâ '[_‡zn“çŔŇ[´)¨y“*'”ˇ¸flŞŢV{°S×8¬ąĽÄ2BúoŽĘHŚ®§N·9Ţ´5˝.óWÓ °Ô-Ľo-Ľ.®i0ĺŠçimąÜ9<sȨ®¨Jşµ[‰C˝ľó—đN§¨éšŘűťsm<ëäQ…•$MĹC–Ë|Űóś Wsy jZ&©&łŕ©ăłťąşÓ%âŇëřÜcę9Ď3?‚­&]˛éŢ3q‚0Ú,mÔv;xíČôúÖę.»QĆ·2DEXŐጌŚĘIč;˙�:‰ĆŤjr§ZÎ/tÝ×äľ]–W˝˙�§đ÷Ź´ Jňňöß乲ľ•bx`Ŕ`8Á®}cJĽńć¤t¶”Yß,lë„’eâVA× 6žq’¬qÎI¨xeµ;ą/oîü[<îY¤đéQµsŽMÄg©ŕv⼞µC>,GG$‹áë†*ĂŚGŚ˙�‰Ż–Ăđ¶ R¤¨OI+Y˝şöčűôąŃÄO ŤT´[úu:_ÉŁřť4ĐOöv¬îV Ł÷WA ’ľŠčŤ‘ýĺűĆ´ţ#x{E]ăX¶´[-aBĹi=¨ ŇÎě4učŕąPw ’0Fk•µ´–;ËKÓ}âY$µ“ÍKá[‚»ö•ÜBĆ3€N9Ćyě1±q¨Ü\ß[^j‰â=Cě„Éřrć(ŃĘí2°–` “¸ŕg‘ĆřsýĄO‰FËžĎâłzZÚÝY;ůîmŤ«Nx‡V…Ňß¶§á[m&âÎuH#ťâ¸xÜËfاjO'ĺUúóďSřOŇmô›ťF+ 8泍çL@›\ť¬¸Ă+t önDZ{c ęňęM‡ŚôórŰćţé%‰Üś– Äő?^1ŇłŻô«ťGgŰ.<i$hŰ„g®8ępŘ8ç®q_A<¶¤±Nިą[˝®ď鵼˝V9–ŕý”ˇyZÝ-÷ž‡Ż|5đεiçiŞúDҨe{2L,ăt}ăřvýkË-ď-ü;}=…ć‹d^Ţv¶’ęÚ@FĺbĽ™:;¶J۵·Őm4©4ë-gÇö–$“äÇáąUPĘsą˛?:Î_[",JŢ&XŔÁ_řDî1€I9łŰśúóíË–ĺ8Ľ=9QĹWö°ľ‰·uóßĺŞ<ZŠřy)SkçgţgGuáíc^¶ëáÇ„Ü�îâXvDü´RŽĚŘ‘´`Ö_ü{á˝rĆ 6MaŻ"ŽŰć—`ÉY!kFwś`„Śä¦“cŞŘ[}—LńŤěˇÎď"? Ü„SţČ$ČčĽu­]MSN7˘[ďÝ˝öÍŃđÍČĽ((Eä˘ň;pX•ÚNkl6B­ý¬}šľŠ÷~­ŢÖňvńxš©)Í«®ĘĂě •¬Ţ×5u¶ŠÚŢŇVwyvC …UÔçvŹ1•{ă�’E`xÓÄ7ľ Ő›VÉvŽdŇŕqŹ#cWaýöÚ uŔ;GJě5Kť+RŃN“.…â$µ‹‹EąS߸Pěăn>čk’ŹĂ2ĽíÓkżdů˛bđíŇĚĘ{gnŐ8<‘“éíęÖ‡5XÎ-rSµ·¦sˇřÁ¬ĺ)öňš…ÁŰ‘—úřÔžÍ$—;qś†NŕŠčĽ ŰIio�J¶“Ę7xn7śáĘş-Ä`0 đâźâ kmZÝ ¶¶ń ‚Ip\"č7OĚHáŃ$];XAÁ`rWOż·°¶Öú_‰&šI%}伮ij;,|Ä“č� WW<şbämĎŹ4Y˘Śę*n.#ů—Q€gÚ„î‚đŚ,ę0NŐp:šż4ąµ-b `Ĺ"éö™’'`TO1Đy*ˇ“Óv88î[Śm?Ůž"S˙�`;¬ôöŹůRI®@Ŕ“§ëů<s˘]źý§íPŐ'5>¤*N÷!ŐH·Ľ×<Í:ţň-kE[�ÖJĄ’Dy~RÄüˇ„ŕîl(ŘsÖĄđ^†Ú&› ş’)ő—Ynť˘˛˝˝I'˝ ×­s˙� ýw?{ťďŰśy_O×Ţ¬ĂŻÚ ‚ý‡^x:5߯Ľ^ÜN T§ô7…6ŢĹö`8<ŚgůŠđżŹăŚ­Ć­˙�čů$ůi'µzäţ"±VÉł×€ĎŃ®÷żôËÓů{sÄřĎAńO‹µTÔ4ŻO¬­şö[y%Á.X#Á~| €xŞUˇ dě8FPťě{TdŕtĹJľťúše˛Ś9$ąâ§ňĆÉç5ň¶6 śśśĐę=©Q`ą<š{DŁ€O\~¦Ą€ÜŹĂ#Ą&}łNTKdç§éKĺ.@Ërqüé\c# ž)^˝Ja\g-ßżˇ¨ĘŤ€äő4\@~ď-řPHÝśw˘% !RH�źZ“É\[“ýqLu4Ś˙�…L L!Ës×ň¤0.G-Ô˙�<P\dňIĆŻů˙� :ôéëřÔ© –�“÷wRT„ů›źđ¦3Ó˙�ŻM$sVţĚž­Mű2o#sö=ŞBĺR�<qGӟ­dĘňÜĐmžYżJ›…ʇńâ×emóąłČíţÔ·V#,üŹ_§řĐťŔOOoZ\€r�Ŕ52Ű#mË?#'šImÖ5 ‰Ďzi¨<gÔR©?J<°�= ţáO1 Ź™ą\öô¦1Śç'ü¨îxÇzt±*·˙�“MÚ u?ť�!aó}y¦’0;Ó–0XŚśš{Ű $Üzűâŕu˙�8§†ČíůQä'\·_Z”ˇÜÝOzVĐztëÜŇ 61ßҤ1�Î77ăMňÁ\înŁőÍ�4Đŕ{˙�źĆŤĂ'śSĽ±´ňÜ`uőÍ,±lnÄ˙�…�3'¦Hő 7LíšsB«ĆXŽ'Ű4Ć÷šť€FbGVačMFsÜî« n¤.Yů8ëô¦t=Y˙�:�˙ŮTIT2������Sunshine Superman�TPE1��� ���Donovan�TALB������Sunshine Superman�TRCK������1�TDRC������1966�TCON������(80)���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/64bit.mp4������������������������������������������������������������������0000664�0000000�0000000�00000000125�14447736377�0016510�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������moov�������M���udta�������=���meta�������-�������!ilst���cpil���data��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/alaw.aifc������������������������������������������������������������������0000664�0000000�0000000�00000003542�14447736377�0016714�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������FORM��ZAIFCFVER���˘€Q@COMM���,���V�@¬D������ALAWSGI CCITT G.711 A-lawMARK���J������ beg s loop������ end s loop������ beg r loop������ end r loop�INST���<������������AUTH���Prosonus(c) ���Copyright 1991, ProsonusNAME��� woodblock�SSND��^��������ŐŐŐŐŐŐŐŐÔÔ×ÔSFI]ă…†:--#$ Ś «¨Ł¦§˛h?837 qS31·°Ľ¸ą·›„¶˛´ç59$&&%6×5걺¦ŁŁĄµü`–™0%!-,&0ăŕő’Šż§Ł¬­¤Ź7  6?%&# <b‰±´‰µ¶ł¸¦­­Ą† ?;89=118&&>µş¦ˇ§»°·żşĽ‡�8 -#$0 626Ť¸ Ż¬ˇľŽš‡‚‡A5%"(("<ËQ`uµş˘©©ŁĽšg49!,,!<重±»Ł®¨­ĄµĆ63039!/)-%5̵ľ»ąąĄˇ˘Ł¤¶ř 8&&%>>;%%86hŽ»ˇŁ¦Ąąą¸ą˝µâ ')*)#%24iđź·§­­ ¤şżł·Ž“>-**. :3hT‘µĄ¬ŞŞ¨­ĄŠĐ 46<',(),&<–‹¶˛¸ˇŻ¨©­§·g69::%&",- ; ý·ş¦¦ ˘Ż®Ż Ľ”6!,/"&%:%%:3ާݍ©­ˇĄĽ¶Ž—3$ "" ':=7 ’°¦Ż¨¨¬¦˝Ť”R> /)."%5a“†Ś´ż§˘®®˘Ąr62?:' ""&<‘µ˛ľ»Ą§¦  ¤ł™19%$$'''$>űµľ§¦¦¤»ľĽ°”68'!&%9<05ŔŤ˛Ąˇ ˇ¤ľ°Š‡Â4?$! !%<7�l“˝Ą¦ŁŁ¦ą´…Y529%& !$=jťŠłľş¤¦ˇ§ąŠă7<8::%$$;3�ř‰˝Ą¤¤şľż˝·€ô7?:%:8>?=6 c𶏧ˇˇ¦¤»˛Ś÷6>$&!&$83 •ڱद¦¤¸˛µ„Ě6<:''':=5ď‚¶żĄ§¦§ş˝‹‘63=8%$$;= ‰°żş¤§§Ąľ·…k3>8;::;?1I‡·˛żľąľĽ°‹‡ć464  č´¶±±·Ž‡‘óm   ÖžŚµ¶°ł¶‰›ăGk�577iĚ–„€€ŤŽŹ€™ëËf� 54 Ŕ“†ŤŽŽŚŤŤšíe  𞇄›źťťť‘áq�r횀€„‘˙XŐă’ž‘Ě��`ecmZ•š††š—ĺĘýůy iYćďěí—…‚†ź—ëěňYg �cZňěę”’„ŤŽ‚čóUxj 465xႉ‹µŠ‚ťŢ�5665�s๮¶°¶Š‚źűe5 `ßŕčč앟†šíÂwetd  �lÍăěî‘„Ś‹µŠŚśv�� �mí„‚ŚŹŠ‹‰Ť†“M5445iY慂މŤ‡ž–áe 41337 ~áśŹŠ·°ł¶‰üg40237Ă—ž…†Ť‹·°ł¶Ź“51=?<6Ü„´··´´··´‰›T46667774ßźŚ·±¶´ŚŤ†ťňj477745nă„¶°°¶µŹ‚†ëO 6=<37 I•…‚µ±˛˛¶†“ü`44 iŔë“™†‰·¶´‰€žĺa�  děš‚Š·¶·‹‚„řtn46165 Pť‹´··ŠŹ‡žëÖk� 45 �B‘†Ź‰‰ŽŹŤ€†…‘Ő  oᄏ‹‹Ž€śŕöäę”äe bdX㟆‚Ź‰Źś”•ëňc�  �`pÔ據„„……›ź—ďěčçv  wŮÄőá•‘’‡„ťęăđJn��KÎüĺççć蜇‡źěÓglÚ•›†‡źîűäíďâáňNn`~CÖČá–źś—ćđĘĎÍÍÇ^dhxCVŘÍÁÜß÷ćéëěĺ÷ßZwvL@qdca{HŇńűĺţËÝÔŇŔő÷ôĘÇTGNLADAOIL@ZPßĂÂÚÓÖŃÝŮÄĂÍÄÓQ^[[XY^YY_RW×ĐĐŃ×ÔŐŐ��������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/alaw.wav�������������������������������������������������������������������0000664�0000000�0000000�00000157032�14447736377�0016613�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFFŢ��WAVEfmt �����@��€>������fact���đn��dataŕÝ��˙˙‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµđđ>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶”•<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<”•¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66::!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐU 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 UŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%:66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!::66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄş¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶ĄşˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!%%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%:!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐŐ‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇĄĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹UŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66:%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' ##!!:%66ĽĽ§§  ŁŁˇˇĄĄ±±““==$$ ## %%00……˛˛¤¤  ŁŁ  ¤¤˛˛……00%% ## $$==““±±ĄĄˇˇŁŁ  §§ĽĽ66%%!!## ''?? ăă´´»»ˇˇŁŁŁŁ¦¦ľľŽŽss5588&&####&&99 ŐU‹‹ąą¦¦ŁŁŁŁ¦¦¸¸µµóó>>&&####!!;;44ccŚŚżż§§  ŁŁˇˇşĄ¶¶””<<'' ##!!%%11††˝˝¤¤  ŁŁ  ĄĄ°°™™22$$ ## $$22™™°°ĄĄ  ŁŁ  ¤¤˝˝††11%%!!## ''<<””¶¶şĄˇˇŁŁ  §§żżŚŚcc44;;!!####&&>>ó󵵸¸¦¦ŁŁŁŁ¦¦ąą‹‹ŐŐ 99&&####&&8855ssŽŽľľ¦¦ŁŁŁŁˇˇ»»´´ăă ??'' &&;;44jjłłĄĄ§§¦¦¤¤ľľµµ——77>>%%%%;;== ““‹‹łłľľąążż±±ŽŽ––jj7733220044áá„„‰‰´´··µµŽŽ‡‡ęęrs bbÁÁëëťť››šš™™““ëëţţPPaabbccddrrBBSS������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/ape-id3v1.mp3��������������������������������������������������������������0000664�0000000�0000000�00000020343�14447736377�0017254�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙űd�đu�=�@��€€"ÜŚ`�1€ @Ś�?ËĽN«(ăř|ráü™ür„ďDO xťűK†ŘĄ2â×ěM˛w”±ę3ęŠĹ•Ż™Qv.Ň ĘsRÄÜ„»î$˙űdŹđyA�Ă� 0�#�¸���4�`Ŕ���ś ADYŞa ^O-c7 šE‘­íbíJ!Sw“uk‹örA%5Ä:´=Í´jwË0l%RPÉn@MD] uŘ•Ń˙űd ŹđoA€`�� €0������=� €���ç[ńÚ[6mŃe´s’|ćŐčÖ !ĆĐ)V®+”Ž -Ż.˝XÚ¤¨4ŞĎąđR«[ˇâŻ"[™”ëK• !Îm‹µ˙űdđj�Á€Ŕ�� 0���¤€��<� Ŕ���ŁÚú=ŤĎ|TóV‹‹YrKăç“>ÍŽľńŔpęu1ĹD{·-ŁÖeRa¶7t‹fĆT×bú)JT*˛˘¤vŠ©Űö¸ű˙űdŹđkB�@���0��Ľ€��=�`Ŕ���P•«”Td˙ˇZOÔáz S–¶—GmĚ=F*=)2g—µ˛K¨ĚŤ´ËęY +ci7ŁbŐpý§yÄnďÂ˙űd ŹđdA€@�� `0���ě���0�a����ĺUĹ^´!6˝´2zö)Şü}Hµ˘:ň]Xą7ÚNqíUÇlđ™ąλcjk„´)h{Řech·čľ…*Ěk€T˙űd(đjA€@�� Ŕ0������8€ €��{T:TäVuÜw0őÇQląKőJ©4ĄŤ8Ů'ŠŐŢ‹á†}D9Ž’ĂűÚ<íÚĚ!ŻcW=ńvŇEÖÇF­âčŁbźJ˙űd/đz�Á€Ŕ��  0���Ŕ€��9� Ŕ���\ĄEŇ7i…îęÇ*˘of81˘›×CQIx˘™˛ç°D1ŰÜ,‡Q,<_/§m ±uŇ,ÁV)öŐJȆݕZůkËU ˙űd6đSB�@�� €0���Ě���7€ €��†o*âikP)¤U1u(“1wR+TÔQÔ t­ë»‹–<Ţ» ˇ˘jď2ŔĹű9ÁNâ¸Ő¸ŞŘ„©üąÇ[ÝJĹ˙űd>đlB�`��` ���ś���5€ Ŕ��� ™ŘµŇĨâ3ś`:4\ęĘČ´"ˇbśY Óž¸«"‚0-d/uďŇĄmgučő„ΔšB(Ů‘ńtĐn”¶á˙űdEđyA€ ��  0�#�¸���4� €ŚHG*°ď¨PŽőęŁĚżębŤ7xx¤ĄĘrűŤm…ŞC—ŮMM÷ţ•¦ç©m*Ěşt ę­A±"(BÍŰT†Ą.?8•şE˙űdKŹđ`�Á€@��Ŕ ���ä���:€ €Hm~Ë©µŚ˝›—2 NPĄŽrYĐŞŤ1E…叼»˝ďŤXĄRîZa°éĄ”˝ŞĆ mVî‹ß˛ĘńŰŇ-Cžö8Řş™˙űdQŹđz�Á€Ŕ�� @0���P@�8€ Ŕ���»InÍ űź*™ÂY#V$ś.ú9ŁŻsgnF‘‚ť˘Ě›?ÔşŁbíRä…\ľVkµo’*ŇU(VâćźIi±Ž{˛˙űdXŹđXA€@�� `0���Ř€��/� Ŕ���,Ş`śrŃ˝¶ MŠvĹX÷ˇşú*<Ö>YLzJ1öץĺ/›;Ň ©ą´µ ]&Řu¨Šp‹+¬ČýCî­±¨ §”˙űdbđz�Á�@��@��t���:� €���:D\©ŰŘ=XY‰´zSsW˘ŐÎN‹}x­^Ăw]!F ďUĚFY×­űÚ$FçĐt‡e Q;1¤F÷!-UPYołL˙űdgŹđt�Á€A�ŕ ��Ľ���4€ Ŕ���ĽÍě jČ6VÓ”*{Űź‘8×^ÚűŹÍ(¤ó“rmÚÂ&‹^±H“XîěRőF¬µKŕAý"Դðč"Ďj˘ů#:* ˙űdmŹđv�Á€Ŕ�� €0���„���2�`Ŕ�Ś�‡ĚŻĘŇaŃr-X‡Ę±+84ΕÇúT1±XqĺǸ’Qs›ş‹醥Ă–ݩKe˛+™ Î]ŃŰęSá*c—RŔ¸˛˙űduđuA€ ��@ �"�Ě���-€ Ŕ���|©A‘uĚ�OŃŢ€řom6˛¦1ć«W�´ŕŐŔϨp®„±řłĎ9˝ XÚѵů¶9}ä©ő$í©KSµ<žÓ¸ĺ•‡ŘňB˙űd|đ`�Â�@�� 0���Ô���5€ ŔŘi´Óu ¶dŤČ5µ·'2ÓhańµęąŽż2ąą$!Ä/& Ép˝4  ”¬vÝZÝcŘçÎ9ĚŞf¶r˙űdŹđf�Á€@��ŕ ��¸���;€`@��ŠÝM93b†ĄR˘qĎŚ]Íą(µu2"*+bŐ­ÇŐ?C\Ť(ts’űŞKÍŐ¨V6ńĂ'ŇŰ]9Ú[h;s‚=ăP˙űd‰ŹđqA€ ��  �����.�`Ŕ��BÇď2ĘŔĹEáL“v<ÍíFŤT!ĎőńĘĎ©$%sĎŤmňN›ş—±”´şĹwŐóôzj Ó` LĆ$´Ňúř`Sqcb˙űd‘ŹđoA€ ��Ŕ �#�°€��=€ €���Ë0FŹť?ˇÉxņú^aW+5B.c›HyŁĽVĄçŞ)Bބҩ4U  ňŮŰsYz!㏋Źć]őja{†ë®Öł`6p˙űd—đ^A€`�� ` ��Ľ���9�`Ŕ��p­KP¦ĺ©lw4ŰiĐŢĆČ=Ç [qUJ1*«rv_•®Ą\×V…j”EÚ.ç"íذ°ě†şŽ+Ї lŇ‘ÎÁn`˙űdžŹđdA€@�� @ ��Ř@�=�`€��Ćş#kQŻqĺUĄ)8Yëšă¦ĐşQąIöĺ…Ë4 wšUk’….MÖ RÓüË ¤ĺăÎ5;ßY;R‹ÎäŚ˙űdĄđz�Á�Ŕ��  0��� €��;€ €��� ľ•±ŹE˛жäz†¦QuVüŁTşqW9ަv ^®Ř±•¦}ăN­~HX”ň¸|˛\¤6łŠJŻyyNg0ÉU˙űdŞŹđu�Á�Ŕ�� `@���Đ���+�!����™Íě˛E5ťNb2@m† 9HFÖG.9WlutÉBiÂhU†Ą• ©KÖ­3N¬2‡ 1şo ŰčÎ- #Š˝Í{S˙űd´đfA� ��`0��ä€��3€ Ŕ���zǦć^Tľ©Čkő QÂMIűć(M@@ε°xžsË 4ą§uk=DÇPŇË~ć5ˇ3‚FŇW`ĺTx[©<˙űdşđzA� �� €0���č€��1€`Ŕ���ÁĘŁ“#AMoěc.ĘŞIKnÁč±5P4«Š5+8?em¸×ś·Y˙Ńww¶1śĆqĐ@Ô$ŐŇT)Ůq.…żŠ˙űdŔŹđ\B�`�� 0���¸���;�`€��ąMBśp™*PĽÉ«ÖŠiN¶7ú*Ôd^D|« aţĄíŇź(F~h[ţűzQŻHŞőÁÄÍ­Hi÷Şy…†"˙űdÇŹđsA�`�� Ŕ ��ä���7�`Ŕ��Ezűv˙µ*źS{Ż^Č[byżžŇU ±Šk C'™Ňí-[V¤HVQO?UB‰QQWˇĚ‰M (7fA®pbŲŇä1w”ś Y’˙űdÍŹđiA€ ���0���´���7€`€���ą0“ˇš4ÜB†č4U–­[«ÎdŢă7ű&?Ä%s›Ů’6|”ÚG| Ŕ1/k{&Ńó]iăËĄ÷)G‚hl6>ć6˙űdÔđgA�Ŕ�� Ŕ #&¸€��<� €���Ô(kŃěrčśůqÎt¸)–)ŕG©»§ yňN ĽŃJälz… €¬C†µŞ)Ň’Ęą3* 7Ż©9‡˘x„˙űdŰđrA€ ���@���¬���3€ Ŕ��h«­ą(¨UĆš´›,rµ ÚEËęĎĐĐT7—_۰}L)¶¬!™!˛IŠľä;§ć˙˙đěIĂfw›Ő=pÁ^íS Żß_ú˙űdáŹđo�Á€Ŕ���0���ŕ���-�a����mťWI¦n ž‰¬ŤqŃ­ =gŃë—yÓ+0VĚŞ'LĚ9 (ÖµHs÷oZ‡kklłhžÁ0Ź‚˘î,ĘT>ç˙űdčđ†�Á�@�� �#�Ař���9€`€���«–YĚŽ­ŰüŰ\“fmy$'îĹôŠ@ĂWÔHbF¨b´‹VŔ«yá˘ÚŚqšÁeÜl«¬)É Ég čj’¬˙űdéđˇ�Ŕ�ŕ���c�B(���G�`@�Śz'Ú8jF@,Í Z•Y&î&BrVŽŁI¨Ëĺ킡˙gů×Úó­?ů]´“}vţŹŻwóŮo:-Ď[<R±`ŕ˙űdćđyA€ �� 0#8�„@�8€`€��dI›*Tčµ Ř’@’Ď„ę(ęĄ!“µrP•Ăůé:ŤtTPŔU[Ňó‡Đ°ęuÍ~ě&$>‡8V°Jč˙űdéđˇ�Ŕ€Á ���Aü`�?� @±‡1i2™ŠŢi¶y‘/Żé9µqř]Şé·“ŽUB ˇLË™8bF@˙SXÇ2Çr¶ýË«wŞą~xÓyĂ˙űdçŹđŤ�Á�Ŕ��  ���°���C�`€���wlxš:i×LĽď)ž®­˙_Ęöą d(ĐŰfcĺSIKiŇÚ†ť&ç”á=AďÝ׳mŐďúR˙©_|(eô»˙űdčŹđś@€ �Ŕ���B<@?�`@�Ś�tÝĎŇý ;LôéíĹĹ&„jÎ˙µV©ż˝řŽ÷ę‘yŹ#<NjkŤß’ż“»nř¨_hˇőť—=Vç¦L–cZÖ$C˙űdçđ}�Á€Ŕ��  #&P)D€D€`@��R]sźq%­kÜÖ˘Îü9źč›KŞŮËĹűÝ—Eŕń~ AÓűű•<‰”ÍtÖ¨“›óAÝä…Ą/4ZzM©K·˝,z¨2˙űdçŹđŠA�Ŕ��ŕ#8„@�?€ €��ĽäË˝±Ë{é¬<l|Ť?hu>öř˙˛3|2m‰×bÎb6ST™Ă™ vm <˘eÍ(d6äÎĐë>*ÇL…˙űdčđ�Á�Ŕ�� ���B\�@H€ŔŚŕxĽűĐ(Ĺ'‰ěp±(Ĺ ţ—iĘÔĎŘ^ů¶íŻôZîYÍNF 9Î<Ŕćo!’˘dŘ}µ˝ę­ŐT\e-B´˙űdćŹđ‰A�Á�` �"�`�A�`@��qA!öÖ€şř€űŚö(–ĄÎ}’íyłĂ V4<×Gtďăâ3yM{G¤×»Ű÷ďżĐďk+:ĄĄílgĎ%M&˙űdçŹđwA�Ŕ��Ŕ #8\€�L� @Ś™ĄŻ—v틨Ü˙>ď5Š Ö^çA×)¬xf.łŹpň蕺”n÷Jšk”*X|­Śukť–°h}®&Ę˙űdćđj�Á�Ŕ��  �#�P„`H€`@�?”ú˙íŻîžl5=ŁF’Č÷Ťö©ű93/`¨đ˘t¬Ižiő&‡4ŕ͇śÓaQŘr¬Ë__˙á{™˘ÖP’Éýď®˙űdçŹđ’�Ŕ€Á � #8AĚ`�4�`ŔŚ�,1{ o:+Őiůle.YnĘ ľýţB¦Ąâ)ÎVdąř¨V2R.Éyă˸^ńďXĐ÷-üßsëĹĎţÖgĐŃĘżQ¶Ţ˙űdéŹđź�Ŕ€Á`��AŘ€��:€`€���ŕkíĽŕÜrüFRNú´;vuéHŽeč8âC§-6*ôŻI·ťlxH<+śˇđ˝lq÷“L°|貔p9—r»KÖظˇ˙űdéđź@�Â7đ#$Č �E€`@��čÁ˘;ڍ}őŢLđPF‹Í‡’ ňc€ŹŚLµcZö˛F«±V¦S:™ęVúޛà ‘:4*©ÔĎ&⬏m@ç˙űdčđ–@€ˇ`��� €��C€`€��.Ź]ýPËňűťÍÚí iËüµUĂM2¶°s™ŮTŁ0óq ‡ęĄ i0ś0+&©ctdC˝´4„dYö´hQĚ"–źŹ ˙űdçđŤ@€Á�ŕ���B ���G�`��Ś˙ÉFeőˇÚ»źĚż÷öUU |„[ő,a›©ŔÂĂRmj"lŮÁ Âţˇ2‹<7Hôˇ[2¶w2ÄŠ<ĺŇuJ˙űdćŹđ‹@€ˇ�@ #8���I� @��ĹÂN*Ná‡ĎĂe‰´ű©<Ť}’Ů^qG_÷˝ŻQ˛.î/MËĂÖáy’źťů};(˛Bäs.&RЬ˙űdćŹđ~�Á�@��Ŕ ��8��N€ �Śác…¸Î]űZ˛çüçxŮ)őjmŠ6…ÓöDäśňşleÎ(At:Ą w‹¶)SEŠt4\9ô5h{…Ž»śuOAěQ !˙űdçđmA€ ��� #8h��H� @ ™»:®IőgŢ‚©YęY;‹áő* Ł}ܶę˙l˙Iîr.;Wµw¤™{ŢüĽF=/ł› ›íëëŇ=ÔáÉMCşä˙Ű˙űdçđŚA� ��  #$ ���I� @��µöÇeőG˝†&›/ň§jĘď7µ Ş(Ęš_](y¤9 “bË(Ë“÷.ăhˇRěSâˇ‹ë ” k>,Fó Xöjq•PlŁ˙űdćŹđŚA� �� €0���T€��J� @��Ö&ŠTÖ´w&ŤigE”•›2lôśď¸]âűHkĹĹçuąuĹ%Ô‰4€5™ŘÔĽx„¨©ęŮ™,ŁëY˙űdćđ‡�Á�Ŕ��` �"����F� @�ÇŠ(ĂĘžŞÁšPm—¨šUF­¦@î“*v•ˇđ·JąĎ˙C†±ˇŹ7öýwl;´x`v'.X÷"e©gŚ8‡1×˙űdçŹđŹ@€Á�Ŕ"8Č€��D€ @���®.†Ąo&•SdÉ­Ąő"…Ę+Ť]"€'®×ˇéyh ...úÄlŐP¤ÉĐâ)C>·AXĂĹSj”Htˇ‹XČ˙űdčđ—�Ŕ�ÁAČ�#&B$���F�`@�ŚÁÁ—!aÎş^YĘ%°«ŐϵC“(µ [“uB7ąkCbŢ]Ej)Zy işA&ˇ=*ŕ—śÇ˙+i°˙÷sO‘’˙űdćđ~�Á�Ŕ��� ���D����I� @��ń¦ýRü–<Żí›6ÚN-Ţý/ŘßŰ€łŢ÷;,ďť?'jYMÝóŔĘBńBŕŦđÇČ^ˇ’OJV¨ięéMÁĹ˙űdćđA�ˇ 0���\€�J� €�Ś«×qnat9B† QzU ˝.*4¬ąIrô©ÍäÁ9<ďu•Ś÷źÇöoĆf–~üu±b+¦<†É”­CÔô-);O˙űdćđ~A€ ��@0��€��?€`€�Ś�€HB\ě)KÓmUE‰Ş ¦˘Ěm盡 ˘\Xc¨U©)ŚRJbłČQ‘"…Ů\(<:ő§>ŢÎX(äY_eµ—ţýŠ˙űdçŹđ…�Á�Á�` �� @�E� €ŕős­ëâ-^×8›ţyČsţKĐëŐ!âqV d:Ż‚đ@(BRĄ)Ź`ë7,ŔäsÝ8¤ŽCaf%&ˇ\ÓM Ň™¦¤řń˙űdčđ“�Á�Ŕ��@��c�B$���<€`€���ěR[O*YŐ+©áT9Š<µ„Ě�vĺ)™iů‹Wj×+něyí÷¸uôkš1朗˙k8Ë;,k«v»Ż}ť¬?9_l˙űdçŹđŹA�Ŕ��€ ���$���E€ €ęrŕ>Ol˙]ÚąĎ˙~»ö¤‰ *–ĄÎzXA‚×µ. JE­ń–”§LBjÔŠm,L> ź˙G´{żˇz‘M÷Ő3Ő­7˙űdçđ}�Á€@��  ��p`M�`�Ś"o㯉wČ™6ďĚsŁâ×Úzűń}Ű ›KĹfć¨( SIsÝĽńł`v­ÓlYAˇč‰&Ў«P]Uâ“éĹEÇ.®˙űdćŹđŽ�Á�Ŕ�`#&ŕ€��@€ €��mţď™F mô|öMmáQ7żRč;A-ŢĺEkDŁźEÚ»5Łúç[îtŽjwSźţ˙˝hCbŽI±ű‡ľ×8Í_BĹ˙űdçŹđŚA� ��€ ���B @�D€`@Ś�s+;)É˙ĺ3gÓ­DďîŞ ăo\ŤkxFaęe‹E`Píjóti§kă™Č˙Fiąż¸J¨őĽr źhĄ­qŽqZŞU˙űdçŹđA� ��Ŕ���P`J€ @Ś™\t-»öÝű{µßonAĹšř[Z©ězw°šŇÚí] ű)SóL"Ň0_:yŤ?RÖƤp˝o%–ľŮoŢwľřëxůRä‰i˙űdćŹđŠ�Ŕ€Á�ŕ ���(@�@€ €���;Ëío-•ć)żdꦾ®y2U”° ˛zB‘fśQ÷• őÔ˛¶H׹'Ô¶0‘,őÓfŁGŠ6RĚ™řT“śTRŐ7¨Ď˙űdçđ@€Á�� ��BD��H€ @��9 0üvP‰W6A›N˘ĄŔuŚ‘ÝéýÜf—żÁĆm( Órî·†ť-íÍx5Z˝ĚuÄÔY#¦€nÂʽ̎b@˙űdćđA�@�� `���8€�L�`@��“ádŹ�ĄbĘDăÉ-€‚Š|r$$X„˘JPő-ČYČ“2µ„Ţ9­>äI¬T7bćŤĚkČŹĆ)J:u˙űdćŹđ�Á€@��@��$���I� €��jAĂ/¨._ZŇ0ŕXY—\§©JĆ5ŠĹŇ*ck ŤqΕ°k73}ŻMUü±ßí—ýߺǨQҒ𠶸XŞ —˙űdçđuA€Ŕ��Ŕ ���Ař„@�H€`@�Ş=ťk!·gö\Ô/d,fú†g‘19Ô­ <µHÔ,!y!ş˙vŕp±"v1b€I€íýnüMööósŮw>¦×żýt˙űdçŹđ…�Á�Ŕ����"�B @�H€ @�/úMcÔ2Gń~­MýŹ ÂPçýřńjÜÖĹ]Ţ4iu´`pAP˛B]1±é/Ř75A�ÝR%QŤŢ€š<ŃÂŹxUë˙űdçđpA€Ŕ��Ŕ @�p@L€`�Ś Ĺép¸ĘŕvĎ8ů…Ťb*Ó˛yĂŔ NöĐöŽCĐOĎŁRcŤ”â;oýoµşĆAÝÔ¤Ě}Łš8sg^Xj_±˙űdćŹđŚA�Ŕ��Ŕ �#�Đ`�?�`@��#‘iÂ2€V´t–2“ŹKÚ…¦°Yas$Aık9ö©ÚĘ )g/«0÷ŃţîwÝG_Ý5Üt‹aúÇ ŁŠĄc…Ş6„Ö˙űdčŹđ—�Ŕ€á@đ#�B$„`�F�`@Ś�ˇU!ĺ.=—±Śj©]ę| ów‚8Ü[·e)»l^Žźl‰IĆDp›U’UrŃÓŁ+UŃ­óŚ3†ŔŠľ5e)r7ąË6<óÜ˙űdćđŠ�Á�Ŕ��€ "�€��E� @��yOóĺ´Xing����B@�B@APETAGEXĐ��3��������� ���������������TITLE�TitleAPETAGEXĐ��3���������€��������TAGTitle�����������������������������������������������������������������������������������������������������������������������˙���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/ape-id3v2.mp3��������������������������������������������������������������0000664�0000000�0000000�00000022175�14447736377�0017262�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����TIT2������Title����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙űd�đu�=�@��€€"ÜŚ`�1€ @Ś�?ËĽN«(ăř|ráü™ür„ďDO xťűK†ŘĄ2â×ěM˛w”±ę3ęŠĹ•Ż™Qv.Ň ĘsRÄÜ„»î$˙űdŹđyA�Ă� 0�#�¸���4�`Ŕ���ś ADYŞa ^O-c7 šE‘­íbíJ!Sw“uk‹örA%5Ä:´=Í´jwË0l%RPÉn@MD] uŘ•Ń˙űd ŹđoA€`�� €0������=� €���ç[ńÚ[6mŃe´s’|ćŐčÖ !ĆĐ)V®+”Ž -Ż.˝XÚ¤¨4ŞĎąđR«[ˇâŻ"[™”ëK• !Îm‹µ˙űdđj�Á€Ŕ�� 0���¤€��<� Ŕ���ŁÚú=ŤĎ|TóV‹‹YrKăç“>ÍŽľńŔpęu1ĹD{·-ŁÖeRa¶7t‹fĆT×bú)JT*˛˘¤vŠ©Űö¸ű˙űdŹđkB�@���0��Ľ€��=�`Ŕ���P•«”Td˙ˇZOÔáz S–¶—GmĚ=F*=)2g—µ˛K¨ĚŤ´ËęY +ci7ŁbŐpý§yÄnďÂ˙űd ŹđdA€@�� `0���ě���0�a����ĺUĹ^´!6˝´2zö)Şü}Hµ˘:ň]Xą7ÚNqíUÇlđ™ąλcjk„´)h{Řech·čľ…*Ěk€T˙űd(đjA€@�� Ŕ0������8€ €��{T:TäVuÜw0őÇQląKőJ©4ĄŤ8Ů'ŠŐŢ‹á†}D9Ž’ĂűÚ<íÚĚ!ŻcW=ńvŇEÖÇF­âčŁbźJ˙űd/đz�Á€Ŕ��  0���Ŕ€��9� Ŕ���\ĄEŇ7i…îęÇ*˘of81˘›×CQIx˘™˛ç°D1ŰÜ,‡Q,<_/§m ±uŇ,ÁV)öŐJȆݕZůkËU ˙űd6đSB�@�� €0���Ě���7€ €��†o*âikP)¤U1u(“1wR+TÔQÔ t­ë»‹–<Ţ» ˇ˘jď2ŔĹű9ÁNâ¸Ő¸ŞŘ„©üąÇ[ÝJĹ˙űd>đlB�`��` ���ś���5€ Ŕ��� ™ŘµŇĨâ3ś`:4\ęĘČ´"ˇbśY Óž¸«"‚0-d/uďŇĄmgučő„ΔšB(Ů‘ńtĐn”¶á˙űdEđyA€ ��  0�#�¸���4� €ŚHG*°ď¨PŽőęŁĚżębŤ7xx¤ĄĘrűŤm…ŞC—ŮMM÷ţ•¦ç©m*Ěşt ę­A±"(BÍŰT†Ą.?8•şE˙űdKŹđ`�Á€@��Ŕ ���ä���:€ €Hm~Ë©µŚ˝›—2 NPĄŽrYĐŞŤ1E…叼»˝ďŤXĄRîZa°éĄ”˝ŞĆ mVî‹ß˛ĘńŰŇ-Cžö8Řş™˙űdQŹđz�Á€Ŕ�� @0���P@�8€ Ŕ���»InÍ űź*™ÂY#V$ś.ú9ŁŻsgnF‘‚ť˘Ě›?ÔşŁbíRä…\ľVkµo’*ŇU(VâćźIi±Ž{˛˙űdXŹđXA€@�� `0���Ř€��/� Ŕ���,Ş`śrŃ˝¶ MŠvĹX÷ˇşú*<Ö>YLzJ1öץĺ/›;Ň ©ą´µ ]&Řu¨Šp‹+¬ČýCî­±¨ §”˙űdbđz�Á�@��@��t���:� €���:D\©ŰŘ=XY‰´zSsW˘ŐÎN‹}x­^Ăw]!F ďUĚFY×­űÚ$FçĐt‡e Q;1¤F÷!-UPYołL˙űdgŹđt�Á€A�ŕ ��Ľ���4€ Ŕ���ĽÍě jČ6VÓ”*{Űź‘8×^ÚűŹÍ(¤ó“rmÚÂ&‹^±H“XîěRőF¬µKŕAý"Դðč"Ďj˘ů#:* ˙űdmŹđv�Á€Ŕ�� €0���„���2�`Ŕ�Ś�‡ĚŻĘŇaŃr-X‡Ę±+84ΕÇúT1±XqĺǸ’Qs›ş‹醥Ă–ݩKe˛+™ Î]ŃŰęSá*c—RŔ¸˛˙űduđuA€ ��@ �"�Ě���-€ Ŕ���|©A‘uĚ�OŃŢ€řom6˛¦1ć«W�´ŕŐŔϨp®„±řłĎ9˝ XÚѵů¶9}ä©ő$í©KSµ<žÓ¸ĺ•‡ŘňB˙űd|đ`�Â�@�� 0���Ô���5€ ŔŘi´Óu ¶dŤČ5µ·'2ÓhańµęąŽż2ąą$!Ä/& Ép˝4  ”¬vÝZÝcŘçÎ9ĚŞf¶r˙űdŹđf�Á€@��ŕ ��¸���;€`@��ŠÝM93b†ĄR˘qĎŚ]Íą(µu2"*+bŐ­ÇŐ?C\Ť(ts’űŞKÍŐ¨V6ńĂ'ŇŰ]9Ú[h;s‚=ăP˙űd‰ŹđqA€ ��  �����.�`Ŕ��BÇď2ĘŔĹEáL“v<ÍíFŤT!ĎőńĘĎ©$%sĎŤmňN›ş—±”´şĹwŐóôzj Ó` LĆ$´Ňúř`Sqcb˙űd‘ŹđoA€ ��Ŕ �#�°€��=€ €���Ë0FŹť?ˇÉxņú^aW+5B.c›HyŁĽVĄçŞ)Bބҩ4U  ňŮŰsYz!㏋Źć]őja{†ë®Öł`6p˙űd—đ^A€`�� ` ��Ľ���9�`Ŕ��p­KP¦ĺ©lw4ŰiĐŢĆČ=Ç [qUJ1*«rv_•®Ą\×V…j”EÚ.ç"íذ°ě†şŽ+Ї lŇ‘ÎÁn`˙űdžŹđdA€@�� @ ��Ř@�=�`€��Ćş#kQŻqĺUĄ)8Yëšă¦ĐşQąIöĺ…Ë4 wšUk’….MÖ RÓüË ¤ĺăÎ5;ßY;R‹ÎäŚ˙űdĄđz�Á�Ŕ��  0��� €��;€ €��� ľ•±ŹE˛жäz†¦QuVüŁTşqW9ަv ^®Ř±•¦}ăN­~HX”ň¸|˛\¤6łŠJŻyyNg0ÉU˙űdŞŹđu�Á�Ŕ�� `@���Đ���+�!����™Íě˛E5ťNb2@m† 9HFÖG.9WlutÉBiÂhU†Ą• ©KÖ­3N¬2‡ 1şo ŰčÎ- #Š˝Í{S˙űd´đfA� ��`0��ä€��3€ Ŕ���zǦć^Tľ©Čkő QÂMIűć(M@@ε°xžsË 4ą§uk=DÇPŇË~ć5ˇ3‚FŇW`ĺTx[©<˙űdşđzA� �� €0���č€��1€`Ŕ���ÁĘŁ“#AMoěc.ĘŞIKnÁč±5P4«Š5+8?em¸×ś·Y˙Ńww¶1śĆqĐ@Ô$ŐŇT)Ůq.…żŠ˙űdŔŹđ\B�`�� 0���¸���;�`€��ąMBśp™*PĽÉ«ÖŠiN¶7ú*Ôd^D|« aţĄíŇź(F~h[ţűzQŻHŞőÁÄÍ­Hi÷Şy…†"˙űdÇŹđsA�`�� Ŕ ��ä���7�`Ŕ��Ezűv˙µ*źS{Ż^Č[byżžŇU ±Šk C'™Ňí-[V¤HVQO?UB‰QQWˇĚ‰M (7fA®pbŲŇä1w”ś Y’˙űdÍŹđiA€ ���0���´���7€`€���ą0“ˇš4ÜB†č4U–­[«ÎdŢă7ű&?Ä%s›Ů’6|”ÚG| Ŕ1/k{&Ńó]iăËĄ÷)G‚hl6>ć6˙űdÔđgA�Ŕ�� Ŕ #&¸€��<� €���Ô(kŃěrčśůqÎt¸)–)ŕG©»§ yňN ĽŃJälz… €¬C†µŞ)Ň’Ęą3* 7Ż©9‡˘x„˙űdŰđrA€ ���@���¬���3€ Ŕ��h«­ą(¨UĆš´›,rµ ÚEËęĎĐĐT7—_۰}L)¶¬!™!˛IŠľä;§ć˙˙đěIĂfw›Ő=pÁ^íS Żß_ú˙űdáŹđo�Á€Ŕ���0���ŕ���-�a����mťWI¦n ž‰¬ŤqŃ­ =gŃë—yÓ+0VĚŞ'LĚ9 (ÖµHs÷oZ‡kklłhžÁ0Ź‚˘î,ĘT>ç˙űdčđ†�Á�@�� �#�Ař���9€`€���«–YĚŽ­ŰüŰ\“fmy$'îĹôŠ@ĂWÔHbF¨b´‹VŔ«yá˘ÚŚqšÁeÜl«¬)É Ég čj’¬˙űdéđˇ�Ŕ�ŕ���c�B(���G�`@�Śz'Ú8jF@,Í Z•Y&î&BrVŽŁI¨Ëĺ킡˙gů×Úó­?ů]´“}vţŹŻwóŮo:-Ď[<R±`ŕ˙űdćđyA€ �� 0#8�„@�8€`€��dI›*Tčµ Ř’@’Ď„ę(ęĄ!“µrP•Ăůé:ŤtTPŔU[Ňó‡Đ°ęuÍ~ě&$>‡8V°Jč˙űdéđˇ�Ŕ€Á ���Aü`�?� @±‡1i2™ŠŢi¶y‘/Żé9µqř]Şé·“ŽUB ˇLË™8bF@˙SXÇ2Çr¶ýË«wŞą~xÓyĂ˙űdçŹđŤ�Á�Ŕ��  ���°���C�`€���wlxš:i×LĽď)ž®­˙_Ęöą d(ĐŰfcĺSIKiŇÚ†ť&ç”á=AďÝ׳mŐďúR˙©_|(eô»˙űdčŹđś@€ �Ŕ���B<@?�`@�Ś�tÝĎŇý ;LôéíĹĹ&„jÎ˙µV©ż˝řŽ÷ę‘yŹ#<NjkŤß’ż“»nř¨_hˇőť—=Vç¦L–cZÖ$C˙űdçđ}�Á€Ŕ��  #&P)D€D€`@��R]sźq%­kÜÖ˘Îü9źč›KŞŮËĹűÝ—Eŕń~ AÓűű•<‰”ÍtÖ¨“›óAÝä…Ą/4ZzM©K·˝,z¨2˙űdçŹđŠA�Ŕ��ŕ#8„@�?€ €��ĽäË˝±Ë{é¬<l|Ť?hu>öř˙˛3|2m‰×bÎb6ST™Ă™ vm <˘eÍ(d6äÎĐë>*ÇL…˙űdčđ�Á�Ŕ�� ���B\�@H€ŔŚŕxĽűĐ(Ĺ'‰ěp±(Ĺ ţ—iĘÔĎŘ^ů¶íŻôZîYÍNF 9Î<Ŕćo!’˘dŘ}µ˝ę­ŐT\e-B´˙űdćŹđ‰A�Á�` �"�`�A�`@��qA!öÖ€şř€űŚö(–ĄÎ}’íyłĂ V4<×Gtďăâ3yM{G¤×»Ű÷ďżĐďk+:ĄĄílgĎ%M&˙űdçŹđwA�Ŕ��Ŕ #8\€�L� @Ś™ĄŻ—v틨Ü˙>ď5Š Ö^çA×)¬xf.łŹpň蕺”n÷Jšk”*X|­Śukť–°h}®&Ę˙űdćđj�Á�Ŕ��  �#�P„`H€`@�?”ú˙íŻîžl5=ŁF’Č÷Ťö©ű93/`¨đ˘t¬Ižiő&‡4ŕ͇śÓaQŘr¬Ë__˙á{™˘ÖP’Éýď®˙űdçŹđ’�Ŕ€Á � #8AĚ`�4�`ŔŚ�,1{ o:+Őiůle.YnĘ ľýţB¦Ąâ)ÎVdąř¨V2R.Éyă˸^ńďXĐ÷-üßsëĹĎţÖgĐŃĘżQ¶Ţ˙űdéŹđź�Ŕ€Á`��AŘ€��:€`€���ŕkíĽŕÜrüFRNú´;vuéHŽeč8âC§-6*ôŻI·ťlxH<+śˇđ˝lq÷“L°|貔p9—r»KÖظˇ˙űdéđź@�Â7đ#$Č �E€`@��čÁ˘;ڍ}őŢLđPF‹Í‡’ ňc€ŹŚLµcZö˛F«±V¦S:™ęVúޛà ‘:4*©ÔĎ&⬏m@ç˙űdčđ–@€ˇ`��� €��C€`€��.Ź]ýPËňűťÍÚí iËüµUĂM2¶°s™ŮTŁ0óq ‡ęĄ i0ś0+&©ctdC˝´4„dYö´hQĚ"–źŹ ˙űdçđŤ@€Á�ŕ���B ���G�`��Ś˙ÉFeőˇÚ»źĚż÷öUU |„[ő,a›©ŔÂĂRmj"lŮÁ Âţˇ2‹<7Hôˇ[2¶w2ÄŠ<ĺŇuJ˙űdćŹđ‹@€ˇ�@ #8���I� @��ĹÂN*Ná‡ĎĂe‰´ű©<Ť}’Ů^qG_÷˝ŻQ˛.î/MËĂÖáy’źťů};(˛Bäs.&RЬ˙űdćŹđ~�Á�@��Ŕ ��8��N€ �Śác…¸Î]űZ˛çüçxŮ)őjmŠ6…ÓöDäśňşleÎ(At:Ą w‹¶)SEŠt4\9ô5h{…Ž»śuOAěQ !˙űdçđmA€ ��� #8h��H� @ ™»:®IőgŢ‚©YęY;‹áő* Ł}ܶę˙l˙Iîr.;Wµw¤™{ŢüĽF=/ł› ›íëëŇ=ÔáÉMCşä˙Ű˙űdçđŚA� ��  #$ ���I� @��µöÇeőG˝†&›/ň§jĘď7µ Ş(Ęš_](y¤9 “bË(Ë“÷.ăhˇRěSâˇ‹ë ” k>,Fó Xöjq•PlŁ˙űdćŹđŚA� �� €0���T€��J� @��Ö&ŠTÖ´w&ŤigE”•›2lôśď¸]âűHkĹĹçuąuĹ%Ô‰4€5™ŘÔĽx„¨©ęŮ™,ŁëY˙űdćđ‡�Á�Ŕ��` �"����F� @�ÇŠ(ĂĘžŞÁšPm—¨šUF­¦@î“*v•ˇđ·JąĎ˙C†±ˇŹ7öýwl;´x`v'.X÷"e©gŚ8‡1×˙űdçŹđŹ@€Á�Ŕ"8Č€��D€ @���®.†Ąo&•SdÉ­Ąő"…Ę+Ť]"€'®×ˇéyh ...úÄlŐP¤ÉĐâ)C>·AXĂĹSj”Htˇ‹XČ˙űdčđ—�Ŕ�ÁAČ�#&B$���F�`@�ŚÁÁ—!aÎş^YĘ%°«ŐϵC“(µ [“uB7ąkCbŢ]Ej)Zy işA&ˇ=*ŕ—śÇ˙+i°˙÷sO‘’˙űdćđ~�Á�Ŕ��� ���D����I� @��ń¦ýRü–<Żí›6ÚN-Ţý/ŘßŰ€łŢ÷;,ďť?'jYMÝóŔĘBńBŕŦđÇČ^ˇ’OJV¨ięéMÁĹ˙űdćđA�ˇ 0���\€�J� €�Ś«×qnat9B† QzU ˝.*4¬ąIrô©ÍäÁ9<ďu•Ś÷źÇöoĆf–~üu±b+¦<†É”­CÔô-);O˙űdćđ~A€ ��@0��€��?€`€�Ś�€HB\ě)KÓmUE‰Ş ¦˘Ěm盡 ˘\Xc¨U©)ŚRJbłČQ‘"…Ů\(<:ő§>ŢÎX(äY_eµ—ţýŠ˙űdçŹđ…�Á�Á�` �� @�E� €ŕős­ëâ-^×8›ţyČsţKĐëŐ!âqV d:Ż‚đ@(BRĄ)Ź`ë7,ŔäsÝ8¤ŽCaf%&ˇ\ÓM Ň™¦¤řń˙űdčđ“�Á�Ŕ��@��c�B$���<€`€���ěR[O*YŐ+©áT9Š<µ„Ě�vĺ)™iů‹Wj×+něyí÷¸uôkš1朗˙k8Ë;,k«v»Ż}ť¬?9_l˙űdçŹđŹA�Ŕ��€ ���$���E€ €ęrŕ>Ol˙]ÚąĎ˙~»ö¤‰ *–ĄÎzXA‚×µ. JE­ń–”§LBjÔŠm,L> ź˙G´{żˇz‘M÷Ő3Ő­7˙űdçđ}�Á€@��  ��p`M�`�Ś"o㯉wČ™6ďĚsŁâ×Úzűń}Ű ›KĹfć¨( SIsÝĽńł`v­ÓlYAˇč‰&Ў«P]Uâ“éĹEÇ.®˙űdćŹđŽ�Á�Ŕ�`#&ŕ€��@€ €��mţď™F mô|öMmáQ7żRč;A-ŢĺEkDŁźEÚ»5Łúç[îtŽjwSźţ˙˝hCbŽI±ű‡ľ×8Í_BĹ˙űdçŹđŚA� ��€ ���B @�D€`@Ś�s+;)É˙ĺ3gÓ­DďîŞ ăo\ŤkxFaęe‹E`Píjóti§kă™Č˙Fiąż¸J¨őĽr źhĄ­qŽqZŞU˙űdçŹđA� ��Ŕ���P`J€ @Ś™\t-»öÝű{µßonAĹšř[Z©ězw°šŇÚí] ű)SóL"Ň0_:yŤ?RÖƤp˝o%–ľŮoŢwľřëxůRä‰i˙űdćŹđŠ�Ŕ€Á�ŕ ���(@�@€ €���;Ëío-•ć)żdꦾ®y2U”° ˛zB‘fśQ÷• őÔ˛¶H׹'Ô¶0‘,őÓfŁGŠ6RĚ™řT“śTRŐ7¨Ď˙űdçđ@€Á�� ��BD��H€ @��9 0üvP‰W6A›N˘ĄŔuŚ‘ÝéýÜf—żÁĆm( Órî·†ť-íÍx5Z˝ĚuÄÔY#¦€nÂʽ̎b@˙űdćđA�@�� `���8€�L�`@��“ádŹ�ĄbĘDăÉ-€‚Š|r$$X„˘JPő-ČYČ“2µ„Ţ9­>äI¬T7bćŤĚkČŹĆ)J:u˙űdćŹđ�Á€@��@��$���I� €��jAĂ/¨._ZŇ0ŕXY—\§©JĆ5ŠĹŇ*ck ŤqΕ°k73}ŻMUü±ßí—ýߺǨQҒ𠶸XŞ —˙űdçđuA€Ŕ��Ŕ ���Ař„@�H€`@�Ş=ťk!·gö\Ô/d,fú†g‘19Ô­ <µHÔ,!y!ş˙vŕp±"v1b€I€íýnüMööósŮw>¦×żýt˙űdçŹđ…�Á�Ŕ����"�B @�H€ @�/úMcÔ2Gń~­MýŹ ÂPçýřńjÜÖĹ]Ţ4iu´`pAP˛B]1±é/Ř75A�ÝR%QŤŢ€š<ŃÂŹxUë˙űdçđpA€Ŕ��Ŕ @�p@L€`�Ś Ĺép¸ĘŕvĎ8ů…Ťb*Ó˛yĂŔ NöĐöŽCĐOĎŁRcŤ”â;oýoµşĆAÝÔ¤Ě}Łš8sg^Xj_±˙űdćŹđŚA�Ŕ��Ŕ �#�Đ`�?�`@��#‘iÂ2€V´t–2“ŹKÚ…¦°Yas$Aık9ö©ÚĘ )g/«0÷ŃţîwÝG_Ý5Üt‹aúÇ ŁŠĄc…Ş6„Ö˙űdčŹđ—�Ŕ€á@đ#�B$„`�F�`@Ś�ˇU!ĺ.=—±Śj©]ę| ów‚8Ü[·e)»l^Žźl‰IĆDp›U’UrŃÓŁ+UŃ­óŚ3†ŔŠľ5e)r7ąË6<óÜ˙űdćđŠ�Á�Ŕ��€ "�€��E� @��yOóĺ´Xing����B@�B@APETAGEXĐ��3��������� ���������������TITLE�TitleAPETAGEXĐ��3���������€�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/ape.mp3��������������������������������������������������������������������0000664�0000000�0000000�00000020143�14447736377�0016326�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙űd�đu�=�@��€€"ÜŚ`�1€ @Ś�?ËĽN«(ăř|ráü™ür„ďDO xťűK†ŘĄ2â×ěM˛w”±ę3ęŠĹ•Ż™Qv.Ň ĘsRÄÜ„»î$˙űdŹđyA�Ă� 0�#�¸���4�`Ŕ���ś ADYŞa ^O-c7 šE‘­íbíJ!Sw“uk‹örA%5Ä:´=Í´jwË0l%RPÉn@MD] uŘ•Ń˙űd ŹđoA€`�� €0������=� €���ç[ńÚ[6mŃe´s’|ćŐčÖ !ĆĐ)V®+”Ž -Ż.˝XÚ¤¨4ŞĎąđR«[ˇâŻ"[™”ëK• !Îm‹µ˙űdđj�Á€Ŕ�� 0���¤€��<� Ŕ���ŁÚú=ŤĎ|TóV‹‹YrKăç“>ÍŽľńŔpęu1ĹD{·-ŁÖeRa¶7t‹fĆT×bú)JT*˛˘¤vŠ©Űö¸ű˙űdŹđkB�@���0��Ľ€��=�`Ŕ���P•«”Td˙ˇZOÔáz S–¶—GmĚ=F*=)2g—µ˛K¨ĚŤ´ËęY +ci7ŁbŐpý§yÄnďÂ˙űd ŹđdA€@�� `0���ě���0�a����ĺUĹ^´!6˝´2zö)Şü}Hµ˘:ň]Xą7ÚNqíUÇlđ™ąλcjk„´)h{Řech·čľ…*Ěk€T˙űd(đjA€@�� Ŕ0������8€ €��{T:TäVuÜw0őÇQląKőJ©4ĄŤ8Ů'ŠŐŢ‹á†}D9Ž’ĂűÚ<íÚĚ!ŻcW=ńvŇEÖÇF­âčŁbźJ˙űd/đz�Á€Ŕ��  0���Ŕ€��9� Ŕ���\ĄEŇ7i…îęÇ*˘of81˘›×CQIx˘™˛ç°D1ŰÜ,‡Q,<_/§m ±uŇ,ÁV)öŐJȆݕZůkËU ˙űd6đSB�@�� €0���Ě���7€ €��†o*âikP)¤U1u(“1wR+TÔQÔ t­ë»‹–<Ţ» ˇ˘jď2ŔĹű9ÁNâ¸Ő¸ŞŘ„©üąÇ[ÝJĹ˙űd>đlB�`��` ���ś���5€ Ŕ��� ™ŘµŇĨâ3ś`:4\ęĘČ´"ˇbśY Óž¸«"‚0-d/uďŇĄmgučő„ΔšB(Ů‘ńtĐn”¶á˙űdEđyA€ ��  0�#�¸���4� €ŚHG*°ď¨PŽőęŁĚżębŤ7xx¤ĄĘrűŤm…ŞC—ŮMM÷ţ•¦ç©m*Ěşt ę­A±"(BÍŰT†Ą.?8•şE˙űdKŹđ`�Á€@��Ŕ ���ä���:€ €Hm~Ë©µŚ˝›—2 NPĄŽrYĐŞŤ1E…叼»˝ďŤXĄRîZa°éĄ”˝ŞĆ mVî‹ß˛ĘńŰŇ-Cžö8Řş™˙űdQŹđz�Á€Ŕ�� @0���P@�8€ Ŕ���»InÍ űź*™ÂY#V$ś.ú9ŁŻsgnF‘‚ť˘Ě›?ÔşŁbíRä…\ľVkµo’*ŇU(VâćźIi±Ž{˛˙űdXŹđXA€@�� `0���Ř€��/� Ŕ���,Ş`śrŃ˝¶ MŠvĹX÷ˇşú*<Ö>YLzJ1öץĺ/›;Ň ©ą´µ ]&Řu¨Šp‹+¬ČýCî­±¨ §”˙űdbđz�Á�@��@��t���:� €���:D\©ŰŘ=XY‰´zSsW˘ŐÎN‹}x­^Ăw]!F ďUĚFY×­űÚ$FçĐt‡e Q;1¤F÷!-UPYołL˙űdgŹđt�Á€A�ŕ ��Ľ���4€ Ŕ���ĽÍě jČ6VÓ”*{Űź‘8×^ÚűŹÍ(¤ó“rmÚÂ&‹^±H“XîěRőF¬µKŕAý"Դðč"Ďj˘ů#:* ˙űdmŹđv�Á€Ŕ�� €0���„���2�`Ŕ�Ś�‡ĚŻĘŇaŃr-X‡Ę±+84ΕÇúT1±XqĺǸ’Qs›ş‹醥Ă–ݩKe˛+™ Î]ŃŰęSá*c—RŔ¸˛˙űduđuA€ ��@ �"�Ě���-€ Ŕ���|©A‘uĚ�OŃŢ€řom6˛¦1ć«W�´ŕŐŔϨp®„±řłĎ9˝ XÚѵů¶9}ä©ő$í©KSµ<žÓ¸ĺ•‡ŘňB˙űd|đ`�Â�@�� 0���Ô���5€ ŔŘi´Óu ¶dŤČ5µ·'2ÓhańµęąŽż2ąą$!Ä/& Ép˝4  ”¬vÝZÝcŘçÎ9ĚŞf¶r˙űdŹđf�Á€@��ŕ ��¸���;€`@��ŠÝM93b†ĄR˘qĎŚ]Íą(µu2"*+bŐ­ÇŐ?C\Ť(ts’űŞKÍŐ¨V6ńĂ'ŇŰ]9Ú[h;s‚=ăP˙űd‰ŹđqA€ ��  �����.�`Ŕ��BÇď2ĘŔĹEáL“v<ÍíFŤT!ĎőńĘĎ©$%sĎŤmňN›ş—±”´şĹwŐóôzj Ó` LĆ$´Ňúř`Sqcb˙űd‘ŹđoA€ ��Ŕ �#�°€��=€ €���Ë0FŹť?ˇÉxņú^aW+5B.c›HyŁĽVĄçŞ)Bބҩ4U  ňŮŰsYz!㏋Źć]őja{†ë®Öł`6p˙űd—đ^A€`�� ` ��Ľ���9�`Ŕ��p­KP¦ĺ©lw4ŰiĐŢĆČ=Ç [qUJ1*«rv_•®Ą\×V…j”EÚ.ç"íذ°ě†şŽ+Ї lŇ‘ÎÁn`˙űdžŹđdA€@�� @ ��Ř@�=�`€��Ćş#kQŻqĺUĄ)8Yëšă¦ĐşQąIöĺ…Ë4 wšUk’….MÖ RÓüË ¤ĺăÎ5;ßY;R‹ÎäŚ˙űdĄđz�Á�Ŕ��  0��� €��;€ €��� ľ•±ŹE˛жäz†¦QuVüŁTşqW9ަv ^®Ř±•¦}ăN­~HX”ň¸|˛\¤6łŠJŻyyNg0ÉU˙űdŞŹđu�Á�Ŕ�� `@���Đ���+�!����™Íě˛E5ťNb2@m† 9HFÖG.9WlutÉBiÂhU†Ą• ©KÖ­3N¬2‡ 1şo ŰčÎ- #Š˝Í{S˙űd´đfA� ��`0��ä€��3€ Ŕ���zǦć^Tľ©Čkő QÂMIűć(M@@ε°xžsË 4ą§uk=DÇPŇË~ć5ˇ3‚FŇW`ĺTx[©<˙űdşđzA� �� €0���č€��1€`Ŕ���ÁĘŁ“#AMoěc.ĘŞIKnÁč±5P4«Š5+8?em¸×ś·Y˙Ńww¶1śĆqĐ@Ô$ŐŇT)Ůq.…żŠ˙űdŔŹđ\B�`�� 0���¸���;�`€��ąMBśp™*PĽÉ«ÖŠiN¶7ú*Ôd^D|« aţĄíŇź(F~h[ţűzQŻHŞőÁÄÍ­Hi÷Şy…†"˙űdÇŹđsA�`�� Ŕ ��ä���7�`Ŕ��Ezűv˙µ*źS{Ż^Č[byżžŇU ±Šk C'™Ňí-[V¤HVQO?UB‰QQWˇĚ‰M (7fA®pbŲŇä1w”ś Y’˙űdÍŹđiA€ ���0���´���7€`€���ą0“ˇš4ÜB†č4U–­[«ÎdŢă7ű&?Ä%s›Ů’6|”ÚG| Ŕ1/k{&Ńó]iăËĄ÷)G‚hl6>ć6˙űdÔđgA�Ŕ�� Ŕ #&¸€��<� €���Ô(kŃěrčśůqÎt¸)–)ŕG©»§ yňN ĽŃJälz… €¬C†µŞ)Ň’Ęą3* 7Ż©9‡˘x„˙űdŰđrA€ ���@���¬���3€ Ŕ��h«­ą(¨UĆš´›,rµ ÚEËęĎĐĐT7—_۰}L)¶¬!™!˛IŠľä;§ć˙˙đěIĂfw›Ő=pÁ^íS Żß_ú˙űdáŹđo�Á€Ŕ���0���ŕ���-�a����mťWI¦n ž‰¬ŤqŃ­ =gŃë—yÓ+0VĚŞ'LĚ9 (ÖµHs÷oZ‡kklłhžÁ0Ź‚˘î,ĘT>ç˙űdčđ†�Á�@�� �#�Ař���9€`€���«–YĚŽ­ŰüŰ\“fmy$'îĹôŠ@ĂWÔHbF¨b´‹VŔ«yá˘ÚŚqšÁeÜl«¬)É Ég čj’¬˙űdéđˇ�Ŕ�ŕ���c�B(���G�`@�Śz'Ú8jF@,Í Z•Y&î&BrVŽŁI¨Ëĺ킡˙gů×Úó­?ů]´“}vţŹŻwóŮo:-Ď[<R±`ŕ˙űdćđyA€ �� 0#8�„@�8€`€��dI›*Tčµ Ř’@’Ď„ę(ęĄ!“µrP•Ăůé:ŤtTPŔU[Ňó‡Đ°ęuÍ~ě&$>‡8V°Jč˙űdéđˇ�Ŕ€Á ���Aü`�?� @±‡1i2™ŠŢi¶y‘/Żé9µqř]Şé·“ŽUB ˇLË™8bF@˙SXÇ2Çr¶ýË«wŞą~xÓyĂ˙űdçŹđŤ�Á�Ŕ��  ���°���C�`€���wlxš:i×LĽď)ž®­˙_Ęöą d(ĐŰfcĺSIKiŇÚ†ť&ç”á=AďÝ׳mŐďúR˙©_|(eô»˙űdčŹđś@€ �Ŕ���B<@?�`@�Ś�tÝĎŇý ;LôéíĹĹ&„jÎ˙µV©ż˝řŽ÷ę‘yŹ#<NjkŤß’ż“»nř¨_hˇőť—=Vç¦L–cZÖ$C˙űdçđ}�Á€Ŕ��  #&P)D€D€`@��R]sźq%­kÜÖ˘Îü9źč›KŞŮËĹűÝ—Eŕń~ AÓűű•<‰”ÍtÖ¨“›óAÝä…Ą/4ZzM©K·˝,z¨2˙űdçŹđŠA�Ŕ��ŕ#8„@�?€ €��ĽäË˝±Ë{é¬<l|Ť?hu>öř˙˛3|2m‰×bÎb6ST™Ă™ vm <˘eÍ(d6äÎĐë>*ÇL…˙űdčđ�Á�Ŕ�� ���B\�@H€ŔŚŕxĽűĐ(Ĺ'‰ěp±(Ĺ ţ—iĘÔĎŘ^ů¶íŻôZîYÍNF 9Î<Ŕćo!’˘dŘ}µ˝ę­ŐT\e-B´˙űdćŹđ‰A�Á�` �"�`�A�`@��qA!öÖ€şř€űŚö(–ĄÎ}’íyłĂ V4<×Gtďăâ3yM{G¤×»Ű÷ďżĐďk+:ĄĄílgĎ%M&˙űdçŹđwA�Ŕ��Ŕ #8\€�L� @Ś™ĄŻ—v틨Ü˙>ď5Š Ö^çA×)¬xf.łŹpň蕺”n÷Jšk”*X|­Śukť–°h}®&Ę˙űdćđj�Á�Ŕ��  �#�P„`H€`@�?”ú˙íŻîžl5=ŁF’Č÷Ťö©ű93/`¨đ˘t¬Ižiő&‡4ŕ͇śÓaQŘr¬Ë__˙á{™˘ÖP’Éýď®˙űdçŹđ’�Ŕ€Á � #8AĚ`�4�`ŔŚ�,1{ o:+Őiůle.YnĘ ľýţB¦Ąâ)ÎVdąř¨V2R.Éyă˸^ńďXĐ÷-üßsëĹĎţÖgĐŃĘżQ¶Ţ˙űdéŹđź�Ŕ€Á`��AŘ€��:€`€���ŕkíĽŕÜrüFRNú´;vuéHŽeč8âC§-6*ôŻI·ťlxH<+śˇđ˝lq÷“L°|貔p9—r»KÖظˇ˙űdéđź@�Â7đ#$Č �E€`@��čÁ˘;ڍ}őŢLđPF‹Í‡’ ňc€ŹŚLµcZö˛F«±V¦S:™ęVúޛà ‘:4*©ÔĎ&⬏m@ç˙űdčđ–@€ˇ`��� €��C€`€��.Ź]ýPËňűťÍÚí iËüµUĂM2¶°s™ŮTŁ0óq ‡ęĄ i0ś0+&©ctdC˝´4„dYö´hQĚ"–źŹ ˙űdçđŤ@€Á�ŕ���B ���G�`��Ś˙ÉFeőˇÚ»źĚż÷öUU |„[ő,a›©ŔÂĂRmj"lŮÁ Âţˇ2‹<7Hôˇ[2¶w2ÄŠ<ĺŇuJ˙űdćŹđ‹@€ˇ�@ #8���I� @��ĹÂN*Ná‡ĎĂe‰´ű©<Ť}’Ů^qG_÷˝ŻQ˛.î/MËĂÖáy’źťů};(˛Bäs.&RЬ˙űdćŹđ~�Á�@��Ŕ ��8��N€ �Śác…¸Î]űZ˛çüçxŮ)őjmŠ6…ÓöDäśňşleÎ(At:Ą w‹¶)SEŠt4\9ô5h{…Ž»śuOAěQ !˙űdçđmA€ ��� #8h��H� @ ™»:®IőgŢ‚©YęY;‹áő* Ł}ܶę˙l˙Iîr.;Wµw¤™{ŢüĽF=/ł› ›íëëŇ=ÔáÉMCşä˙Ű˙űdçđŚA� ��  #$ ���I� @��µöÇeőG˝†&›/ň§jĘď7µ Ş(Ęš_](y¤9 “bË(Ë“÷.ăhˇRěSâˇ‹ë ” k>,Fó Xöjq•PlŁ˙űdćŹđŚA� �� €0���T€��J� @��Ö&ŠTÖ´w&ŤigE”•›2lôśď¸]âűHkĹĹçuąuĹ%Ô‰4€5™ŘÔĽx„¨©ęŮ™,ŁëY˙űdćđ‡�Á�Ŕ��` �"����F� @�ÇŠ(ĂĘžŞÁšPm—¨šUF­¦@î“*v•ˇđ·JąĎ˙C†±ˇŹ7öýwl;´x`v'.X÷"e©gŚ8‡1×˙űdçŹđŹ@€Á�Ŕ"8Č€��D€ @���®.†Ąo&•SdÉ­Ąő"…Ę+Ť]"€'®×ˇéyh ...úÄlŐP¤ÉĐâ)C>·AXĂĹSj”Htˇ‹XČ˙űdčđ—�Ŕ�ÁAČ�#&B$���F�`@�ŚÁÁ—!aÎş^YĘ%°«ŐϵC“(µ [“uB7ąkCbŢ]Ej)Zy işA&ˇ=*ŕ—śÇ˙+i°˙÷sO‘’˙űdćđ~�Á�Ŕ��� ���D����I� @��ń¦ýRü–<Żí›6ÚN-Ţý/ŘßŰ€łŢ÷;,ďť?'jYMÝóŔĘBńBŕŦđÇČ^ˇ’OJV¨ięéMÁĹ˙űdćđA�ˇ 0���\€�J� €�Ś«×qnat9B† QzU ˝.*4¬ąIrô©ÍäÁ9<ďu•Ś÷źÇöoĆf–~üu±b+¦<†É”­CÔô-);O˙űdćđ~A€ ��@0��€��?€`€�Ś�€HB\ě)KÓmUE‰Ş ¦˘Ěm盡 ˘\Xc¨U©)ŚRJbłČQ‘"…Ů\(<:ő§>ŢÎX(äY_eµ—ţýŠ˙űdçŹđ…�Á�Á�` �� @�E� €ŕős­ëâ-^×8›ţyČsţKĐëŐ!âqV d:Ż‚đ@(BRĄ)Ź`ë7,ŔäsÝ8¤ŽCaf%&ˇ\ÓM Ň™¦¤řń˙űdčđ“�Á�Ŕ��@��c�B$���<€`€���ěR[O*YŐ+©áT9Š<µ„Ě�vĺ)™iů‹Wj×+něyí÷¸uôkš1朗˙k8Ë;,k«v»Ż}ť¬?9_l˙űdçŹđŹA�Ŕ��€ ���$���E€ €ęrŕ>Ol˙]ÚąĎ˙~»ö¤‰ *–ĄÎzXA‚×µ. JE­ń–”§LBjÔŠm,L> ź˙G´{żˇz‘M÷Ő3Ő­7˙űdçđ}�Á€@��  ��p`M�`�Ś"o㯉wČ™6ďĚsŁâ×Úzűń}Ű ›KĹfć¨( SIsÝĽńł`v­ÓlYAˇč‰&Ў«P]Uâ“éĹEÇ.®˙űdćŹđŽ�Á�Ŕ�`#&ŕ€��@€ €��mţď™F mô|öMmáQ7żRč;A-ŢĺEkDŁźEÚ»5Łúç[îtŽjwSźţ˙˝hCbŽI±ű‡ľ×8Í_BĹ˙űdçŹđŚA� ��€ ���B @�D€`@Ś�s+;)É˙ĺ3gÓ­DďîŞ ăo\ŤkxFaęe‹E`Píjóti§kă™Č˙Fiąż¸J¨őĽr źhĄ­qŽqZŞU˙űdçŹđA� ��Ŕ���P`J€ @Ś™\t-»öÝű{µßonAĹšř[Z©ězw°šŇÚí] ű)SóL"Ň0_:yŤ?RÖƤp˝o%–ľŮoŢwľřëxůRä‰i˙űdćŹđŠ�Ŕ€Á�ŕ ���(@�@€ €���;Ëío-•ć)żdꦾ®y2U”° ˛zB‘fśQ÷• őÔ˛¶H׹'Ô¶0‘,őÓfŁGŠ6RĚ™řT“śTRŐ7¨Ď˙űdçđ@€Á�� ��BD��H€ @��9 0üvP‰W6A›N˘ĄŔuŚ‘ÝéýÜf—żÁĆm( Órî·†ť-íÍx5Z˝ĚuÄÔY#¦€nÂʽ̎b@˙űdćđA�@�� `���8€�L�`@��“ádŹ�ĄbĘDăÉ-€‚Š|r$$X„˘JPő-ČYČ“2µ„Ţ9­>äI¬T7bćŤĚkČŹĆ)J:u˙űdćŹđ�Á€@��@��$���I� €��jAĂ/¨._ZŇ0ŕXY—\§©JĆ5ŠĹŇ*ck ŤqΕ°k73}ŻMUü±ßí—ýߺǨQҒ𠶸XŞ —˙űdçđuA€Ŕ��Ŕ ���Ař„@�H€`@�Ş=ťk!·gö\Ô/d,fú†g‘19Ô­ <µHÔ,!y!ş˙vŕp±"v1b€I€íýnüMööósŮw>¦×żýt˙űdçŹđ…�Á�Ŕ����"�B @�H€ @�/úMcÔ2Gń~­MýŹ ÂPçýřńjÜÖĹ]Ţ4iu´`pAP˛B]1±é/Ř75A�ÝR%QŤŢ€š<ŃÂŹxUë˙űdçđpA€Ŕ��Ŕ @�p@L€`�Ś Ĺép¸ĘŕvĎ8ů…Ťb*Ó˛yĂŔ NöĐöŽCĐOĎŁRcŤ”â;oýoµşĆAÝÔ¤Ě}Łš8sg^Xj_±˙űdćŹđŚA�Ŕ��Ŕ �#�Đ`�?�`@��#‘iÂ2€V´t–2“ŹKÚ…¦°Yas$Aık9ö©ÚĘ )g/«0÷ŃţîwÝG_Ý5Üt‹aúÇ ŁŠĄc…Ş6„Ö˙űdčŹđ—�Ŕ€á@đ#�B$„`�F�`@Ś�ˇU!ĺ.=—±Śj©]ę| ów‚8Ü[·e)»l^Žźl‰IĆDp›U’UrŃÓŁ+UŃ­óŚ3†ŔŠľ5e)r7ąË6<óÜ˙űdćđŠ�Á�Ŕ��€ "�€��E� @��yOóĺ´Xing����B@�B@APETAGEXĐ��3��������� ���������������TITLE�TitleAPETAGEXĐ��3���������€�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/bladeenc.mp3���������������������������������������������������������������0000664�0000000�0000000�00000067406�14447736377�0017333�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙űRÄ�� p[Pµ”€)~H(C: ˙˙ů–i˘©· Ďiă©ďÉď™×Ş*Lµµ‡TěMß·PV †ÉőD‚D{J @‚19¶�xx‡Çp��ń�>Ź÷ÇóüŔ8ţřós!·đhc”şL #‰kÁPHč‘ DŽĺŇ™Ż�u[„§Ä�|D›ř- ¬>˙"&d?ů)¦‘S˙ÎC–¦˙ţ¬™×˙˙ůżO˙˙ţż˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙���ď˙˙˙˙˙űRÄ€ nA3ąŕ€ j„%÷Ľ�˙˙˙˙sP1ŠacĐ„1�š#°”WA˝1¨řd €‚¨Ť?B@_Đ7ß(9˙—ůçóĎ˙ž[˙˙ú˙˙˙˙˙˙ë˙˙˙Ż/ú˙ů~˙˙˙˙˙˙˙˙˙˙˙ŕ��˙˙˙mŚ�lŔpL�PĂ,DŚaËČÚ./ŤĚ…ÔÂ`!Ě † $`B F�@…NőđTµßőwr]˙BŽ–ĘN˘ě˛ůŔ¶ő×Ń­űÝËÓ»B÷\ď˙���ź˙˙ű˙űRÄ€ ¸/­{"aĄ#%ué‰tna†“Aą«üa6f~{†g¬5f`Řa*1¸IÓP¦k<#rkŰţŢ÷ł·cĎ˝6h‘9fÔô~_wÔąĺuÖ€µuxÍî’¸��˙˙í˛q �!¨91‰(¶›ř[É˝ř¸“áČ*ů ¨ę,‚ú  őŰŻúş˙˙çß}Ňv–ş*{7łO¦ŽěËT}_z˛ďč׺cṫ‘Ú;–«[? RÇŢ���z˙˙űnabF˙űRÄ� Ř-­ű"aˇ%uę ,Fb¨Fa.a?†źŕhN>F `Ľ©ÎQé •ý:$~ŤŚýłÎ}´űךĎ6ĘÔA/ßI ϡ—sěS;…a•‡ľä*JHµÜ��˙˙í˛P €°: ‰@¬ÖÁľŕ®•ąŔ)�7`g»,,˛âh&›u_×Oô˛Yúá( UďYŻl’šĘ(4“/sÝcÜ‘®[ÔŤKsnw/VŐ9kŘ·���ź˙˙űn`˙űRÄ€ ŕ/­ű"a¤euę 4Á¦ 4a‡&K`ŕ8fpĽbfŘ7& člXă€S¶@uÍxUÉ—Ú˙é˙Z+Lĺ>mäŞ˙ţV×wV>ŐulEiń™÷¤•ß���_˙˙űlŚ@ ,07Ó`X1/3‚Ę57ůsŕp0{3đA@đ ß0ĺĹ_A4~·ő«˙·{zéU×LďG][dök#6ŠÄCrhĄ5”ĂÖoĽ$‰Ş=ä™tKNÎBM���˙űn`ˇ†6˙űRÄ€ /­ű"a—%uŻhTagA `Ň9i\Ŕff7Ć Ŕî#p‰„±đu­ tYů‡®˙ŮÚÖţíéyľŰkmťôh ˇcŢäĂ34v5µ*DSŔ��˙˙ţŰ/7Í3!,8G!213ł P0,:ôËz0…šÝ&`šî”÷©vÔb·Ăm]ř»[:/¨PŘ}”Óăë´T©JÝĂ�TúĐíĹč9B©kę<!���ź˙˙űn`¦4af; `˙űRÄ € đ/­ű"a†%uŻhTĽ9ćaýeđ8ć  đA BŔ1Nö‚.h3®LľŢßíszű\•ór.ťÜŽ›|˝ÎÍvŚłÚ‹Kú¶şKđ��˙˙˙¶ĂŔĚ ÉSő(ÄÜENŁ\ŕ¬FĚMÁěĚ AÍ>2żL–±O€8!Ľ_űɡjë7+ ¬ YĆ“±1Q2šoAĘťké{”ú¤I¤2RŐŁ™U{ň⫱o���~˙˙űn`€$`�J`€`B`2„0aś˙űRÄ� E_-ŻMᛢĺué‰t!„a„`("@Q€ Ś€ÁŔ±iŃÚ©ÓýmýÓ÷ţßüÚëô¬Öűô¶öŮý÷GÚę•öéĚFlľÚ+hDŞ©íi*¨"/€��/˙˙ý¶�P€30:ĐC18ÇX8>C_0zŁ @0ó�|� < š ¦Ý_˙ő{zQ5ßuŁ#nzţý_TýŮ´W˘souú:3˛TWĽoBĹ^˝‡í¶Ě_˘$���˙űna˙űRÄ€ X#-­˙"ˇ]%µŻhT& Ha &3D`,>awˇÖal*`"(#�Ľh°;'Ű-ŮëÝreöóżň,Ľëri[_{€.ËÚŠt·Ę‹´ç;PëUc۰=T·kÓĎa,��˙˙í°°!$†Ä9ę\b&¦ď ćn–f"�`Φ jcš} ŇnĹ| ßéď_é;EäGž‘ݎgŠ{’—¬ęŐ]˘—J»˝RN÷őSťÔĄ5÷Ź���˙űn`€ `�J`€˙űRÄ € äĂ-ŻĐIˇ˘ĺµé‰t` J`&„DaQ"aF„4`. �Ŕ8ŔĽč Aâ©ö­]_µNŐţ^ŤoíýíE˙¶ŽŰ:pď»v†'C–”t#şaZ÷a•6V§!ŻËĄĎ€��?˙˙ý¶� +00�#°'1 Ăx•Ŕ7X C0C0fŁŕ40 S�@lłÔ´Űď˙ý_żűM·ŮmV¬źďďyţBŁnÝ?ßőşYq^2÷öŐ´/dżsU~$���˙űn˙űRÄ� @#-­˙"ˇ\%µŻhT`Â&H`IfH` Na(˘Za>`0�Ě 0×OłÂ[ł×ş12ę·ý˝ć:µ1ëBt0Ěs±U=tŃo—ZCžő®ßVL…čjďÜIż���˙˙űl‰@ 9ě<b.¦ňŠ nʦ"@x`Î& jbˇroĄ}$C”^üz—ß-.±Ďú,%ő Ę“ĽĄňyl­{öŚŠoâ”2ţU-=:���^˙˙űlabĆZ`k†`˙űRÄ € Đ#+­˙BˇbĺużlL„ôa#'\a„ŕ`j`�„;±ČEWHođ~Ťź`ć™đë_<NE55WX,đí­Ć˝BGî bˇ­Ü( •C7 `ŠźżcCY ?đ��˙˙˙¶Á%`gĂ1B ‹Ú8z ŁđA7„$>0´�‚ :sęßĂ"Ýď–]LLô&♸ËŃ!KZÚę{ŘňŽs]{ąý~Üţ$���˙˙űn`�"�˙űRÄ� \Á-ŻĐIˇ€˘ĺµé‰tY€1€HiBŠŮ$)€á€Č°E„ č�-@ĄłÎĘ_[}˙˙˙ú.źnĘţčľÉ˝°”DYç*Ş|î˙™jQĐÝÇËTĹźÚ)cŇ>���˙˙˙öŘ ‰€´0Ě€0ÄdM鍬ÝÔĚE�¸Á” ĚŔĚŔ  Ţf: Ôş×ţť:ýmWoýĄ_ę߯ý%ţš=rôk~Őłç Ég5’(ĄłŠoÚu>UO���v˙˙űl`˙űRÄ€ #-­˙"ˇP嵯hLb�BPjP"¤Ŕ¸Á>E Á3(ů€ Ń€8�<ŔľGÁ\TWřE>fß{ěČ؇{bâ/˘´Ô*e¶vŞ5)îĚ©źµ•ŠĐ—˙���˙˙űl<¸[Aďb0FőĄnô Ć" Ny†F¨[pá(.á˘jNí´WŰB.µ+CŽ9űÎ4‚ŽŽ¸·µľ»I÷¬ł­UöioG„¶ĺŻ���_˙űn`� �,X\ �#˙űRÄ � !™-ŻMéP嵯hLM3"‘@'ŚpLđ�É€dč%ĂF3˛zţ˙ýżţ™Úű˙GŁhżÝ­ôóz«koú1Ń}żę×Ők}+Ż-MJ4­ŻD‘¬Ś´4ź���˙˙űl ,´›X>áČ›× é»řŠ�ńă^eŘ ď%']2ĹýŰŰů¤ď`zŹs7° µÓu5-e± @˛HßtÉ"Ś_/8­?!ĐUŹ���W˙űl`!ŔÂQPĺHČFr/˙űRÄ € ,!-­˙"ˇ–«ĺuŕ‰Ľ8EF�&�ĐĆ��Ăs‘ňN śŃ_MÝ^âŐüĺ©âęmZŘV–Č]cu1ç*—u0Ŕ˛ÜUÝË»,Őúí|ă`�� ˙˙˙m€@2Ä@ú4 ŕ˘8ĹĂŕ1?Ó@40 ( Ž`ź#k—~~K/—ęDd«tŞödCŃ=ÝuTVk6DNďÓ§w˙fl—ţŻË×gÚ‹-)E,ňĄŻ���_˙űn`���`˛�*˙űRÄ � ›-ŻMáO嵯hLˇĽ !€Pŕ `‰�Č<ů@jqF3˛zţ˙˙˙ţúýôÚŹżßż‚Ołú¶«Öý{Úµ­[˙3:guô×čę źµőyňIe—Ŕ��˙˙ţۉ1Ô/tÄdŤë…X3żŚD€0đ©2lBŤ ›Č ÁWL±<÷d×cy¤íiŞkŢĘŤĽßsTU)főˇ*P˘So4Ĺ7ŧ?íĐ’˘ď���W˙ţűl`€$�´” ¸˙űRÄ � I™+ŻMéK%µŻhT¦�€PFJ|†@OFh¦` `A�?„(D˘ŚÉ‡g:týż˙˝¦GľżJëżöĚîňŻ\ź#Q –ĎŁů¦[%ŻŮMd˘˙Gôőýş­ßć\'Ŕ��˙˙ţŰ�™iŢ1ózŇc7zó00^C�.µÜ2J ą´ ]ÓĐë+î4űP6úPí¨¦¶X‰ż­}·=}g)‰‘¶ÇŠ­–}z-���˙˙űn�‘P%đ H˙űRÄ € ­›/ŻMé’«ĺuŕ‰Ľ ŹIw¤…Ź@Eɀ脠8Ȁ͎Q¦çű˙Ďçţsôë^˙ďŮße˙˙_«vőŞú“OęOg˙Oęť·~ýl˙]Aú˙ŕ�� ˙˙˙mŚŔ  `‚0€�ł0\8ş<c0Lˇx Č  DoÉ?Î|躯ä«©Ë˙ßşs#|ôŞľßf¶˝ęěöZ´ókşlË/í7¶Šm’¨˝L���W˙ţűl #˙űRÄ€ (!-­˙"ˇ‹,%uŕ‰ĽJ0“�¨"ămĂH"�ü 3�°c��=gŕC`.:+âĄîę˙_aĄµëg©©yKÚ©;Ż<îŕĹňţe–)µĄŰµł—Ö‡?Ŕ��˙˙ţŰ�)��„  ůĹš]ś=x±961€řT ŕ4čÍZ˙Ý˙—ďîy.jZŰz×7łôY´l´ä_ë˝ý¨źu7ôu5’łµö«rŃăŰ×í���W˙˙űl "˙űRÄ€ „!-­˙"ˇ{«ĺµŕ‰ĽĄ51€ričŠIÚ9€€b9€N�¨ô‘p×ýád_Öš/(ŠĽÚ‘R–:š¨KKOÓBő:‡g†ŤĘ?˝Żľ›ŃGÔĄZŁî€��?˙˙ý¶0 � €` Š„1Ľ˘u˛ŔŃ -€Ů€X•@Č ˇ`}Ş‘Ó÷ü§˙ü˙vVą4÷˙Tç˙M ě÷#˙G­L«żęúÎĹďüĎÄ_ÓßW���_˙ţűl ! $˙űRÄ� Ě#-­˙"ˇ’«ĺuŕ‰Ľm9€ŚA„–‰„€€˛€hA€L�±ęřp Žr˙ú6t˙k܆}ÓčX‹N˘Š›,»~ˇ¶mŠPÄ[Wssćä`�� ˙ţ˙mŚ�$Ŕ„Ś€4Áü ŚOäâeťN¬ LĆ �<`€z`�pfŚ­îĺßôĽľ®ëÓFE§ł®Ť©©Đććoç÷żŞşşZoúQ“ť—µ=vaâ•řľw���W˙űl *RL˙űRÄ€ H!-­˙"ˇ—+ĺuŕ‰ĽJŔS”ÂśDLÂŹ„ŔbŔ9,Ŕ)�dôýT<5ą?xXĄýe<ŻV€?Igľ•Sv˝ĹČ>őň}ďU]"č§­äkŰÔ¶çÎŔ��˙˙ľŰ€A�€đť†ˇÄC (†1‰€2€Ů€XŔđŔŔ€2áL÷Ăúů|çUüyçë·ţ÷ßbZ¦/Ţj*ŞK§ŇÔň®ßU?EbÓj˙Ä,eRö]”µ.���{˙ţűl*˙űRÄ€ „/­ű"a—¬%uŕ‰ĽŚŚN4Á8vŚ˘űpÉřuŚB,đřŕPëđH;‡8,Eß˙ą™˛ęw^˛U8SM÷"‚?,Ż×µ>Ţé€��?˙űm¶0�ł 0>sĐ<16ó‡X8>Đ0bc�`0 Ů€H>�€ĂYš Z˙Ç˙—ďůe—Ű}©˛ţţŮ4ěĆę”»zş=˝ęΉS´Ţ¶˙Ľ[çŞÚ$ĘÚ����S˙űl �Łő€Öé˙űRÄ € l#-­˙"ˇ®«ĺuŕ‰Ľ†h†I†Fą€đ€‚i€R�éäQöřGěR~ÇBvźkúżjvqTű·qť ’u1)©$č%oŇUůµŇ¶}¬ÖU%Ůŕ��ď˙ßmŚŔ0Ŕ€L@hÁčLMDá‚/Ž ĂŕÄ L@DŔ Á t`¦�@2Ö©Dtúýć)UćëťěµzűŇ–ąŰŞ|î˙ě™ĘŤßk=´*Ńţڶ©µłzţ4^(äŰ;¦ŇÎ���[˙ţűl˙űRÄ� Ř#-­˙"ˇˇ,%uŕ‰Ľ0$C#ˇ00ŢĐś0Ú0 Ŕˇ0€L0 €<Ď>¤xĹç-đ/Łc´Ń·ą„nößMą±ÄĐŁűĘŃýĺ¶÷c'ýU1żŠî}|��˙˙űm±€€qŕ<‚a‰€Źś$ˉŔ’1‚ŕ�`�LAčŔšÍ0K^źŹ˙űoţU{+z÷×îúzéěďÍü”t§z3’ËSć#-Në~ęßÜ[ÓYÍ –Ť���W˙˙ű˙űRÄ€ /­űBaĄ,%uŕ‰Ľl"0“†0mÓ4ng35“€7pM“P(ס^Đ'Ä! ;X·i_íNö˙ŹLÇcéłľÍL§čˇ‹Íł^®Ć"˝"îü��ý˙űm±€�™Ř;©‰hšPńżČ“Źy‚Č@¬Ŕ ŚäŔÚő(ŽźUę_çčżĘg—uô˙öíîßsżSşo›Ą[j†Jm®ťUke¦”jű°Ö';Ą¨kU���[˙ţűl#˙űRÄ€ <#-­˙"ˇ|¬%µŕ‰ĽŽB–Í€(}AŕO �'@iź¸_ó–đôl~fŤ»lF¶íşťócÉ1L\â(§îEŤě(2e˙JHőř®çQv��>˙í¶ŘŔ0Ě@8ŔŔLÁ0Ä�GÍÄĺÄŰDĚ=@°@ 0�Ód0&%k×ß˙˙üńg÷ôz˙ﯢ}Śý?Ú´ß{=-ßOűi{i˙©—_#×���[˙ţűl(�b�˙űRÄ� Ť-ŻLKˇv«ĺµŕ‰Ľ0 �0“ Dů4)ó ŕś0Mó°%00cp3�=Đ®hšz˙zUţ¶g×oîżűi˙ł˙­}6Őw­7§ďJłVŁQdÜ=(ÝFŃMż±şéwŕ��˙˙ßmŚŔ(Ŕ`Ě Ŕ€Á€Ě>ÄČŰÚ ˛DĂŔ AÁ!ó�P*03�`kÔ˘=˙ë˙?˙ó[Ďo·˙fłßţěďĄ˙J22Ý?˙E_ŤôßéŤÉŐ{őí���W˙˙˙űRÄ� $!-­ű"ˇ{§eµé |űl20ä5—0śG߸4bc ›0NăŔ&<Y=¶hżç-‚eîĺwÝo©#µW)‰7Şć›X¤¶»ŻĂÂ•Ż¤,ĸ––şç-·}z’ď€��Oż˙í¶0�ł0.SđX0öSmš6¬“°:I€¸0Ď $ĽŠ¶~ß˙ô?ţٶůűżo˙űä˝*ËŰ\Ý˝k˛WŻë· ĺ˙źşŞ/ę±���˙ţűlގ˙űRÄ�  /­{Ba ,%uŕ‰ĽbF-™®üa6&„h5ćÁqaš3ć‘«^NÍ-‚aÓµď~Ď瓱¬˙Ń!ôVš}i+„>nô©üŰiłíc=-���ź˙öűl`*FŔ2`n Ŕâb.1ő™ nö/F!�ž,ă F`@Ţ` lş”A¦˛üýë^”đą˙ëĄjź&VĽäŻďŁiĺŮ7úQÖ‹ý¶TJ”mě›}n'Y˙jwŘ���W˙˙űl‡Ŕ0Ă˙űRÄ€ 5-ŻLKˇU„%µŻhTĐ‘0®cO*4ŇC —0TăŔ(0/Ó >Ŕ„ţTMÓő~ß««˙ż•>ҲőŇšýSMĘż)©ştĄ?Ń:´Tl2®­$b•{s®ř��˙˙˙Űc4Ë”5JNŢCÁe6™¸fÁY0ß‚€t$śÎÚ1Łm6%…—V´÷)5ô˘Ą9ôEµE§˝9>QnĎ=/z*ĂLSE˙ËÓžŐSŤ���_˙ţűl‡P ˇŠťša…¸îš“˙űRÄ � Ô!-­űBˇą¬%5ŕ‰Ľvé¨Hí`ˇ‚¸'Y®<la™lŇ_€8Rţą^šŐŕ^şżJZŮŐ¦ewâŞČ븥]3ě·›ĽRŤübŘéÖř��÷˙÷Űc°0&SđB0z Qě8fřă‚ńŢ1"ń`˘$SĐ800Ó WRŃbXő˙_ţg6AÖ ŇűčW;ťUš,Ęš‘Ż­&k]ĺTÝ(]}·™)j÷§é‰Éôě���[˙˙Űl@P0˙űRÄ€ u-ŻLKˇ=嵯hLP‰0ľUľ5: p‘0XăŔ,0-�F±ţN&‚iúżjý}]·ţ•M¶Ýoľęź˙×ëv÷éű§őTŮ1ţPc*˛.‰,^WĹ÷ľCř��ű˙˙Űc<Ë–5 Îľă…6MĆłb!y0Ó@ěŁ¤Ś’3CXÇŠi´Â:˝§/ĐŞ}ěé9ąe⏌zě-ęk7[Ń8Ő±_mťžW���_˙ţűlťŕ#74C qÇ5Ś˙űRÄ � -­űBaŠ,%uŕ‰ĽăV±Ĺ0Îă·<Ö­5Ť|“*’KÁ0CNߦ߹;ŁÝ» üÎVDRŤ�:I[ŘşŠŁKĹ,Sk¶i*lŞđ�� ˙˙ď¶Ć (`8& x`Ä棜n Ô†ÚŁ„aŘ ` v�ą€Ř€°°ih‰d߯çű˙r—“·¦µÉŇŢĎV«i^ĆíţŢúďyŢ·^Zwßöa<çú,���[˙÷űlކ� .`HĆ a.aÜ?FŃ„˙űRÄ € Y™+ŻMéI嵯hLlČ?FáF`Ř ĆŔp`j¦Ŕ´`4‹ŢX,‡;tüż§ű~ź'ýwE­>ę¶^Ôô?˘Öťléţ¶Ń˙óH•ŻÚş&¬Ź˛˝['Ł».ôG‚|��ý˙˙í±ŽeMf§GÁ† Đšýę®Ęb‚đ¨„q–>ič1 6Fŕµ­ň˙ż±¬ŁęŚKźŢćľĆ7MI/(¦ůŮňho-SľŰ=m���_˙ţűl–ć�Ŕ(`N¦ $aî=¦×Ţ˙űRÄ � e›+ŻMéO嵯hL¦m.=¦<`Ţ ¦ŕv`dĆ ľ`2«Ň^CŹ×ô˙Ő«˙ɇɦýýż[>ľDíruKkÚč›í)×~'_Ôě}lZŮ´×ŐšÍű?{Wk¶Ç€��O˙˙}¶1ä ‘łJŘć}0Íă\í¦5§# Ŕe4ŕÂĚÉĂQ4Ę dŇŃ$µµ±ŮĎfËšŹ˛ę,Hás*hŰ—ĐĆw‘°Ď?SçvŐ´íµzłšŻ���_˙˙Űlš &`PF !ař;˙űRÄ € ů™+ŻMéyĺużhLĆŢ=ĽmŚ;Ć ˇ6`ŕ †€t`b&@Ä`0ĚX0 k—ç˙—ŻůŕŢ"¶Íjµ“˙őôV/©zwżFŢEFBę˙ô«.ç[˙Ot~LÝ=&¦ýˇĽ��{ż˙í±‰ É!•"šĚ±‡ ţ›5˙ٲ�řiáŞh‘›[tbő—ÜVť¬vŔ ¬çĹ·ČSçEďIĂcëa'o'H,¤Z—Î5 [ń ň›_e­"ÂŹ���˙˙űl­ć�Ŕ˙űRÄ€ ±-ŻLKˇR嵿hL`F¦ €čaÂ2fÇ™>l.2fÁ�` ¦`b`LઊPľ‚h ý˙őţßůôôvŁ+ÓôďtwĚÍ­_ĐŤŻ[uíVĄôęolÝO~ő5tŠ˘é°�� ÷˙˙¶Ć b¦BthЦăŚjÝĚ©cxaX ćtP)ť0k#™`¬šZ$ym6vůóJĹĹrn{‘b±bOSÍŢźłąűT.é×őÖĆtůMšŻ���_˙˙űl°†�ŕ`D˙űRÄ€ Ą-ŻHKˇ‡„eużčTF ŕŢaĚ0F̸\lx0† ú`Ä †@d`Jf€°Ô)râh&ź«˙ţĄ}˙čšúŁVşwűn®ý?úú&–~űĘd"S$^pfíË­«uńtĎĎ3€��O˙}¶1!s&2d“Q 04‚1~ĐĹ1t 00@†0�0�Ŕ4ÇMÍ>!zˬőÉ’ÚxůÝ„¶î ±0ďî܇źďžz’Áb˛"ŐéAädZŘŘŽyLŁäëLYŻ���w˙űRÄ� m/ŻDKˇ†§Ąµé‰|˙˙űlÄĚ�ŔtĚ`Ă4PÍn©$Ö\QL4ÁTĚ@¤ŔhŚÁ4ńpĐNő˙˙˙·őŞ˙¶´ďďý?wőőď·ů•^ëŤö5'UŇţŞÎ}^÷`��ď˙˙mŚ@@Ŕ8Ě@řŔř#L+GpÔÁŤ9GHÂpĚ@H�& (`\ŕxźŠ©5j˙Űű«íŞ·ůżt҉ö].§ËŃײ˙_oę›-?ÓWřžšŰZ™o¸ľ”���˙űRÄ€ Ě!/­{BˇZ嵿dL_˙˙ŰlÁ (<pćŐ0ĐC]™Ü5´c Pc0TĂ�(3)LÄă !ߤ̡{żÝý=c´~‰Ţ­ŐżręĚ&hţşwi^ëźŕ��o˙˙mĚ0DĂČ hüÎä )śÓ?ÔÍ+‡tÂLŚĺŔĹHž=a/Ůá“%µęű>Gť&ú=řOZÇßPµľ´’ •ź‰ĐýkOOU]˛U&���_˙˙űlźf@AłV{¸ŹŚ9ľ!›ÉŚ˙űRÄ � Č+­{Ba‹'eµé‰|Y‰�BšćÍů¨pixň¬˛śJî馾‡ŹKĺ…±î›V¤,(úl.ôĐ"cwâ¨ghń˦·T™�„+myŐo›Ŕ��'ß˙ţŰ€‘€` ‚°IMʤ§Ě:Ź1„@?€Đ8L @8ŔČ ŔôRjŐŐooę˙ţÔ]ý¶ŢŤZéîßw•|Ě˝˙Űú%şöşń;ݡĽ·†÷ľ!���_˙˙űl¨ @Ŕ¨ŚAdĂ˙űRÄ € A-ŻHKˇ,%µŕ‰ĽđPŤşčđŰ�QŚ?Á¬Á €ĐŔt Ě ¸YeÄĐM6ęo®żő;˙M=ÖŮ˙×ßôôz59^żµ/őµîM¤íä5Ő»RěeÇż���ź˙űn`f @`,fa,a$?&‹şht=ć!`ˇ€$`L¦ dĄű<#ćľţ_ÎŻţůú/cöý-ۤßZéőŮ~şvWÖ¤ďúDżżűg ô˛ŤFŹ>���_˙˙űl«Ŕ@˙űRÄ€ Ŕy-ŻPIa%µú 48`Vf @¤b&&ŕÓfmş&¦ @Ě`Îćŕji€ś aG‹ľ‚h ý«ôëű}©ŘLuö$ţÜTđňR뙿ս)ą^e¨GC_|¦â™D?���›˙˙űn`€$`�F` €`2`D„b 0a˙đ`:�€HP5"�Ú/�g"6*›5jęý˙űJö˙Ő«EţŰ­áůÄĂťÚ·‡—â„Úš»wś*Ĺ:Ěđ™ ���_˙˙űRÄ€ 8-­{Ba]%µżäT˙űl˘�cć°±ĺšb#Ćä2Dmč$F  Ây˘f†e‰”Č`9t€ŕ>©rţůö#i"ŇővÜ·ö\r¶ ŃSHP},öF­ŠĚ¶Ú»ZNŞP+ü��ű˙˙í±… I"™\Ń€üI‡¶‚™‡|ů€ÖPXQ ŽĎz�Ý/Ůë+3őüVôu!Z”·­xµÉŐ:‹m*Š®zW(˙CÉ-߼KW˝7ĎŤ���˙˙˙l”@  0-S˙űRÄ� Á-ŻLKˇt%µżäT`F1 łsŹ7 ó€\0i3P50#0g EČ_A4~ż˙­őöŰú-wÚJ[zS?ł®·ÚvˇĚĺÎ^˝v·ô^¸ÝĂJŻ]Żeh9m~)±ň���v˙˙űna"FFačĆI:`9„ aË!aľ„ `/*10'XGÄ ŻX´íő»«˙ŇkmlzČN)o‹ŠCÝŽ«KÜ_Ě“BU¨–ŕ±Vb×I2É ���_˙˙űl<˙űRÄ€ t+­{Ba…„eużčTĚÜ?sLMpá^DŽ„ÄÔĎÔăY�Íż2žŚf·HꣴTf@…®äű-÷ŻLb[0ę ˇ˝IZH—Dĺ'ÖÝfm[˙k2Ň��÷˙˙Űc0˛ĂU2›Łč&S-0“¸%ł” ‚¨¤Ŕ›`§@*rˇ‘^čÄÓµţńźs–rMB+řŁ`—pO%Bh¨¨tš”p3béHŁĽ<°·D‰ÇÔZIn���˙˙˙l˙űPÄ� I-ŻLKˇkeőę 4„A€H`^¦ �pb&ěN¦njć!€ `Ňć`j`$F Ö�±C4R×ßŐęëűŞŐÓîÉjw\˙~·C=oDö'/íoęĎń»+fŰt˛Ę<S:9Ŕ��&˙˙ţŰ€a€�ဠE'ޱ•7fIŽqĐ>Ś đ�T 5Ĺ@aŁ]«WWí˙˙˙ě˙ŰZişţŰßÜË—E;2 Ď˝K˙’;źą®¬Ľ���_˙˙˙űRÄ� Č-­{Ba%użčTűl˘IÍ€ÖÄÄ@3 ÝZ°Ý4ŚDA,ô<4 {S¨Iۨ&Ş9Ń~„íÜefŹv«ť±˛ním/ˇ«X<”ŮDĐlłM«e=Ť#čwŔ��ß˙ţŰ`É„–RąŽß 8di±a3ŕW@;�ě Ä㜤«dW…‘GŁ]”źŁY™BqÚĺ–y“€ ˇłă›e[Ť{ßĐĐÂd{Şř•‰>·iC7š���_˙˙űl(I˙űRÄ€ Ř+­{BaqeµżäTˇ˝™ž†™Ä“jś.†Ů‰Đ)¸ć¦ ’|b˙‚L¸`arjS০´ěy¤Ř˛¨°i§‰­@ł ĎŞäSCÜŃfçi±ö‹¬Ú)ĘS7ľNě��ý˙˙íą)Ą…)€Š!„؉„˛á€XČ Ŕ ^>‘oNßŕôQłýťŐ>Ó–‹VΦ6;h‹U˛äzĂČßFâË‚)Ş„H†gx˛ĂíY Bî���˙˙űl_’#ŕ˙űRÄ� /­{Ba„%użčTjlه€CP¤áł°Fw™Ö\e•U` ‚ÝCMUÍ~Go˝Š}ý'Ű ĺ˘I˝rÔO™>‡s ź[j}x��ż˙˙Űc 0RĂY1'ł ť:s H'�ś #�$PaťNHŕęJ¶ExYőţĎQ6©-ăÖI€g^ĐRp “[ç^ú§ŤŁW‡™6=’ž|łUSw©0‹^���_˙˙űlÄŔpó� 1A ł˙űRÄ € -;+ŻLKáŽeµú 4ŠĹ'8w SŕB0y3P?0 �}ŚaMKS?[˙oRőýmý(«yRŽ—®˛Ő[»ôGWImSż:uý­í«{KýZ×N6úž¦2/+áťă$îŕ��ď˙˙mŚ�P��@J0�§0 B,0pR0lB$0€ť0�8�h±Ľ ´}ťję·˙zčżŢ„ý/k.ż÷k»p«m—č§�)#o® §§†nů–»ˇ���˙˙˙űRÄ� =-ŻLKˇX„%µżäT˙l%�\ †  "b0 ô§hnäF" b`Ȇ@d`  €n’f RÓo˙[Ń÷˙ŞZ?ŃżGő¦Ţň^Şj?ą ď§zíî:׹hKq˝;şÔÝĚţ���î˙˙öŘÁ@¤€Ä° A€4y‚‹)‚¤8 Ă�<°dpú pŃŢ3_úş Ęş¦ąhiŻrśRę ĺýţűžŻ ťKEŰB8ô1>)€/���˙˙űl(˙űRÄ� 4!-­{Bˇ©«ĺµń Ľyh–sÜÄdMę‹TÝäLE� Á” L@ĚŔ4 ď']ŇEo˙}źC×df¶#Ó"ŕbUÄ}úş.rĽ?ˇZQejbźîN»ř��ű˙˙Űs� �ŕ@ˇP‚€T!¸ˇ�ź0�<0€(ś0‘ŕWěçNź´ý~ź˙ŃžťiŰvÓĺ¶vúRŠJôŃ~ŰRgşQűGtIO»ôţmjâŠa÷éBn���˙˙˙l˙űRÄ� !-­{BˇM%µżäT4¸{@ůŔ׎ѻ੠ ¨‹q(.ćĐ-«č¸Uşš=ß؉’Ęb–Ä´ňB‹,őˇĘEăęůŔ5Ľ4ąz·j-Żąü��_˙˙í±I bµ`ŚLô]Ě@ŠŔ€P  ŹČ7Ń8JqGxYő˙ú ěŮQ:pôÂ(‡Żąă{ì{Ęy&búĆŁgŐď���˙˙űl ŕ=&á!1E�ÓŚ@Ă8˙űRÄ � ąa+ŻMá™+ĺµń ĽŤóŕ 0usĐ=��ČA•@mđˇE‘úţ•˙_ý™ŞĐy5Ů,čÔ•?dëyŇľĎŃu^yťYV}nčµ][ë]Wă[jąć`FĽ��}˙˙íą€�pPQŠ T‚20Qx0*0Ŕˇ0€@0�ś‚°ćvuôý¤§˙˙ň'ďj˙íŻŃuTţš=^ť_Ó·'Üú›UbľOő} íqE4řz˘Ô���_˙˙űl˙űRÄ� @!-­{Bˇ”3%µń ˝ČkIŕQ›Ř‡i~Š€‰� €U©Sq)(&ćĐ-«ű“ݎÜ`¨|ťzÚť5+ę{WÎ5îŹw‹M-ŢŚ˝{ŻAeZŁÍ���W˙˙űn��<.� b€T�ˇ»!ŔQ`!`†�Č$ů0jqF3˛zţőő˙ŻíYŐŻ¶űUşäűőÝ~zt~ż×ţi?ź{'wţßWTí—oŘźWE���˙˙űl`��ŕA ˙űRÄ€ Áa+ŻMáteµżäT P‚˘aĆ.E€Á‰ŕ8y€Č…�p Ć�męˇ#óż_ů×®Ź9źŢćŮ[ttß§»ŃşNŹĺ­źK˛ďč—gí˙VŞçm˛í_°ĚÂç¦ó ϱ˙���W˙űn •‚µ&�°FŞ-Ć€EFhf0† Á5ř#qŃ_ŕ_FĆŚvE»{ţ~źs#óz]$ý ő$IHM µ'¤+o—™QĘ,ˇ¤*jP���˙˙űl˙űRÄ� ůa-ŻMá5ĺőżdLp¤ÁĽ�ŚFޤŔÍÝ€Ô Df ŔD` j*  %�Ö2µÉ˙‘}˙<˛őgŘŻ_ý¶wŮţËčÍ›ťš´í\«ć×ô%´wÖßýĹébťrŃÖÜ��í˙˙í¸ Thtü `:<ć)‚b†<fqňn–P8ölrŚTfť®ßţö§[6˝Ň–ŹÜEöµ4˙•µťŞőŰÔ€7/á ď’���_˙˙űl`�€ A0?��1C˙űRÄ € Ńa+ŻMáveµżäT#‹Dl8}@Âp0m“07ŕ A�mŇ™#§˙ŻüóëůLÜňŐîęjŐ“Mú»˝Uűą˝}W%«÷’ÇľŤ¦ŢéJ3oµżfŞł˙Ntźđ��7˙¶ŕPÁ‚1D٧0 ,0vQN0s‚&0@Ł0 €F0 €Ö~ .㢿ŔżŘt_´[gb6µżżrksśaô!ĄôhĐ‹{L­‹Ş-2¦ŐŘŇ5B���˙˙űl`�` 20˙űRÄ€ éa-ŻMákeµżäT4�3Đ1Óy”«7fb0ZĂ� ,*4‚ŕ$úÖ2µĘ˙˙˙˙9Ď6®š7_¶ţöűz˙šőßÝť—©żękrşűUéř»U·Ks¶żŔ��˙˙ţŰ‚ÇH)&L` „Va"ra„J`*D`€’`€*z~š&༽ѹj=ÓţćĄ5¦´N¸W\Ŕ±3Ć'SM,ů}ťŃA¸űzŤąoÚ1Ż���ýţŰl`"� `~˙űRÄ€ ±a+ŻMá:ĺőżdLFŔNb~Ś\pÎŇ`Ň&ŕjB€��Ë…2GO˙˙ç˙Ţ)‡´§m˙éć'ÓčgەܫNő~eˇuzz§TofúüC1 Qś»K´ĺ‡0��˙ď¶áPBA±á…Ć ‘ŹŃ‚EťžČ`ž `Ôç‚ú69ľŞ=ö˙_y=.“z¶úävˇż:ňÎňÔ)”»kS”ˇO���ţűl` & `|&ŕ`bt˙űRÄ € }a+ŻMáp„eµżäTgíţp¬¦& `ĚF@d(¦� ü‡h%iĺů˙Őo˙) O{ý©ëěŰ#d:{ÔýŰK:ş·ŁČ¬•˙J˛V:ÚíµŘ{ ]Sëc)hj���·˙˙öÜ(X ¤µ!€¶… ‡é…‚é€Ô€vY€R�ŮčAúČgër~ÇA ;yěsI^öěqçlpó†F\Şz|ŞĐĎZŐrí«"j) ͬLóäŻ���˙˙űlcB€¦˙űRÄ€ d-­{Baw„eµżäTĚqę^bĆî śn‚ €uH4â X ›µT ĹűćťgĘóT­ÝŰŮíS»i·�glć±dűóŠmR˛V©W€��+ż˙}· „Ź€ŚvŚŔfpĂCXĂ `ŔuŚŔ>0Ŕ(�pő,úp#Ć/9o}*í üę=´˙tSşAęDMˇËI ZYť­<ňĎV‚4)Ü@ä5ő“4‚ď���˙öűl`$f `x&`€bh˙űRÄ � á_+ŻMáeµú 4ç 1p`&%`0`ŔF�€\ ł�Đ|0†łLµ˙żüż~”±kě˝{č~¶[Űdýď˘ëĺ˝_őť,»ëüŠÚYď“}hńń7rUş-���W˙˙űn�pă�s�€ Ä!“ ‘ ł D!3ř  Ó�¬đ6C�ÝŁ�çâHW4tőţ˙Şţ˙úŃ~ßj÷-?}Ő_Ž´Ą4SĺŰ%ŮHÉ­ń|)Ş›ĹłĆ$Ż���˙ţŰ˙űRÄ€ Ś-­{BašŁ%µů‰tlcD&̡ćzbéP$n6†Ŕ6sÄ€RW­&�‹•JbíŘ|ă÷ěů3Óím?ř·ß©Ś].Rd(íÄIj÷‰ç,ĺwľµĹEźŕ�� ˙ßm„  €:`�`>`>$aÔ ôaĘ`DB`"�`�@`€"`�L|rˇşź«ö˙ÔżżôŞ=z_ż˙ßŰ7jRŠž‰ˇoß҄ңĽĽă»ÝőýC–ÝÎ���ź˙ţŰl˙űRÄ� ą_-ŻMá}eµżäT`& ``& ŕb ¦ćqZn&`D`�€€"i€h3€“L´ýű˙ËŻüňú˙zůţÝz?É÷/ő®˙ý¬żö›^wôŻ÷qâ”{ěü��_˙˙í¸D8`čfU8`C„aö Žaę„`I<`$€ž`€Fy$|Ú í~OŘĚÓžúvwą.ٵă“ÖƬsčJŢZť‰f\Ű>Ą<=˝ęÚHŐ•y|YIPô���˙ţű˙űRÄ€ d-­{Ba›Ł%µů‰tlcD¦Äáä–b#ăR€mÚ!†ŔV& B`V ¦‹•J®Ý‡íŞýÉŰm}I{¬nÇ*ÂĘęH†’Îsě.sż9wMŻOŠ·€��-˙˙}¶�B�Ů€€^Ů !Z€a(:途q€T!€f�©€l€ŕFĺCtOŐűęJŻţőMżôí˙ë}W˙Eôäyőíg2|{řa3ù۲­ô-MuĚ���˙ţűl`˙űRÄ€ Ý_-ŻMáp˘ĺőé‰tf `\& ` ař%¦ŕ3žm¤$& d Ŕ°Y€1€s]¦ kűÇ?/˙ÎuĘ ˙ůţÉŇě×ňú·ţ÷˙;7_ö˙»úműG¶SĆgÝf���ď˙˙¶ÝD�$`¦�a7f{›ľgŠ6ć`‚f`:`L Vká]Ů_ď˙Ż˙ôÎßűÓ˛˙˙§öô~˝k˙JôĆúĆĎĄ’óSž���ź˙˙űlcĹ˙űRÄ� Ě-­{BazŁ%µé‰t‚&˝ŕ®aň'ĆÜT¬mn&F€rFtĂŞ2ŘL@ö˝JbýŤĚíťÉě&źµWşoÜEĘkv‡ÉV¤YLá·Ť!bŰ_ČiŠŠ`�� ˙ßm‡@�*&�|`n¦CäiKńF‘ŕaZ& �ś`XĆ 2`h�z�ŤĘ‰ š~ŻŰ˙˙ţą4ďmk§ĄvÝ<Żöw÷éËűmZl¸ż¤ťďî]ęó·���ź˙ţŰl`¦ŕ$`X˙űRÄ€ _-ŻMáJ„%őŻdTć ŕ¸aä)ćص¶m0(fŕ€,�4`& Ľ`Ív%§Ńű—Ţ_ż©’÷ţÔ÷űtM~_˘Oň¶ążÝ‰§wţí®ńúĽfŐYŕ�� ˙˙˙mŇT(@Ćł6 $Ć¬Ń XÍ F¤Âp A ŔŚNeśŔSłKx Š_ţ˙č?N·=Hok.ş/·ě:÷ĽŁűŮgß˝L,zg”kŽ^���źďţűl`*FŔ6`nF €ęb&2†˙űRÄ � A_+ŻMáT%µżhTňYÜnÂ0Ć €ŞDc B`"€Ú` lş”A¦µú†Só§u3#wSk˙Ýú"RO˝ŞĄ§uk[ęôů$VߪŐt=źgőŞxËfí–ŐI»���[˙ţűl‡`HąŠüy… đŠ÷±§°ď^„©‚ 'QŻ>l €LŢs0L˝Ý_ëó‹[ým»T”ţdČ˝_]vžHÇ/íI%ţç-‹«¤_Ü���ż˙˙űl`(fŕ8`h¦ `ôb˙űRÄ € 9_+ŻMá]%µżhT4ćízňnt3fŕ´D%€0ópj0& LDŃ{ţżÍýČŤĎL¬««¦j»veŃČŻ‘ýÓ»~ďßĎ˝”ßŐśŰs:÷ŮéŁGéţ{]Ü��˙˙m˛ \äТŚ/GTŐ#©MJGTĂ$ŚA<Ŕ´ ÍbcË…f’üÁ ý)«ÍŐr‹Ť‘«óČĎ.IOąęŞ÷›ĘU›eŞÔműŐKoŇ®·Ź���źţűlcÇbćĄqÖÚa˙űRÄ � 0-­{BaÂ3euń ˝Ć/ĆËXlb.†€¦-¨€©‘Dh+ám:”I_±Çżřq>ďÚŘ×/Ů0îŤ5´CHÎnI‹=Ţ+bÝöÉUˇnđ��˙˙ď¶Čt0�Ŕ0�B0@ť08‚ 1ĐN1‡ 0;@§0€^0 €60 Ŕ+0�V0� ^ňÁd9ý/ĺýz÷TFD×}ý5ôú{4§ůüť;Ń˙ĐÄgnúý¤ż1Ö×j5:ąźuÉŰîÍh&���ż˙˙űl`ć˙űRÄ� %_-ŻMáS嵿hL 0`P&  äa¸1ćĆyjl0fŕ° # `$&`¨`"M6/ ëďůźÖeŻKÚŹYkűuJÍWäőëWżů}éýţĽĎďOzÜ{kţě˝ß€��/˙˙ý¶Mó�1łSJ‚0ËóZÍó5‹Ó Ś;łÍjóTÖË2ˇŮ$Ľ4íwżö=.°ą4{*ÚŘ›79n,¤ˇ–î§éŮgŘĆlĄn���źţűlcÇC&ť‘Đîa˙űRÄ � <-­{Ba°ł%uá ˝®3†Á<kÂ2Ŕş ´"eĎJ&HKNĄWFÇŠ»>ď»ÚÍüâlÚÇrö«rŇŚíđСj·•ť·űý���ż˙ýöŮ- Ŕ\ŔŚBTĂČ|Ť«ýŕÚ| >„Á¸ €ŕŔĚ Ě xŔhĽ°ä9ŰĄżú&źý5 $·űm¶¤÷KŐŠDëC¦©˘t÷÷–du\üÓ&‡ßg˝:Qöĺíévěu[���ź˙űl`& 4`˙űRÄ� Ő=-ŻLKáU嵯hLH¦ ŕôaś5f»» kl3ć Ä`P�!p 0ÓpNšâO"űď˙˙ý«Ł{očŐCWîÉŻ"×–Ý˙ßü÷­SűĽźŠ}d÷Wžöýř��˙˙˙ŰeW0ŚűˇčĂdiM´´×„iL7‚ďĎ5lMBcSLɉi”ŕ!§źg&3ö§yć˘˙trÜ$±ďŚÓ+ĄĘBiĄ<Ű $µd÷ěmhĄ®���źţűlcČ#¦Ť±Ęţa’6ƵŰĚ˙űRÄ � ¨!-­{Bˇł3%uá ˝k5F�Ň`J�€Ŕ 3fŤDł(“KrS®^­7ŻWÖž§ýu˝f’ŠßK·1C—ö^hcü’Ąjߪ‹®gŔ��˙˙ţŰ'!€X ÁE‘¸ŹFrˇHL9á ™€2 �s–‡;týżWÓľ˙jŁuí˛őŇę¤éEŐ}ß2ň?OŢ÷ßB%R˙;¦ú˘×¶Ě•­wĎ˙żĎE†���ź˙űl`&`8`@˙űRÄ � I=-ŻLKáŹ#%µé t&áa€8fŻü†j´7& Ř`< 0“°Fą„âO"ő#˙ż˙ý˙Ý:k¶ěş1RźmŻő÷n…ţ•Ţ޵gDŞćÓq^Íę[Pďł7Ŕ��˙˙ţŰ,9€0Y‚°8rŚI˛Ć*›ŚI‡P?1‚iXQ(+ýŠPľ‚h ýčP«×O«[őuţ•ë˙ďÖ•DţzWzďk~Ő«ďa*ío*é™NrőSőŞÝě���źţűl˙űRÄ� t!+­˙Bˇa„%µŻhTbbĆ,Ndéˇ>`k„$c!Hbň„ `a `€$`��iĎŠ&xJö–ÚPzĺę÷Ňäô›Z©XßŇ*ÁU´® (čaB zŘÁĆşî=¶Śszr´od´«X·7ř��˙˙˙ŰebDšEgY‡PĽ>߲ ˝wŮ%‘ŁVh­ÁŤ>“0L˝Ý)şî˝fhxöÖaLŐq�tkeuőŻžÖľłŤOĐ9±ËŰě-­.���ź˙Űl˙űRÄ� (-­űBa—"ĺµé ta‚&"<c‡¦a`;&Ł=Úič9ćŕěe€©Ż€fA3Yá“Nß˙s…›]MkťţŤ„ŻWPŻzwą¨UËÚŘ­]Îů/Ŕ��˙˙ţŰ+ł� 0'S f0ń“j i6yÓ@v0eł30"Ă]˝}ĐAúßű˛ż[+÷ţëúŮSN˙«ö˘uô×µ^»ŁŰM{mJ źLÓ‹µUEd”ϱ„: Ź���~˙ţűlbc(R˙űRÄ€ $!+­˙Bˇ„%uŻhTdi†‘N`a„TbÉ"´b¶„<`W` €8`�jĚ©&€:ľ–ÚQ«—Š'É~˘TKc”›Ýms­­Ę n,ćęcÁÚűAŐ?O•—jĚÜ–ŰQ߀��/˙˙ý¶MC"$Ř*=üĚG0Ţߍá†@Ä|!Ě`ŔČŤK“MŔÇeô™‚bië)DÚc|ŔÁU ś—RY‹± Xş‰&nďZpŔĄKč<.»QC\ŘI{®Ĺˇ���ź˙ű˙űRÄ€ ¬!-­ű"ˇ‚Ł%µé tla‚f@c&s$a<=¦•?i<f ü`  9<ř6Ŕ_łŘ¬ÍýWö©:ă-aŤR–'fŐź˝®}¬ŐVI)Hëz˛ÍKľ‹7„ŕ�� ˙˙˙m•ů€`€ů�-}ŠI·4›[ŠY‡ŕ63‚IHq€Ř0Ď‹ ľ‚h ýoý«ý˙™}I˙ô÷ôB^őű«Űęô«5j#U¸Ř†®wŻő/ť���~˙˙űlb#$V˙űRÄ€ °!+­˙"ˇ‚#%µé tcéĆ}^`W„€b‡#ôbv„h`L2`€H�dďHţüâ gNÚQ­š˝kŐe ZŢő8iBQŻ‹ÄB‡Őx˝$ě°ăśůăFśâďěéVź šŁó·¤OhZp+đ��˙˙˙¶Ę°f@8`Ć ¦Âlm˙<ÚBtb & ŔŚ`L† b`0 @mÂË.&‚i·K˙ęę˙öꎽîËm«mźţ™w}ŽĽŤÓ¦˙ő351ý¶˘/Řík¬çס.���˙űRÄ€ !/­ű"ˇĺuŻhL›˙űn`Á¦4aÇ&O`ě7¦u|g 6¦ ŕä‘ 7…:ćTĐg¸ł7ő˙ŻĄµ\—˝IŻÖŁČŐŁľŠŻz\ňžLú˙ĽHštŠŘ~đŔ��˙˙ţŰ%™”�mĐźkĆ%b˘p1TfüâŞbX‡î™Ż‚hŢć$»\§ÁÓÜvLŤ‰ÜxŢĆ’Jjß˝,^‡¸ëäÚĆSY1 „Š”ÍéX§×'k T]%@/���˙˙űlb#˙űRÄ� t#+­˙Bˇ˘ĺµé‰tVc*Fij`K„¤b@%b0„Ś`AB �°XSf0á54€Vtí®=löţK|]˛¤Ü¦%mXHYFóÉQÂôRG �^“4>ńĎp’ˇaÜ€f1l« çÝř��˙˙˙Űe ` 2‚I0™Ć¸ ‹‚ů@!ˇ€¸ 0 .râh-6éý}]÷űÖ©ö–˝_cQ˝ë®U6úWť?úzăöJ.ŐŰ^ĆňľÝŽ��˙űRÄ� h#-­˙"ˇ[嵯hL�z˙˙űnaBfDaČćO8`;a× ęaÉ `1"�śă¨SŢ`WËöz÷]§kŻú}ěuŚ ­]¶b†ňń"čËY9OdŔ-č5‡Š Ű-cež&Ŕ��˙˙ţŰ$Đ9Ż"yˇ…‡éşD›ŤP,f•©”ddt.EpL0ş{Â]#lorvaą‘Š±Żąęµ Ü´ź …6NaŐ§8¦r{R%o���˙űla"F ˙űRÄ� Ô#-­˙"ˇQ嵯hLFa¨ĆE>`6„(a´!Ha¨„`,JA@XÄ ďX´íţ=l˙÷ąLŰ‘p¸Äă©PpÂęSŠý ͡wű“łců0Ě^S¸˙Ä8��˙˙˙Űd- Nk‡—f!ĐnşńFĺÁÜb g˘˘hdŮÍ@BÝ@p>¨“Ečd`şVEÇ\ťVĆ짢ŠhćŔ»|iaďjíKz|_:n$���{˙űn`�&`€H`�’`@`06a˙űRÄ€ !_-ŻMá`%µŻhTˇ˘a„"`&$:hđŕ L�>błĂ=Żď?ú˙˙­ż]4Óú|Ô˘Ążç˙jUľD§űjł.ďúz†Sĺĺ–i„ńT ‰?���_˙˙űl„AÉ łÔĐÄD4ÍŰ›”Ý6LC0Á¤Ě@ÔČ21:Á$ÝŠřżôŢ+ú_ŢP¨É?µ+Ł.–Rű )ŰŽŢň®ďE “÷=ŮJ÷®Ą!Śť���[˙˙űna"J`é1F`*„<ak˙űRÄ � T#-­˙"ˇ™euę 4!ěa`„,`*�¸X€[ÇŇáž­éŰü~ŠŮ˙ó„u2¶Xav.ĺ Üłî˝TP„w[HóŹS¬ŮV€ĚR¦öî�0Cx��ß˙˙Űa sŔ 0sŔÚ8Ťq…`â1;S H0(�2ŻŔĹ~�CĎ(&Ą¦Ý_˙^źý–M5ëĐ»™km›ŁŕćéBĄś‰vŁŽ`´-K®®Ev» ^+˘ŕ°Řł$���˙űl`Â&H`‰&'H`˙űRÄ € <#-­˙"ˇ¤Ł%ué‰t$JaD˘2a96`, �Ě8đ—O´Â[ł×şäÉmcł·źěiÄýëŹó×LT] ÓRIĐ”&Î %ťÍžłífĽşŢ���ż˙˙öŘ8†€ĐŔôL€°Äü0N',áś2LO0ÁäĚ ŔüŔ@ Âr1…4¤˙˙ő·VţŘ7¶‹veu×fO~žb÷üĘëu}vMöł­: űÄ‹2�sVúě)NőÖ¤ß6���w˙˙űn`â�˙űRÄ� \!-­˙"ˇ\„%µŻhTJ`)FN`„Pa"ha„<`2`��h€|Gá˘`­éŰ⦮ęNžî¤AýókmmKlii—š]Ëíjőjnó…[:®Ĺč:r���ż˙˙öŘ8)°6CÚtÄX# ćSÝ % DŔäÁ Ś�Đĵ�n}ęlȵßîëóµ cÔýśă6čVčçnIAŻ,îjgß[TzsAdi<���˙űn`�"��Y€1˙űRÄ � =_-ŻMá|Ł%µé‰t€\YľŠiś€*Ń€¸(q`LĐ€B\4c;"őýîÍ_˙·÷_ÖÖŞ˙é쉺/¦š­¦Ôúööł&ßÓş™woş/PËmŚEhIw~���ż˙˙öŘ0ŠŔX ć €$b.fôönâ¦"€d`Φ`f`€o3j]ź˙˙÷Ż·ô×OKSz7űű6×÷miëߥ{TŚm(7Č2tĂ˙”©Šf‘TO^���w˙˙űn`˙űRÄ€ �!-­˙"ˇ#%µé‰t˘�BPJQ€Tá0Ż.a�@N€�€8ČŘ+ŠŠř¨îŻţ¸Ch˛Ů[Ü_`ő‹Äş˙Ě]_N™D}Ŕŕ ‹?áâś���˙˙űl$@\ † ŕb0 Ćő&@ně " V`ČF@d`ˇ@ngĄ»u~żý_żő˘këjďµëý‘›)ţĘÝJÚ6JűďgĄ“á¦ÉşÚ]ÖÄnľ%MóÎ���˙űn� ˙űRÄ€ Ľ/­ű"a”¬%uŕ‰ĽŽŹÂ˛ŇaďéfCÂ2Ćn kĘč ‹&;F*í;^ď_íű(÷ď¸Çl©ŁEh%‹!˝Ö“úźí­h.6���ż˙˙öŘ ÂŔz4ć@bŠgEq f'ŔX`îfŕz`p·˘„Ś“á~e˙źţľgĽgbZf§§ű[r}QşŻ5ó-Đë¶ź«Ů7mőŁËV•˝%S±í���[˙˙űn`€ �”BP ˙űRÄ � u›-ŻMáŹ%uę‰,(FR.ĆřEP(L` ŕ€gäĹD;:úwŰű˙˙ÖČíó}4ľoşkj–ď­:żO˙őKnŹýÚßţźµY¶m˙Cüą&č��˙˙˙Ű`0 ‡ń@>9Š bŠÄ`ź) ŕ�@˘ rÂÔ·n•˙őű×ýýTř´u VşTyU*j—[óţ·ř…&G{´‹µuą+CŁ ���{˙űn Ž˙űPÄ� č/­ű"a‡,%uŕ‰Ľ ’ČG¬ŔGŐLŚŔ"Ť]MĆĐ)Łe=F*3N×9ÚUOµ;w˙Mż&îOÖ”ĐI ůç-ÝËšYÉZía-’ág@��˙˙ţŰ�€h0Fř A Š(ă!€b6b|F`j`6`€@!2@|(HÉ>ç˙ĎőÖg0ąď§VÝîžËşÚ‹GÝŰŞrľ•k_čĘŹŁk§E¶–kkżďjOëÓ˝/���_˙űn`�€�”tˇ*@˙űRÄ � í›-ŻMáN„%µŻhT¨ĽÁ`Q� @�Î,á@ sD;9ý?oĺý¶˙µý¬Űí«Tß}ÖĹ:'YýŹÓĄ)ţ‰fµ˙šŻ§˙»íą—ô˙SĺŢwŕ�� ˙˙˙m€ÄB iĽb0ćőăjnř�¦"``ŔĆ@\jK¸„”shýŤ}¨¨¨�lŹBdl]JQ”]}|óR÷­ŢFÁoń<«'µl­Í���S˙űn��4BP°°�F˙űRÄ € ›-ŻMé§Ąµé‰|&‚.fxEf@F(fˇ�4�öDśQŚěźýúWě˙·ÖeţšëűßÁ7Úú-»˝t}•ţD§őęZ?oć}Qč˙ú4űIX9Wx��˙˙˙Ű` €Ä €Aşb2FőEhnňF"@�`ľ¦ ^"A€oGT»?F˙˙×ßoüżÝŇőzŮ×őęíR">ŠÝźúÓoŐ{Ą ţę[-b¦č˘¦úˇ���˙˙űn �˙űRÄ� i›/ŻMé—+ĺuŕ‰Ľa@ ŕhH A‰_˘“hEÁ€ŕ¸(€ÁŹŃ4Ć\ż˙˙ü¦Zűúëz§ßoeůŻĐ˝:őTéźţź˙íű"őŮň|ĎţĐŹŔ��˙˙ţŰ�(€AaĆ(@Ňqrg�˛'sŕ(0? „„žŁ+O˙Ź—z»ţdľŐ¤Y~˛ěý+ô“G÷lÍ}Ť˝´±µóč—Ě;gŘďĹ­ÝÉÔV‚Î���W˙űRÄ€ č!-­˙"ˇ'Ąµé‰|ţűl "K0*�Ľ"óásĚ"s #�Ľs�”0=čŁa® ;ÂČżŻéM^eZ•ţ-¸¶•ЇÝ)UĎKŕýGČżs÷é÷ AcďgŔ��˙˙ţŰ€� L @�Á°ĚEÁĐŢq ÚÁ‡ ŔtŔ4 I�Č( ŕ:c”bĄŮú?ˇý ţô×}¤§GĘőoŞik˝vN‹ýv·ôčąľöń ©V¦ÝţQ/���_˙˙Űl ˙űRÄ� #-­˙"ˇ•+ĺuŕ‰Ľ#%M9€xQ„&Š„!€˘€dA€L�ˇę řP Žr˙ú6}}E;b¤jz;té˝Td}Ći ŃĽ�÷Úĺó6JĘ\ŐV‰��˙˙űí±€€€!đ?‰đSśQŻ9ĂPK‡Q@ˇ €B�ŚŃ•ŻÝWĺG]2Ď‚čÚéoMPÝí&­żyžm{V{ÚćíëDäąrźĹ­´Đ»YĐAN���Wţűl˙űRÄ� ś!-­˙"ˇL嵯hL ! ¤u1€–I„̉9„¶€¸€nI€N�ąč!úxkr~đ±KúţŹĐ”wuĆ–žâ5čzNÖã㞪°Âg@ŽjÍż~Q«ëRXŐ<n���˙˙˙¶ŘĹ„3�ÍÔ”ÄL)ŤáÝT&€Ä"uËu#,€A„ßj¦Xş’¦?m5|Ń4bČSĘ˝Xĺźz}Śď[>¤ŚśŮ]HeRž­Ž���7˙űl *ŚvüŔf ˙űRÄ � 4!+­˙Bˇť«ĺuŕ‰ĽĐĂM Ă ¸ŔyôŔF`Ŕ2�€ßŤ9(*ů°M7u}~şN-g§Ś*B3j•f8^Y„n¦ś4ä×çŚÍ)•ű’ÄTí C^·8��ßţŰc� 0!�ŕ0}c€Ý8x3„ Ď1/�Ł@0!�đ •Ż_v”ţÚÍźň2üŇ…µż˙ú±ţŇQ ˝ë]ţş5޵7uŞ%:-×vő«·eoŘÔk���7ţű˙űRÄ€ ŕ!+­˙Bˇt+ĺµŕ‰Ľl $(0S"ľ0Bo0Ü“?0×Âi0!€Ľ0Ŕ[0 Ŕ#7ĂŽ:0tőY#°"ţ´÷ęGYú5ĆŰâ’J8Ýk“›ťbźcơu9y0R}n~ýztŠŁ[Â_���˙öŰl`�Ć�`f �fb†ěŽxnj @"`¦ć�`N�`k�›µTGOŻ˙×ý}O?żëď·˙oN”íţžßŇýĐżÓk7%;lţ¸ÖUĺ7˝-���W˙˙Ű˙űRÄ€ h!-­˙"ˇ‹+ĺµŕ‰Ľl0cˇ00ÓPş0΂0@ˇ0�L0 €<Í> ń‹Î[/wW×wĂčPő˙:śC†–ëkÚđ!‡Wô!Ł-ľ»’Ô¶ëÖ.›Tă?Ŕ��'ű˙ľŰ�9€Č�©H…Yş‹ď›ů '�P� €^` �vk­>ľçËé{˙#/ĘŐ×˙że]źjjµě»_NôwlŰ­}ż]×/őO§~Ô×���_˙˙űRÄ€ °!/­ű"ˇž+ĺuŕ‰Ľţűl"�śäA8癏t)xć9AČ €ÉĐQŢčEíb—őűúşO«ő§Ĺ9ä\Ěý÷ŐÜmźĚ¦ÔéwŐľđ��˙˙í¶Ć``@& <`đ ć%âLp5Gb0bD& `Рɀ0 łŞQ5Şđ_Ë÷kď2 Ü%J_z«e˙­¶š÷"t'oÚŢÚ“eiµĎe¤žČ×ëK m>g{­���w˙˙űn#�˙űRÄ� D!/­ű"ˇź«ĺuŕ‰Ľ0#!‡0nŁ5ľV3Fc°‰0: :M; XĐç3/wWŃŻ Ç¬c?Ój?şę߼b廳C˝Ű„ĚSu9+E×7€��?˙˙m¶0�ó0:3pV1*Ó‚ZW7đóđ20X�@ ą€¸;€ł]¦ k˙rÉ3úů‘—áý?˙ÓďÚ´Ń«ż&ýhő«^‡uĄ2őŇG\Ďúߎ¦ôZÖVQCŻ���_˙ţűl"�@�Ń˙űRÄ� Í-ŻĚKˇv«ĺµŕ‰Ľ€€\Ń9, ‡ţ0ဖy€V€d�ˇ€rxěF…sDŮ]˝˙W_˙żU×M·§oű^˝ę—Ńzóú-©QľÄ˘†RO˝U·Še/ŕ��˙ţűmŚ@(Ŕ`Ě ŔxÁĚ?ÄÜ"gŤ¶Ä`ĂČ @Áó�0*03�@r©Dtú˙˙üł~¶NšŢ‹˙Ú}:ÓŞ{ëíý=(ßŮ«ooĄVŤ×ć{í���w˙˙˙űRÄ� @!/­ű"ˇ„+ĺµŕ‰ĽűnB3423Ľ3Ëß;Aş0‹S�B0"ĂĄ˛€U s1R÷z;żĚQuN§ôNŻé»_¸ňőżąsG=Ű‚ŤG©iaŮç���ź˙ţŰl`f `\f ¨aô'&Ý´Rm€%¦ŕl�0łP`0�ć»L×ţţ~G˙ţYň˝˙˙úú~Ô˘š­ő55Ó·­k_őŐ]ýż_ަtXâ:bÂŻ���_˙ţűl00óó˙űRÄ€ ¬!-­ű"ˇš«ĺuŕ‰Ľ6”0źsIŁ4w3  š0QóĐ'<=wnż'đżŻýö%zľ,šÜ�CššűŁ{Ă©ĘqFďib±ę­˙VR˙ŕ��o˙˙mŚ@HŔxL@¸ÁŔĚFĹčß ŤäŸÄ0Ă‚lFf d`@&Ŕ*Ë©DôţĄţŻž§>–{Q™Ń}ץ¨^Ó=ňš¶˙oΤv^Úk'o¦ßGq§%Ľ ž1���{˙˙űn:��Đ0˙űRÄ€ Ő-ŻLKˇY„%µŻhTă°“0¨ĂLż\4®Ł 0™0RăŔ(01ł@:ŔnTMÓC«ö§ţ§műdýíë˙ţ­˘Ż®»ÉąwÓ·FÉQrQţg"ŁôE-i:”x��˙˙÷Űc4Ë’5ŠNî[6ݞóh!O0ăAŕxśÍÜ1cZlPĎŻčE}VĄ-˙E…,-[.JZŁę]W^ę*ĚćEßĺU-C.˝Ú¦ź���W˙ţűn‡P@±Šž˙űRÄ� 8-­űBať,%uŕ‰Ľ™ôq…ńšx‰§(đ]±ŐžkTšă†Íů™Í'Á0†śó´SłÉ’mZ“c—ŞA)ˆ؊v'ą63é|ҸşgITLÄâ”0ş‰ßü��˙˙˙m±€¨ �é¨5ÉxĐĽjaş8Ę€É0E€ů€Y€ °jQ„´×Ą˙7őćç?Ű»őJj‹ďţ徎ߥY_č‡úë¦÷¶„}÷é´mn_0̲X���_˙˙űn”˙űRÄ€ -­űBa,%µŕ‰ĽŔQS:48ł Ř59ěQÖ0Ă 3­8Ö*5çÍ„#,›ËŔFĆ_µvűű&iú®D×{›RĆő$IHmmújf0É ©ěˇ¬¨Jä-ü��}˙űí±€p €±P+Q‡ ˝›3ŕů±ŕ·k‚€Đ6’€ˇ€€‚Á€x4Ú`‹\˙ýy˙äYý]»łfüż×óo§jÔ«éßęěí°ú_öř­{®Z,u®���W˙ţűl”ŕ�˙űRÄ� )-ŻLKˇ,%µŕ‰Ľ0“@0ÁóV®k5KÓ €0YóĐ-0,đGąDŕO šz˙×ëëýľőşŞw[}űćű'˛ŁSž˝Ż_˙Rţ7{šUšRŇU×â›ňŔ��/˙˙ţŰ€q€  ‚ 8oŚA˛H ‹ń†€+†0Ŕ *�[NĄq-~˙˙ţiĎ/÷ßu˙%´·»|şßkWmä˛Ý(żô[-c}ęßŘm,˙mŹ���_˙ö˙űRÄ� -­űBaR„%µŻhTűl›†&cFĆ“ a8FłĽ jô8!v§ņ­¬”e2y`8ć6nĹQěFÖľŹ‹×xKäŞCZÚ_Ek[/Kćjj«yK±¤tˇ ŕ��ß˙ßmŚpó*`Ó3:} 6dŘ_?M{†4Ă$Ŕş*Q Ą¤dD4ÚlV[˙ęŻŇGÖ÷+ú”p_ áŽëűBc^ňĎílđíhŞŇÔÖ{Kle¬���{˙˙űlˇć�@ `:f �a˙űRÄ € ±-ŻLKˇF%µŻhT˘6ćą[fkR6¦Á`ş ć ^`T† š3‰Ŕľ‚h ý}˙ę^ż˙÷_˝iz5m›Ůş«::§g^wëűçw®7‹ Ń ŠöÔ¦-ŢĹiżđ�� ď˙ý¶Ć<”6iZď&#Hk٬†¸Ł4a„ R�i—<i§™!,š—%úľŹĐvšÔçSęďNëŢănŢ:>ź‰Żoꩊ~]©k¬���_˙ţűl–† *`L† á"ađ=Ú>˙űRÄ � i+ŻLKˇS%µŻhTXmL= !>`ŕ †Ŕt`f&€Ŕ‡üśMÓn¦űQµ^­ľßĘšt˛?ţů®ýVfNÔ—CQ¦çß÷ÜéQKE¨|Ň�g{ĹdVä-jr” @��/˙˙ľŰâ&LѢnse ™­ţăšĚ 9…Ř3�TŚÁÓS0ʆd˛ěVYők˙_µIoöto\9©ŹUĎC«w8Ô skďYjŰż©/���_˙˙÷l•f$e'&Ĺb;&ŕ˙űRÄ � (!+­űBˇW%µżhTnm®;& Á4`ć ¦ vlf\{—ŕovYwßaÝ´J¬‘׍bĎ^ÄĽ‘‚¨–LÝ÷Fěpuµ+–TI©Żkެ縮·żŔ��'ż˙ţŰh‰™Á¤AaŤń¬wµŤˇ…5€0 ĚéŁU$ËdŇÜ”k˙ęWłĽ´m•v ÚRˇ*ϔ핮Ђ4ţ5?Ő^ű“CXłŚ���_˙˙Űl—†`"`TĆ ˇb 9ĺüp˙űRÄ € -+ŻLKˇF„%µżhTn9!ˇ*`ä F€x`^fŔĚHüśMÓn¦úę}Rt»ßůSőZ=—˙_ý_×-iĄ6ľš=hÚĐU)=EčK—t¬ŠŮ\Aµ•čk ��ď˙ßmŚ0DÄG €ěŃaŚ.‡,ŐźMN¬ �4 �†xÉ­eÂ2Yv+ Ú­·č=+«Z=u-ĹńEÉ÷ßç˙Ď6”2”î–ŻćYą���_˙˙űlće¦fŃ�b6ćë[rnZ7&˙űRÄ� !+­űBˇś„%użčT"A `ę f zkÝfL‹§ŔßĐ›ŻuęÖĂ;.cÖ€{C‰ ,ŕáXe/ŢüR~]jíe)č`×9ęÎřx®Yţ��>˙˙öŘÄĆ XśÉŇ :„ŔŃhĹćCĹ˝8ŔĽ$Ŕ�XŔ�Ôś7Ěđ•}-´ŁW#P€ş1d «JZY±j=¬ďZÎ- Yíę éaÎs˛ôĽ 6){•ӝԔޣŹ���W˙˙űlş @Ŕ ˙űRÄ� Ť-ŻHKˇv„eużčTŚÁ¤Ă¸[ŤĄn@ٰ\ <ÁÜÁŚ €ČŔŚ Lp0\eÄĐM6ę˙˙Ő˙ôŞkŇódŐö}-şľ¬żőM36›÷ôj|{:1tôE$VîBĆ‘¬˝Îŕ��ß˙˙mŚHdĹJ ‘,Ňé `‰ĚZ”OLX�†Ě 0# €Ě�p�ŤQłw(ІW˛ë=v˝żgŰŐ©aú µ‚/Ü^˝";V’˘‰%Účéá—»JOY)éŢô���˙˙űlµĚ˙űRÄ� q-ŻHKˇJĺőŻdL€ŔśĚĂÔWÍ­¬TÚ<XL=ČÁ”Ě @ĚŔ€ Á|ô\ôAëż˙__˙ëÉöKQ÷˛§ŰĄ©§Won˝hËüęTşĐo“M ЇŢĹVűř¦‹đ�� ·˙˙¶ća2dÚďfcThI°Ć#D`ô f:�ŕM˛Ž‹ŔŇłk"G˘Ť‡ß˙ÝÚĂčG÷ˇÁßqżo©%:ÍÎ0Ł|¤ęŮ[Ҧź'–AÎ���_˙˙űlŻ @ Ŕ ˙űRÄ� I-ŻHKˇ7ĺőŻdL ÁtĂŕSŤµęPÚ°T ?AĽÁ �ĐŔ| Ě€8YeÄĐM?W˙ţÝżý?d]6ŻýźKe7Él©M;=őůÝ*.ŢćŰN”gÖţBăĚŃBŔ��'˙˙ţŰa¦$Ánj˙A ™źžá™ë Y6J† ntÔ©šĎÜšö˙·˝ěíŘóďMš$NYµ=—Ýő.y]u -]^3{¤®���_˙˙űlśf@`j¦@ĚbJ-¦ţňo˙űRÄ� 5+ŻLKˇY嵿dL~.&$Ŕř`ň ¦ ~`HF ęş‹ ľ‚h ývëţ®ż˙ů÷ßtťĄ®ŠžÍěÓ飻2ŐWެ»ú5îÝ3!äF¶ŽĺŞÖĎč±÷‡ř��×˙˙Űs 0Â3B3 sńü4D˙Bqň0|SŕĺNrŹL@\ŻéŃ#ôl`÷ěEžsí§Ţ¸ĚÖy¶V˘ ~úHV} »źb™Ü+ ¬=ô!RRE®���_˙˙űl” `l ÂbP+˙űRÄ � y+ŻPIa9ĺőżdLő°o¸+†%`î`đ F�€ŤŘîŔb ,¸š ¦ÝWőÓý,–Gţ¸J({ÖA«Ű$¦˛Š $ŔËÜ÷X÷$k–ő#DŇÜŰťËŐµNZö-Çx��˙˙˙Űs 0QŁ 92X#Ă3…ă6Áą0a@ŁbÇť˛®h3®Lľ×˙OúŃZg)óo íW˙ň¶»ş±ö««`z+OŚĎ˝$®���_˙˙űlŚ@ ,07Ó`X1/3‚Ę57ů˙űRÄ€ (Ă+ŻPIˇ?ĺőżdLsŕp0{3đA@đ ß0ĺĹ_A4~·ő«˙·{zéU×LďG][dök#6ŠÄCrhĄ5”ĂÖoĽ$‰Ş=ä™tKNÎBMŔ��ß˙ţŰ(a‚ YÁB4ŽAšW0™Ťń‚°;Ü"Dá�ě|kBť~Gaëżövµż»z^o¶ÚŰg}hGŘĹ7ą0ĚÍŤmJ‘���?˙˙űlD?4BŹa1`Ł—ŕ960˙űRÄ� č!)­űbˇ;ĺőżdLŽă€L2TłŽ0ćw(® ‹OnJ{‹T¸«Ôb·Ăm] ľkgEĺT(l>XŇš|zÖĆŠ•(ˇ+«†�¨ 3Xeۋ̜ˇOH»^őŔ��'˙˙ţŰ iŤAŮŽĂ/yF™|9‚h<BP° S˝ ‹š đ«“/··ű\Ţľ×ĺ|Ü‹§w#¦ß/`sł]Ł,ö‡˘Ňţ­®’���_˙˙űl<ŔÜ•?RŚMÄTáz5Î ÄlÄĐ˙űRÄ� D!+­{Bˇ§«ĺµń Ľ Á<Ŕ´LÓă+ôÁ™kř‚Ĺ˙Ľš®łr°0ŞÂ‘ěi;)¨6ô©Öľ—ąOŞDšC%-Z9•Wż.*»ńo€��?˙ý·0@0€%0ŔH0€ˇ0B0ÎÂ0ČB0�‘ �¨@ FŔŕŕX´číTéţ¶ţéű˙oţm?őúVk}ú[{lŹţűŁíuJűtć#6_m´ ˘UTö´•T���˙˙űl„!ÉÍ€Ł˙űRÄ� T-­{BaŤ„eużčTŇÜÄ86ŤÚ\pÜč8 CÁ<ô>4M ‹3¨IۨŐ˙ŁísúÚ’!]ł]jvŠŢ‚ @{Ţ7ˇmzö¶ßoDIř��×˙˙Űs 0’Ă W2Ă &Ó u4“ &3D Á"Ŕ€¸śt�ęJ¶E{Ł4ínw­~EŤyÖÔB•´Ë^xĺ0N¦˘KKu ¨ąśě ëT¶=ąĐóv±-<ö���_˙˙űl$AŔh`v¦€p˙űRÄ � <y+ŻPIa8ĺőżdLbz§ζp˘f'@¬`ö & ‚Qđßŕ dY†h&¤­?ężŐŰúÔ-¤@ç¤kŨYâ”Đá13«:]UÚ)tîńU’ď0¦ SťąC 5÷Źţ���ţ˙˙öÜŔ€¦xaѦ#¸d™ŢĆGc¨`X!I„  (đ4;…:,ýWěícżvÜO»v†'EiGŁşaZ÷gTÚşü˝Ď���_˙˙űl"Ŕn`x�Ćŕbb|˙űRÄ � +ŻLKˇ‹eużčTí pŔF' ˘`ôĆŔ|`&ć�yA5-6ę˝ő˙ę®Űý6†$żeµZ˛+~öłŢ¨Ű˛iţ˙–éeĹv ›} mY0˝’ýÄŐ‰���ż˙ţŰPą‚–2ÉŠŕ ;TéÉRA6`Y�`€CęrJRU˛+ݧk÷{wĽÇV¦=fÄ!†cś(PUO-Můqt‡=ë]ŞśŠ>L…Ö†­oˇŔD›���˙˙űl˙űRÄ€ č!-­{Bˇ—eużčT‰@ 9ě<b.¦ňŠ nʦ"@x`Î& jbˇroĄ}$C”^üz—ß-.±Ďú,%ő Ę“ĽĄňyl­{öŚŠoâ”2ţU-=:Ŕ��ß˙ţŰX±Á‡aá=HÉ×Fa8@Z@!€Děr‡QUŇüŁgŘ9¦|:×Ď‘MMUÖ <;kqŻP…Qű¨‚(kw ‚ĄPÍÂX"§ďŘĐÖB‚Ź���_˙˙űl˙űRÄ� (+­űba‹%µú 4"Pv|8Ó 8±Mه š1?x@2Că A0!�Ó§0h>© ü1B-ŢůeÔÄĎBn!`鋌˝µ­®§±˝Ź(ç5×»?×íĎâOŔ��˙˙ţŰ�€€@$�–`L`Z`Т¶`ÉJ`8`€r�ěaz� B)ló˛—Öß˙˙ţ‹§Ű˛żş/˛ol%FůĘŞź;żćZ”t7qňŐ1göŠXôŹ���˙˙űl˙űRÄ� -ŻLKˇ]„')Ź`TDŔZ ć Ŕb2 &ôĆÖnę f"€\`Ęf`f`€Đołj]ë˙Nť~¶«·ţżŇŻőo×ţ’˙Mąz5żjŮóĐdłšÉ?ŇŮĹ7í:ź*§ř��n_ţŰ0ĄĘ8ŔŁĚ °Ŕ)ę :CXŔ €ň#P(©A5,¨,ŕ Á�@\5Á�@.pÄó€€>Ü â{‡‡ßĽúsbté^ż­Ś˙˙˙˙˙˙˙˙˙˙˙˙����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/blank_video.m4v������������������������������������������������������������0000664�0000000�0000000�00000035252�14447736377�0020054�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������ftypmp42����isommp42��Ômoov���lmvhd����Î÷¤Î÷¤��X��I��������������������������������������������@���������������������������������iods�����O˙˙)˙��Ŕtrak���\tkhd�������Î÷¤���������D����������������������������������������������@���€��h�����$edts���elst���������:���������8mdia��� mdhd��������Î÷¤��ę`��âĘUÄ�����-hdlr��������vide������������VideoHandler���ăminf���vmhd��������������$dinf���dref���������� url �����Łstbl���§stsd����������—avc1�����������������������€h�H���H����������������������������������������˙˙���-avcCBŔ˙á�gBŔÚ€żĺ„��¤�©€<Xş€�hÎ<€���btrt��Ě������!���stts������������Ň���stss�������������(stsc����������������������������stsz�������������Ě��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ���stco���������ô��$L��™trak���\tkhd���Î÷¤Î÷¤���������I���������������������������������������������@�������������5mdia��� mdhd����Î÷¤Î÷¤��¬D��¨�UÄ�����Lhdlr��������soun������������IsoMedia File Produced by Google, 5-11-2011���Áminf���smhd�����������$dinf���dref���������� url �����…stbl���istsd����������Ymp4a���������������������¬D�����5esds����'���@������vř�����������������stts����������*������(stsc����������������������������Ľstsz�����������*���������������������������������������������������������������������������������������stco��������� Z��$ć��ňudta��ęmeta�������!hdlr��������mdirappl�����������˝ilst���gsst���data�������0���gstd���data�������1021���8gssd���0data�������B4A7DD704��������������������������gspu���data������������������������������������������������������������������������������������������������������������������������������������������gspm���data�����������������������������������������������������������������������������������������������������������������������������������������gshh��data�������r4---sn-a5m7zu7e.googlevideo.com����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1ľmdat��Če„ ˙˙ü=�0|śśśśśśśśśśśśśśśśśśśśśśśśśśśśśśśśśśśśśśťu×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×]u×^���Aš 'ŔĚ���Aš@'ŔĚ���Aš`'ŔĚ���Aš€'ŔĚ���Aš 'ŔĚ���AšŔ'ŔĚ���Ašŕ'ŔĚ���A›�'ŔĚ���A› 'ŔĚ���A›@'ŔĚ���A›`'ŔĚ���A›€'ŔĚ���A› 'ŔĚ���A›Ŕ'ŔĚ!�� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0{!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€w!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0z!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€u!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€p!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0p!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€t!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€x!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0}!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€v!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€r!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0s!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€u!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0s!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€~!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€z!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0w!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€z!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€z!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0w!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€x!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€v���A›ŕ'ŔĚ���Aš�'ŔĚ���Aš 'ŔĚ���Aš@'ŔĚ���Aš`'ŔĚ���Aš€'ŔĚ���Aš 'ŔĚ���AšŔ'ŔĚ���Ašŕ'ŔĚ���A›�'ŔĚ���A› 'ŔĚ���A›@'ŔĚ���A›`'ŔĚ���A›€'ŔĚ!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0u!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€u!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0~!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€z!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0{!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€u!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€q!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0~!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€}!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€s!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0q!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€s!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€|!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0z!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€x!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0~!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€q!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0€s!� ˙Ŕ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0y������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/broken-tenc.id3������������������������������������������������������������0000664�0000000�0000000�00000000620�14447736377�0017746�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����TENC��� �WXXX������TCOP�����TOPE�����COMM���h���engiTunNORM� 0000036C 000003E6 00000BC1 00000BC3 000186E5 000186CE 00004ACA 00005A82 00011170 00011170�TCMP������1�TIT2��� ���Take On Me�TPE1������A Ha�TALB������1985�TRCK������1�TDRC������1985�TCON������80s�˙ű˛@���K€���� p����.��� ��%Ŕ��˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙����������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/changed.mod����������������������������������������������������������������0000664�0000000�0000000�00000006074�14447736377�0017241�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������changed title�������This line will be trun���@���This line is ok.���������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@�����������������������������������������������������������������������������������������������������������������������������������8CHN����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/changed.s3m����������������������������������������������������������������0000664�0000000�0000000�00000001040�14447736377�0017150�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������changed title���������������������� �SCRM@}0ü�����������     ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ���������������������������������������€€����������������������������@���« ��������������This is an instrument name!���������������������������������@���« ��������������Module file formats�����������������������������������������@���« ��������������abuse instrument names��������������������������������������@���« ��������������as multiline comments.��������������������������������������@���« ��������������---------------------------�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/changed.xm�����������������������������������������������������������������0000664�0000000�0000000�00000012537�14447736377�0017107�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Extended Module: changed title�������TagLib���������������������€���}����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����@��€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€��Instrument names��������(�����������������������������������������������������������������������������������������������������@� �@������������������������������������������� � � ���������������������������������������������������˙����������������������������������@��€��Sample names����������������������@��€��are sometimes�����������are abused as�����������(�����������������������������������������������������������������������������������������������������@� �@������������������������������������������� � � ���������������������������������������������������˙����������������������������������@��€��also abused as����������comments in�������������(�����������������������������������������������������������������������������������������������������@� �@������������������������������������������� � � ���������������������������������������������������˙����������������������������������@��€��comments.�������������������������@��€���������������������������module file formats.��������======================��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/click.mpc������������������������������������������������������������������0000664�0000000�0000000�00000003064�14447736377�0016731�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MP+���ę \gźgź��Đ™żżsŢĚ4}>˙|š™ĎünĆíżíň"v…KŮd"墲Ë*{Ëeiy\ţ=ćsŻyć™4Çł™g–żč/ćücţ X@ŢOčë»ýcc{Ň„ň-y^˘g2<őDćG•śjQ(˝ë5ŕ ™lYR1ElâŤţż˙ĎđýĂ˙.<*“0Z‚ÉňP>Ô;ęZĎăăćKä'?I%.¦]$QÔ‹(ňw§­—Ľ÷%3ŤV«˙Ă�I9ŕŠ_x {ĹzÁĺĂż®¤¨L­ÁévZhßž0‘|Ľ6ŻH˘ }ß7‘ˇćĐܤ>_ŕ˙¶Źř˝IŇ]Y’ů÷-&D«.Ě;–¬ü"«‹0I˝,ŻHÖ)»ö”zZbťÔ>ţüűâ–sϱ” žÓ·]gĐ;lŽýč*,‹ ď«í¦/*•µłá'Ăü÷oÖ• úý»5†H±6őĎP´&‚¬ńC(jAoÔn]~śĐż˙B8ĺí xqKrJy=A8°żp:ËĆP«· ş1(ýšiÄť7°·ŕö€˙¤XŻ ?±§ĘňZE¤ąń?„éÎlö:ŃŹÓĽ1FđÍ8° Ý÷ĎçTíúűţp†Ć=|' mŽůÔX/DĂĚ*‹H hÄúr…ĐČn@ţŠ{ÁţřţţúřäńôĐőj-yî-B§^ ‘¸B©NĐÚÎĚţ†9ż˙qŕŹ×âĽLú6.[ˇŰôď`[‡&˙dţN×˙ţ"hG ĹřŕźNc›áą].Ňh>;R'=Ćý2ă™ý¶ŘLśŻ÷űŔ<Nű7Ťö¤nŰcÍ”Kź ×HńßĎ^Ť2ö€żÁ–žýú{fUtí ´R{:r2q%™źLÇ&Î9$w÷ą¤s> üÇ˝>{ĄżE0织´ŢF6/""K{|¬Ěśęŕ [ä˘Äž„žä×Ký~Őz°÷űw6™9ĺUTUŮD•DĽśĽŚ©W˝ÇŮvB¦ßď‡}˛í|ľ’ě*¨Ë^l]Á”˛ wLxůČInL s‘GS˝¤ĽTI‹*í˘}ţ{O ¬ě ßÜÝůnQ˝i5´Éu‡®°¶×đÝÚrŘĐNÝŃl äŚiŞĹ÷�Ŕm;IZ˙X\µ^&Đ–˝V*UµAŢ®‹hnŰű”ţ ÷Ůȇ…¨Ş×YQÎ|ëĚ8VüM3˙Í˙y˙ýźŢçll €˘±mS33Űëa)Iqe÷˝űˇľZ9íÚç±ÎÂ[f[ťËÔ-+gÖ€OE™úľ uŻG®&•WG5Ţ&6|_ł{śËÉ;VÁ]—’s·ş˛Ď¤ĆČL/ŰOóą} ±ëŰšĹßěóË\¦í%1bÝŢ-˙‹”Ń ŁľZ»U¬»Ě“ŻRT÷˛}ó:ŹpFîgř+išË}üWiY<l‚‹[.cľS‹čfZz¤ˇg»µ›Ąlnwżő= <SżčÎ*b<zP˝úz»ńă“_v[ÁoŰž*“ĐÓ…{z=Äv¶çůľpgf˝€Č*S§żťŰęójg¬ç¦®ęć¬ÚŘ‘#xsÍÜô{»R¨ĂÝă˙Y×o7đ•Áă$ú Dč¤p¬2ü˙¤µö9äś|Ő·vZ“Ę!Ä#^Č„ź ů%¤«Ô źšy˙ź÷yô˙üóÓ¤mŰn›¶M<<˙™ĎĹgý~Îź˙ůĺóůěžÓž3sÖĎźógďî3Ę9{îĎşa§đ•Ić%|„âLđęôq! ňÚńůůůńńńńńńńń`łYó^éÜH> �Ţy»»»•ëź»+î)´2n¤•·î$pŐ´ç´sÎ9ç›úçśdo—ł‹™ć¸Z«���ŢôW× dÇ©doůńz۶mŰ’ťűcpŘz_UUU—]ë˙ď?–ÁVř˙t.”ę˙˙˙˙ô\tŮľŞŞp»…ökUŐ`·˙Í˙˙_ý_óţ˙ń€GžëĽŞŞŞj$éҤń­˙LT˙˙˙ť…÷˛<«UUęßéłř~˛ŞŞŞr�ŘňÝŘ[U5]ĹŁK BUµUuĆVAPŤ—~÷čóÇ��:ó����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/click.wv�������������������������������������������������������������������0000664�0000000�0000000�00000006150�14447736377�0016605�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������wvpk` ����€ ������€ ��1ĽŇú¬!RIFF$6��WAVEfmt �����D¬��±���data�6��BWWGVH�ötöH�%÷řüJ��������������, e����Šň�?ď~¬ˇ��ľp˛~¬śaÁD4fL AĎ�ŇĂY–ˇ…Ŕ)4�ÝŚ!�¸p áÁ=`ŁĚŕÉžEŔyPhIş†=LI]”F"��tĚCŤ×“%ä V�€±@ l�€j°ž4’$8Mś €ř ™ˇštý <É�^xÍtŘKĂ�@'ÍͰ3@?°Ď#,�Ć…>ô™@0ŽL&°ŕĆäŔY: ÁÉ4LŘţp‚‡Šś !�^ŞAüËżý˙űcü˙ď§”ó˙ď˙źüł˙Ö˙żŹÝ˙?î˙7ţ_}ÖÖźä9żcäyŠçżfÇOř…đ—äű˛ĘŠwý<ăuîůď1#—R$2,‰Ć˝] ÁĽĂ©…2hd"+x “¸ő/Yý"˝U°Ü,:ZnTŹ·íąßô‹_d÷¤M÷¤Aú• ”< ¶´v18P!@ř‘ňa�r Xá!4… Ć(¤(5@® AŃ0…ÚŹx  ‡ë’*ăduBBb…ća…§pať“‹•DQÎ67—ŔD >LŠđqHÍwLP-k±jYé3oŢM~ĐlZú0 Żů&.PÓ5Ô.11VˇçéčO50`Á#™AG&‰gŚt7Ű)čĆĹŽ Ĺţh1Ęƛʊ„¢«ĚCsçB©xf,‡ę7üŢEzM…––9ŤdűGĹĽj ˙·ä .AĄÖEńcÓ,pŹ)prČč ř`,<ÓXČ:Ös`Z;âŃ™é%ä…` ś¸$ š§Ďpó7`ÝTôI b’aíŕx–Ĺ–ů Śy¶Wäę2×<M…Ë!F2MжEćčNµŇLČwý’ÍŤ¬a� ;Ţ8 P$&¬ JeAB@ĄAĐ5rĚ´XĘW”°¨“Äŕ‰âVŔ"OÔ$ĘŢĂý]Ž×ĺwŹěé‰3áIĐVžXu¨¬7üÂet}tŘâëRĂČE’é |x8‰cß–††×żÍcňó6 ŔRđ褬C?™ śL4âOR¬@ĽyĂąđ<zřá‚Pdcšó†U¦1ŁťÇ†¨<LOÂX±>Ç<>—ČDÔ!b•GĺgÄÎÂñŔ;d«Đ %cŔ«Ăˤ±7RŚ© ř“BjcÁô6ç{ąW­ ‘rđqhĂŃ0Ś];pŠŽÍĚTśçÜĹ~ë˙Ŕt»=M0sĐśâ„ŔżfCE–„ńʇµJéHĺĆ bYł×5bA6$‘L”+EA⇀ĂEpÁÖ@ü6Š ¬]ś#ďâ›Ě‚u—™M=“ˇMä†Áč§e¤°fÝaxŘđř`Hš2ě_xsťpAĺ™™4ž"^DPÖ(Y“Cî1°L’Á;�ðâÇý´!chVXźżŕ±Šŕsxô)iLÂű™a�<Ô%áSň'=ëO2ÔÎĹSÓĹĂN FŹĘ1 އ9?ńqpżŤd»ŕq,‘„ ·ËG!ą˙â©Dcâ­ŕFĂ §s#ň§ťcě!¬†F2»–Ä€w8pĽA4Ô2‘1ĺŁŇ"�¸źĎŚ€v/¶°ŹFŻąw9Žs‘RńÚĐ=$ÚX6ôäOP*98L@ФÓs[€űĂ:W´°ś d0LÍ}Pfęń5 Áš;3x8pYěŁy#oĘy®•ĚN%‡@Ŕ$Ů<A‰źź/m LČ–20«<¦ă%ŮĘtäh0$S m~Çí ł˘q‚¸ B–Qn0y…YЉ=’čA(A:Á âä!β7őw¸NACüéa(žBÜ�EŇÔ8ÖŃ A¦縑šXwCäścp;2“şC<ó1ÜQo·/w3@wÄ�%˘ ‰a+qfŃ»:™e¤Ťçcŕńö˙î{4,GWâ]úpěäQMăHÄł˝°uÓѢĄyAĚöIŇ)ŔÄü{ţů2Ö 8Äą!C´®·Éq) 3ČGzBxDtL3.ĄŐ­?łř«H(U‚Ŕ1ÍĐ�sŁSťb °ž}źćĹÂS´-Ôë:Ôa.ĺpó´W_ŕß®c%äyP;ß,¬˘ ĽLáIéŘUSóŹĽVÚE"ŕ'°)Ař‰ép˘Ďgyi8”—6“D&‡x˝Ĺ¸)Hě‰CĎ‘9$žEčj¦“HĐŕ±EaYÄ$©�ŹU0üH<XŇV€Ôj”‚ Ť6ń×6Xý\Rd…uFQđ#Xó4™Áúçßx`r™VźęfF«Z"u@(03Ě>"� ŤeŰIs`ĘđÖ̶đ‹$ž!ŠĆ`2ÇmŕrÁ`bŁXi Ţżč’Rľ˙ł";ŕWGHŽë`Č5ŮB˘8b踡¬@TBu‹Đଟ×ňOrqóžě9%fŁÔ>¤ aâťĂç—@1eŁ9dA‚źáă^CßJA•V\ś>»ŚŐdşiôQ ť€\=_Ń"+]�’ZDrÉS„X‚Ľ‹Ŕ)hś=X0 _äDJSfÎ’GĘ1©¤VČLx–Cáú)Óř\Üa°ű,™S,#’@ä™=áăŘáŐ€§×@,GŕZFˇ|:D¤!—Â2űůĘGPëĆ’IŽ$RÁÇéW.Ś‚µŕůć_żă)—ĽŠµôĆy4=˘- ĘĐlŔA…°ëSYčŔÝQ‰äÁśŹřˇFT`†Wěá<;:4Čh¨ŚŚaʆ‹¨ˇË Ö0Bą¨ě)OA7çs4ťąNv‰§„‹! đ2ńeSĉ3ŘkŤ›ŇP _A#Ä"T†ă˛ňA,`łé ŽŹ2<†éśĂ`Rú 3äZÍpđA¨;rÔ ÓĂ 5Śh›(¦LçóG:oŕü•9|˝ öĽ¸ vЉ]9Čš˝]S€Y HĎp`Ć´4)¨]!v«đ‘0űľe… FŮ8Ąó Ç…�hD’™p˛ď,öF!…Á+í–Ť=Uó …µ…y!źdt\3I=\Ä" ™ĎGB^äˇ;~VŇiĎ8LÂ$3)AČ ‚6$¨Š€0€P¬ "&, •ő‹e§ˇ™ažßűMĆzŠ@Ę‚’h¸¦ôţňÁĘ·3t%&ç"FAB†gSQÄv”Ĺń jQŚ"Hg˙Á¨ąĆaĚčGĐB",r,g´çüB›š0�ËT(J{ă‡#néŇ[îŤv`ŔÇă$<0ąs˛†ą#DI\ ŕŹ,‡‡ä#› eÉ9 Ź ;Ö-#(ÜŞ6TC‰ p|Éł`Šá ÖOçyc�Z�2äo˱¸D3€ "„çtš<–㓇2>XĽâ0/�šŚ!$äBO‡`Ú;ΙA˛¤É=¨Ä„aë’ ck‰‡ŔČ—örÄx4!FCC!1¤ wÄV<‘_�–`!!o€ů'Fj©agĄ „c)$ž([n¨Á/ 0źŔtň4ŹOĽuNZ<m0¶&KmbC!0K08Á ž AP|8†MOżžçůÂ,°ŹpÔŮÁ-(2gŚ”OŇOˇŔ|Ćá„r? †h†Ó�p@°"‡ˇ€Ó€ ‚�›płCGCuŔˇÚ0ăEáB*µ +Ăh˘,´pdID#”�PF’A�†�Řéát„�€�03 €DĚş ‹­OáA€<€’����3`3€�0L˶Ţ B 8€ #€4ë´Té±3:Jô_hü˙������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/compressed_id3_frame.mp3���������������������������������������������������0000664�0000000�0000000�00000011610�14447736377�0021635�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����,4APIC��]�€���›xśíťű[WÇí±Âţ¶?m»ÝÇîłµÖÖő^»ZďĘ«[*˘ Ř*Ř]„ČEAn"÷ — \D.Q{€*”[ «fżähš’ÉJfćĽßg’gžÉ™“™ó9ďĺLÎLíÝżk·Ç_Üö\´hŃ’UáëŢ[4­÷ńú3^ixĄăőޢ?™¶őösK]ü«-|.Óě_˝yC o ±çw!öü.Äžß…Ř+v1ZiFb/›Ĺšĺ\5ŁBb/WÄ^*‹KXÎUÄ^! wě]Ýŕ’ěŮ»şĺ*ë–t1{W7GúĂŮ»úI657ö®>ZŇ|Ę^ö®>NŇü‹Řó+bĎŻ=ż"öüjáŘkLęęęr¦†ááaçŹdÁ*ďďďwň”mÉůĆ4.$űÄÄÄÖÖVÁŕL hMçŹdÁ*ÇÉęőú´´´yŻŞŐj´§3•,({'›@vě™jLš÷ja÷˛goąÝÖşy 1ͤúúzÁo™ššÂG(€Âö»™Y+<~xݬ¬,|„wě…ëoÄa Nŕ÷šŹvltDz$wěŃ@“ĐÖ‚g~(3e[·˙đÄ+<~`c%±vG™p‰& Ćfě‹ďbÝëÖ]„Ř˙VŇÜ‚Ěŕ¬kĂFsÖî3*é§F6kĺâě!„vkö¨ eĐ aýâGk4u {ľ”‰;öć-X±nčBS˘Ě ĆšwšáŘg­\đřQ9óů¨t­÷‚3�xVˇµŰgÎFc!ëIěßnm±u–?Űú.ěvaín˙á‰W.‚Pń‹÷–ŰYçc{ Ćć6̮Ⱥ§*ź=#ÄZĘ>'ĚÖad"\ńE,ŘŰ?dźµrÁăoó^đŢ3Řłpn.iť|XĆË–_j+«U{´ ÎśY*ŢaÖ-ĹJf˝“`ŹŤf×j+ĘÚ:<ńĘE|>óŰÖś,‡ŕ(i= ŔˇšO§,çłĘ­»…Ř3ˇQĚźZ®‹—´–Ąk űŮĎZąČń>rř˛Ű]¤€`ĺ2cϲç«K¶Ať Öçń2ízei®bB6ě[MZ€ć‰°ďrćú±µć˝Bg4/ŤąpěIR±çWÄž_{~Eěů±çWÄžSY'öĽŘó+bĎŻ=ż"öüŠŘó+bĎŻ=ż"öüŠŘó+bĎŻ=żš{ÂŻ0{~Eěů•ňŮż1éőëׯ^˝úő×__ľ|955őâĹ Ľc[°ź˛b®>Ř•’Ů3ś@ Ě“““ăăă###Ďž=Ä;Ö±Ű'&&ĐиęŠeĎl– ®�üôéÓľľľčtşÖÖÖ––Ľ···wuuéőúţţ~t…±±1FGAwáˇ(“=Š&ş ­Őj+**4MaaáŤ7đ^RRRVVV]]]__Ź~€bOž<AGA@§a>ŔŐ§ňJ™ěx8s°ěě쬫«+..ÎČČHHH¸xńbdddDDŢŁ˘˘bcc“““łłłŃĐ š››»»»á$°/‹ ĆŻ@ö f°] ěč訪ŞZ•JućĚ™€€�__ßÇ{{{űřř`Ýßß?88řěŮłŃŃŃ)))đčmmmĂĂĂČŚ_™ěa˛ ‡č™™™.\ ôňňňđđŘľ}ű–-[6oŢŚ÷mŰ¶ąąąíŮłçŕÁ~~~§Nť‚WHOOG\hhh@@2>¤Tü dŹL Ŕľ566�çńăÇ÷îÝ»iÓ¦uëÖ­Zµę_ď´rĺĘ5kÖ¬_żíÚµËÓÓ= ,, ˇ;"?@ď~ĄZżŮ2vX-Śn<$ř‡ăĽ'üo_›˙ćűÔ˙9úáν‹7®Y˛|ٲečč6l€8tčĐÉ“'#ňňň€á.ä—_~aÉż«On>Ą@öHŃA )Ţ­[·T~g˙÷÷E˙îýŔýŁ/—.]ş|ůňµk×nÝşußľ}AAAŔŻV«1@ěGgBňHěĄ.@‚ŁĆíú±âÔ-—łěÝńŹ/>űě3„�ŕGŹüżĄĄăÄ…™ľbŮßÉ(±ĽyA Xńérŕ‡ő#ÄĐ 55őÎť;>ĸ_a¦Ż@öđůĎź?ĎőŤv€= ŔçŹŘŹÔ©"~0}Ś‘ô˝~ýÚŐç7?/{öČőFGG/Ż8ć{†őç+6nܸ˙ţŚúęęęz{{ÇÇÇáö]}~ó#e˛Áŕ0x¶}čÓwwwŔŻ˘˘ă=¸}t,WźßüH™ě’1$s’=Ż%۶oßîëë ·ŻŃht:ŇWźßüH±ěA(qU “ě#ßßżcÓVź„üÖÖÖˇˇˇ/^¸úüćGŠe·_tŐyÓ÷^á†l˙Üąsč777#Ý#öRđ7gT:Ď>řăÝ^^^áááůůůMMMÄ^bżß'­>á$ű°Ĺž‡‚ÝĎĘ^vs=ËŢh‚ŃU|ĎyÓG®‡x_PP�ź˙äÉ“ě߼›řÚ$Yô%ł7šŔ”ťLq’}`` ňü˘˘"veך=›ĘćBlţ§ôçü(ś˝ŃÄćÚ–P§Üľé'ÝŇŇRäůÖěÁ¤1¤üůçźÇM2Oű$ö®×‹±‰<Ď łW©TiiiíííÖěaôŘb0†‡‡źšôüůsô�é˙ćË{ŁÉú«#rcź’’’ťť]UUe‹ýäääČČČŔŔ€^Żďîîîëë~‰˙đĂ {Ł _ŤÎ˙đěo\t:ť {8yŘ:wvv¶µµá˝··Wú“˝8bĎm™Uö„€A—Ů 2|$zµµµ‚ńîěÁŽáţýűŤŤŤ(ůčŃ#8&ö’ÓŘăg W4ĹßĹ]]óŰ5€¤Ő'rż>7ľřIWďăÇŹŮF€/..®««d´ăĎFtĄ÷`÷0ú{÷îiµZŕđŕb?@Éš>żěĹŔŔĚŘ›$Â~bdĹî^»‰`_]]ŤÂŔHŮô‰˝°ěgo4ąý›AWWŔÖáóďܹİľľľ«« ¦/Ů™^Ä^Xsb®-Ý(Y™ŮŇŇÂţ‘ÖŹufúŇLř‰˝°ćĘ–ťł72öcßÖ†&v×˙o6} Îô"öš{Ł żîF ßüńZCCCeeĺ­[·ŕüaúl~·3>b/,ŘnŇŞ@ţýşzÄűŇŇŇňňrD}vgŹ3>b/¬ą˛7š2ľşŘB”/ O­­­{ŤF¨ŹA?{R›äIě…ĺ�{6ĐGůË+Ž!ŇĂçc/D}Śő{zzFGGĄćö‰˝°`o4Í ×&Nď™ęEEE°~¤~?ýô“Ý>±–cěáö[ók°KęÎP„üÂÂBŕGĆ·?00099Iěe ÇŘłąáH÷¦Çúj ŔŔ477#Ű7 ’é{a9Ěźźţ(ďű°ĎĎĎżyó&˛}˝^ĎBţBž…l'ö˛7šnÔ&Mßzĺ‹`ź››‹wö ‡ááab/9ĚtűŢţ ś“źťť ·_SSÓŮىtojjjÁNA\Äަśa?22Ân˝ýúőĽĽ<ä}:ťnppP:sű‰˝M9Ăľ=Ý-l:Ű÷»žžÓݬ¬DŞ/©ű:˝M9Ěž=öˇ 0;Ćo<‘’’’™™‰Tż­­ŤŘËCÎäů`\x&;^Zy4)) nźÍń%ź/9|mgbbâŃŁGęÓWŘľW®\ÉČČ�{v˙6ĺz2c×óŮó>>|s2ží›�»ż}ű6ň|ăÉCޱÇGCCCpď©űα}ăăă‘ëaڇA×vä!Ç~ż7 }}}wďŢMŘd¶{Śń°Ej×t‰˝MÍuΠb;":âzYYŮŰIßźű&&&555Ií·boSse˙ňĺËńńńŢŢ^­V›ré-űµ~©©©ĺĺĺć‹zÄ^šÓü|öĽv|ÔŇҢŃhbÝľg;Ćě;…`Ź{zzĐ3$5wŘŰ”ťěx8s5Śů|zRĘĹĹŢlǸc?bGi>”‘ŘŰ”=ěxv3ŇřÚÚÚśśśźßîőĽvuúa¬ě©| Ň1z#±‘8{öHfń�ßÝÝŤ0źźźĄŠú§ŰKµ)�Y^ss3˛< ŢšCěmJ„= Ýü÷[pő0k€W«ŐĘGxŤ>ůű‹lX/Íűr˝MYł‡KÇř­żżĂtŕA#Ć0Fđqqqáţ§Ěŕc>ů¶´´”ý~#AŁ7{Y˛‡ë.,,¬ŞŞÂ0v̬˘×ëáĎ+**˛˛˛T*UčÉS‘źx›Ů§Eł\@z/µHĎDěmĘ’}AA,7$n íííě†Ktäääóçχ­ó1W}ęËR<¤¨GšÜ"ö6eÉŮ;›‚ Î¦Ü:¶ÄÄÄ„„„řűű‡®>dŹE­Jg35¤üĚboS–ě9î÷ŠŠŠ =vě··÷+X‚Or;ŤĐ€´@˛Ţž‰ŘŰ”%űË—/ź;wîôéÓđí@îëë{ŕŔŻÝ÷îi ţҲﴷkćGGG‘ŰKÓŰ3{›˛dßęß|󍧧§‡‡‡»»űÎť;w˙{gŘâßÇRžUŚ=gE‚ą˝Ą˝MY˛ŹŚŚ<räČîÝ»7oŢĽ~ýú kżô]˛kőé0~•Ýn-ý§*‰˝,ŮĂá#®o۶m÷˛Mß-Ţůţ>kđé^˙ĹXhhHĘůťĄ˝MY˛?˙ŐŃłKŞėě~F§ÓI<±ź!boS–ěĹ—ř5ǵ Aʉ˝ĄDŔ{{Ů_Zv¤ľćîăÇŹÍOĎ%ö˛—=ěc>:|;GĂFt’˝~'(b/&{ŘßʸŃÝÝÍFt2o$öâš•}Nče6 orrRú#ş"öbgźzôBcc#{z–\{K{1‰°ŹŰ\]] oĎ.ÜĘĽ‘Ř‹Ë&ű%‡oää[Nż$öJ“-öI!Ń0z˝^/ÍǤÚ)b/&AöŃŰO¨Őꦦ&|$µ9×s±“ ű«Ń eee]]]ĂĂĂrą„'(b/&kö1;‚rssëęęz{{ ÔŽ;'{1Ył‡Ń—””`hǦiË×čŤÄ^\ěŃ)fđŞ~0úŞŞŞŽŽ©ÝU逽ŘSĚěSüΛŹÉ2|W S"öb‚e#ˇ3ł/Í.ÔjµěŢ iţĘśDěĹËű ýr„y€ďëëcSîeíđŤÄ^\ě_n{µ_lOO,ŕez†˝ŘŁ4űęč|PGgn.w‡o$öâb{ĆŘ?¬lĆ ÔŃd÷s­ ý,zcj…éF0‰ýlŁ�đFbĎł=ż"öüŠŘó+bĎŻ=ż"öüŠŘs*qđÄ^É"öüŠŘó+bĎŻ=ż"öüŠŘó+bĎŻ=ż"öüŠŘó+bĎŻ=żrś=-Š_=ż ±çw!öü.Äžßĺ-{Zř\ýÎ÷×WOAR������POPM�����������TRCK������TCON��� ���Techno-DanceCOMM������eng�TYER������TALB��� ���<Undefined>TPE1������MobyTIT2������Braveheart Theme (Techno remix���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/correctness_gain_silent_output.opus����������������������������������������0000664�0000000�0000000�00000105262�14447736377�0024404�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������Ąßm����",OpusHeadx�€»���ş�OggS����������Ąßm���… ŕ¦˙+OpusTags���libopus 0.9.11-66-g64c2dd7���%���ENCODER=Xiph.Org Opus testvectormakerÓ���TESTDESCRIPTION=This sample must be silent or very quiet. If you can hear speech without turning the volume up very high the opus output gain is being handled incorrectly. This file also has random modeswitches.OggS��¸������Ąßm���˘)Ü‘űăŕşÜÄôŕ´BCCd@ ů˙ţ˙ţů˙ţ˙ţů˙ţ˙ţů˙ţ˙ţů˙ţ˙ţú˙ţů@k ěÉĚB\` (h}t‹OÔ,ÓĐ++~Źť( rNÜS… _á_żŮ?jŰĂŠÄŤ™7/{·oëFeđ“����������������9 áŠ,Ze$“»>ô€ćĚa/˝©˘Ś˛UAgp @† Ľ_čhýťŔ9ý—ůsŘú…ˇě‘IéËţpţ©ö¶×˛ľÚ0^â°|ČE;ŮżdGWĂŢ{?„?Ńęp˘±}Lö%Î8zjFs83A˝O “�U| í˝ĐÁ»ĎĎAڵa,/üi9-;ľ~%Ů^×,µ#qᜪć<u¸ĚŻô¦€„˛n»¨±Đzäh6WcńçcôŻu›ň„dzAă+‡»˘ňi7_Ě˙ösXä·ă8@e| B4´"ą˝Řëľ%ýĹ€ Vř ®¦Ăą.P‡ XľśäÉüŔáp:Q×› 2´¸šXçČĘfšż˛:µmúqn/¦Žü­ĂékÓŃŠé’xKüu~Ĺ+ŚěÔÔ`TđG/彆>BłË,­$:Şőć+¶)a8|9đßiˆp“Ĩ/ŤČ×Üën ŹÜéÖšßšJmśů =H/N)ř;aďfĹn0G6%KĎgA§Ë©=–‹MŹ'é9čfýÚ8&wh.„”tˇ^\Ĺ…ŤŚ_Ik(˘€Đ,Ę;ŘMŔ.©Ýmm“Y%Ł©[f+hs39áľäNÚ¸¦€|¤9]üůF•żŠ ĆeôÍůŤy1ńŚ+‰únn»žĺ޵/XhďĘ˸lĹÎ’oó6ÍĂ .yÄßÜ �u3±»Ľ ňQ¸ľţÓ<Z­pľ ,`‘÷&¨HHrô aŇé ?ÇŔdúč@âŔÜžFúGKŚe™’N|ÍTšĽ¦Č ťFĚEŽ?†:ő‚nżCy–ď;(!1+§Ç…ý·+^+§łúý(u!Ń,Ă[“·G[Š7wąÂX2…w]8 P—áâ ć "Źöęy·~ĺ!›F1Oóżč[•tŹś M1Bd€•¸Ę uÚŐĚIý™úmnľórŐ4z«{ę áĚÎĄß[&Ą›ŇŞZž/:$«(ń# ”?~Ľ*źwŘ3—\)ęµ% tž—Q>Ô&mw0U(Ěx<ľ\ŞDf?ńs¸Ě•xm>чRÉśJv’2ôËDŽÝ!şŢ¦n»÷íąxďYpΤjfŐiŃQtUľÍȢŹ:F×±iër,ÖW=ŚLqňť–ěaOWÖ´şz†kďM«Uy�)ŽŔcĚ’VA@úon5!ż-G™[¨vµ9÷T3¨.BúÚÔ´E-×$ NvĆY©;Džj0DtŻČB†Z­¬ĚfÖýŻŢa[ ć�’-%&�Ô61.I‡üž$ťÄÔBÖ>ě2®n›¤Řë·Ü–s‘Ĺn5=HĘ\łÇ,}¨Éčbw1=*,Z˝ž6\ťpBůĎVµÜa şŃ˙űű vl.ʵ‡a•fzĆ®˝­§‰$‹ˇÚŰśSN0ĎŤonđTÉ‹€ŕŹ «|–Đë3a#ŽvÉG”úKoäßÜÉPůĄjŹů©-T Ç÷ř…®E0r‚ô«µ3´Ł˝VĂřIÚXÉ+¶ Nj\�B =9;3źAŹ úŤ‘#Ú«Hb˙q”lÖŤdú)ľËăł‚*SĎEŹĂYi}SnĄĘ;ÖoWTPĎ˙I;¬[_PăW—¶Jťäç˛â�)®r.Ťĺ)–ÝőŇĎJă’rŮúcűPŰňeN,Ţ÷­5J\H ¨¦T±M!2ŠĺČKSĹÇĽkÇGi`&Ő¨nú{~\†%"´ đ Yk˘˘}7ĐľÂ:;{„™ăAźř˛Nײ˝}gěäÚŰx(Ü$ŻĎ]ÁOâ1|u°ŻđCGĂôl¶ł¬Łš¨řś~©Ľâź<¬­ç?řŤ…ßžtÓ ­äE7.ĄT.}�śŃ;ÜFş0ëwŃ »2č5αf"íľŮ‡_z�€#€ŽĆş6·:ęXÚŹą(r21ú5đŃ@±¤[ăU©§k`đćú~PĽ5ĹŰK«<ѢúŕŃ?}é±Ţ\ĄÍk! ŰjŚ€käu©´é˝©S3\‘FÉ3¬.őQ…Äŕ˛oňFąř9;€g‡b„úw}_Y.:^†&ĺI}"; -7Ű(ý+@ř"Ä“}ŠĂ3˙źËEe µ…Ë"B>^ŠÜ¨°>µçN.lęm/ÎÔĘh)swAůřßßO­ĹŽ´ËŐ8JŚ‘z=ć~ Ř›­ţ‡{«g›Ý>ß0 nŇ ýŁkUMkměÓ3ü¸#Z%�á"߀*Ú¸XZ±9,&ěJü>~!BÓ_(tôű(Ę]ˇN`ń˝ĺMätcÍƱU¶Ĺ˝ŰV<7}Š8<fí3Ř&·G¦N‘ú?�± ˙G“ČIô?2”ł[xúAhĺß]Ŕö:ą&ĂćíŞ¬ľ‘Rô§Ű¤ÝtCĚuŠŤťs(G^®3‚ŹübYga„źSäç,”„°ô§Ôp—á6¶~đ(Ćé*ł”[{(ăěąGů$Ŕ^ç»K¸Ś[Ď2ä>�AXÂBó`‡ ŚÚ;Ľ śä^<¸µď«ŇĐkľ«Ä&Ţ2}ţ ÎO!ĽšÍVľXN*Ć4ʬçs‘]ěu‘ěgúąť˙šnÔdTďřbŐ;Ö&OźĆmÄbGéLü®'.)á†˙%ŶuÎy°¬ó±;:Ź˘k¬‰9¶ć µĘ1»Á}řb€%ĂźC_¸lMĂŠř>Í _>”Ą# ËR\‹†Zź*°¸Kŕ Ă}óy‘IBÇŠ9B•YűÜŻšýH‰g`—řfĐfÔ“˙Ăs’~‡X㌨8čT_z«‡Ś“ő*?S¸Ńe÷°CM÷1i.‹?Ź\eZ˝pÄgw]ĄüvĆ2ŕMKři¸ -$®†Š”ž Ş1 u°jÔ„Ó0>Da§$#ŇĘNK(¸­Ć“9yhěĺ„ŰÂ(;×ó;�NŤ źÖn¶›rcčpq˙Čš< ń(ęľJ¨nOnCíCřhç7<Űků d¦Đ™ÁR˙vs+ăŠçľW7ž-ĹOy&ZIĚŐZ±QâZDôżKI›zĚV—ÓD~ĎăÇ€z›9^×™ZŃ OggS��0„������Ąßm���a”Cl €xAW­Á÷OggS��°?�����Ąßm���:ĺĽ7 ÎąÚŞ‡gCuFe#$1!"xhgGlLljKzŰ…Ĺ´‡EBDCF ±Ő€z.ő‡ĄCLŕ€tÔęź ^Đ+Q€xş5úî/f”¨ktĄĽ„qbkmײrY$0¨ffxÚ¦”8ߢ`ˇ©#¨iží»=LůbűĎĚ”nĎ÷¨hä‡vŁł˘Ç~jŇéh®Ű¨hüHĐ´ž–Zt Ű“†ÂpkÚhifť_>˛}°jęę0Âó†5’dÓ)!®~Zš˝ťČR[;°€®G7ň»g…ÝÚsv«ÁFŤ•ÇŰFĹ-«˝$řę v ůP¨DŽM ’‰x,ű–W_:“pQ~\ąś;m»Ĺvko$DÜ&ćęÁ?Ú\�ÔĚiö€&»$ť© Ä~űeăa°ś]m'ŻŚ ř©]'eĘ˙w·dŃx_{,1p™ŮËĂY†Pń˘Áď'>‚…KB•ÓPóCŰ´8Q×/&‚بęÇŻ}JÚr˘¶ĺ3^ť?Ő Ş3BSf 0qÁç<Ý>ˤÎŕDs4Âę]ZłôlG“©áyrńeÉĹą=ęŞŘb3‡Č)Ç S+Ĩ föÄfZú„s°çBđ¶{ ŐŐş1ŽĂŚ\\Ü”.óg$üđ-š"jjęČ' 3F]uű”¶łtG‹ÓÄĹ[ÄurĐQ6Ó BĆXĎ94#~WZ¬ÎŁőĂ ľbm>ľ©ÜŐÜ+x(Ş8€#Ă›DΛÚt˘j˘Đ‚ WĂĐäŕ#ŕeiëÜ€Ľkő)Žü-fşŽŇDn%˝Śµp˘˘3EÄ÷ľ~tżTKx˛ŞĽ†›©ĚßT"V/t>ŞáÎeBҧ®ű4Ęş¬‚0 ”- »Ą�¸eşk3˘°ĽaľŠĹÚĚOq+ł« ŹsűÂÓą˛Úk6 'Żęđfµu|ÚbľĘwźĎ`3f{)—Ĺ—M%®ăŰRt•ń˙çI>2žÄŰr5ü‰ĺź�¨x‡ńÚDfЉnäßhěIPąŐˇÉ¸W�¦Âźü0Îů¬AyDS6ËÜ·{đ[ë)Ă”UQ5?ť­*bYĚ”ÄĂĐo+5îcĐÇř’V µŽ'kfóŰRĚc©/{?b\–ě6ˇ–÷;„ţčdLs÷főȉ0ďŘćÚ‚×$^íámČźžbçl.ŽTD—Žá!™ňjËVL;âÓMŹ�†Ý±Ť·ÚBcÎĺÓ<Ö»k:ąăóĂrJ_U&ÁSťK°ćěÚ)ŢĆMţ‰Ý¬Źy;íci–A•É e~lŽĄCŐ¶4ü�căś!`+É3C”3Ŕ0É+˘ŕęĄÍäźO»łßô›O@P�OQÄ´9őčdĘS'a ŕ ŢFăĹ8Ń‹Š÷&d^Eo§jŘiśtWY9ÉWČ%F#YęŐo®˙Ód€đ$d%)=Řćý–Â&Sm¨¨TťĹ*uzÖôÜCŹ~,DĽü‡z&łWő¦ĂŢ:ŞëctxÔR-ĺ47Ë Lű9)T±ßµHL¤NŘlë˛ö§ŹšąŁ ŔŐ„ Aëq] 3Ĺ“Ăr“ç, !2ʰݥ›4ŻműlćĆ!Öņ¬…ÎűŢ) ĺŮ6ĹgŘż˘YXŢ‘G:ZŰăű9řh€NĄD8iűÂĘ;Ş–=LÝ!$`“- ÎT˙Gk«�˛tZű ĺ /˛ÔiÄ–%őŞX ‹|sK˛úYÝÎSoá"YŇđ9Ůé2Jş`îź2pť‡WŚäÔbl’€)=OOŘm㚯Ťä”Ďĺĺ `OĹ ĹÚő]yĐ^‚ńľ}/üů@;=#ś!<Pë˘E ´üăK:FŐűŠŔł8�ŘlhŰť)ľçzZŁľ¶”ú#ů¸<÷µţş‡ ŻÇśK6Ź#ťÝŐĚŰďĹBsbŐ{®0#őäŁÉƬ;puŢx(#F _A S –âfKˇl芍ńÜ(‹puíĂOë :uĐl]Žô˙Ť jöř G=sGŘŘîŮ|wQ¤—AVB&io•ŇŚĐiĹxż‹¤Řhµ´M˘Ö†}-™ę÷~©m™r˙±:č)]ĐhÖŻH·@~G›)+žńg¤eUƸäZßýľĐ{BŞ)ĎíČ–ťń´R(ž…)KĐftjî)'…›ËVŐłanDC’tÉç76łó_1ŮÝĐiśK y€ÜÖ8%¤~‘ąTm °Ě«Ý[ͦ$míd@ýČfc¬A®VĽVź‚‹éó ČhŔś|UĎßĎŮaĄv¨ĆČbŮăüGŽX*ß:őŻ–‘©ČbÚżjŁ/5źGě=áČd–PĹgm1VŔ¶lµ™Ř~‘°°äIĐüąŻEp¤S¶š[ÍŐŕýTÁ˛‘ołŮ-D^ĎÍPdÝC’*ďΩ|+–e ăžč{^¬Ňo‚0’”7yQšÎPÔ­® ’§M=×(M×\ˇ†ć\wvüu}ĎPJ|RadÉ0{7+kď¸<ŘbDIô0Ĺďîń.D±áŻÉ(‹ń9¨IÝ—µcůbřńô±dµň]éôDőa\ErŘ>ť~ŠŽa=Ýîë[s”#´^@WŘĎe@Gc˘Fě^[ú·žHa0mĆY“Xޢo™"vŘbWo Z¤ł,“p Żí¤ ¦Ň´4"Ť§ĆąŘłyşOu»°Ĺ5śĘ§÷KZTąJK‚őÁ)ŰFů¦ł&ygἊuµ—ŤyĽmQ\q'>V÷‹ĆŚ;eÔarôf8 ~IĽšŮłŘiLwy�é$^ř&p×đŮn&‡®ÔAF O®gsŐ´÷ĹÖő!˘żeqJ4ËM‘cđNfů˶sžE(yľc·}*KeŘlpƮΏ¬©Ż2µvQţî}4·s`Ś{ĂČňĺöI Ŕ®¦€± (˝!ÉáµPÂú€€ěüS’›Ď¬PAŽ­÷ľ•EO2TÉqIß ńwŻÚíËâ÷p:#›?%·üL/«z’V®–z·ą éŘl¨ˇK„^ =€$+ęóĚ?˘cí×1ß‹‘,P  ĆĐS)í=E8ľÉĽ ЧI®=ŮńFűR¸Ođv)�î_]‹é FL€ÉŘl¨ ” óţí2(¨;Éőú8ógÔÖičv˘‰u×"ÎőM‹2ććŃ‚.ŕě[Ť1eŹŠÖF<Cůęöü\~lúmúż[Ô˛­ň»č^\ś¸őš­h\sbýJ×hÎ\8pˇç” ą& Řk.wĎęZWÁ±�šéo}v˝`ß ĎR75tcx»*E, @%ŞOkű1Z"ô·Şqšşm\“DyGL„čÂs%¨/Šę*5ɰ¦N… ÷bŢĽŰQQĺúN~kÁ:ý§ń˝ŘkRűëUuôé5î©ŰĘČ<]EŘá."®@ňÓL@jĹ”v‰ČôęĹ6ŢŔ˙⟬L©j»U¦ńad|:äţő1}âŢC§`n˙‘BďĂv؉ĹÇwh7€?=Ř:XŢrÎh:@’έ§úśËŠ%Ę©IbŃÔw#bF'©óMßůBłđ%ć]|Đŕ‹ĹĎnĚJđS}cVlc2çBô*'PôCXZ_n2'Hëđ FŔpYyĂ<ţą"ČđŮ›é/>>Úei%W”Ę"4öOÇą¦łS·¨cąĐĘŽ¸Ü!ŢÔ}čđ©˝gý ĄG;ůő+ÍÝFgcßÁîř `IˇżrŇÄńŢŤ,ÝÁ)ĘĽâf'7h]RjŐÁ™ĆŽqęHX0‹U!ŕL±AIĶť™¶¸5cĆŮ`?[«”‹î°íK1™ç˘ÎöH±ăł /‰ß$=3y÷·Ć‡Ń»›ć^2uč˝×óŚ‘?˝ůíµ‚ĎL|ë馭3G0ÓK¤ĘY9ˇë´JQ˙^!ňÁ ĂĺÓÁČ™nÂÚAhjk›—ŕ(ŮuĄřąh\LcÓ’ä–‡ŰíëH1Ě.|ăÚÄ3Md¤9±ˇ®ÉÉ_éěŢűoJ·| š™ßhřżťÂ¶%÷ţˇ¸7–fÍ6^.^nGď7%ÎTÂͨ ¬ŚE˛ź ©BžĎÜb†Łĺ• ‘‘eÖFo3č‚Úbhá{=j¶Yĺ*OoßuÖ[R™Ą1GzÁhŕŕżé`hęŰ—ĄG&=» ,�•˙ŔwV[á˝’?Q×čyńžiżź<‹É*±óŽb)Šé™k}~Câ\ĺąÁřŇ‹Tż7A4”ެĘi˙Fßü‚ÍC_›µŐýę†ýVOݧĽĽ-˙ĚöII8oí{†TşjĆdĚT4Q}…±Ü˛Žßž\ŕodu©~¦úxZÓѧ`$_NW7=™ĽeŤŞfĽżeźoÁ}ˇŤ‰@ÚBiAQI±Ďâ°s5¶^řp0ú5=ý—Š đ*[gĽ…f’ŞKÔş3ð®ÖYÔú˝J·Jyt` NZx§Í?ôîÜCeÚo—©˝0Úß»{J3¨>úl˛óZ�4J9/{Ěôż®™LTĐqĆ V٤ NĹʱúđŁÜĂ’í 8ŹÔ«x˙Ło͸ąBô5tÎ éĂLe8Ŕo×I18s†°ľ†]¸Öö—+łŮśÚAe™ýČŔ)oT%ą§°zŞ˛“x+đŽaÜíˇb´oę„°•“Cšľvj®›×)âQŕ1Ż`ßÚ?Üěňô”d´3 çeŇ Ĺ:¸e ĘÎŻ Šéľ›yG^Ěkuj­đ´QČ+đĹ=nóÓf\™7ä+^úÁ‘ŢpJÁy?ü¶:€8Ó7ÜŘeĘŰËř…Ě—Z3Ť ôkšöŞ5 Eć =>S­wŔG“Ń嚲B>ýĺňr±�]żţYr],JŁčnFź¤řr’Řf–˛Äő=[8›–‚Y H‰J× k¦Á÷4ďeo&»«ňđ [>ě¸Tpń çĚĚŹÉ7o[ůŻýĽ+Ŕg’ôˇ‰2ŰŘbÖ %Ąţ‚'öł´‰+#{á¨ćpü­'°|ť@pä]¨$h2Ş‚ĽzĆĚ’ZľtŤQŔWác̡Y�ő_Řg…ˇN\Ť®ëńᲝć{‘f¦F.¶á’-—YŔkáÍřłÄ&F}sâť*'ŢŁ3ę<µ×0µś•¨Ź…ŘgŞ ˘úň3Eę)_)Ó?ojť‘84nUwJÄśľ�—śÖ—ść=ŤvŻ˘xçlúďÔ$pÉđJż„G»OŞFßf€yDś¸˝x€{?AuŰ[Uëq€}›#ÂţĹŽJű€{˘YrGíD–Ĺ€vRĺčM;‘ŔÚhh y&áí :cn#Úox[ač`câh˙|ŽÎ8FĐoGƵË*Ô˘ĆĹ›%čmQnĹĽCđóúĐ{f!·ž˘~uďF5›) ¶…c"}ńa~ô€^˛euŘŕsQ]›ü•7đjngŔÍz0C}Ăú31˙…Ăřˇ‚¤ĄB˙ݰďSW, Ý–Űv‹Í[ĺ|˘\l8)VŃš+Ś‚ćäu7Ö) lËÚkj€žŔDw€¬jčşź¨n &ËPPŇÖ奚/`•Ř½&ÍOŐV¦áńŚŕ$;Ěoµ‰·;E¸ŢăaĆ4Ĺ(”YěŇÂł˙_M‹ŐŚ‹'파�¬ŢĐ6łs2·ŕe‡@OI.jéş:«Ů=púŐ$ĄˇU÷šofŹÓ2LÔ[V3ł”K$iŕźg°Ů fŇLŢnâ\/ţĐý ýaDc± ĎÂĚOéą%……«GP5Ľ„˛i>®ó’h7k G áDZż+k.ÇOggS��Řř�����Ąßm���ćßuĽ/˛ÓËfdbnD./6"!BCCAq¦§§Ň‚ CFedráަɦtqppÚijž5lé§QÂwINśyȤC†LŐ]w¸^‡ŁKQâHĘÚ}1"˝îş!rÉé]KE*ŃÁt YÜů˛[0ßT?ŮíyłĽ“ŮZ$ň앺ĂRřň˙—ľ? ó#đ[–â[ž°Rjźqj|.ň=¨qV–h˝–Vëx{jMě8č Őő7”Ąâ˙|7§UÎýs2O†o3ęv˝«§¨Sň±Eň^ÎLo·â?˘˝Úin qŔ„HŰRćşY¶Š*đß2ţ.ťńKî§Ű÷n¤q îŽĎa\V—š€ M‚ű…ĘĘŤÝů|Ţ˙îR7uČÚUśT¶ź†§Ď3úŰ&ľZfi¨!,^îDm_2,ňA†hŽ;qWmU&O{<u pQL2Ď Ć˝(xTŠÉźĄ×@›t^KT"ćřşŚL¶ÉoÍ˝ú"şTa‹*`ŞH<ŕî_î ·ÚȉIg,x–[—*ę•’č–7ą1çKźź§Ę„Ç\w_ŻĺÚcn!aĘ‚(–Ć©Ó8Č޵gq¬—E¦8Kší–Ä“˘ťŔčşzYbĚ<©§ĺŘü-šH‰ @˱NóH?Ç#sŹń˙ÁI ńß±µJ欞˙袉TĽúˇá•ýáĆ!]k/cpźÁ‡®;÷IöQ}wNÉ™Čk¸/ś€‚ötáÜWŕ0ꌧÂíRëW!ây?ÜŮjű›ł©7[RAđo‚M®^eąŽ đŘâÉĐ÷›d>ľ<śśÁ‡ąÖ{Żś¨eÜĂ•›o}Řhš$p„� » S·Í¶ŔÄ ą7„â/ 'Ć—˘”Öw^s"2żt ¬€{÷zČĎ)Ě[±;•?$퉅Da™á}–MâĘľ&$Wü<Iô™sŁŕ¸&ěCľşÁ™Ři5MsÁ?ÚXß쌀†Rś›‡«x6ıó$§@›5ô<kößbĽˇ ă[Šdti3Dń¨Š^“NÁ»Ň‘ €TôzQÁ{ŤbŃuЦ÷^‹nP"ĹżÝć«˙ĺŘi4čŔĎËŚťH ˙ž›Žv(Nrţ¤2.AꎪŢÄfЦ™R+LS ó ]üűü@•ű±˘$öAßÉűÇĺC„ ŠrĆ zŔ› ±•«+ţ˝wâ=–1||Ňß‘M—Řz{M¦M- {\ZZ«w’$Aż(FčN쩎†¶™PwákßݢOĐC´„}�ăÂů7wµč2‰Ąë's’…˙Ř%€Ö^ßK,c:głÜÔŔŕJS h[5ßS†łJđ¶ń ĹĎYś1ĘqżDfÔüŘjď!ő…Đđ!ţ==‡9 –šI3Ŕ]$– qpxxőĎgĄö0 §ÎCÖ;;ú*ăĆ!ąh v)|č;~ {\–•`Đhб„ó5¦ČÁHJ=y”ÍÍę=ŇĄB{Çjö§ÚFcmGůÜ,ZyçCćĐhÍ:Ľć—Zů~‡ [CVj]Y»€ ńds’×q|˝nÜ,ťŇńĹČţ3:®ĐHk‰#ôű ĂĄµäzžJ#4–ĹŻęv'ć/¤aEÖâ?xŘĹá¤q®ŁŘş®¦  Ł Đi`hMęHqűHt˘äáM|•§lsščvWí»čä‚…Đeč$kŇ+°äňáĐŢ"Uý|µ_,J€b˛ÄĎY*÷Řb'oh ›Ęß.Źxšä/µ~·ßĹ"ćă]ÝżĽ/ż1›>ŽIµewăüIT:ÉÚĺ(7N8’OW¨LB VŘdĺZI8ü9śí50¸VĂ^{ÍصhÚž«ŻŰp–9´Ă Ó^(›`§E‡ţţ`N”˙ŞS}w¦ţ˛ Ú0Řh —¨Ü %"ć‰oéltżwy2¬ýxńO.Ś;µYO!#vٱ<Łłćňąčt”znô† H†clKr©[0Ş(˝ČoŘd�ĎéŢ<?$XtÉŤě8rÓä˙JdZŻ®ldíu6b‘ő¬V‚(ńgĆ´qzF^~5˘őĄDľSÜ de\mxVŘ ¸íGÂĆ0›%ŁôX�˘„¨Ű%­*ݰşqg¸úÍŇîEĎŤ–-D=ü4ź¦Ť*Y÷× JÄín<5Ů8]JFV;íÓW†”ަ€Ł«ĺ Ť#s~‹YŮSy«;Č t î™č0‡«€pŘK•Ú`iĄM/Á¤ dâ‰čmńfcĎp>îžx.3»Ł)<Ľkâ�"}ŕ˛ÜĐmrpVŰ<Cćď·ú€Ž~Ij·±ĽđÝXvęR#óůÜ’ËÉę…hßHČUúRű·ł,âhÄÎ.¦ży^_™±jH*K›Ý’’-Ł~F Đm±˘Ď\;‚ţî.Ôä—·Ś�µU×=ŇƤ_-„'>¸eŘťňŇş‰y|ĺÚAhĽ ! „~Ňź Î0úA5ÔźŽiôĽˇ};EŐ© ýżëKďŚ!$1qUŰWcżnŢÁ~Ę~«fÚxÖE& ~k$—ŹÄAuÚt=­MÔżęÜâqĽn†äf•;kÄ‚;$Ş>ěu“,śÉî$ĺxtŽA…ę~ř»’ýăXVÔ Ňěb™śćŃ^š˛śěHň0›­‡P_Ş3Çݔʕ‡–o¸0ÚCk$—Ť/’ťĺ żŇ}Č)óR‰üôĂĂ §lň´¶ę9«50dI éu"%ą K�íôwť %—ÎĐZˇz&ąÍ¨j÷_aq]JTˇÍßB[çä÷¬=‰ú  ŇřzŁW̡7ý>O2‹N=m,™g_ݵeĹţŇäń÷ýBžş­ëkPHščš§ÇÄŞ@«•»Éa UČöŻÖŠf2ě G’ĆőµBÚbjŮÁ Ź#°±Pݬ¬m’¬—a›Hş'\–Pď‘5*÷ä沦0ů»ËĄJY`~D'Ápi©áóÂNKč›ÖÖ€O_'r»é'‹Ŕ !ôęŕرsÉ>�úÖźţE:U—ņśYţ¦Ě,Ěq±”©Çů=Ô…-'b·éĹżę ß@W+‚9V?›xÁD.ËλňyťSR?^{íŕmĂ˝_@šú7 <šßęČÁáT·¨něrxAcĂäj™9@~g<pb—Ź ë]ÖÚAjĘßó%<«Í¶r@»żĘÚËŃo'5Ľ žŐDg&áÖ>€Ä٧1}YEŔ‚!U6Ą«)®é wĄŮ¸Ç5B*jÝ_~ňĚÉ}¬‹`+=”śč~ő~k ŐÓ†?Ź\.#sëűĽŞŠŚdĽÔÝÂB|±ÍŚ»ĐYšBK›čŕ€z0¶5 áü€zdM4ĆŹ€p3źYŞľ…´O€zČŐ=^EĘ€zŁË—Ľ^oŘhŻr†4ŢâĐ,ú×ůšŐŢŐů��rÚÍl$ť©YjY=>ŇÖ"^Ăxű¸ę"G‡ÇőyXËĐŰ Y„âş�ń—6[ŘhžTpmôÚ -jűč‚…q­\2ľg2ÉÇ}gôQZńčE1:AĘOHŻ*^Öń;‰ÚY­µU‘†Ľdŕ||yXU¬ýˇŘe»‰^Ş~–Ő2óöŃÚJčá‘S¶\ŮşN-gŞ_ââˇóż÷…ÚŹm8Z…É,Üí–ŤóąËůŢĽ*<¬]űyőfeČ‹MýŻţĺ”\ôBIe8µÜHŢlH€|•Ö©˙–Řb\-𛚮p”ĂÔ*7«„¨pCÁňE8dŽ5*zzě„c> V´4˝:�$ ŹňLÎ/¶đŠy{9ç(Ě*M’ #[˝Ü'˛±p–Čń†*|6H.˘\-ćŃVč¶ŢpŕŤŘ~x^żŞ! ňżPGÍ`TŔă!†őŽvµo‡Šu`Ä}~<z‰x‡úĐŽ·? Ĺ{K«i9éĘ)ż?Ö ş¤n zşÜ/Ż[¤ěµt€xüšÁmx+[kqS]Oľ»Cz&¤ÝĆ·®NƉ @UisýÝ*ńÂUťFČg®Öf4ĹEK•.GMŻČh‚}uliĹÚR1ůČjxe\ô "Ő9/,†IE#Čj6Çľl"3HG˘Ť«°ŹČhfŐy®2dćVRM—Ă ŘÚp~TŔ ‰Űi(ćgöa&?ĚŢ´ ´KţŠö "!®úLÎ3v@ÍĽU~ÝĹcI¦˝˘0y Čň1…Ęxě…I§¦ P¸Që?/ű{ |v2˙¤/ŰgŇ%E.Öl˝í) ¦ßWZę9Ş Rť~ )Éő,¦ 1ĂqÇJż?FBÄ6›Ĺá÷˝; ÷Óźaý¤öXÁdó¤cĚqŻÝŕ—0ÔĐ  ÍÝ·U“ÎbĘ+x"×ú hť×“w´&¶ŁČ9‚JafÍÍ^?Ńő°Ř ó¨áĽÍ´Łśm Ą Ť Úm~>ç®LćWD—ÖĺË&Ľ˙#d’·¸<gŹ -É&RBN5Ć™u©p…@?ˇ‰ú%ÂÎcü~ÓđÁ‚ŃÜ.,«Ť÷gžü*łËÍlüÉł6ĄÉŇ ×ť•Ţ9 ęŃ]ĄÂ-Ęťř»â=l˘_f~ÂÜóŘĂ«X΋\;Ţţçajňő,}ŕ÷+Q’˙D°‹üž9 Ě Ť†86MÚUĂÄÁqŠçF%Wd!ŔÚ…Ů/8vB‹2zzţ´&±–mŢ^łĺ 0g5 YEOgg\`.A÷Yʉ¤öľIż,Úaj:ˇ6Ŕ†W‰śA_ąjK'~×ß,BRćď{á^=L ĘCdÍÇp×EGÜBⲱ)űá'B  -¨oô%q‡›vŹif%/9řËľVÝú{čőJQâ�¨ /¬úî3jŠ-yăc ű¨T3]i›HŐ�ľ®^Zň‘vç~ëăo dŐrqŰ«0W‹ţfW–)ďEĄů•čő–k%đňÝÚđÚblKY‚\?Nđb˝ša1:>\YoH¬żĆkéEöůé$L )O¤™<Ňč'Î^•Íʇ’0±kşoĐ'ß(» ĽÔűd$«Ĺžň %ĘUc#n[ëj˛VJ©­¶ł0׼l3=‘KfUˇă€gÇtzanS0Źń3Wx˛Ýµ!F—´ú"“–|"Ż[A8×ö–›Ă·˘;ĹÁ†ô“8zÝÓݦčkűnq˝5${}óܱő�óÎŇ·¨çBt”×ÚBcáŃĎšs§žĄürĄę‘™…!c)b*ĢHš8ąD öśoŚĎŐ)mďĂ Nq•MG˛­jËś‹mRwfň´¬Ľ(=|NĎÖ%°÷i™úq‰ő Q¦b`¸3Ç!=—ěď#Ú ď4·�Ž˘îl©’ô»Ťž4ş +¤ŁUT’†ďMÎ#]-xąđÚ÷FâŇs›Ł`' MrŘCsÚ©m·„` =“±Ł)/ľ"ÝÉ“TśŇ…4Ubż?ܨ؉7ŐOqnXtYş˝… ÓĹ>öżEřa¸2‡üvo|ń]˙´^SwÇÓo¦¬ĐOĘŠS–WŘZí%_ŤQŰ﯋,˛\S°q€'ŘF&o=Żkľo ;˙TĎBÜMy.ˇ»†$é7yE“ěŔ? oí§éôňß}’Eů0„ň—ô5÷[ďĚŕ şôICÁ |?1]rz1ŕ„Ý”ďľ^RBŠR<ťaëw "C˙ kşDšrQĄ[ýŘF6ş&'@`wŇ3yY¤lÝţćpî.<ąťGŮFĎ­đýö˛)ÂxŢÔ@Ć»âIé,ĽwZĽźŻnĂr™QoĹ\¶ąWiÜűTqá›Yć…šĆr>ŤśjCžÚ¸kĐŃ¦Ë±Ş U>–L`]îŘ‚—Ľ‘Z[ Ę©ß9ť]Ş~ý Q)}·áv$Ŕżp†Bü!˙Ůb#ąéWţfÎ(̤µ´şľ&ŁČţI7\�#(%FŹĄc ĺÔ!)É×g°“Ácjő|Ďk»¦Y wŘ©†Rß><DßHŇ4Q˙iOggS��X´�����Ąßm��� łY:qŐŐ¦} coAadbona@…ߡÍŮŮ­ÉĄŞ «®ŘŁ,»Âú…©ěäő; wľ¨ ţ‘ö»ĚAgYŰľBfB4|Ó7ş2˙~/eľĚYq} ťžQ h#z_>Ű’…ă‹(Î)Ź?3HŽĺ…Ť‘™«mEźv± M¦ĘE­-Ćlfjí2üQ› Úr†nŹ”éF>T±o|Ô—ö4ă‚úż¤ÉÖ¤ nÚ“IŠ{G(ěăYŢÝW:ÖĹđ#,ץ‹ď¦Š RUUťuĐ. 5‡˝T«]1îµřŹ<çśź HʍTŔl54ź%<Ý3ÔvF éPńâµgłZŰjÖŹ7çá Ë+O=7¶şDËŘ Č_BK®3DÝ«>w>Ęú•ěŔö"‘ =1TÉĺbäˇB/ń:Źîd!oq-Ŕ‰,Ř›{˙°SHöţ|·±účÁůqOK|eu–Ĺ—ë±FŹÚÚDjČŃSĹ‹iÄyPp#Ł~ŁK.Ú âĂ+PcĘĄ„ÂŇ´á^dčĆô’4 Ě4‘➬ÖŔ'$č>±öĘŇšôp÷§)jÍ+«#ü.^ś!náµM¶‚­qÄy(DĐé_KtÓÎ?˝ż[°Ľőˇžxďü™Ą¦°ŰL˙÷LZŚń}đíBaÚcjŘ3ë˘1d^Đ+˘ô˙?5fŃ˙-˘OéďCˇ4Öń•pĂąďhĺ»= ę?ˇ3&ü–ŮÚŽ?Ä«Ja”Ýżś¦ĚĹÁ2GL"yź… 0®Y]‘IĽ8[�Úb Nç›k†‰LoÝd8UŰŘ–şď ^!Ř<1Ű?&餻M=8w:dZÜ«cAŔŹ?±”!‚9˙Ň+]řpĹlwŹÝ•ő"]Ř}î-Ôß„A« +Ś\šCNĄŕľßTíj ®Z2ÖÂźXÂ^öŤÎa>äy ©Ô—4Ń ÚCjÜ{fŢ5đŽ>Ť0plÂJ2ŚđáŃV¦ ŠVÓŞşg‚5ôĂͲöt:~éa|Ű|,Rż­5!=`˘tćřý iˇŞ…’:Ą3f$%Ţ—él·qČq;ăxÜĐ…Żśá§ŇĽ±Jđ] q8�"Šs `ÖJW¬™aŞ4Ĺdžä—Aµ_B1]?ÄŞŃÚ?Ż®˛ŤM“’ču!¸Ú=g`rŤZ,r çŐÖuyé�ÜćŐ¤OúaDE°Ä۵¤wüäýXÔ c˙‡]9ŞS˘D˝+˛ËŦd«X!óâ[IŚŢÁDŐuoŤ(Ă ­Jŕ=!^˸ ž Ď[µsMއá8Ä”Â�ÔĚשUŽ9nY�€v1ŻC5f€y ڞ¦ç €s4î`¶ť@•A€y´  v­Óâ!€ríe¬µ††€rFŁ…\źŔî€w7á;`öëŚe€q‰±™€ĺ ř€r5—Čں݀qó’q"çő±ŘcI7•Ő=Í—B¨Ü'Đ$úť+/0ÄuüyÖHnŔăPql´ŘĄK¤•…uxqÜH±‹S N8u`É˝ŤE{©Ę“ś’`ŻÖďŮş 2Rě(ľ¬CfŇş˙ăç„\ȱťŘ§^d,’L¶ű3úŃôĺö‡Hě´írţFřµ•„ŰX�¤"zL· TŮA—”ů‹űND8;| Zž{˝V¸Ú×6ąýĽŃGbŮţdňm….hA¤Łń–Řx-äô„e|ɧ%+ŘmŘ˝OÚ”ü¤ĺ.]iX'ĄžQx&†d-ĄŠĆYˇťXyť°‰{`xĂëś™ZS]ë2Á–±Ş|+ۢ4ą0Řm™ Oł•%ońlŽ[„ÔhÖaęů„Xń_=ţý˙3ŻçGb¦s Ń4Ţşt‘§¶Ž‰zĎ s¬!Ř)H{aő©m¸d?GO¸\B<}¨ "qőőó”.Đ˙2bȵĹŘmĘ ýŠ?ZM¤¦[<ĺlHŐ!ÁîzîżÇ˘Š‡T±!mÔňňę•ȡÓőe  Pcż,ú÷ŮŤ †d^0îh®b ¶'Ó@<TăUTµ#yI Ż‚Sl`l¨á[$Řl™1‚ÄCn§ě)6> ÂPđ÷G49š˙s?&öřš1ßjOÍ ¦4c.07l8Taéű•čşîôŮT·u’ˇďZÎĆ\ůTŘžDň`F9UŇÝ1ĚUń>Z#?táLبH›9ŽÜCÂďKnĺď˝1ŚI˛Ś‹řçłüď’§ é–1ˇńă‹ôČ|˛@´ß­ŞęٵČÇţí­ŢŚőťGM>_—Łô׆ôXE.!Cőń”Ä’ŹTe¬‡ÝÉ*€p†b öR^@2i)ŘzŹehŠşť3í—ŢyǵFd^x°ć 2FcĎ“ÓśŻ›„´ăépÚ”űJ˝jÂ×ŮĽkꕢMĽC©…°­”_bµ¬ 5Z9ČČr;•Üçnĺ‡üFÉčgĂŇőFbY‘®ľţždj­˙'®ŘhÜ#›gSix”&żwíŃxľŰúËxÎÉj4(F‹śsiy”1ôŘáyÚc•ů”!*Sa˛Ľ"— Ř™’”ĺVÉb0Rű)ŹľŰ^,ßČÍ3Ő8S™%ďBŤ1îŘhÍ<•rOÝ)gIčO4'ÚhřnŢ…Ńő°¶çRŤm –8'ČÖUükˇW\Ę9dĘŔĂpxňÓÄĺnQ]ÚChăż`f… üe-E*Â˙Ĺk"HS­iŁ?Ńo5;A1µ+ÄÉ™ĎJÓd2Zë|]ÝíĎ [týu¤=˘ő} i]ôěCź°T éT+ÍJ:€d2°‘Ď*O<ˇjÔżgęő€D5Ď&;‹$LLřun°:Ęj—]™bqs‰×ĚÚo@~¶sq|QmGž»ő®ăô?ҢdXßŕWËQŔŹ”ýđ"™,ôÄäËä56™îłżŹ>GÉ­Ř[•Ň`%Ŕ!6 ńůM÷Ę(:BĐ é˘] ;6źVń›ŐżcţzĹLG®Ól(zqĐ-m–bA)çŢ„ëhŻń/ÇŻ’Ss�Ţ3Ě:Ö™©ĘXFŚĘK»™Ńą Ůőš(’;ǸTÁC;ŞRÉő˘uúÇ Öaë}«mÜóqR®“ľp[§©7„YSM›“Ţ #ĘöÄ“ąÉy4Äů�ŠÚAf›ëŮĐ©=#ÔŤRíű(âxóCAÓ@ˇM’Á“ćČžL3rÎVä }Ö}#ÍvFU8t˛41™Ä–×&ý?šMŰbPݸ<ηCsm~ş#]h>™ňžPéóŠŃ«ĘkÂ!‡ „YÜ"{·aç[„ŘRŤůyŁ6C‡zĎWcë‰K‹ŠĐ#j VóS”3šĘKšŽťjvZW"§ů> Š–É—~ÓÚ]h-ŁÄ{Íě M‹ŽŐšÓÇí(K38FçIz‚ËsƢďkçî/Ü+\«±HdR\|ÄôJŘ4iqd±•|»1Pă˝Z1y„§ZÝŮÁ´Ú\˘çbmËÖ~ŤŇň–˘Ü/PiŹÁ䉟§˛ČśâźÉh˝Ő’™q‰Ě¶&$~Ű߽ؠTĄóvî§‚†5Ql±OgŰ1R«ů^@íÍ„ą,ńĽy/ü–í“ěěfÓ€]$0¨ô› Ľ·Śąˇ•…%ů§™ë-Úm~ä[—˝ő7„â ńQuř5Y˘5YŘM Đâ!K:m#¦Qŕ[Ü.*žĺYuśË§…1ëRü-2…o=ůĂ;ĄŹÂ!%™‰2Ťűj1ÝţÜÓ"N #_˙Âoä¶‘7I»µ8Ü~@1ńĂ…ž}Ôŕâµ×Dé&Lßôwţ¬O™s:šŇЧŘ+G2Hi7‚[łYÝx˝ ŕˇíŁůlĂżłýżĽ‹Uč$E»CÔD¡ôu4Qś9ŇÉ9TÇęm>ČĎÍ>ë‡wĘÍ16u¶Úl~={IĽ ă"†śkźŢ+Űq˘ą ŠĎk3fťŮ¶O÷áÉÎÖX©ďGe¬ż¤ íţµ5$CŁS0úwkĐĚËW]Iscň7‡­Z6gúüţĄ%»ů°ăŕŢŹů,ۤ‘J2có˙ł8Ýéx—ăď˝.JyŰ~żMZPjEď9ĄĹ絛VÄó´…šbóEG*©‚zÖy<;KPiF”QXşDŕźV·<ŕů/ú”\·˝‹0„)ú™Q •=˘źT§­m¶ŇÓŇäđąě?ŃáBwě`.Ňŕ ,=‰‡ĺoggÚ?l"ÖUHµ(¶¦L[�š;OÓÔC"˝ÔE÷ţ,N†�śë5�lł€=~&Eťˇ�+žĐ§Ş 5·ţ\őĘ™Î>~[XF?¬›")đua1ü·%,A%`€»“łŐÄc™6hfȆÎi0űe6ŽĎZĐűń<ôţĽÔ„ąOňŢJĎ3Ň ý…l2°šëTfSj›ÎłHëÚOm)Ů ůCnÁ*rŽęqÚk6¸ä;ĺGa ľÝ뀉đ:0Ä—•ŔŮ·–§W™ž`Ł˝™ÓPBB˛Dĺ~f"âËǬ:nŰôÄuŔĐ•Ë˙Pő Š!"”yŰNËÜV Ż…¸rţxÄŇZŕ°}­FřÝĄy>†ůxŘ­mP;U{|˝/VőwP«ţ7‰Ŕ˘ 3ŇY‡´  Ĺ7*ă-Ü,«÷­Ö\˛D8§éľ¬Č $@@Ü2?@K¤%…6 9 O%LA"WV«O쉥ź‘]Y¦'CÚBmU‹I©L°Ć.#˙µ-eź-áĚ#Ř ’m3#ćŚÔ.¬óĂ Ş~ť ?qÓK˛1AÝ,<2Ěť¤x8 ©ÉĂmcčc’¨Nę‚kÍ›őÜ”p·ôĺ¶§RÜĐXa‹nŁ8TłŚ+ž{błkŘŁĽ/®#2ÁŚU2÷ś·Ű”ł—¤gÜsżZ×[ç˝äę+/x q2¸7á{ýĚ› ±žPőĐÜĎ@Úcn»PL „ ¸ŔŻ„ĘlŠɸ2Ţ"—íd{0ĂĽ©¬Ô_‚06‹‡† Ą*!vp–Ů)ť ‘K{śř_—K3÷Y­›wčŘ•ŐKÁĽ?y$顎X˛>F>/~ŽŤß`±ynşJżtënÂÍů®ć@sŰĚçßTĄ=Z_Nc¤j ,~ˇ. =Bő¨…Eâź•!·/Šd ň¦(?‹ßÖ™€~ębbŁR¨"Ăî€}× W C‡é}€|ůšŞe´:€~ZçdĚĘ €:gŢ văd„€:ÝWő»“7 ú€}átşřh‚ Ő\€}°ľ¤Şd>{1€|쎳zkĎ…€}ĚĂ©}žąô˝»¨n#|’4Çúů*°g+K¨mn˘¤/ĽŰENiYµdjçÁ[ިn!ĆRŞ0@JµjůY˝áK¨lF#O]ÁS<śŽ%Îçřî¨lQĄ€Ž›Tţhś”t,t4¨n Aótkžą C9™řvi¨n#Ľ-é}ďp-Ĺĺ`ýçi®¨lPb¦Ň„šGX;÷ÍB禨j˘Ńž°îřµ( őś{y@¨l,čž).%¬—ÚŞ®TăÚElN÷©±Ď‰qŇĎE=!ҧ9jôŚ. b¬Ó>ŕćëůíwŤ’Ő2�ç>•‘“@ďfˇ9ź*ľh>ࣣř»Ŕ ŰWmm–‘‘Żńi§Ö$g‘}ˇPĐv“·ŚşßĂ»Z¤ŻüxŇ3 =sŕXÉŁ'Wě”ęI$Îg |$ŃéŘŇKgłŽ._Ł1/hüoŽ_ŘQiňŃ…:Ţâ yFâ[6±ÔÖ‚ÚFn4ÜŚ¬ {—KB”ʤQÚešE}aĎĚż¦‚R~Hš¬=Úq4řňDČÍËęź!n%‘pb7Ďiłé&ˇyĹş†7ěnł·Đŕ“đůČu[náŤpÚf©`’ŚłćĽž0Óîđ‚…‚@hÎŹŚWM?4Fczľ]M,t!š?Ń® ‹Íéfř¦&léţ ű"�Dí˘ŃÍJ+˝™…\yR:öČäO€9š7TOggS��8j�����Ąßm���ËçŠtNÉÜçËÎŻÇñ˘ Ż¬ -  !5""!/sErDc#$$$7  Ůn±8ŚW겻(@™úđJ›™„|)_Ć‹¸ÄEd†2ď‰\ăÁ×߼č#Fů\ó~Â3ĂG!CŁYVô„rę,¨ËŃ„÷ßµčY‡†&şp¤Äłíe»żVo< +ľQVž$…|ŮÂćj1ó#ͬťzM˙ŻIë3¦bÚ„ĆJB@Xç;U6F0ńa®„#íÝ…,-V’]ĂŻ‰(Ń-HĎ9slwż|iźdÚŹýEú>$  +|MeüD¨$JËŚž7?ż6ţ”V:ŃËÚrh•{\!O´2ÄV¸…Łď t ăcÝ#Ć�bL|LUÇeČTĺ­—h·A÷Ý8×»ńŚg]SŘüę®çčĽáĚ9PxçÔV3Ę~8úŘ/ʆ¸íF/íL>Ý$ɟßjcüm(3@ôTŚHFęŤmóć„Ci%~ľ-‡ţlŮ>ź“Âu˘*ţOďęIŹ>ŽčĚ©zË»1A»±y»ăĹi?"xţdš-7Äźő ů´ţDS0$˙z­öҲ8§ľysŔôQd>PXB‘\Lä1�ôV5±¤:żĐź®Ús…6Ň-»:ŕ0/iŻkŃĺ‰kĐă˙ĹW„–ď÷çÄLĽą<+AíFŰ]Śy¸ôM›XŃů űç×”P�Í ü©&ÓÁÂ0ŽŁKë#Jp٬d‚NŹÇ'[z!Q‹/ ŽÖň3 ŘĹü ]Ýzâ; wq.MőZŇJSELF@žŠ9 „TđéĽĎô€{Sé;`"ćýĆWźCžÖőÄ˝«|VÁI‚˛úÎÜÎQ^3Nüw ŰDg­v˘íéě\‘ŽŚŢŚŻ‡68šw¶zóę´FVYÎj~ ›đťÉV€‹f+ŕn8ăµÚee‘’(ŔÇcâî;iGÚ§'Ü~ô[±ĎŻŘ8Đ4°î±&ŮçŚU$HÝ+řçÄ<1ĐW˛9ß: ĺ /]tWă‰Ę»xa%WfۨDÚŞŇäk–•ŘWŘCţne8Ł%ćv€¶p?cęÜÓŕá�éü×*ď´NŮkťwôúQˇW¬Ł—ĹrPĎĎhŕŐ DlžŤÍIsßÎܸôM“RܨsđŽÁ˛ĹU“öŁî¤”ř«]Şýť»i6Ę ŽF6ŚĹÚdc}K6;ÎG;gĄ„öńĆöč·ŮĆ B§ÄÂé´ łyg~=Ď<°wč^ÝVîPş{|¨‹Tá´­OŐěĽO«ÚŻ4Ô­]]?2Wh˘€1-č±")|1y@–Cb-yÝű9ő.1]Ý#<�™+GĚ9ĎlĺE4ćź]ë{$ `ô)Ż^{©š0Đúô€7îܢ¬z/Vľ‡ňí2¤ľgaÔCć4c@oV"Ξý1תE>ś¨CçÎó1ôÚHh|ĂvD˙ËÎÄw8ä´.(Bh'>Ď+ęŞ*z´ˇ¶ç¸Ôc$l~âÄyyYŮťĹn`~^ű¬š;jÓ4”~”Ŕ,§¶ţţźékxظ2MÇ™N䍀HSďqUî#rúç§‘€Ů VlrćâÄÁ8 ¶¸+gé‡\zÉnÎŢĽpť€Şé"6Pó#ĘćLuÇęL®GŚ_V3ň0ŹěůŰ*ą.™¬Ę§ąxň'pŮjĆÎËşOCPЎ9Ä…ôĹ~cfäaé][ĺ?Âë:tĹśűżaşŮÜÚň\Ľ¬Ë”Ź•ŔăúůŞhąçŹFŁ€ #ÖW©vŐ›ĽC† ?ˇťś˝ĎÜˤţ`;mÚŔ_v6µ"Xw"6ćÝ˙{&ňХصŐł–z288cvŘÔt¸ş¨ôÍ GXs‹żZ8ęcXgjÖuíÖĎô€4µbÖéëj۬‘J‘÷›K®Ąý6÷ŇRĹęÉ€Ű"Ž”ÚcmĺmBž+Ë1ź /¬nŞJe{dśz€fÖś0gł:I�g‘m‘„Ń`YĹ…/ß`ŞA‹.^|¬\¦Ňń^0Ć·DíůYZłí­~źČpŇ–M®ŕ=˘Öh´±Ť+ ˛löĹăwiSę×Ě3ÇFâÜ×$y�ßöďP“Qä®ÓwhÔâZŻ 85áoŕń.đĘŠ­é!˙Ĺx΢ˇlţLŢq(qĽV @$AMĽę˘÷<őČkűjI„k8iLş]áŇtÁČih™ţŰô0sgŔÉ‚_ꎓČkit @J!â#Ž©ÖáŁHČkisĄÝ˘*|i±Şť†ČitŇph%U7ń\#Ę—1MÚm§mÉ,«Qw�#ŮcŚáHěłÚNŃ×·˝®i¤.ô–q›ŕÖéęá$’ů{4Ůg`䀬˘!¶Ö#StܵśS§ˇ¶“˙¸ŠśJ<‹˙€DDPw.ďŽf 6ŰnP+Âsű!©S1¸%Ű‘+áqk8ĎJŁ€[řOÇ#˝ú�K`Ř.Ľ†©Ţ(ż&Ô÷Ľ04oĆjú~ň„6¨çq·ž~€ŚÄ @§óâě,[16Ú@kEWś–ůłî üŐ•YřĽ/˙SŰ'l«[yîç˝ńv#Y”3lŕÁgđY!YĄy–Ö[4Kͬ&`Żc‹ö!ů‡keGŞôbŔdHNjC$&śÓa}˛Č‘U§Tń–ü&ĺFVm±…,\Ç| řHľ>(žűÔĐč÷”ĸôŃ ]•ňZ¸±şćKG\Á 1:¦ZŔuKň�‡‡Ú^kˇ«±o€92-‰TŢ>çŞ xŢĺeýE Ř߬g™Š_*|Ř�îÜĎq&— ;$T9E|ł0{~0hż¸™´ŢČĆK¸®M˙1<cW?qf]ď]ć›™ĂK®¶Ęýi»őlA„ C2Č3R_j_yÝŚüZ™…Ą×˙ Bx>?IJ2u÷[j`§śAŮéçw’$¦^ZN8¸łČ:ˇ´µď)Ú@iącşp¬ˇe‰ĘůźjŇ5,böL®¦9dľ;}-P‹J›orăeŔ/ňŕVô\«Îă wĺ©Q•ЉţźYuT~ü·ě]+dvĘĎoÂb†ű@eś×á3o)We@ëv!Dů€?˙Ŕˇž]µ%y$Ć^&7Ň HË1ŠKŘĐ;˘Ű­Ó›ĺ/¬÷bŚéÖä°ŢNÝă÷«KW_§< Ěv•ŕ–ZŻÚ=bă‰Ô×$4h"·ö¶Ľ"±Ô§ăs”ľ•÷KŽo‚Ť÷IPŮ|ŕ ‚QNóµŮ.T4 UáQ n‚~űíŔ]CŤňDB,Âp˘‚TPA yŢSśŻi×j[ąRŁĚd�[óÝ©·F @«ľŢQ·@ÎHĄqN±Újî©Äh­Ox(†ŠŇŔµ´Ë(:J×đ ×c%ĺŚH™üo ´ aý;‡ľú„•ŮŮĐidrIî‘ůĂ'kj.vŃn ¶2˛N‘8źiGńĐiF­7K4ěWj·«×ۭ׏Čě˝”Űë\ć~˙Á;Ű#ŘaB¶X­ČăĐk>óU‘şÁ››ô“’u/PÁťG§z™»!ÖPS6Ú ĐjÇ®%ü˙Ľ4Ň놂-™ÔąĐ˘„A7B”c*ĐĐi›‘J|ŮóF¬,‡ˇ—ŤH¤`%pä_1Ú:_PoĚĐfˇţŁLě"<w‹~gžË$śĽ.ĺľćbMŕµĐf×€­J\;ĂÇä™x6Źcp_î(#¶žůąeů±9ĐbŇÚłńɰZcô¨Ňôˇ÷]0Mvb,$u|‚_Đdݨ’F1ĹŠh•«ß*2üčË–{ÓÜÍů’ÁČCĐËšÎëĐ~ áy˛w‰™"ÖůŐíxeĹĹş!włoú@NĆŮťŻUrÔG?Ąš¶Ü*ň 2¬÷Đf§ăăbóU+ŮĹ çđíĐ)É tsm—=ś*C:—ďY݉Đb߆8Ö ĽŔľ ˙tĺöÁ‘ÝBŻVÇîęłVxć#˘–ń^Đb\Ô”Ńĺ‡E·h¬EËÚë$Ë@Ś[Ü/3źwĐc˘Mk(¶ žI˛~éëŐ‹F>ą�v™:żeČŕËó~¤ĐbĚÖ~¶ŁĹą=¨„â`—·ˇ…çZ�ýŻI SŁAÜ•7¤H”ĘžŰ Ş…ĽČh•i!SÁ‚Ú™ž´ż†­Či)h©0z�±’wÖmm·ČkQçhb*]žŠ'Ňßň…KČl’Ť=§Źxöv0@Ďe\ŢK Čk1BŐˇđ¸c%ĹqqN»˛ŘŞ|Ѳ{KŢúń«©‹‡ť—IĐe/§”fĐ ¬;Ǭ ŘŻBĹĂ®Żkł•‰ęî6_@0ÓgM9C­©µOq7ÎňÚ &…sOÄŚk¸Ą“=Ű»‘äÖ#¤[fH$é7gĹ@M]äbYşBžC˛†¶śěĘŘk8’ľăťŹŢÝ2x±UĐąŕZlíî@ŔEůAžµČşP'ßn™ć÷˝-U<đ(°ďĹ<¨Q­Ć\y%NăÓ؇˝ Ĺđ¨Ů¦>fż±ě Žĺd4"şŔ!ÍR؇ܴ&G]«s©P×–A[q_ůfibh!ŕ[w§ű%„:F!#NOżEýĂ“P>n�«÷Űš…ÖŃ_śđî¨|zęçŁń&ǹɧ%kĺ7ŘjÍ=U…•!VśˇF·‹ŰRËă2ë YŽÖť-öůă+ŮDeŔ`’YžV!'Ŕpg3äĂqžýś– Ľ‚ăŔwľă<ŘkEo9Íiz:ă�EŽ`±wT©…$Ł×ţ_ϵ@äO…ÁçţĂłÇzŰ{@ŠŹEö?RF öf¨Jý˝cęůUPĽĺűľÖď…Râ_ę ž´%ŠuY¨ Ć&Ç@ř­żĄĐk?YDß÷ cĆçňđ“řmď!”ţ34ŚŔâ1q˙çNĐk:í;MPťĚtÍŮn$Ķß{÷să9žĆ&íRĽâü˛Â ŮŤĐk?VÇĘęU‘ô¨Ź/‹:bţÄ3?Ś˙hšÜĽ»ší1”™O)ąĐkPL«_'†ÄôH÷lÎÁ6w-!lvŰ•¨7ŻjŞQŕ€Rš=Đ„ó…4f”—ȱŠ”É&ż»`ô¬KĆÓŁqĐô¬#iX«‚Sµ_čo•ĂßD4·‹qڵșČkü>@Ô«wzž´™÷Čjé)µő[új±9ţôťČ ܤđZHc%ńLUmÖĎYĽęČI|ĄĂ0¶wQ„¬”[ť?ţa+HíČdĂ2…ßŔ*­·›c­Q­{ç€wĂ“ť–P# –€|Ši0ËTgµe€v¶űóJcřr€v…ÍĚm%=Ç€uč00ŞvĐUÉ€pđA!T iL€qUŐDmć¤ě,€qOËSçş ö€q'±Źtž�Ť#€qh<¦“ő/§¨dŹ˘ë)ĺzZł®üŰdBö ¨cú=64ŞwźÇS/ˇ¨dŽ9Lă ×\â|%5×7¨fÜAď^5Y]íäţ`ިbvN  1_Š˙géÜr\€pŤľQť31 ÷€t<©.ŹďęŔ€x–Ňčăňź €zËd}1ŕa,€xAj´h$ţQ%€xIvĺ“ŕ4JK€r®lĄ‡CTB©€x?µ Üë?€z˙Ŕqß-a)ő€zĘG-ÂđÔOggS��@%�����Ąßm���huIŇŐµ¦¶ !" . 5!!cBDCB‹«Ë˶#" ! paapq1/ !!AcdÚbit·‡KŰűëäz‚¶@.°€ŕď ynÉL‚'’7y[‚ĐĂť|4WĽ8:ě»ün ŞNXěŤS[2®Ôb/şJßÖRî) Ó$QÎB· ń i° ŇNť=€2+NI¨čë =B˙SýŚ‘hĎj‡!Š”Ź ô&w×X<.•„_ĎĐϢgâ7ZŘ˝V•Ű@üç÷őÔLGÂî3čO| ˝Ä<W˘ v´ą¬şĘâKPm—äm´¶Ém4ÎTcíVpńć!¸$Ä@Úp…hĆLÜţź§vÄő~úŇâ|Š\űE:neTµAr�¤˙Ŕo,Z@RÝÇ.ӷ殥Â3ŻI'JP$ËU¤•ţz|ř(Ť¸µů-sąxęôç`G˙Čfż™ńÖŘ#o:‘†š†9h'jďŃvŚPA…fŘ롸8śXš륷óśĺ)™ţŮ>›ó˘ÂĽ Â)oŇü3Łś-Źbt].j,e1_EOëZ#Úťp:öĘę®ÁÓq^ĘËisx"�ŘÖőH¨&ŮAřtwfŐÚCjŇvë5<%OxŁAč#Ëm©O>v<‹µ Sží"ŻoîëÔďâ™)<IQK¶·Ž{BŁĹívóH µ1ŕęNMřl¦÷E†·Ífh+¤ç'XMh<0smĽRŽ˙¨ \:W<Ě{áüŰ1–Ź -ˇ˘zQą™$Ď*C0ĎôĬÓX&ăĄ?•ÜYßúi4n;gcU'ąË>ÜM:e äF‘*ő˘÷kű?á�ن€;\ť._ÚbjŇWä‚ůqSéÄĹÍ ;[}„s¨‘f!ŁIéŻj`çqĂEĎŽýaľý+uŃT<ôĄÉBŁmę˛ŇĘqJ|­·×‹2"nž:%zŢxĄ”r†:€qĂt¸ô�!3MÜjÝÍë!lQÜŃú EFp ě<yí_e%J•(Č‚g 4*ĺĆÝq/ËÔř!ňΠͶcÜ×ÄgÚCşMQq†?^SÚChĽĽÉ—Ňqű¶”NO‡2Í� Q—TŤĂ•´‘ícř7c,pŐ†]-úS€ Ö´’†OĐ;Č쏭„s›—{Ú~üśÔ q*kü MYż’y†“jpÖg&řýuÇŽbŮ|ťÄg"[ÉS'Ű@QÄôp×OŻ•fšC¶; I."ŁKGÁ�á{Š\ĹLÇMUKĆo ­,i‰RűłÝýD,7Ő<$ĆG6­Ă”¬[ş(ĘĐfz´cCŢ„�wcäuät¤Ąfă€kg<ŕS\Đc@"Ýa_ĺźYphmÍ·ŽŠAĹŢ!ŃjBXi·3© dĐfĎv´Şčő©čúv+Sëőý¨JČÝV(ęîŹJ;¦ĘŇĐk K_� Ú“ xĄĹĚbíd¶X@ísť‘×íjŘ&Đjüf©%ąś’F 1úQÄŻdě×úŠ/RP÷éô… 8tŻ€wŠű–Áăí2n€wâ"AÎŕwµx€zG#rÔÉ€{ă„+ßŔp€z“& ţŮĐkÔ˘ýoßfX“ĐŠÇ͉_T‘éč+Ń±Ţ QŠěÉ0o8{ęĎĘ”VĐk ĄĄ*+»Ü2f¤˝`´9Ce>Í×ĆLŕ�çřaĐł’śŔ™+A6WꇕăţÓţM}Č~CĺG_{¶Čqüż¬7d XŁ'oÇ+Đhv ÷…$ˇói8‘ů}ßž sŰŐń/®,k6ě¸YmCĐiX˝ęşśÂUÖľ[z:%ş*·ˇ;™FćR3XžwËďČh”Č'Ă/34ŤxÖ¶Đü•aČh°?>·-V¶•­Oî­ó~ČhŮşXhx \\;^-ŚnČi_ĺNęG]zZXۧŮ?$ÇČfYZăĄw«`±3 Ód›Ři“Ň©€¤†vĂÝŹĄs'@ć—˘÷ČÝ5ú䡱@<‘.g›UTn>Brdžqś›Ű‰‚Všń53=§­WĺĽlüŽ*­\x(Ŕn=ći-FµË2%I:Z¬ďö”=J-âŘhîŠQz"K"ĐN;˙ßá+x#GÝ’#Á„«D“¶€é“Ö{ű˘ę›vŞ,µĄËŮâŰÓy×ě’méÓ„Ře˝  Ąş@t´Á.Śż+•MSô>ţáĽâ(sť 3&ćĂcc•1€WšŇáës:%›cDí;‡¨†é˙ş:ŘebÜ?Ą&ČŢ™“A˛Ě ÓwđWr ‚\nä1Të‚ă¸xAŽ`ťM� “´’@˙îaěÍň"×r@_™VQoĆ–ŘeT°W™’´;+ŇĎăR±OÄ9ě¤gbuU׭ٰśî”Îz޲Ľ« ·ĂĘnJżŇĽ@ ]ôk�:ěžzĂ[”śäÚCeUITŞę¦néŰ´~ )Çęľ!T«žŤQ Ô$K0[Č=5% q Ü“č ăÇĘ  ąCYÔvťéŞîgôý1€e÷Q]PlŹ1.‹A�övÝ…Ą'kŢŚÔ;ŕDB”:ąĄÍľşŇ}öjxĚ‘mŚzyq,ĚäˇQ}bŘäŰs—}fF©…ćOÍ€ÚebXxO||·‡<J®éĹ(JnG8ő|É´Čŕőě'58î®ŰĎÓ sŁęúĐ_=WĚ%šä l»+x©brtYţNĽîr=>ŘDŘĎwđŮŮ[ [UŃ:ąYęh¶ #U°g˙śWő<u­9¤­ ÖażA±KVćđýŤŮX�ü7¤1["t‚ţw”ĚQ}rlMÉ*ťv3Ý­ţîĺYa’^¬Á„ŮkÜ‚=L]SA älIBZ:P´ćĽŽő&G*¨Ń`¨8 ™˘lÖr;4ç !ĺ4$iřäü˛Äl±6*™Ą@_ÚÍŔ1ô锇·¸±“¶°É—’:ţÄjÁ,Hi“g“I™âH0ôMż)éÔ w(­ÜŚĐO®áTˇÄGěDyvu[sv3ĚR8:E×Íź$ąőĂ5aĎhűţZI,ú ÓţĂđ3•›ĄnlAŰ÷x+çI„śfjkŻéĂ€H^2(RŠŔŮfü„0ŠrĄyP_â4�Ő˘0¬É\C\bÂjL~#,éLpf~ôćPŕ$=ŠôÄYoüWᔸß"{*O‡ö@ü~tŐ-80đhx!ĽÉÉřŰ\a „™•Şîm ë…übŐćłßÜĐć¨đ´YѰٴyŠ3€¨Âf3)·!dC=Ľ…‡«ŤÚ‰)”Éă|d c—3FÝ × ĆŻDh”6ß‰ŠŁ~ěő€lĽźş”-¶Ń(@ľYkflUd퓸R2vźÚDjv8§uLAşłźoVcIÔHNO.ŹűČŹŔ;s´Äě Ŕ“‡js§˝Ľo‰, <ş9żŔ®ůt)ďĹ+!CŁ9~CVŰČ{đÇwëཉS/šż‚†o…ł˝śűçźÇ`e/P"oú˝D >rľ[#ç*ŃŤE˘qÜhó÷dÄř~tA÷^ôűč‘7-áĽĺÇMń09|úě¸Ë‰,žG_|LµŰHGOÔ˙‹×Đj*?[®�Ů ĂČ?#Kg'i¦„ĽP¦'Ú“(4•»,dĐjší÷ÚÚaËQMQ ąüRwŕ_??® c#¨ĽŔ˙Đjk ·‘iÄ1mÉ©HŁ/ů9»»×ňŽ˝H»…AAĐd˙Ó—ŰZîLń®'ÚšŔŢc„f\zĺ¶(0qÜIŞĐdü�S¦70×~ôć´)Ę4' Íă=‘¸ Ö¤3g«“Ż?ŘĆnĐtíq‰€»÷ {Ľµý_ŻÔS`ăSÝą6˝EĹWG“ŢŤ6ęBśâI)źX¶±Ql§�7«ű%ˇ¬ŰŕPě%©6M"˝– ®—‡S`¦ü™k{ç—}9ăŔ(ăß?°uĎ/¨ŘlëŤ·Š›záÎ(Bb vyĆŠaÍ˝çW3*śJĂF‚DŮĆüĹoť0˙71ծϔ8Ö¤" Ď·|#şgČq$*ŔxĎ[¨ ń‹%· Ű0ŠR·G˛™Běčč× Řk#2ÇZčYźŽ7‰đ ˛ÂR?n´Ĺ·¸Oěă3B9cĽLŮŢ•8%r%ŤŮׄĘgâBçÁ/üëą/Ç0 —ň?sX((±Lá;?q×ěD_§Ź8¸Ö`ř~SŘŞkfaÄ“«)ĽĚ°˙g~˛ä+ž”pżöLS*z=·¶ÁŽwŻ9‹WžčŚŤ†Ą‰CăŃXk-,5éŹOĚšĹÁĹ`jéý5)»őÚÄv*ťJíŤVă˙„©={ţnňŞŘ‡ĽQtHűÝĺˇr¨ąŮ5HŹáqeVU@ĄZ”‚L.c®^Uýó…Ż{Ey3*đü˙}ýEÁÍv^fuľŘ ™„.ď*ÁJç|B^!MZRăb˘mŢ…ÖöcY|P8OwS0�„éöÇşĘD.Čk0ŘFQE©3q~śű{ČkI1_ď.—Îő)nD ü‘DČjâzű#EŕęOęŹČjń¬/†ž[=ęŢv$óSbČi†Ü›{>]Q.V¨ ˘ą_Đjâ‘U’&iĆ€#R¨ĺgőľ«–ň«ů¤Í‰JĄ”Nh{H’6;Îi3Ř-Ćl�tśšőĐjćëüXĎ2ćQwŠHá-Ű—Ô*Ţ/xž©É€?ŞM1<Č/zóĂ®kĎQÁĐhßő«Â.¸” 9JB@Ď)+˘˘4j°94uBĐhř]|Ž:¬;ôa;ĺĄÎŃ‹S7÷»®×űĐe‡… yŹůV¸éwĄčq:]Ż u®9'â7ČeZţ»‡$“&ÖýąĹÄČfÖ\Áş#5ʆ3ă+ŠËČb`ö5S„¤yQžÎŐ-ňČ@áEđ‚ľ2ä_§!¤ÚRGżErÄČkn°iÝsĐVęY¶g”ČB›?żŹĎG‡€F‰Nމ¦×°Ľó.AZyČjÍ`ěµÔ[l†WŐ!{0—iČh„糆¶ ™Ůeé,2Ý?Čk»HĄDwĽ¨.úOôÇmČhˇ=ŁPň+)QisAG»QČhΊŮ67Ú‡ę¨oČh´í|@ß™żŞÖű¦Ćˇ~ČkháCL3`ÄŇBě.ÜkPČ~ýŤgüŐ2RI2v  ޸˝w\çĚÎČhĺbż©Yđö‹ {+‹Řij&ŚK™M–Łă}8‰Ö+đj¨ó.q°8y­OEC‡Ćq]ˇ’4|¶0Ŕµô;"á:« DŠVŤ�DşŘiťyťÝ_¨M@‰auŃBČĄjŔMĄ‰D=sŃWcşë 7(ä�uő¦…rY[ŤłgĆE:źą„&Xa­ Š—{o5Ť´SŇ,Ń·\ ;˘A4ý»q]H0[Řfť>™Ł7â"Sş.{U@‚"3ż¤[î©ăőć*rť$4ń’ ‰ H°/ęń«„ć‘äČşľ qqŁN—@ę§�ôç`†íóaÄşč”’JţţU‘˛Żô”´Ż ©POggS��đÝ�����Ąßm ���–ËVĄ]Ap/ !. dftsvstscrBbpof"$""" cKeiedeithsduFf76""6"1#"$  pŘeî$‚ůŤh€ĽĎő0‘ŕ(/#ę~ątTŚşă®ş`*ÖĆçÉWá!P"?G9§ÉMŠĎÎb‘ľ>ÔŘWâË@‘ʧäčą»Ű4îTz–M2n ąÍ(ă…KîIL- źżÇŹ?3Ńç‚ěÄ€î¶@r‹¸OĤë<GŻĂu.Ă4Ű1˛ˇ‰"(ýBöYs/Š©cl2 ĽŽlŢ;¦ˇ@¬±¬@w÷šŻĐio”»ZŢzôëO{Ů€THřň„ů† »É‹W7ąĚ™/ą÷0–ZKn)Đk€b4|3ĺiĘZH?ĄřfÄôü ۢÁuŚy=F™ Đio m;’‘2ź7‚5řÂwµ;ś’±řˇĚĽÉt–iúTĐiˇ$ćc@>N÷rusąÜÇXFV¶M †ňö~)K1çXCčCÝuIŮ<aă6ĐbŰW¬Ď©šć;éß=<Ąš_•ÍkJbŁG » «i€sr›Ú1y×�€qi×1SVrZ4€qgŢšI2…€u•ßF”›đÄ€pĺkě<˘‚E¨~'n6ú µ;ěî9ZŽ>ĂÚ¦çč¨bŕ—hľI6ľ•ťÜG‰z¨cąčٶIń˝–qÚµpŽs¨jX˙iÎL•-bÉu ¨dŠęÜ9�ŧ*ôźűúJtŘeÄ\ź°ŰrĺIç ÔŢ$gwl¨ˇědŞŕ-Âł¨<ŹÚ: )'`ąEC ­•ł'„g*ŽÉ{áâ:őŤ"$¨‰;F€b,ŃńjÔ+ł“®Đ5íxp&¬ÖhÇ+†`÷Řh‹őçmąAĐupp<lŮD�फ़E1ž2߆|·4´cŹą÷áwĽČDq"´ĄVť˘A“đ ń{żűĘpOĄŮ¸W§–Ôś“î:<ďźĘ·áĆu]˛’żvţł™I·zF�ŘB·ÂixgPT‰ŃĐ«‚€9«ÁXßřßp©ţĹukăpk ÓGo[,ޞÍJ:ő‰˙ěwĘŞâ §Ă”ŤÁ”‹ş)őŽ.8ť>_[¶ňofn :čhą2Çﲟ]Ľöű›Ú ĹĽüÁŞcÖ_ß–ŘH´ű>ż{ä`›ůţ—`jĆüEˇZ„ČĎ# ÄśÁŁRz叧ŐăokŤ g˝ŚN÷Ęą-@rĆđ™¶U´•Çľ1 ćúŤZŢN¤ň7śKőšŻoŕUĚĆö~Ő3ÎĘsx]®ëöZÇ`sÂľ˘ŘVŢBŢ4“|FÔôűĂdó3Ž™îŤ|˘Żŕ˛Ű‘Ű…r»Ĺ4”xŔłlÍçů K šJň™\s†Šá fĺ×9Ăp4µxÚőCěë«'×(E´H¨Ź•$LÓĂĎ@=1¸)?<FfĶ„„�í8jO˝ĐzŘWwFćá»$ Ü+wEĽÚäĹŕ X/ÍůJkŞ]Ć–ŠTÝä^ŚźŘpú3<HAbô“Ľ„Ç ?\Hü¤ÔźAŢMX©×39ć7‡Â­5ţJDżFÄ�Pz,˛'®gAIAC”.ML.™č@őŘ~đ&ő}|x9fˇANóZÉŠ‘�čŮL±qju śě ŚB!Á�–,‘çą_<ˇđ`N¬ŘBAŘ’ü5ŰŤ}DŽ˝üyD·PXäVĐÄ5üVç¤Ć(NÔ[ĂěQ<©~*i±źNÄ~˙IR ŤŘ~đa ŇÁç–¤M†ü7WҡťĹłaŞ~ž^˛2říĹó>!S‚Ť‹.LłJůĐá_VšH.JšĚęZ©LŃćM„ăKSXý–:ä?°ł1 é%n§ŁŻ�Ç/k‚Ăś·H Şß‹çf1 ˘‹L5dŘeô·ÖëFWrißĘPë|Žu“˘@›#ůx¤"ňO ôýN·á&I2RĽŰůÍÓę$g>Ľ «¤ŚdŃSÜŻś8X ´µ 4ÍÓYŔ‚ *vuaĺŔĐDňżf`>.Ł‘˘ŔzcZŘ~űV(ŤX)¦H~Ŕ˝L äE Z¤Ď"hnó0BźKGÜżÇinܰ BĄÍüďůĹÁôL)RAY\in˘éť'â käôç?Łs²śŠLÔ‡·/k­6XÂ!g˘$‹˝CÜńż!EĘÄ:˘Řb<”ĚÄ-ŐDĐ.W>9>OZY,ť=Ц›d@4”ަ»1yÂëfwŐ4€B#bIPLGcŃ-Qú2®˘° Řbs~v"łéS1‚•yŇ“řËVn¸a•¸gäCóŻĚz˛¬¸v„ ŮuĂä˝÷‘NNxPŰĂßĹ‚n‹żxgĘx‹X(”ÁŔCŞĹ dmVٶrn7„¬ó@ĹëŘ~üĂ®¨J9w7őa„úCS)Dć“€©©CCËá~â… ‹tĘůhÄtT$bŇV‘Ů{tlA%]†µsg덱HZ§ł|Ŕ&ußqŤ=FšŔ‘C´.ńF@8Ľ€™AˇIĽYhZ5wAĽ[(ćŘ~Š ˛çŃ8=8˘8­śx”rÉzĽë8lŮňWś•Ő˙¨Ľřgâ~ó~-⟯4ę#ŐńRGlŚ7˘’p//˝ÔÇ/Źü ›ŽjĆdžÂdOG¶ŹDçŮőÝ›ó K@9ĘçÖÓ4î4j‹Nlf&Řh¦ž q+3ç®y‰*žą`ČöFtŤĽÝ'~UˇKPSĘ;Xu.,<^ĺަĆ,Î@f=ąč 7÷Éź%ľţ.şMţĽ¤î8/5ÁVFěZ†^zbtŤ´ÍâWĐcÁk§ŘźAÜÖ‡ňĐŻ®Ő—¸ĄÉbµ×Tj—Jşg\Đje¬Fć?Hšý-eŔOÄlŹW€·¨´Z}QĘ}tsU 47!Đgw ,0Ć(oÎ> ąľ$41†!ÝhµĚ1xa k0ć�Đj=ě¶©@2ĺ* §}˘ďĎŚ „sôćBpúq ¦śĐkđ GŢÉÚÇđ“�¬‡BöśV„3Z"¦‹Ď«€{6żK=IĺÍ4>€{»¬fÜöT¶_€{(şjă}g€{ž;ą†y"ż¬e€wBÜË îŰ€{@ÂŢýaÚ€{˘We‡‘6€|íÚ061ó€}ČĄ±(qĆŤQă€yç–̶ł-ŢB€yď'M;Ä�·Ą€wTÂcÁe˝ˇő€y:qY´ö•ĎjĽ€{s§BĚš{"Q€yĺJÍż…@Řl$“–"oČ$°˛Č·"ÜÓ¨Rsý đ&ÍËX«ˇzÎřHŞ˙b;ÄtpÓŢ,¦çž™SČŤ'ü§ˇgFŽ`ÝŁ«ü ´‹= ąăž őÜj•ýcM]ł%ŘmU|'űň€;Ьb\´Ď©G‘őĐÔÚ�I: »ů´Ę¬ˇqnž˙%¨´JekŃIqĺ«čćK°˘>řŞI§ţ¸–±VőúöŘn.$*y•M ˘JäŘălť Ż›Ą!Čŕµ”ŰÝÄúT]<HŮUoOPG¤”Ä4é;€w?RYĚ}Ě%¦;ŕŞÁéPËkZőđLM8*ĚŁB&˘ćňąŐ~Ë0hfÄVĺŘmm›%Xýo¤ĎŻFŐÉä玷«őăy˛iAă2;WŞčŻÚżőµó`YE- W+˛_*í9VUxşp©ăýRtŻxť,py/ §,÷÷2$�{„…ôŃ9ĺ ź1ĄžÍńCÖž‰Řmm”ö·Ĺ-zđRWŹc1Űw¦:-ż5ý˲ůÖ˙ě|pisn<�s€ĹĘďŘřŕ®I¨›LŞA©Đřč§5Łz»ŁŘW ěí&îSă:“ďłjŻ…ŕBiŕ3÷üâúŢŇIKŘn/ĄçmłłRď9/¶ş˛äYˇ2ËŐÄ[}0°Âý!kw{ňŤ&FyÔAľ•l �oe†q@H"2qŞÂÁ;ń‹a6ĆÓlĎŹ8 ‚Ő]Y)ďĂűÓwÓÚÚФÔŘn»«^Á€ ÷Ő„?ăć“BDŃĐťá€íÉvRŐĄVô^§Ű›ĄĘfLäöĎÍ4Xčëät|śŢwqoćsJűŞU6žŹ†DvĽăPĎ~ô<»'±[Dý˙{*/hd0K~ŠŘoub±7˘h@ű¸­‘Ń6«ĘťŐR`cěVsŹú.€§×=0ÇâĎíśs‰˝äµČ (DɉOŮz‚?m¸3bý•EďTˇpŤ!L[…0XáNŚíęßí_ą ®PV…tŻyŇâ§ŻŘ~äřY/ŕoŠ·†2Ň™.°˙Ťúś–•µ7ŢÝtiîŇĺöňą©)řV+ú‡  ×h&µUŇ`1çUµŚĹŻť´b›üDÍEĎú?Ë‹€×‹áÓĘo)€ÂľŚ©|éx!Ł0“—19Řl@†'ÖĆE,Áźúuśpdý…śŠĺµ|ńävÓĆ©ß]-–žCźÝ_ĽÚă­§H8ßOí0J…$Ičżéˇ/ŤŹüţč] :ý­ŠL§µĘŘ�Á(ćS¸°ÍĽĽD`P/ħťŘköµGé]ČĎËĚGŢ`řbÇr«¸&z€?Ć^2ÉáŔFd˝×Ľž‹F}PęvÖ3äUjuľpĂ½b˙4„3\·>˘2¤˛& q!±€ě N˙( Ć×!ş7¨ßj:l!sŞnž}pZŽşH!:OřěĘŘd•ŚK%…Ě�BéÎz’ÍJ4qťÎ˛›’í d<fŔq}* Ą°X/€ëJŚä\ ® ~™ť^JEOŕ‘ş'•‰â)ŚłŰµZÚFňÖ=ą]×pä˛ %·‚`g¦†ŘEľŔR4~ )ŰÎŘĹÖ슱˯Ľ§_żZ"�ň Çtý<ąňÓÓŞ)4ŽB‘®&÷éU~ÚO®[s>´ňą^0Füş6í7ú¸ÜpĄSŇ@ž]Ů ÓŻ/‹źúEqI~|ťZ 3ľŞLÂHYŹ[ŘiN Ý2Çg^Š ěżÝľIŹÎO>‡ů Mc¤ŰCS«:}qŢżé]~Ş ă[ďó~5‡|Č´T…ʰ6ŕ).Ý áŘhť€P˘á�ěľ…‡:ŻRľÉŃF¦tŁý”ĄŢ—ť^ŰŔW!ţěířôTˇź`ż> ĹßO‰ł˙é[FS¶uĄ†t‡ĆYxPbÎÝ­g`GĽÇů1Lo—|>oĄÜ3oď¨H3ĐH#!ű űJ¶$‡rˇ+‘K±Ú Źe>, ĘŇă/ü‰ew]ß5׊[Éh3Tó~gčRĐ~ţ´łâ[$ę˙@‘ć92"ZRp”ď~YűóźJs)Ä$§’ýHrŤU8Ĺ1;Đeč©ŰRßĎâ:j·‡ŕKĎUMśAbÚNbÁ*î!ĐbxÚÂř˘/ďű©Ť -ă­µë'­6�1 Öµ0GĺĐ~B;Ő=‘ŐÁţďfťŃÇÎJ7Fżß)Ś}Ţ÷&o>Ľ#‰!ˇ·!¨ňr§(7ĄKhŞJĎĐh:|,ü 4U€ŃYîśzú_˝!mäëZMĐjj¨§l‚A.zäGëŰĽí¤ĺn±ŐĚvĽč¦”Ďx˙(/ě›i1´ŚĂä#Ŕ°Đjp0O¸$ş©6üYł–9"‰¸«II"YÓŐt)čéŞgĐhuĂí6š4ĐN�“R(HĽKcZQńyK®xţ–,tĐjn[;ËŢĐá;etż©nľčĚŔ'}ą¨ţ3@Rď§fĎ—ď€vż.óÁ*éş[€{Ľ)wÚU‘)ľ€|żT5Č·đjj€wĘěšŐ ”Ą€uç‘Đd�ąVÓ¨bŰ’3"rH¬ë"dâG¨Ś¨~¨fol wp9=4+±Ž`ó˘ÝžĄ)¨d*®”IXT”–ɡl}Gh¨~�ňúŚ_ç6ý5ynÇ«“ŁÁIܨb ¨J´Ř|9ďá廇U€|Ý4(Ľ�tüm«€p 3뽲PQ€{ľĘŘď©ĺ�l€pA,ď?BleO€uĽ&°ú}+ÄŘB·ť”1íqq]˙Ń R'˝Đí><V<ßg‘“‘ڞ�ÂÜD ţĘwýďDŇűÁŽ’•ťö…“ł€äh(›Eű7wJ°d>?Oa®×qˇĽN°1@Usb|ÎIŤú$Ďu5ƧZ\r‡Śäv,ČOggS��—�����Ąßm ���HŲ{IcdsE Dpudd"//""fFgut!7 1"«ßÝŐŢ .655 nqpp`°Ą¶¦ŘhŇëŞM«ÍvMöuÖ˙Ť|�cF[ďĽö&ąĘj­Ş@·±ŃE±Ěţn[Á{GPuáfi˘‚ŇŻÔSČôţĺńM8F€KhśĺR-éHžŠ¨â…0__·Ľ“Fî\©rŘh—Gv:ĽA‡¬9á?´“"}^�q÷ăF¬T«LKúìµ]tŕËď`ěQy삯¶ÝZ@…UÝĐÂh?ńém)©VS–aźf’€úÇ‚ÖáĂiŕyl|a&kJ-+Ĺ;ęš5Ř| ő �¬:ŽÓŞĹý(e… ˛č°6Ë &óT]aj”ů]f¶hZôxY]Ö©Ŕ˝Cŕ˝âÍ—f3;áŁGiÜb˘ źoŇv'ÝüČ98B‹g+î¨˙ŽŁźö˛ ĂË,gţééϵď× ĚŘhźŻë: ĂŔ~gá+N| o¤ç› -'?LŢ÷¨ sS¨ázţBÝZ’ˇ˛3q·Y”5v¤(RVó¦k ů}1›€z“ X%SŚ€zĺ /ĄX€wy«ŐŔ«2„0,2€wP6ęťá×ý€wmÓ`űŮ[€z‚Ýäľ\€x \NşňR×€sϤU1±P€z¦Ţ˛'űw߀z•x4ú‚–€rY.<ŮđJ—O€zIDÂxOźđ€z[ßö$J€sĎĺ—ÝÓâ€wuĄ3ö°ęf{Ře™“nxEŘëuiHDőĄB§PëŹÍ]É]11HüÝqŠîmk ßUčΔ´@Eµľµ`müꣲł@–îE/jŘ~RDÉCű@ ­mI˙ ŕ”ńĺ$¤ç­;O—fČdţsˇsÚhR¸.TĚ–"ůł™i‹ŹŻ‡\đhÜVě>«’ÓčRň ă,eOěS˝ďî:R…«Žrµiíçś@ř±;~ÁŰ7ođ)Ż×Ř~Žj- Ö@¸ą>}Ş"D 6°];“ç\f7Hî^~~4˛!%vż»7n˝¦i”˙@ëyOk° 2ŹĆÄ+6bě*€:ŽĂ´ěĚx Úoť5˘ďsăZ󂿣ŢďFܢ1/Ľé#W=[ť™ŰÇÉú@âŘbS3Ŕ E˛źÚö»żýĎ^ĘÂwľŽ…˘0ŐbuMýÚ<ëv˙#ÜöĽŃâ ĺdŁW\pć5-n &ĺ¶p°¬¦3â5Bϧ·¨ŚS%Ŕelôö¤9–ŤÜó2Őç4’Řfvęd9y/ç‹Xô é¬G÷톜Š6$÷RnWĺňh/˙śü’HfAł…ńXŚŃ„Ć·˘Úż{U’şXĚ%IřOyůá;•˘¬~8ĘđÂ8ł“vË-ć Ëů¬1IĂ-U°ôBĐimlęM°ic* ş˝ö’bĹ7HÝqçšQKo}«ĺĐe¶fŤŔFjŻxŇŃqśNܡ©|;ć”,-­[DsFn1Љ,)ŞB¨đD´‚Đk�JĄ¸ł;ś&ŻŠMÂ$�öݬÍ^~ŮÓX9śsç]Xß]jűX‚őĐjľ˘Óú¸Um y2EA«>ýÇÜW’‘¬¨:±ĚčxĐl}XméĽË˙§`Ž?@4`"ĘĆ÷3µz©ÜÍ ą—ŞwôŘję3Pň¬^śO`B1ť20řruRm{ŕ2Q¬°ť†-ľ}Tím[©&جś#eä*VĆ zŻ" D á?F/ňÚŐöčę]îŚĺ+ ›Iy©z)zţ– 4vŕ• .áäšŘjĆÝę ~ n ö_Öň=®ZygȆMw8Rt+2˛€ÇôĆŃł¤zx˘•¦Ô”]ů¸WŤ č¨2Ô\ş/häĄáEcíŮŘh«ĚËŃ‘§ŘżÍ!ź÷ý‚ß<6Ë{–úsUP CWx}Rl¨,ź~é pžÝ^Š.ܡĽ3R52üi÷Ń{¦âřâw÷«F#4´cq"+…źČśđv–•äCę-ČźwýJĹMů\؀ΌUŃyZű'ÍmÄ^Ô¤BŠhőM'‹Ťä%$#ßľËK¸îÖŮCdŚk8 rP ď}H*Ú0xQ«=$ q‹óĄ©‹µĐľt/‡ÝĹuZ¬…Ú‘}†ž'ë)ű(j%Âwőş¸ŚÂŘŹ\ł[ŕ�»~ápŘ@ř°ˇ]# ÜE¸ZжźO7’¬&Ň\Ń‘şĎůQ›šţU- V0Ž%ŹMëeŔ6Í>L[|†‹3cĚ®k0$ůZ¸[ ë0ĆjqŻ@$Đ.ýľEk’Ä»Öď©AJŕ}1ňÜtm/qđ¶ĐeĂס©€EŇ@ía}¤“öŤaČ6]Ź>Ň?đżSĐ~űţ›¦qĺOŰ+qµůŰ/Śś6-W&Ŕ›Oę˛u> ż™Ë;ůŠg0ÄQnpśKůąĂĐeż™>pÚ†°°$¬ź~)Ô™Ż8‚X;!¨.?ńŻ˝@Đb6 µ¸vîeŕÎsď0‡IA…Ő“ö „ µf„ÔyjLę�isµ:ż«˝ŢEăĐbVކdî`ľ_]ÔJ”/őΑó™řş´=ť§‘FÚdd$5¦#`µźtÄ5işŹKňYížČ<­ "ĄÜ>îěş+}vhő'%˝‰Ë˘ţÖ·Ű´» ąŹÔ1qĽŇńZŕŇ«łß˝ĎŠÔ çv–7(Ř’r‰†ˇ¬lcš#Fć–‚dßä›!މćâî,mŐâšP„ qHű¨.eŇŕ~ťÔ»ěäÜ*tv2űiý¶ç™?~ŕod:ćRšŻt22’;mnťHÚo~ŁőâÂ'Ľ1Ű:ذç:)‚n¸ ńk`«–ľ;Řg.˛Ľ0•1 | BőÜ{uŤ¨Sź`‡ i%RĹGt©“1†Ý‡+Ie'Á3°ťÉ˝RĺGö·¬ ˇž(őŔ[Á°i"m÷ Kŕś¦Í/±ę!~˘Ţfj™>r*”ďpz®·6Ď‚üąđÎ=ţ¤Rôć[îCi–HŢćYçزĚ×=!Ň µaµe45űŐkAł‡çŃř5:€ÜňÁÉh1Ŕ¶ôu':üOĆîý–ŁçţÚn~ŁÇYD§…©2®·ĆĎ;39Ä ˛<ú•¬lߊ=2QŤ�BšîR ´;¬´dŇŞ˙Żýw1Ž…DčKaŽ›ţ«ĺ-´Źö6Ţ‹´śFÖó|Äř†ŮD ”N!Őduďu+<oÎxŘďŰě#źÂěő~¤žŻLFŰ(ÜDı*ńŞi‡ř"(°=\7 •Ů„®YZŮČĂ‚zµS�vĚAŚĄ{éSn8#9t]-mŽRstëľvÇŁ§:fńO)Ťoâ˘)íUz·Ë,”Ш»â€.Ő>`5Čşd·“¦Úccą@úrčÍTHÜYÇ!ďX—+ĆĂ+·—%eĘNčé˛ćÉ ÷µQTµI)kbRuĐ#“\ÎĎŽ)JäZs{y¶Ý챬6bź~^¶˛ŰˇˇW˘ ÂtűU´ż~ŕ7c=ĚN~ 0ń”şa&x~nďvtô|Ź€×Ęł_zZŻ:<”čţś×Áň;é5xM͢Żţ™7WÂĎŰw Y,ńŠezä&®¬đÝÂç^IRSď…?f×ĚíT$;«k±ă‰«đXľ§Úo~[XpEËĚć1 ˙Y©ßhĆšóóh5ëpLÁ0ď°¶#ÝEÖ¤](ęÖ(y5Ť’ą˝đ_0aĽOŁ $H Ü2Đ‘1tźÍôČqŃ·lůsÂXłA.;="HĎkĽĂÎ'=­ŐE©ÁČ#~[żˇ÷ĹQU+Ć;橊ňď!EĎůťĹĎDŽkiÎŤ‚{Ţ”yf{´Ţ#ęńđ3[™şę¦ÚTJ†«BÓXJŕĂr©' &3Lb©źb.)čě ˛¦ŻéT:Ęh€b±ů‚•oČ~ŔjĆŞ/*5^Á˙Ot"¦×ó'Fkˇ!¸Čhwą[W’ m†Ŕ’ë„-Če'ÓGĚ{—™D*BXąFČhc´¤Č޸‹í;·żv‹Ď!7Čd’ N ě~sąžŠ YÓńĐe�cőĹ–‡WQâüT>Ö19óu‹Z)húĽ…ťĐj~tvćżHfzďř ¦ČuÂÖĄÜă8ş{ Źo0ÝZŢMÉă>Ô(WÝÁĐ~AŐ}‚ż*Ű•‰MkőŔoOv°Ů˛ŕřl™ĎbŠýÓ×^tʨîŇ…h‡ ˛Đ~žírNjQ7™óÚäAV¤n§Ď0?äź4«/gáĐÔŢn@Řfy{âG}ÉEŃŔĐ~hĎŐöŠ:cí}ßÍ )'%9γǖĽáť˛ůžÄ{č/ăőWa[D}'2ă!ĚńiŚČ•âEĎ»‡ŁC˝TË©óGĺ*as’3Čh™cÚĂbŃ,]:©W2dČ:®NçmĄx¬„3¶Żčó*E‘X¤3Čm5ę&}WďŹěn&ŞFńČhGYďÝ2ö.‰ËJ€vŐIť@Aî€sŠĽ}&ŔĹ€s‹d0Ł]€s4€Żˇő8ä€w ö«AR¤Ř~]’gXžćÇŁ!LĎ̵NvonŃ 1‘.˘)AŰÄ”8ĆƤȀ'&�Á úŃÖK{ ą^ÉbËLĚ•ăD2ĺµBs‰Ý3Č›ř1·e:ÚPó«2߸s«łzz(MJ~ Űꏊ `Á 7Ř'Ń7×€é´îŘarGÜŃďM»Řť¸z¶ĺ”¦;Ď”ťŻ$Ť}öA Ž{†O"j-Ʊí/ăyR–Ďk|ĺJôäź’ôgAź50·„ĹT Lđçîb.H@ÎNŕĺBŘS̉(¦âdq5;¤M׏eŘ~äN@őý"«ÖÇsö”÷š$>Ýí\oŘę8ŰÖ H¶ěo91{‹đľÜŔSšéNµ®­ąjšě”hľ›ˇÍ<zĆyÓ÷´@?í tUĚAA7GěţlĹG4D»¦ú­wĎމ¦Ł tşn™z!kŘr@c ꀲ{Šć x-ŠĎD—ŮÖó[G(?ۡRŇńʤŠAQu×áÓŮ‚ŤVvlôP*:qY/ žh< |ZCĘˆ"fČ„÷— ź4L{ Ň%Tu 3z˛\ßŘĄ‚|$QšŘnş°.2Ż ˇcŻúsŹGßECO…W�ÉVAÔŢ ôĂ‰Ö “‰Ë  äg#îp;o†TË!ăĹ5Ĺ›şYóu+Va˘*¨”p÷—Âř™U„Pô÷FÄ­x»Őť»Jó_±L �Ú@ob1đzፙ|X–ö}SĹÖĐbpNŐ¬vbߨ3hTK©´¨ ;í—‚=$ŇŞ°E6šíżn±¬+đ:™ň¤1Ú&ÎY¶(I˙ y 8śhUŠÚ)0aŢgJ FĂž¦ôr<ő,Eµ0¨ř1Lč#Ľ‚*ŞŽĐvnt¸é6&j €·Ś'E|ďěâůźč+Ę8&n�˛®xkR4ů#ĂÍÚBmp>|ŔP[Ú ¨»’~Yô ¤(Ů!gjń%»K÷3É®ČŘ`Ç+ň?q4šośĂŔ_Ň»}LžéűF9Łâ|9ć˛oROvŞ”ů]ľÄw>Ü©ďZ 6Ż^(zj ¦«®ŁťTť/qH]‡Ăď™2m`uź)î�>ĹŽÉXśăâĹxý×ĐBdŰ­§ÁĎťMÚ˝Ź“űZpZ5źF‘Q˛ăÚEnŔľ3V€ąLbÚ[˝“Ą“ÍĺĐś%ĎęK˛yć'Í}^53§÷Ż—f–‡Â:â'Đ_^‡˘ą\Y K˘U«<ÜUĽż.Nsßý1Űß©]†7ĎüËÖ0«ô…ˇ@63÷!>/DëĽü#‰­f·–uŐĚ[Żɑ€ ď/išşˇ9˝ A€Ż«ßMĆöŕ§ŕăÖ…™9“Čw”n&›9$/Ě7bh4“�7˝Aě^qÚDoa˙ŹŤQLaş^”pŞô_bĆbÔ�ŽÔú“kú¶b—7WÄ3?í„'¨ë…7í« »łwĺ/źšĺă0$ÂPLĎöö-äVo c>ßćÓń7QÁJ„tW˙áBc+Ô§:w ś q=”b/-ÄP€ ®›rüŮR’˛fŐwÚ• f(źÔ¤ťŐj1áĽC]Ś‘%§˛¦¸ěµ$ńÝÇ:Â3tćĺOggS�!«�����Ąßm ���˵hxÇmCamÚcob2¶Ś tJŚÎš•‰Q XO?ő' ŽŹÔH š˘2‚Ra5ćGbÖEP“|>Š˙°°ýë ÚH¶§i”§c>ÁäŞ9\*ůÂz¦Fř-D ?ËaĚ-ěĆ!robü«±ăkv¶¬Í<w.č@�ć.uQô­§üŘ#‡ł¨P˛$_* 6ńÁP1h!¨/Ł™F҉}PŰŕ{eV‰2űv·‘Ş[…€Ć€@źÍGůŁĽĆ ŐŚ?Κĺ|ŘvŃäŕ7Đ~·ô…];DʏŚ>ôaúÂčZďBT‘=a|úIţ3Ć5ôĘ+emV)�iĎ×#_Qź+†k•K•÷‹QO¦ąű–$¤"łK"˘Š“HÉ’UđĺU”ě>:ĄuĽ9PŘlNů«V:'V‘DŽÉŔ……»(a)N&ˇEż@xm{˛¦(€ŚzˇŰË‹ţŔ´D (4ž/]jfßŇVËyŁOHCoFŘlNö÷ôş°#걬V%wŇÚ4w@Ôęâz'BâŽöi©ő¤§ŢM”q3 %sräđŕd©4öŻbćÁŮřV°IŰ­¶·™GE¦”ţŘL‡ŻXA#‡ ă)&¸Ĺ‰#®#áOŘťÄWo™#µ^)U3ű$čî,hš˘Ú™éŕ"—YEšZĄ­s ˛Ó˘Ö7>3ň›¦©¸ÎířčŘz`tňqEۢ3Đ2|Ěü.Ks fŢ>45nŁAŹW– ţާĘ?ŕŐűŹşFŠ…ćă����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/covr-junk.m4a��������������������������������������������������������������0000664�0000000�0000000�00000011764�14447736377�0017472�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������ftypmp42����mp42isom��ąmdatŢ��libfaac 1.24��B�“ 2�G!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€��#moov���lmvhd����ŔôEŮÁLII�_���������������������������������������������@���������������������������������iods����€€€�O˙˙˙˙��ttrak���\tkhd���ŔôEŮÁLII�����������������������������������������������������@�������������mdia��� mdhd����ŔôEŮÁLII��¬D�~Ŕ�������!hdlr��������soun���������������Çminf���smhd�����������$dinf���dref���������� url �����‹stbl���gstsd����������Wmp4a���������������������¬D�����3esds����€€€"���€€€@���� č�� b€€€€€€��� stts����������ź��������Ŕ��”stsz����������� ������ ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ���(stsc�������������,��������������� stco���������� ��˝��I��Ő��� ctts����������������ź������ #udta�� meta�������!hdlr��������mdirappl�����������”ilst���˘----���mean����com.apple.iTunes���name����iTunNORM���jdata������� 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000��¦covr���_data�������‰PNG  ��� IHDR���������ýÔšs���IDATxśc|źĘŔŔŔŔÄŔŔŔŔŔ�� X«Űo����IEND®B`‚��/data��� ����˙Ř˙ŕ�JFIF��d�d��˙Ű�C�    "##! %*5-%'2( .?/279<<<$-BFA:F5;<9˙Ű�C  9& &99999999999999999999999999999999999999999999999999˙Ŕ���"�˙Ä�����������������˙Ä�����������������˙Ä���������������˙Ä�����������������˙Ú� ��?�Ť€¸˙Ů���name�����������#©ART���data�������Test Artist���!©too���data�������FAAC 1.24��Zfree������������taglib-1.13.1/tests/data/dsd_stereo.wv��������������������������������������������������������������0000664�0000000�0000000�00000146563�14447736377�0017670�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������wvpk|@���� �����"V���–o%ČÉhdff�#AFRM8�����'¶DSD FVER���������PROP�������JSND FS ��������+�CHNL������� �SLFTSRGTCMPR�������DSD not compressed�DSD �����'@e��* Îă�€€€€€��€€€€€�����ő˘ 0⨞NŰ4€\wg!v9n’xI´fSČ`ˇ±á/ě) żj[žŤ„$PlLĆw´I p sYĺ�ľ·r,˘ü莠Y¨3‚ĽíK ę˝ô1˙Ú56ŮĄZĎŞÜD8ž1�7wvń )FĆ-šVźc(NŞĽvG1_Ű˙» u>$’ľłG!ěU?ykđQ‡Ő-iĺÝ©‘)ĚjNW)-•Peč´šöü¤ŕž§ …:1ű đcVM’ĺ’˝Š>kbú ©j- ,Ëúüd‚ŮÇ'®$ŰYď©–7Ô<]ýâŘ›HýË„^S5véÜ˝�6Ţ:’ݢgś®«GőŢ:vĆQđđAg6-"@7îĹ’řáWĂLűYUr {Ř‹h<ĂćĽÁ˛§'zó× ŁČ¦xł4†¦ľ°¸ěY|Öřßôr¸|Rí<ó„3±$ă�<t…„ăÔî)Ţ.˘lŤ"j‘šŹZ˝rËýW!tęźçdLŽRőŮÄ_•wÝw—¸Ý¬{Ů[xí3 L,ńŚý¶%pĄ0ćy[ŹŇ–Úş7MĂĄRΞüŤ‡F�íč/…őWŰGcęyףD–\)Ů®7i]{Ą˛ůţÎ÷•{Q ŻJš< v‘Ű÷ÚQęĂqőhÓlöúŻ%V8ÎoxŇ&/UÄ»I¬Ďl|mß•ŠWŰF0Kt`rŔ,·™Öf:Qę@iŘŞX¸XhÚ‰sÓ›č-›­çŇŮ›t8šŞdĆonU‡ÂŚźŚž!Ëź˘âr ůw ˛Ű~¦ĺ9†/âŢ{ń[!ź†ŔÚĹgţ%e‰dÓXs¬±Ţ űGEÁŁăGR¦‰dśĂ%Ź‚sÓć•—ŹÍćŘ·‹Ź,ů§yÝZBY…"ËX=®[ŐśNŹzšŮŹ0×!^O˘ˇ‡gÔX»×í ú”¦ŁŹEX‚z(]ź&;euőťúŹź z"ŹŐ€ ~ů"ᔛ짞€Đ âŃ௛Pűa/fôIX�ÇŢ4ř’”Ë9őŹĺ'{ÜŐR‡@ańî ™‚Ł(«čĄŮĆĐôŕr„ô9ŐP ń‘űVUöó’8äÖćqł Čq+oÓ——”yüí©;<ÖC|“ŃvénŚÓéń¬_óŤ—ŮÚĎőKÚÍĎěě9ýÁ€›ËF¶ú5ŕ+|Ŕď­źď¸ăţä#9ş Ppň1ŞG3;Ĺěá.AD—P"!ŰţŠURđnîa9v®Ŕ�˘DĆó Ć9zĎńn„€XżóhÄ^ˇAIVń‹O"óăvCůtxO©>śöâ)8—DŁÖ¬ťíŘh§ç f.§´4L2ÄÉŠ©›ŕĂĽ“šé~ŽĚ4Q ‘&EŁ—Ľćn^©»žCKń5°ü‘ĚNŇĽ=OĎČUt¬§ÚógKŞľďî›Li¶–“ÓiTkPtv_MâŰÍđ3Š·Ń\đú^„O˛íóÜ{—ô;ŞËkn;)éĎĘ EÔŰ<)Tú¤]H8ý"Í0:[Ăśx%°Wě0/%ŰTvŮlčÜîŤ+.zţřG{lmÍńîđvr€N,Pű!—‰ą~>“Ä„ĺxßsFőt dűTĂČ´CDÍzLüM*«–‘=ŞhŮ?˙O–“użďĹmÎlDâg<âoľV'­˙ëW|, : źRČľdňúŃbű{pš8Uś¨LhônÖˇt¶"!Ć3©¬ě=7E~“ďăŠ6[7Qń¦e ćŻń<¬‘^GťčŔÖW$'1ŤH_*ŻwŘŹ©q&Oô~ÎC¶č›‚ÍL•“îáŇUw˘ĂşÉ}ţ†p•ÁC4žä•˛6´Ţ­Ő7aTB yg)—vš<ö>sÄéɰ¸5ş 5ż!Ú/łk$чŐn!o:é l‰ď -¨WÜĽIökŞ`´a0uĂ«`¶úÁ¦ Nę絟ĚÝžRőŽ|ĺ¤;ęŃ/­n%‹aÖřşÎyßbŁ®-Žś÷ßÓ¶UŰŃĘĽ˘}ÎRŽűÎ]5±É+ź ŐĄA™ĹP ‘·zş^ á8‘aŢ5ˇ§S7 e‚źÜI•W~k‚±2•_Ƶ…pÉťMӆŞ\ŰÂt¶ťwvOľŃŐ‘Ő/eć3WXJ«’Q¨sB˛fµj7!üßßčSúĆŚqiŚŞ¶Č“ c´ÇŠwžĐ–÷β€FYŁ»ď}žAzřCóOLGŢÁ¤3› ŞK LdÉ(bép"75ÜĘşh p¸[V)r,»Ë[yA"ây1'Ó›¦´Ž¦ňÔ»“ íN®4mwu ˘M!‚}ÜWÝŻÚ˘69fâ_CÇ}ŕf7®üK Đ•…ö\Đ=ýlła4Tj÷.Uq­:ĆzńţŃęܧą±ËQ¶Ďö 5ÚGř*#~ŮNeś:7qčÍQUăô‹PúţĆć!¸˘¤2tkÖ•Ťá2jÎ]ĺX#şçNâT$ŕ–ZD7f¨q�Ęý oˇfşü‘&&][ă˘ńÝöÄkz¬yÝp±—´ÂB•„Ŕ™HSńŹĘŞ©ŰHM­Ö¨jh crăL$Ú \0?˘7.Şř@Ů=Şhá<0_(ž|mđ‡T-üÍŽg ’$I8Ňŕ3zóÖŇÚKb OeMÝĄˇ)ŕZ[/ál…÷x?tAťĎvŔ—Ş<íhtQÔËŰ©0ďí(]Le´˝EđéĐMÍ•ő36‚ĐbéAĺŢ+r6€VyČVĆ Ý”âÝř6Đ8ośř=+-°­‘âçj;@g Đ›‹ă(˝–ęHOľ˝wăJEí ”!W·l©}¶1"§×·1t)ÎÄŁe]´Ř˝X•$*ˇŹ)!.GÖ0ůą(…¨NůŠŻ4\ů;˘’şLęIÔąy…Q­żz=Óˇž1¬Ńá©‘y#‡'%@VÍiˇčíĐ{”ŞŐŠňĄ5ë¬Č_[jRçó>w_÷¸­Ďz»âŚŔB¬á«ztßýVSxsÇGŮóĚobľ+7ŮĎ2C;�· ďÇSäv;eĘzđmĘ­Ű»ŻžT\˘âşĄ´ś”töfĐÄ6Ů ś#LĹ}1 y¸[šŁ:RHs3ű‡I˙ĘařÂÚŽG±T9ŕFHŰž\×CC=w–É« źCÎ;á˙Ëy8mŐł]]ř+"ž$th§»ÜKnédŽa<|DçůŚŹśRş˘ kUp×âµkb$Łţdĺű¸CO<R¨–óoçhŘ|'-É!n…GŮ”şIýăŤÁXV™l ă΀Š>Çyeőý2"+_;ľ !™˛ĺ>ZX ËqŢ|q«�›‹ăŚ&$­˛­N©Ĺpa´C$J23 zO˛±čŤ{eB./Đ˙Ŕ'9Ł şS´đ3”^XńD}ȧ՞‘mÂÖ‚·:ÚšĆe{@{Ż~„u#s ‰}Üî1ąOÓ“[lm4ÂÔdNŔ„µ;Ť´ë†ďíÁŚBŞŃđ°K ”\âU›kɲý&ľł- `¬śjČşb+ńe˘O%ők_Ç1„ú~l’R¨ť˛ËlßEHŢCÔ™őpo ‘™ 9ŃtćzžôNyĹ%©¶úsú˝ţ+ ‹^uîŕ›ŕcŤYŮř\Ě7 z >@´™W€ţ—`JĽŹĚGy‚�×ŘîÂüi^xą ?¬fžş(Zř#’éy@µžŇ?Ä/q#z¬ŇAäĹ©(Ń?őčKÂŽëSrŰ’!wsISŽPm^$ŇĘľD´ŐÔh›¶âŕ9e:1Kä=Ź[p06ô] ŠˇUđSĽ·ĄÝŕeűC†ő,([gTŕĎ—”§Ü±yĐ1sQ=dţş‰’Ái4é˛Ď–Đ[BW íŔC>˙FqÎĹU|Ë)sĄß?m(ČBÎ^łÚEÝ&›*’č»S8 ľ ŽÝń!đNWOŽVmŁ–ô î¨Ę-ây®ż´«ç¦Ł€ĽĄ©šVRÔs´+–’Ëä;R\8–q9ÇÖ…¸Q ÔV_#·é`č©*´h†Öl{cĐD[sńĚ‹Se M ' ’Íh¸#:¨Ý-ŇŔ©lÔ&ޱ襆@—ú_ľëiŘŕšš[eu) »9úśŰcüçBŠÚ§^b¨a6"˙Ő:uîÓ’łkHg“ Í8˛7ÁĺjrťĺÄ|äüI`ăçŤ%Qת&k "ž§¨çţEîř„üvń­˛“ŘŹ«Ţˇjßîř ÁRtöHlÚtĺ~}Şđ¶ł´śjŰś‚ŕôYqK~jPŞ7R Ľ·:sîq=¸S–ĹÔŁ[ÉŐ…)Áíe^É…Ĺă1oQÄĐ ăsÓŤ4;-! Ľ˛e$-5§×GÓĘ(eJůˇOwiNw*4FżUCş^‚ľVňN Ézîč٤Ś">Ś X>ş|ä/‹ž—xySyF•6ďólŁ‹a;·ÄŻŘŞéĐm🣞´·4}Z@/H ㉓“eWz˝O’ťxŢCŠĘc ;ŔgIż÷+"ŢÄh×ŔúŞlvëDLOÚÉ5†˙ĎĹăts$‘® «źńËÝ$6ž ¶)zCL@ß©€2SJÇô˙u…AhâĚîŤŇŠžU5đ…*ýKśDwl€uć^ŰbŚÝ7ŢsřÉţVĐkP+u**bP(w˛ßfç©G?­·şeăĂĆ•&Fű mg߻ǷDŠš±&ŕĐÁ›¶9ýyĄ÷Ú¸śMP6É˝ěöt@đ:¤E‚ňß‚Š}ľbŘĘ—lß­żęô—ČÁ}âđÜ>Ҕ۷¨F47tŞUŕŮn!WŰň˙Kąi¦0Ű”·a™čk›µQTłĄ|¶`¦a® ő}oÁ¸˝qr/ü_gżW8đ°Gsh˘,Ćşß—“ŠB-Xŕs˘ť8·nĽÍriʸ•<o°©6 ‰ř„)óvg4ż·Sy“‘ý�ß< 5ĺ`Ţ|{ć«óikšÄÜT2™»$‘ş·LË˛í ›µCĆĽµz)ŕßhAáśšBˇóu9«Ł€›ó>ýłVlZ5K kĄt¦+=\…oCĚ28ţ™Ú2ŽAsúňMmjĹ–u•ůV@$,24Méá’¤Uö7ŘGźµđ2)€őË †LHjŕŹh9>ďŹ+1ľ üśgÔâ´W[ŰV3ŰUN‚šĄ‚@QÎĂpÇÜ ˙EłůaµĎł#ń+>"¤&y±™>¸9ô°jĎ~®!;:Ňrăe”ţ µ´C|ô×^ĚVg¬ť@§żą­BĎ(Ł…™ŕu$k‹ş­‘ođ zpa·ĺ4ýËe=UQfőĎ4Am‚0Í^<‰ś˙Ő�ęű<Pú˝ä!úó?ÜsçwyÂći$YQŢóŕvb >b˝-xRł ± ’€:ÁŠđ˙!ʉăZ›´pszɬ”ЎĐřČk©č‹¦˙÷ Ë:çĂŮ!_ňKö›17¦—”bţs»ĽŇËňčöËQČ>ő†‹vß*kż;)\sľG«3ü ż^Ôa¬Í®.Â+r·8ž“´PlŤ ™"ú6G¸‚Ł~ë ÖJ"ôaWPQD'¤"WAZ–7GÚÍÓćÝ Ř&Ŕ§glSućWń§ś#ďkń> $Ś‹Tέ0¤í‡cä<öďsěěL´+A•Ö«5řąn~/ŘP9&;Ý›˙l ?oá&ěŰ/@ĹJq]˛a[j«dŻ/ą{ě†ö!,§©‘ŤI‘!io}„‘ÎŰD#Šč’mz:qÜ.Z.˙LÂOż`#-# âß  Ćűj¶üČXš±”#Ék(qĘŘńUg§G3Ë»wLMRO'éő‰|Ž|Ä"˝| ?:!�iŠ”ÝVúńµłďĂëX®‘Îe“Çü‰šHŕRŮÝ ;ż9µ/í»IŠČSg;”9-®Ł2ş?ţYtˇ÷±˘ÖtĐäfd…}ÔŹ†Ë—SFZ)Ú1Ż@á[đŃÝ·ş·E l2çńĚĹ´gAŁčdÜźC�˛sç©U_Âzú)}Iž8?Ňä•W ö/ŕÎÇ5Ç7TVŘĂľq‡1Ú­¶>ąPÝßQ×ÝŐDŮ}i[oTŔiü˛Kčý#…młu˙Ë÷ąí‹‘Ć®O}TV–˝ćÓ’Ę[ ¦şŘ”ú©…\ř Fqá€i7Ľăň·­mřňřö¦cÂm şÚŞ(C¤Ż}<óťÜ=}d<ţ#ą7?…8p7—‘t±Ş¸kż—oçłBś—š¦}‘!'-F´Pއ輕#ŻÓój‘—Ŕ2ÉÎ[[u€ľ{Ňgą+ + —˙ŘÚmI6ٞ /9/\Ü© żłˇZ„ÜLźćÁ`k±O›ĆAtĐÝŢjŘÓ Î/ÉRůt`fŘQłŞ•đlúFT”ÖžëÖByČăÖ_|đľűoDžţ,ęݎ⾇ţ©€Čny¸]u¦ '¸ćŔ˘Ă ĺ=qcY †Ă�¸O 9ľ~˙ľNîŞtÖ@›KĄ"Łu>Í Âś±Ń˘ {·2ŢëóaúDŤółÄýÂăąţ\ŐöäuŘ˘Ň ›F"J‹Bˇ3ËďÚ‰Vgvě˙%ŐyŃLf“Š6¸A E ¨Śą,8ČŽŕ‘‚Ë__‰5>Ű/ÔľăĐŻ!I˙¸ŚD#ä’Ĺ 0GŘÉz[Čî&IăŽ ŠžÜÍbŇĆŞ¨ž~̰ůUt;ç*I†6Śî4]­dĹ.aGäE5ýtOgÓgÜÓ>Ř~ôç<‹/€K:VŐwh~jE ©˘řV©%ń[ÇAµŕf4z+=R ĆţWÔ Ékä]"¨łŚßKŕx&ȉfűS p·S­‡"[xŐŹĐXĚëů4x‰ `]ź?>şś&rQ¬ßžSnĽş(|°ÉŚű?^ýUöb§Ô,«ö¬|2_ŠB ęĺˇňC˛żŘlľ ŐĎžő xLĹÓ9˙׹ćşÉ…@K?µć‰í'€¶Kłqě˛Ů ;üxúÁüÝÓRF)ˇ#=ś­í˙“tIO ·Ś/Ŕ r%°ĘS”ˇon6¦@C6ŹŤŕň˘eA ]׉'ĆôŁ~Ě:×—KX:HεŚ÷ĐÓ¸çFýöŞHĘ©ň"xóNš‡w!~řx€°ĺpMďcŮ©ĽtŃđr'“mVčŐÜÔ·;#µÚMP/Ĺ8—Ć…Iđé7{FX¶0ŽüóëěkřSŔ#dÉĺőí6ĄN±Ą :Ró~'6!/Á˙pwÁqp°EEoçŇQJmD˛"1mŻŔŚ`65˛í8öËPÚt�°$jŇí•Wí)q@u—@bJŠř߇˛Ş˛3GąĎŚŔ©WµżĆňµą†’‹ ňŢ%éíß·zzî :†ÓŇĘC°Üż˛«v)‚ĹÓ—ˇkŢ”ś?‘ł™4Ç‘ůÝűhGB  8K˝Ťs SÁ÷%E˘«cHŮk¶Ĺęۡučő“V‡źp H/aľőWUv‡Şú�Ű?đĺ¦<›&żmşÍÎСľ\+u˛(ß‹Ă;ď.«:•¤]Ź"‹ :Ď٬ ů|—TZře®Á<ąT¬’ý“ , ž#;1-Ĺ‹W‰1fÝĽŹ„uUĎ0ű㸠˝OĐ&üWRF‡5đťIýŘôő¤Ôħô"mň†~ůŃÝ«öíP s,Ý]Ѳ>c>�WWK¦—z‘ťy?Đ_»*±»­ĐKnI›ŻD{Ő(fóJQ}ĺD°O…씬üőŞCjüTŐ˘Ůl¸j1ńl«Cç{té¶ÇŐßî­Ţ.;›\{3PD9íţĄÖ¸čę>˝rvE˘okfň$Łźĺ@Äô"Ĺ@j"ńâ&IRůdËr'ĽëE é“DđRŕč•řµŕ-č#ar&ž9ź™qźZ˙±*ŘÁŠ„çlNďµĎĺYśIv]‚Ş® p€_Ŕ¶Tßëřśčů@~4Qˇţźť�łç3ŚEăÜ‚.=Î˙^óÄYÝ2Ő#ć0źöÓcr ŐĘč3_Ő”éS/hŮ÷ä¸(>ęDȲz±¶ µ° Y|D]J*T%E¶¤ÍHĄŃŔ”` I»xht0ý+\0mJĘČ XX“h¶ó“6¶Á®9ťڰŽ\ö&ąÄžG}ŻŃÂ0çMVý’äő¤l?¬íîĄpáű3×Qę,_ŮJßÔˇÖi˛¦PťmŤ˝GOş…¤Ůo™Qşj—�ýHńŰŚ7­™˝HŚMŁ]�çĎň#¦$¦bSÚsä>çOŢ-qŞAŰ|4}@Nę4>őeĆä‚ {qCÄb‘ގšďpXú°§gŕO×^hĐ-*!<O*ž×Y_ţ€“ZÝV?żwYÉů¸4NçŁ/óâ;ˇ2Žúˇ<Ců¸ńß‘źű§ŮS`Y$d˝f žŠ9P9ÚSě~|ŮCN6Ú­ť[Bř·Ť;]çUŹ"¸iýşĘëq*, ű‘‘WîĎ`ĆE¨�?iBÎj`‘˛§óş•L‰4™MÍ•C5“nÓ•T™MÎŮFŠŃ(_üËbɇÎ[ÓIZ×Ő*Sp¨řčŁáĐůŐsł(<śťË}#ËCvO5Kú. I1Tĺ\şSîÓáŕŰż?r:Ń-©sňČÜ–âJż÷Ú_`¨¶śĘ¬N Ŕ®»?±Ąl[Ba›ŕŞĐň-n®oą‘‘Ă$°:6ŽyÔiş€}ĐiHWŞX6ţ¸ľÚę^1:Ć%ˇĂŁ˝ eÄKł„ŽBľÂ%e\[jŰZśŃőÜü·mη?hłYh!~Ź=S?č-˛bsńwwŠ O/c3\š„Ou(ŇşžqPŃ®g•đ©îŹ�p˝¬źPgçmż{źńí—/ţnÜŻ>Äę(BűŮv0NŠ.[iíëŔ™ ĆŔĹ2ŢŽm˙XĐIÄ&›5‹ÍüśłŇWáB (&McŔ-žüš)u9t€Ň(RDÜGäÝdlů8…Śif8“ÔŞřX8NÍŮDśO.Q°`Ʋ4L릥Rçaęhü/qüán›Lz…J娮éßc0źÉKëh‰JěĂŕŔe9P ĚşÖţŽĽ8Ţ#7R RÂÚ9~ĺ•ďK*6ô©X) ˛ˇ`ť`ď^"pĘ#ެĐE¤'d«ś4¶l{Hř€ż’ëuľÔĂEń¬Žad J…^ŕĎ(hHă¤ČrG’,§¸±É?K)Kě)ř:IˇaAÁQ“Â4ćĹăyţüýť š4‹K5śÂzęĆ Äô“9Ô%#%DÎŰ·űťňš3ćsëź]ź€mn†’śÇbçyĂĂ‚ń2śôé—šu0`/rr¦€„?Ź�®äî¸g•>‹ä¦"™ŐŚŤx<lRÔTkăźĆI´f;íĄAş{f—8+uQ¶îŮ ›ŹîÇż "Ä8ˇv™BhžŻč««&tŐ6\6A á*ŮĂe@˘YLwđÉăÔĄ~jcWLečQéf.ť‹VŮ!&ă)çŃ«ťo<ÁŐL —Xú{¬´:ŔŹ He čvZN@XPuÔWíPnYĽ]‘ÁźzRá‘H%˙|NâŰąž|qŔbţ€KGMĂ‚đ3‡ş-ÖűO:Ô=hűĄ˛S z’â{óńôŃ´Dä%DךZ¬Ä"íN«b.3@‚ßWäĽ`?ŢŢ‘) ·W´€˛P”¶pY§Žžlóš®Đ5,¬×?¨řę3;ËiGźÉđŐŻ|~I>ŽŹ ]°5ŇqC/¶¸·´q8%ą�.C®3yÚBG–0Đ5L!QĹŠj1U–Ęj;P:‘_—^[ć~µvďşx|‚H÷oęÍ ł©}Ôͧ”7í›!<Á«°®AŐ̲€ś•!α3 ­ţŻąÉŐR'd8© U0¬őűéęhHAM‘äaNÖ9ĺ.—Ł/©ÝŤcă±î…ĺÉŁ2Bô›Śv"‹B“•»4ŠĂu»/ă"pE™ąűÎ//ôĆA5Ý»ĹB ‰ŹqčZŐěÄPaÁ†"Ť«.iŃ˝Z˝Î[Ż…pTŕµGłlv•iş[ ̱¨îŽ©H5żbqwvŽăxŐ`yĆDâŤFŠ}yĚJgĺ7Ą‡�q–ôĎpX‡Íó g%ÂÜ_W ńĘK1ź¶ÖG5?—B¸˝;ÄŮ×Aú±:sÇÉJRgĹż'ŞVF‚’űő‚�ŁúH<eÔ›ůÔu 4;ćĽzÎzŚENŤÇÚ ©ŘK/ 'G!đ”¸$çśß]"#mł.ĺ5°ĎOáL#…ĂÉö˘ĽńÓś“鲖ľDjÖ4˙kR °6Ţč2ď13c´]ůj±,ŞČ9âňT†JŇ€Ęnś‰Ĺ›KŐ ™NŞ"¨  †Uśł0Ą„Sž‡Ös,Ë:ßb)|ŽIsu…,¬źˇł˛1ËĐÂtŤý4[tÁápŤâ5@9ŚcÔ­’x-}5ŠÁeľËÄâşöĆM.4őËŹ…IíKŘňť '9˝î•Uŕ¸Ô9Ž#7ýżăîń™¤Ŕl Ň MiDrĎMŕ ą¤ü}#f�·?ŞÝҲĚ…¶©AĺËä”űˇöśĺ ´ŻZqĎrÖiBpň˘P­9Ť|䞎UŃ´§h{N.ć\YÁOşvď:d1˛âJż#ůŇQsĚ=ĺ,wۉůiĚ׺Khĺéł7 W$±u>Yh¤Ýü o~ąßbÖy4¬}Öë¬NU˝ÔÄSBÜ­4%^2]n=ĂŐ"H5Ř~řřč35ˇ+¤ľV|H«Ĺ >ŔJî%~p^USĚw´˛Zgś˙’m? Wđ=k]ą–)‹[K´ďmb8Ŕn2ýJÓŰÓc˛áśZ2ÜFTžź)ńd5i¦YĂś˛Ě†írG“Ťvđ58?€w§p f‚%orŢ­nńÇŔ­p&vÉť"–ŁK˘iô4""ÝŹ*‘ub“o;1ő/ľr° NÓś»ËfąýqęŽ>1'Ěm„ŢB­O„0—‰Žć1á¸â {Ěă{#Jiµ›…Áu’6U¨“á“­Ţr:\=®’qÚˇ"ŢGD�˝fpÍŁëq«ţ#=«0ĐćU+¦eî woóź­QW>ňëNî pé › Őť^”Ó~©2勎vRÇiŞŚ,‹Š™•ýľÜ&¸ŃŢD>ÔăJ c=`<µäy=˙‹R6BűŠžŹ 8ű˘MŃ á ¨Úźü„\ň_±ď/4îDdN#ĄüĄß�dţŰ'öK©)\ŽM…¬ňĽ„.ýĎ̲€`ÖRµ!9DŻän˛PËÓě^jL*3<áKYňćčă—sá‚nĽĐüV#Sâ!nÔąlŕ”*ěÉź7V®”IĚ_w%®{LŻł’­R˝IŻ‹&ĎŻ+JĹW´b-ŃW-ÁFšv&Łmľú,ó�ÍA0¨ţ8ß';ç˛cRČ•o˛_‡?,Á3 v1˘°€gh9Đ$ţó÷µ6©T©‚0»)hźŃ)q[.=Ńşz\Ú">oDř„I(ăˇh  Cj E«žź{8ąçĆŠî»Xß»nÖhí±-<ă®%KÇ´šÁN[oZq¸ćňY˘VpŮó8©&g7Ýu€˝$ ÇAâôtÂT#ÇÚ0›ůéZÇ~ÄZG7c«{Ű6D2 Zg¨qßš1K=mXŠĂ{ ?·ZKřůr.AeďGÝşđźwý ľ@vŻĐ÷yäh©R¤_˝q…šZ%Ó ™kd˙@ú© ««¶ /9ŁŞźőś?¦×ę¶ŻčdŐŕIŇ&»9,BµDă¸WČ=’ ou#ȇ©đ†küţ `śđŠçź1<»VźßÄ!Ć˛Ń’Ş¶50€nëˇňĂ—…/č‘ĂkĚRQľCV3ĎŐLOÄ´”ÖADU”?ô.ĂŹSäů˛€ař U¸iĆk«ëfd=%4áŃ5ń~h1×s椲&â2lŐ­ćtaD†{ËW¨ßuâ­˘pÔŐ¸š˛Ge'‡¦ěĐ~rjłăIüÓÇweŔťD¬ë[1hĘŞ#óW»,źhMś�U&r1ę2W,LÎ˙qۤŢPň·x»7ÇšP¶ĹŞg¸m¤ůô:1)v0̱IcXW3Ť¦ŕ~” ×@Yţ›)ő .S jËCc”ÇÁz’Bˇ-|GCâ"Ł/ö2’›ÂÉ°ŚŚľ|?gç¦BMžاŐ˙»‹˛ţůć~ěo|$…�ÜÁËÖ¤đ‘B/H(4Š\wPM…|X…€^ŔHÇšQ»·Lŕ"µ aY8¶bŘwĐýüćëŰ®©Z(Kj˶¶›Î„%珆Ä_ćžž‰–ĽcWZxII‚ěRËČž°+AVY~ĘwÂzâüíĺPDŞĎuý¸čżW¶tGţř בJŕÄ«Y –)zč·¬¸OUĎ´:˝Ű˛ÚtiĆ…­e„“µŠĐŁ„bůą…ő1?ŐŇ´çż]xÓbmńtéôPnűI<Om*ŃgŃat<„ :±–4ܡ™;¨a*jB´Ľź:ťX-çö)lA 8<úN ….B˝+Žň*çT˝ÁEÖÓ]âkçŢŽDD@J'Ű–‘0Ô›z~äĽĐHK©;r„ÖJ1˘ůeđô@Î-�«F™UD-€T–Á&Jň5úKK“ťí-*jÚBĂŮrOÜĹú8ý(IO’÷ˇô Đń1cĆŮ‘üEÂ\,(›ń†[ÝľŕYx(|€ô`2·#•FwK(ůĎ!Ą]%ľ“H$.ˇňŽ9ű˙Ü–ę#Ţ:¦3j%Ş{ż"Q”"\c ÷­>EV.WL'KB,ź—5¸2Ü“ŠóTK$¤…,Ä5ĐǬ3/tNůöÎUűśW(kąR)[)Ŕż¦IĺPVÄ0_k8X6JJą Ë×*ÍZav˛q °ÇŽĆŰB‚YĹiŇP©4Ó“cGŃÍżćň&Úđd:űdx呣‹íż¶<آ2Ľjl#öň=;ŻHďq˝`aIĹ6ÜäTE>JMŤxĎ”#¤g˛ Î \řVbŔkÍľÉIą× NChoŐ-Ú^ÖŢł€ą±÷ŠŚ}7˘_ĤUĐŞFD+yδ�ňůlŞ9Ţľ2Ćď8vž2 ŇKäG„›zA"ÄŽ YeâV,!˘r.“§°&\pśĺ·lëA–ż'Í6yC=‡Xž—ÍĹŻeŘ^¦áüýUW(Ů0m4ďî¨ ¸”/(T mť©8…wćs&>“NzflÖaSS‘o‰]Ő¬‰™™]”Ëh˛lďťÝ8Ö¨B<Đđe­|ý&×%’V8ŚH‹ľŃ®,ŞęĂ€TµŤÜ(Ęr25ĘWŽ>ĺňt\í5ť›0řńÖł]qśĘł2ý#HIi`ÂjőR6Ň”…đK˛ P1 ‡»ă&2íę:_ ć~›çż,č˘Ü’WŃĎ€°BŻ«˙Żě Şúä÷-ÜŔ5NjŃ M¶n–ˇ-+$Ú/eÄ+0ĂűLYˇIËeĺđ®ŕ<«4ë-^Úş®oÂśÚŮoN‹Bá}văŠÝEgŘÔFy3hĄÓ(p¤řŮDź3膍GZo0DÄFíçM]fViŐS¨ 5€UÝĎŤŔj¶ČžN#ß—ĂEuľĽŁ‘uo‡cî"›"âü­-M/ă}jŠܵoV¬?ˡŃ|­ŠŮF7sFDÂ, öRD¶|Vâäć1WjŞřĚÉ< ÇrW80ß“‚qŇ©$˝»ë˛Á~†ŹĆŻÓĂT=O[®:»âĎhfxě§±#®™ ŚŠw©µ«M° żý˘ěݤ˛őő:§Í ř¦Öę´â-ĐűqKú…X˙[ÓúLw3Ú˘@X­ůšó™[ÚÖh2ň¦«tęŃł ¸/Qĺ¦xĆEš~‚GÎ~fp|“Qm‚Uż‚Á\:ŕŢ�ÚD űŘIž~8Ţ„SňĄS° ěQf}ö*5ŢRÝoXŢ@’:BĺţňŁ«-Ú) =ó°$Łćß>Ůç%1g†śˇ7­oĂéĎ@ŹŮ}ÜÇT_új5‡´KĐ‘U l€*cŚc'R �…T羥^^dóČ«~BꙤĐö´r80M™®ičŇâʵCÁ™ç3Y¬xP].GË<ga·â× mâ,Î9{Ö»šCQ>D57źdb­¬ć»¶ ‘5:r!öŞĺáÔ$"óžQäĽĚ«˛u®©Úú˙ ¸iЧŃ]őäßV;söŮ>‡ŻđďĎ$ßÖćx‘PŘkHŔš$čäËA”>Ś`{öO¨ÉĘŤ)ŕŐôč‘6L—Öő|tDŁČ»y\ŇôŘ!3l:ą»ľ•ůHQ?ôŹ‰Ę Ď‡ĹŚ€˛B5z¦!á>�‚)@];M8– !=NČ6O1kŻÉC„Żý†ŚăŚN÷–pşń’ëîĽ4>qr7H®ö„~Ťř>)aÇ) ±Ř•¸äĽŁ‘¨ >!ŕÓÁ()Ţ`…DÎZy6ž…}5Żýˇš‘ń–˝Zűu~u”= ¬4ëí Ӥʶ,ńSP¤j*;ÚSĂĽźPN9H›`aŽ×’ěUs¤ä:&$†ŃÓ˛şCRÜş·çßľžĽGvS@ž×Š—÷šL*zÜśjIyŐňxűnĂLq8©lÎ÷!o§łű»=xÂĆ6&Nqfxâ˛ţÝĽŕTÉXčŐŃ~Ϧ…ŞY‰§¨H`s<őyäío[^Ľ$ŤmÓşŞR.:ŃUCJĆč{íX^ćpţÔŢ…Rňš?<ch‘űťOů čVâZZ4ô2ş*"¤2¨$µ)7Î͆ýŤĐŐĂVőŇíđß«hfů¦!—#q‡Âw;Řď…µ[Ŭçkń¨4ú!n˙[=‰Ősx<˛ň„ˇ5WłÂ Ť ‰c7 2Ľ¸OĎ/apŇźY"š+ŁL/^Őč‘1čű…gżŰbŘ3şTNÉŁeI°Đ( cúŠj|ô˙3‘»ßjĚ|XşSrrFâą­[<C·üé--3 Ĺ[xJŘŐ*VŇmfĺTËÁšú×Lu—®¬í)H3;FJĺěO[”ÚzÔ«’ť€íáhoÄ˝ßpfŔ—Đ^©W>[Ňń˛ĹĘ´ŹťV˙'…V:x1Ďkţ© Ëë@ŐC�e1Çč4n㡅¦â;krf±Q@ÁÁHD)(4ľjš(tn†ÚŚÓ,Woµč)'ý´Şńż0ŞĂeTף°Ďđ1ˇ° Š#LąćĎ ĎëfĶđ®*î€ěPÜĘĄÁWĹ0Â$nőV‘|!ě›XbD\Ń'3Pjާ’öx 1)!Pg±^"ć°Ý$N9ŮY¦˙eÜŇ˙¤3&{fFć¶á)u–)Ö~ow˙× 5‚ž€ÚgŰp*„.ks+ĎnĹj!éO•x_ SÍí–l¸Oůů4ě3çE3"ۉaű'‰oď˛$Î?±ż‚勦ś6LEt.ÁăÂJ¤9š)Šçľň_ykˇđ#~¤UÍąŻ'.Ż»'@á$>H# Dť±,˛$¬ľËăéí§H÷‹ć•;ţîÓ8ŐĂz˙ËŤPciA±™ieg(jR×1a­O“§ÉM Ő®X$᪣'NO\*ŕĹŁE× }[PÜ·¶Őů—Ęχk0kBŐÄŃŇďÁ¦;­ę)ýśžś4pŞ×÷Q7r"Ń%˙PßB»ds‚ŘhAŢ+ I'ľf0ĺ8RÚ kÜČĺ3i/KEp6x÷ż)ü›B;OŞÍś9[źĹÍ#‰_–‚ş_ŮhĽ1?’Čôýĺe•>ŢYh,©ŠcTÂĽxËUÚŔV ¸d«´9†Ô‹üufč;-ĂÍ!K÷Ę ' @eAŽ%*ކźôs˘>˝ Ď?3~üyÓu@ ůäř˝wş%Ţ.Ňř>S+‰¶vcËgä«xaµC©ÎŹáŕůÁŹýë=‹‰ŐAqűÔŤĚ®~iw>¨Đ ·KF@˛űtŕv¸…Ę"íbV·™®ôďĹhđX#Ž(ŔAǡîB}ÓýÝXŘđ6ŃE¤Pâi¦|KxľîŹU“Nh663Ýk €żC'”µsŐ‹Vť?€KTYÓĎ 1%ĽMfŇË4«­óMŚşeNHefţböÁÚC€DtçíĚĐfă|�çL [„Łřm8ťă¨Á6mZ*ËŠö˙=TEčô…vS„Ż5ä/ŽQC¶QóÝmŰŐs5˙—UPµż­Âg0#·!ă»á•˙™-‹ó»Řq­h|'­n>dx˛ţ ’Q%ÔMJ2 ž6 ĚžM¦łBRĄ{ŞjĆ8âr›*Ů,­ܶ¦¦Ýę/ß_’›ÔxůS ń{x۵{)q˘:Q­€Ě™ťL^9š¨.›É, g˝+v§{í€&ťsúşÄË�<·5ŕ¦Ć«ÎLžŞÇŐ5~5 C}YŕbŤÎĘlŹe0÷ŇćF(©@G_D]0FËó‡©ęß)hZ(€Ę9)‚=oąž‰}[ü�Ě:Їh3 úFčhť´'çć÷AË_3Hß Ń܇•TTR4Ź˝*ÔO,^šăm¦ +Ë‘{Ů,T2íĂIŤł–íóVgůîą;®Ç·]ÚŸä„gŻćŇ?a†3銇óx7ŞZ{ü„Üc¶şßČĐ÷UŞ:HŽĆŮ ÔVŇF˧չj•’(É%ĐjŇ_[Ý ° ża„OÂŽH©éÉ× XÝě[qń{+ŠBGg�”ÎýűłÍ·Ë yi›¶ßBÓw˛z±ŻD6 ‘MÇÚ4¶W1Ýnbć@šUÓLW® ď7Á^›»&SwßäĐGOJ¤˙g©ó:˝%§+–Őź3ĺ˝[”»I9óžX\f˘]2¦/Ł‚j+¬w­őO!x<fĄÝńM6Ă$Ó´^0ľz÷ kÔ§>Ż“Ró´{agŮuÜ7Ű뉬Ďô[a!Ëg¦RÚŐ^Ń}ŁC‚QZP˝}䟲â™âź'ŔF\٬�řR8]|"_Bg‰ó]: ¨Ł8ÎĺµYN`ÝKU´â6ˇDf ŮtJ6WŚL?$F˙3zů~ͧ5h/z›Śçt— zJjSú·R…~ŠÝ…(±żEomâ€Ę·üłc¦‡ë5 Nęč HâăJóy˙ÝŔ2‰¶f>…t9]€ ş`łökŻ´b<Áĺ[ Ňř  ő±Nô\f ŠÎ¶ú{:˛»ţmÚdá:š®ţ´ő÷„uűN4ť—ś`ŤńÓ3Ę]Ň(W©şÍş°ž]đ€1‡(™CoáˇÍúlň=ćťPŘß}‰ĹgóĎ\mŹ7OĂ}äžÚ¸2ĆµŃ ± yo*ęŚ7oăîYú+[Bż_ťoźV L…Ű›±{{ˇć™†e¬‹‡Uő¤Š‚z`TëúÇ(·ŰÝőČ›Ícśş2übćsë·Ô™ý<śü&b·äĄÂ˙.KˇëśXěFĬÜyĐŚş% IkěČ*si we¸Č‘}3Ž^Ný1Äś'ĆŔZhű——°[J=5f×ýŁń+küč ÉęgĎ “míć‹k˛ć'™;ú˛KcîacžhŹAŃ8Ő¨Vş¦«m㻵—|3q‹[×FďţŻŔś,¦ŻË{łLŻNH”Ěu)»ŰV¶µ—L÷&ęŁü˛x©ę# yć^TßX¦GE• Ř:‹ŇÇ`°o “Unp”Óň/÷ˇÂçĚ· Wü’¬e=Ŕů†Â÷5kŃéć4s/RRSţ¶#tQ7Ţ śŢĐąňţ|bOeˇŁ¶ĐĽ!h´)üiŞË–‘Ęß×sę•qG“0—ÖšÖ«Ô=śşť‘ŤĎr…/—°jŮtýlb"đĘF°W^™.ďőÖ -áN‡Ń¸8€nŮš7‚‡<@“o7jźšÎXĺČיűl.Đ|¬í%Ć»aˇ¤–ά-bŘÚĽžý‘ěďŹBÂ1evF˘ĘŕĚw]ć'ޱrĐaÎ’3•ëU0!ŇwóhPĆŁÚ±e~Ó‹q.f8"çKîOq)ý3 `µ¦I}śĆZ]$ËĘnas·Ú«˛TLýLŻě’Ąd°:{¤SoYg‚Ä2Ň‹Hz\'n`×D!ą)=?é’݌浌y5Cîą:ę2Ĺ N<›÷W†Ŕ={9cU™nC@· 6Uí‰î®=ĘéO†;Đ…ëŐiÇÚŠÔ·ŚŚÍ>ކ›â[Ýú-‘ä¤wF [g ¦2ŽâAxČQ•,hÂ~™'őÄ%ĘŤ¦Ő g]ť,Bą‘Ŕě?;C©żXĄf úÔ7‹tţŞcFf¦vě‹÷eGŁ?Ů� ýŐvł«_7Oů®ś[ouDؤďŔ†\cWŠnáÉż<é jĹ­Ť;ů›ŇĘěłĹFPX !ąďýt]0Ö ¸qů‘¦ŕŚ|ĽsIe{źéˇň‡ŮZ mFáú0Î $¸�á#pĽżržROů„MJ‰Ţb2ľÇDý ?‘»ŹĺÔqv Ž0}Ů˙ݡşź9ł~›·BÄ|ż_Ôá ]ÔŰ׼ű h—ĘĺÔ/ÂáM“Ţ Ĺť™Č(ş—Cô~·>™öý«;Ö˙đĄ_Fwü\şdŁűiÜşŇ6CMg٬ˇ˛´DZW櫇]ô›aěČŮ[âÎS6äť.óçÂ=ňÉqĄ±č(e;$üÍ™‹7E±*Y5ŘŽ6J#Ĺ“ Eu§/|ŐŹ‹|ďV^ş`uĽÜ}tËZŠđܬ\„U»M š+±{­?Vű˙i‰™BĽWEŘq𲚧<”Dó¸;ůjBâe6…ɦ¤ŮJ[˛“©é?7ű`_QÂćFĽX´*¸ÓţuđôĺéN7~`’{łČ®t7tümŽ'Ę‘˙/Đpâ]óő#Šôv”î7%č� ęŔş…‹|Ń|`#ůP=Ů˝T˝ Ţńťç´ýµ–]&sÓbÉš®‡E`»Mf3ßáW^F W`¸ňNE[pŻ\°ć=I¤Ř8­^š>  ßJ?ť` ~)iPŹ(™X¬\ˇčYá˝XLWÚŇĘÍ›ŰĂ-ë&ĂÇĘ/,»Eß’—ŔĆńd#(´Ń'^\!ŚĂ“‰Ň %(ŃŇŮ®sX˙h‚’áŘbyv«˘PĐ€Ó«€x&”I{Q[ cvp‚Ě˝Sű¦é‘×ř( *ŁÂ˙§ŕ/ÉBÇĎ톧ŢŃľ«ß§áëK˘˙˝šĺu)ďxîŠúŚÉÖ„©XT:n÷˘¨Jüő?Ţň‡đ DĽďEdew.÷§Ç dL‰GVč´)W޵•XŘżoŠ=˘ŻTĄň%”=ź\á¨#ŃĆĺëĹâ|ć †Ĺ61~Ĺ2ňůŹE1a[H›eăBTŘiâ…Đ‹Âö;4‚uBÝ܉“cźívŮÍ–*´ŻHr9×R–†+„/g”÷DšT÷1ń˙óĂÚŐ7(›µ*ʱş…ÜL?®Ý˘DřßĘ‹dVRńÝC͢¤”śy 6Š7Ďji;]Qúˇ3~ÝZ—C ť9ž ʉIĹZWJŞß@‚ĆćrŘSq• ˝˙gą¤lo©!&Ń)ÖßybfŹ÷Ëß Ą3ŃŠ‡ uËä»hšBÔ¨^�1ˉžÁ0LÎ;ĆnÓŐ…ýŔŇ› |îç«?–Ăá’¤ČĎR1˛Ňe˛SJ8#j^!"µÇ”i6' OLTMĂá&D˘Ęăχ^_ţ2KGä•!ťú  óxDŚfÓŚ»§¶B÷Ő뱸¶ÄiĆŘ(,f|ŞżţÄqdŘĺ|˛[ř]EdXͬ”ěĐĘÚ#xÇ7­Ü:>â:÷±˘„9ĄŃ_ˇgL¨lä—±;5tňnť‚ĹPʤéÝdsăökţ†ÄqáFâqČ̢ŕř×Ów˛ç˝2ň-7l2ÁN–2Šî-ĂsĹ*Dńţ™fĽÜ „¤D4á‹aY ˝Ž SDGh°ŇĂ­Ýü§€ŕşŞĂ&€"¸†ĂëÄíÓ#ŃüůϮ۹\ëâŰתufŁp;ö\sq‹ăLúÇ Ď›Áăi_"ßş¦#0&¶öD…_M'´=~…Ě˝Ě|CS…´­JýiĘO Ęó…öëÝ:ęĽń�vAéř4z~ß˝´yq­+-ME˝ŐŹ‚ňĚxČwżŹ·T­ 2˝„ĘU0ô.Ôů%đuáJÄŰ(*5FÍ3˙!-JęRM,żSŘ tܵź;0+«ý’×W˙żnRő?J7 Y <˛·z>÷?–Îęcű— _~XX Ç™Xô4’Ż2›=ĹŻrr+±ţ '71qőíůד֔ŞĹ$ţGXćŘx|”SÎm!í|»Ą=šcѩÛ¦¬at‚7RIŘ^<Kŕw‰{kk�áĎđIµQŞŞď—~ꤧżÉ˛ᔞ;Łř7ű† ĐĂó®•ěViŕgUŕŠ·h€`DÄ„‘C_¨»–Ô‡đ"źé�élĹÇŁĂś:ř"›ę;÷GĚ*çĚę†ŃPUeŢßú–@R6řęŞ$dĎĘžtý”Ţ·˘­ůöú{0ÓÎ €G*Ĺ)C HÖ 0°Ţ‘ §Ź•™ßťŐhTiÄu i ˇë”–Kß Äa`3˝Ő©k‹ď6.o÷7X(ŻÂ$ßđqą  íç2°÷?¸2ÎĘg:ÂL›h]ążž*ts“—‡1ý eÜą]Ç™˝PC#WÚ:+ţ8ę<źĺ=ˇÉČ˙ü}=kOP@”ř„Ą‚Ĺ’ ž(;ĐŃ\š)87K‘6p {ţÄDQE\{&®6ĘŐý˙6I2N\źf$,˛ô¶ŕŁ0•ŚšŃZ˙˝:w+@éa6Ć‹xÎ"…˛}‰DĆTzÚ Ĺ1MzNĽ1î“CţŹ“\שqÎůöěké)!.©µžhě&@+ů1q$őÚWççĚ…‰f‘XÉBŕëű¦†E”µś»ü±~iÁacIŢ�Ľµ7öŕÇ_”Beá‚ô˙̵Q4Ě?nŽkő}3„ä߼6…{8 IÉ\łČúI©Uľďçů¬l.Ś6kmk=*a0zźţ˘Ş´đ%FƤ'Đ>úĐĂđştŹsSÍáč¨.ęľčËeEÜńź3ŮI�”t+ýc‚�U,‚\ü'Ü)„ťŕMD“†5†×Áő°V‹JôďFł^¬Ţ=r>“eoxdLÔ ¨¬†Ö7¸2·­îPŽ3kIOölvżĎřŤ1ľ˘^GTz~ô(’Ł˘*E>ĚX¶2Cąě]DË]âĂ5ż‘ŐGV-<ň.ö,+”t7?4hN2Ý”dĺ‡y�6iUşŰšMĎtv�/Â)Šěwvpk?���� �"V��"V���– sdŔ* Žą� ywyyyl�wqwxxa�0[ĺry7’ŇÓ٬ BżúŚ…�µ5ĽÍç·…a͵—ôą!®«­®Žc ۺȯśÔU”@ ŕÜŃŢR¦Bż3¨Ę‘!'ůI0Ć~ą(J?YĺEk/˛Ž¸("TůÔ™ŐŠG+áŘÔ”›3ř3±@‰í.fËëÍÉFÝáxżŘ=$Waüô^ŔS*ô3K2ńwx<Ô˛‚8¸,í×'nšJaÁf— ±Y gÖľm›#ľ¤ćzofŕÝwAÝY2Ěaĺ—^-?ńŔyćÁ!OwŚĽ>úĘłš"U˙†ţ]DťäüĂě‚7Ď3!.A"P­3 WZÖTżnr8HꇋKXh%CZ w¬m Dgx}ŕ×™Ľ©č)S€[�‡ aŮË‘H5~JÉt˘¸ ¨C¦&jľ­\Ó«ę5˝_ëAŮÜ�ĎăłA‚dţ8š¸júĂúM2"< ŮÎŻšcń%ŕ˝&– ?.čGß!÷ * äHäđ\”á­ÚČśĘ^Ű“˛;‹AôżŁÄĆ €ÜjŁöŠŁ˙Qöľtý¤˘8ß˙™q~>«µ[ÜŢ·ˇ~ ţEךZZŧ6ú¤•-ěůŻ}ÉŞűˇŚXą,fÔî媗źk#Ľ€L;ńŚ4\ą*¬ő÷Ĺżc÷ Ţ)ô+áň‚ťlB9Ŕ/Kú5Š~ąM_<§E§Ö;*ŃIo k*®o¬€ĎBd—4xż$ů¤ÝÇ… r�[yĘ`˛ /ÜßcGľŞ{mq0ăâúľUČş{1&1ş2\ôśç3—cíjcô÷Čľo9^ř˘ĐÂo|Â,»Ęň®ćľh¬â’ł…ę<dHÄ®ňéaEG9uqߌ{!>†Kq“=4 ččŕ–Ő¶hi>öPĘ�oí8ił~žN$uÓd şcM…Ş*ée÷ ű@Ď$癩ó”‚Äřv ¨jkâ<8ô‡zCTZtBNęşÚy…ŮČ~¦Ý˛ť ܧśý^Ĺżă_2AC’řÓt ßŰ Ľk뫏G]™Q_Ú˛ć0ˇá˘fľŢ”ÉtoŰÍč§~FřťcŘHŚŕˇXjžtW+Łč †ÚĄ~âvę0¬R±87*‹~žůYŮźÎdŐĆńx¤ČplťbW1®ZBśÚŮ<†żż…ňrýţMßŐĐI±},ŠŁĐ_č—6桡ĎßżŞ©;p(xVĺ×–ť^HÔŮúáŻődăfZšVţ^˛–Őťç§ônp×v]ë Pé.V„.= ,#ˇUĎ`­ŻLŚž2ÓX·eA¶şkä _,ôhϡ”÷)ţQ7Ő `ĽÁk"*9Ç_e篤0€#Ę…6/u…Wýř^”KýM•Ö¶łŢ—Ç šě“ó‰Ö^L—áßĎvřkS¶zÉ2‘ľýÖOlČuj±*ůqç8$¤Ë<čťVeóJkN˘=îę+BĄä(®«ˇĚ(í¶­kÎZLmÔĚŢ-.řő¶Ô…Ść«�]!RĐ™Ň^vWŤzˇXŕ™°}Ş˙ Ü"ýo~ćç§SC®úú·â†ÓŰn„őđŠç`w=„á˘ďŮ čUŘś@÷öĎŮuŠ3‹Űo‚5PmëÉ©á<7>uäNĐ/ɇ Ô~ńřBM/›Ž4lŠřAăĹ“RÝQĆX:QjýKbA˙8Ţ[hÁ:Ć?¶xĹmž}ŕą‚ Ët—‚Fé'\ěfĐ“ÇÚ,”®ŞĚóąM×: řÔ`¬GC"şů2"Ű˙Č%÷·íěLLUaGÂĆÁq-FH‰?W„8FH y Ú;ĽřHŹ[nÔÍ0ŻÖ`Ž© ÇĄ˘ÄŕA– ¬Äľ´Ýš ýMvšďLq âô‹U×3ÁÔ&ě^ŹcoÜŢtl#ęń!ŢĐą™Ű¸ňU—{!6¦ŮŞ›…řęŘ2$ş?î"ń8bϬóëţvś8 D Ô7CN “űeëłpî­–Ç©.ĚV‘wuîéU¬®Řż3mšg໤‘ęŰ~ŘşíŐŽâQ2>ˇ“äé3€v°’l®’oG‡UÁ¬fwî&Ú±r®×ě®ň ŹŃp›ľąz»Ŕ&¶ĎDę?˛uë%!n oîĐňö÷ß¶O.Ńž"4ž’ëŢKmŔĎňímâ˙¤˙)fŇŐeâůďFŐáŠMNX1p3ţůEÍÝŐ …¶câĂ1"÷MÇ»ř[ląĽWő¤ňËbˇěć3dK÷áCco¦Źýé| Ĺ9µľE¨Ę&ÜNaˇ¨Ž Ń AvÚuH»‹Ď„ŠIo2˛ďFő» ”9cŃYĚ™*ׂ*ŕóGÉď="•±3°\L”!K+âúŘëiㆂÝ%“5žF’‰OΙ’ó `e2đ_ăP´ą^OĘ+FĽĽ´ű P ÚÄFŇŞ¸ĺőŃ5ř5ŕĎř«Ű§á‹ä¤sm1fžç/.ŕpn:śPŇăóÄthp]Ł6R‚ufČݰ3ĚşŽ)F×OĽ¨R¬Gi;Ä\&A*üŻşĽň'ČWĘÖŞŇř¦ ·{î˛9nĎýúRd<‰áiÓ é,XÖţ3ÓN+H‚$h?L Ib$ZGúysßj±g\9¤ÜĽú‘ehňŹĆţŇĐÖ‚» «ŤDB÷gZuźă`Kq$^~hĎ�ďu}vE âžjŚC˛ÂŕÔégi<^b¨ŘŁ9ąäă�ćő›sÜ ő#´¬uÄüV:…\cÄŃĹZő ć‘»áGÇé±(Φ˘qöŔ?#•rO*ŃYşşAňD‘-(%DËłçż¶CÇ%cö6äMÁž«¨‡óŚŃngÖŢ[6¤— źmŞňä‚»Žî—iśůĐÁʬáŐAoĐz¶ěČďXdŐ|ŻžýŕăçźjŠs ŕ4•č\ ͦ=ť1ü©ÜVr™˝ząů3†⓺^Ć›¬Ąwy>ŔĄĎŁ›ŃŞv‚oČD} ń/Sęśk†Đ¬djRfű˙8'™ĎUŤ=6€ľ B2ś4SŞ×˙ô%&¸†uÄ[ˆÍăî‹kÚZ¦ÜŰ”băßĘ$Gő ˝ ˨b­;[ĆT1'‹ µ�\Oa.—“Ž$~{�CUŐŃş–T·ŞuŇ!kú’nĘ…I\ň‰" [ŕ%_!Î_+Ačůí #¦ŮńYÇÔ[ČXvş8T‡¨$9Ěšp“f ¤EVĚ>°…7ŕă&×ö?mgkőJŚj0’´&Čŕż)Äě·Ř‹W/c(,Ă’`[08íí7ŘO0ĆśžvFÜź™""ČDď€Pt)č-¸|3¸d8ţ™JŽ @;™ Ůß*`^wUźŕKďąÓÖ·ím3Qľal¸ésú…×Yô_n#x ÄŻ· Éü—0ĺa—¶jß7Řł1¤AŢřé.Ž‚mu‚TÚöŘŐ r¸…¤Đť~Ť>ÄË\zÜ:Ż$†$)÷ęrĘë’źť~—alř>ë(ŢΙyĢ%^Sľń2ÝŰM„9mb(˛µâ– y§–rÍ›3ŕC6'.¬'|ŔX4˝% z�§AXSĆ:—Çôpí5BÄ Gä%kťľ�ËťšáXaEL»Ô!Jľ-ŻnŇÖ¶DÝvF ["¦– Su…1™GĺĺŔ[N×qŹV×'&b·âdGJä…Ĺ‚ąQµěVwżdY9âl—Ź‚^‚)) Ç g-#ő8i{bę›Isç]íă—>2©ŞCÜ=}™/h2\áőy>Čń†(·˘˘Űńqh]y]ÜÍ}ťn]—­JôĽä ‹4‡sgŔć¨-gö¦:?ÍÁŢSt—‚ >řs‡&ŚI‚ŚíîzďzˇLËI¨ëÖ\T°w%ňľ•Ť7i6şSĺ´0ÖĘF™ÉŁď‚ŘşâŐ›NţlČJç< C!–jäá·ÁŚbjŔ ­ř=ČI%pń0’kŻ[•9•ŇÄ3á8Ls2Šu)ŐŽěĺ‹Ň>ol0¤üü»Â<¶S ÉS—€4(‰»ůsşX­ˇÚfÇř-KfúŃ6%öÝ€^y‘)˝ü+۶ęŹFÄ›׾܇÷/ŔM Qo® a gLęÖÇH¤y‡ýč+Ň~`F` '“× ű…K6p«ĽDŮŤďĄíIqđ¨ú«_WđÁçTÝßţ˛&"ŠŰPĐů«Rńę@ÜŢÓňeŠ ĹVnd¸»MŘIŚ$şxŞł{:ŇZŞ™č^ĹP·µ®ŮŃ©� ô<Ú[.V R±-zG~Öť™Í#a çµ(Rq.ŇČV&BćĽTJ…ÓćĂf Ů^·Ž€Ě›­Ń#<Ç€ŞŻŐŹHÂâçtŹđ´ÇrĹ[�Hj1™ŔŹ‘· ›©™Ö›î×SšŘçíyqŐŘ ~rź‚9ňĆ’ä†6ţpzcoهĽ;y¨jÓ<d"`óé~›eiÖü ¦HXµ™¨0cPqÁŻM@7ęVÔĂLÄ<‡Ů(iŇÎnpě«zpő}’A(<¬‡_´xE{ü^xÄ"ăţ{mŹ(¦+š%Ń€ý䤳&Ňo.ÁlI˝wVŘĘĺ‡7ú‡ă,›ŔLą>^ú7Űχň R‚w„Ŕśđ˛‡÷ŰÍľ[eÄ„B"Ä·”!C©|ÎŰ„„ăO~´I<ó­0[™Úq&yüŢÎ÷0dUöůJćR1„ćžÖ†˝ęئž$¦ůĺŃeĆá:”ééëeUöyWe?ŁýŠ*ät’ZťUČýfhBšBęO^Gѱ‚*.‹.5jŔ'[ˇú>k2üŞyóâVěăńŻ"}đ÷©ŕ˙ß˙óMęď©©Î[üsf»ÓąˇçÔ7Ý�ařšŃ±ł ˝4ÇM¶ë®nFżŰDöě!gămIać‘‘ß§č j!ۢtŰďB'_76ćVB:5ăÔ^Ľ”/Ş‹äë¤%Ă w‹) ‚?™ ‚0ţŚ0�@čÉ=üÚ3ë⢎8ĎÁęę[©‹·š‚}v«Ćáe4ü"¸•&C1]xjŽěŃKćÎ!pÇĎóú_‰łT¨7űÝśŽa‹ ŮĹ»lĘp˘‹0(jhŞĺŔçNkxŠÝss/Ä™.ĹWá”ő‹ăçÜÚs"[*Oľ{˘ňíhäůGaFÉ‹Tj d–, ó@Ą=ŇČŽr:íúɵ?ęŔC2'¨g¨ŽX<•Ü‚řGÚ]&J·°Ź˘0ú…hŇ®Ţj‰¶Ęs2Ź.IŮ÷őw0wë…âŢ–~‚LbX"M†ułüĄQ1â`*gD€Ű;¸ňÁ‚jXp>ď�{­żŮÜF„TrŐ˙“0<W‡űÉ5řäbCFu‰Jĺ cŕ„KµÔÉ­C´”±É.©Ţ#xŐn{RŰĹz¸„ďEĆPîŘuĆóc±ŮÜRá$Yé6ŁkňţZÉ%n<v~›írL!ßôşvěc‚˙»‹ýźö¬g]vőUÔçżłžwHň·YJÍKom\ŃŹŔ(ĽŞIÁÍb "ô±f`ŠÍ2ZydÍ#Ô“óć˝Ňź#¨\B{ňđL%ÄX+ŃŠĺ˙ŮĘAť®˙íäţ·XuÉ#ŐNđ˙;Žčă9d ÖHµŢŐgá¶Éa[0E rO$ĺÔgP: BJ¬Ă!ąP*[řŃ@îs2@ăďő˘ü¦@«ľ%ĽČ›ŕ2"w=4jżf¬L×ÄĘÇT8®ß‹ÁĆŔ<kś ČS°ŚÁý=’N…v⬻ĺ›r™Ę¤=ÜőYúR*žě˘“6vŞnńfĹQŢqJ8/Łéx5«wOŔȬ"`î^čÄqrÍynM|:Ç8÷WĘ—-Á\Ŕ:! TSăŤě§Łđ3YúÝ{Śî…Á‘ÖĚDŚŞsM@mŠÖ-vwźŇ›3`çş7rĎ+@špÁń#¶Ą)—Ť„YożsQtBěćV!w"Éć~ÓŢVl„jg챳a9ż"4ľ?*NG|Zö6â­řOoo-Ám¨Ę0XçŐćµć>ąńđôDF_é’´/źŹŻ9 W#MrŁl¸ ŤOp<ŕćM«žŮÍŻDdĄ äź´j˘d?ú‹Dia’lÇwţMGŞ'÷§bĆâ†Ý±c|í+M•‡îsIíM:ĂÇ‘üMa*g®qÚdđ.ă“ďăT §ťE&jóX(;s<^łęŹŕB˝Ä˝F:x|‰~A6’ţćörĹ-Ń1ÝŻ6ű^<i=!‰ë+döoÔ¶n˝ťĂC* Şćómţ&›ľ ˘Ř¬xv°śmÄ­Át;ův‚[I¬Z·¦Ý}š»šqĹ& %2 Ŕ1čşîNó8öŔŐ‡Ž`bęVVš ť°˛Hj ¬ŽëÖf÷§�f™@ľ­Ö/Ö"ľJŔNcCÝE7Ů=ěç4ýaoµ‹6ŤôîKćŁA.Űr¨TM°r¸$`vźKć‹» “ęťę1Öł±čô áí±XĆŇAîłu{ŕmÂÔcB–„÷Đ8ŢÇüĽřZ~©WĆÁVüż⡄tVŐ6KÓ:4aS$~Äżí"ĆX6ĎUČě!_ ŞšI dn°I±NąZjńr+şŰz˛h_j4±’K RÝkËËśIđ=j“ô›¸ä’ř4fř|˝*ß„ŠVŇçd欪N4ßß 3ćőż—ézţGËIn»{TS=ZA•x<ŽŰ|˙˙Iw§”rv�LĆעîţ>.ó… ę3j&Wůţ*ŤLŢ˝Z”S™m‹P]f9áŰ’¦Đ\·A…Ę5+)·ÉÚ´µ.‘…!6J#<6;ÂGyę#M];ő;ü™&„.˝ şňř °ł€Ü…‹ĚZAd ń™cżś5[äGw+©A»±RŠč#Žě‚f±j.Áhôii\gzˇg¦ĺ©>ĚVŇÓQö=DZ3f?“-gGXKŁH\|9üiú5gŕÇJi}.đEMrÎE“ É2÷]9tú©Żó–ţVKd.çŕ~„潋Kµnkr”™5‘nŢůZß.řčůĹb’Čʢ$ÂE\0&ő>¸ߍFíč6Xt�›HýAŔ(4ĘÂĺ4RéEžśŐüE ¸'ýýa1'ÓN†3‹»47RšľČP(>ą .\}Q:·2+űf»3TnáGWAůA'¨Î_ż¸WŐĺęŚp«”q¸Ž?tP4Ś«|ěTHźlnNŚře-ę=l“ś#-�qwM`JŰřt1ůsň›Çř;C)m©ÍάJŠ!ÚËIs= Sžľ‹ţK9çůx%Xޞč(K(c—ÂiőeéXŔ°Î™ AS‚‚úyyĎh©LYrűĹűmÂČçƇ$ň? ˝µî)3*¬žąxëá"ĺĘ/ătĎćşR 7ŮŇúÜ ±ă4aŐĆůGJ¦ŘT‡ö;ŞëPČdsťń)†U‰ę#L0*iŔ˙č|Ĺ8µ?Ýw"şFmËĎpf׍L®ľÁć÷CqF;mlŮ,‹®šnŚ,Ô'-Nă›Ć"ŁqÄt‹]k`_i|°%˙Eç)'tŠ%Âż@6}ß&»1čj`¦†Ö‹ĐüRĆR¬Ô^R‹–EŠ«. ËšäíV —ËÂ1aľ­uJ,-Dś×hŐJ\„qŹťe7( v‘ĆÂhŢGę e'%hěŔr6_㕹¤á˛śŰ2ra§uĘ‚)ŤşßS¤mÍ cG8+ ^YPx$_NbŔ‰î8äĎn ł®ý< 6tÔ9rbt€IMAQC+˙éN†`nść,®N–neýa˝=PYchú=DŹrýĽµ/V,(˙lµ' Mđ ńx.Ű©ŔUHđ> TÎۤ†¨ÝŚŃťŢ˙<—S*Ä‘ź|džQĺŁäĽ^*ĎD™ź®Üýe‡sńľÎR‰O2P@Ĺs©}i!íyËÜ—`ż=e˝a<ąŤËęţ]ަ…ĽÔ~?íŢ8B«ˇ˙‚ A€Ő�Iżc)Z¦ĘÄIÓx´ńa®–`˛Od­ĆĂ9ĹŻV͑ЛDR ’邉rÁ0ŮÍ"I;čbI§ĎJµÔňŔ«~[†:–j•F&_F[Ź© �ÄZ´"»0|˝SËŰÓ/(*ŃŠjH-C!ič wÇŇŘF/‡#Ą¨Gű+—›T“ç<v7r¤7—ҢYž«·9î[ŚĂóČ©Gému𓱯’AŞŞvQk;o#µG›<¸Ý†3]ć˙�ÝĂN¤üB3ĐdˇÄôÍĎЦ BîňMĽ_©¸í=Yhß ­ĽUcĘÂ{7Í Şy—ü^ć(ULÔĂş ^­SÉţr‘׿éi°˙đ,ý6•¸*÷ş‘Üí„y€cÔ‰eŮ"¨ 0$·Źž† ”ŰÓÓŇöťAÚß9É%4°ŹŰtů‚T¨)Ď;Fć›Ůîľ-#\yHĺI"ęŔąŃŽ(,d©u ÍÔ{©śšˇ®Ë ©/ňS±Sťăĺ+¸˘·{X›0rBłX!Ů­öé­)ŐÍéŠçG`z–ĺî ÄOvŃT˝î-±°ęČń—hJěP_ŢÔ:lH9uhĆF˘Uű!-2ĺ0%Ą#–SČű 5ßšŐ\Bú"-hŐ°şŮx[!Uät卑15}ĂÝlĎŰţ•ăŢL{Q3 x&xCOët«G‡nĐľes~÷9ö|cČmXŚĘE ŞRÚ)›ĂĹ'€¬Ď#QzíĂáĎĂG@ĘzQ‘_/%é™LQŔ‡:¨ ’“®NŇÖ—ú匤nľą.?©Ň+SŰ]Ô F7!ďŕ@\ă†F˙„’ôŁX$ĆÉřRçÚJZQ9MÚ˝ě©X~NĘé»a3&€Ď¦ `Mçů…pC 0¬P"ĺŤBO`¬ěn„}îNĄţK:z\=Yůŕša]ékĂ×ܡw>\f…¨Ą ©Ŕůě×:ÂĎÖ§Č5w ®Ó lńuć ŠÎCŃB—áęÔŠkÎ`ťĎ.“z97ć®$uÖ÷‰·@ Âď†Z:¸?KV縝Ó`ţćyVlŐ_–@©ötk †ůě<E‘w“@eŮv%z7{}/ő^ß“ą8„8Ľřwť!řn7 ńŕ’FIŐÜH“ň)”A” *$GO@™G růî»LŁD«ŮÚaÖíClJÇ1˛ż:‡mßa�\+Á0zěŽÇçW řŔ¬®»†Y%ÇÂî=óă@•dÇVBéšT–%Y}Ás®a5¦#î’ůG˘ńŠÝ9!_#0ç¦ÓŁg”©ëeíÂś§r˛˙ ‚WgŐµoś»&Aů`Zwk©yR O‡ÓnŁI1đ^Ô\üýź´äćfńs®ą~Ś€űťU ÓżźÝĄăuŢ<yĎŁ2ËĹü•ď´9bąY“eE˛(YTĺ˛ň!Dó¤Ĺ‘nŹq\÷6Ű+qXCš»a¸7éAŞîTaŞóč§Ířuв5ĚĺŢđé©tĚĐ%ť&ţŽsĎ,ď±ZăŘč ÉŤ6Ĺ;ź™cô“/cŐąa˘đľaßÄđ\GăĐIC» KDł›"][Ł?ÎŤy~É5Ä�{ŁHęČęq;aď ž{¨—ňSv!}{?}6’LÝÎ/EŠlŃĘjÓ®p„óÄŽs”éű!"ĄÁî(¦Š™Ů][Aýg‹T{x‰ś2†“Ξź`Bb"đĄ&9Ĺ�/k[Ű UŚF}Ç­'ťZ1;Ö’S3Nä˘3şbźŔ\řYŐΓźÚ§×íE¬>‘Š?L9´ďîxűh‰b<ňýA&1ŻĐˇčXodŤ&Ť™Aaˇ¦…´Ż‰Ö­_‡üłźT˘ŹşÝE:ČRˇö(š• x´D”¸ÜʦտéµuľĚ'ďaĎ ™´ŘßXýUäńmy# !"üO±Ů/KďqVu¦ëG†x , 71ąJ%Ě˙Žş@Üę}ŹîZ{űľděvłÍ'ŇN—Gţµ8‡—#•“]­l{_ĂLt•v8KĄŁF®ßŠůÚcâ»SqšéůaCŕG´˘ÂŐb“t“,'bçîT»űOř÷3śŇ‘´¶ËXrt ‹ú`řÝO憧De¸WŐŃEN©T"•Ü=‹Â@“I¶»!ţSMcR=¤`ß‘Çr•Š–ČIô‘!ů[Ňé-‰źÝTw¶˛Ł„şBŕę›ËMKöłv$4ąZ'ÍéŔ^ŞűI<u~Ň“ęňÇ÷ËŤLvb{Y´÷ÜřÔ÷Íß—ľZý|˛ľ[üă«Ô•BÂV3$ÇĚä6'ć=z\Ź´`fňŻQL3Đ^öę{µWű°‘’]Ű”ˇĄčÝĺ‘`ž×‰>7F“˝űíGÄ"}HDÖ·ŽFŢG1„©#Ű(MRRÁáJŞ)µD‰őă6ď;ʬD»O›?›ČňfÔ![GŁ0ť“ęĐą,i ‘˘wő”–K{]acúWčí°’ě@Ć+ÎńiN€iújĄ'8—ś~éëÖä$EyśJ}LÍ{űÔáű±JÉÉZ™¦+­”8­ lëyëDSÂâ§�(\ŻĎ©‚�»fťăŔŚ˝;ŢX:mĺĎąk€q`żťYű×9#—�4aę×sN°šĽď<g”şqBlÉÜŽ MůŃ?S 2Ą&·1\Ť$eÝŠžű/g/#×?Bµó&ĆńŔúg„jo [}ČŹ~K¬UîßȇöµÂ:łâ(aą)Xů=pČZ),¸óhnńŢŠ’’<*o—\F%Ç,cx˛ Ĺ›�%¦áÉ]Ń\ü{ϰß¶†ňô6Ô5¬ă˰ÄGüÍ*˘ţEçî’őĄ2í&ÁáÚ‹2]9Đß`^ÓđčË}‹śÍÔ‡’ P÷-˘§“¨7Ĺ /Éć]ĐdHÇ_©?_g˛‘&Ć–¨*@˙4@—łŢ*Vb˛[ ŕϰhÍ9E¤ÖYô«Ś®–·áľyk¬Çů'ę¶ç¦}:Ň Lá~WAg†kEţĄSB$(”,Gjoço¦ýđéňC¶vͶlĹŞ”ü¸#FűłL—'ëw×9ó¶äy‰açxr-pN­Ńä—Z)X÷‹afĚ,ÁśfWÖf¬ŢçźTÜ·™YÜŻm±‰ŕr}O·ËŢ ”‹\ÄŽ�`TĽQěqBóŰX™n#RTëŇ2¨HEČ·ŤňéÓ áĐ"ŔçĎőçđŐČCR“3ŹnŞ4ŤjĽťLF ĘGé+‘Ř4çáŹSýŻ"Á¦äb?ô —©×)Úvi7oďq‘úŁ,ÂqM˘ lSÔJ5–ˇ\ˇóĘ8ńF’0{źüÖL }:W�D‚÷eéeÚP— óűńzŇ)á°bSÔ­ěXš+Ź4ˇ&ě2 [5Ů®l/HíĄöBőic2›ÝÍš˛_ŹĂ-ž¤Ů*!—ě˝™H9mĄ!zЇ/Öśł�E –k1 ’L·t\ŹZw–é&%öîŞCřŚ;/ŇŞ×B3Ęczý‘ ű·âx˙ăL/éx$Ab˝ÔŢB@öŔ§Ľ˛E+±9Ş’íçŮpK°n+(c°S—FÍng"JâóŹňŃ#îL31n«¸m Ű'¶lX?%ŠÁŠćrÄ,%ćiypˇ†F^“¸ú¶4�ţ?B ů+}a‡ŘŇFIݬBصşZhşăŕö"Nl|ü§×ü9Ĺ_ä=h´Ű˛č+"¬Ňtů†j‡ÂÍËŕ‹Şqnë*XžXťEwY„ibLwXŚĂí¤V—ť—Ż4â—Üঌ [‰nlhŞĚnĎ˙ú¤ď^ŞÓŢqŃ&DÍë,§OÚşzd5M˘É—Z? aéŁR:çd™ŁÔ ÓóˇAA[ć´ä©űVŰś‰çMČ–’óeá®’Ç^$5„ăf~y’Ĺř±$X–Łipĺ€â€)k¸‘-żÄ,¬Ř{m�GEşXD·˘TĹZ±—Éňĺś3RyM ·Ç“óŘ ‚ŔĐŻŻĘŰőj "W›v—‹&gęݤ(‘Ěş˙Ĺw#Á : ö¦Ą:Ęy7LʢFľkKŽĘ ţŠođ·]gi^Ř”=* X*C"ŞŇ‹÷&$6˝ęX˙ůë"‘ăˇeđćYĂŘ$G…:‘>ö†´¶CxŤ×ŽÄQĆ vŞfěťŮ Ó3­Ź­©ş¬¬Ýn8ú,Ľ‚Ť1Ą>'µ˛ŘZS ěë‹ŰőŮL&;´nóň´wZLJó†MűK‰|bE›ĘţŃuT$6žxi.Ŕ#.?T§‡eĺšeQ«śásłg!”@ť“…›ł–żßq›V€ßEW†EřďI~ÜZĚĄËá~uć24\ Ś:u-dPćhĎ!ËŢĆČ[`ő*`‚2Ĺî|„ŻWĽEäą;NP:”SăÚ$pZ»*Ć+›WQ^ěZdś¶;ľB=GkFĘă˝ěJÖŇ™ŔU)g›ŁŻ \ ¬ŰXĚËÝ.ëß˝mű§ôbz:îćň_BSOú×—~1ŹhřŢAĺ•ŇK>óXap<�ĘD®Ý-¦‡şLÜ'Dš­ÉŢúqo«Ś×^«ć5źů‡ÖÎ{xYŠľ— ÎA ţGš_Hcňş1nľSD»·uÓ«\vťĄŞvT†ôrCžýwµľy#—5 :KĹ%- uA»,ÁZm†I4Ö´;´™ůÉ^tB4pqU3`Ţ>ÓpI?ÓRËj<ę2D&˘}j�­®tOčnhF@#:!FËLŁNP@ŚXź˛öG±^÷‹ß Ű�O ˘·Ŕć‡ďŁÇ%@évĄq‚B[A żčIÄŐvş¤«ŚŘ`ŮÖ—aµDuWĘQ7ă•´‘Ň´“01¸śtp †·2¬ h«\źĆűţŠĚńnĘ™¸đą!]‚E¬ ds~˝šEEţ#Ťă]ŹŤÉźoš=ŕÝ8T‰3„p"3ÄÂuHn\Ć •Ä“ĐĚ2ó1ńžĺ]qă%Źwîv˘Ţ”‡Ă©SO"×؀ۂ."JLâ˛u;Lł±ČÎY3…7IŮŐ± śŹS}řľ»K| ˛•(ÇĐ׋§Ăuź5Vß5W5EԪ•Î:Ó0V9_ˇőˤ´Ż5 ş(MÍVěČň‘,Ć`ß N0±?qâąd-đ`áí¸Ťę\`ĂC`n ĺ §j—Ééú7_ţîäáŐŃĹĚoJa6÷ÓPŹ<3ßŢ2![ŚK*˙~›~őĆTŮ•čy…SZ>ŘńNÚşöŁ DŚa˛žŰxô•ŹFŢQŐ[Ť 6ęť§|ü¤mčKˇŻŻÂÚkţÇÖ†0Uĺ3;ń!™ĹĎ3ąp5%,ÂŘű–jű.vÎ"ŃŮ«7ýťč ˙~Á+€ŠE5Pî±îLŲ–ĎT;Éiś†ěÝC*o·źaKݦw›ś`¬.Ó«1Ś—ěĹžmôś­,¶Ýt5fŢŮlÓ_B]:Ó—Ś -Ű) @TëS&űËŽŃ´gJ‹Á÷¬¶u8 ö¦ëWá?f§•–%" ü‘ĺK–uN(íőY˨y©K%×Ę qZ´śZźŔ4áÍ A˝Ű F¤€  ÷@CvÇŽ"aźkkô ›¦cĹPŕĘWë»,C ĄĚźŤëHď‹4ÍŮq0ŇtSŽukŻA$>úź/oGéXމ¸˘c«Vń/ú'FþܡĽu9«`7 ŃQ>Eł#ě›Yß'¬)Ç\˙'“mW!¶›-1=&Í°Ő›ŽŁP ¸Mq~ű`-žŘCäDćĂN·ŞH–˘gň¨}EŔaś4Łóe?Vo†¬Ű�82ĹOź~€«*Áęę cź5é|™ŕ$Yß?—żîÚqś|Ë?8 ŔąxέlîV„źűY’#«L(źsů¦8-…†b†‡M§Á�D=Xk•Ăz tĘč|ÓŐ×xmŹM8uĆ3ĐAŃ×p¤5±¦n ęiY-ŠĘGD˙ŘÄ…GÍ,éRŻaźJ(\iş!ňBxZy}/áíŚpŘÎŔpc *,č_‡�ÎZúôPyVj7Ă ňřx>{w2\ڇ;xăH ô˙ž6PŞěĹŇů\ĨŤä÷¬ĺ1:mXɝݶb¨; ±dDŹ·ŕĺ×íY0Ú'­(łĆą¤ćM§ďĄEXG3ÂíÔ+nˇ Vâ{°'ß]u˝L‚Ę_Ęц8BVÇó#ö –­ĄLEú[‘ÖLW·űsäRÄIŐÁQNP(až˛=QFFó2đ](ŇO.Ľe}»+Źă|ý˝ í`ŁŕŤAÇ•Žły„N$ŐŠęá /‹|EL¸ŁęϬÁüč‹7”d÷äxő0Sío”W9ÄP„bçŃQÍyPXQăZsH ÇάVűfľůtďŘm‰oÓ÷*7ŇßŢjUčĄ×zUä�Ą™źd¸fh<>,ţń°ü­íb>ZQ×r˘1dđ4;ďD:í# nÍĽL¤C„ě +Ö6:gíŘŻA™Yß˝×54p_ň÷Á±]ĂVŔ Ěł–$ě€9ţ%R‡hv$óÖHü3ŕ š˙+GsÄűá` Hu»ľŤ1í˙e%0IŁ“µ˛áĚç7ĽˇévĹţŇ~o\§<’ë =ęrLĺeUFÇy$oůç]`Ą±A VĂĎi3!z–ćRmëŕŇ]¶5ˇd/y\kĘ 0xYă{'ŽÝ™1ĹÍ‹«ôö5r™Áśs9/×áÜ ٸ•„Bj)»ĄĚ€żSH"k–-í$Ş“ ޞ1Qšť9™K᫣ßČššĺѰôŁq}ot»lGgeâ~÷nXÜ!ţY–ţ‡j(Ď+@$#žÝ[JíŞ+UqAűžţ9 Íâń¦9¬±ľ”L9sŽśM.ń-r`y]ţ©Ł@ü8~¶#[đçĹĘrÄ É;ö‚6šŻą#G7Fb|T#¦m7ʉÝt2p.Y3ĆÁŕ¤#FŘá‰j˛ Ó+Ľy� Ń đßQtŮrţ5oĆ~ĆĽÇíjĺwqßfXL_‰ÎŹ\_ř˙D7ć®W4éőëâp®ł$ĹV!iS…ż™ŃjąŮ^Q‰ďĽyBëÇŁ,˝Wrh{’#»çy2°EĆJAßŘůŘh�%¦†Ë3+Ţł©¦‹k÷D‘§¦€ů»,ÁşĂ+»Č†búŐ~ůcÓ&dMʰ„µu#îH’®1‡1łšk®Ő­Ř§mJ81Ů‹PźçÖ` šqOf’s˘Hű°Ď#˝1~šÔžrm˙~,®ŃM¸’LőD“M|IÎßBŹ€őZŘ€đ[_»čň*Ą%+ˇÎţś»{©»=&ü ‚9[ĽöڰŔ:_ëk°×‚ˇ¶ůĄ,rň‚ňŞi(Ďö¸Blˇ]?Ż1YBO c(™úC\o-»hčLŹ×°‘řw5PZž«]˘¤2Áަ UP’{b‡[wŔŽÚ~'’1U?»fţTó¬˝e=ÔíąşÓööXđĐ©ĹpżĹ"?@ő­Î/LÉ‚ꛋ!µJFŮIřgQ.´ěÎ1ë&ÖÄ.Í×loóW¬xŁ#Ż`Z–bón—·ŁĆ>Y•‘Au5ŞJ…_Vx ˇG;n¸Óă›®QI¶0? ®ÜĚ٧o»3$ZŠíĂp c$ M}ÉŠ.vmNÎáLŕdRŻßçáEg#¬Ęç_ĘN"€-e 'ŤäC|v©“”»#—ßł 4««€¶pľZ€;OZë±Úöwł8Úp_‰m:ěłĎ\ĺL á’mQőź73Ü…ÖĎôSJ‚Ĺ ?ŵZΉ‡ /üjjlŐÉí°!şL#K¨ů×zR`�‹Ś­ ¸.~‘ÎĘ:xÇV†ěH×qőSÁ0„}âč–0\éđ;k{ gVžSÁŘźY§SďŻK`GŽ”Ő~™©ĺ7|$Ťćîř.¸éá ¶i4Ăš5%:Ż FĎaŔĘÔ6#VĚčÜÜk~L’™ľmhě˝60LXuŃ)xŰľŞĘiŕž^Ś–Ôâp[á$Ź©u3ĘŰ$Nš‚·éí—±ŹĽB_uăjrz•c*χź Ü›* ŕ 3ń!÷jáńúňěť(“ĄČk\ś.Šz=•ý§E÷snFđŁŮýÄŚ”¸®Ł|Š3g0ói™=]°W}$:ˇĆzÁ¬đtŃkyśjčŁ^ń馫´“ěYŠ’yB -ĹúřGhTŤz¦Öźćaž0‘�nVC’b¤ÇZ8„ĽíB ¨4}Ę x dsĘć™®µ–qFŞÚV®eÍüŻţD¨ÉJ oĚŐ.ŁSqH{·˝;âÇOŔ9ŞŔ ”ŹOŽŻŤ†;I'6Ă|ÔŻéOţwů¦-I ‡V׫ «Řj“°'U±Üŕ‹Qzd”‰ rźz{Ë8®ÝZ|~±sŚ:ŮÎWíĂ»IyĄşńj`ř±OżkĆ`Âg0K±’H3-ŽL&EĹĄäČ'ç˛B9şŘ·Š(‚|şx‚>ź`«6ü@¤ú÷0 żÓ¨™{`]ÖŤx—ˇ÷Ż‘&~UTť›xCúžśI˘Qr¸fU“ł3{K8ďÓŃ^řŮh´jqţ%ž;Ľ2•ôČŽ•Ük•ä^ŕúdÇ]ÄŚxÜ$ť·řüwĐĎm?©ßň褼á˝d8nVp¬™Ćɇ†óđĎńB›©łţău˙=|5B4„CXCŘü–ʤĽ“ž7 n»Ě\Ą‡o[.Ľ‘úˇ8B–ݵěŁwiçőÚň…ßߥÉ@„ńx^ŔQŔǡp(·[ŸćĽHłęÉ$­äjú­)›TÓD@ Ţ5%ř†eą>ţRÁ7yőŤi é,+ěÄ@˙ű l&¸“@ď’oĽšY™.XÁ-Zµ˙%˝qźiŻ—wüçmM»1đ7q岴=DĆ`vďv’)ÔŘ Mí=WdŽdđ‘”ţ+ü€_ŞŻńÁ¨^jň ´3•EiĎSŹżâ•2^”lÇqrwô÷q>Ć-rijZZ:]_¶ŚäÍ|ěMĆÖRŹĂcp"T“Ó@oRÉÉi•ĺ:r—ťµf¤XÇ÷TÄËŐzŢ;SE(đ¸MgÝŕ)ýâ´ŠÉK#—WźáҲ]˘~®şŇ~QQ¤,6–Ś·ŔŘuÓhöSk»Źt ©¸ăú¸ńKĂę"«ľVČęňKĽ[I¬aŃOĎY=ű@Żŕ’çź]ĽăŮAgÇuÔDW‡đáIç2„*ě*żí}Âůß\Đ,CWçĂćYň9JşČ˛ý¤,;Î]oăÄÎÉŘ‹cž>r:Ąőv…n_h#ö¦¬ .Xšzc2v[Ĺ^]ßu –!3T^Řqŕ·Žü¶%TG>}ĽÓÔÍ„+łA¤×cUş3Ą“UŐă‘uQ±¸ľW"żdŃ{uĚ×čGQÂ#ną0`·*Ă÷ďZ%dĎDmJ}¨ŞL9§Ĺ<Aľ“Ż$}’9®»Ęě[â#™śn$<K–%˛ľŻ@ĄůßoDˇmÔUŤM·-Ľ˙1"»‡1‚Ôť§k<€ Kăą-*%A;Á2·¦`Duär4Ś˝Ô¦ÝióĹŮłá{CP!šIĆgixl2)ŻGB A?%"l··o§0"΋pw‡ꍯV„:Âűń=şěßH[ŻŃ0‹ĺ±�ËwiZgomt2ď4|ŚL+n4ŔF(`¤ć#Ł b`»ĄůÄCäú˝Ë  ĆXň¶‡ćÝ·˝•ˇ¨•ű�ÜÝR#źš…Şa´!G1>‡ÍóŢťĽĄĚ#|xöłÄgCTŹŮ“Ů\T°©čuv/äٜʮžŕĂŢzJ"Ţ 8jűš6#C.ŤfŹH`«˙?ÎL”óÔM™Iž0zZ^Ž+˘kb v‘Ś©ŤďłŠ­CęÖĎOáP@„uőŽ—ˇ¨”˙ĺ>·LŰžĽŁÔ –E đLŁFŁî¨×ČŹojjł¨ K¬Ľiöö@ŁŽÍJ ewŽĐů.±=B˝?—…Çł˛DíÂsŁĐ‘€±e€żÉbgK<Y®űIšBÍ?źYęÝoŚł0»ťˇ�|SŽü_ÄkđŻřHŽÁ˙o›š!ů[/Á38,lNAW7eŤçmź­űÚĘ»…ĚżQ˛$Ďzn1ËęUŰ߉&Ĺ3¦t"řŐŃ9÷Ů8”°#Ç4 Ó`żť ÓţFWÄhNQ�$âˇtzß<Ű�S7Ôö‰$ý'˙7fnřŤçĎIš¨ ó˘ŃeĹ<ç>E¶BĚ»ZőOT[„<ExǨU€ZëujVßŘŁřŐÇ@Ą{ÇÂôjÔĎéT‰ŽłÂ/†„júĆÝł*Ë~Ŕ»bĆ9¦#M›Ťg±ź¦2k(01'y­Ť'M´śďgľZś<ŁxßSö™ý|TŤćQw_*X÷űźčmĹ=]čš5đś´%ݰJ]o(--9"˝yyV€:ľw +řú2Ńß;˙Öܲ ČŚ¬–ŕ6ëť®aÉeqěZ«ÍŔ`žM•7ş¨čŹÚY‘2’f^e“?cóä¶#µ}Ćh— č "Ř~0Đ,8¶hđń-_žé/!r@łxËż{Ŕ)~ěµ3ÎqÇ:Sć ›Îß}kďÁůÎ@ŰfČÝuE˛!�$čľPšx»Ä†ŕM®EęĐ1ÖV9č «|‘OYźŻ}ó+%6ńçƦ˝ĘS¸ÍŇŘá ů˘˝…ŇrŔ$:Ć\9ţqyKîą�”PYť 囉 ݰ˛_Rőwś1ôü[”‘lgÁřt]‹ů”YÄ×űńfµ˘,‡‘ˇŤÜ7 Ď™iŚ+Úye‡O5úBM|hČËO¦cGx®0DűĄaWĎ’JŘBx–k¤¦ŐIJ´őUęZ´|É źŃ7‚ťnBăHä鬜}˘o `%n1Őë:oÖ˛€+ îB Oŕńś¶ms%�h;qN:&gÓ4Ţ1kĄúć3÷|ŞbJ z»ÓkÝytt¤VŹ‹ ĺŠ Â=Öş8ĺ LwUrő%¦űęo©_áăń8ÓC´÷�Ş'Ť6Ŕ,P˛´F’  ĚO§Ů¦Ú‹ĚłmĎńť×®ĚńĽâ6ş8!‹]źŻ!›Żř ŇlB>L$%łjŞńřÂÚTk¶îU©Ź÷`Ó"(¦i†gÚj™y˝ł˙ő92źcŢŃFśŁĘę2 (‰Cü=żDX°zt ü¦…•ŔAęŁXHő…ŐN×ů9±–^˛˛LšüP@O†«IçłÂ/:_Î|‡Ţ”NńšÖ± ţâc…Ď9káŠřň!01tIŮlR'zO2Ő{q;2ŻdUÜiת+Tm}–µmGUÄäŐŮ8/o†I©Q|&'”Jî@)i´Cü6h°řťNĽ@JB¦âáű¤»č"„ Ś\P×ŃfŞŘnC†¤!˝i\űÔç‰ăŢ’Ľ|ŠÖ™r·2®(Y°HX \ ÚĹZޠɇy«zťw2@żÇ5¤‘U¦HgDbŘ™d¬Źr:Ł__/hĂaúzüzş7)G3ŕń[­đŃ­''î·Ërzu(Ou=NĘ^¬Ě / ĂÜrc”­ÖţšG˝âm‡.y“¬®l{‡N·ó…@MťšĘîáxăÄá®ô‘× đrëe“v_ý/L‚bK'Ż|:„¬6ŃQ;TżóVT|ćŚ iJőúÖ† YKZŘV“$r\şs&ÎlSÝFő5®ę%­J\óČů#  *&–G'µŐ˛]mţě*X§y¤Mu_Ő×ŕ6˘·6č+RĄbTÄ…#6G'žÝ*†ľ!UwG aĂhC`€¬ťpÇ4tůlžéCF×Čć°×|Ł+×tłZS¦aĆSôů­­ŚýId3{ÁvľMcz*ü6"%““µršťÚ©X oETł)±¤ä |r“yRţGń)żTRw{GRüŕd˙Ţ$ë\dŐ3WK&:EŮłp›<Č…/Żâ+…Ĥ—:Ż“-–`W?vS žŚţ iÎk-©AVĽäř3Ďß�Pá/xáŚUąß5 YđyîŤZiŁÔĆ“Á ÁV…´BnA(č6LŽŻŠ1.gÓî˘i<Öeî7ŢVžyźˇ}óĺ}ă8č({ŰHmŕbLôí'­ŕ‘펱Ůc—…óhrvŻnĚ0ČűÓ*ą®5 +Ýiť!—Ź€B>cM ävĂ<€đEZ“mÁ˘č­Šnô´ER\?J׊—�%š j{›‰ďç­?@ńnů‚,›Yy‘¬í-*jĚECv7äËŃĘüűě“„đˇČăIĽépEźÉD1y3ä¨9]ć2 Ť˘V­!–Óߢč—”ňfmŁ=» K7Ć·Hxe{»Ýh\1…ě(ĂçqôŢŐů.Ň.µ…D©â(Ă×{Rď1ĹdŻŚ˘ŰM䇒’¸Y(ŤB,ř îdĚâŔev Ä‚QĨ‡H%4{“^oĂ ďŠY('’LŰpîŕâ—�4°gjŤ\ĂőäŢ?ě’>€J‹Řěňş* +Yš.:’÷×€ŢŢŹ";Ńżo3 ě˙wŻx÷ʶ)‚Ł"vĘ}{KIµÁ»"Í ?j楯—c&A=//ĽĐ�Üôu˛°¶ˇ9ł2®7ç ý}#~S„wÁ!đ`1Ó˙®„ŘžjÔ&h™ďt$HňX&kţ§"âË·î‚&¸SP 1v÷A!8˘ĆŤ7‘äb¬ú.Č j;Ťá˝­L>p=˛[ą#ů%ná±ţňżŰţć‡ÍJgđ×›;Vʼn¶ľb#6oă˙ź,2Ó¸îR%šë¤L >‹ÓđĹúrx2ż¶ëS¸Ňɝۜ‹žu{ jŢŁçĐĂbyăźâPćF°¶$ă ,ĘQÖ*}˘ĺŚĆ}ß"÷0~\đ^tHjz˛ţ1Ňč¶÷âťiú©řG’kÂKżg‹±oĚâ+/± v<Ńń˝Lô?¬ťYücĽxŘ_Ď˙O´Ż#ďVu˘@^ăřꎴ˛ăSÖ~÷ÚŕăŰ(śyĚż~Óő ÜŹz-ör-ŕ‰ź/Je¨Í“aödcjŮ^lüŁí‘ŃU8‘'W€pž[ţ˙Ŕ¸Ä—ř?ÉKm˝F/»Iq×wvpkR&���� �D¬��®3���–sg* Î� ~}||Ç�~{~~~y�Ě[|mđş“bqřaĘ10ţ"řĄŞaĎ,ýÇ‹`ľÓ|QŻ*úśŔaE®›LŽżč´|ŕýʤjN9•¦ťČ‘[ĐW§–G4“dj[´-eŃé/őšçŕF7–Öq"i2r&cŽ€ŹÔuQŃNwm™c5<ź¸Ő˙í´x–=·„zX˛¤xé4˘´]ŁÄQc©|ľ55Gß5~Eż×T Î{I)ů®ę„s—R.žmăȆ2ěân #C}ŘAš=rŤó·‚^ĂgŚÍn›’7M禨9ąTݬj BÍ+äŚ×†Ł¤4‡™íE­0ŮĄĽ2˙×ĎŃ(©Ĺm’ttGża¬Ľeś?Î�ô%4po›ś¨ Ą˙R’ěÎX Wč99ož1f)łHÁ$T”㥅ąYćëămÝDž>Ż^T ňÚŹdđX#Ůe˵ٸ aÄTŠB‚gٲÁ2S‘>Á 9ąpb§˙"tŘ,H�7B=&¦܇›>ÖË~â59—śĚ�á đ.…/"¶ÁźG[–&‘y�N·_:Ĺ´Ô~¦Ş§­n*Gq¸Łk튯[Ş„#Ň“„.ާ¦¶UbŁű;\yOc“ŞŤ§h7ĐbLmEťKýPiĆ~îłÍî™~Ô�ĎćÖűCÉW*‚dBŹ"ÝG®ŘŻP ó”HŘÓ4ó÷łŐ‰ÉŢ –ŃO”úÚ8śt7lh9–ľđd«ążŕ7˙OŤ–Žź!ťň€HĂDň—˙éő¤¦¶[ 8ěł4ĘěÍ6CzďH#tE/řx<p (4ô oSş' č.ĐôŔŃÁߣö=FŐíwęđ•Á‡Ëc¬ć ç˝XćŚ_Č.ŢeËMµ;‘m€0ą`­o’Âć ’I´Â§G(žĹŕjÓMj%Î<ę5k~F)R^»{¸őlßÖLďf2ó˛ëŕ75?Đ!Y¤őhJpŹęm±…˝t1Ž "¤„)cÔŁnú篵 …6U: hÍ. őzC¬ŚSh˘ČÚ*Äł‘”ő—Ę|±V©ť±M„(ŇŔ¶´L´ü¶Vf:đQîí%Ľ,'gÎ#IÔşj.–ŻEô-~Ş?Ľ·My[[’|E,K>áÂôA M‹ÂÝŹÍşk´ŕř‘Bsćyô óŮě±Ý©ć×$Ń*/¦]˘~WiÇGŘźŕ�ÖD_¤ř-j´µĹdó 'ćł}©XCŠQę¤Y ýAŁŰ;9'Ü÷=¶Z¸űęĆí Ś»2ⱸ葸÷ IŤî‡ů¸¤y’FËaęę¬ŘL+`ŘąEĆÓáÂZfűŁi 'iw't†«ŕzĚGôx5čëQŞby‘H‹%ëţ˘şWŚÄ|ę¨Đ(ĐeE‚I=kSŞ"R×ĚBtÄĺ eĆR" ­Ĺ0<Ç*Š Ĺ߬[r�”’‚A´2D?’lĐS™±…&F™ŐŻä˙ńŢąßĘě—ö!'fr˛‡9^{jŐdŻĄ”ý=ű*k}nQ[Q1ŠnF4×IěwOĚé…·đ\Žf¨¤tĐ0vĽňKSąĽŐ’ŽŚ‰FÔExQÖ{Ôxî˙‚‘řŻ×žXcbŽŘ¦žrm'”ŞTVŽřţŞDúş"ĚŃ·K×32yŇž�÷čnřł7®xo­uµť`ŻĄsqii7ň°­6i¤K—Ńć‚e!Q]…O9ť8ń1ó;ČŘĚ$M­$ݏŠ6K%¦*v®{üŁx]”«‘MśÖü`‚U˛!ĘVKŽUŔBˇ/=ĺšPóä˛Ö©Ó®ýö®–ŇjOţÍgý« G®…”CJ*›ÄšŃŁÁăŕ2CňĂÚWË~řŁ|Î^b_:ľŁŠŤTm¨nKâd,ŻNC]ó€BZlŞÉ,¤źçqđĘyś ďÄN¤TÄŰ_oěí¶‚yS‚ÄČŹI´ˇěČš`çŠÎÇńŤdűÔĆá%ČB ¤ ”V¸ Zţţ¶íf•~€ş~° &�ă#p‹;‘îÓ¤°:¬ŘzÍtčËKߤŁ:ßřM6řé žšŃN˙Eą 5Óčx/]$â5tˇřqjV!X»BĚő˙r׎äD:ĘŽNﳬŃţqCqr·ťřURE8)?Ś“w»iáÜwgĺ4zâC«8g>vĺ *5â'ňž˝‚'GăĎL=ëcLwps ,gp—™Âô3m5)¶># uîĺÓr-#ĺ #\¦Č"đ¬4zÁĂ-Iéy\—źĐg]D›Ţ`^Ůěő⠫ė~î–pöcŚRĎ!Gië@§óI×CZöˇé…NńVwń Ú§*ěŘŤP„ל|ş3<ÂńˇĘĘĎň…ۡśYŇł`ŘŽćÉĺ’DěÜ-´ň€™Ýł¸Ó×ŮúŤänł4íhś‹ÁŘź@Śä¸·ŽńŤ)óÝ?ć/ř)jý¬Ú¬Vz7p$VÜŃÉÜŕäžQĂH‘G_´_}„ŃB®°Ĺ#aę=©±öȢZl&Ů, HĚ­şÜ…ÝOČ4żq"z(<ʏľ:s\ś˛ßAqń5ő€* %«†Ĺ;â!]öÓ[5Ëy„ŘËY|Ęß—ÉKT:ą÷S¨±Bůž´ĹnÖpÓĹŐĺcëÜŰ­®äŕüˇÁl>ŞĎď¦u şŠßsÓ.Ž ůö�‹0˘%űŚűžRUěňţ ľżUŁĐHĹG O?ѬÎ\¬úćűgB8஦ݦ¸* ń[4řÚ•ř>k-&–óz€X7r,Ź zw é ,á@ŃŚS™¤Şqý?I5óĽÚůí:!Ëşż}ÖűŤĄŤCµŁ”‰C=ńŕI}ďĘeŕj™.[ä¨a“ďj0w%Ő“‰EÎ |:Cý–xžť‘ôĦÖ1«p.4®{¬Ř+ł¬T–.ügňhÜŚ”Ę—s¤¬î¦˝H _I7i㛳śµÉqÄ­©EżÇěxżFőXo,ŠhĚ8‡ÂöČĘ.ĐŁ ň×𯺔ËĐůöÖšcş [ú /u€tĘ‘Ĺ_đżť±‘}’ˇN_Wś íźďŢ{ŕŽ×éᇮ‰6¦ŽűyŔýŤ —¬ă÷Ŕµ¨Ł 'ëK˝MMëG^(g¬ŃgDäô QáÚs»7ˇhëí Ĺ'{zߣh; RŃąĺĽÇEůěľ+‡Řé­�‡}뉗‹.҆0Âĺĺ †Îq©UFÜvŃëź˙Úum(mxE=ĺj‘x÷Ďcy9©°˛ß`z¦Ţ)ő’ÚŘ'ŕúĹ j ‡Í¸úHlĄ5|YŹ”ńHóőbdP©Ĺ«Ë} ;Ę—ý­&ĆGűć@ÇŹ]đšňţÖ9:]_ćˡr*ţŕ2 'Ď÷',¸S_xô–Ö×óbµˇ´˝ŁůţŻ\€´!´ËŤÎW!:vĆ—Ŕ÷Ť¦Ç=ĘĎK^Ą‹ń7îă^3n©/L’*]Ëů÷»PRTŢOźÝßcď-ŚiµóI ęM®Đ˘ ”/ďË< Ôţ˘wüUÂQE}ěl‰â%ݢćŇÉ{B• ź)«ůkKfűÔěýBń·c˘ąć§Ěx×·0ĄůŘÇĹQ,Ľ-ůÚgŮÄ^›~±É“ŐJD*“Tb± µ«*kéT[ľóřž"î4‰$˙Čy¤kż?Ád„ ŕʵ@ &ţ MŽE»/ÔŰ}Öf&Ča Jţ'ęŕçó¤¨ń—#Ă„â'v<ł•»zćřk+dř©XÜRO¨ć~äEU)4J­0\©š5„TÓK Jôh7¬ZP›ąçoüEĹωľI©8Ě@d§,¬˘…ßÄ?°u»&ßw!şF0¦ŹĐ ^€Â‡‹»µëŇÂÂţ ‚ţź%ťh V¨‹»^•=t‚Ů‘cćf«ůHÇs5äc.dSöđ`ćÇçíN1„ŚŘWŁőq6jF®  ][85"ěXĹtK(Łiă€LYä-×·ŮÜJů)NÝÝŘ/ć4ZnuI1ôç˛áßŮSőLö˝{'ď7ĆářoÎî?ę|VXkÄ!˛`ń[aw[őHü_Đ{@QĚ)'ĄĘÂ1/ •,ŐCxľ+O•4J:®ů:ŕnŐYgş¦*cÇĽŐc)Tţť´ł|»vďu5ěęAÂţeô$4ÖNĆk ÜíŐ+¤ANÍ1ůu[ÇÎFďştb«®ÉDB'Zqţ÷ĂŁď¶Q謪Oŕ^�·ŇCř¸'f—éjo4UUqIŢ4©KŮŹiKDMŚi{ÁgVčx,žT˝”Ýa'NPj2úE>†­çarHIĽ˝WváƧÚ×ř‡ł¤BK.ÂĽű"WIŕdm·UR‡ş4p°ËéqgbíhkŢŕ%˙0hŻÚ’©T“ +üCćjÝ;ÔŐ11ĄzPÖĺ rzůň8AZďP«Dpë ɉ©xhő÷.B×™q›Ă�ˇś‹ZÉ•č?—}zŻÎč1î’h0÷&—YwýĂčŰß Ś„‚U’['F{yé˝¶iiöýCó‚W„VóCű›b(ŃM GЇ}.#6»Ě7Ôů]Łe·XnëôĘÝé|R§˛‹­×¦8·He%1iZŃVmKßżý» M᪶ު%ď$ ńňć…ČĹduô+¶"WJ µ˛/řýüb¨Űî=2L´M°\gęH>˝ˇ ăôn+§Ç"Ý‘®’ęđďÉ1)…—)ŻěÍĽN'7%XžŕŰE }]tˇŻţ·]䆦€Â1Ů~[y%Ź‚Mď9×ňĂ ôǡ0őĚď”ţ‰°ŮÄÝ)sX¬††�‡K‰Reyěçľy9 ÎĂ{éčżVWk {ˇ Ť&¤\ďîČśČ`ĺęšĺ~¸ă† K#+Mľ»ĚGŇ_RTájzoĄç˙-~L�¨QT馀ʙĽđ‹® ęŤS…Ŕ1ZjĆŁ‘65ŠU"Ťű”5¦7ˇýCŽ5RV7+�źP‡EĚ~ń0\c§ý_Ó`…ˇ‡3ő`Ň9m5Ż®w/RŮ[  \Ȱ÷µż€ô9––~!ÂŇÓőšó}¤ĽaŮŮÇ…`ńY´mĚn˘Ě[*¤]#Öˇs äjó™‰pÖs‡ĂS¶Tř^đřß]*Ď—ţA36#¦«¸ÔŤľ“ű-©Ď˙f–Šî_r·đw¤˙JżĆâg§nŹÂ娗•^ĎN,tŹ!ÔeÖĎŹľŮŤŻpT ÁľťA¬î«6±'ůJ.,şZj@ˇa¶KM–ćC«ĘzuŇÓ&ŘĹVl]b÷ËcťŐ¨N9ŔBăx[‚čńtşJIöR˝bćOEĄ(uŘęW"ŁŃ›!ę̢zR°Ő1uÚ¶˝ĂˇĚK†Y#ÎU_Zˇ›‰Í˘/ µC#Ä ÉT?]�äE‘~Âl4ŠŰ.҇âš„"2ů|2YO'GŕNuí»VéyŠäĐ„\-2ŕˇ{Śź:Đ´Ęf Čl©ěď’°¸ĹÔ`[–UZ—H0WîŢLŇAPŕśFh’Ňňčkik–A~ő™ZY~Űmç¬ŢH”9–Bp Ű SËrŁ3Uĺ…tüýZUÍëťRŻ6ŢĚBŘç_rż;Ňą¸©Óu]ž"“I0Ž9ôµ[Ä5ĺŠ@=5ŕëgź2ërĂ N<Óž‘ŤÔÇóšdN<@\M‡ÔXęděU&°«ňhŢžçĂ oŮ}1'B4ČvČö‚™]úX3­ČxS6L’wÇTSűy1mĘw}ŘETÄ’"Öă<ÖŃ”Ůř"I8Ţ'÷…ĺŠ#C%é@Śôî':†äĂů=Î$ jOňžŃa8~y1łuoޱ·üáżę‹Ví©’JT´áW;WaMĺ–v—¦ťÚ˝ĎIUT9kĚ-ŇIBŕ}ß±1¦4Đ·\égŢÚ’ěg˛LäX[ëú…Ně4*‘Á±U-¸*'kB:ĎŐť2¨í±#ęĘ{â"ůĺ+ÓRËřŤÍ„Ň3‚(•˘|Oz:ZtĄON+9]®·NsQ»Âz7Đă°0uä–ae›H`rÓźźâ×™|\˙îł?sŻÎ  4<]é6p˛ŰQç~Ü˝Źä¸Ťt„C­ײVѨ‹0Ž=ľÍ@şg¨Źµ ßs+)ź·©ťâ˝3IĎ»ďÄÔęeRžb°ÚĘŔ4óčëĚ4QcĎóFBŠřÔ[+öFńŹkŘkŕČłnÔiő˝ÚPI¦üü¦ Še«F–úćÁ±V•ď©ďG sńÉW»ˇ„”ű0îł)!®óŘK·íý“Ů!¬îÇTÁŐ„e@{M’¤ÜĺŕI`W™«Şe8SôG¦HĆ<Á*€D1‰°IĐ÷?&Î’Ú4:7ˇ›±ŔcXď AaYđ][îâŚ,݆ąRĐČşźő® Řhč _I»`wCÜxťäŰJ�ëÝŃ–Z°H9¦�îaPR™:‹lOO`§Tp±Č©üç;ۨ?łńŮçS+›jôż‹Č›áˇ �y×j­_f•H˙ßîPĄCÉđ×®yĐQĄ»Î{CVÚÍĂ"yŔ^&~čŢÝ1,ł@îµÍ@pűP(nKŚ˙ b\łĽ­žěŢ3Ęgj_=óŤ^:Ŕ*!"ö©O€…P i Žaő‡ü{gÝďc;WŘĘ)ĆąAnG[4ţÄqGlÂ^ýŢ3ÁŇ$•úRĚ÷…kۨJP˙=ͰEpű·YJ‘Ô±ă-o•úË˝Š‡A.Áe"łśů˘ÉpĎp20fP…H$TµËaÜ‘Qëp 5ňüúOĂ/é-Č5´ŽXSNHáę5ßÉ%FřW÷™ů$‰$č*ŮůčfŃ%Ë“6„°l—‡¤íy)<Ę“9>Gl®†z¶ř_(ĺ/®+Őr^ÚV“ľP*ěXÜ›»lŚţf¨žý˛˘zÓ‘Tb¦|ßlo0〉ái¸Ö}ę3˛Ѹ8Ü©< žĽËí{ ™Ą±jXC‰†®l[5`SÓlz´Śr•ě˛ nDĐ}§Ťxü/}eu2ggŹŰÚb7ď˘$žhF}ÔŢśË]ĽŁ´"|f®źv %ĎQŻÄ…ôá)‚Z83…\Çż 3ŰaBŃw538N•FrN@Ëż`ôűńš2 _ qArA„ĎXůŻNsáńžů˘»‚/ô/Y «$ čcŚVXى÷ĂÎ[ŞŔ/×€*<Ż„†·fٰ­LĽőI˙sÜ…í‰ŕ㳉ł;‡�2‚ZÓOĚđĂ]Wř»—«›Čw'(pY+bÄ‹čçw™XîţÄß/+"0śöŚş×j|Â}‹˝ĐhK†â=˝ag2Ű(żw‘·TTŻF„4™±°;`ۨś[d)ÂäŞmźß=‘ *P˘+Ď‘ &FVޱľĆáţ�-Ő»dŽ[Íך=ÜĐN;«± &~·1A‰HvJL-y¤–4:Ž0bőNv&BpÁ—Ag3—¨ÇŢćÉ:¶Őđ†Ëuw~jÉƌ⠿Ǒţăl/žo]„ű‹Ž Ź$IÓ8•’JÝ.ĺUe~ßŰĆ6’™ř“[1I´=óŞ‘·\&v DĂ›«o˘„ŮΆí2Ţ1 –Ń>A¸™ß}mp¸ë«iŮ ™0#_@ýňZÍqź§•vr›QÄ#8§‘m%“ĺLi±ţÄy1˘<čřé-Éüé5iĽÚÍżJ\hÚ"˝ž^W¶´ś—§ĽŚĆ‘ŽdĚÎä¤ó"KŻą¸•Ń,•aVH¶qđoVk;âň@Ší§ĎČ JnĹ€Óąř¦Ś&¬ë,ýjtˇˇÚx2©v=“ě“ů]-Ěé?™'1>Z«Źł 9ľÖÉk^´ÜŔ˝nXr&°bĺüă»ůnś{‚¸ËŽĆ’YE“…éD™U]ż&sGžen{”�<ö±|­r×ĚO‡?¶ee…”^­˘˘ćhÓšAŢ6˘w"†‰Ż•ôŢŠrÂvˇŰöÜb>‹±Áj+Ř'KŹYăŁÝŹgř‰¬mT4,·°yzt0(zżÁ†ü+5§-´ť1‹aÇ<ŕŁů‘ŠŔ/tT pHÚ^Ç!ú±}Űă*ĺpmÖ0÷Ľ4#R'µ–ž|;fŁ*m Făś‘KşäŐcĂD´LHÚťÚŻőÝHśS`Çş ÍóLśŇ˘Ú-‡�Ě:ěCdi¤ř*óM2 †t1ÎŁźŁ'Únž[z“Č@ę(| Ä`ŢY&ÖdqOµR9«•ÔŢÉç§źă•r‹c U ᙆŽ×ŚvdľâZ¦‰źłóµ9žVÎńCņRRč÷Úęř–gX¶­–PŐ#—ĚŁ”>1Bś¦’Zđ§0÷ńăeËč/BË ]Ĺ7‚ëPły {i”+)ŻË#5Î ôKYÂ[UtÖńë±qŇ®żú”ń˘HGÎý)§9ă¬Ů°7W×m꨼0ČňuIŚôŇ•čţ Oč:č'×cJ`Đ{}ćŹj…^h íKK«áˇé,!ę ==űŕÉm¦ÜęĘ“k]]5Ű»ô˝ôpv‡Ňý5‰ęŁvUő×÷j¶řj¨“ý7®_=xČU`WG¤×ć |Ź›±#ʵś“)5«âłÇ ©ůř÷>żÝÖĺÝe`(G„U׬°îc.šáŔ-ٷ뜡köÄ4ëbTnĘb3Ĺ ɢ:Ýv}¬Ţ ×ů/ ,“.)=KŰőádŠ<ĄÎó“2‘w·őŕUĎ=đVŢ%¤ŰÔęuĘëN÷Tu ň·GwŞ—űßlz¶Ť8˘dü~I#…ěyH!m­r˝˛Ý]G¶l:˛ńë^„ĺÉlˇý¬44-1ćęK =¨éŮčŕ ˇćÚ}ůĄ ­?š&Ä‹ń…xz! u-š*•̵e«öÔö#H/ĘW^ÍĽy·!\S5 Ť´ľqű‰’ép­Î]8cÄŤŔz äEčL;ĄýI÷÷]ă’ e˘#üś9ÍóDi„͇ç €lśő«zöjHXaŽ·BçńAÓÓpŽŮ“Rr©yUĹ5(p/u%ĎQ~ŁłxA¨; .8qI«©I˝‹Ő@Mém-`7ÂĐţAlľs—µcÁ!–â;4{OČ‘zŕ¬AĎÇšľ“ö—Ą7<!KĺYÇxAČřś3‹dIM´‡ÎřŹşăťýd+juď¦÷9Xf¸ ź5LčuHŘ{2iąăJi˙ˇ€ŕák@mňŁÖ@ŮÚĄuěeźŚ\Ţ%ň)í¦ž=©đş—ś‚ďCçöČiîkfú5é’.5A0¤Ľ/Â%C÷†Ö/Űip‰ßĹĐ„·ęÇM1—ěvÇÓĹ-@d¬9q@ţz‰ Š`Ľ^]w·ĺAÝ6L >üUóÔď˝r&Ĺ1˛đݰ*Ŕj%™ţňzś» îťń^?ͨáÝ|j<±oc§R¦N6Ý7ÖÉ'T2†‡6 1đú×),Źš{ŞĹF´*Ü�˝ ´y=J"«Ť$}Ç3Ë2$Ą1®"•Ą»ÉÁ÷ ¶ä2aí; Ů ą}5[¶;_ Ţ 0tW—ó“«,¨‰F˙}RěżË{”K} ŔOę}†Íń¦ĺă)šRŐX8đhäെ¬.T€±|”ť}cëůř†!FÓŐĂJDŢD—´%7ĎF·E­Vy}Ž='1[µOÔ_8Sn"Ě”:A­•H+´?r9ţ ”řÜdRNĄęˇ-ćO\şĹ{\ýŽ^Ź#4qI@Ő^qőGŇ©$->’g_vkioěŃżs@�”çžIäěBpP«‚Öâ©ŰUŃéÎÇ3ąr>-c †UźÖČ”őkŐL˛(ä†ÇÉĂpRŢĹ&ş?†ąC'ß§$  dŇr)nOăË µőę>ďĂ•>bÇćÎfهMÁfJňA8ż¶kˇ'—ŞĹâĂçaíý�ˇ1‘đ˘Ęm:ÍnRSŞ�1ŮŻĆáZEJďWR —łlás†×¨Ák"ŞŽ2C[ůĆí`9Á|‹RůvŰQýűjˇ…‹?Böí•_{:˙ĚGśÖ“F™É<5˛™ç-źYé‰1¶›˝¦_G,< ‹JčŃ&ŹŮýď^ŔÉň ÄDpŚĄĚB5"—|©‰ÓŻ}ń€ #BBô˙fĐŁMraL]·ßçř]3Iâ¸0P'µ·ł8Vrţ^t×k_WÖŮ—°ä‚Ü`î]tĐ›Šµ´4YŮo˙�»7OSŽ «C\Fk´¦f›€j[¦ˇ,eôpä|!ż}0šśPJä¦,čBě&{^GĄ+d…Pćóă ›1ZńhAe_Ŕ•Ŕł$‰­ěéKwâbH(ž~Ĺ!ĺŻęW·‘Ľ|[h¤Ů*Ĺ€™?˛`몶ď”Ő›ęŃŁîŰ:Zd䉨ĺśú©DEĎ­«Ň2ŘâTW@€ÚnǸĹcK'łúC‡eá †~.‹čK4ű<ÔDpá "PĚ&üüĂS—ĎMă@g|-ž~ŤäT Ăşä9ŠĎ Ű­¬óf‡–ǢôÔK" ›T 4c»čP‡H:ßţaĘW—»&kiýJ÷’Ş˛4ߊ,…0Ü™s°¬“9oüح˨aqš×ąŮßd¤>ŇEďX5(ŚA†Ëۢ{'«I8óŤý×ÚćzűómPĂžđ!ČžMO~)›Ó-ÚLwóŇ~VŘ;Ë€˛QĘ)·?ő\pFćîřlfřĐ^ŻHX±T7ˇ.Ów™;@4Öyw-«wyL?áâç d^ŃFT;:DArů&ćgdÓ:ćZ>&r0:4Šuß°jŐ¨ÖďoÖCynp!•ŚFŃ aÇź şŃ$viýŔç@9úő>óÁ}Yő…u& řUý§~µë Ű5¬kžýEĚŹ'Ż­ŽŚ @äp]<¦í$żă&Ň25îôĎ6ůöŔŐľ‹kąÁíŽ/ůUĚÍ—Pk·ÚÖhWUfšPú?zľ‚a!˝§„7ANďtżŕ}ez°ŐkĆuÓËŻÝýx[Ţ‘ľî¬I…Šf¦Ůڱ[·íQű®x ŻEF‰— »nPÜąTł±‚-xžL‡VÖ=$2Ť¶´źŤíá5n!Ë„ŕa[®ô S*‹ÚîŰ*ě;óyR qDbľ5?ε¦n×Ű;jIů'=¤[M4ÁCĎË"čşMú˙Ňž>Řg¶˝x}=®cřkŮÎzżęâÍřr 7ÓEYőęF߀kcöMX’&ĺNëť–ó‡¸Ü8…ó·ZCżŢŚůÄž€ŕ}bŤÍ­ZBY\ÚůŢĺo¬s˛;Ĺ8’dd‘ćŹfSHL‡^9pµ˘śp ďµ¤¨Z)ŹÎé“Ë>/„x˙CŢ~pMŮĆ9 Ç(T·pDŢ+‚ߪ^µ~ů¬µŢKđ…őŇgŁÄúźâJąćTĎR°8ţ<ą•ÎŁµ’Oď!ÝDź~Ŕ@_˛�Ó±.Ť“®ĂÉ�Ů"d''LSŁ,쮬Sr„#°ż?¦ZÔżë¸ŕ.5IŚR, ˇčDe”ů>GÍn ’î±ËŇ+7@ Ůçą|¤Ĺ±®ą#˛—'×ÇyGČn7l4Ím­|đ*ňŠTŚŽ–Al[­Ľł^Č©5Çkň#–ńSEw:Öă›ČĆ}Z|q¶ń=Cs©óX§eśÂcĘ`Űd(pxˇ=IŮ%†µFţ2 4\XB4p9Íž¸úŹ‘—^/…Q°\‘—¨j˘äĘ)ZqŔś ŠP70� /JĂßwRţiPý(8,6 ©Đ/âæ(’5N %-ÉࡆÜ$ľfĆVÂäź:†‡ßüťoP‡� —¶‹f¨ň ¦›ÜOŮMĚ!âžť˘Eť‚ťĽX‰4»ÝÓ(Ěoî‹zĐĆYޤIŽŕźÚtčoIăú>=łŃŹÄóňÇŽć‡?ąLôç•EÁgzľ§j~|gWvšȒ_I€ŔfŽďŇ{ů%aµ`éyd}˝p_{G(Ô {6*btj} V˝ĚyÝS 3{N:űŐľËF0Š›:,‡5"ťČ6ÇeŔšk­‹ÖŽ(Şň÷ëřą->ç–ĹúńĺxîúZŕ.˛8ě,úlńűŞş š÷¤LěŃѸ„ČŚŞá¬OŁDÂéd\gŢG±7 BҸI·BBäŰ©•‡?—ˇŚź�ÓŢM/ă]O‡]¸—Ȭ†ŕ¬Ć˝Aţ¬»ë=EcívK&Ś s +ş4CuäśÖ”ćű¶šŽŢő*ąËy±“lÝhF\4®Ü;§l=€g bdt‘ŽGćwí8\điQ.8@;¬–·’;¦ €s7‹•mKŚÉăŃĎ)¨|*rbpveÂL áăa0N¸w—5Ş#ăažNĘv˘ňË˙ 7ć0WM÷R?/(ŤzpO6ŃÄÍnăÍdÝ6*YťŇű®ŠF(?2Î"Úĺp#8<F›ÉĆk÷S,ŰŐ]¸«†Pe.» ť(ď§ ńŐE$>壅•9%qNÚ»%„P2:¸ (ŻlşŠß˘VxžÓĺ' %“ä$=4Ź4c .ő„Ť`o‰<ôCpŹ!6'śŞÁ]zT14ŞLÇ6bHkř+n¸«¸†6ÇúČX�¤fŞ'Öş6‹Ą©ďEzüyŐ°™ŰˇËy@Ĺ”Rců§|źN ó�/ŻŇ,owvpkú%���� �ňß��®3���–ZI6.* Žę� ~€ę�€}ě�T’um¨ěs}ßh­ü%ń2;á·ţ˛ô&A<ÇDé™;áÖ\M/źËőĚÍ™Ł ng…šg·`–ŢŰ‹9†aÍR\{@Ň˙RAy(qsŠ7ňĄlnťm .lšŔS‘$…6aę‡AUfŃDnČ­^±}ËN[¤f°®G)!MT • |ŞvóĂAD±žß¬;e|ő‘şTüÎ0!ěaăiśě˝âş=;B(§§ČěŃ)–)sXgî#‰˙›t“u:_4Tťű•· " ¨`Bş¶#ˇlĹň ĎČ}U]sMEŰ i>u_eĎJÖć§Áń Nˇ4jĄ HS>ą;+Ň”Űaş b™9•�ßý·ő*6«‰öđÍ űßâÂŁM>‡oÖc0Í mHDCEšZŻOŕɰČ'+~ďŰH-ţđĽŻĘ¬Ä0`ęŁkÍś$&@EŢ]»Łn€EAŚ/DfîšQĹlç;X¸6AöGÜ=gśúÎúç@­ělĚĐI¬SWü}ď‹7ź7|Ă“:µ>Ň(:vőáf‡ěĎG‰ňŹčuš·„kFÔIĆ–%ěM© pâĚbOvłăäô+ňśĹ+űX »ďČi�ŹŁŢmĚnÖ6ÄŤ‡Ů˛KfŔF«&K†LÎ9‘‡Ů¸Hő$T™*Mř«ˇÂÉa'¤D3—¶vĎŕŽĺoĄXu mµŠ°„zŔ@*Ăn2ňä%“,ç~dÂĹĺ WŁNUÍŇĚľëHý%¶pš/˝ÁĄ3%ř–…gk 8«eçQ52[ßĺâČÔĽjÄ»ĆÚ¦pµ[ß‚őnŘ Ó0ÜPţŽ}űşŘ+şĚ!HĺŢjČ&öC#c‰˙0c -Ffü~:IąIŢŐ†š‡üʏ3ĄnyIĘÝ�xđe G´IK2-t.ţ7‡´MĐŇBdťä˙dUNŚUăľË ]‘ŽŔž˙ľb®ů˙fÝ~6 h’$“ĽĘ˛©¤Ngrýôjî­˝ZÓ·'w¬e]™|$.Óg,©šľXQ•ďÖe©ĺů˛ ­XCâ _×gä˙[WZăo¸mQU tŚ—ýrĘő±Án¬.HV©ŽZŐ‹čÓŰȆżÍ# Ě–ŕ€€Ň´ĹřßéŮ_\ę•Ě:Nš&´FČ<µâ€°ôť ĂŹô¦ŠąŰ˝řT)=_  `/Ä­÷¶ö^ŰF…&ŠI żP]O ř‹OÖ}śÚ•ôzĺ#ç®ëÝä·ťtŐuŇpôH±ŕô®ć»6Î ŽŽäůůŰ:¸\«Ł‚:ziYľ‹ĽŢΓ՝ôď| ˝­®ýĺ›bŘ!¤ha'ë÷Ú`úőî—-M‰±ôL>8ž’Cµ{tLD-á9îóčvW\H08ކ Şśaąĺ¬oF«¶Á—·×9®43qâ fµőÝéĐbęp0cŽĂőC­”˙…$—ţ–PŘĚßVJN_.ŚQTÉÝu č!Żűne›‹ :ĹÂSTÝâ1x…‰C&ÓÉ)#¶ësČă<vQVŐJf!l(Á1V 5K®±QV—ÂĄZţ‘#Ô@źx7côłžtËńÉxűŞSţäÁq>5 •Űť„ó[d/uťrđó:ŔŢÓčŇC< V đń¦»©®uĺáĐkY/ @:ŁĹžBAČš…˝»4öH>Őü>Öâ}aî*Śp.€-ÍuSŹf:ę6JËC†âöĂ7†~ýî¸|˘?ż4ÄŰId–h=2!u˛ž]ä9Qm&±¨oüFŃ«ÍlsĚňiüĆWÚ@äYa@Cz¨őŽö?ŰÚľ’‰Ö& őşł(ő÷× fźŮ9m+gJög/Ő¶ˇžYoxhôťiݵ–壓i~Çëű›W|Ŕč«Ę­9<­„�EEdx‘ ćťłŕú¨|_lŽGŘى†R¦Ö?ŔW9Ą|3Ă n˛¶[‡gő#Ž.Ŕ,ąőE›ÜĚ DpUŠLyĶs%ĂNÓ Y©U´¬AäÇYIÎź7p’ţUľ‰c"8¶ÉČŐĽ[ýNŚ6{ÝgEée$ůôţYĆů8)Ü.Ăě�ęzňôäR‡Ř(\pťz�2ŇQX…Ą§ĐáyI Εž¦. Ru»(r”“)ŐÁtwřhíŘ•üĽWhÔBŐ-ÝŔÂ?^ÄĆ%ňt[˙!°śŁó^}ŕÎ+ęVv,’ÄűO lIł�Ä iČmă|ФÝC”żŔuP{2ţÖuă‰5⌿îĹ $jŠÖçA iŻ1("‘oů=¬HavŃůŹpL]˙ °b¦r[Î&ĬďűNĺUŻľý.­źâ :Â\NRw¨E-fîÝĐşcVI­čŤ8%I62�Äb¦cŇ"=<Ś‘vŚćŮŐ+vgŕ?ŻK>tľ;H˙^ý¶9ćź9mV€ĹďۤđR«1 Ąć~˦” oţ†@#S5a®óD焞ĚX4y:!Ö|ÚńqăZdşWyÜń!dN‹((™ .×JQ…üđľf„¨ ,ż~UüÚC¨¤ÇQFÖzÇ#Ć4a¨\®– áű 8ĺwí9Cî™mçŚÖM¤.9°óśmđZ:3GF,É—ça¦ž… ·ăěÚY6.îaśl™ÝÉ~ár%˝‘ń+Ž/Řc†‚ČďžźC8Á¶Ur�;šîđĂUg•żţ°Wőlpmg—@S;ϼנc{ŃáĘ Ů•K†\np®Ą-G1˛ôŻ­Öt¤Ňݬ{@Ú»rÉqź‹ŇĂnÖ˙:ČĘ%íĄ)lĐŐfĂđT:eXśq}]P“™Ť'śu{S1K?eüßÜ©äLnqŘ„»xćĂżD°¬4 ‚f÷ń-yů‘bö|Ĺź:ą›ŽýĂ”âbˇY·í&–ĐÝŢX’ <¸8€ĺ�;éą1;(Ŕ¤Ř>¤w*»đ¬ĹüTN…fuäFą Ë‡)¬Šą~!QÖďŢôÂľüE©Kŕ}BQź•UŃ÷Ű 9°wźŃkumî~9kĺLúƦťe@ľBĹYőQąGěCťĹ2äIŹEă“'ωW!˝Ý°G¦@ęÁ˝łą>5ŕÎXiN8}-ŻH0ŕSÉĚe´‚Cź—ö=ĘŽű“^PĽT—]"+u7ZśoĺĹŽ�AĐ÷OŃ5Q~Óżţ“7P?hÎSĹ\MşIëÂá^ärMIZ$´y/(ę8Şkz(¦‘ąp Óµż4âd:;}ňÇ‹ˇîĽC-DL FŃ­ţpr‡ń+QÚ¬şÍúŞ22µíJŁ€ÁŃá ¨dŢ.(¸g’22$É’Á|sLI(\ËxşP‹M>ĘzH‹Ô©e=˝—ˇýż ’_QÇOĄRą*ˇˇ0}NzŰEúFr­ŹĐEMţńWd"mđ2<Ă´N°Ń"S 䆉úŽgEĂ=÷űCóJ¸ëT’Ś+mĽÄ¸{ěk´'±Ĺ›ăŽ{ĄCußĎŁq (O—5;ś]–ŠăÁŇ2?Žqő„`. ‚+p/¦˙đÎH°:Uú}!pM7âąƧ&Ň.onFˡ&ýÎFţĺňŽŢ9–pÇĆUr5cV sčŞAů˙đjwźŐ»¨Şć?†cË;$ň“ -.:ôA Jş„x¨†˘Iß4ݦëŘŔ Ĺ+Ő.ŃJÇď.Ňm{ŔáçËŕřRň…ąqÁŕžŔ‰ZśĆ”!®W•Ú®L-«˘JgĘÝę‰?DµË"ž@áe>#é}Ž"Űę(Q«ýŽ·WÚ Đ} ú ¦ě÷­i˙ô°˙Žđ�„L‡,Ęp‡í®îw‰n5)TPô)Ęk6ó|HrKŘf«Ü…Íţ7[ä– µÔú~{#Ůď‚%Ká=CÔ¸ń. (ëĘáľ!Ł˙­3Ç™G&Ôü†ÇIŕ©mOł”+*JőčëĚD•Ň ďSö—Ťd�ÔhmÂhęëOóŇŇUZk¨§rş Ńy]ˇŕ47 iÎż¤ŕ}ő§D·¬úlö6fýwŕ×úč·ëmôó5¨­5TsÎŻţăDĄÇ5×Ó˝oH^“č§Á䯆=V>#©ěŤBS”ĺ0Îč?ŢÇzź÷„H‡5Úýçě’…µ)ű;ŚYtS0żţŇ+…čżRŮ89!%ÂXÎű°j†Kĺ;˘Ŕ9î(2‚„]9Ôj€3V&3>6«ůódwM"j÷ćgý¸˘—rd×:ę>j2 O˛ł‹ď!żE cÎ;ÍĆěĂƢ‡´z ?lşjŰwÓf=şžĆ[¸K!jvÇ–QqÔŹ!ěl~JĚ÷ŽŹ–5 Ĺ-W:«†<ăâc=QćI\)+y…ÚSF÷塛€Zq Ľ1‚óΨ­Z¤ü\â|ßḓbŮŞ˛ú^ૉ⿵+€ő€í§{aŢ;~˝@Ś“w'ť·°ł+°·Ë ŐµśIŤÎQKW;/&I~`'ŇRĄűŠ7pŹúĂto·T `MB>dÇăűŹ8ňó,Vť ń„ŰĘRÁ E˙“^ZűµÜĐPi°R?/P¶'RßdÉčcŰkú‹'S1ÄöŮ`±Ö‰;ŠiĺI§nĐąxOKL3ĺÁÎ,ĺtTĺGűŁ L‰i}Ň7G°$îźt^'9GŤf[Ż€ Óżĺ?#Jo:°H‹u,ľöĚuN!çĚš‡†65ë™Ü*đćä?t[rÔż~)&a ´Ĺ‹o÷* E>BdÜ”!,L„v•8¬ä2ůSÇ­'8_É eÓ¸§N+نTuŃďVÉëç[wáú›{™ŚC â”‚ ˘ą5ąž.Ő)í7Éűűźó›Ač%4ÁKúĘYlŽťň;DĄżóɧČŮ UvÓt&,LË�d›Fë/AEÚĘţʸ.3”Wú˘\i0}™ŔM;Íe…Ň}§źúËżô¶đč ~C—Źt×ÇŹÔâ_ČęWk™ťŤ8voĚÂ!.F¨ţŔ˙–śŞ/�/s‚?¶;Ł Ž"ăŁ1H‹ĚC,>}´ ñĎű“. ĽŽëB×ćĹTq‡Ä[ŁăY7âR…ÇáíôĹMď„nÓu_µť}Łű!RD‹#Ř0'SNľpĺÚřü·#€ě„şLĄe}9ó[Î[Jśł‚ÔÚ€ź“ŻwťJ{×ĹI™5ôĹSšŚČ-W5m ©ě»Pş®öIŢ: w٢śo47<ĺďrV,9k…Çżš𼏓Ł|×zíÓ„ş±.6ý;ĺNźćîÉë‡úŇo žöčČ÷† lŚż‹!ľŁ#„ţ8dnüo@YĘrśűÔĐ^q7ůóö»îç±5Áe]­Vl ăGą‰é¦ę2'Áx˘•óîEJ�˘rő×sÖ†T)oÓâĄĎ.ĽĄ#ľV ›S¬ŰP¸śuű ‚ÚĎłO#E2Óó;ÜŔB÷ÓăfqÝ< YŰÖ'rĂ3«„±ĆZهŢzŰ�ć$Ík� éň']÷ŕo_˝'ţ_q){o3=Uťr;†Ž|¬'¨…V[b^ÜNô§–t`ćS/ń±kí§ŁŮ["őеpDQ‡Z€ż©nxśĹráŕ|ŹY č�*ŞWáÖ¶‚ť9«Ăe9ŕ e,¸Á)|(ó ćĺeßT łľţţĽăOSAŁehš•Ob"ÓlN˙Ýn%¸…ę.Ő)zľfâázžÝżĹďŞ8¤ă´q¤Ż¸kjqýŢFŐV IŐ«v˛-'›9; ‚IĘačkZŤĂjŢĐđ–÷ůĺŢx‚w«D5ÄFn•iÔűţí=ý†ăľ×ĄÚ>KřÓHŹĚĹ,/v“Ц0őĆ´9w/ćMZénëŐ2Ň:ŹÂ�?ĘÚĹsć ~^šöúňŤ–,@ŠZçíłŤŽđölv¬ÝďŃźÉĚöJgňü�€ĂŘę!…ŻŹŚŮ¶>/5 Űt ‚µîˇ}ś_˛žh˝–ékř>źZ2}]ŐŞ“d*|P‚ÜÇ“[‰*Sz¤aâúľ@IcA”b˘`I}`B«×şáX¶ŠM>p?sč¶ŐQęBťşăź·@@§™űUĐISIľ:ř…ŇuI{ěď?ÍdOF['-xý6Ŕîşk"óĎfł‰Ń+ŕęIČĹťŕôűIĂ6wác/4` ˘ NŞY§¨âAîšOČľ:ĎŤ:ü›ăž©$KxË%ëÂU)ČÎí|ß÷Zt›ŮÂ\R¤3Ýkl˙ žÖű—s[†łµĘy=ôľ*^ŕCŕ‡D6z™€€&Ţö‚÷޶°¦ ϦkŠk-ŻžľÚ§ą‰—YĄŁęŇą’HPŽ6ŔrĚ,CqX eű°™–çŃ1.(!Ź ÇNݍĘĎ‹ »f(źU+ŰOä?T„KożŇř/îî®utXxÉ™ �çmA!/uôđs˛5ů/˛g çdčXÉEŠGVË™mÎŐŇ$ůŇJęždéí¶2ŐÉ»FĎ€ť?·S‡6‡ť­­Ć4 $#µ5ĺ.¸+J7w2H8�­ĺi ›!«˘Ž˘(Ř‘4ŞRźşeqĽ‰Űś/ŐhD˛ë~b­ ·ô)¨0[ćś‚ţé\‘ÁSD[ÄQ†= ËŤµ ľţ›ŕ‹›­=±ejŞ#‘VѸ\ÉĂŇł±{a ‰uI8XóĄyÎř¸WNÄÉĚż¨ýaŃ{`~µµ]âÔĚŚöX áLŔ (p˘Śq2—RÎË–…ŕ3° ˙„SÚ:ßÔŁ.=›ŮöŁFpÚw™ŢĺĆ}šp ńď�Ů}•ĆS±đ �.ďš©ZŞ 6{“ećPXŽ»\TŐ±ÖČâ|ŃÍM¬*˛g¦üć ô ÇW­+©szL#öT¶Ł,Dń»˝{]7Ľ·ľĄ^ĹşÚN»/a@14ű^öźV7(»ş}ţę…˙Vä/Šäâóů¶YOcŞ9ôIä!,#đ˛ţş¸Â<<=” $^2DŢKżÍ,7ŚľË üwíĄQÂ+ŤźQ¬čŢAË8$ďň„Uű a:Ź…{tă˙4co‹ĎűË©]řŘ˝<˛Mb¦3Łš‰®č—ŮB4o÷IßŰaÁoAÜ'„ąńhŹĺ„ŤĆ6DtnxÜ>8űQnڱŕYβý»kt°äű˘¨<˙ř"63(‡Igń2ꤠkńŠgx»qL˙˙¸ňÝn“<őŽbď›­:sH0±(ąJ¦H7ń #˘RŽR -Ýź2”Ó˝qÓŞRĂ+8i;3íéqÁŢ€\Q ľŁĚ)ކąŘÝ.+×Ďâ9 íúÓqnBš†Ę7ŚĽK1ËžÎF¨GHř&8Ś‘ôĐÜD¬öFhČ< *|­Ô׺›/}ČtoXIşŠ¸uC«ňţ‘Ó¦ĆĘźŔoâcWÉcß:†é˝>© UÖ´8Ü2˙c)yÔ ç,®ÁSţ˝,ˇ'NÔc•$x~ŘkpđjĽv•h®»Ë§ň*]'ăSźGmX_zd2Ô/á@°şw"xŠGs“ůăŕTWD‚Ú®Ž—ÍXk¶["ş|'6›ń>B‚Ă/Ů&š”ĽĹ_Ű8’Ą 9C+7—f||¤ŠÇÓw„YśžAa$€ ‡ ď„  Hîm]ŁŇ´®% »öÇ÷…:ÚYš±źA ¶}[Ţ‘ęčÔ‹(j€É‹Š˛§É"qżc‹ířf¸C†\ś!äŐĚ(FA17ĆŃ&îßRé)ž<řçVY_;ÓńdźR‘˙8)ĂőéY”ݨśEDÇär®bü †Gĺ×ÂČ2ľ˛óC~ŇMHë%—;ÚE$¸HĂÉ%‘µdJˇSyĄ…@—ř3_?F€ţö;Ą2›ŤDlc¦\ě:btň®éřv{–ëăe[c¬pŮx  G&óY%ć^#ÉtSÝ»k´˙<Çő™·°Íô`xz<#AŮř“„DČŐ6W!úµóüúaŤôVNŞu 8Ąxť0Ä…ĺRäóç†đeÚuâ*Őgr–ÍžťČާ«ß~x;OVüĐVĂA;WlAHš¦áeE»f›ĎÚüU%¨Řk s'&çY­Ég˙|±¬`~lTąWÄZňk‚ňĂ•áäŻĎąp)ö!]ÝŞxGCh”ł¬ţd6ΖŤě2ŻĘOťˇř?[¦ŢŠĹ'˘˛Ž ‰)Xd» ă*čĄ Ç7=»~?Qí&Ě!śÔ?Ťrő8»Ą»>äl+Çpsrčůżc5맇čB˛m?$ý5“‡3´éŢ|ă˘Ők=mĂ’ćQę8­ęÖ´¨± ±ŢCÔ™ľ×x¬ ×îh¦ČĺŽyąSClď†Svđö'›[öжf’XÇ Ŕ"ÝŇiÉň&÷Rů2iÁúR+…'xľ}J5L;Łid}i} âÍQŢŃćVtÁ9el’ŽNq(-†Wvqč'ŮX) ‹Y·VYJ”[´nŕ®P3“xí-ýžm§łdşJű�• đŐ^vDÍýŹł eńn{$’1Ř1žÖşDO´&âŘäřŻ=uK`óJ(ˇW"ŇIM‚®ľť‚ű—ĐťhiJBLťżl~v¸¬TłuÓC0‹:đu•*Ă C^«ž6}Ń×Çf˘ŰĘŰ=ód: |7›’˛«OČŤ)ü¦<ŁŕÇÝáMĄŘ}đ‘5šăEł&ŇÓ)Aé çTĄµ9zi_ţĽ}ˇ‡]MŰZţuôúĐ%SÄJ[Ď"ĹË> ř—?ĂÔłđKŤ5Ł."#âĄWv`Ý~ń ă'e¶Í5.4ŃŐy,./S‘˘·™ęâÁő˝¶pލw™'ľ0=úŹl`­ďšę;Ž0Ą!B«ˇhéRÂUĆ)5éµHµýo ‰ŮúŁ)5QSy’ŁÄé¦k;+ŢźOŇß…Ă\gTö"Ł©˙Šŕ·7ř•çäôQŐFMfÍŘ.ĽTůLâîyռɦFAČ:ץŰZ˛») t.@R˝6Ë˙ĘŻC8ň?9mwF–ČQŃA:ŃHúh˝{÷ůíO«ÜÇGÄÉ.Ä^ý>jëż8ť˛čŮć6^`şáÚµ¤äčp8*]¸f ű‹#SąĆŞÜČÄ…oĎĹ1( }ˇDZ„€L¸ĄťíŘcçś5ľî�ŕ%Zżý4+·Yˇr 4ůq6ŞałIŤÖDCís™IEOOWgŽ'¬‹Ó.9/‘oÝ)Ś[=·¨“ >jp,ßůh2şC‹ÁĚ=V\?>ŕWŕ=%Řim§Â Ő=řuQó©(|–b« ąŚż­ćŐŞĺô[úY0DůíT­/oĐ …†IC‘†Á1¨1ť©§.µąăfĆyÔ!®űOö ý:˝PńŰľx�–VŠç€Ç8›D>wüX_°uToľž(YÜĚr¦¨ăo†ű›™;m‹:ŚiB]­l`‹©ĄôWogŕźţ 3áyěęRA¶¤-¦i=ÓřÉqc¸d&[‰\|‘Ćť`Ţé $)5ˇč|ńí_®ű‡»:ŤNrsJÂ*ĎOLy7HeaĚš]*Ĺ‚Ŕáj¬vÚýätÜEqĚ0ĺân1¬¸í@L3Ą¤óGbn4é» ó¤ą :÷ÔWOëŔU¦.Ű“o;ĽŁ@ů¤eqÁťA f7Chiŕ„Î^m ·­n»;Cď®ýá+żdř^+ěţ@ŮŐ[Í_­z0ě;šoäwÄ´ÎŐńö_ňNĆJ ŠŮ ü/sTo^¸”qY2ČAŚ€F€k˝«Č;:Ç“©ôÍľäśůh™A썞TNŕ[T•W*ž¨łÁâ~«µ¸ŞŹšÔôÝŘŕcEńĽeŃÁB1ůáĂśĹ-ńŇ5vq”›mć4”ä{ŞW‡T8†ŠMďGyJÇ>`mľjMV‰s»™fłrJ0řńĹMŚú'¨™*ZˇYFr¦Nr¦Ämz/„- ‹É„IúĄýg®Ě“°¬:˘”Ě>,y:(«¸Ŕ1OÇWŽy×,Sä- ¦ě*đëk3ľĺZŠŞ?ĚbkŔő}łoŢëbĺÇužgć‰ŕ€W°î1ŢQś?GRđz*F덡¸l~Ŕ ±MTZ1sQŇą1™_”čϢ$ E[ŢĂţŞ6!ÝÔíž ńďś8pVzvfÖĆÚź^°ˇß$Ď>6$ŰA ľ—­h«wD°Ůâ›h:ODčX!‡XqČ1É:˘ő`ŁšĹ|ŤD°çÚń2tž1HřëŹĹ¤<€Üżş?˛O?K«.&bFܸšdZ´Í'µog° —Č…őŤ:ěŔ”Qś{ˇ~ţÍ­0Ł‹Ľ !SM·âňóuź\.3¦TďĚR  ČwJľ$xŽŤ›´ă68.%}”αŻŐˇ)¨*ćO¶­Ń€MŢůľ}Pš;ör¸M¶Ş čľîw™xx—Ęĺp‘1ăkśYmlK5ÄÇŚůlŹŰŮ€1¦' ™˙8µČVÝEŽÔ/2ż%ćď‘?ďŘ+őU¸ą[¶Á;ŹEőĎTR«ő´ÜńŞukN§ăý8jzŔÚTҤ•Íďęx¶†¸;Ŕ)«mśl6ośZ˘`T őz DdTüą·hšÂM|őˇďĽ—žřžĘü@÷„Zâ8ëBÄÂŁzÁ¤÷×gçřô ë”âÍç ĂY§:VŔż»ÖĂse~ťŰMލ ”s3Vnj? Č‘ÁĂ_GÝŔTßŔÓGj˙O‹‘(±äë&ĺ AEśłoůšlLv‰ÜËL’¤HMĚb-'˛Ą´1!4­ľc.ő˘�¨•BqĐŞëRa´r/쑔ɟ0®sţ±{ů‘d…‚A±ű9ń:Ö™s(of>{ «BĚ&fvVäŘŔFČ´OÇfß9&°;ąą`»†ŁááÓĄ¤e±Ý?[ËČł‹ěľ�Ś›{ů©MPď»+7†őŮšť!Ů-2’ů"—ľnŽÂ®>śÔýńy{&jg®=čýöGd2Sž_>Őş)ş­fŔÍŔ«¸ăą·Lż¶ŮlęÔźNcgWöW“ţľQ˘q0Í[¶fJ˝’7č\»™K~z­*łÁÝŻ Ë kBúgA;±ř×1ďh˙ŐzŤ#ńĘ{š#ťęąO7%:ŚzqÚpAÔ&E20ńóCÇ­ą$[¨Q= Q^ĆkQŔŰ‹mP�çÓ62yĘ3H_‚á´Ö 0]č»H˝QË”®îŻGĹ @Áźá "őěÚŚ|ăĘŔeő 1tx8˙He!¤Č/]č°@o¨*ŕ»{ |ŽĽžUÝZś)W›+Ź'«!°<›¸í¤ÖŤeřšéuw“­7 ŚŐ–RDDě¤6–Ň™Iµ;d†•°468sÇ*Ç&ĘşôMwoŘ&n±NUvT‹il|çPBŤÔmľ(:‘7='ý¬řDáëy?Đă´ýëłić>ĆY ZĹ \qô,ščP€`¶˛K"iN^čŇ0÷ĽŽď¤Bdv!­¶hŹďpíżŹÄ©Büäěr1ÇĹéK0-ˇQ¸űXLiz5Q qÔ›á0K˝wŘÖ}Đ*ŤĎ&I”#r7é™6 ć PóŻy ,¬?©7�¶âEšfĄd¤^SÇĺeQCčcíŕĆ©W1/i‚c2+Łö˝H©úˇe^Í×ídbNý^âlćp˛#XMRŚ”‡9-ř 0Áź–.:(“›ů†snUőŠ.[ÖqlMŘI�Q~ľsyŮm‹íAÜ;Ě”÷ŃQ0*•Ď5•ĐÄ=^đ„(Đm9ŃŠ‰ň$zÂá§äާCdyżI<c!ćą*ýősE;±Ź’†t 2ÝęiôŁâ<[B&kí˝˘Éx¤2‰pă˙Ě_d ¬ÁĺqJMiĄýpq‡ŽŠďĄÄ>zúĄ”şřX:“ÜkťW âŇB-Ţ[,äĆ…_WQŞ}@íĎU>k,Řý˘EzR&őÔó “u˘ ^´ŕݬzi\Ň\‰Ž4†˝gĹşťήX#i AE÷Wşç$šEşyoÝ««kąýő.î…\ŢČ3đ4>ěx·‡gÝcŢpG!C;üZŚ‹|ďáƶA& PĚ3!±¬†ß±hˇôžO?ž~b€~ŕÝMCŮŚŠxc¶ţ,1ˇ#’ŇçRN1 G=M˘ký+�ôá6?·˝ľ=‚S@yTĎÁ>‡Ţs!Ż5‘CKĹdĘŢ -j+%s~،ɵÓFbňž YHęĺRSŇřć|uz®ÖĂČ«�µ¨M<7wIQ×)R âČkiŠ… čëi¤.ďŕ›Çh~ĚPҧĄ3xAňŠşĂĘV/Ówî[RwrľŚ®ŽÖ đ9řÓ•ëń´ź˛&ţHËě3 Ľ%NŇJż/zB¸ĺ'ţńŃ‚áÖĆĄňMęD%ř[zůíß?_šŘĎ#b?—â~FHu\qÝýÉX˛r候x¦B妸0ë»ËJ¬]Ş{QÁÉ‹öH›áťńűÎ#C‰h0Ě?ŞŠ c˘ôÓŤ˙Ű~ő5jŘ̸ľrb"°~żĂ&ŰŐ(GăţÔü/×[rłďł7} >ë=cobv\y/8 Řwvpk0����� ����������������)"ýÓí¬[ŕ×Ŕ(5âŃfµ/éűŘHAPETAGEXĐ��›��������� �������� �������Artist�Lorna Hunt�������Title�Long Hard Road (excerpt)�������Album�All in One Day�������Track�1�������Year�1999APETAGEXĐ��›���������€�����������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/duplicate_id3v2.aiff�������������������������������������������������������0000664�0000000�0000000�00000017674�14447736377�0020767�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������FORM��´AIFFCOMM������ }�@¬D������SSND��ů�����������˙ű�˙ý���˙˙˙ţ�˙ú�˙ů�˙ű�˙ű�˙ţ���˙ú�˙ü��˙ý�˙˙�������˙ţ�˙ü�˙ţ�˙ý�˙ů�˙ü��˙ý�˙ţ�˙˙�˙˙���˙ţ�˙˙���˙˙����˙˙�˙˙˙˙�˙ţ��˙ű�˙ů�˙ű���˙˙�˙ý�˙ű�˙ú�˙ü�˙ü�˙ü�˙˙�˙˙�˙ţ�˙ü�˙ý�˙˙�˙ţ�˙ţ�˙˙���˙˙�˙ý�˙ý��˙ý�˙ü�˙ü�˙ý����˙ý�˙ü�˙ý˙˙�˙ţ�˙ţ˙˙�˙ü�˙ü�˙ü�˙ú�˙ű�˙ţ˙˙�˙ü�˙ý�˙ţ������˙ţ�˙ű�˙ü��˙ü�˙ţ˙˙�˙ý��˙ţ�˙ţ�˙ý�˙˙����˙˙�˙˙�˙ý�˙ţ�˙˙���˙ü�˙ű�˙ý��˙ţ�˙ţ���˙˙�˙ý�˙ü�˙˙�˙˙�˙ţ���˙ţ�˙ű�˙ú�˙˙˙ý�˙ů�˙ý���˙ţ��˙˙�˙ţ������˙ţ�˙ü�˙ý�˙˙�����˙ţ�����˙˙�˙ű�˙ú�˙˙˙˙�˙ý�˙ţ�˙ý�˙ţ�˙ţ������˙ţ�˙˙���˙ţ�˙ý�˙ţ�˙˙���˙ţ�˙ý��˙ţ���˙ý�˙ü�˙ý���˙ţ�˙ü�˙ü�˙ý�˙ý�˙ü�˙ţ���˙˙�˙˙�˙ý�˙˙���˙˙�˙ţ�˙ţ���˙˙���˙ý���˙ý�˙ů�˙ü�˙ţ�˙ţ���˙ú�˙ú�˙ű�˙˙�����˙ý�˙ř� ˙÷�˙ü��˙ü�˙ţ���˙ţ�˙ú�˙ű���˙ý�����˙˙�˙˙�˙ý�˙˙���˙˙˙˙�˙˙�˙˙�����˙ý�˙ü�˙ü�˙ţ����˙ţ�˙ű�˙ý�˙ý��˙ţ�˙ý��˙˙���˙ţ����˙ţ�˙ţ��˙ü�˙ţ��˙ü�˙ţ��˙ý�˙ü�˙ü�˙ţ�˙ţ��˙ý�˙ý�˙˙�����˙ţ�˙˙���˙˙�������˙˙�˙ü�˙˙˙˙�˙ü�˙ű�˙ü�˙˙���˙˙�˙ţ�˙˙���˙ý�˙ú�˙ţ˙ţ�˙ű�˙ţ�˙ţ�˙ţ�˙˙�˙ţ�˙˙���˙˙�˙ü��˙ý�˙ű���˙˙��˙ü�˙ú�˙ţ�����˙˙�˙˙�˙ü�˙ű�˙ü�˙ü�˙ű�˙ú�˙ű�˙ü�˙˙˙˙�˙˙�˙˙�˙ý�˙ý�˙˙�˙ţ�˙ý�˙ü�˙ţ����˙˙�������˙ţ�˙ű�˙ű�˙˙˙˙��˙ţ�˙ý�˙ţ�˙ţ���˙ţ�˙ý�˙ý�˙˙����˙˙��˙ý�˙ú�˙ţ˙˙������˙ţ���˙ü�˙ü�˙˙�˙ý�˙ý�˙˙˙˙�˙˙�˙˙���˙ý�˙ý�˙ţ�˙ý�˙ü�˙ţ������˙ţ�˙ý�˙ű�˙ü��˙ý�˙ü�˙ü������˙ý�˙˙������������˙ţ�˙ü�˙ţ�˙ţ�˙ţ�˙˙���˙˙��˙ü�˙ú�˙ţ�˙ý�˙ü�˙˙�������˙˙�˙˙�˙ţ�˙ý�˙ţ���˙˙�˙ţ�˙ţ�˙ý�˙ţ�˙ţ�˙˙�������˙˙�˙ţ��˙ţ�˙ý���˙ţ�˙ţ���˙˙���˙ţ�˙ý�˙ţ��˙˙���˙ţ�˙˙�˙ţ�˙˙�����˙ý�˙ü�˙˙��˙˙���˙˙���˙ű�˙ü��˙ţ���˙ţ�˙˙�����������˙ţ�˙ţ���˙ü�˙ü���˙˙�˙ü��˙ű�˙ř�˙ý˙˙�˙ű�˙ű�˙ţ�˙˙�˙˙�˙ý�˙ţ�˙˙�˙˙�˙ý���˙ý�˙÷� ˙ř�˙ű�˙ü�˙ţ�˙ý�˙ű�˙ű�˙ű�˙ý�˙ţ�˙ý�˙ţ�˙˙��˙˙��˙ţ�˙˙˙ţ�˙ů�˙ű�˙ý�˙ű�˙ű��˙ý�˙ý���˙˙��˙ý�˙ü��˙ü�˙ű���˙ţ�˙ţ���˙ü�˙ú�˙ü������˙ţ������˙ý�˙˙��˙ü�˙ý���˙˙�����˙˙�˙ü�˙ţ�˙˙���˙ţ�˙ý�˙ţ��˙˙��˙˙��˙ţ���˙˙��˙ý�˙ţ�˙ţ�˙ý�˙˙˙˙�˙ý�˙˙��˙˙�˙˙�˙ý�˙ţ�˙ů�˙ř�˙ü�˙ţ���˙˙��˙ţ�˙ţ��˙ţ�˙ü�˙ú�˙ţ˙˙�˙ű�˙ý�˙ţ�˙ţ�˙˙�˙ý�˙ű�˙ü�˙˙�˙˙����˙ţ�˙ý�˙ţ�˙ü�˙ü�˙ţ���˙ý�˙ú�˙ü�˙˙�����˙ţ�˙ţ���˙˙�����˙˙�˙ű�˙ü�˙ţ���˙˙�˙ţ�˙ţ�˙ţ˙˙�˙ţ���˙ý�˙˙˙˙�˙ý�˙ű���˙ý�˙ý�˙˙�������˙ţ�˙ű�˙ţ���˙ţ�˙˙�˙ý�˙˙�����˙˙˙˙�˙ű�˙ü��˙ý�˙ý���˙ý�˙ů�˙ü���˙ý�˙ý�˙˙���˙ţ���˙ý�˙ý�˙ţ�˙ţ���˙ţ�˙ý�˙˙���˙˙�˙˙˙˙�˙ű�˙ű�˙ü�˙ů� ˙÷�˙ű�˙ţ�˙˙˙˙�˙ú� ˙ö�˙ű��˙ú�˙ů�˙ý�����˙ţ�˙ý�˙˙˙˙�˙ţ�˙ţ���˙˙�˙˙�˙ý�˙ý�˙˙˙˙���˙ý�˙ý���˙ü�˙˙���˙ţ�˙ţ�˙˙���˙ţ�˙ý�˙˙�˙ţ�˙ü�˙ţ�����˙˙�˙ţ�˙ý�˙ű�˙ţ���˙˙�˙ţ�˙ü�˙ţ˙˙�˙ý�˙ţ�˙ţ�˙ü�˙ü�˙ý������˙ţ��˙ţ�˙ú�˙ü��˙ű�˙ú�˙ý�˙ţ�˙ý���˙ţ�˙˙�˙˙�˙ü�˙ý�˙ţ���˙ţ�˙ý�˙ü�˙˙�����˙ý�˙ý��˙ý�˙˙˙˙�˙˙˙˙�˙ý�˙ţ���˙ý�˙ţ���˙ý�˙ý�˙ţ�˙ţ�˙ý��˙ţ�˙ţ��˙ý�˙ű�˙ü�˙˙�����˙˙�˙ý�˙ú�˙ű���˙ţ�˙ý�˙˙�˙ţ�˙˙˙˙�˙ü��˙ü�˙˙˙˙�˙ů�˙ú�˙ý�˙˙�˙˙�˙˙�˙ţ�˙ţ�˙ţ�˙ţ�˙ű�˙˙���˙ú�˙ű�˙ý�˙ţ�˙ü�˙ü�˙ý�������˙˙�˙ý�˙ú�˙ú�˙ý�˙˙�˙˙���˙ţ���˙˙��˙ý�˙ţ����˙ţ�˙ţ���˙˙�˙ţ�˙ţ���˙˙�˙ţ���˙ţ�˙ţ���˙ţ���˙ţ�˙ü���˙ţ�˙ű�˙ů�˙ü���˙˙�˙˙˙˙�˙ý�˙ü�˙ţ�˙˙�˙ţ��˙˙�˙ý�˙ý�˙˙���˙ţ���˙ţ�˙˙˙˙��������������������˙ţ��˙ý�˙ţ˙˙�˙ü��˙ţ�˙˙˙˙�˙ü�˙ţ�˙ý���������˙˙���˙ţ��˙ü�˙ú�˙ý��˙ţ��˙ţ�˙˙˙˙�˙ţ���˙˙�˙˙�˙˙���˙ý��˙ü�˙ý��˙ü�˙ű�˙ţ�˙ţ�˙ţ˙˙�˙ů�˙ú�˙ţ�˙˙�˙˙˙˙�˙˙�˙ţ���˙ţ�˙ţ�˙˙�˙ţ�˙ý�˙ü�˙˙˙ţ�˙ú�˙ý���˙˙�˙˙���˙ü�˙ý���˙˙���˙ü���˙ţ�˙ü�˙ü�˙ţ��˙ű�˙ú�˙ţ˙˙�˙ţ�˙˙�˙ţ�˙ü�˙ü�˙ű�˙ű��˙ý���˙ý�˙ű�˙˙����˙˙�˙ţ�˙ţ�˙ţ��������˙ţ�˙ţ�˙˙���˙ţ��˙ţ���˙˙�˙ý�˙ű�˙ü�˙ţ���˙˙�˙˙˙ţ�˙ů�˙ů�˙˙˙ţ�˙ţ˙˙�˙÷� ˙ú�˙ý�˙˙���˙ţ�˙˙���˙ţ�˙ţ�˙ţ�˙ű�˙ý�˙˙�˙ţ�˙ý���˙˙�˙ý��˙ü�˙ý�˙ţ�˙ţ�˙ű�˙˙˙˙�˙ű�˙÷�˙ů�˙˙���˙ţ���˙˙�˙ü�˙˙˙˙���˙˙�˙˙���˙ţ�˙ü�˙ţ�������˙˙�˙ü�˙ü�˙ţ�˙ý�˙˙˙˙���˙˙�˙ý�˙ý���˙ţ�˙ü�˙˙��˙˙�˙ű�˙ü��˙ţ��˙˙�������˙˙�˙ţ��˙ţ�˙ü�˙ţ�˙ý�˙ý�˙ý�˙ţ�˙ý�˙ú�˙ü�˙˙�˙˙�˙ţ����˙˙�˙ý�˙˙�˙˙�˙ý�˙ý��˙ţ�˙ý�˙ţ��˙ţ�˙ü�˙ţ�˙ü�˙ţ�����˙ţ�˙ů�˙ü�˙ţ�˙˙���˙˙�˙ý�˙ý�˙ţ�˙ý�˙ü�˙ý�˙ţ�˙˙�˙ý�˙ţ��˙ţ�˙ţ�˙˙�˙˙���˙ý�˙ü�˙ý�˙ţ���������˙˙�˙ý��˙ţ�˙˙�˙ţ�˙ű�˙ú�˙ý�˙˙�����˙˙�˙ţ������˙˙���˙ţ���˙ý�˙ů�˙ý�˙ţ�˙ý�˙ü��˙ý�˙ţ�����˙˙���˙ţ���˙ţ�˙˙���˙ţ�˙ţ�˙ţ�����˙˙�˙ý�˙ű�˙ú�˙ţ���˙˙���˙ý�˙˙�����˙ý�˙ú�˙ü�˙ý�˙˙�˙˙�˙ý�˙ű�˙ţ�˙ţ���˙˙�˙˙˙˙�˙ţ��˙ţ�˙ţ�˙˙����˙˙�˙ü�˙ű�˙ý�˙ţ�˙ţ�˙ţ�˙˙�˙ţ�˙˙�˙ţ�˙ý�˙ţ���˙˙�˙˙�˙˙�˙˙˙˙�˙ü�˙ü�˙˙��˙˙��˙ţ�˙ý�˙ţ�˙ý�˙˙˙˙�˙ý����˙ý�˙ű�˙˙��������˙˙�˙ţ���˙ű�˙ů�˙ü�˙ý��˙ý�˙ý��˙˙���˙ţ�˙˙���˙ţ�˙˙�˙˙���˙ţ�˙ý�˙˙��˙˙�˙ü�˙ú���˙ý�˙ů�˙ţ���˙ý�˙ţ�˙˙���˙ţ�˙ţ�˙ý���˙ţ�˙ý��˙˙�˙ţ�˙˙���˙ţ�˙˙���������˙ţ�˙ţ��˙ý�˙ú�˙ü�˙ý�˙ý���˙ţ�˙ü�˙ű�˙ý��˙˙�˙ý�˙˙���˙˙���������˙ţ�˙ý�˙ú�˙ý��˙ý�˙ú�˙ú�˙ű�˙ú�˙ţ���˙ţ�˙˙���˙ý�˙ů�˙ú��˙ű�˙÷� ˙÷�˙ü�˙ý�˙ű�˙ű�˙ü�˙ü���˙ý�˙ý���˙ţ�˙ý�˙ţ�˙˙���˙˙�˙ţ�˙ý�˙ú�˙ú�˙ý�˙ţ�˙˙�˙˙�˙˙�˙ý�˙ü�˙˙˙˙���˙ţ�˙ű�˙ý�˙ţ�˙˙�˙˙�˙ý�˙ţ���˙ý�˙ţ���˙˙�˙ű�˙÷�˙ü���˙ţ�˙ţ�˙ţ�˙˙�˙ţ��˙ý�˙ú�˙˙˙ţ�˙ţ���˙˙�����˙ý�˙ű�˙ü�˙ü�˙ţ�˙˙�˙ţ���˙ţ�˙ý��˙ú�˙ú�˙ţ˙˙�˙˙˙˙�˙ű�˙ű�˙ţ�������˙˙�˙ű�˙ű�˙ý�˙ý��˙ü�˙ţ˙˙�˙ţ���˙ü�˙ý�˙ý�˙ţ�˙˙����������˙˙�˙ţ�˙ü�˙˙�����˙ţ�˙˙˙˙�˙˙���˙ţ�˙˙���˙ü�˙ű�˙ţ�˙ţ�˙ü�˙ý�˙˙�˙ý��˙˙�˙˙�����˙˙�˙˙�������˙˙�˙ţ�˙˙�����˙ţ��˙ý�˙ú�˙ú�˙ű���˙ý�˙ý�˙˙˙˙�˙ţ���˙˙���������˙˙�˙ü�˙ú�˙ý�˙˙�˙ü�˙ý���˙ý��˙ü�˙ý�˙ţ�˙ý�˙ü�˙ý�˙˙��˙˙������˙ţ���˙ý�˙ý�˙ţ����˙ţ�˙ř� ˙ú��˙ţ���˙ü�˙ü�˙ü�˙˙����˙˙�˙˙�˙ţ���˙˙���˙ţ�˙ý�����˙˙�˙ý�˙ý�˙ü�˙ţ�����˙ţ�˙ţ��˙ţ˙˙�˙˙���˙ţ��˙ţ�˙˙�����˙ţ�˙˙�����˙ţ�˙ý�˙˙�˙ý�˙ű�˙ü�����˙˙�˙ű�˙ý���˙ü�˙ţ���˙ý�˙ý�˙ţ���˙ý�˙ů�˙ú��˙ü�˙ü�˙ţ�˙ü�˙ü����˙ţ�˙ý�˙ý�˙ü�˙˙˙˙�˙˙���˙ű�˙ú�˙ü�����˙˙�������˙˙�˙ţ�˙ý�˙˙˙ţ�˙ý���˙˙˙˙�˙˙���˙ű�˙ý�˙˙�˙ý�˙ú�˙ü�˙ý��TEST����ID3 ��>ID3����4TIT2������Title1TALB������Album1TPE1������Artist1����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������id3 ��>ID3����4TIT2������Title2TALB������Album2TPE1������Artist2������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/duplicate_id3v2.mp3��������������������������������������������������������0000664�0000000�0000000�00000023632�14447736377�0020550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����]TALB�����˙ţA�l�b�u�m�X�X�X�X�TPE1�����˙ţA�r�t�i�s�t�X�X�X�X�TIT2�����˙ţT�i�t�l�e�X�X�X�X�PRIV���'��WM/WMCollectionGroupID�mkÝóW ë@¬d&ć`ˇPRIV���Š��WM/UniqueFileIdentifier�A�M�G�a�_�i�d�=�R� � �1�0�9�6�4�3�9�;�A�M�G�p�_�i�d�=�P� � � � �1�3�4�8�4�;�A�M�G�t�_�i�d�=�T� �1�1�1�2�1�0�0�7���PRIV�����WM/Provider�A�M�G���PRIV���'��WM/MediaClassPrimaryID�Ľ}`Ń#ăâK†ˇH¤*(DPRIV���"��WM/WMCollectionID�mkÝóW ë@¬d&ć`ˇPRIV�����WM/WMContentID�ź6)$myI˘áěäžöüÝPRIV���)��WM/MediaClassSecondaryID�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3���� �TIT2���1��˙ţJ�o� �O�n�e�s� �U�g�l�y� �A�f�t�e�r� �2� �A�M�TPE1���'��˙ţL�e�f�t� �W�i�n�g� �F�a�s�c�i�s�t�s�TRCK������7/11TALB�����˙ţA�l�l� �F�i�r�e�d� �U�p�TPOS������1/1TDRC�����˙ţ1�9�9�1�-�0�1�-�0�1�TCON��� ��˙ţP�u�n�k�TMED�����˙ţD�i�g�i�t�a�l� �M�e�d�i�a�TXXX�����˙ţS�C�R�I�P�T���˙ţL�a�t�n�TXXX���e��˙ţA�c�o�u�s�t�i�d� �I�d���˙ţ4�5�b�e�3�3�6�e�-�5�1�d�a�-�4�f�b�8�-�9�d�5�d�-�1�1�c�5�2�d�7�d�8�0�a�1�TXXX���=��˙ţM�u�s�i�c�B�r�a�i�n�z� �A�l�b�u�m� �T�y�p�e���˙ţa�l�b�u�m�TXXX����˙ţM�u�s�i�c�B�r�a�i�n�z� �A�l�b�u�m� �A�r�t�i�s�t� �I�d���˙ţ1�f�c�5�5�b�7�b�-�d�e�c�1�-�4�8�0�f�-�8�5�9�9�-�5�c�1�a�c�8�3�1�3�c�0�6�TXXX���y��˙ţM�u�s�i�c�B�r�a�i�n�z� �A�r�t�i�s�t� �I�d���˙ţ1�f�c�5�5�b�7�b�-�d�e�c�1�-�4�8�0�f�-�8�5�9�9�-�5�c�1�a�c�8�3�1�3�c�0�6�TDOR�����˙ţ1�9�9�1�-�0�1�-�0�1�TSO2���'��˙ţL�e�f�t� �W�i�n�g� �F�a�s�c�i�s�t�s�TPE2���'��˙ţL�e�f�t� �W�i�n�g� �F�a�s�c�i�s�t�s�TXXX����˙ţM�u�s�i�c�B�r�a�i�n�z� �R�e�l�e�a�s�e� �G�r�o�u�p� �I�d���˙ţ1�b�4�f�b�8�d�f�-�a�3�c�a�-�4�d�0�0�-�b�2�2�b�-�8�a�5�a�2�2�8�2�b�1�5�0�APIC��]���image/jpeg��˙Ř˙ŕ�JFIF��Č�Č��˙Ű�C�    $.' ",#(7),01444'9=82<.342˙Ű�C  2!!22222222222222222222222222222222222222222222222222˙Ŕ��F�F"�˙Ä��������������˙Ä�B��  ������!1"AQ±#4asŃ$23Sqr‘’%BCRTbˇ˘˛ÁŇáń˙Ä�������������˙Ä�)� ���������1q!#3Q‘ASÁ˙Ú� ��?�Ayä°ĘÝP%)6¨ßâźf÷č>5×ońýĂáJ Rôहšď–ů öZ‘Ť;®hdN;vłO\ńŐÚ¬U„·¬¶í¸ú#cÝÍqeěf$úŐ)Ph]jRJ…Č:E…É7`;)Š6WĆâ°âĽÂx)XHR´Ącúˇ�(qą°Ú¬ŮDů\r×ĺz!UŤGFęiŕ8ŕ|kĎËŃ~ÍďÚ>50¬’ĄFyL±=;%/%Ć%?1÷ťďK30ˇ Jó€°‚˘ó*6OuÇţѲqË_•čî8üOłöŹŤŠOŐ˝úŤFŚÇš.Dy™6IQBe€;ŇÚőŤ”CŽZüŻC«NJŔ6P^Š×Őü đ˘–x› Rr‚“űF& Á‘îŐáJŤ·­a sMs}JG»W…/á*Cx´G] ©¤<…,:.‚…őŃLQŔËévFYrOg ĂË.©SwPKEiAŇť¬U¤'ô=ôä3Öć!ćŹÎi–Ń ‡ 6ZŤú·ŕ[ŞoÁ˝V ů2Ěłß—ÓbB,Uľµ�óŞô‡QZG~űžĂV äú<,şţ3vTwG]=PćăkŤěy< ł‘ź3ś0¸9ŹQ}“Ň:Ť€ŘqĂbE”¤’ŤVżxä_aBĄůř"ăspË2č-żࢇŔ°Qą&çPľ vWâ®čř¨ďaěc§ĄP uRĄĄ)t[qk{9˝WYŻÉÔě=ů3Q1ÉjuĎBŽ…jqdÜ˙�5*`7Řo˝¸©@&ľ…bQq 5Ĺ­‚C¬•‹EĐ®ÂG܂׵zǡ!+ʉĆa-Bž’ăhOP6Z}–;Źaí‘2Î6%ËŚ–!%bB‘!#[jIµÂNé$j=›÷\’â&äÇë†ÍPiJ Ů·-dÜsşIđÚ€6CőF|(¬Ä4gđ'ŠEâtz Ą‘ćo©H÷jđŻ9 Ó&zí8\‡u$R„•q}řî;ęő7Ôd{µxRÜ9’pé ‘Ųú,¤-&ÄS4p3:C݆E—+;9‰+Ěžű©/(Ç–Ę„T´ ,Ť*UQŐ«Ľ[‹–ÜšüéNMN#,m% ¶Ž—RÖRAÖVŃ#‹°;ÜZŞH™Ţ{l*$Ć"K†Ą…t.°ť(<] ZĆ›p\Ď–ˇĂéăkŤ%ĺ+§h¨ˇ´ě-ˇ (Ú÷íćý–Ó<8áÂäËÄăÂ[ dŮ}azm¶ 5l8UÔďŘ%ńůËcl' ť%O©-©¨k)[z·'ZNĂb6ÚöoUjsüT­Ö™Ëń(d …u·Ň®˛GŐlĚąÇ3şŰl« —‡,ć¶’¤w!IŘ‹ µnNÂÂĹŔ<ĂÁ›…ɇ5 Î_BHb[6Sh"Ä:Fę?KšAĎ9G,áZ—$L}r_q$€Röëí~ďm)ż›ł¶ý>+ §‚˝$ööVŚ0ÍĚS›“3Bz&’ËM¶,” v î{w4LÄőF}Ú|(˘©łîÓáE#,NŹAtŁ’3,éńíW…*ɦX'”‹qŮNŤáî⎢ziD2ŤFĂR¶ýk‡ňo™0‰ŤĹ\/8uÄ)hνA"ćĂ›ŽîŰízbŽcHWVE+Öob+®6:b¨‘^|!%K ¨¤IµIa9f|ĚEŽÇ[=ő}:JąăkťĹ¶®3äŽOn;S›Ä1$)8k "ôjU‰Jmcpmż°qVxťn39ô)‰*…>;}R} űyź4±š]ĆňďňmLáÖ gÉŰRŤ®8ú$ínŢj'qlAč±Ô¬9ű©Uô8@í öoě âDw±D|§ŠáDÍŐyE6D–MÁ<nxě$ömŞW’1,%ĽS/IqIq:ŃbBTFü(mľÖ¸ÇšŽŔ3´–ŕ1ű/Í®Q=m†×˙�WöĄ|™)”´ €’Úmd-anëT>D¤|ć"?ć’QѾǣqßJ“±{E/™7͵˙�¶˝ţłE$ń:EÔrGi–̨ëĐó+6«eplvćźó;„b`›Ü|Ý®mW«Ú ”)UiÔŠy¤ČćIb|ąÍ:[“-EO-� D›’-°7îµnsÄÜQZçČ+ ˝gQŤů˘Š5ĄäŻrł~qôŚ'š2ˇtŤ©™CÓ…˛…)zŐ÷o·"ˇ~J†OÔ˙�üh˘Ťiy ĘÍůÇŇ65;+ÔŰa'ď&š›Ď‘¦ô#!"˙�Đ·˙�(ŁZ^Crł~qô9•%Ů/Ż[ά¸µZ×Q7'ő˘Š*ą\Ź˙ŮUFID���;��http://musicbrainz.org�a00754f0-f4f4-4e7f-9cf7-72800fb9a474TSOP���'��˙ţL�e�f�t� �W�i�n�g� �F�a�s�c�i�s�t�s�TXXX���w��˙ţM�u�s�i�c�B�r�a�i�n�z� �A�l�b�u�m� �I�d���˙ţf�a�0�c�5�3�5�c�-�8�b�f�a�-�4�7�9�5�-�a�2�6�d�-�9�9�c�b�6�c�8�4�9�7�e�7�TPUB�����˙ţS�k�y�r�a�t� �M�u�s�i�c�TXXX���M��˙ţM�u�s�i�c�B�r�a�i�n�z� �A�l�b�u�m� �R�e�l�e�a�s�e� �C�o�u�n�t�r�y���˙ţU�S�TXXX���G��˙ţM�u�s�i�c�B�r�a�i�n�z� �A�l�b�u�m� �S�t�a�t�u�s���˙ţo�f�f�i�c�i�a�l��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙űd�đ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙ű’dľŹđ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙ű’d˙Źđ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙ű’d˙Źđ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙ű’d˙Źđ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/duplicate_tags.wav���������������������������������������������������������0000664�0000000�0000000�00000041234�14447736377�0020653�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFF”B��WAVEfmt �����č�� ����datal9��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3 >��ID3����4TIT2������Title1TALB������Album1TPE1������Artist1����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������id3 >��ID3����4TIT2������Title2TALB������Album2TPE1������Artist2����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������LIST4���INFOIART���Artist1�INAM���Title1��IPRD���Album1��LIST4���INFOIART���Artist2�INAM���Title2��IPRD���Album2����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/empty-seektable.flac�������������������������������������������������������0000664�0000000�0000000�00000011000�14447736377�0021052�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������fLaC���"�����<Np%6RŹÔ¨ÜRů’B "oťäřŃ�����( ���reference libFLAC 1.1.3 20070917����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙řÁ�Ç��������Űr˙řÁŔ��������¨F˙řÁÉ��������=˙řÁÎ��������N.˙řÁŰ��������—§˙řÁÜ��������ä“˙řÁŐH���������������çŻ(tpL?™{q˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‡˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ř˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙€@ Ä�� @ A�#%$(€Y�€ i!‡ ívEd)QĄ„VR#ŁE$ßń?f8ť•2xH¨ÖdĘÓT¤9¤ěCˇ•)Šg7ŃĽ‚ \Kś#Ó.i)–’+"ĐáćŞĚą»t‰ó*R:3™QŻ7ŤióxÖm»r;jËđa[HŠ!Ä(‘Äú&­a"XŚ)¨c˛ZK¤1 %»n‘Ž$(ŠšÂzĚ(ťľČ˘ %ą:%ć]Ć:$šs*'K©ĆŠ!ÍŰćtaglib-1.13.1/tests/data/empty.aiff�����������������������������������������������������������������0000664�0000000�0000000�00000013460�14447736377�0017131�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������FORM��(AIFFCOMM������ }�@¬D������SSND��ů�����������˙ű�˙ý���˙˙˙ţ�˙ú�˙ů�˙ű�˙ű�˙ţ���˙ú�˙ü��˙ý�˙˙�������˙ţ�˙ü�˙ţ�˙ý�˙ů�˙ü��˙ý�˙ţ�˙˙�˙˙���˙ţ�˙˙���˙˙����˙˙�˙˙˙˙�˙ţ��˙ű�˙ů�˙ű���˙˙�˙ý�˙ű�˙ú�˙ü�˙ü�˙ü�˙˙�˙˙�˙ţ�˙ü�˙ý�˙˙�˙ţ�˙ţ�˙˙���˙˙�˙ý�˙ý��˙ý�˙ü�˙ü�˙ý����˙ý�˙ü�˙ý˙˙�˙ţ�˙ţ˙˙�˙ü�˙ü�˙ü�˙ú�˙ű�˙ţ˙˙�˙ü�˙ý�˙ţ������˙ţ�˙ű�˙ü��˙ü�˙ţ˙˙�˙ý��˙ţ�˙ţ�˙ý�˙˙����˙˙�˙˙�˙ý�˙ţ�˙˙���˙ü�˙ű�˙ý��˙ţ�˙ţ���˙˙�˙ý�˙ü�˙˙�˙˙�˙ţ���˙ţ�˙ű�˙ú�˙˙˙ý�˙ů�˙ý���˙ţ��˙˙�˙ţ������˙ţ�˙ü�˙ý�˙˙�����˙ţ�����˙˙�˙ű�˙ú�˙˙˙˙�˙ý�˙ţ�˙ý�˙ţ�˙ţ������˙ţ�˙˙���˙ţ�˙ý�˙ţ�˙˙���˙ţ�˙ý��˙ţ���˙ý�˙ü�˙ý���˙ţ�˙ü�˙ü�˙ý�˙ý�˙ü�˙ţ���˙˙�˙˙�˙ý�˙˙���˙˙�˙ţ�˙ţ���˙˙���˙ý���˙ý�˙ů�˙ü�˙ţ�˙ţ���˙ú�˙ú�˙ű�˙˙�����˙ý�˙ř� ˙÷�˙ü��˙ü�˙ţ���˙ţ�˙ú�˙ű���˙ý�����˙˙�˙˙�˙ý�˙˙���˙˙˙˙�˙˙�˙˙�����˙ý�˙ü�˙ü�˙ţ����˙ţ�˙ű�˙ý�˙ý��˙ţ�˙ý��˙˙���˙ţ����˙ţ�˙ţ��˙ü�˙ţ��˙ü�˙ţ��˙ý�˙ü�˙ü�˙ţ�˙ţ��˙ý�˙ý�˙˙�����˙ţ�˙˙���˙˙�������˙˙�˙ü�˙˙˙˙�˙ü�˙ű�˙ü�˙˙���˙˙�˙ţ�˙˙���˙ý�˙ú�˙ţ˙ţ�˙ű�˙ţ�˙ţ�˙ţ�˙˙�˙ţ�˙˙���˙˙�˙ü��˙ý�˙ű���˙˙��˙ü�˙ú�˙ţ�����˙˙�˙˙�˙ü�˙ű�˙ü�˙ü�˙ű�˙ú�˙ű�˙ü�˙˙˙˙�˙˙�˙˙�˙ý�˙ý�˙˙�˙ţ�˙ý�˙ü�˙ţ����˙˙�������˙ţ�˙ű�˙ű�˙˙˙˙��˙ţ�˙ý�˙ţ�˙ţ���˙ţ�˙ý�˙ý�˙˙����˙˙��˙ý�˙ú�˙ţ˙˙������˙ţ���˙ü�˙ü�˙˙�˙ý�˙ý�˙˙˙˙�˙˙�˙˙���˙ý�˙ý�˙ţ�˙ý�˙ü�˙ţ������˙ţ�˙ý�˙ű�˙ü��˙ý�˙ü�˙ü������˙ý�˙˙������������˙ţ�˙ü�˙ţ�˙ţ�˙ţ�˙˙���˙˙��˙ü�˙ú�˙ţ�˙ý�˙ü�˙˙�������˙˙�˙˙�˙ţ�˙ý�˙ţ���˙˙�˙ţ�˙ţ�˙ý�˙ţ�˙ţ�˙˙�������˙˙�˙ţ��˙ţ�˙ý���˙ţ�˙ţ���˙˙���˙ţ�˙ý�˙ţ��˙˙���˙ţ�˙˙�˙ţ�˙˙�����˙ý�˙ü�˙˙��˙˙���˙˙���˙ű�˙ü��˙ţ���˙ţ�˙˙�����������˙ţ�˙ţ���˙ü�˙ü���˙˙�˙ü��˙ű�˙ř�˙ý˙˙�˙ű�˙ű�˙ţ�˙˙�˙˙�˙ý�˙ţ�˙˙�˙˙�˙ý���˙ý�˙÷� ˙ř�˙ű�˙ü�˙ţ�˙ý�˙ű�˙ű�˙ű�˙ý�˙ţ�˙ý�˙ţ�˙˙��˙˙��˙ţ�˙˙˙ţ�˙ů�˙ű�˙ý�˙ű�˙ű��˙ý�˙ý���˙˙��˙ý�˙ü��˙ü�˙ű���˙ţ�˙ţ���˙ü�˙ú�˙ü������˙ţ������˙ý�˙˙��˙ü�˙ý���˙˙�����˙˙�˙ü�˙ţ�˙˙���˙ţ�˙ý�˙ţ��˙˙��˙˙��˙ţ���˙˙��˙ý�˙ţ�˙ţ�˙ý�˙˙˙˙�˙ý�˙˙��˙˙�˙˙�˙ý�˙ţ�˙ů�˙ř�˙ü�˙ţ���˙˙��˙ţ�˙ţ��˙ţ�˙ü�˙ú�˙ţ˙˙�˙ű�˙ý�˙ţ�˙ţ�˙˙�˙ý�˙ű�˙ü�˙˙�˙˙����˙ţ�˙ý�˙ţ�˙ü�˙ü�˙ţ���˙ý�˙ú�˙ü�˙˙�����˙ţ�˙ţ���˙˙�����˙˙�˙ű�˙ü�˙ţ���˙˙�˙ţ�˙ţ�˙ţ˙˙�˙ţ���˙ý�˙˙˙˙�˙ý�˙ű���˙ý�˙ý�˙˙�������˙ţ�˙ű�˙ţ���˙ţ�˙˙�˙ý�˙˙�����˙˙˙˙�˙ű�˙ü��˙ý�˙ý���˙ý�˙ů�˙ü���˙ý�˙ý�˙˙���˙ţ���˙ý�˙ý�˙ţ�˙ţ���˙ţ�˙ý�˙˙���˙˙�˙˙˙˙�˙ű�˙ű�˙ü�˙ů� ˙÷�˙ű�˙ţ�˙˙˙˙�˙ú� ˙ö�˙ű��˙ú�˙ů�˙ý�����˙ţ�˙ý�˙˙˙˙�˙ţ�˙ţ���˙˙�˙˙�˙ý�˙ý�˙˙˙˙���˙ý�˙ý���˙ü�˙˙���˙ţ�˙ţ�˙˙���˙ţ�˙ý�˙˙�˙ţ�˙ü�˙ţ�����˙˙�˙ţ�˙ý�˙ű�˙ţ���˙˙�˙ţ�˙ü�˙ţ˙˙�˙ý�˙ţ�˙ţ�˙ü�˙ü�˙ý������˙ţ��˙ţ�˙ú�˙ü��˙ű�˙ú�˙ý�˙ţ�˙ý���˙ţ�˙˙�˙˙�˙ü�˙ý�˙ţ���˙ţ�˙ý�˙ü�˙˙�����˙ý�˙ý��˙ý�˙˙˙˙�˙˙˙˙�˙ý�˙ţ���˙ý�˙ţ���˙ý�˙ý�˙ţ�˙ţ�˙ý��˙ţ�˙ţ��˙ý�˙ű�˙ü�˙˙�����˙˙�˙ý�˙ú�˙ű���˙ţ�˙ý�˙˙�˙ţ�˙˙˙˙�˙ü��˙ü�˙˙˙˙�˙ů�˙ú�˙ý�˙˙�˙˙�˙˙�˙ţ�˙ţ�˙ţ�˙ţ�˙ű�˙˙���˙ú�˙ű�˙ý�˙ţ�˙ü�˙ü�˙ý�������˙˙�˙ý�˙ú�˙ú�˙ý�˙˙�˙˙���˙ţ���˙˙��˙ý�˙ţ����˙ţ�˙ţ���˙˙�˙ţ�˙ţ���˙˙�˙ţ���˙ţ�˙ţ���˙ţ���˙ţ�˙ü���˙ţ�˙ű�˙ů�˙ü���˙˙�˙˙˙˙�˙ý�˙ü�˙ţ�˙˙�˙ţ��˙˙�˙ý�˙ý�˙˙���˙ţ���˙ţ�˙˙˙˙��������������������˙ţ��˙ý�˙ţ˙˙�˙ü��˙ţ�˙˙˙˙�˙ü�˙ţ�˙ý���������˙˙���˙ţ��˙ü�˙ú�˙ý��˙ţ��˙ţ�˙˙˙˙�˙ţ���˙˙�˙˙�˙˙���˙ý��˙ü�˙ý��˙ü�˙ű�˙ţ�˙ţ�˙ţ˙˙�˙ů�˙ú�˙ţ�˙˙�˙˙˙˙�˙˙�˙ţ���˙ţ�˙ţ�˙˙�˙ţ�˙ý�˙ü�˙˙˙ţ�˙ú�˙ý���˙˙�˙˙���˙ü�˙ý���˙˙���˙ü���˙ţ�˙ü�˙ü�˙ţ��˙ű�˙ú�˙ţ˙˙�˙ţ�˙˙�˙ţ�˙ü�˙ü�˙ű�˙ű��˙ý���˙ý�˙ű�˙˙����˙˙�˙ţ�˙ţ�˙ţ��������˙ţ�˙ţ�˙˙���˙ţ��˙ţ���˙˙�˙ý�˙ű�˙ü�˙ţ���˙˙�˙˙˙ţ�˙ů�˙ů�˙˙˙ţ�˙ţ˙˙�˙÷� ˙ú�˙ý�˙˙���˙ţ�˙˙���˙ţ�˙ţ�˙ţ�˙ű�˙ý�˙˙�˙ţ�˙ý���˙˙�˙ý��˙ü�˙ý�˙ţ�˙ţ�˙ű�˙˙˙˙�˙ű�˙÷�˙ů�˙˙���˙ţ���˙˙�˙ü�˙˙˙˙���˙˙�˙˙���˙ţ�˙ü�˙ţ�������˙˙�˙ü�˙ü�˙ţ�˙ý�˙˙˙˙���˙˙�˙ý�˙ý���˙ţ�˙ü�˙˙��˙˙�˙ű�˙ü��˙ţ��˙˙�������˙˙�˙ţ��˙ţ�˙ü�˙ţ�˙ý�˙ý�˙ý�˙ţ�˙ý�˙ú�˙ü�˙˙�˙˙�˙ţ����˙˙�˙ý�˙˙�˙˙�˙ý�˙ý��˙ţ�˙ý�˙ţ��˙ţ�˙ü�˙ţ�˙ü�˙ţ�����˙ţ�˙ů�˙ü�˙ţ�˙˙���˙˙�˙ý�˙ý�˙ţ�˙ý�˙ü�˙ý�˙ţ�˙˙�˙ý�˙ţ��˙ţ�˙ţ�˙˙�˙˙���˙ý�˙ü�˙ý�˙ţ���������˙˙�˙ý��˙ţ�˙˙�˙ţ�˙ű�˙ú�˙ý�˙˙�����˙˙�˙ţ������˙˙���˙ţ���˙ý�˙ů�˙ý�˙ţ�˙ý�˙ü��˙ý�˙ţ�����˙˙���˙ţ���˙ţ�˙˙���˙ţ�˙ţ�˙ţ�����˙˙�˙ý�˙ű�˙ú�˙ţ���˙˙���˙ý�˙˙�����˙ý�˙ú�˙ü�˙ý�˙˙�˙˙�˙ý�˙ű�˙ţ�˙ţ���˙˙�˙˙˙˙�˙ţ��˙ţ�˙ţ�˙˙����˙˙�˙ü�˙ű�˙ý�˙ţ�˙ţ�˙ţ�˙˙�˙ţ�˙˙�˙ţ�˙ý�˙ţ���˙˙�˙˙�˙˙�˙˙˙˙�˙ü�˙ü�˙˙��˙˙��˙ţ�˙ý�˙ţ�˙ý�˙˙˙˙�˙ý����˙ý�˙ű�˙˙��������˙˙�˙ţ���˙ű�˙ů�˙ü�˙ý��˙ý�˙ý��˙˙���˙ţ�˙˙���˙ţ�˙˙�˙˙���˙ţ�˙ý�˙˙��˙˙�˙ü�˙ú���˙ý�˙ů�˙ţ���˙ý�˙ţ�˙˙���˙ţ�˙ţ�˙ý���˙ţ�˙ý��˙˙�˙ţ�˙˙���˙ţ�˙˙���������˙ţ�˙ţ��˙ý�˙ú�˙ü�˙ý�˙ý���˙ţ�˙ü�˙ű�˙ý��˙˙�˙ý�˙˙���˙˙���������˙ţ�˙ý�˙ú�˙ý��˙ý�˙ú�˙ú�˙ű�˙ú�˙ţ���˙ţ�˙˙���˙ý�˙ů�˙ú��˙ű�˙÷� ˙÷�˙ü�˙ý�˙ű�˙ű�˙ü�˙ü���˙ý�˙ý���˙ţ�˙ý�˙ţ�˙˙���˙˙�˙ţ�˙ý�˙ú�˙ú�˙ý�˙ţ�˙˙�˙˙�˙˙�˙ý�˙ü�˙˙˙˙���˙ţ�˙ű�˙ý�˙ţ�˙˙�˙˙�˙ý�˙ţ���˙ý�˙ţ���˙˙�˙ű�˙÷�˙ü���˙ţ�˙ţ�˙ţ�˙˙�˙ţ��˙ý�˙ú�˙˙˙ţ�˙ţ���˙˙�����˙ý�˙ű�˙ü�˙ü�˙ţ�˙˙�˙ţ���˙ţ�˙ý��˙ú�˙ú�˙ţ˙˙�˙˙˙˙�˙ű�˙ű�˙ţ�������˙˙�˙ű�˙ű�˙ý�˙ý��˙ü�˙ţ˙˙�˙ţ���˙ü�˙ý�˙ý�˙ţ�˙˙����������˙˙�˙ţ�˙ü�˙˙�����˙ţ�˙˙˙˙�˙˙���˙ţ�˙˙���˙ü�˙ű�˙ţ�˙ţ�˙ü�˙ý�˙˙�˙ý��˙˙�˙˙�����˙˙�˙˙�������˙˙�˙ţ�˙˙�����˙ţ��˙ý�˙ú�˙ú�˙ű���˙ý�˙ý�˙˙˙˙�˙ţ���˙˙���������˙˙�˙ü�˙ú�˙ý�˙˙�˙ü�˙ý���˙ý��˙ü�˙ý�˙ţ�˙ý�˙ü�˙ý�˙˙��˙˙������˙ţ���˙ý�˙ý�˙ţ����˙ţ�˙ř� ˙ú��˙ţ���˙ü�˙ü�˙ü�˙˙����˙˙�˙˙�˙ţ���˙˙���˙ţ�˙ý�����˙˙�˙ý�˙ý�˙ü�˙ţ�����˙ţ�˙ţ��˙ţ˙˙�˙˙���˙ţ��˙ţ�˙˙�����˙ţ�˙˙�����˙ţ�˙ý�˙˙�˙ý�˙ű�˙ü�����˙˙�˙ű�˙ý���˙ü�˙ţ���˙ý�˙ý�˙ţ���˙ý�˙ů�˙ú��˙ü�˙ü�˙ţ�˙ü�˙ü����˙ţ�˙ý�˙ý�˙ü�˙˙˙˙�˙˙���˙ű�˙ú�˙ü�����˙˙�������˙˙�˙ţ�˙ý�˙˙˙ţ�˙ý���˙˙˙˙�˙˙���˙ű�˙ý�˙˙�˙ý�˙ú�˙ü�˙ý��TEST��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/empty.ogg������������������������������������������������������������������0000664�0000000�0000000�00000010350�14447736377�0016773�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������¶Űż;����Zëfvorbis����D¬������€µ�����¸OggS����������¶Űż;���îăr„-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙vorbis���Xiph.Org libVorbis I 20050304����vorbis%BCV�@��$s*FĄs„BPăBÎkěBL‚2L[Ë%s!¤ B[(ĐU��@��‡Ax„ŠA!„%=X’'=!„9x„iA!„B!„B!„E9h’'A„ă08 ĺ8ř„E9X'Ač „B¸š¬9!„$5HP9č„Â,(Š‚Ä0¸„5(Ś‚ä0ČÔ BšI5ř„gAx„iA!„$AHAČ„FAX’9¸„ËA¨„*9„ 4d��� ˘(Š˘( ˛ �Č��@QÇqÉ‘ɱ  Y����� HФHŽäH’$Y’%Y’%Y’扪,˲,˲,Ë2˛ �H��PQ Eq Y�d�� 8ŠĄXŠĄhŠçŽ„†¬�€����4CS<G”DĎTU×¶m۶m۶m۶m۶m[–e Y�@��Ňif©0BCV���€Š0Ä€ĐU��@��€J˘ ­9ßśă YšJ±9śHµy’›Šą9çśsÎÉćś1Î9眢śY š ­9çśÄ Y š ­9çś'±yĐš*­9çśqÎé`śĆ9çś&­yšŤµ9çś­iŽšK±9çśHąyR›Kµ9çśsÎ9çśsÎ9çśęĹéśÎ9眨˝ą–›ĐĹ9çśOĆéŢśÎ9çśsÎ9çśsÎ9çś 4d���@†ŤaÜ)Ňçh Fb2éA÷č0 śBęŃčh¤”:%•qRJ' Y���@!…RH!…RH!…b!†rĘ)§ ‚J*©¨˘Ś2Ë,łĚ2Ë,łĚ:쬳; 1ÄC+­ÄRSm5ÖXkî9çš´VZk­µRJ)Ą”R BCV� ��BdQH!…b)§śr *¨€ĐU�� �€����OňŃŃŃŃŃńĎ%Q%Q-Ó25ÓSEUue×–uY·}[Ř…]÷}Ý÷}ÝřuaX–eY–eY–eY–eY–eY– 4d���� „BH!…RH)ĆsĚ9č$” Y������pGqÉ‘I˛$KŇ$ÍŇ,Oó4O=QEÓ4UŃ]Q7mQ6eÓ5]S6]UVmW–m[¶uŰ—eŰ÷}ß÷}ß÷}ß÷}ß÷}]BCV���:’#)’")’ă8Ž$I@hČ*�@�@��Šâ(Žă8’$I’%i’gy–¨™šé™ž*Ş@hČ*���@������ЦxŠ©xЍxŽč’h™–¨©š+ʦ캮뺮뺮뺮뺮뺮뺮뺮뺮뺮뺮뺮 „†¬�$��t$Gr$GR$ER$Gr€ĐU�€ �€��Ă1$Er,ËŇ4Oó4O=Ń=ÓSEWtĐU�� �€������ ɰËŃM%ŐR-US-ŐREŐSUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMÓ4M Y ��S--Ćš ‹$bŇj« c R쥱H*gµ·Ę1…µ^‡”Q{©$cŠAĚ-¤Đ)&­ÖTB…¤c*RR 4d…�šŕp@˛,@˛,�������4 Đ<°4�������$M,O4Ď�������������������������������������������������������������������@Ň4@ó<@ó<�������Đ<đ<đD�������,Ď4Ń<Q�������������������������������������������������������������������@Ň4@ó<@ó<�������°<đDĐ<�������,Ď<Q<Ń����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ŕ��`!˛"��pH$ ’ÍH–M¦Á4’eAÓ i0M����������$M¦AÓ Š�IÓ iĐ4"����������’¦AÓ iE€¤iĐ4hD����������Ď4!ŠE&Ŕ3M"D¦ ������������������������p��0ˇ ˛"��p8Še�€ă8–��ŽăX��X–%Š��`Yš(������������������������������������������������������������������p��0ˇ ˛��p(ŠeDZ,ŕ8–$ɲ�–Đ<€¦D���(p��°ASbq€BCV�Q��ű,ME’¤iš'Š$IÓ<OišçyžiÂó<Ď4!Š˘hšEQ4M¦iŞ*0MU��Pŕ��`¦Äâ�…†¬�B�ŠbYšćyž'Ц©š$IÓ<OEŃ4MSUI’¦yž(Š˘iš¦Ş˛,Mó<QEÓTUU…¦yž(Š˘iŞŞęÂó<OEŃ4UŐuáyž'Š˘hšŞęşEQ4MÓTMUu] ЦišŞŞŞ® DOMSU]×u牢iŞŞ«ş.MÓTUUu]Y¦iŞŞëĘ2@UUŐu]W–ŞŞŞ®ëş˛ PU×u]Y–e�®ëş˛,Ë����Ś “Ś*‹°Ń„ @ˇ!+€(��Ŕ¦SĘ0&!¤Ć$„B&%ĄŇRŞ ¤RR)„TJ*%Ł”Rj)UR)©” B*%•R��Ř�Ř…PhČJ� �€0F)ĆsN"¤cÎ9'RŠ1çś“J1ćśsÎI)sĚ9礔Î9çśsRJćśsÎ9)ĄsÎ9çś”RJçśsNJ)%„ÎA'Ą”Ň9çś��Tŕ��`ŁČć#A…†¬�R� ŽcYšćy˘hš–$išçyž(š¦&Išćyž'ŠŞÉó<OEŃ4U•çyž(Š˘iŞ*×EÓ4MUU]˛,ЦišŞęş0MÓTU×u]¦iŞŞëş.l[UUŐue¶­ŞŞęş˛ \×ueŮ–,»®ěÚ˛��đ� VG8) ,4d%��@B!eB !„”R ��p��0ˇ ˛�H��ڱÖZk­µÖ@g­µÖZk­€ĚZk­µÖZk­µÖZk­µÖRk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk-Ą”RJ)Ą”RJ)Ą”RJ)Ą”RJ�úU8�ř?ذ:ÂIŃX`ˇ!+€p��ŔĄs B)ĄT1ćśtTZ‹±B1ç$¤ÔZlĹsÎA(!•Öb,žsB))ĹVcQ)„RRJ-¶X‹JˇŁ’RJ­ŐXŚ1©¤ÖZ‹­ĆbŚI)´ÔZ‹1#lM©µŘj«±ck*-´cŚĹ_dl-¦Új Ć#[,-ŐZk0ĆÝ[‹Ą¶š‹1>řÚR,1Ö\��w�D‚Ť3¬$ťŽ˛� � RŠ1ĆsÎ9ç¤RŚ9ćśsBˇTŠ1ĆśsB!”Ś1ćśsB!„RJĆśsB!„RęśsB!„J)ťsB!„B)ĄB!„J(Ą¤B!„B©¤”B!„RB(!•”R!„B)%¤”R !„RBˇ„”RJ)…BĄ”’RJ)ĄJ %„R))ĄJ!”RJJ)ĄTJ ˇ„J)%Ą”RJ!„J)��8��A'UaŁ €BCV�d��˘”R)-E‚"Ą¤KFsPZЍr RÍ©RÎ ć$–1„”“T2ćB BęuL)-•BƤŘrKˇs���A�€€��3�Ŕŕ�ástG�€ DfDĂBpxP S@b‚B.�TX\¤]\@—.čâ®!!A, €śpĂox NĐ)*u ����� �đ��\�ŃĚadhlptx|€„Ś������|��$%@DD4s !"#$�€����� €���������OggS�Ŕz�����¶Űż;���fŻ}[ˇ� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/empty.spx������������������������������������������������������������������0000664�0000000�0000000�00000057355�14447736377�0017051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������Îö'����Ç‘rPSpeex 1.1.12�����������������P���D¬�����������˙˙˙˙€���������������������OggS����������Îö'���·˝[0!���Encoded with Speex 1.1.12����OggS��n������Îö'���»Ç+Ş-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]tŔNŤÍ��ż˙˙˙˙˙í¶Űm¶ŰC�_˙˙˙˙˙öŰm¶Űm˘Ŕ/˙˙˙˙˙űm¶Űm¶ÚŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍľż˙˙˙˙˙íµkm¶ŰE€_˙˙˙˙˙öŰm¶Űm®�/˙˙˙˙˙űm¶Űm¶Ţ×˙˙˙˙˙ý¶ŰoöŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ��ż˙˙˙˙˙í¶Űm¶ŰW�_˙˙˙˙˙öŰm¶Űmµ€/˙˙˙˙˙űm¶Űm¶Üˇ×˙˙˙˙˙ý¶Űm¶Ű%ť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂN€ÍFż˙˙˙˙˙˙˙˙˙üďÉS_˙˙˙˙˙öŰm¶˙m±�/˙˙˙˙˙űm¶Űm¶ŮÚ×˙˙˙˙˙ýżŰţËwýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍq�ż˙˙˙˙˙˙¶Űm¶Ű`3_˙?˙˙˙öŰ%µ˙˙óŔ/˙˙˙˙˙űm¶Űm¶×�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍa�ż˙˙˙˙˙í¶Űm¶Ű}�_˙˙˙˙˙öŰm¶Űm§cŻ˙˙˙í˙›m·˙ҵ0?—˙˙o˙˙˙ö˙ýżŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ<ż˙˙˙˙˙í¶Űm¶ßá�_˙˙˙˙˙öŰm¶ŰmşŔ/˙˙˙˙˙űm¶Űm¶Üč×˙˙˙˙˙˙˙˙ýżťmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ�ż˙˙˙˙˙í¶Űm¶ŰP€_˙˙˙˙˙öŰm¶Űm»@/˙˙˙˙˙űm¶Űm¶ßh×˙˙˙˙˙˙öÍ˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ(ż˙˙˙˙˙í¶Ő­ţ»a_˙˙˙˙˙ö˙ýż˙˙ř'Ż˙˙˙˙˙˙í˙˙˙˙ů@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ�ż˙˙˙˙˙í¶Űm¶Ű}�_˙˙˙˙˙öŰm¶Űm¤Ř«˙˙˙ţtż˙˙˙ţbŔ˙˙˙˙˙˙öŰm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ(ż˙˙˙˙˙˙˙űm¶ŰmB_ó˙˙˙˙˙á˙˙ŰjÚČŻ˙˙˙˙˙űm¶Űm¶Ţs˙˙˙˙˙ý¶Ű˙öŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN©Í@�ż˙˙˙˙˙í¶Űm¶Űaż_˙˙˙˙˙ö˙ýż˙oü¦/˙˙˙˙˙űm¶Űm[˙Ë˙˙˙˙˙˙ëAý¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN€Í�ż˙˙˙˙˙í¶Űm¶Űn�_˙˙˙˙˙öŰm¶Űmą‡/˙˙˙˙˙űţß˙˙˙€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€Í_"ż˙˙˙˙˙í¶Űm¶Űt"_˙ýż˙˙ü˙jVŰm¦áŻ˙˙ţ˙˙˙“ô˙˙đ ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ,�ż˙˙˙˙˙í¶Űm¶Űj�_˙˙˙˙˙öŰm¶Űmż€/˙˙˙˙˙űm¶Űm¶ßá×˙˙˙˙˙o˙˙˙˙­5ť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NťÍ�ż˙˙˙˙˙í¶Űm¶Ű^c_˙˙˙˙˙öŰm¶˙˙đ@/˙˙˙˙˙űm¶Űm¶ß(×˙˙˙˙˙˙˙Űm˛[mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€Í_Dż˙˙˙˙˙í¶í¶Űg,_˙˙˙˙˙˙˙ý¶Ďý°Ż˙˙˙˙˙űmćßçţŇĆ×˙˙˙˙˙˙˙×ýżŰýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂN¶Ípż˙˙˙˙˙˙ţŰm˙ű]Ž_˙˙˙˙˙ö˙ý¶Űmąý/˙˙˙˙˙űm¶ßíýg8Őż˙˙˙˙üß˙oöŰýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍZ�ż˙˙˙˙˙˙¶Űm¶Űd#_˙˙˙˙˙˙Ű˙˙˙m«Ŕ/˙˙˙˙˙űm¶Űm¶×#—˙˙˙˙˙˙öŰmż˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€ÍDż˙˙˙ţßë˙˙˙ý+^�_˙˙˙˙˙öŰm¶Űm´¤+˙˙˙˙ů™ţ m˙ý`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ;�ż˙˙˙˙˙í¶Űm¶Űk€_˙˙˙˙˙öŰm¶Űm˝ŮŻ˙ţ˙˙űm¶Oí¶Ň#—˙˙˙˙˙˙˙Űo˙˙mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€Í.�ż˙˙˙˙˙í¶Űm¶Ű~#_˙˙˙˙'˙˙˙ö˙ŢŻ˙˙˙˙˙űm¶ß˙¶Óf×˙˙˙˙˙ý˙˙öŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N©ĎPjż˙˙˙˙˙˙˙˙˙˙˙ř�_˙˙˙˙˙˙Űm¶Űm˝�/˙˙˙˙˙űm¶Űm¶ÝrW˙˙˙˙˙ý¶Úµ¶Ű5ť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍż˙űţßíý™żµ/Ć€_˙˙˙˙˙öŰm¶Űm­@/˙˙˙˙˙űm¶Űm¶Ű ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍt�ż˙˙˙˙˙í¶Űm¶Űx�_˙˙˙˙˙öŰm¶Űm˘/Ż˙ţß˙˙˙˙üë˙đŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ1�ż˙˙˙˙˙í¶Űm¶Űk€_˙˙˙˙˙öŰm¶Űmż€/˙˙˙˙˙űm¶Űm¶Ń ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN€Í[�ż˙˙˙˙˙í¶Űm¶Ű@—_˙˙˙˙˙ë[˙öŰm¤Ŕ/˙˙˙˙˙űm¶Űm¶ÚŽ—˙˙˙ö˙˙˙˙˙˙Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍmFż˙˙˙˙˙˙ţŰm¶ŰR€_˙˙˙˙˙öŰm¶Űm´€/˙˙˙˙˙űm¶Űm¶Ţ”×˙˙˙˙˙ý¶˙˙öŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ'�ż˙˙˙˙˙í¶Űm¶ŰW"_˙˙˙ó˙˙Űm¶ám¤@/˙˙˙˙˙űm¶Űm¶×—˙˙˙˙˙˙öŰý¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍFż˙˙˙˙˙í˙űm˙˙ç#_˙˙˙˙˙˙˙ýż˙m´€/˙˙˙˙˙űm¶Űm¶ÔÓ˙˙˙˙˙ýżŰ˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍC�ż˙˙˙˙˙í¶Űm¶Űu€_˙˙˙˙˙öŰm¶ŰmżŔ/˙˙˙˙˙űm¶Űm¶ßX×˙Ű˙˙˙˙˙˙m¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍžż˙˙˙˙˙í·ţm¶Ű\�_˙˙˙˙˙öŰm¶Űm¬@/˙˙˙˙˙űm¶Űm¶ßŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍrpż˙˙˙˙˙íź˙çţßÉ�_˙˙˙˙˙öŰm¶Űm«Ŕ/˙˙˙˙˙űm¶Űm¶Úŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍcľż˙˙˙ţí¶Űm¶OĘ€_˙˙˙˙˙öŰm¶Űm«Ż˙˙˙˙˙űm¶Ű˙ń@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ5�ż˙˙˙˙˙í¶Űm¶Ű€_˙˙˙˙˙öŰm¶ŰmľA/˙ţß˙˙˙˙˙űm¶Đ ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€Í8�ż˙˙˙˙˙í¶Űm¶Űuç_˙˙˙˙˙˙˙úÖ˙˙ŕŔ/˙˙˙˙˙űm¶Űm¶ŮL—˙˙˙˙Űý¶Űm¶ťmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÄNŤÍz�ż˙˙˙˙˙í¶Űm¶ŰR›_˙˙˙˙˙˙Űo˙˙˙ň@/˙˙˙˙˙űm¶Űm¶Ţ�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N¶ĎPc�ż˙˙˙˙˙í¶Űm¶ŰU›_˙˙˙Ű˙˙˙˙˙Ą˙é�/˙˙˙˙˙űmţ۶Ř˙˙˙˙˙ý¶Ču¶˙mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ �ż˙˙˙˙˙íţ۶Űj�_˙˙˙˙˙öŰm¶Űmż©Ż˙˙˙˙˙űfŰmµ$O×˙˙ýż˙˙˙˙h˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍY�ż˙˙˙˙˙í¶Űm¶ŰVę_˙˙˙˙˙öŰ˙öŰm˝Ŕ/˙˙˙˙˙űm¶Űm¶ß‹˙˙˙˙˙úÖŰo˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ�ż˙˙˙˙˙í¶Űm¶Űp€_˙˙˙˙˙öŰm¶ŰmąËŻ˙˙˙˙˙˙í¶Űm¶Ôú—˙˙˙˙˙ý¶ŰkŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ(ż˙˙˙˙˙í¶Űm¶ŰU�_˙˙˙˙˙˙Űm¶Űm´Ŕ/˙˙˙˙˙űm¶Űm¶Ý�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍqż˙˙í˙˙˙:ß˙ýkH�_˙˙˙˙˙öŰm¶Űm«€/˙˙˙˙˙űm¶Űm¶Ü ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍp�ż˙˙˙˙˙í¶Űm¶ŰIß_˙ü˙˙˙öŰlźŰm˘Ŕ/˙˙˙˙˙űm¶Űm¶Ö ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍZ�ż˙˙˙˙˙í¶Űm¶Űqß_˙˙˙˙?öŰm¶Ű'çµ/˙˙˙˙˙űm¶Űm¶Ńc—˙˙˙˙˙˙öŰo˙Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżOggS��ß������Îö'���BĆÔű-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]t‚NŤÍH�ż˙˙˙˙˙í¶Űm¶Űi#_˙˙˙˙˙öŰ˙˙˙˙ú@/˙˙˙˙˙űm¶Űm¶Ú`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€ĎP^Ôż˙˙˙˙˙íZß˙ţŰQS_˙˙˙˙˙˙˙˙öŰm˛gŻ˙˙˙ů˙˙˙˙űp¶ŢÔ×˙˙˙˙˙˙˙˙˙˙Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ1�ż˙˙˙˙˙í¶Űm¶Űa_˙˙˙˙˙˙˙˙˙Í˙řiŻ˙˙˙˙˙˙˙ţk˙˙A—˙˙˙ö˙ý¶˙˙óýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍžż˙˙˙˙˙í˙˙˙˙˙ä_˙˙˙˙˙öŰoöÚµż@/˙˙˙˙˙űm¶Űm¶Ű ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N¶ÍH�ż˙˙˙˙˙í¶Űm¶Űv€_˙˙˙˙˙öŰm¶ŰmŁ@/˙˙˙˙˙űm¶Űm¶Ňž×˙˙˙˙˙ý¶Űlśťmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ��ż˙˙˙˙˙íţŰm¶Űc_˙˙˙˙oöŰo˙Úwô�/˙˙˙˙˙˙í¶Űm¶Ţ€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍK�ż˙˙˙˙˙í¶Űm¶Űr__˙˙˙˙ĎöŰm¶Ű…ŁóŻ˙˙˙˙˙űm¶Űm·óŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍk�ż˙˙˙˙˙í¶Űm¶Űj¬_˙˙˙˙˙ö±m¶ŰmĄ�/˙˙˙˙˙űm¶Űm¶Űŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍpż˙˙˙˙˙í·ű·˙˙€_˙˙˙˙˙öŰm¶Űm­�/˙˙˙˙˙űm¶Űm¶Ű`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂN€Íb˘ż˙˙˙ţß˙˙˙˙˙űI#_˙˙˙˙˙öŰm¶ëý¤µ/˙˙ű˙˙˙˙ů­ţٱW˙˙˙˙˙ýżŰm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ+.ż˙˙˙˙˙í¶Oö·˙ý�_˙˙˙˙˙öŰm¶Űm­u/˙›˙˙˙˙ÎÂŰm˙ű ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ7�ż˙˙˙˙˙í¶Űm¶Űs€_˙˙˙˙˙öŰm¶Űm·@/˙˙˙˙˙űm¶Űm¶ÔŽ˙˙˙˙˙ý¶Ű%«[mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ„ż˙˙˙˙˙íćŰ˙˙Ô›_˙˙˙Ű˙öŰmżŹoî@/˙˙˙˙˙űm¶Űm¶Ü`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍfśż˙˙˙˙˙˙˙˙ηűz€_˙˙˙˙˙öŰm¶Űm«€/˙˙˙˙˙űm¶Űm¶Ţ ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ{¦ż˙˙˙˙˙í¶ß˙˙˙Îŕ_˙˙ó˙˙˙ţ—ň[m¬·/˙˙˙˙˙űdţŰm˙ő ˙˙˙˙˙˙öŰm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ_�ż˙˙˙˙˙í¶Űm¶Űb�_˙˙˙˙˙öŰm¶ŰmĄ Ż˙˙˙˙˙űm¶Űm’Ňk˙˙˙˙˙ýż˙˙ëmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍE�ż˙˙˙˙˙í¶Űm¶ŰT_˙˙˙˙˙öŰm¶ŰjŇżŻ˙˙˙˙·űmýŹ˙JŇŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN©ÍsFż˙˙˙˙˙í¶ßí¶Űs€_˙˙˙˙˙öŰm¶Űm°‡/˙˙˙˙˙˙˙˙ů˙·ýâ×˙˙˙˙Űý¶Ű˙ű_mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ*Ôż˙˙˙˙˙í·ű˙űR€_˙˙˙˙˙öŰm¶Űm˝"Ż˙˙˙˙˙űm¶Űm¶ÜĂ—˙˙˙˙˙ý¶Űý¶Űýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€Í�ż˙˙˙˙˙í¶Űm¶ŰpĎ_˙˙˙˙˙˙˙˙˙˙ýz'Ż˙˙˙˙˙űY¶Űm¶Ó¬×öŰ˙˙˙˙ç5o˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍ=�ż˙˙˙˙˙í¶Űm¶Űq�_˙˙˙˙˙öŰm¶Űm¶Ŕ/˙˙˙˙˙űm¶Űm¶ß€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍwľż˙˙˙ź˙í¶Űm“űE€_˙˙˙˙˙öŰm¶Űm®Ç/˙˙˙˙˙űm¶Ó­¶Ôŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€Í<Xż˙˙˙˙˙Ö¶ßí¶ŰoĎ_˙˙˙˙˙ňý¶Űm¦ńŻ˙˙˙˙˙˙íýk·ňë×ó˙˙˙úĚ˙ö˙mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN¶Í0jż˙˙˙˙˙˙¶ßí˙űx_˙˙˙˙˙˙˙o˙˙üŹ«˙˙˙˙ńí·˙íţѬ—˙˙˙˙˙řř[ýżí…ť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ>�ż˙˙˙˙˙í·űm¶Űo€_˙˙˙˙˙˙˙m¶Űoń§«˙˙˙˙˙í¶Űm¶×:—˙˙˙˙˙ýż˙˙˙Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€ĎP`Ôż˙˙˙˙˙í¶Űm˙ű~ę_˙˙˙˙˙öŰo˙ŰmąŻ˙˙˙˙˙ű˙˙í®Ő×˙˙˙˙˙ý¶óo˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ�ż˙˙˙˙˙í¶Űm¶Ű[�_˙˙˙˙˙öŰm¶Űmą@/˙˙˙˙˙űm¶Űm¶Ýé×˙˙˙˙˙ý˛m¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€Ífż˙˙˙˙˙η˙˙˙ű]�_˙˙˙˙˙öŰm¶Űmľ2/˙˙˙ć·űm¶Ý|šÓ×˙˙ýż˙˙˙˙ţ¸'ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ'�ż˙˙˙˙˙˙ţŰm¶Űqł_˙˙˙Ű˙öŰm·˙mĽ@/˙˙˙˙˙űm¶Űm¶Ů ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍmXżţß˙˙˙˙ý+·˙ŃĎ_×˙˙˙˙öťm§[m¤�/˙˙˙˙˙űm¶Űm¶×@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍb�ż˙˙˙˙˙í¶Űm¶Ű~�_˙˙˙˙˙öŰm¶Űmą€/˙˙˙˙˙űm¶Űm¶Ň—×ü˙˙˙˙ý¸[m¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ�ż˙˙˙˙˙í¶Űm¶Ű[�_˙˙˙˙˙öŰm¶Űm¸€/˙˙˙˙˙űm¶Űm¶Ń�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂN€Í �ż˙˙˙˙˙í¶Űm¶ŰZ›_˙˙˙˙ýż˙˙˙˙úFŔ/˙˙˙˙˙űm¶Űm¶Ó`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍT,ż˙˙˙˙˙í¶Ţ¶ŰvŁ_˙˙˙˙˙˙˙˙˙˙˙ë@/˙˙˙˙˙űm¶Űm¶Ü€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍtFż˙ű˙˙˙˙ůż˙˙×O_˙˙˙˙˙öŰm¶˙˙ńŻ˙˙˙˙˙˙í¶Űm¶ßŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ8Îż˙˙˙˙˙˙˙űm¶Űpç_˙˙˙˙˙˙˙ýż˙˙ó§Ż˙˙˙˙˙˙˙ţŰu˙ô€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ&¦ż˙˙˙˙˙˙¶ß˙˙˙ĺ€_˙˙˙˙˙öŰm¶ŰmĽŔ/˙˙˙˙˙űm¶Űm¶ßŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍą˙˙˙˙˙đ¶Űm¶ŰOO_˙˙˙˙˙ö­m¶ŰmĄ@/˙˙˙˙˙űm¶Űm¶×�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ3ľż˙˙˙˙˙í¶Űm¶Ő3_˙˙˙˙˙˙ţµ¶Űm˘Ŕ/˙˙˙˙˙űm¶Űm¶Ö`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍl�ż˙˙˙˙˙í¶Űm¶ŰJß_˙˙˙˙˙öŰm«[m©€/˙˙˙˙˙űm¶Űm¶ŐŹ×˙˙˙˙˙˙ö˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍQ�ż˙˙˙˙˙í¶Űm¶Ű}�_˙˙˙˙˙öŰm¶Űm˝�/˙˙˙˙˙űm¶Űm¶ÝČ×ü˙˙˙˙ý¸[m¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€Í�ż˙˙˙˙˙í¶Űm¶Űo€_˙˙˙˙˙öŰm¶ŰmşçŻ˙˙˙˙˙˙í·˙˙˙ń`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍJTż˙˙ů˙˙í¶ßÓ¶ŰSń_˙˙˙˙˙öŰm¶Űl @/˙˙˙˙˙˙í¶Űm¶Ú€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N¶Í~�ż˙˙˙˙˙í¶Űm¶Űw€_˙˙˙˙˙öŰm¶ŰmˇMŻ˙˙˙˙˙űmµź˙˙őŕ˙˙˙˙˙ý¶˙mżŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ2žżţß˙˙˙˙·UżţŰI�_˙˙˙˙˙öŰm¶Űm´Ŕ/˙˙˙˙˙űm¶Űm¶ß,×ö˙˙˙˙ýł[m˛[mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżOggS��O�����Îö'���r&ő:-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]tÂNŤÍ ż˙˙˙˙˙í·űm·űp#_˙˙˙˙˙öŰm¶Űoř€/˙˙˙˙˙űm¶Űm¶×ł—˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍB�ż˙˙˙˙˙˙¶Űm¶Űv�_˙˙˙˙˙öŰm¶Űmąő/˙˙˙˙˙˙˙˙˙˙ţ}W˙˙˙˙˙˙öŰm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtĆNŤÍ'Ôż˙˙˙˙˙í¶Űm¶Űp¬_˙˙˙˙˙˙˙˙˙˙m»�/˙˙˙˙˙űm¶Űm¶Ű ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍpŠż˙˙˙˙˙í¶Űm¶Ű~îV˙˙˙Ű˙úŰm¶Ąm˘€/˙˙˙˙˙űm¶Űm¶Ř@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍP�ż˙˙˙˙˙í¶Űm¶Űn�_˙˙˙˙˙öŰm¶ŰmĄCŻ˙˙˙˙˙űdţŰm¶ŃŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ7�ż˙˙˙˙˙í¶Űm¶Űq�_˙˙˙˙˙öŰm¶ŰmĄoŻ˙˙˙˙˙űm¶Ő­¶ÓÂ×˙˙˙˙˙ý¶ŰmżŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ:Ôż˙˙˙˙˙˙˙˙í˙ű{�_˙˙˙˙˙öŰm¶Űm´‘Ż˙·˙˙˙˙˙˙˙˙ţŃ ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„N€ĎP\�ż˙˙˙˙˙í¶Űm¶ŰoO_˙˙˙˙˙öŰm¶Űý¨‘Ż˙˙˙˙˙˙˙ţß˙ţŮ3˙˙˙˙˙˙˙ţµż˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍvFż˙˙˙˙˙˙˙ű·˙Ř€_˙˙˙˙˙öŰm¶Űm°‡/˙˙˙˙˙˙˙ýk˙ôč×˙Ű˙˙˙˙ëMm¶˙mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ=Xż˙˙˙˙˙˙ţŰm˙˙Çę_˙˙˙˙˙öŰmż˙˙ţŻ˙˙˙˙˙ű¶Űm¶Ý ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N¶Í$�ż˙˙˙˙˙í¶Űm¶Űi�_˙˙˙˙˙öŰm¶Űmľ€/˙˙˙˙˙űm¶Űm¶Ń ˙˙˙˙˙ýżŰo˙Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ/öż˙ű·˙˙ţ µšßÁ€_˙˙˙˙˙öŰm¶ŰmŻGŻ˙·˙˙˙˙˙Ţm¶Đ ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍv�ż˙˙˙˙˙í¶Űm¶Űh�_˙˙˙˙˙öŰm¶ŰmĄŻ˙˙˙í˙˙˙˙ő¦·ńč×˙˙˙˙˙˙˙˙oöŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ*�ż˙˙˙˙˙í¶Űm¶Űză_˙˙˙˙˙öŰo˙˙ůÝŔ/˙˙˙˙˙űm¶Űm¶Óŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍh�ż˙˙˙˙˙í¶Űm¶Űx?_˙˙˙˙˙˙˙ý¶Űm¤€/˙˙˙˙˙űm¶Űm¶× ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍc�ż˙˙˙˙˙í¶Űm¶ŰJ_˙˙ü˙˙öŰm¸[m¤g/˙˙˙˙˙˙˙ţż˙˙ňZ—˙˙˙˙˙ý¶˙m¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂN¶ÍNż˙˙˙˙˙í·űm·űqŽ_Ű˙˙˙˙đ˙ö˙ý°µ/˙˙˙˙˙˙˙˙˙˙ţ××˙˙˙˙˙ý¶˙˙ö˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍq�ż˙˙˙˙˙í·űm¶Űd€_˙˙˙˙˙˙˙m¶ŰmĽ@/˙˙˙˙˙űm¶Űm¶Ü ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍuňżţßí˙˙˙ţkR˙ő†ţ_˙˙˙˙˙ö˙ý¶˙˙ęMŻ˙˙˙˙˙˙í·ź˙ţÜ�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍk�ż˙˙˙˙˙í¶Űm¶ŰsŁ_˙˙˙˙˙ö˙ý¶Űoá€/˙˙˙˙˙űm¶Űm¶Ö ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ{Ôż˙˙˙˙˙˙˙˙˙¶ßţ€_˙˙˙˙˙öŰm¶ŰmŞ0/˙˙˙˙˙öm[ m¶ÖP•ż˙˙˙ŰůÖŰmżŹmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ1�ż˙˙˙˙˙í¶Űm¶Űn�_˙˙˙˙˙öŰm¶Űm˛€/˙˙˙˙˙űm¶Űm¶Ń—×˙˙˙ö˙˙˙˙˙ó[mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍFż˙˙˙˙˙í¶Űm˙˙ć[_˙˙˙˙˙öŰ˙˙˙˙ű–/˙˙˙˙˙űm˙˙˙˙˙Ó˙˙˙˙˙˙˙Űl–Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂN©Í'�ż˙˙˙˙˙í¶Űm¶ŰyĎ_˙o˙˙˙˙˙ýż˙˙ô@/˙˙˙˙˙űm¶Űm¶ŘP—˙˙˙˙˙˙˙Ű˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍrFż˙˙˙˙˙˙ţŢţKX€_˙˙˙˙˙öŰm¶Űm«Ŕ/˙˙˙˙˙űm¶Űm¶ŢĚ×˙˙˙˙˙ý¶Űmżó5ť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€Í�ż˙˙˙˙˙í¶Űm¶ŰQ�_˙˙˙˙˙öŰm¶Űm¸u/˙˙˙˙˙˙˙˙űm;ýď×˙˙˙˙˙ÍżŰm¶Ű…ť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍÔż˙˙˙˙˙í¶Űm¶ŰN�_˙˙˙˙˙öŰm¶Űmş€/˙˙˙˙˙űm¶Űm¶Ý ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ �ż˙˙˙˙˙í¶Űm¶ŰE‡_˙˙˙˙˙öŰlźŰoë�/˙˙˙˙˙űm¶Űm¶××˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€Íyžż˙˙˙˙˙í¶Űm¶ŰiŰ_˙˙˙˙˙˙˙?˙˙ý·ő/˙˙˙˙˙űy¶Űm¶Ö—˙Ű˙˙˙˙˙Ąo˙˙Uť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€ÍĆż˙˙˙˙˙˙ţß˙¶Óš�_˙˙˙˙˙öŰm¶Űm¸ŮŻ˙˙ű˙űNţíÖÔÉ×˙˙˙˙˙˙˙˙ý¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ8ľż˙˙˙·˙˙ţ dg˙ä�_˙˙˙˙˙öŰm¶ŰmąŻ˙˙˙˙˙˙˙ţŰmÖŮ ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€ĎP9Ôż˙˙˙˙˙í·˙˙Ż˙ËO_˙˙˙˙˙˙˙m¶Űm¬çŻ˙˙˙˙˙˙˙ţß˙˙ý–×˙˙˙˙˙˙öŰjĐ[mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍyĆż·˙˙˙˙˙˙˙˙ţŰ|�_˙˙˙˙˙öŰm¶ŰmŻ@/˙˙˙˙˙űm¶Űm¶Ţ@˙˙˙˙˙ý¶Űm¶Űýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN€Íî­˙˙˙˙űN˙˙˙ţŮ‹€_˙˙˙˙˙öŰm¶Űm°€/˙˙˙˙˙űm¶Űm¶Ú¨—˙˙o˙˙˙˙Ű4öŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍfż˙˙˙·˙íţíJŰE€_˙˙˙˙˙öŰm¶Űm¸ńŻ˙˙˙˙˙űľkm¶Ű ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN©ÍR�ż˙˙˙˙˙í¶Űm¶Ű~Ł_˙˙˙˙˙2[m˛ţČŮŻ˙ţß˙˙űm¶km·ó@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÄNŤÍ@�ż˙˙˙˙˙í¶Űm¶Űu�_˙˙˙˙˙öŰm¶Űm»Ŕ/˙˙˙˙˙űm¶Űm¶Ý_—˙˙˙˙˙ý¶Űm¶Úµť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÄNŤÍu>­˙˙˙˙˙ć·˙˙˙˙Ë€_˙˙˙˙˙öŰm¶Űm°€/˙˙˙˙˙űm¶Űm¶ÝŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ�ż˙˙˙˙˙í¶Űm¶Ű@€_˙˙˙˙˙öŰm¶ŰmŁÍŻ˙˙˙˙˙űm¶Űd·ö€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍC�ż˙˙˙˙˙í¶Űm¶Űj"_˙˙˙ţ·ö­m¶Úă€/˙˙˙˙˙űm¶Űm¶Ô ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍl�ż˙˙˙˙˙í¶Űm¶ŰzH_˙˙˙˙˙ö˙ý¶Űm«łŻ˙˙˙˙·űm¶Űm˙ř˙˙˙˙˙˙˙˙mż˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍG�ż˙˙˙˙˙í¶Űm¶Ű\#_Ű˙˙˙˙˙˙mż˙ý¦/˙˙˙˙˙űm˙űm·ůË˙˙˙˙˙˙˙˙mż˙mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ&Îż˙˙˙˙˙˙ţŰm·ů”�_˙˙˙˙˙öŰm¶Űm§�/˙˙˙˙˙űm¶Űm¶Řŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ9˘ż˙˙˙˙˙í¶ŰmµkN~_˙˙˙˙˙˙˙˙˙˙ý§µŻ˙˙˙˙˙ű˙˙˙˙řŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍs�ż˙˙˙˙˙í¶Űm¶Űn×_˙˙˙˙oöŰm¶Ú—ű/Żí˙˙˙˙űR˙˙˙˙ô ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżOggS��Ŕ�����Îö'���Č›ˇŕ-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]t‚NŤÍ=�ż˙˙˙˙˙í¶Űm¶Űr€_˙˙˙˙˙öŰm¶Űm˝ŻŻ˙ţß˙˙űmµ+˙ős—˙˙˙˙˙˙˙˙ý¶Űýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ/�ż˙˙˙˙˙˙¶Űm¶Űm�_˙˙˙˙˙öŰm¶Űm˛€/˙˙˙˙˙űm¶Űm¶Ü×˙˙˙˙˙ý¶Űm¶Úµť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍüż˙˙˙˙˙í˙˙˙˙˙Î�_˙˙˙˙˙öŰm¶ŰmąŔ/˙˙˙˙˙űm¶Űm¶Ýz×˙˙˙˙˙˙˙Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ)�ż˙˙˙˙˙í¶Űm¶Űe*_˙ýż˙˙öÚ´ÖŰm©MŻ˙˙˙˙˙˙˙˙˙Ö˙ö ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNťÍ#�ż˙˙˙˙˙í¶Űm¶Űg€_˙˙˙˙˙öŰm¶Űm®@/˙˙˙˙˙űm¶Űm¶Ň7×˙Ű˙˙˙˙˙ë˙˙˙mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ2Ôż˙˙˙˙˙í¶Űm·˙Űę_˙o˙˙˙˙Ú—˙ŰmŁ@/˙˙˙˙˙űm¶Űm¶Üë˙˙˙˙˙˙˙˙˙˙Ű]ť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍÔż˙˙˙˙˙˙˙űm¶ŰQ_˙˙˙˙˙˙Ím¶˙ř)Ż˙˙˙˙˙˙˙˙űm·ú`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ=ż˙˙˙˙˙˙˙˙í˙űd€_˙˙˙˙˙öŰm¶Űm˝Ŕ/˙˙˙˙˙űm¶Űm¶Üă—˙˙˙˙˙ý¶Űoň[mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtĆNŤÍ"�ż˙˙˙˙˙í¶Űm¶ŰTc_˙˙˙˙˙˙×m¶Űm¸QŻ˙˙˙˙˙˙˙·˙í˙÷@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍb�ż˙˙˙˙˙í¶Űm¶ŰxŁ_˙˙˙˙˙˙˙mżŰ_âG/˙˙˙˙˙ő­·űm˙ň`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍJ�ż˙˙˙˙˙í¶Űm¶Űs�_˙˙˙˙˙öŰm¶Űm¸HŻ˙˙˙˙˙űm¶Űm·ô!Őż˙˙˙˙ůÖ˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ�ż˙˙˙˙˙í¶Űm¶Ű_�_˙˙˙˙˙öŰm¶Űmş€/˙˙˙˙˙űm¶Űm¶Ţ××˙˙o˙˙ý¶Ú•ż˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍFż˙˙˙˙˙í¶Ű¶Ű][_˙˙˙˙˙˙˙˙öŰmż€/˙˙˙˙˙űm¶Űm¶ÖĎ×˙˙˙˙˙ývŰmż˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt†N€ĎP�ż˙˙˙˙˙í¶Űm¶Űoj_˙˙˙˙˙öŰm¶Űýą@/˙˙˙˙˙űm¶Űm¶ÔH×˙˙˙˙˙ý¶˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍI ż˙˙˙˙˙í˙o˙˙˙ű#_˙˙˙˙˙˙Í˙˙˙˙í€/˙˙˙˙˙űm¶Űm¶ŘC—˙˙˙˙˙˙˙Ű˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍzÔż˙˙˙˙˙ç˙˙˙·ű^ú_˙˙˙˙˙˙­˙˙˙˙ăá/˙˙˙˙˙ű˙˙˙¶Ő—˙˙˙˙˙˙˙˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NťÍ�ż˙˙˙˙˙í¶Űm¶ŰX�_˙˙˙˙˙öŰm¶Űm¶�/˙˙˙˙˙űm¶Űm¶ß ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂN¶Í.�ż˙˙˙˙˙í¶Űm¶ŰIű_ó˙˙˙˙öáµvŰm¤@/˙˙˙˙˙űmţŰm¶×ż—˙˙o˙˙˙˙­7˙Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍ �ż˙˙˙˙˙˙ţ۶ŰY�_˙˙˙˙˙öŰm¶Űm¶@/˙˙˙˙˙űm¶Űm¶ŰŢ—˙˙˙˙˙ý¶Ű?öŰýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍĆż˙˙˙˙˙í’Űm¶ŰH€_˙˙˙˙˙öŰm¶Űmµ}/˙˙˙˙˙űm¶Űm¶ŰŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ �ż˙˙˙˙˙í¶Űm¶Űx,_˙˙˙˙˙˙˙o˙Űoü:/˙˙˙˙˙˙í¶Űm¶Ó ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍC�ż˙˙˙˙˙í¶Űm¶Űh€_˙˙˙˙˙öŰm¶Űm˝CŻ˙˙˙˙˙˙˙Zß˙˙ňH×˙˙˙˙˙ýżŰm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÄN¶Í5¦ż˙˙˙˙˙Ö¶Űm·řŽ_˙˙˙˙˙6Űmż˙ţ!/í˙˙˙˙˙Ç·űm¶ßř×˙˙˙˙˙˙˙˙˙öÚÍť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ9�ż˙˙˙˙˙˙¶ßí¶ŰT�_˙˙˙˙˙˙˙m¶Űm°@/˙˙˙˙˙űm¶Űm¶Ý ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍo�ż˙˙˙˙˙í¶Űm¶Ű@\˙˙˙˙˙éŰ%ż˙µĄ@/˙˙˙˙˙űm¶Űm¶Ő#—˙Ű˙˙˙˙˙ßo˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍj�ż˙˙˙˙˙í¶Űm¶Űn�_˙˙˙˙˙öŰm¶Űmą×Ż˙˙˙˙˙űm˙űm¶Ń ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ5�ż˙˙˙˙˙í¶Űm¶Ű}†_˙˙˙˙˙˙˙˙˙­m§QŻ˙˙˙˙˙˙í¶Űm¶Ő ˙˙˙˙óý¶Űm¶ámť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ`„ż˙˙˙˙˙˙˙˙˙·˙ŕ€_˙˙˙˙˙öŰm¶Űm¸€/˙˙˙˙˙űm¶Űm¶Ţ�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍxż˙ţ˙˙˙¶Ô˙¶ŰI¬_˙˙˙˙˙˙˙m¶Űmł!/˙˙˙˙˙űm·ű·ýŘ×˙˙˙˙˙ý¶ŰoöŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ­˙˙˙˙˙ć¶Ű¶ŰW€_˙˙˙˙˙öŰm¶ŰmĽŮŻ˙˙˙˙˙ţm¶Űm·˙Ŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍBÔż˙˙˙˙˙˙¶ß˙˙űO‹_˙o˙Ű˙öŰ5¶Í˙ă@/˙˙˙˙˙űm¶Űm¶Ö ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€Íu6ż˙˙˙·˙í¶ŰVľßÂ�_˙˙˙˙˙öŰm¶ŰmŞ@/˙˙˙˙˙űm¶Űm¶Ý×˙˙˙˙˙ý¶˙'ö×mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍ#ľż˙˙˙˙˙í¶Ű·ăŹ€_˙˙˙˙˙˙˙m¶Űm§�/˙˙˙˙˙űm¶Űm¶ß�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍi�ż˙˙˙˙˙í¶Űm¶ŰR€_˙˙˙˙˙öŰm¶Űm˝Ż˙·˙˙˙˙˙:ß˙˙ö@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€Í:ż˙˙˙˙˙˙ćŰ˙űVB_˙˙˙˙˙öŰm¶˙˙÷ŰŻ˙˙˙ů˙ő­¶Űp·ü W˙˙˙˙˙ý¶Ű˙˙Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ@Öż˙˙˙˙˙ä˙˙’ßË_˙˙˙˙˙üŰm¶ÁýĄ�/˙˙˙˙˙űm¶Űm¶Ů,×˙˙˙˙˙ý¶óúÖ˙mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN€Í&6ż˙˙˙˙˙˙˙˙˙ćßĹÂ_˙˙˙˙˙˙˙ýVŰm´Ŕ/˙˙˙˙˙űm¶Űm¶Ü—˙˙˙˙˙˙˙˙˙ö˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€ĎPX�ż˙˙˙˙˙í¶Űm¶Ű\Ď_˙˙˙˙˙öŰjß˙˙呯˙˙˙˙˙˙˙˙˙˙ţÖh×˙˙˙˙˙ýż˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍdÎż˙˙˙˙ůí¶ŰV·ů�_˙˙˙˙˙˙Űm¶Űm§Ŕ/˙˙˙˙˙űm¶Űm¶Ű`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN€Í_˘ż˙˙˙˙źí¶Űm· HŽ_˙˙˙˙˙˙˙˙˙ó˙çŔ/˙˙˙˙˙űm¶Űm¶Ý€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ|żO˙˙˙˙ís m¶Ű|S_˙˙˙˙˙˙˙ű6Űm·@/˙˙˙˙˙űm¶Űm¶ÖÚ—˙˙˙˙˙˙öŰm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN©ĎP�ż˙˙˙˙˙í¶Űm¶Űlă_˙˙˙˙ýż˙˙˙ŰüÄQŻ˙ţß˙·˙˙˙[mKô`—˙˙˙˙˙ýĽŰý¸[mť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÄNŤÍ�ż˙˙˙˙˙í¶Űm¶Ű\�_˙˙˙˙˙öŰm¶ŰmĽ€/˙˙˙˙˙űm¶Űm¶ŢŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÄNŤÍwľż˙˙˙ţí¶Űm¶OĘ€_˙˙˙˙˙öŰm¶Űm¨€/˙˙˙˙˙űm¶Űm¶Ů`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍs�ż˙˙˙˙˙í¶Űm¶ŰE€_˙˙˙˙˙öŰm¶Űm @/˙˙˙˙˙űm¶Űm¶Đ÷×˙˙ýż˙˙˙˙üÖŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżOggS��0�����Îö'���m,Šš-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]t‚N€Í�ż˙˙˙˙˙í¶Űm¶Űh€_˙˙˙˙˙öŰm¶Űmµ/˙˙˙í˙ýż˙˙ҶŇŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ>�ż˙˙˙˙˙í¶Űm¶Űz~_˙˙˙˙˙öŰo˙˙úÝ@/˙˙˙˙˙˙˙¶Űm¶ŐÔ×˙˙˙˙˙˙˙˙˙˙Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍDţż˙˙˙˙˙˙¶ß˙˙˙ç,_˙˙˙˙˙˙˙ý¶Űm˝Ö/˙˙˙˙˙˙˙ţŰm¶l—˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ%Fż˙˙˙˙˙˙¶ß˙˙˙î#_˙˙˙˙˙˙˙˙öŰ˙úŔ/˙˙˙˙˙űm¶Űm¶Ô€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍS�ż˙˙˙˙˙í¶Űm¶ŰIŃ_˙˙˙˙˙˙˙˙öíý§µ/˙˙˙˙˙űm˙˙í˙ô ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍL�ż˙˙˙˙˙í¶Űm¶Ű{€_˙˙˙˙˙öŰm¶Űm«kŻ˙˙˙˙˙űm¶Ů-¶@ ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ�ż˙˙˙˙˙í¶Űm¶Űa€_˙˙˙˙˙öŰm¶Űmą@/˙˙˙˙˙űm¶Űm¶Ň—×˙˙˙˙˙ý˛[m¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ,~ż˙˙˙˙˙˙˙˙˙˙˙Ü€_˙˙˙˙˙öŰm¶Űm¸@/˙˙˙˙˙űm¶Űm¶ŮŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍc˘ż˙˙˙˙˙˙˙˙˙·oĆ€_˙˙˙˙˙öŰm¶Űm§Ŕ/˙˙˙˙˙űm¶Űm¶Ýz—˙˙˙˙˙oöŰm¶˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂN€Ím�ż˙˙˙˙˙í¶Űm¶Űa€_˙˙˙˙˙öŰm¶Űm˛Š/˙˙˙˙˙űm¶ß˙˙ôŘ×˙˙˙˙˙˙˙˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ8�ż˙˙˙˙˙í¶Űm¶Űp�_˙˙˙˙˙öŰm¶Űm´Ŕ/˙˙˙˙˙űm¶Űm¶Ţ€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N¶Í|ľą˙˙˙˙˙ÓţŰm¶ŰY#_˙˙˙˙˙öŰm¶Úµ°1Ż˙˙˙˙˙˙í·˙˙˙ňŔ˙˙˙˙˙ý¶˙mżŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍgfż˙˙˙˙˙˙˙˙˙ZĂ_˙˙˙˙˙˙˙ĎöŰjbÚŻ˙˙˙˙˙űm¶Űm¶Ü×˙˙˙˙˙˙˙˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ�ż˙˙˙˙˙í¶Űm¶Ű~,_˙˙ö˙˙˙˙ýżŰ˙áŔ/˙˙˙˙˙űm¶Űm¶ŐŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÄNŤÍg„ż˙˙˙˙˙í¶ßÎţŰSę_˙˙˙˙˙öŰm¶Űo*ČŻ˙˙˙˙˙˙í¶Űm¶Ő×˙˙˙˙˙ýż˙ý¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍE�ż˙˙˙˙˙í¶Űm¶Űx�_˙˙˙˙˙öŰm¶ŰmĽQ/˙˙˙˙˙˙˙ţŐ­˙a?—˙Ű˙˙˙ý¶˙mżŰýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ'�ż˙˙˙˙˙í¶Űm¶Űi�_˙˙˙˙˙öŰm¶Űmľ€/˙˙˙˙˙űm¶Űm¶Ü—×˙˙˙˙óý¶Űm¶ámť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍ�ż˙˙˙˙˙í¶Űm¶ŰO�_˙˙˙˙˙öŰm¶Űm˛Ŕ/˙˙˙˙˙űm¶Űm¶Ý@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍľż˙˙˙˙˙í’Űm¶ŰO,_˙˙˙˙˙öŰoÖŰm®µ/˙˙˙˙˙óż˙˙˙˙úZ—˙˙˙˙˙˙˙˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍX�ż˙˙˙˙˙í¶Űm¶Űu�_˙˙˙˙˙öŰm¶Űm·­Ż˙˙˙˙˙˙˙¶Űm¶ÔH×˙˙˙˙˙o˙Űo˙ţ•ť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍžż˙˙˙˙˙íţŰ˙űO_˙˙˙˙˙˙Űm¶˙˙ý‘Ż˙˙˙˙˙ýţŰţÝ`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍgż˙˙˙˙˙˙˙˙˙¶Oý[_˙˙˙˙˙˙ŰjÖŰoéA+˙˙˙˙ô­¶ß˙˙őŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ(Ôżţß˙˙˙˙˙űm¶ŰH€_˙˙˙˙˙öŰm¶Űm®@/˙˙˙˙˙űm¶Űm¶ŰŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN¶Í �ż˙˙˙˙˙í¶Űm¶ŰT›_˙˙˙˙˙ö˙ý¶˙úĚ멿˙˙˙˙ó–·űm˙÷`˙˙˙˙˙ý¶˙mżŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍB†ż˙˙˙˙˙íźűm·˙ő�_˙˙˙˙˙öŰm¶Űm®@/˙˙˙˙˙űm¶Űm¶ßŔ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ}ż˙˙˙˙˙í“˙í¶ŰGÂV˙˙˙˙˙˙Űm¶ŰmĄ€/˙˙˙˙˙űm¶Űm¶Ú¨×˙˙˙˙˙ý¶ŰmvŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍj�ż˙˙˙˙˙í¶Űm¶ŰU€_˙˙˙˙˙öŰm¶ŰmĽŻ˙˙˙˙˙űm˙˙˙˙˙`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ"�ż˙˙˙˙˙í¶Űm¶Űh€_˙˙˙˙˙öŰm¶Űm¨€/˙˙˙˙˙űm¶Űm¶ŃÔW˙˙˙˙˙ý»[o˙Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂN€ÍFż˙˙˙˙˙ŕ˙űm˙ř �_˙˙˙˙˙öŰm¶Űmł…/˙˙˙˙˙›ţŰV·€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍMXż˙˙ć˙˙˙˙ő ţßĺ�_˙˙˙˙˙öŰm¶Űm»€/˙˙˙˙˙űm¶Űm¶Úŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍr�ż˙˙˙˙˙í¶Űm¶Űu_˙˙˙˙˙öŰm¶ÚµŁ/í˙˙˙˙˙ő˙˙˙¶Ôŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ)¶ż˙˙˙˙˙íţŰm¶Űx€_˙˙˙˙˙öŰm¶Űmą/˙˙˙˙˙űm¶Űm¶Üč×˙˙˙˙˙ý¶˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ�ż˙˙˙˙˙í¶Űm¶Űb�_˙˙˙˙˙öŰm¶Űmľć/˙˙˙˙˙˙˙˙˙˙¶Ó˘×˙˙˙˙˙˙öŰmµŰ%ť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍĆż˙˙˙˙˙í¶ŰV¶ßĆŁ_˙˙˙˙˙˙˙ýż˙˙ó€/˙˙˙˙˙űm¶Űm¶Ú€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ|�ż˙˙˙˙˙í¶Űm¶Űc_˙˙˙˙˙ö­o˙Űm¤Ö/˙˙˙˙˙˙í¶Űm·ůš×˙˙˙˙˙ý¶ŰoöŰýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍJż˙˙˙˙˙˙¶Űm˙źôŁ_˙˙˙˙˙ö˙m¶ŰmĽŃŻ˙˙˙˙˙űm¶ŰţÚŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N©ÍCĆż˙˙˙˙˙íţß˙˙ţcE_˙˙˙˙˙öŰm¶Űm§Żíţ˙˙˙ζo˙˙ň€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€Í.�ż˙˙˙˙˙í¶Űm¶Űs_˙˙˙˙˙˙˙üöŰm˘€/˙˙˙˙˙űm¶Űm¶Ú ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€ÍaÜż˙ţ˙˙íţ ˙˙Îł_˙˙ó˙o˙˙oöÁ5­�/˙˙˙˙˙űm¶Űm¶Ô€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍI�ż˙˙˙˙˙í¶Űm¶Ű�_˙˙˙˙˙öŰm¶Űmż€/˙˙˙˙˙űm¶Űm¶ß×?˙˙˙˙ţŰm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NťÍ<ż˙˙˙˙˙í¶Űm¶Őžţ_˙˙˙˙˙öŰm¶ŰmŻ)Ż˙˙ű˙űm¶ m¶ÚŹ×˙˙˙˙˙ý¶Űmżíýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€N€ÍNXż˙˙˙˙˙˙˙˙˙ţŰ`S_˙˙ö˙ý¶ŰmżÚ´ßŮŻ˙˙ű˙ř-¶Ůż˙ú@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN©ÍWż˙ů˙˙˙Ö˙ó­˙˙ó¬_˙˙˙˙˙˙˙˙öŰmŁQŻů˙˙˙˙űp·˙˙¶Ň ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍdFż˙˙˙˙˙í·˙˙¶Ű€_˙˙˙˙˙öŰm¶Űm®f/˙˙˙˙˙˙í¶ß˙˙ü —˙˙˙˙˙ýżŰ˙öÚµť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ~Šż˙˙˙˙˙í¶Űm¶Űb†_˙˙˙˙˙˙łnÖÉ˙đ�/˙˙˙˙˙űm¶Űm¶×€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżOggS�Ŕz�����Îö'���FßČ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]tŔN€ÍZ�ż˙˙˙˙˙í¶Űm¶ŰHŃ_˙˙˙Ű˙öŰm«Mm¤±Ż˙˙˙˙˙˙˙ýk˙ő�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€Íu„ż˙˙˙˙˙˙˙˙˙˙˙ücG[˙˙˙˙ó˙mż˙˙č/˙·˙˙˙űm˙˙˙¶Ü€˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N¶ĎP6Nż˙˙˙˙˙Ó¶Űm¶ŰK€_˙˙˙˙˙öŰm¶Űm¶qŻ˙˙˙˙˙˙˙˙˙ë˙ňf—ó˙ýż˙ýł[jVÚµť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ�ż˙˙˙˙˙í·űmţŰf�_˙˙˙˙˙öŰm¶Űm˝�/˙˙˙˙˙űm¶Űm¶ß@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÄNŤÍI�ż˙˙˙˙˙í¶Űm¶Űw‡_˙˙˙˙˙öŰm˛m �/˙˙˙˙˙űm¶Űm¶Ő`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍR�ż˙˙˙˙˙í¶Űm¶Ű}�_˙˙˙˙˙öŰm¶Űm @/˙˙˙˙˙űm¶Űm¶Ô ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN€Í6ż˙ź˙˙˙íµ?í¶ŰF€_˙˙˙˙˙öŰm¶Űmµ<Ż˙˙˙˙˙űm¶Űm’ݨ×˙˙˙˙˙˙öŰmżŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ�ż˙˙˙˙˙í¶Űm¶ŰV€_˙˙˙˙˙öŰm¶Űm˝?/˙˙˙˙·ű¶ŰmJßŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ.žż˙˙˙˙űm¶Űm¶Ó„€_˙˙˙˙˙ö˙m¶ŰmłźŻ˙˙˙˙˙˙˙˙˙˙˙ó—˙˙˙˙Űý¶Ű˙öóýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ �ż˙˙˙˙˙í¶Űm¶ŰRŁ_˙˙˙˙˙˙˙o˙˙˙÷Ż˙˙˙˙˙űm·˙í˙÷`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍc�ż˙˙˙˙˙í¶Űm¶Űk�_˙˙˙˙˙öŰm¶Űm˘ĂŻ˙˙˙˙˙űm¶Km˙óÓ×˙˙˙ö˙ý¶ŰiĂŰmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ�ż˙˙˙˙˙í¶Űm¶ŰU€_˙˙˙˙˙öŰm¶Űm˝Ŕ/˙˙˙˙˙űm¶Űm¶ŇŐ×˙˙o˙Ű˙˙˙7˙Íýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔNŤÍ�ż˙˙˙˙˙í¶Űm¶ŰQ€_˙˙˙˙˙öŰm¶Űm˛Ŕ/˙˙˙˙˙űm¶Űm¶Ü ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍzľ­˙˙˙˙˙ć˙˙˙˙˙Ö,_˙˙˙˙˙˙˙˙öŰm°@/˙˙˙˙˙űm¶Űm¶Ý@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍU�ż˙˙˙˙˙í¶Űm¶ŰH_˙˙˙˙˙öŰm˛[oŕŔ/˙˙˙˙˙űm¶Űm¶Ő`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN€ÍkFż˙˙˙˙˙˙˙˙ŕçű|�_˙˙˙˙˙öŰm¶Űm˛™/˙˙˙˙˙űm¶Űm¶I}˙˙˙˙˙˙˙˙˙˙˙ýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ%6ż˙˙˙˙˙˙üëm¶Ű`€_˙˙˙˙˙öŰm¶Űmş@/˙˙˙˙˙űm¶Űm¶Ű@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtŔN¶Íe6ż˙˙˙˙˙í¶Űmýk@€_˙˙˙˙˙öŰm¶Űm¬łŻ˙˙˙íţŰm˙űR·XŔ˙˙˙˙˙˙˙ŰoöŰýť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ,�ż˙˙˙˙˙˙¶Űm¶Űlł_˙˙ö˙˙öÚwé[oü&/˙˙˙˙˙˙˙¶ß˙źő@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ-Ôż˙˙˙˙˙í˙űm¶ŰX�_˙˙˙˙˙öŰm¶Űmż/˙˙˙˙˙űm®Ű˙ńŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍZ�ż˙˙˙˙˙í¶Űm¶Űt?_˙˙˙˙˙˙˙˙˙Űm©ő/˙˙˙˙˙űm¶ŰV¶Ű@˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍ(ż˙˙˙˙˙í¶Űm¶Űh�_˙˙˙˙˙öŰm¶ŰmŻ�/˙˙˙˙˙űm¶Űm¶ß¨×˙˙o˙˙ý¶Ú•¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ 6ż˙˙˙˙˙ů˙˙í¶ŰM€_˙˙˙˙˙öŰm¶Űm°�/˙˙˙˙˙űm¶Űm¶Ü ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍż˙˙˙·˙˙˙˙ÖšŰJ�_˙˙˙˙˙öŰm¶Űm©€/˙˙˙˙˙űm¶Űm¶Ú ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍk�ż˙˙˙˙˙í¶Űm¶ŰK_V˙˙˙˙˙ó˙˙˙˙糯˙˙˙˙ţŰm˙˙˙ř�˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt„NŤÍRż˙˙˙˙˙í¶Ű¶Űa€_˙˙˙˙˙öŰm¶Űm©€/˙˙˙˙˙űm¶Űm¶ŰÚ—˙˙˙˙˙ý¶Ű]¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚N€Í"¦ż˙˙˙˙˙˙ţŰmţŰKj_˙˙˙˙ýż˙˙˙˙ý©Ż˙˙˙˙˙˙˙˙˙˙˙ů`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛ÖµżtÂNŤÍBż˙˙˙˙˙˙˙˙˙˙űp¬_˙˙˙˙˙˙˙˙˙Ű˙éĹŻ˙˙˙˙˙űm¶Űm’Ű«˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt€NŤÍ[�ż˙˙˙˙˙í¶Űm¶Űo_˙˙˙˙˙üŰmż˙mĄ€/˙˙˙˙˙űm¶Űm¶×ŕ˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµżt‚NŤÍh�ż˙˙˙˙˙í¶Űm¶Ű@€_˙˙˙˙˙öŰm¶Űm @/˙˙˙˙˙űm¶Űm¶Ń`˙˙˙˙˙ý¶Űm¶Űmť°UŐŐŐŐ…]]]]XUŐŐŐŐ…]]]]\ť˛Öµż�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/empty.tta������������������������������������������������������������������0000664�0000000�0000000�00000233262�14447736377�0017020�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������TTA1���D¬��Ŕz�)“RLZ��RZ��Z��Ň'��` „_��������������� �������������������������������������@� ��������������������������������������������������������������@����������������� ��� �€�������P���������������@�����€�€����@���(@�� � ���€���� ��������P@�� �����@€� €�����€€���������� €€���€€� ��(����������(���  �P�� ��������P(���A�� @!������ ���€�Š ��� (�€ HB%�%„B ��D���@��A����������PPP€�`�(`“�����P@€I� €P�P� �����“������P(� @�������ĚT�C�� @�Ŕ„!PX @a� �����@AÂ���  �&����€ d(0�0 ��L ������������� ��@ˇ&€" �E� (EaPtP`L��€�L T�€ ���E�� P[������€2`���”�0�������`�“�����e����e��Ŕ$@Y ™��Ë€ą ���d���0ąlr1“Ë���€I�€Ú&a€2����Ę`�����Ę�*��€ € e������e��T€I��LR6 �e�0��������&P �µ �€ �e�”Q[����0ą `�*�Ę��Ę�����&������`��”eT�`Ę”e���0  €¬ �����”Á�`®— ��€��e�2�*��“0 ������P6 ���0 ������e�“”•��”�e�@���Ŕ¤ €ÉeP6������”LB5€2���������P�L��  `RŔ\Ť!�  ��&�@�`Â�Ę��`��Ŕ��(›„���  �&�P�€2����ćjL`�ĘŔ�e�e�”Ŕ  &�����”AŔpŮ�0 ��”P �����”�0������� Pe��”•��L��  ���€ �����Ŕ$�e�0 Ő��€ 0WRíI��(›«1aĘ�(���€I  �dP6L�€ �C��  ��€ÉeSŤ  �����€I������€I¨L �0 Pm�€2 l¦j T€����Ŕ@6�L��”A�   ��@5��€ 0 ���”@1���&(���€I��&P0PF5&¤6¨Ć$ĂŐ �””��µ(ŁT������0�Ę�`�0ę�“!L`�€ @Y5�������Ę€2�„j��ŔdŞ0Ŕ$����P)«��ee•!L2¤Śj�`®V �@0PŔ$0É�L��L�e�3( lŞ@�T���&e�� ¶L��Ę€2�`(cB�Ő���(ŁePą �����L� L2 ���&@5 ���PV@5�«ÁŐ���@P��(Ł �€2Ŕpµ'á!µM¤ `�����Ŕ�Ô ���€Ę��€I`’  ʨ��ćjEŕ e“ „�( �Ěä $����P�€! a�` �P6\6„'`¤ ���*� �e@Ů���eTŁC����@�T€ � ��Ŕ€��Pˇ�@”AÂ�0�Ę���`€k*a Śj�P6 C�€2����  (����`–Á„!@ ”�0Ń CĘH`@Ő(�����Ę�  �&0Y���� ‘�� 2�PÂ���L`€)�����ćj¨Â@Ym #CŞ1“��( Ú$ �������(Ę������  ��Ę�€ �<ˇ¶„�Ę��&ˇ (S`rŮĚÉ00 ��`�00 f �e���PF›2€jµ%L5&����PŐ2�Ŕ“�a�¨„™Ă$@x’!RŔ„2T P������`” Ś« © Ŕ������„'©Ť���0 Ô������¨�&af�0�L„A�PV6 C`�̆d���€2�eĚŐf&Ŕ$SŤ!L�„! L†˛2 l&™I������ŔÂT d& É0™Ŕ$µ������¨Ť�0�����”A��Ę a3 C���(« aCĘ ��“ É(Ę€0����”A��€ a bʨĆ`Č@�„! �������� ��(��”A€˛J������Ĺ ���Ŕ†ËÔ��*V-� �����Ę ��������x&a`ĂŐ†0@��€0�����T Â�€0�“0„  .� ����“�a( O’Qca��„! ”A`’ˇÚL��`¦j ���� �@\mć«Í$Ł�&a��”A���(������0„!yõ‘2Č@¤¶9a’Tl���\¦��0! Pa&a�LÂ�������� ¬@6Sa��€IĘ”ÁŐ†0e€�€I€0Ŕ$ a�€˛ÉeÉCLj#aÂ0 �  ®6\m&eCçjL2d�”Ae����Pa(”=śĚś¬ ����¨-Ő y���( @5ž“™„�€Š‘0��Ŕ �”a ���ŔdĚ�Ŕ$ a   ”A€23��PČ�Ŕ$PxĘ™�€2&™'‡I��  R6ąÚL2Î@äáä! ��0W›Ix�P)†0�P)†0�ĚŐdžL�.›d€!L„��†0$3�”AxćÔ6u{�€0��Pa����`¦  Pa��������` CĘHÄ$Č ĚCr˝†đ$Le»pć9 Ęćdd—M€��€2Ş dć0��ŔpŮf�”A L`j“Ô6'S[€ÉÚ  &ŁĆ$3Â����x8<$O5&gž”AIÂ�PF5žDÉ0�€2¸Ú<'3   ’µ�����@6!L������eh 0d˘í g&a0 C�”A2C0��€Iş1W›IfH€0&a�„©Ű¬$2Hf��0ea”A2CÂć2HfB$3\MĆ©·@sj.rćçŔ“3”a’'djĚ�*aNžáĚ<C��”�PÉLĘ ™ j«ĂŔ† ÉC  ’yS·™ä! @fN2“3Ď(Y �®mÎI"0„ @$3d™\$Âp2(0jF ÂL��&0„ą rm“d†Ŕ&��@$󄵑@Ů“ä!Ŕ���Ę ™ �Ŕf0 ‡ ��µ%0aŔ$ aÎL„áĚ&a83�&a83d†ó†3��  0u›If’!yęŰ<3'‹Ňpm&C9 É s5“!L2Ę Č —A��P69<óa&gV d&��Ŕä˛Éá!PŰpx8 ��€ �Ŕ�(0S­ž†0IÎL�ʆ“ç9gŚ����L€IÎL� Ś9™IFŤ9™I@Ő"0��(0“˛Ix8L&’™Ăµ@f������”A LÂ$L����Ę&©7N† ”A'0„a83$ g&€ «Íä<O���`t>‡@ŮäđpfRa2Ăá98Ěä$ŠÂä$��Ŕ\mćd&“Ł ’!0 “3CÂä<Pm$Ěä$Â$ çśD���€2H†LÂäĚ�&arF r˝QÇ&™‡Ë&~Ö–Ěś@´XôÁ��”A2\™‘M ‡!g&���0 “3�����&r˝Í!eś™ &©ŤC�&arf“093PÉTdµ‘Ě„ ���0 “3€Iś™�LÂđa&g&LÂähdŔ$393��d&g&PÉ€IśQÔF&ař+oóő·ó)�„ÉWËb P Ă™ ”A2 j2uŚśy��LĘÔ 2ÉL`’™|m“ d!L�d&g& ���„0˛Éá'źççÁ$Hfr2™É™ �Pa¸ Â@„!”A�0 “3��€2 3˛/ź<ŐĘ®ĆfÝ2d&Ěĺ’™s�䩏;ú9AJ4‰��ÔF2„É$óĚĐMŁKŚśy `reËG'�&™É™ąŘ†��Ăáá“§„!L2“3“2(ĚŐfÎ9G������`’™úlOÂĘ —MN˝q!Ŕ$'&��Roó9Ďm9J�ááŁ��L.{ň©5±Ą…GT€Đ$ťDd&'�������Ŕ$393�����€2ćäyΙ ”™!aś™�“ŚZ†k›kC”!”ÉÂTPcŞAjfÚ®†�Ŕ$393���€I’‡3��������DśÉĚ$ÚňŐ†d����0ÉLÎčXťLµ'ÉC€ąŚjCx†IjcÎś#Ŕ„!�fřĚCŽŢ¤<M"cEC�����`ÂLÎL  ‚ Â����(0\—˝ě0\a�Ŕdx>çőv &Pae†�sŮĎó3€2O2Ď9§¶ � ă3ó`393��€ 3932C���(0¤ Â(ŁsŮ!L€2C��`ÂLÎL�L_íz83„ �”1W{ćë– ‚��0™sfÂĂG�  Â����ˆsž'”A��������PA„!��2��0“30sÝfC(0�&ĂÂdRŰä3?*V'3.0�`ÂLÎL�”‘0�`ÂLÎL�������€˛"!�Fí@†PFÂ�j †3Ďa&g&eÂLÎL��0“0LÂ0×mć0��@V µM 3 Ă$ڶ„arf�����”‘đ�d@ ?ÉLÎL������0“3sŮśëmňÉ‘‚hEĚ$ “j$<����&ĚäĚ��Ęçrf�e$<„ą˛ńůĚ2sÎL"�€2�����Ěe3çĎ?G- �B¨Š��*VçŚl8<ĘHxfrFF2”Í9ü€ś™�PFÂC�€ 393`Â<ç<ĎL"��0jgČC  >ő[Ť�T0Ă_łˇŞ#„P ” Ěää ¨éOćŐ"á@�&Ěä›Ďś?şĆˇĄ���$#‚E@593` źy'�&ĚäĚĘHxČ„™„arf@Ĺ8g�@ ŹZAÂC��ˆs~†0“3`.{ôčnY¨±±oM‚jÄbĺO­1ިI˛–łh€`1HxĘHřIćyG‚Ę”Soäđ �ôö) ¨*P[ć$Rf����0ažĎyžQAŽÖ–»ŚI�����” 5“ĂC€É0ęŤ3ŐČá'0ąŚ9y2s dądp ��eEĎś3“ 3ůjŃŕ@����`ÂLÎL��€ąlęŰy8Áyô+ Ľ2Ś,1ť9����&ĚókŤ˘Lqđ@�Ś�*–sž‡€Ims>ń±¬A0wŽ˘ X€ą˛Őźçş)€yžŁ&�Ŕ9<�Ěe3ę1VE�BóÔőʂǾŤµâ€��0f’R·TńQE���“Úć|ćHF$ĎpÎ W6ţ¬ă��!DTE`6s„áyjŚšD��LÝ2GW›AŽ”Ľ¶`p 3g€ 3çĚ�€ 3çk›38���PFľěa°Ś,�€2rxŞ‘ĂC�`ÂĚ91“ŹĘĆG@�*¨:“L9“�PV9aʨogY&y �`ÂĚ9Âň9ç@��€  -'óĚ93���(#gžĎ¸VU„�� ÂĂa’''�(#‡‡0ać„™9““Úćó«}Th ����@9<€É0„Ś 3“���đÔŤ9çő9 †“G“�sŮp>Ç!-šaŽ@mYTa 1hc‰Ť€@fÎ�“‹MÂŹ*"�`ÂĚ9óH9zpH1VŤ±*"�0 VŽ{¤sÎOŤ±*B��cĐÁA3g#É3śjäč ™0s&���€ 3çĚ��ć˛áϸŠHŰ|Ö8 �ˇjTj�PF’g8g&��fľ|açޱu#€HFĎ|±ŔŁŽ1¨âŕ��¨`ćś§�����@śü¬řŔ«F�@2b° 3gN0)¶ó?xŚUŠiŐ1¨0 �¨ jÔ��������LxřĘ®ń8µÍ˘ 2BÍ™�L9ç…Č̉����(#‡‡�fÎy&����@9<dÂčv&y�F·ó ®X5B�@…™3(bćD@„™3'`ÂĚ™��@9< ŚL9ç©�&Ě|Ý«ř`@€dppĹŞ˘¬–!ÓUG�QŰ,fŕ<óKČĚÉbĐŘ 38"kyţ5;´0 ����*¨Šc TŤ� Ś�0až?qŤU#�@5çu)¬2ü( j„Śa=ڶ'€Cc$ů Fx™��fÎy*�ĘČ™t;“<P9<�P±|ľî’–CĚś°†śzĂ �P9<��������ćĚčv&üDĺI3���`2Ú·*.#‡‡ÉRágl;ŚŇ€` *,�d�PŁÔŤ*(«ś0C¨Ť|mO>8����33çü@­KÇX5B�B¨©& Ş-Ť@�Ë'óĚś3HfN��0až?:ŇNŤĹůŮŽŮZ5† ���$#‹ 23çś���&ő6źÇ8P6‹uŤC€"ŞF0†8< ¬’3Ď™9€můcÔŃT8�������(#‡‡�µ‘3 sÎS”‘ĂC¨ŤŔś™9áaÎś�����&Ě|µź1ęŞ5B����H|ꪣ1h`A:8ęŠU#„‚¶‰Ö7ĚŘ7Ta@�,CŽ}C��€ÚČá!���0gfň×ÝĐUʍ¨ ¬" ���fÎy*���¨X>çYÔF�Ł7ť=h”��¤Ž,H9<33çkGĄcÔ!����������Ŕś™9ç)‚™sN�PęŠU#ĐZô/wš˝äi@��€dđ¨+VŤBD ©ĺçGcPa@0V"3u“�����@9<€ÚČá!���ÔV9a†�Ŕś™9ç™0ać̉ŚáşaŽp9ŻYĚŘióĚ9$/wđ`Ä ™91�0F¤ŢňóvvTé¨!��€PDĚś��ň<ă�@ęFÄ:ąŁÝáXëe *ŚŘ˛ĐKPÄŞ˛ *¤¬©„����ÔF?ÁĚg¬ ‚™OŤ€ąZđ=˘Âę0§RŔ9üČfq]Ç�bŐ�BŐQ#Đ9ó‡±j޲ľô !bŐ0młLErV‹2 "’óÓžŤ×5�cPa@�BšU—qs �TPulł¨Â€` é%WI��f>ç �&ZÎç9$����$#O Vc…PSvôŹcaÄŞ)��aĹŞ�� 9őc°¬íł@3Ta@��€ kűTPFľ¶G·l´ťe5HŚAŇçŕ©Ô¤É"T{$X 3¨¦,ýäí Â@c¨Â€�Śsx�����0á™ĎX��Pá™ĎX!��TđĚg¬�*xćS€3��¨íâ$™0`Â3çó\X5B���őŹ:P���*XŰç Š��€ Ď|Ć  _łŞ�TđĚgŚ���$㢌|ň?±V`;Ă–ˇęˇ:ĆU#c¨m–IˇŠP'Ďś�8ÁĚjźyâ@�"\í™�Í<35|jLÝD ¨Í膧p¨Íâç:A±j„����¬:j„�����@OcU������Ś|ř§•˛Xk·Ýˇ[vV·ěĚ �°L…°nha 1Ta@��������Ś1j€ � cĐ,çđŔ„g>ă‚F,EDž×YTĺ@��������@��žůŚU«ŽJM38™äŚéĐ0üS?ĆŇQ·ł¨Š��„0bŐĆP…e·ü\Ç!0†*Y]u����’ŹzĹŰ:kWX5˘1”t ¬Ł!I�€ Ď|j„"śüę†V��PĆ9ó@@Ď|j„�����”qÎ,ËůęŢ­5×zŚË‚ŚÁŞ0˘0bŐ���É8Y\ë8$����HĆ,‚duŚő¸ę1®!Ŕ2Ta@����RÇiF ÚnIa.´0 Ô«FQNž9‘1ĚŕjšĄoX…)ÓŚ}Ă*�����@ę8ͨ×ÂŞBTÎů©ŹxŮgúeÇ!Ł e#VŤhĚ\ÉâX+}v­1"���Ć0.�����@ę‹��� Ć˘bU:ĆŕJĆë߆~áÓŮ’Ú,V!eXÂC%E€eĐŰ왾ę#¶ U8„1.=ĆeF)[Ś…0bmg± Âk}<ÖŠŁ*`vÓ°ĚÜb@€e¨BĘTŇ1°ę�F¬!„rh›óŕ”­—=fע ,H�B±jCŔFa@€˘c u©pÔ:€«F° µĹL+†1Ôä@����¨Ťsć!ćää™p¨pÔ:€«F@1ƥǸjDcć–������� ‚Uă¸.Ű„…µŽ«F����¨`Őq:‹Uq@0±şę8ÔjËfµb@@#VŤ�Ŕ2IŁ7Uĺ�����ŚsćŐĹ9ü �HVí„y@çĚȨ̌F�PĆI~VŤ����Lxć3.Đv×Â*E@#VŤ€Ož9��PĆůŞ»*«FĹš~–±e*ęD���eś3?��*¸âŕÚv‰-!łn3Ĺ€B´«>�TđĚ_ÝW|ÄU)SU����€dŚÁE@‹ŁF¨`ĹRĐM˙ÜŮKcŔ������*XuŚUA2ƨ �ÉŁ. hÝqaŚ( ¬:B����@‹cĽ€ć°4PÁW}Ś«Ž��0†Zq@€e:±¨×x4‡’ŽUčĐ¡ë8ěęb­1i���„0â¶ÎôŞă����ŚÓ,˘p�bE­ăŔÍżôÇxY �����ÉG]1âqŐ3wiÄćBWL™tŤ‡1Ő+Ž-‹U:VŤQ±j„B±j„���Śaq@�HĆ8â!Ť¨u¨ŠÇXŻx€��@c|sř…‰±°µp”r¨Ň1°jDS¶.<°‚\¬ÇZA����@2ĆQŠXc]z ¬!��€dŚ#s¨�€Ôqšˇ.�¤Žń”Ťşâ!ŚX5B�`ęCŻń«F���° ă������uę*~čjĹEŃ Ż×ń��–ˇV�����RÇ8ę" uŚ#ŽX1bŐ1ŠÎôZŹXcTŚXu#VŁ0b)FÄŞ#�Ä�„0Ć«>ĆUG�������€dŚŁ.��T°ę/ÄŠUhÄŞ#���@2ĆQ���¨`Ő1® �¨`ŐQG–is´ŢAëx”ue¸˝ăÂĆP+���� ˘Çř"ÖvŻzŚŞ�„0bŐ1 #–FD¬:B!ŚXuŚÂW}ÄeÄjŤÄ˘ľę™bŘş…B±4"čęâZŹCڎV€bÄŞ#��ŚĄcąşěŮXWćP+4†Zq@EĘÖ…‘jĹ�`™6ëu<$��ÂÂŞ#c¨�����(âZÇŹx@��¨`qÔ������’1Žş*jqÔ€ ŽšfU 놮8bËF}Ő‡YýUʤZpuµłQ‹8 ¬h€ «*VŻz"„b`ŐĂÝż^ÇDH(вA0†Z11ŐŠ�� îĆ·ż ?šLĐŞ•É1¬`ňŠ ���1��PQ‹Gˇh٨/ý)F\uDcĐvWQ8ĚĹ[wĐË>Č������@ęF)T#„P->đ€���HVÇăřXżÂ‚1ÔŠ‰©VQ1°ę�€ÝŘă·w?ÂE†�P,‘���ŠUGĹŔŞ#C­8 PD¨ #‡ľuS¶p@��„0°ę�’1Ž8Ě™[ő¸€!C-:Ăşál}ŐAÄ›ŘfîRša­8 ���ËPĄÇĐ[÷Xë8V �,C­´[Q8 ��€´Ă×ëc ĆKăe‰µâ�EĹŔUG������ ˘Źq„�$cq@@ęG€Š¸Ćú#ëzşę Bäj]ŹŔUǨ±9]ĂjĹ��X†Zq@��€Ô1Žş ���$böńÇQuŚő����@ŤZ¸ę������ uiv j¤ŽqÔ€Ô1Žş @ęOŮłkǵ����������RÇ8ę5¸´p¬u„���€´c„���¨QW¸jˇPŚxŐG\#pŐB(.ŤAŮő˛Ů¬®Q/:@����@(­:µŽ€ĐĐƤÂĆP+���©cqÓ-;Ö_ńHĹ—=hŮ ‡ÁZč × ÎęeŮYX�@(V!���ëFaÔöýîÁÄÖk;ή— I���Š«rX+��€ŠjÝă…1 ��������€dG]PQ—¦nˇp@0†Łôşę��TÔÂUG4†µâ€���ÔÔ­őŐ~ŻĹŔUG�� „…«Ž€0âUńŞ#d™ ˇ!�ưVŚa­8 ��R7 ˇ1B�PÁĹŁŽ�c…ÇĐUG(×v׊�c¸9Ś• � ă© ,����©ă8ę"����ęÔ­ńO0Ckq@���¨W!�° Ç«Ž���5jáŞ#�€µpŐ�¤ŽcĹ��TTë/Ś��������¨Đ?> @PŚ¸ÖŹÇ¶Q†I)”ŔaX+�„pŕŞ#c¨+~ŕUG���ˇPW!���PÁĹŁŽ������Čd����É8žşë¸â€����@2ŽŁ.‚ŠşâUŕ±Ö�‹«Žăí:ł«<&Y,‘���@€Žăşă­ Ál"H W!�€1¬�����É8Žş����RtŹ^Z)ĂUʱě¬^§gňş†©Â‚˝ęÇP:.]Wú�¨LkEĆP¬˘���� uG���� uO»«^ăŻ:B��DĹŔUG° kĹ–a­2­ Z6Ö—~D–aÝf±ąńşÇUa`+NŮ×!k × *R0Ş ��cX+´ uĄźĹżÖǰ””I ��€P \u„�����$ă8ę2g]-z6~{wÄŞGȲA�����@ę8Ž8 ��€´ŠŃvµ=õĆŔµ=/cmg´*e×/űA+f&$$W!����€ŠZ¸ę�€d<ÍB•ž˝˝ čşę���PcE”6ö±~Ńź• „���X†µč®Eϰ´p�×ö,®Ťµh€����€¨8Tz  ŹxŐMl˝ę1ąZ‹�����ş4;¤őŔ«Ž��@ęęQÇq­#Ŕ2­‡9­�6«R¨Ć¸eăön=HT#dÖŠ�Ŕ2¬EĎčZq@�������@ęâiF=ę ßşQW��–µnb@éoď Z¦µâ€��–a­8 ���©ă8â€,ĂZq@–a­Ź‡ľŇłşÖ8D�¨bŕŞŔŔĄ8W$����Š«¦YÝ X8Śi­8в֭B �WcĹŔUÇX1pŐ������€ jÔĹc\Ń2¬EĎp­8 ����@ę8FĽ]u*®:B���QqŕŞi¦«ŽăZÓ¬VŃP¬ ˇ!�°,®:Žk!��ŠG-LÝá€��ˇ8pŐ8âZÄÚ8¸d!v]r<`±D������(QuŚ®:B�����uń¨# ¸ę ‡µĆÄŢ^ĆTŠ�ŚŮ±¶Č´p�an]×ô™®‡r¶V!šXýŇăŞA ÖŠ Ť!„^xÄŠ—b \u„�����HÇá—~ÄK#Ćq˝bĂÖŕ0¬‡rX+�,ĂZcÄŔUGr��������:ŽŁ.‚Ôqq@�H»QŤ�ęÔ­őK?˘��QqŕŞS&��`ÖŠ`Ž�����:ŽCď8Ţf?Ö_r"�`1´&aŔR† ��€ =Žë&���JŠW!DĹĮƀ€P¸4ĆWý — �� ®šfZ+4†µâ€Bń¨ÇZGˇŘő˛łq[D >ŕ˛A�Ă­  ®:Ča­8 ���HaăýqĽÚ@ pŕ­6T;‚‚Ťa­8 �–Ĺ«ŽăZ BqŕŞ# 8pŐ�€��@E]<ęĹ«Ž���¨Đ]üńz<$��Śa-z†Ą…‚1¬���¤č>^ô™.J ��0ĆĐÂ!®:B���€dG]ćl· 1�č1®Żx@€eX+���öřÚ>Ëî®<ZQN.v ����–+EAe„���©‹cĹ!*µp¬u„�������¨QŹq„�€ŚÔĹqFDŕŞ#dÖŠEgúőz|�����������PŁ.ă ©ăXq@���:ŽŁ.���5ęâQÇXqÄK?âeưV`,^ő8®u„âŔUG�€ťµŻ_éÖĹč*:¸$ŤŔU‰e[I/ü6K$�€ pŕ*ÇXqŔe@t†_Ë0‰�����€ 0`)9¬‡9¬«µâ@cX‹ž±kŤĂî ����PS·ÖŻögŮkŃAE\í íĘ€�@(\u„� Ţşc»2,�ĂZcDŕŞ#ŔÖŠ��şú¨Çq­iVkʼn ���°Lë6;ÖŘőUŹC,ÓZq@���¶ÓŹöťĆ?`łD‹©^é,–H������jq¬8 ¨8đÖMzâ\u*\u„€¨äÖu?ŠTRšŐZq 1¬G¬8pŐA����€ŠşâKCFÚ]Ôá®:B@®íYĽ ��� „WŃÖŠŚa­8 �@´ě¸~éPX,‘cX+�BqŕŞ#dY-®ăˇ«Ž��!¸ę ‡µâ€€P¸4ĆŔU9¬d kĹ0±ëKÇcčŞ#��� ®zŔÎđ×v4'$aŔŇ%nYĘá ›%����������‘1 e!���íNł}„���¨QŰłp­8 ����@ę8Ž8 XDZâ€��RÇqÄaή]ŐőńC^–H�ĂZ1ezŐc¬$�Š){˝ ��,ĂZqĂ*<˝jšŐm@T¸ę�l¦+í;›] 1bĹĂŤ­¶čhXÔ/ůA��������@ę?ťýhoň@€P€­dąŇ z†-… µ+0]żĘ!‰��„m6Ö_rB”BARk¦4 ��€ĹÔZ,ĂZq@�� u<-Šk!d™í®ěµbĘŞ^ăĽl������:ťq@��RÇń4;Ö+����©ă|zëŽ��°LkĹ�Ô¨ Ż:B�Bíłńץ0�� ���lş•Ă ���Q- - �DÇŠ�RDZâQ8𪲪:Žzj„����HÇŠ)«µĆWİV�Ŕ2Ű]…��TÄW¬+â:Nîő‚1 ¶hT ���^u„��QqŕUG âŔ«Ž��������5ęâc!��5꫎@ĹWˇ¨8đŞ#�@(|ëŽzĹ���–áXq@���@E]|Ô�� Y}Ó݅Š×z|čUťŃUh( Şh€���`ÖŠ��� F]|Ô�„겻Bá€� aŹ_őńX8đ˛DËŐ (Ćz=rY"���ŠŻ:˘1¬5ˇ8đŞ#�@ =;ţúŻô�� bĄ!©¤ P<đ5ţh7šŔaPşX* %�0†Öâ€�����:Ž#�*ęŠ/ýľ”ŇŔË�������"ăxę «%`á�*Ľę‘�ËŘZń€,ĂZń€`ÖŠZ†µĆaw c`¬Ň:Ně×5†Yă Š {˝`Yđ˛#*‚Ěh6®żäSfW=ĆU � ¸ě ���� ľuG˝â!‡Ý*F |ëŽzŃĹWťfőÖܸ±.:¨hŔe �������HĆă����€d<ŽzAuáUŹ�õâ�Ş Żz^ŰłđZĹĆşč�������€Šşř¨G�€P˝ęŠÇu=Bc¸V<@�ŠŻz„� ^Űłx-z€�Ƭµ+|¤­ $�0†Ą…�€1,-ś˛µZGĆp­x@���@E˝ęŠÇu=B��c¸V|H^ĺ”Őµč����¨¨W]ń¸®9,Ó Í@¨˛ăúKČ�KCsÚVh�������@dLCŮ €Ęb˝%Z7Ö+P@ŹÇo{Cx“Ot±���†ĄŃ\şąôr™&�@‚I+4€�,¦Ą… ¶2‘”R(Kšfµ^ăŘl …ˇmá[5' Zd±iĐ Jf0%Yl  6H��`LË&Ó˛„CÁ^ĺŹa»„ €„,6� °´iť—Ę�€�MŁ˝K@���Ŕ–%LPPČŘv±±Ô¶p‚ĄM,6� 1x[ž¦­¤`± ¶ RRš´Srk �ˇ‹„đ˛���ˇ8đŞG�����’Ĺă±�RŹk<�ĹW=BĆt]ă������(QŹÇaŇV¦ÔhN޶Ă$�$hL^¶Ă$���� 6Ą4ŕ’ÚK@������ “–0-m ��@PÂ/=„› $��0†eI�0†­ťR+'+AŠËŃ®FĐÔ¶´0€���� fв¤ ‚Ĺt]éÄ꺢gňjá�����BcD•t„�����PQă��������HĆńqýKĺʵ¤ Ä–%M …Żň ư,éP0`ł��@PQ…zŞ’Ž��ˇ1˘ u<ąŻ—OŘ×Q–p¬‡Ň`­8@��€±řć¦ŮŻ%�(„ŠĂŢ-1\×1â¨+«������:>í(®…1�ŤUŇ ĹW=B���� ŹÇř(<ęŠÇµĹ—QtŔŞÇĂV=>ĘBCąFsö˛&…Aka� ˇÉVÜĐĘ@���0†eRHXÚa’Ĺ Ç íE=W˝®Ô�€aÖZ@� ( ¸Ř °Ů@ łµĹ ŘÖÂAEąŘŘrQą´´iŘĘ@���ńKNt±DaĐZŔaĐZ¨Đ�‹¤¸ě ���€=Óż.‡I�€`± [›e CëĆhia��������ŚiIiÂĄLA0¶v¶2Ă µ0�HdV:B���Ćp˝ÍŽkK`±€ xŕK ail��ˇ1P%= 'öUŹ�����@E˝đUŹä����€d<>ĺŰr¶2���…—r06,opĆ•ÖŘÖ–p˘›=Đņ 2¤í&�����„ —2‘ò Qh%©i�ĄŞjgńşŽ}g �Ćp-i‚€ 8đUAˇ8đZ“,edł!%Ř$…€—$�������¨¨ _:ĆŔW™R‰Ăľ3(ôP–% ��ˇ8đZ\ä.–qÖZ@��������P'M¦ËKŔaĐZJ`łiŇZ@���Ć´,iB++–ľ.Ód�`LË’RŤĄ·oĂ`łŚłÖÂ�����ư,i‚` Ë.7,[ČdHŰ-L ����@ÍéËĺ09 �����@PpŃ.e ‚„K™‚��°XiÖNżVçÂÚf„ ,a����€ đŔĄL©„ľŞ1ZZ0Ű®ěXW ��������*ę…/cŕ«Läжá.6�( »-&·rŠ$Ř$…�› $���� ( ¸ŞMI¦Ë-L ��@Pp)SĹJCPßvG]q€��€�Ç×K@€$ ęZB“I‚Í@ĚÚ6<ŔĹ������ ˛0-ŃŔn·p’eäĘĘP´� .eµíRN'»XĆYka�����… —2Á–%M‰i·–°„ �¦ér �(¦eI�cZ–!‹Ąĺ <P� #v»âlá.6���…»m�����DĆ´¤ ���D¦)M���� ˛lîPư¤‡iyii2`łDqV Eśµ&ĚÖŠ��` ×5����JÔ‹e"‡eI�ĆĐ–đa¸ÜÂ Ł­†+oh2ŮŤ¦Ćäm;L&�����Ć´,i���‚„Kw [Ă!Éf ���AaÂĄLA�����‘…i†lݎ… `1\Ú)ÚxłäÁVFĂŢ­É4㤵0€‹Y`‘ÖŢäĂp) Ń�› $����ĂĄť†­ $ �ŰnvL��TLË����ˇ„ —2…*VÝm逢ĆZĄđŔ—M™ĽěxX3I$���QńŔW=B���@HÇ×K�,Lp±T ËĄI»¤ąTs´µ0€�€â¤µ0€��€Ĺ´,i‚����@Iĺ…K™‚� ¨}6|ű6|€d4Ŕf ���°\iÜJmAŚ•†ÔŐ†¶…ĂuĄ‡ÂĘÂĐőlł���,†eIShá/KĂ`› $@Fl6�X »…Kxp{-1Ď.p [ŤÉŰvL��­…„„Řl`łi°ęh4€�YŕbC(4Ŕf �Âm7:…­ $ U ŔĘ@���…  iŔ]m˛Kz›M ‹z_Ú�Hh€Ír´������”ІPJé�@2ŽŹăŹiyii�����cX–4A��cX–4A�� ¨l¸”0b· Śr �Ŕp(_ĘŮŘV¤A[ĺ†vIrł��0¦e‰Žąe1 ��ư,i‚���‚hNßîÎMŰ�������”P¶đ˘§đb �� (ŚŘíC‚ŠaYÂ�������(ˇ¬ěáUlčÖ€%LˇĄJ+:B0†ë@áŁ|ĄÔhXÚD 4Ŕf �„ .6âlia�����cŘ–4A�‚č\ůbi‰T¬,´;Üކ‡v57m7p" ��Ŕ@{˘‹MÁ`P{…Ť��(±íÍ �����cŘ–4AA´µŮ9ű˛ť&����TÓÜ/˙‚Î ’6ˇŤe$�� 0¨š0€�(aËůÜŠŚłĄ…@h˛- m™&ŰŞ9ÚZ@���@aŘ–0€(†m � (LŘÚá`›M$���0†mI�Đaş˝„( [ ������ ŞĄ ©« mK… —2˵ÁZ"`bŻŻĽl!Q„]î¸dŤ2Ń–; ć8YZ@'K uܰ|…=´KÜXúňKz°l˘8ÄÁlia�ĹÉŇÂ�@X1I$*†m f»^€šÉmGÇl[ĺ†e ��� ˛ŮD��‹a[Ň+[ ŔbŘ–4�@(áˇ/ iŔĹ&����X Ű’&���������J*[8•CP(ńŔW9…j•Ž� ¤ŹÓw˙˛đŞžŃŐ“Űrô\ůÖ¦d��޸a÷ E Ł6I!ˇ=›H�������€’ʆK9!(Lv­ … € đŔ­ n6! ¶���`1máay9nĺw»@Š0[ZL¸ŘD�€0…aŰĺ†e “É�wŢĐŤU_Ű(LéR�\l"!ˇ.6‘�������� á2ÝŢŇ�������J(nĺděpůr8íděË76bF€â¬ °D 4ŔĹ&ˇ.6‘�������€ʆ[90†mI����Q-MH­ ©č0Ý^Ň�������(ˇl¸•C&ÜĘ���������€Ę%ť†éŇ$��ĂŐZÂ&�` Ű’&((L¸iHşfP(ĂĘÖŘśl- �@ n6‘��0F{KtL—’p€‹MHĄ±9ŮZ@�H`†Ý6äf ����€1lKš ��������B8öá–NC�c¸Z¶0QˇÚ3(4€�����c–4A�Śaká0•›M$��‚„Wnh’:/µ- ��������@Ő¶í>P�`1lKš�… —věb ������ nĺ�€1,—áĽŘD��,V¤R† ‹ukh·p˘�[9L¶•ĂTíŔa°´0€Ă`i)Q‚‹M$@BÚ3(4€��€Ĺ°-i‚�X Ű’&��„&\–ÓdwŢж0€Đ�›Č ¶ĽČ4%ąÉÝl"�����€Ĺ°-i -Lpł‰Ë*7,[a� 8l- ���Jp+‡ ����� ŞEs[APex]ă������P¦îőÓ÷pXh’a¸Ľ¤€â`ia� 'ध«×(�Y7' „ĘKm ��€Ĺ°-a��A:L·—4ĂlYŤĺš+ ���°¶% &ąI .6‘���@(iZ4 wµˇm)âÂňž Ń�›H�€Ś¸Ts°µ0€��������������@T ‡©M� Ş•S{ne"Řîµ€8–�°®Ö,rěRŁ[9 —îl-Llí0ŮĹ&�P€-/v¤„DĄŇL @F\l"�ŔbÚ–4��€Ĺ´-Ńą¶A°6������@T ‡e [9���‹i[ŇB ÝĘ�������@IĺĘ!µpŔÍ&����ŔbŘ–t€���Ő8,é�@(á [wNí-F0Leˇ5“€Ş\h`Zh[@������€’t ąú±ą_^ĆĆ©‹&K„"XL"��€Ś&¸ŘD˘b˛ĐÉľ¤˛˛X-K@�����ö„Ó`›H������‹iۆ‘ÜöĹN � �%ŚŘË †����� Şq؆  lű˘Ă(gß¶‡É�Čč`[4·˝ŃCş• i˛,i�°0…r ���������@Iĺb÷ –0‘ĺʂԺąpYŇ@…&ąH .6ŠŮ˛¤Ai°+@@Ĺ .6‘����Bˇcúe; Lp± ¶˝ŮC»m0$Pś,K@����� ”pŔM‡ ���� ¤pŔM‡ �@NÓËK:€�(¶%š“«dˇ€ŚjŻQ§Ą¶Es˛-i���@(ရŤb¶,C˘„®Us´-i�������„BÇôŰr8$»ŮDBUlX~{Z®x����@¦CyiĂ�ŽeI#L�� ěňĹN Mô"ŕĹ2��������°°p[¦—2‘���@(á€[9������Ő8lá`ĆŢíXH �€Ĺ°mĂY Ű6 öĄ���„BÇôŰö0IAsňËŐcÓĄ±���������,†muĎ Q†Ů˛¤�������Č��€¨Ćá°LP(á ‚�‹aۆ©9¸ą9©Â†í |ĘML$ 8X–4€��Mp“‰`Ű›ť2:Ř% —2! –% �@FÜd"�@(á�/2‘�ŔbáÖ†[™H�����`1lŰ0%đ"2l{łÓ` 8X–4€����şÜtů-<A�ĹAۆ'y‘ i°,)ĂlYŇ 4X–4�Mpsstitě& �����ŔbÚ®ć†mK“©9ůe{ Ś&¸ÉD�Š“eIŇditě& �������‹iۆ B Ľč@�������°Ó§rv¬ÜvcöĄ@q®·¤�@(မH�öĄ���J8ŕE‡ �����(©\đ˘Y®l[�ŚęšA �J8čÖ;\~aŁ7w›JD�PÝŐä0eôsÜ®sTU2�����J8čť6µ- "dt°Ë0\şcpitě&Ń79Lp“‰�'Ë’2šŕ& �š“ßí=Ŕ"DË’�������()đ˘C���PR8ŕE‡ ��B {­`Ô=2šŕććತAËÍÁ­= Am)ăZ¨yöR������%ô˘Ž…BÜ …nÂd—a¸”‰�@q˛ěƆmKÂ��ŔbÚ¶4€ŃAn2!M–% ��%p+‡Ýd"��€Ĺ´miŘĺÍ=6Hˇ n2‘��� ”p€ĹlYŇ ���%ô"‡Ph’›L$@Uł—ĺ4™(v˝—ôˇĽ ĂĹFą˛Ń{ĹKe ę.ľ,‡d��Hś,KĘ0[–4€��¨5H+-­ö’ěröĄÉ`‚›L$�������%đ˘C¨bÚ–4Mp“‰„Ś&x%sË79‚ٰ]Nłk‚ˇ7™H�ČB˘ćjN[Ф$����B Ľč@��,¦mˎ鶤AŔhr÷LZD��BIYląÝŇ�2šä& ����`ą˛ŘŘîšI�‹Ůޕئ§ôE>Ů-›»˝˘ eI‰ąÉDPŲµßÔ0��(N¶eH”a/ ‰ Mr)‡Ýd …&ąÉD�@F“ĽČDŽ“mI“ŘazyÉŽÉeI“In2MC{+)0‰+Gî|LlaÇÁ¶ 8Ŕ¶/ö0����:&żuŁĚ����`iĄ•)”6Ą›M$���XL—mJ”a/L „Ś&xÇ%+Ҷņ¤4Ř–a���°îÖ’[#ąJcŰÂÎ —ßŘP���������@(á 7ť ś†Ű—Ă'ىŚ������ŠtŔWXTmá0Ř‹L$���*Vím&)9L–eŞÜ°ýŐŘcË-!�����*¦mÉćä˛ �…IÝWH¶0�(N—F‡AŢÜŹM˙vq0Ű™!ܦC´0!ś)Š ŔE$"���������„’xÓaŐŢf’€… nĺ4@“‰@qş,Ă��%äĄö" €âdŰÍŤ]mI8 ö" ��Uąlí/e„"îv٧ôb&"��� 8ŮZ8 ö"± űËE2CF�������� Ó˘JN˝HF�$ś˘—]4� &xq·ą°Qd 8XÔć%/ŞAä@"!‚,qodI���`—/2ŠL�@qŇU©9ą,Ă���ŠÓ]/ą-f_ĘĂ`Ž“m�����ŔbşlÓěň‡d/2‘�����„’x“‰BIx‘‰���ŔŔ}­$Ą‚Ĺtąš¶Ë0ŕE&� K‰š4b¶-Ă ��@(é 7ćhya€µ·ň0(N®zI¶0ăŕVž†›H���@qrY†����`1]¶Ń1Ý–a������AxŢކ#L€,Ęe [n6‘€âd[†€NĂËËp*0Ó^d"!Łą·żI`“ĽH,Ě®Zrk$[D�������,¦Ë6MŞbş,Ă `a’™ćÖ6“”@����@Í˝˝ ����Řĺfcĺ·n”™���(Ŕş E&���� (ŇAo’‘ăd[†������B7vxő[Bĺ0ĽŘDŠs˝ a§%¤¸kßÁÉ68ФA"��°.Ë0( nĺix‘’ĽČD��������� Ş…Ó6:§Ű2 `�������˘Z8mÓ„ŔbşlÓJ:Č‹Lˇ…QěŰ2 ›$2��PślË0€YÜ5‘ĆŽą˝Í$%jěśüvűđ¤6"!…I^d"����@(ĂZY` C(é$/2‘X8Č‹L$��ŠÓe0���ÓÝnÎľ“ ŚVXT{)\aią ������ÓĺęذmtJP¬A -Lň"�€îöEia’™ČČÂ$/2…ĺ2 7Ĺl[†Za/’Âd[†Aa˛-Ů1ą-Ă��������@(餗v:U× ZÜ1»Š…/ŰŃ9»•€Y8Č‹L$���������€’Ú ßÂgÜ— LI���%śô&Â`[†������ ˘öđ §i/ô v’XQa  ��Y8É‹L$��Ŕb¶·-áCx±‰€, P¬Á�všŢކ�����€Ĺp٦AĂöę؇ŰßŘ(� ŁIkYfWh��Ń@V’‘� d%‰âT]gŠ“Ĺ";° ÉHa����������€"^»`’•¶‰4ÁdvšŢvA$€…Šlá÷ĺ¦$��������Ŕre æ)�����€¨Ćé0M�X —m:48É‹LFy‘‰�����,†ËŐ±ér¦y‘‰Dq°-Ă �@F§r›†›M$�Š­EÇ&{‘‰������`1\¶i’��@(é¤78Ŕ»}“‡ÁDqrŐK¶…A„Ň­ E �Y8Č‹L$����������� ��ját& �,¦Ë6MŞbŐe­\ě4�������já´M“ ���€’ŇIov]ŰLR±WďY¨…ĽŔD†0��������D5NŰ4©��������(©ÝđCřľŔD$ršŢ. ,A Ű2 b�dá /0‘������� ˘öđMO‘…ĽŔD�dá /0‘��X —«ca‘´H"�����€’ŇIo8Y —%Ëm^iÓ˛…Ăd/b"��� y‰'Ű2 Đ©\Í 7›H�����ˇ¤“Ľă¦Ý’l “��� ”a‹5H��€Ĺtą:6lďÎ}¸ýŤŤ$›hŠ �dá /2‘�����Óe›&����ŔbşlÓA������%đvřň%›p7Í:W]lJâ8Ř–ěśÝÂÓvc“"([ŃÜö‹8#�����Y8Č‹:¦®m&)‰���•t’H�‡Ë2 ĐÂA^`"��%ťä&�����������˘ZtěTą)„Ţp Ăe��� ”tÄľ\`J"Šm77\.ĂาPZd ���J:é &�*é$/0‘��� o»Ď ˙Ą:Ë:D6ÍÝ€3Ä‚¬ #���ĹÁ˘—-¶ň˘Ë"uLnE`•;Ü~ @��ŠmĄ������€ĹpÚ¦I,†Ë6:/Űł‹U“��������°´f)-}ëF™����€…é˛MňŽ›–—Á]€Ś ����„mnd™���ÉIv‘�ŔÂt©Ňi*/0‘����� ”tŞ^“–a�%ťô ¨nË0âä˛ ��,¦Ű2 b���€ĺÚ†M� ”tŇW±Đ$-2„îžHK“����‹éňrř$ż„Ođdd�����*L·%;&·Ý±ár&‘§ŕĄ%+é)}ą ILĂ—í)ą™D ����� *w¸ý����@q˛¨RĂdSE“���¨nKvLnË0��P—;Ü~>@Aö˘ŽŃ­ĘMöU\–a��� ŃÓôe— Ä��'‹*M »x ĚHÄ$Ä�Y0dd����`aŘTQ&������€’ÚIo8„.†Ű2Lb�ŠŰ2Lb�����������(©ÝĘNGěËFcr[†ŚłË2LPäaúňS y/  ŕŢ]Ěĺ0]\"†”Á.7ôD-Ó`…Ś �����ŔbxµLK{Jo6‘����€PŇ©Ľ©cp[†I ���,†Ű6Lb�dá`/0!Ś^Ęł±·ČB±¶PZdao›ťž´÷„iŇda°ÝźĚFe™Z€„�������AI'ř"? nvIćѢî*%Ń@U‰0€,ě&2��ĹÁ]ä6|¤}Y@–����Xn»ąa{9|˛ ‘€âdQE9Í���������@V¤vÓA����@�@Tăá0Írˆ h8´Ű!»Vä2|˛/`"� {‰ �@qpY†IÄŇ�Ĺ d�����@(éTľŠ¶»ąár& {‰ �ČÂÁ^`"��%ťě7í® #Î.Ë0Âě˛ “�����%=¸×`"�Ăm& '{‰*.Ë0‰âಠ“H•›]űKť2…ĹěŇŘcÓŰ/Á)hoäŘdÂV›$3f¬6IdÁŔRB��� `ďŰ[öb “ ‡"s‰����ŠS{[‘”Ä��`1ܶaS\–a˛0ĂľÚła(p˛—e88ŮLd��ŠË2LĐÂÉľâ¦í2 śěŤ pš^nɤŔAÝŁÍ*‰„F•CŃ n$€ŃŘŰ_Ŕ(Efb�� 8ąTĂ$bi€bĹFϵż•i ꦗ[„@qrY†ÉarY†ÉarY†I ���€,śě &Ş8¸,Ů1íe& '{‰ �����‹á¶ ´pdŻÝ.p4W^–) cň_ÔQR8Gb�������X ·mÄ���Jz(_(ĄÉ^ěôPŢ(ĄÉŢ`"����+ ĄE2��BIöF)Mö…“˝ÁD@Nö���„’ě &2��*áÁŢŕ p˛7ČČ�����, ·íh˛Ż¸i» 4zh·Ăôí {Ś€GU$BĂ™FX“€“˝Řé n !Âčd_áX’E&“˝AFŠEŤ0»,Ă$—eÄ�����€ĹÂŰň)˝µÓ}#GÖ6a –�����T„žł©23�f :›n������A Đ”Ť2��Ŕb¸m‡ :îű¶ť†‹ d�dt˛7ČČ��G›îěŕâ"9 .6I$ ��������� (’ŠĄťÂ‹Md���ĂĺvřT| iĐ-'ĹH(¶šČşd„Ůe&1����€ĹpۆILqôŇ>Ą7›ČČÂC»†3�˛pŞ^[Ň$���������€¨¶é „’ĘČ������ ŞńaůlěË LI @qrY† Z8ŮĄ0ŮL$Nö� �¨Š^ţ@������‚ş/˘}ŰEŁŔ ��G«ć$ą°ŚLq˛¨˘LD`–스(ÓCy1§şD 1:ŮČČ������şÜéĺ/Ů"ŰA,ĚU4‰ŃÉv‘Ml!m×Ůä@­@B ŃÄv0Ř22������€…aÓ 212šŘ22��@P¶ i°¨bÓŠ;·Ý$‹ŠzĚţĄE%X¶¸KF@�Ć™WĹ(1����ŠE•eRâ`Q 4go“˝Ři¤6 !������%<”/0‘�������€’ĘŰňv6÷¶‚,Q\şA“˝AF�2:Ňľ, KD��Čhb;ČH�Čhb;ČH���X6‹Ać4XtY&*Ě6J› $������B ĺ $�Jx(_`"�„ěĹĺ & Ł“˝ÁŚłË6M"��dt˛7����� (áˇ| €Šá¶M“�@(áÁľŔipŮfs"dt˛77wńK°3µa‰���d4± 5 öšÄ X₎‚jěd@ 8XtY&BF“Ň{`U29ĂnżČA`����€ŚŤ+íCE[R.i Ł“}QçlAÉ!%h˛Đ@��dáÁľŔ�a���� ”tŔ˘-L`±đ¶ü4ü(.h`ČÄ\€�ĹɢËLě$��� 8YtY&ŽE—e"�PaşmÓ$Š“Ë6M"��� ”đPľÁ����Ŕb¸mĂéĐ˝Vq´}IÁ·MY0«m%3f9<xŻS°$P•;Ľü-���˛ŕˇ¶šÖüÂś”™���@…%ťD$dÁI~ NaWHp€m®ÄA`�ˇ‰öĹU2BF���d4± ădŃe™���Č,»Ů N“E—e"@F»€‰âdŃËËD�€Ja“Ő›Á(�����������AŚŠ[2 V]–‰€â`Ńe™8ŽVÍ©¸›DL�ѨYM˘ťČ�����06ěęś i 0`"ŁějEB������@†ćŮ»ę(qĂä‹âÉAwQ IĚŠ$’™I�Ähb$#�������� ��@‘«â&�������Őxxś7”‘�(6U2Aě H�€Ś&Ą÷ŔŞÔśĽ«ËĘeD@qčŢ6MN»mšś&·mšś&·.› Đ‘ö]ź°bH"���dt˛/0 ������€ „§ĺËCô&�����������P¤r—ľÝ[m’Y i_¶¸¬YD“��������B ĺ”aŻ~M‚ŇŘđ¶| µŻ–ò|bo @y!/ąüŤ€@˘‰®I!��ŃÉŢd2*.H×t$Úł§–u…D‰���������J ĺś@�‹áĺ2Ť0»mÓ$�������,†§Ëá .†—«cŁ×Y&Ž[—e"����dáPě°};üH{Q$ P �(Nn]6‰€âäÖe“�P;˝ý%:ĘŠ€��@q˛é˛AąBgÚ:`Š ���@,»ÚM F$ `ÁÄ.Ŕ€������‚"x(ľÁ€@qXuY&�����¦Őb‰¨0˝tŮ$ 8yU—•»Cěi“�'·mšD���� ”ôPľÁ��ˇ 3¶|÷Ţ,÷Ňá" ��€âärwîÇŠ_áňŞ*IB�����:ť¶_ŞQ$“ěbEB�����'›.ËD�������@Đ{řňfp�(N6]–‰������������€PYđ4äXńrÉ&1��� ��€’ÚSů'@(éÉľ ›.—iĹÁm›&���˛4I±…2ô\ů/ŐIb@·v›–$â8ŘtY&���@Ez*_č@ ��X /Ű4‰���@(á©} ����������˘ZôŘ©i$�%<­ľ¶ “(^¶i��˵[‚v or-<”/p Qܶi°đPľŔ����¨¤§ň…†p(_h‡ňnş-) �����€Ĺěv­H6¦˝mÓ$BĘ—0„CůR8Ş}A Ô ����������`1Ľl‡�@ €ĹŘËv8x(_č@���������%µ·ö Nä8z«=M{GF…@Á ¸�dÁ¨¸ Q0P ’`˛é˛D�������€ ¤§ö $����XL/ŰđpjľŔ���@…éĄË2 RxěËoČI¨ tbv ���'›.ËD���������@‹]ĽË> î6Q$��Łâ @����@AŘĄ JqÉj‘e"�Š“M•eb@ŚŠ/4PlŞA€&Ĺq“,q+��PślŞ,���˛`T|ˇ ��v<°2�����dÁ¨µ¬Š2�ĹÉb3ô°ć›b–(�� FĹ®4opqŤ„İH(S�€Łâ‚ ¨ ¦Ľ‹Ęd3·ňŔ¦I!��@<”/”#mó†<B7ć,şÚD‘�������ĹÁ¦Ę2�24���2;™Ěš €���ŤŠ €�(6U–‰Ń¨¸˘`R\Đ���p«;8 ����†U•eJSlŞ,���tcO_Ţ N„ŤŠ 2��T ›Ý˝8ě´<°iĹ›*”WęPłK&ÂŁ‘•;a7äHíHŠfş"'[s!]UŔ„E[IIPÜ–éPŕÁ~a„3 €�€âĐ˝etL{[¦I�€ŚÎ´_şY˛€ łŽ˘P.4€��������()<•ßÂĘ7( VUĂlUĹŽi/›ěÄíH����������,ĚÖ-Ĺň´]•e"�@L–ö(öĺ ‰XUŮ  Yףr™~ro$3` öpQW%I����(NÝ۬~hnH„ŚFĹš»"I„�������� (á©}Ł����]îéw/Ad"@"ŮÝĄiAGńš…°�·şŁ@ �������� (‚§â·ŕAqC9ÎVU– ��P¬Ş,��0„íîŕ *€ Ö|SĚŹhm¬ŮK›ČwÍ�������������������������������������`@€�������� ����������������@�����@����������������������€ �����������������€ŔD�€@����������€�@„�€�R����€� ��� ������� ����€��(@���H � ���€ ��P€��P@�P@����P@� �P @€€��P @€��P @@��@A@����@A@@�����€ � ������ ��‚���� �(‚@���(‚��€"��� @ �P2@( ” ����”�"@����€� �‘� P������@EP����•<É$��� ��``�€É(€�€������@ ���&� (Ŕ�����€Ić( �L��`.P&É`P@� ( @�L0�TL��Ŕ$� `&�� �)Ŕ&��((��L�€‚ L�����L���Ŕ\¨�Ŕä‚��& �€BÁ$���Ŕ$P¬HQ�ŠI@(�B€ąT� (@Q���€I����D���Š2„™��€˘�Ŕ$��0ą„I�¨��”��“����������Ŕ$ĂeŔ �P�L���€I������Ę��`������(�&ˇ��Ŕ$Tc��&�Ŕ$��Ŕ$�����e��@��L��“@Y��PĆ$ )*€!@µ LÂ0�Ę€2�€ÉePm����€I`���Ę���€I„��&ĘT�€2ęP&€2�Ę`0���€I��€2`Ő�€2���¨�ee�C��(Ę���€2����������&P `B€�����0I�”@YCj��e���Č�`B��”•�”A�������†0 �0 @@Y��P&�0 ���Ŕ$L‚Ú\Ťá �P����”�L�����\a&—A��€2��(+›��&)›�Ę��������€2��(&��@�@��Ŕ`������Ŕ$Pm����(c�Ę��(c�€ ”e@��”e�����e�����L€ąÚ� Ę��Ę����������P�  ���”•Q����e��P��€2Ů$�����������Ŕ�����eLÂ�ĚŐŕjő– ���PĆ$ �0 0)j��e�LP�������P��P����PV���0�`� Śj�0(¨�Ŕ¨Ć��@@�Ŕä2¸Ú0������€!����µćjS7 e�ĚŐ�†��e�e�����@Ŕ�����s5&00É@¨�Ę�†Ë† ��`�`C@5ć &�€2¨*”Q 0ąl@��LBŔ¨Ć��&Ę�(C���Ŕ$���02€���€2�&�«áI�d��“����@P�LR”���Ŕ$e��”AŮpŐĘ�( �e�Ŕ$e�PP�eL‚�”��e�������L�`��€I����“� ����@m�0�0 L2���L®Ť„���`’2����&`� Śj���Ŕ$@���(�ĘÎLe\F2„ ”A�0L„ @µ!�Ŕ$Ú�L`e“ ”Ę.Â0 C��€IÂ�����Ŕ$ a������ ŚIfH٦sµájC��¨Ť@5&@���������P��2�€2€2��„!CŔe��������€ ��&a3 CĘ�Ŕ�tl’™dć˛��€I€0@�“ˆ0�” ���PĆ$LS L�”Á <!�0��L„a¨Ć��  ��&Â�����””Aĺ!<†02Ę���PF†0����e��e“đ†0@����@ŐR[€jL��„ @Ę�Ę@e�e@������PF3 LŕIfrŮ$ L`O�”•A1¤Ţ ��P�������”����L&�0�”P 沙Dˇl€˛  @sµ™dć2€!LžPF�¸l�`ĂáI2ŁC�(+�    &�Â& ËÚ& Ŕ$@P�€2��P �& ÉL†0„Ę ÂŞ����P�L`Č!™É†0x&aĘĘ���������&a&™j0 3É@���€I.@Ĺ epe&�0! �Ô”�������e�e���ee��@0Ŕ�( @����&aČÚB�`�&a0 C��(Ę@L¨ą6„�  Â���“ ÉčVĘŠ `Ô�„©Ć“Ě2€���€2€„! 0 ”‘‹I������“0„2�Pa¤Ś&a���0 C �„'g&a��Ę @m\mH¦2dHć9™:mË��€I:6 ���eTcLÂL2Ŕe<9ó$ ����eĘd&a(«-aŞ1AĆ„ą ČTáIÂ0 C��Ę �”Ax3É0„!��&áąnóÔ2@PÂ@ĘF2Ô†0„���(0�C2Â��PaŞA��ʨĆ�(+3aC�ĘŕĘ<'LÂ���ef������`®Ć$Ła†IŮp�   ����Pa(0Ož\ ž„!Ě$ áI�†0�Č€Ixrx������  Â��2�„!C2„! ���”A����&a� aµq5Ą1á!ČruăI   ����&aćLµ˛„'0�0„!< Ŕ†!3„'™'gž„ˇdŞÍä̤Ő2�C�tÚp€j†! a��ĘęČeCjfĘ ĚŔ$e$Sa�¨Ť«Í$��“ĚĘ Ě������C’�€If������ef`Č a�ÂÚ¨1aćşÍäĚP› pe#—=H†2LÂtŚ„&aČÔ'[0d†0@„��†«=ő-?ś™\l <$˛@��d��L†ąÚLÎ C2&gÔ™jsÝxrć����j#@0 “Ě���” 'ĎśĚ@„y†0��“ W{ęoü$L†0��L„! Pa†�'a®ŰÚČ �0„! �”AµÚ8 É„2HŮpťm’™0epŮŮf��(ÂPm8<&@d�µ@f�0ąl83đäđ$L„&a�����L  ÂL  ’™�C9 Ěś „ L  „!<ŞA53�(0��(d&���Tb óp9™ ���LÂ&������@Y�Ę ™ �”A2  ®öpx8L��������€2H2™Ă��¨-Â��`ÂĚ&xrxB†!L„¦ŚS a’™“™���L‚ěĚ&Ŕŕ2 3—A2��(dd\mćśg<9óH‹A®mrM‹do’0Ŕ&��µ… —­v0ˇbäĘ C��ŔÔ �`Bm�������@$C€ Ńv 3ˇ Č „ �Ŕ†0—A�Ŕ\6“ŻíIÂ�`COÎ<ÉLj#0a”AB„!�P[&�L`ČL€2 „ɆË&a@eĘ Ő2���€23���ËfľnĎs0Ő Ě�€ L  2Ŕ™��0!3�&aČL�(0��&©ŤĂ �������€Ée“ĂC€Ićá3'Ë —A0 “Ě„2ćä™d&��L�†3��€Ifrf����� “���”ÁŐ†Ă���€2CdžśgN†3�Ę&‡§>-śh�ÂđŐ~83óI0a“3�Ę ���€2C����¨lIfNm“ĚpmĎÇZ4řYѓʖ;}É ���Ę ���€2¸lćd&™ �L`rfe†Ë Č 沙śç ”ÁµQm8üpFŤ9Yo3HÇś@fÂĚśD�(0\Ćśkű™'Ť5@H�Ŕ™����”Ajeś˛©o<ś&����Pa&��@m LjÔ6É�ĂeĎ _Ű$SŮ8źsÄ„0a†0��€ ™ �@Ő†\ouc& ��€É�\í™óő6�  RŰ$µM áË&— ‡™���L83$<93WŚd–A ����ee!ĚäĚ� lÎL€2Ła&�µ…0áů˛©ö™É„I„™�@¤¶•0������ Śj<ÉĚuc3€˛˛0„©[2s„™�Pa&��PÉLĘ Ě¤l83ĎźzC’‚ ç É0ś™���L`8ÚRŤ!ŁÉĚeE3`Ă™çŔpć90ś™��€ ����d0a†3s¤¶I �€ �  Č 93&g&��fr´MÂĂŃadI0(›„‡3�`ÂČd&�LÂä<„‡Ďóä‹Ez€ÚHÉI����d&gžd&g&���Ŕ$393$39Ł™ˇ¶:e�C�(«ä2Hf”…So$ŚZ‘ŔĚ›sć'g&Pa&“Âä<GJ$ ““���Pá!óś3O20†Ú8ĚĚĹ Ś„™�”AśY ������€2HfB$3¨- �ËfÎyž�0a&gm�Ę ”A �����”A®ľÚ3ç<G�Pá!LÎL��†0ś<S��ś™0A‡f†'çyr�&™ÉŃÉp$C&<$źD ŤS6uĂ3s˘I€2Ş1É`ÂLΨA��›sć'źÂ̵…6L2s13Ę&áá3&Ěä$39‰�€ ��&ĚäĚ0“3��`R6ůđC�  rm“de†���•-çz›“�Pa&L`rf��PÉT+K`ÂđÉ323�€Š‘ŻmŮW› ›|ž#��€ÚB0�(0& É3g&������ś™� ٬H`rfRa&Ŕ¤¶É‡���������frfef��Pa&���LÉ™ç0Ď9çhÁ$C l>3™0““�LjxŔe“đ LÂ09‰l»¤É9g&�LÉÉ$šŞmňÉ���LÉ5Hžj–Ax¸ R3É ¨ť!���ć˛á|ý<Gx2HôŐH € 3930sÝF7&y €2Č LÎL€2� l>ÚBxY��  .{8<*Ć9ó(đ�€ÚHfÝÎĎÉ39‰PĆžh���  Â3™Ŕ\7Í <ÉLÎ a&' ˛přGŔR[.#á™™śD���€ óśĚĂ٧Y<s0““LÉW‹„�€ 393—‘đ(#á!�ĚeĂ9˙DE4ÉbHx€ 393©- ĎM"�0a&gÔ <&Ě$ “3j$<¤Ś„‡�ă„rf��LÉy¸¶9źú!ÂLľĐ¤O>™I�������(#á!���ÔvµóL���0“Żm���”‘đĘ <�Ę <ŐŞZć3?s&(#amśđŁ'Ŕmů A�€2žj„ó 9Úr5&y`ÂLÎL�¨Ť“Y·ŻŁ’ÁňŘ[2ř,<ó9������PŮŞc\C�*¨ŠC[’z"áÉ ÔΩXÎÉ�0— źóI.)(;d™ä��ĘHx&”‘đL��ʸZM6“˛"ˇfrX[řđ<g��� LíđL�€2ňe‡g��@Éy†şÍ�(#‡g�“™É™ 0\Űä?ú�Č�� ĹrÎ<��Ô‡§ 6rx&�Ô‡ź€ĘmČđ|¨`��PFkKÎ0LÎČČá™�PVśŔL�€!|x>ŐşśĚ#(ž��`ÂLÎL�0“3CÉ™ ������Ŕ„™ś™��frf393™0“3�0sÝž ��ĘČá!���LÉ™ ��P6çĚ«}†<0Ăgč« Ž9hđ@��$#‡§���&ĚäĚ€ Łv†< bśóüDfÎI„Ú€™?9I��0sÎĚĹČáA0aćL"�0\Ű“˙č�–I DM&<yô‰K66°0 �Ć ���HF PažĎXkEŤŠ�����”‘/{ŇŤI�fΙՀ2rxH9<„2rx¸ŚśaP;<ń”8łŢVaHʼn2@&̜ə ¸¶á3× 3ůhEh��€ 3×íáđ&ŚÚëv08Lɡ-׆,w0x2H4‰�����PF����(#‡‡LÉ™ @9<�&Ěä<CÉ×Űś;x0 �����¨`ćś§�&<ś<|V4†8<€ 3眀 3çk38`VÉa=# Ś�ĘČa˝ťd83ˇŚ��Lx8ůáX!�$#?3gŞI��`ÂĂÉǢŚ<Á™D`.6ü©c` *›E �����”‘ĂC€ Łö¨6óá!†ĚĎi‡Çk=ŽU��Ć ˛Y¬-;ę€Ä Â€@2b°ŠŞ!L&Ź„č-|pŚU‚1ŕÁ1Öv)bĹ@UÇ$ť`&1s&�(#‡‡PF?ažyΧ.BDM"DHôś×–<8�Ęĺ~p@��HF 1AoçcłŁÖ¨! díü\ăQ…¨:�Ęj!Â$ťŘ6‘ $#dćD��fÎy&����PF(#‡ÂĚ9OE9<�����0“ĎłcŤ˛,žźq@�B–ĹsŤ���*¨Áyô/����¨`1âŠc„��@µŽqŚU#�€1X�’Őkŕz¨jYlBë†���YAˇŚÖ–śză<��@Ĺ“'!3����&3sÎ3�������€2ř𳎑fRa@ÉĂ`23gN”‘ĂŹ™9��“a’9O™�ŔddÎ,;gR·çµĚŕ`1hpĚ!�eóeőϵ�BQšŤ(933ś<z"����ʸn59Ě &!3™0sÎL���(#‡źäáäÉ'A9“3Hôä=ńGĄ‹Î°®q@Ć Â! 47´"��HFŚŞaň‰Ş"B;řŮéÖ59�”I…PaćĚ9dćD0fA3gp28uĂŹÍF­8jŤ��@ó¬:ĆŞ2'd” 3'��0©m>Î�*ŮL>ńGĄˇŰlTa@�����€dÄŕŠ9ç© lÎɧÖĹ ÁD"3�(#_öäĂdćD�fŽ}’IŔd„<ČÚÎś����0sÎł���PFľěç|ęŞ5B��¨`ćĚÇ\ŕŞÓ¬T6 -ÇUDZ,BC����TŤä#":Ł@™ �“a®mÎ$ŔşÍ‰�ĘČá!0aćśEÉç| g¨Ł%Č̉�����€ 3'3Ě9Ď3Ý&Ň1‡�fňyŽXë«R&������*yćä'ţŤA#Ô¨Aqđ@�@2rxş¸ÚäO<$�0F .l٨_ř !˘*eRa@���$#‡‡ Ś|ŮŚâč���*RWÇÇx����TŤ¨˘Ć! ÂĚ™�µ%QnśżľMÝBH^ŰÁ��¨`ćśg"óşeĹd;z0 �����PÁĚÉ sÎŁ >ĽbŐĆĐ‹µĆŁQŠĚś���0sÝΑrô�€ ŞFŤ5 çzX� yâ?8 „4«)bćD VŔ‡bŐ����$#§žísÄ+®¸u ‚1¨0 € ŞŽJpŞu<bUʤ€��� ‚™Ď!‘ĂPŚëƀ̣p@�ĚÁB�ÉQÚŕ?ő�ˇ Ůş±…#VŤ��!Pw\���’‡‡���(#‡‡����PVí†P~~â±â"ŞFČš¤`č& ŞI�ĘČá!Č����&Ěśó¨‘ĂC�Ęŕ“®zá€`,VĹcëB5âŇC–Ĺő���`4° ��¨QUăt%U#��Ô¨ŞŁF���:bÔ ş}*ň @móŃ)÷śg=’‹%:şWijThł‚EáôŹŽÇZ#„¨¨!���j›Źň©5B0°yj�X��Ě™™sžXÍÜ#$Čś#!0s¦nx„‡JŠ�€ĘĚś9��0äyâ?8�EDŐÁrxĚÁźxÄÚfQ…° *�ÔF��`ÎĚśóT� ×ŰZżđ# ˇ¨!��€Ô IÝT¨*;ÉÔ-řŕ@(#‡§ě$3ź|Pu"��PFĎś™9sČ!ÉĎÁS#„(É3'Śam8ţPw ś.ŁÖČfq˝ĆC�cPa@ˇ¨: ŞA­CFB”dćśI2s"�¨é|F­2†ĺ�“��0s2óµťüG¬:Ś{]c�ÂŞŤˇ ����T•Cf�”‘?W<V ��@2Ć`�$c �Tx朢uçSPP?ńŞÓY­Aµ±±j„@ ��cÄHwV%D@�Ś,� Roóç§łG- �����Uë1ŽqŐ�€ęŽ #ĐŞ0 �����T n|˛•fQC#**ÄL(ă~TŞCk #ŞN ÂÉLÝ4��PĆ9<0©ßx¬#V Á2Iż˛Çzá߲a—a��aŚ«ă˛A»‚l€‰éŞă����’1‹¨`ŐXé ×5���Š©îÖż¶? ĹÂäe�` U`bzŐă±Vš© # X:pŤk›ŤU!��` U!c+€ VŤ5¬C���É@kŤĆP #����@ę"˘Ş XPać3Ň·’“#�;˙Ő±aŮóĆJ ®®:5†*Ś1TaŚ[6ôÍ=âò±~ÁňŔ R¦*Ś,C-Ś5’C–ˇŐôÚA¨ĺçźô™Ö– ]!��˘bÄŞ1�° U¸šfđ Öpź�žů(Fä™s���µq?��������Ô¨UÇXC!¬X5†BA4PŽ�ŔçµýS#'ĎëlÜV땞ÁuĹ!�-íť ©„F,Ĺ´«�����PÁŞc¬ *xč[…ô�¨ŕ©ŁF@8yćĂ<8 �� uńŇ+>®u:»ăT…‡4bŐ�1c¨[včÂCqë–¦™Ý]1jĐU#ÂU#�����(b]ă�����PÁŞc\)»ęí:[Á"`™¤@E@±j„«F����� ‚UÇX@2ĆÁ�� u1b8óDžźzá�����*XuŚU¬:j„���������TpqpŤc„�€dśÎPC€dŚ ±b)FĐ®Bš2Ő˛3¬…ÂU#�0¦ŮagX ÂUjŮÖÂ!¤l­G\5B����É.�������)"{<¸–HĆiF ±0hW!���HĆ8¸ cÄ5°j �*jĹÍj4¸p@�������jęVü¨ŹQ��ËP  Q×q`Ő����PÁŞcŚ!�@2âQݏj �`™#†,kN80˘®ă@]Ça» é@c¨…ŤˇVDD¬CaĐ® ��fŚ:Ć�¨Q«Ću¸u(„«ĆhbőŇxDĽę1–E�����¤Žqŕ#VŤŃę–şpb�ËP ��¨Q+VŤ!����@˛”A-¦ŽqpA������jęÖôł:¤ˇ8ę…X†Zq@@T¸đŃŢŐ!h;C)š \q@��X†Z8 �TÄ:ę…S¦şÍB¨��HăŔC±#bŐ��¨10°cŰ \AłĐW}ŚŠŠ«Ć€¨ńlgc-������������€Ô1.�RWÇXݵĆh`ŰU ´ µp@�,ĂÖ!TÇŔÚÎĆ«Ćcm3Ş‚C`D]c@Y„�0°zŐq` ŚjL’Q1bŐ�X†Zq@��Hă°g*…*†�����:Ć±ŞŞ>5†��¤ŤóÁ1bŐ������¨3Oc #VŤ!���€dŚ � uŚ‹�¨Q+Öv–vKˇqTŐ%Ĺm]J ¸â€��€ ���*ŇnýńíłŹ×-:Ű’(¨X��B±j Y†Ą#~é]Ć2©E���0†1t ¬C����$cµ‘ŤŹ: �1�¨ uÇ…1 ���� 㨋€6>4N3Ľ^ÇC¡eĎô Sj%0 µâ� \z@�������PÁŇŮ âRFÚŤˇĐi6ÖŠ#F,ĹX•fއ9lN¨4bŐ�� RżĹ?ŻăŁ4bŐHĹęUŹ�”­ Ć€`jĹ���PÁŞŁĆ���PÁŞc¬!�(â:Ö` µč ·.˘t@@T ę®4şč kĹ�€¨±*ÍTkDD˝˝ÎĆZq@�����¨HwőăUÇP´lč7÷oÜ����CŻ54†Zqb�«W‡cĽęc\6H������@˛zŚë±®#��Š«Ž����€dŚŁ^­{ş�ÉG]eGe¨…��5tÇÇëx`Ńľ®Ć†Ň(�������˘ă‡4h· M™jĹ�������©cu5jaŐ,C­xČf±¶łX+ŤŤz­‡• PjĹĹUG4±zŐăBqhá¨ë ‡Zq@�B±ę�B±ę0WŹu!����$cq�Š«*VŻz` µâ€���PS·ę«~Ś`tĹGĽę ‡Z1eއ9ÔŠP ¬í,VéqhŐ����RÇxĘŽşâˇv†Ż×8,F¬:H�X†ZqC•‡®:B����� uŚŁ.ÔW!������� ăöLë–uĹ–Y· 1 �@Tڏę–ˇV���j°xÔ����¬zŚm¦Zq�Âa»Bá€� „…ăíŮcýŞ>K›Ąˇ¬A 0zóm匄B\vĘ® "”V4@����„0â­;tĹ…phᨷł¸JŹ!Ë0âŞhÄU �c¨ŠW! dgńŰ»G, ĆP+�����¨¨UŹ:B���¬z¬#� ‚Eg+*F„íV(„k;‹kĹÁjŃłxŐńŘş!‹RV&Hť®ő"�����T°âÚÎĆ«Ƹjڎ…G]�ڎnŮQW1�€1ŚŠkäP+�Šu=şę��c¨šŘzµgVڏÖ��ˇ¸Ö4S­8 ���*Xx¬c®u„Š Wë:’1Üv1.ü!<lĄ™đ ;äE'Yaią �€Â ´ĹÔV �°¬JaÝhw;ꊇ4pŐ�����*jń¨#ĂZq�Š«ŽP(ŢÖ™~Éř ‘¨+žvEA°l�˘F„6ÖX-Ä€���€ŠZ<ę� ÇAĎp­8�ŰÝBá€� 4(ÓëÂG«Ž��� ucXÖŢIŠH–ĆSĹÂqĽÖ¸Ô3ű†)D¸ę hYŞ_k��ĂZce× cÄÂuY6˘`Ŕ˛A�!¸ęưV<PDZľĐ3XE‡Č€Ş1B^‡Č€Őftë 8 Ö˘šŘú˛c���!:Ă×ëq���X¬¨Ć±Ł®#��ŚáXce× c@ˇ8đćÖH]]ĂÖŠ�Ŕžş NqcG­öٸ~ŮG0�������€µxÔ#ę8ęŻđ-–Ha�����@Iaŕ­;´ô´”#�€eV«ĂÖŠزQs?ä˘���X†µč® *†í–9Ĺ–a•ŻŰź=^nĂÓŇFąeŁ)´Ŭ:– �������PŁ®:ČY­B  b`]UŇ–a­8 �Šu=şę–aÝfÇvQő˛l�€Ř˛T]ăBŮú‚G¬$���ưJŹCWŃČ~ýE‡ ������"cHx ZĘ  ă¸ľÂ€ qmcv}Ů1D�ĆâÚžŤŻm8j–HHqm@��€‰­Żň$�ĆĐÍaiá€��–á¶ Z _mTeX+����¤Žă l}i<BW!���€1âŞ#„¨qŐ1���HŘÓgk�‚eX·ŮQW<„W!�Q#˘JJłZ+��DĹ—čęŐ«k=É2Üv…-‹«ŽÇU��° kĹ���¤Žă g¸V����*âş®ŻxbBTZ1JÇZG–a­8 ¤ă¸ľâC`bW¤¦łë_6% Ł�‹E™m)OX8 �����¤Žă-ĂZq�Wä¬[…���¨ŰÝő���$ěřˇă4ÓŻmšD��ŔŔÚĄL���„–rŚ–a­8 ����€:íÖö; ÄăZÇ,3÷Ň­©ŘúÍ=¨ěA`%Ś!��,ĂZq‹«ŽÇUq®:B��������¤ŽăĐ;+�����©‹ă¨‹�RÇqÄEĹŔUDZ"Íľ®qE�Ŕ2¬„¨v·PöĚvW!F,:ĂׯÇŮ,2JĐ,…���� jDTIcQqŕŞc âŔUG�,ĂZq@��Ŕ:žn~ëĆ(4GěKÇŘ\čŠ����RÇń4;ÖŇG JÇŠ«Ž!�0°őUŹ+\u„DĹ«Ž(:¤hTĄĚŞhPQâ® F( VŃPkŃ3\‹������5ęÂq=mwE@Űn,®×ô™¬˘QqŕŞ�������¨QWýЧŮ׆!A���AqŕŞÖŠ����€vüĐńHřŇ)],”‚J!�Ĺ«Ž1��@˛t6V<ƵŽ#TŇő8®/:@�����©ăXq@° őmöcýKÁ� ”đpÁ—‚�®:BĹ«Ž1Ű­ťa˝Ćř˛D ��������…¸®Ç ‡ˇZ+(P¦aąŃ ¨¨a–»,������€¨6*Ć ����HĆqÔE�$ă8ę%¸ę(\u„����Śăiv¬+Ň«ŽeX+�BńĐʵŽ` «č١W!�����HÇ�PŁ.ĽęÁŔÖW}’e¸­ŔÂ…ôë ÔQqŕUG�����������¤Žă¨‹�HÇZfkW«ŽC�����(:ŽŁ.��PŁ.>¶gtwb@0°ŰW `ÄŠŻ:BÄ�������©ă8ę"�������jÔU?ęÇřŞ#„Çő·ŘPJ  8h+®:B������HŘńŁ> QqŕUG@(Ľę€1¬Ű٨ Ő����Ô¨‹Ź:B–aŹuĹăÖ [p ąl��� *ĽęÁ2¬G¬xč–=V ��� ľuÇvX8 ��€¨Q%Ť�€Ôq<ÍŽúíěGý%'äA)”@�*ĽęA���X†µâ���©ă8â����€Šx]Ź_áGÁ€­;&ÍĹd‘Đ2¬EźÉ ů‚‘™łśÝlJ"���€P€­›ŁµĹ $�*Ľę–a­8bĹW=B��„âŔ«!���������€déě1Ů®jáUŹh kĹ�� ˘¶ěő…1 cX·Ů±^ńP¬B5B���ĹW=B@^ő�`,^·Ď>ţµN­1 –“K™ J°X"��C[ĺ†v•ʂƠ´qŁ~ɉ �ŔÚ&r�����@Tă8ęQDZčYĽ®ĂC»Ń �������Q/u,,—é ���j -ĄpUtI'Ř,‘����[nĺ0I���% ŘĘ�°ZácĐV† ����€uŮÝBá€��5âŔ«Ž,ĂşâÁ2¬+�Ŕ2¬+��€´Ąˇ!�PŁ.|sC5Tc¬8ěnˇđ€���:ĆÇřé6H����X ­Ń–Unh �ŇZ Tâ×W$Żm–’H����€ĐÍĆúKNd���`1´…ć°,a‚��€ĹКò„ � tąÔţŇ °UcÔZD°Ř@ŽŇh���¤ÇqÝč��C[ÂAe4·˝łS�‚Ĺ Ł‹ $���ŔbhK ����� ¤˛p(S¨2¬+`Ö���������¨QăČbݞ1,K8±ZW<Čä‘– :fMR±‰6Č·[śÚ2Qĵ MQoĹ•@�����0†UKjÇc[&���� ¶n.,Kx@��ŔZ‹„âŔk=Č…WÍ-Ś+EHę�™˛×%ăC­2”¶„°´iĄ $������Aá×úǰ]čŕ°Tnň@¦0(Ť ˇ[H��cXµ¶p†]6 ���` m•Ę%=ŔV�CkaĆ�������Y eá0LA����Č��Śa(·îXUŚCN»k\ńle �Ĺ×z�€1´€Ć-Ő���€Šşř©{Ô·Ůc˝h�P8đ* �Aqŕµ$��‚pŕ[mŞö «µč„i­x€���� ÄEďÚŔÖŠ xµ)T kĹ‚1¬ eÓîŻ-"�8®–qR¦>K×MBD›ťh)i Ë…`CZ.4) Jˇ��Ŕ¤Ţĺžh“ˇ´!H°”���łŢR�` m ČÖŠ„PLěŰwÂ$ ŘÚ„Ú"le �ڎ-a -|ó[hI°X˘”® DŘčÔ^h‡A)0%Y,Q4¶|±Ă�…,6��( ÚB€R Ą eźÉË2‚,6€ iąĐ 0(ŤĄA[hPÚB��@(aŔV¦PeX=cŰB@ 6H����X ë ŹX1áÝWÓhΖeôŻv:”&’H������,†¶„ ��(Q^5ĆŔu}L˛I^v���€Íjih!�@TxiŚW=BŠŻz„€PxŐ#��BqŕUŹ�„âŔ«> Żz„����ă¸ĆoÝŁ^ń ˘‡,z켓˝Éu”F8Ί)@‚Ö¦A„ě´ ¤�^6€Ĺ°®qÂj]q€Ă°.z€����€ŐęŁMÓ˛¸Č‰í*0€����€ ĂŰĺ0‰�XLM§pYŇ������ĄJ‘† ��$ăq…GlŮ4űőR©AŠ/;H�ŔX\×ÇC{ˇ§´ÝÂ������� (Ą iX–)��ch[zŔĄ HCŰ ¶2�( »aÁ•eˇ���0†e d,lmš¶6„IL­ $�ŰkT0��������Śi*J¨ Ż6����$«ŹăôěrĂ0€�cZ–0…l–B€W9„x•�Ä�„–×żä‰ ����� ]v»…)‰��0¶6MKH&KŁ�pH˨ ´6 ˛Ř@BB H�����UěX˙ÂC�Ř,‹Yk4€�‚€­L ^ĺ�’±Ë"é�H€„,6$Xl �����DĆ´¤ ¶2�^ĺAË}VVŐ¬ľ$ ârđ×v8tZ*/ň@�HP^¶Ă$���0†eIT Ë2$MR°´iÍ����� ( ¸”)������%Ô+>čŘvĂ0@ư,Ă.6�1�A!‹].�…[™‚€ ř*S��$ăqŤ‡9,Kš X¬–†Ö����TpńQŹ�„pŕ«!�áŔëút±‚0ŕRFś-- � .e ���€\ř*S` ו�áŔW™ČaY˛9(¶Ő4·üní]`���Hp©ĆhW€„*/´´@1,Kš@‚Â`× ”±ĺĹ ����AŃ]ëĐcX0A@PpéŽi‘TJJ‘Ž� ľę���*jŐ(éÉęc}|ü*O°…Ô`ZÚ@ ”`ł@aX–0‰$Řl ��ò¤ ò¤ "�ư,i‚` Ë’&�� ( ¸”)��� 2¦‡ˇZŰĺĐ6=L´Ü¤4U[y %Ôµ ÇĄö&T���‚ÂT]8ř¶} %Řl ��°XiJĄ ¤ 0„›ťq— R'X»Ůa0�”°··p &��@B\l ‡ÁŇÂ���hš./aR´ \l Q–Ul� T±aůT���������%”Ťłv,lKš@0†eI*¶6›Ű.�ÂAš–6���� ŃÜĺ; B¶m�Č0l·0�����dsřr9 .FoŰÓS{q�› B 6H€„l6�������€ �� „˛pJS������@d ‡ö‚[™‚�cXZ8 şČ\l  ( v­…FsrŐ#h4€€1[[Ҥ4­–0(M–ĄIka B ű¶"!�� ľę�����¨¨/˝âc[¦ ���������€ę\[¶pJ*aÄ.WXL ������@ ĺ…K™¨°ÝK Š [¦RL9 V˝ m¶’"ŕ%)Łő/x  0i- �€ 8đş¦A6ËbĄd”}Đ— $ s˝Ĺ �������PQ?ęŚéşĆ‰ŐuĄ�����Y<éŠáÚ妵- ŕ0-K@���Ťř+=ă^–4P)’H�¦e Ó˛¤  T±ăú—= eł�@aZ–0 t‘t­@ˇ���LZ{yRk&‰@h€Í����� (L¸”)0†eI���€Č¦4Aư,i‚�cÚ­ěrąVRiC�Ët]ă���QńŔW=B�€ĐHŮúŰ;űli•2H��€1¬·±çŕÎ+K@����¦ň҆AҰÝÂ���ŔbX–4A�����€2Ş-Ë} *†e ����������jLS[±˛,i‚���d��PRŮ8•) îjSŰÂ�ò¤ �€ 4˘–t„BôL˙u9L&�J°«[ � K ��€ 0áR¦` ��cX–4A���%Ô —2��������"KŹÇ`]€ŠzŮ»…Ćp-i‚��–++ 8^×#­xŔ—M$ŠĄ…@Â.6‘���€ 0á˘! ¸hHÜyCYÂ����� fÁ–µ‚hĚ]–4AˇÄ_2„/IaÂ^2"ŕe �������€ÔńxŚ�©łÇc|L¸”)�������(Ł^ü(S¨˛řşýY쥤P°Ů@BFl’B€Í¤Iká�������Ô¨ľĘ���RŹ…ŹC_e �Ŕbş®ń€¶xöúKy:Üä.6���(N–�������PF˝Ą}Ó†—[@��Čh€Í���ŔŔ®^Z˛XZ–0€�,†eIB .6 Ë’ĘÉŰ2‚l6��€â´,a���B .e �„ŹřKOt±���JěZC X í’}Lľm‡É��Čh€eulÚŢŕ‰ …@f&‰Ŕh€Í†P(Ă.› 'ąUs´µ0€��Đ�›Ť@koňaşµ§é¶ˇ�����€1,Kš@€ 0áR$�€ 0a[“m6‘�� (L¸” Ŕ–%MPPpѸŘD�ŔĶ7; &���€1,KšČò¤ ��@¨bÓö > °ŮD�ˇŠ¶·áiŰÍŃ¶Ę ËĆŽU‹” NÔa´•Ăt+Od3ÍZcsÚUŹaKŔaĐZ@@aĐZ şÁ)”b’H�@1Z–č¶µ0€��‚Â)űk›R)‰@qeÉ«ä ������őŞ”˙7›K fKcsÚ˛¤'ąŮD��������Y4-Ń»,i‚�ĄZ”Ťm/”’Ň`ka2H`ť&°Đ“Üě�2Ŕ•7´- ���€1[[¤áAn6‘Đ�[5G[ ������€ʆK9���JVŰ®ľ°©É�‚�¦Ë«±ˇą]$%p‚-/vL�������@P‹>ĐÍFś-- ��€1lKš ��Ll{+§Á :¦oŰiްŞe‡ť¨„„Ľb’H��ˇÂ±«ż´#N�Đ@7y˘›M$�� 0lK@��ŞŘ´üB?Á‹M$��$0ŃÍžhSĘŁj‹ž“_š,1��€ÂTݙРŰr.e"�����b˘cîŰvšL��ĂÖÂa°‹Mć–ż5ź2%��@B,,"PÜ�I!ŃMžčf ���IÔ5Ł%<Ân¤Ád‚;mh[@Hh‚‹ $��€ pł���‚pŔ­;.- �����€Č8ěƦíp¶���0†mI“9lKš ��‚„[9&\ĘhŇľ}IÁ�Hh€‹M$�$4ŔĹ&���c¶¶ ®ľQVXh���… ·2ŰŢě4����€€ 0c·MÓÜl"������3Ë4`/ú@7›H����AáT.SZhŘĘD��0†mIAaÂM†ŕf  cňíęÜ´mi�‡ÁŇŇ��������ŚĂ2L� ( hĄh ‡­Ąé0\^Ň������ ‡îZÂyÄ•ĄĄmiŘĘD��ä¸iy“SŮĘč}[†™EËͱË*—Ö6@Hh€‹„•ĘR¦áR&���Rpł)LĂĺ%ťLşÉÝl"�P,KĘÄÖŢ6:ťäMžhe2"�� 8©Şd� ˇ.6‘( ¶FÓ ›&Ë’ŤŃ�›H������ ”0áVA���@ÉbÓö = š“oŰi2� ˇ.2ă���Śa[ÂaŇÍ&���‚„Wlh]ę]6™ŤŮ˛ OňJ›H��a�ŠcŰ’ę¸aůFOPË’2Ě–% ����‚„[9���€����‘1Ú‡éĺmř /6‘���( Ű’šŕf �ŃÄľ}‹Ž‚U‘!ĂŞ•M"…AUĄ�€„¸ŘD���������� „rIĎƦo—‡A\ÜlK@Ë’ŕ" ��€ 0á¦C(4ŔE&�����@d¶a‚�… 7‚������DĆá0LPPě^Á&�vŻ„-}™H�� (p“Č�™H�HÂn2‘��AရL$�����f¶a’�Ŕ¶m$�AရA�‚Âď´Qo3•rË–�P–Ëđ$/rȰۦ˛ÜöĹ‚$¸ą9Ř–!Q˘x˘H!ÁM&r,K4'Ű’ Asňí걹ËĆ������Aa­ť&ąÉD��ö “��@PÂ>Đ‹L$��@P8ŕĹ“ŇĘrË9 In2‘( vKνׂPrš,Kś&KŁi¤ŕ& ����%LxŃ�,¦m›JęžA âd[Ň ��``Ű—ę±hďb’n2‘�(N–%š“mI���°¶m@����������”T¶č±‚%JBSĂ�����5ęŤýuÁ4 ŠaŰŇ�ŽS{‹HxŢÝK°„Ë’��€��ˇ„{ą`J"�,f{[A X ŰŐÜضĄ������@Iဝ„Cxđ" �Ń7q¶,)ĂŞe1I�ŔŔ¶/r’Ýd …&¸ÉD���@(áŢäz ŞÚA~QOÜmg˛ŔX,KD�����€Ĺ°mĂ$‚PÂ/2‘�����…Žé·ËĂ$ÍÉ/ŰCf�@FÜ$#PTKD�Ŕb¶·48…›M$�@F#ěr٧pł‰Ë’����������QŤĂa �öM&ĽČD€Ĺ°mĂ�‹aŰŇ��J8ŕCšŕ& �������(©\đÎ.ŰĂpł‰������Ăr™>Č‹LHeI€â°\†'y‘‰ČhR×›“m‰ć䲤�ËÍÉeI�����°¶m ����@Iĺ‚ŰęÜéňKx‚BF#ě¶ÁD@q°,i������B ˝č����DŘáKyLŔbض4€���…ÎUż·EŮ����°¶m �ö  ”pĐ‹›C{­ÁC¸ŮD������������ ¤ráI‡�…^t ��ư\¦ň"ă¦íwiĹ‹Dlͬ…����ĂržäE&�2šŕ‰ŤÉ/ŰCVX–4€€â`YŇ@…&¸ÉłeI���������"ăp&�`1lŰ0A����jŃa+�€PÂA/:!”pĐ‹L$ŠĂUK˛„AŔh‚››ŁË ŘĺÍNšŕ6µ- Ph‚›L¤0��PlKD€ ť“ß®ž›.K&»‰‰���€Ś&¸ÉD���@N‡·—č ���X®lî°§«_›$W`”â Ş’Z\Ö]ˇa°‰â Ş’V­-&)‰�������°Űp(:ŕE&�„x‘‰�ˇ‹¶_ ˇ]ŇTym“!‰�€â`YŇdîü¶= 2ŔM&���2šŕ& ¦——čd’ÁF2¤As7÷\÷‚M€"†d°‘Ś�U//¬’ТU/…id[J0Đ›úüĄ$F��ĹAµ¤A�ČhR÷DZ &x…MË–���˛p€››Ë’P¬vsŃ"©I"���„xŃ��„’&ę•·ĺ4™������€Ĺp؆ -đ" „.vŘ~IOÔh’›Ě8���2:ŔM&����°¶-;¦Ű’2a/d9ą,i����…#öv!‰�Śár56¶]ŤŤ]m‘¶IÉi°µ0Mv“gŰ’2a/ IŰ’2̶% â8X.Ă÷šH 8¶% "��ŠmI������� ¤rŃ‹A���@Iá 7‚���J8čM‡ �@(á 79 P¤Á@����–ëz*K’R� ”řˇ—r:Ř‹L$����…+‡V�����J8bo’��� ”pŇ›$��‹án›ä���B 'ĽÉ����Ŕjś¶i’,†í2|Jom(nN®˝ČĂbOđ& (¶Ý\n“Ôd !ŁĽČD pJ[Vcö �Ń‘ö" ��@(i˘E‚,qpkOŮk&KJa/dcrY†ÉÜ1ůK;% äL$�����%śä&�������PBąé ‡ �������ŚĂĂôI_$ĆÁeyŠ.iYµmwa±¶„ ��P1[ í´´\†AŰ2 "�����������jśÓ$ �€¨Ći›F¬\¶i ”pŔ&xˇyQÇಠ�������������”T.|Ŕ! „“Ţ`Äɶ ”0ĐaË7ů˝ ĂMËK A����ä&�ĹÁe(čüe{ĘL�@q°-Ů€]ľČ(2�����`aŘn‡rIňz·Y` A$+ČČqĐ5Á4Ů Lˇ„š4H���€PÂIo0‘ŃAŢaÓr���€ĹpنA�ˇ„“Ţ`"������jś¶iÄtą:6wŰž¦/ňě@BŠ®Š"(tH�����,†»Ëś÷­xL������X.Ű4I°X¸-OÓů�;ČH�]E"�����ŔÂp·6č’F\Y í°´\†AČh’H€Ś&y‰Dq°-C†Ů¶Ęćä˛ fŰ’ÍÉe��������`1<Z›Ę“˝ČDdt€/đ|Éť¶x!&ÄH,D‚ d2rśŞ«ĚEŃ­K{«’ĐD ����€âಠ��������D5NŰ4I����”Ô6,Z0€Ĺp٦©r¸,ěŘpůŰô3X'5—eČ0ą•ÓÔJ�Ëݱç.a#ŕŃ@WI|!3° R$[U `"dt7 U4ŃŢähpŐŤ’ŤI köÄŔT(€âT]g’$�ĹÁ¶ f[ ‡É^ä 0É L$@F“»'° Ď´· : w×d3 �Q&+Č]E"� 8Ř–a�¤.Ë0Ęmnvä&�Ĺɶ›Ű.Ăŕ0Ů–a�����ŔbşlÓ$J8Č ĺ6 7;LňŃ_č\@FŽSuťI’����������€’ĘM/ĺtŞî‰´4@ˇÜěp°H������@(á¤7u.Ë0€lű"9¶Ý4vą �ä&��P1[ -Ĺl[†A��������D5NŰ4bĺ˛M�€ĹlďR4 "�°.Ű!Đ /0‘���‹á˛¤Ód/0‘������€PŇIo8 ޏo-Ä6J$�@Fy‰�ČÂI^`"���X —«ĂŘe ‡É^`" Y¬]ކčb¶PZd ���X —mD���@(᡽LĂ;m´v1II§Ö®D+–’Ü=‘% "��J8É;nZ^ě Ĺl[†A�������‹á˛M“J8é &€PÂI^(±cĺ7ő´vł)‰Â���������B '˝á‹á˛M��,†Ë6M%a_6:Č L$������%śô†“жm6%�%śŕ }’/0‘���€Šá˛ €Ę•«Xú˛=L[ Ód/p8•Űa¸©aŇn4ób‘M�����@FyǶ_d”������†­şĚ¶4äĹ'ŰQ(mŘţ%:;�������`aXtQ$˘8t‹Á]@F˘8Ő¶‘,ŮÂ’nĄ0[.§'ÍĽuĐx`ăĐ 17 â LDČč o‘����¨0\–a�X —m äĹN{‘áař˛I"!����ŕWa'‹7I…‰;—EŮ€‚ơ(17±—·th&@0¸µě&�������XL—mD�Ax8Ľ˝¤Ódo‘����¨0]–aplË0���`1Ý­M¶ĄA��XL—«Ópą SĽÁD� 8Ův‡a{9|0_@B����@qZTŃ ��������Ęhírű[4SžtU‰±iö¦šeF��@qŇUQ$�������ˇZ8mÓ$Óe›há o0…ĆkżŃĂbChá o0X8ČLˇ…ĽQ “ĽÁD�€0�%ťŕ[ř_`"���������@Tă´M“� �”Tnú‚“p’7 d �����°0\¶i’�����(©Üô‡ ��B '}‰,W®bŃ·5ş”ÓĐŕŕ…_­= B�'Ű2 "������€P†C)‡Ë-<DŘnízJ7H��€,ä ¦PÂAŢ(…IŢ`"! y):Ŕ·đI| ĹÁe™Xl¸ý%™�%Ń`«-˛- "�dá o”ÂäŢ8űbÒ⤫˘AŔÂAŢ`"���‹U—Í»ÝŘsÁË%&—eÄqrY†AČ {Ű`Š0»,Ă �� beKß¶‡É���ČÂAŢ`"ĹÁe��������%„·Ă··é ��€PŇIŢ`"��������Q-<lÓ$!”tŇH�€PŇI_`”k Ą+,m—i€.w¸ý%=�Ł‘ąíż„©Ť”Đşť5Ž-Ş$MTE B�bá o0)á.ßÄ3dÁAŢ`P‚Á˛_T“ 1‚‰ I€�P,Ş,…٢Ę"����T}lúŻî‹`dVR苢˘Ë¸=a B����@���J:é L$Tĺ·że30 ň8NşÍŕ@ŰL•D˝˛wL€��������–ÖtÁpBfÓö2D�����,†—Ëł›‹$'‹*Ka¶¨˛Z8ČL$���@NĺŐcĂĺ;So’ 1± ����ŮAF@ d€âdQe‘YA“…&‘Ăaů®lćmi�� y ��,¦Ű2 sk—ňp¸´Ôd ĹÉeÍÉm7ÍÝ~$â9+¬·(&n%!����'—Sů*vxY>±‘��Š“Ër4UŻ-i���%zĚţeů`‚oÁ'± ±8YTY$Bö ���������JJ§ň�Óm; "�Óm™�ÂÓôĺmĐd/6™¨H�%‘ňě[3 ł7Č‚–XaËfSr\–i���°nË4����`1ݶà ����ŕÜo/ĂCjö0}ŰE‘������€ ¤“˝ÁD�������� Şeç.EÓ Ábşm‡A��Óm; "�XN·«cso˧ä‹ČH�������������B˝đ°-<´Ű)˝ČD����`cm Ă����JzX^NéE&˛poáůBI2ŮČH€,8Ř%i„}ą¨sa·e`bJo·4������˛pj·vmJ/2‘��Y ą”% â8ą,Ó ����Óm; Žł»ą§ßţ6cP$vl&V !MTE(Nt­”Űľ‰Ł±˛Ö@ ��Y8ŮL$����–k 7ôcŐżV%$PŔÝľąYÜîL�����Y0±eE•E"����E:sß%"�����������QŤ‡Ăa’�„’ž–—StOlI(N.-ĺŤ&���€PŇ˝ŃDŽË2 "����B7vzůËčs˛«’@�Y8Ůe$����TŇ˝QF`t’›ŕČ.(#QaÖÉ �(.Ë4€âŕ˛L��ŔríŇ ��ˇ„‡ň&�°n-í &2:Ů›:/Ë4��(îjAő¤,i� Ĺđjm([D������ Ş…‡í0I�����PFk§·uěiłÉ"‡É˘Ę���� Kö�€…é¶Mö ���€PŇCů��@(éˇ| �€ĹtۦA��� ”tćľ]`J"����������€’Ş÷Úż-2� Nňdw›(3U‘¢Áe™‚��˛p˛7š@@q°ÝNźŠ ’����˛$“–ÂÁŢh���� ”ôPľĐ�������@&���j<śť›^.Ó ������QŤ‡í0I%=Č/á§ö6Jv"��ŠŁ]qÜ’a‹ 5ąI�����‰Ě˛›KyŃŞ8](U�@śě 2��Pś,Ş,������€¨¶Ă$�����˝OßN“…ĄbňV~‚ŐPÚFŦąĹ(já˘Í ;TKÓĐ‹b0@ĆľjĚ�$ś¨Š$������Ŕrşm‡A������˘^x¸:7]^NźŠ ĘH���¨Nö € “Ë2 âbrY¦ŚłŰ2 "�@ÝŘáí/ÉP�TÜvçh),ýMť±ťH ¨şlLvUd¬QŃ ÔLÁpčP¶‰]D"��P1ą-Ó .&—ŰŃĎ©˙bž°ťáLW$����˛ŕd;ĘH�������,L/Ý r[V-čçŕKu3Ő,r’��������–¦U7D����`qM—ŇŁ\yYFÇäe9:”7uŽľ©#´˛ňŔ˘(”wń.;hT�ŃTP"�ádo`"�����€ĐŇCů ���,§wkÓÖžŤ}·LL(4o‘������A&4˝šűôínnÚj&���@…ɦР“U&«* áTޤsŕĄ5¶%!������P Ëeš¬\Ň'ű&rÄÝ~3Nf›" „��������–«®]J;|(_`"���X_ĘÁÉH�@…É­š‡Ém™��•+K a5vúę{h˛Ŕ@˘br[¦A��@Ĺä¶ŚŽ©×–i���������@Ô µ©Ľś~(ßŦË6 "���*ćö¶"C2x~uo˛- âbr[¦A��TLnË4����€ĺô˛MŠÉm™1·ĺO‡—*”sßÜ!�Qé¤n`0ä¤n±I˝„�����@І‡ňŁś˝*CŮŇŕ0ą-Ó UĚímE†$��TŇ©ĽÁZ:•7B §ň�����1�����€ ĘĐ^Ú¨‹ÉË2:&/Ë4�����°ś^–ôpjo0‘”p*o0‘���„–ĘŚrňĄüŢd”łŰ2‹ĘÂ�€ŠÁ—ňCx“‰ ���¨„‡íöŔ®Yii��*áTŢŕ`t˛/đl§…ąND€¤do•ŚÜ $Ä���������Zzjo…ĘLd������ ´ôÔľŔDPÂCy ap[fŢW{JłfC��SŰŇŃزĄA¤¤Éiĺ—vv®öVR°€Ú[Š I*â.C";‘€ Ű2 bTҡÁt{ háAÝcşD �������Ëáe›¦Bö-üd$‚Qr±ČIÉ6Đp`S$Á‚Ám™‚0��ŰráPŢ`b����������€¨ÇÓvT`9˝lÓ �°±vIa ��„ŐÜĂ—żL@��TÂCyg��� bđ˛L�¨Ľ,Ó ������� ęń´ÍÎéíŐsG7wÉ(���›*Ë ;‘���ÉAvµĘâ0����€ IfĹ22 "8óŢ60HÄ�¨ĺŤB:Ř·ô“Y„���@Ex(o0ŠŮm™©bp[¦AŚJxÚnč"1 ÎĽ·›tŽÝ• ¶ôÁ˝€D ��T ^•ˇmi�*᡼Á„0¸-Ó ����X˝ü-üÝŚ¤FĹW¸¤W×XNnK Â�@ĹŕKůŢÄDTÂCy‰¤„‡ň���Â����BKOí Ld�@-=•7Č�����ˇE[ţ­:ČĚ���TlŞŘ1y«˛H T nË4����°űöĺlÜb'D ���@…ÁŞĘ"1 ĘLd�����°^¶Ăä0um)0$“Ă//0�&·jÄ�����boż¨ÓBë¶<Ř Nëî‚P������*­č’` ���XN/Ű4•đ´Ý‹Ld���������€2¤§ö&2��b°\uďŇä�t*o0‘©Ü–i�*ěąöoŐAb �������������€bhoí T�–ĂË2 b�����Ëáe;Lb�����eHOí Mˇ…ű%ýT\€„¨0¸-Ó  bôĄüD"#Ł"x(Ţ@F��@{®ö÷6ŃHTRvE’(0PÄX¤n$!FĘukaűeúş 1��@EđPĽ‘ 5áAÝ@"ÂŘsÍżŁÄ�������P‘<o”! 6U9€Ű2eśÝ–iŠŰ2:¦˝-D'ďP-Mb�������ˇ{úö—ÜiŘM‘$ŔˇŰHyҲB‰€ �� ĺŤ&2��˛đĐľŠMŻ–ą¶ “0��ĹÁm9:•7šČ�@qp[¦I ����Ë…oĺ'ú"±0»UÓL3����€ĺđ˛;7Ľ,˛L @÷r‘€ M•eb����*®xËöÖE˛¸HR,6“· 1��������°4­ş,Ł"_…Ťö.†ˇĐCy‰¤„‡ň�•tpXůĄ= 9+ e1{Y¦IŞĽ,Ó-<´7’������%=µ_Ň'±­<©{Rő† Zxho`" íMť·eJÂ�����ČÂC{ى*^–iPĽ,Ó$��Tĺľýe0Sbŕ6$! ¬Š$�€,xho4 Saĺ’B+‡§ĺ D���ČÂS{Âŕe™&1�˛đÔŢB §öF—ešÄ/Ë4‰€îĺ7šdj""����� (ŇS{‰©Ăš/Šą4›�Ä‚Qł"ÜćÂĚš‰�������������€PÝ` ����µŐ®E·›l�����éiyCÓ`We™������XŢşA&†·ešÄ���‹ám™&‡©[ŻÝʇşI 8XUYŚ“‹âY‰„�@Ly$b��� 8XUYć�VM2U;Ę…ŮžK\’0� ÚČ��@ĺěeúđn'ë %hái»ťĐ+X˛-iđp‡·_˘P������������°0¬öĆť]˝ŠF@�Č‚Qłą0[ˇ8Ů®HŕĐ©t ¨’0p/żQ` �� *÷đíE4’l`Q$‘“Ň5ŕék! ���@Ĺŕe™&1P1xY¦I ���`9|UFŢe!‰©»¶5Č&ím™FśÝn§Oĺ Ä��������ŔrôŢ6Mb���,‡·«iŃŰ"ËÄ������, oUň0©ö°���XšvU–‰��‚–žÚČ�€ĚýXô‹«ŮĚ(�������° lw‘ܦ‹‰���������������������������€��������������������������� �������������������������������������������€ €�� ����������������������€���H�����@��€������P�@�P�@��@€����€���€��(@���������� ���� €��€��( €����( €� ����������� ����� @€����(����@ ��������������@€����@!��@@!@@AA����@��!���Š���� R���(� „PH�@�D���@���������”€ € �������H�@@(���@E� €@��$€��  ��$€`(�&&)` � �`’��“�0�s P@a��&���� (��LB`( ��Ŕ$�( €������� @������(�€I��€���“�Ŕ$@ ������€I���d�((��Ŕ$��Ŕ$@ˇ�@A)(“��@A��  �ŠU��(����L�� P�“� ����`Â$� &��0��E˘��������€ ( � a.• ��@Q č¤�����Ę�€ ��“ �eL��(c ŚŔ�Ę�( ��L���  �  `€!�€ ��`(��† ��  �¤ &I��\6 0`H�Ő`ŞŔ$Ŕ��@�L�����@��P�“��e�������0 LŔä2��\����“�f�����2���`&��  �� l’@€jTĘ����•�””����0™�����������������(c€2�  �`��e�C���€ ����†”1ˇ ¨�e�T�� l.»Ś0�0 Ő�€2`Â������ʨV�“ �Ŕ$�����e�C†�Ŕ$�L“Ŕ$C`r�P�Ŕ$C���P Ŕ$��s5†ŠN €2���Ŕ$��ee@€I†”AŮ��€ LÂ�P�e�L ����Ŕä2��S &”������e�C��ʆ0�e�0™����”A5�&�€I€!���0!� ‘�����C����Ő Ú��`€©Ć@P0 OÂ�C����  0L†��� �P @�T�`�0&I�������€!Ŕ��“P € ��Ŕ„I(������€!ŔL�Ő€�Ş��@�Ô–j�Ę�f®Ć$�Ę����(�(j� ����LŞA���0��Ŕ$���ÔT.d��“@5���`�&Ę(C ������Ŕ`Ş1 ��eÔ „I€ ����0 Č���“��µÁ�Tc��€!��LBŔ��Y“0�����PT& “@5�Ę��`@%L  ����&��”� T€!@�€2��(¦ Ŕ„2Ş1 C�`B�����e����@�����@Y�@`†Ú@@���”�Č����&�A ��(c lSaČp„��(���`P6L�`���Ŕ����eŔ�e��P6É”‚Ú$ e�P[PÉ$ a`���eÂ@€€2�����Ŕ”•�“ �C�Ę&��`��� $Ă$� ”PŤIĘ�€2���Ę�����&�0� Wd&LŔ��PPV €˛�Ő�P@Y€I`��(`Ô`�“�0@ŐY†” ÂL.Â�@�0 Ŕ�Ô¨�0€'`�&)›Ce€��&a�Őx†LÝĘ�C�j�������Ŕ��Tc @���€2��€2���Č2@�3„I´¨Ć$ a@�e@Y5���Ę���€ÉeĂŐ†�����Ŕ&a�0I(������¤Ś«Q„ €2�d&Ě$ a�&aH����”�ŔäÚH0PŔ\í!™ç«Í$L�„'aO‚Z �€ ���Ę�€IÉeC��`ć:L®m’!LÂ�@��&aH�L’™dŕ˛��  �(��ŔL2�€2��€!’Ę������€ÚB¦�ŔÚ�Pj @WR „ˇ �(`®ĆT›ÉĚŐdÔ�Ę��Ę��L�`((ŁTÔŐ ��0�e�e��”�����  ���������€ @&�aL Ŕ�ŔĘ`pŮÔÉĚ©m�s5Şe&��˛0�����L„I¨�0 CI‚���@m“ É“ÔF  `�YT¦CĘĘ Â† a�����†0$�����L`ČTő™I ¶�ŔLÂf†0�����L  ���� 6ŔC2$�����“0„&a��������0É a�€2Ş1�  0 µ@Ę€˛�`†0�P&KŮ€I‚P6�&”A`��P��������P)3�”QŤ!L@���P��e0�“0e!TcÂ�������ĚŐ2�Ę�†IIÂ����0 C� ŚIf�¨Ť�0ÔV €ÉL2L2ŐĘ e†00 j �@„  Â��0 3ÉPŤ “0„©�L“0���@„™„!L\m&,  Â���“0„���€˛2�(0������0WµĚ0É @„dćdÔP6jL�€2�C\��Ę <„Ŕ�€ 0 čĆdŞAÎL&Â�LÂpŮ�����������€2�P6 CŠU ”A�ʨĆĚaŕ˛'a¸lać0 bf2j@f`†0�Pa�  R Ŕ�����”AÂ��”A&a������“0„'a��@„��(0Ŕ$ —©Á`€ą f��d���0\öäŻö3źŐ‚Á‰„! �0„! e“đäĚ$e��  a���€2JH�d�LRF����Ę Ě�# ĂŔ$C.{Nf8¨A™0 Cf������€IP d–Q TÂ< ŔÚ ŚeȆ0��0ąl8ü$ A’™”‘ ef���`†0���0 C�’™d(”M5†Ě�“ K†jLʆ0�0 Cj °ě˛!™���`rŮ †ąÚĚu›çj3��Ŕ@„™2k b$ L“3OÂ�����P6„‡Ă��0 C����  ’‡”ŐŤ�Ę ™ˇ ’™”A2��&— ‡grŮđŐ’����€2H‚Z 23����@��”A2“IÂĘ y(.’§Ăá0ˇ ÂL€ a® C& ÉĚA ÂL€I€IÂ(›$‡ ��@„CĐ1†@„™��Ŕ\ŤÉ™'@s2O‚$2HF ’Ăea L���(«Í„‡Ë†Ă!L€2Łdf����Ę Ě&0„ ������#© ®6fee�0!L  ’™��Ŕ†0���Ŕpjd†€,™�L`ćËňµýŚđ`0˛ąŹžEŔَ›$3��&aę6“Ěd’!gć‹„ĂΆĂ(d&“0&0ąlęŹ4“2Hf����ÎL��`†3�µ �j2“IľlHfBäÚžžşÍ$ÚB* ��€I.{†0 !™9L�Ęŕj3ÉLd�”A2“ 5HfŔ$Ěf8L�€2Hf®ąě™Ŕpf�LÂp´A2��&a8ó$ g&L ś<¤Śj<9ĎťŚÝ 弶sF'ŻíäÁ�ŔČ ™ @m!نnLµ™“‡0&����L`8ĚeĚ“IúlsÂC2äübÂ0ś™Ŕŕ˛2L��€IÎL�€2ȵM’jĚ`BIć LÂä0��j#—©eÂL€˛âĘ$üäóĚY-/�Ŕp®¦É™a@¨ŤĂĚ“0óág Ă™ Ŕ$ gćb<s0sV‹¤b09<„ÉËrdćbĚ\bäĚ�“˛É‡‡��@m™Ă“0sf�”A€Ú8™™LÂTă9¨‘̨A2�(Łj™ĘLľ¶!çy�����Î3‡y>çMb ���`¦n3É ś™�@YYŁÉ W›ůş=Ď(��(\Ű$™ 0µ#Ë$32 3Ă_öOţč?X4ĂR ”e€4 „*"�����&09ŁV$0C`řĚ@€ ”A2€I932¸ÚčĆpfČa0WÓś3ŹPŰ|”I�Pd†śreă“'����e@fČ™ 0„‡“g0 “ŻläĚC lňe?řÁGB¨E˛†“™ �P1rć!@äÚ&ÉL�(Ł:™śy¸ ’™���PÉĚ#áś™���ś™0É™ 2�� bŐ2&”Áe3'arfL&C 6Hf�L`H˝…|Ť…3)ŁCf.›„‡O"�@$3��(\Ű$™ ��� a8ymaÂĚśgÎL(d&0„áäŃ–“(Hms&Â&GŐeČL����Ę ™ą ’“3je 0��†hăä™��@ĹHXF>ü�¨9ó��ŔäĚ\ÉL����ć˛Ń-LÎL(«ídF ¸Ú<ś Ŕ�Ę ŚÚ$<$Ăä0�����€2Hm“0����  ÂL€2Hf2É™çPoçđ L�(d&LŮkSK€çÔ6üÁ'šD0““��0†�&ĚäĚfrfPÉL�€2ęŘ\Ť'¨ŐŰ'3Ő“™���@\öó�!<‡™ś™�TŚśyć0““(b&'gp ť<Ô€džmfÔ 5ȵM’™�����fřđ”}ćÚćjĂ©ß a&LÉI�����€ óśłŢr™��L2“3jf����ă„gćśçÉIB�L2“3�@Y‡yřĚ&�!3‡‡Ož���efBóŐžůśç`Âc.Źž1�T0“““Ěä$2+K¨m8yÎLb ������€!<śóLµ yćđŕŁ(Hô–Ł$���� 6’™0����(0€2™É™!™É™ ���epŮĂá‡Ěä̤ ÂC�&<$ź™@PŰLÎL����Ę Ě�0“3*Ć9ó2Ş1ÉL†Ěp0 393����������@„‡�”Axć˛Jđ����@1Ď��0“Żmµ†P±şť™ĚsÉID�����”Áá™�������Lçśç9'†đđ—ű 0 Á" ÂLÎL�����*Ć9ó&ĚäĚ0“3€2řÚ†3s0���0“3“2Hćáä©o3É 93�0“3ĘŕđĚáÁĺž��€If®ŰŁ“<�ŔdB��eđeĎü•]±ęH(  ‚™śD��  ��(ĂC�����ÂĂ'®™|Í –e”ŕbpę·Śr}„dŐňL��0“ŻM-!�LÉ™ ”Áá™ĂLN"�0a&g&��������@YYĘś™Ëŕđ��&hˇRFľěáđ”%™93�`ÂLÎL`’™ś™�@Ůäkűg~ňźŞ€�Ę0ĎQ„D“��ĘŕËľŘÁŘ-śĽXňĚ'b� e����P‡‡€28őö拇&&���� u‘˛âĂE���É`TÁ\·yÖ¨Š��¨çĚC��0“3�Ę çrf���Lµ3ä!�LÉ™ epxepx�epx��µ… g&�LąsfÎ<‡Q;C�€2ř𳎣*B���ĘČ©·É[(,€XĹQC8´đĐŠ���j˛ŞŁŽ!�� FÚU<� N˝‘ĂC�Ŕ\Ć|Ć5*NYh’ šd1px�€!óđÉ�”Áᇡžş#€PE09‰��P‡‡�����frf.ĂC  ��������&Ěä<¤¶|ĐĂÚ’Ă3É<xÚ3ICŁ*YjŻ ŃüÁˇ¨á‘ÜŻ ���ʸÚ~ň© ��Ŕ„™|˝U�PF 39#›“úM‚n%s Úr”CŰz̮ЊUD���€ óäł.-=š‹XuŚ2„"4‰�PĆŐxŽę6"��(#_öÔWTE@9ĽX������dfrf���Č��(#‡őv’™d†śeźGúDM"�LÉI ŚČ0„Ě���&Ě\·gľěáđ€`&'`ÂLÎL�`ÂĚu{hĂ2rX–��`¬vf”‘Ăa&gć2rxeäđŔeâs¤$ e\·Ł§Žc!FŐ*ŚŔʍ¸t � EXüÁ#ŞVŚBÄL"��€˛Ę Ě€2rx&eäđL íú�á‘f΄9üHÉL"�ĘČá™™ŻíäÁGŠ8řŃC±tÄĄŤAŇ”6ĂUcD!b&�a’9ô†yp�U@óčG#Ë1XĆÁ �¨0sÎĚĹČ©7čŕ ™3‰���eäđ<MűDôTŮóXńˇ‚"���@2b°�€ 3'<L>k1‚…��j ÎL�0sÂ0ç<&Ěś90ać̉��&ĚśóD�&Ěśó"fN�� ŚśŻŰ# Ą?Űîk=bcPa e’5 ­1P5BňrÁs dćD0 ŞIĹČáA���Ęćśůá1F¬:RW!���Lj›ĎĎ8 Ŕ2¨ĆX+���@Ĺ0 ™ �PFĎ\¦çsÄ@E&Ěś9�e“OţÄ«C—����� ˘(¬8V�$«F rŕŔU#Ă4C %1X��(#‡‡”Í9óÇ…p0ú`Ť€F·é������€2rxL9ç©����(›sô[<¨" 9<5Ps„aÎś@9s"�0— Öc����*(GŚ€d5F]Z#d * €XGŚZc j„"$3'���`.ţ芪jŇŕ@Ŕ„™3'fÎ| Ęj”O<5BĚ| dćD���� Ś2aćśg�fÎyȧ~C«,Źr´ZžźńŘ\ŕZŹ(�!Ëb]ă���Ś! #F•¬FTQńg TŤ����fÎy*�����đp®ßâ*"930çśdŔmçb@�ĚśĎ!fÎ3B�PFO5rxµ%™93���&ĚśĎ30s>+ ’™|ÎÁ<#„HÉ<Ő Á�0ÉĚyN��€IfÎç 2rxŔ$3çsČA‡Ţ  fňWśáŰ»Źă’��BЍŰ,6§¬ С5B€1¨°  JłҲb:j��€ ušMd1'fÎë Ą€0™ �ž9çD€ ��`ÂLBfes>óĎq}ÄÂPZ# ڍ!ŔT8¤Ş�@9<\FBPFˇŚ�0aćś§�� Ś$ĎSíŻŽČy>ˇ ‡9Óć€Â‘vŇ€Ť \ő�@Ă–×ëń„Ş�Ŕ2IĹ¨Š ćY5ÍÖB–ž‡ dŃžp �ÂŞ‹A�†ĚO<p BUŁNd ąěA€ąěÁG=F������PAŐtěj ‚dÄ`1YŤ˘gu!¡Ck„���ˇ»řQÇ!”ŐB�š ���T¤®ŽÇ1Z6®×ř!«‚�Q5BDŐ!„Č̉������2��€ 3ç<������Pţ©cŚŚ<JĚ™LÝN´nymČč@0¦vxL¤ĂcŽ8<ćĂÚľv€P�T9ç ���€ '?q¬ ��������¨ >g1âgˇ nÜŘ@i@�����TťóhŘtŚ0vUáPA‹amÁä3“ #ş?óg` * �ĚäĎ8P•ÎJŞ1VŤ1s# �����`ÂĚ9O”‘ĂÚ’ĂC���� Ś.#_¶e‹ÉÁB��TfĎt:{•HŠ` * dÄ`@M]ńX‡ŞF�ŚA…CŠqŐ1í*¤��RŤŹ1Ž*)…U#����Ě|Ć däđ���j#‡‡ÔFÚ¸nĚWŁ83j#‡‡��Ŕś™9ç `ÎÔ›^]űÔŠˇJ�€1ř+{Ä­X��€.k ĹĐ ��@ęÁB����@ťşâcĽFÁ2¨0 ���������©#­‹,�@��5¨9ç©€9Ě|u ‚eĂ�€9Ă$ÉLćŘ-?˙ڇ˛¶*€@Ë Á��0‡™sNŚ€ÚČá!��sůŚ�������¤­r Ăčv&yµ‘ĂC�¨·ŕÉg­…U#d `<s"��0ᙏ°"aD~u ���˛T•ô6çđ ć`ć#ŚG8Őá$3'�����@mäđ�d@mäđ“Ě|Î�����Ŕf>cŐÔŐ±ťŤuQŞ !2ĘIf1hp ����€ 3źóT��@I~>c…�@ÚČá!/vř±ŽÄUŹqY��° * �����@ťşUëÇc˝0@�„U#��@Šn:*Ś - H1Xj ę¨A ÔÍź+U#�° *,�¨QUź!�0gćąę1®!���TPšŤ©?ô,^Żń��!DÔŰ١W}ŚB(aÄŞ1 )«Uăk;‹*�„0bUĂ?őř¸®ă¨ ����` XT°ę¨�¬×8°j„��!ŚX5B€1ŚÂ…°b)"ň̉��Ëźů��@2bp)KĂ�@MÝŠŹúF¬!�ѲŁ^řˇ·3˛Ť;d©gΫѰX5>V±Śe"¦fĐ<5ŞĆ …Á´p1.ŤŁ$E€1Ҳ3Ô€� FĐݵâPE°YaŤP)B�����€ ęyŚ×¸jR&-;®xÄU#������$KqÚ1T‹îôŇsĐÂ! ÔpŕWĐ[7pa@���ÉR¨8⪠aÄÚÎb- �����*XuŚ��ÔÔ­éł:TB@ă¨oŮĐ6ĂŇ4eşę8$����� ‚µőWĄ™ja@��c�HtńÇ!Q6‹×k<ZÖ$lî $')B� łöë:Í€Ƹę1®!�€1Ô€��ję~éÇń*#�!ŚqŐc\ŰlÔ…>‹×5��Ŕiɲc­q¬5B���� Ł"íęău<$�0†*«F a†_×Ça�ÂU#`lÄRŚŻzŚË‚�@v §Ůui iÄ­¸b@!ŚX5B��„0bŐ��*xęŘf±V����HĆxę.]q 1ÔÂ��’1.s+�T°ę¨Qkěő…Ç�„0bŐ!ŚX5B��Ŕ,Ĺ!,ˢ}§É) ��¬:*…««ŽC���PA뎣Ć#®!����€dŚcµ®zŚ«F���\X1JG­�ŔăŔ!ÄŠĄU#„ÍâźogŹuŃ€ĆP �����ŚqÔE�PQUĄĆ9Ě3ę…����¨ŕšÎ¨ÇzšU­Z8jŤ� z­Ź‡jĄgđZtT›Q pę–Mş„P#V�B͡ÇZ#�@#VŤ!ŤŁ^řĆxŐ#– �0†Z1ˇÜµôxÄËŽX$��ĆP+aÄŞ2†*«9ÔJgP#VŤ����@«Ž±B�� &[ńę#$›Ĺëu<D�ÂU§L���fڎc`Ő�€ V=ąŔěZJgŞ+>âÖ!�Ä�c¨Gllč«>˘ŚˇVLLµâ€���PÁŠUG�� ���HFńuŐŻřW!��ڎVP#V!�!‹ěú+~ŚUf/CD1ÔŠ€F¬:B���������@Oöz|=…XŰY¬d µâ€B±ę�€V¬:FaÄŞ#����$cuA@«Ž:B�����$c\DKg# € –Îj,|ÄUG�ÂUhÄŞ#„0bŐ€F¬:B����’1Žş �ɨ`ŐQG@+nݤK–Ťşâ€�®řk= ”­—Ŭľě!ZŰŚŞ" ĆeŹXDT6Ča¨EgX+!›ĹëŰłŁ �����!¬¨ë8°Ö�ŔjĹ� ‚µő1®u„��aÄş=ĂRŘšéKă¬u„Śa»2ş[ćP+s¨Ň1°4FÄŞ#���*X±Ö�cŚc íVČjĹ� …ŤŹíŮT—‡0bŐڎťa­8 ��€dŚ#��������PQKgG ^Š4B����PAëŽkabŚ#4fÝđ8ŢŢa,ڎV��Ä� ˘Zw|` €YG!„dڧě¨+�����*Xu/hŚW}Śk$�!ŚXkĘT+&Öjb@�`bőŇxÖ:FaÄZG���!¬ńŞŹtWćĆřş}dë˛cĂŔŠ����cq@aĹZG��� "ÝŐÇëń@ŮYĽ^Ç!�„0b­#C­8 �ƬjĹq¬ë!eőŹc]†Zq@��������HĆ8ę"€dŚŁVUë0†qŕ€`Ć8p@�PŁV¬#b­#�����@E­zš˝Ö:ë:B�����$#ő×:ȡ° şâ#®u„ŠA»Őža-{†µp@�,C-{†µp@����¤ŽqÔ��€µj|zv¬ŻúA*R¶^0c¨…���€ŠZu¬#���Haăc< –ˇV��¨ˇ;{÷E3aé€���€Ô1Ž8 €Ô1Ž8 �5bÄş=Ł]­8Žu$�����������PÁŞă¸ÁеŽ��$#ń×:-ő[÷ ľd mˇp@���0F<â#®u„€F¬i_ŻÇá4¨EĆP+ŽX±Ö4S­8 �������HĆ8ę"�HĆ8ę"���H]Ç �,Žă !„…c!cŘ:ÄŇT ¬ŰłX‹Žl˝ę1 (čć Y4¨`ÄZ�C­8 „ě _ż=;Şä©$���„bÄZG���që+��€eU[÷±}‡ŹW;) ¬Đ@ěe'°@Ą …A­X«U����@2ĆQ/iÄZG@(F¬u„�DËF}ŐTáPŐĂv¸4ŔjĹCí,ľľCV ��aĵŽP@DZľâCdÄUiĐŰěgöËNd$¨•D�ĆPVąY©łëJ™°bDŚ×öłřz‡�( jĹĹ ÝŠÂCńÖşâ€��aÄu{kĹÁÚ5›Şk„���PQ+®u„��@E•˛qĽŽ‡����ŚqÔ…×:B–ő«ţ‚«&N��€ޏÖ���HĆ8č®”]ŻHg¸V���€ ¶ězĹ` ë–=Ö[ö¸í· bĂ*=]•8Y‹PSv˝b 4†µbbZ+4†şâ‡Ý-*h kĹ€1¬�����€ .Ç��*¸xŹ�� ‚‹Çz„��!\¸ÖˇBŤ��� uSŚ1*B�0á'ÖőxŕZŹ���˛gřZ¸F����*ŘşÇ c@���TpŐc=B��cxÚE,��¨ŕŠk=B����$ă8ꂌ1ü1®+âö o´ö!m K9H@a°n±(#X#Â×z�ÇĐŞ-{Ô˘ „Sv­G�€PڍuH5e¸Öătw‘Ń@Ę®°3¸Šq3z˝ŽC@`ŔŞ����!¸Ö#�����€ ®zŹ������Śń¨_xµQ ×zL»Ţ`+n¬¬¸±Ň(��Ŕ2-„펺â@cX+��������@2ŽŁ^ �HĆqÔÍâXń€�„pŵ> #®1âş=ŁUt€���������@��\ő8^ákť2­ʍQë(ŐAĹôkýc\rÔíŚVŃ���!q­G0†µâegńëkD�ŔZŁ-’����€i '\-sÝĹA KČahES’VŽ0 C!��€ޏÖ#Âo»G]ô���0†µâák=B�����€dGÝX·ěłëz|,íDKHa 0h…2ÂU����Śá¶Äâk™ ���� 2†!< ‹kŰr KH�†ÖÂ����"cÖ ±pĘV)lwÔ!q­G!q­GČÖŠÓÚđ ׊ÓZô ע������HĆÓYըǡk=Bá×úmęś}±i!­ Á A+9LyĹ͵}¶l)H$����0†µâ������$ă8ęE���P±Şâ`\!�É8ŽxĂŞö٨é?ĹZjF«hÂ`Y<l �° őmö3»Ů‰*JˇÉ „Ëa)G1n˝( ZŰ­˘„F¬őăńş¤©µV®Ľ � S^1C[qbZĄÇе>@)\ë P ş[ă‚OÜúBS‰¤•�H(Q+Ň :@�ĂZń€�ÖŠ xhéŃ–(…« $�ch·ŘŮşâˇ4¬����@ę8V< ¨q­ŕĐŇc]�)\uHăeá*9Lye@��������¨¨«ŽÇăŃîVQ8°®ÇCZ9H�����@W\·gq­x@0±őU¦I*†¶Š=+‹@G\ëA�°¬J5eZ+������€dGÝ,Ž�H–fGE�’qc`ŕZŹ��Ćp”‡®ő����PQW=Ö4Íľ®qDU$�ˇ8âZŹ€ޏÖ#���c8nńl]z ]ëABfőşôUśÖ��0†µâ��TđŇ…ŹŐÚČmá@cÖ˝+Ĺ…â »…�á·ÝC_ń,%㤊�����@2Ž#Â×z„€ޏę 3ýz;` ������ ®z¬GŚa­x@��ăXń�„)»ľÂ8˘pŕZŹ�����\őXŔÖáĄq@�B8ĆkýA[H���ĆĐZx@€Ĺtc±~M§A+’´2 Ň`˛eÜRŁĄM#M���� Cx[ćĘͦA����` «^ &@aëzLZŚĺ‚ţ%ÂĄ $������€1´&ČĘ–N¸´‰Äbć6 ©ó‚m”aR¶tPšŘ% ]ŚZ‘!ÁRŽ(tŐABB®:H���ŔÖ�Śa]ńQ:âş>i%±ľh�� (ă·ÚĽČqtYŇd)Ň ,e ܲÁAZBµ’¦Ą $������°Ú&Ňq\śle ��ŔbhK̡-á��‹á¶‹¸đ€��° ÇŰ8Ö+|¤xŐA�,ĂzG}…ÚĘ@���€ĹĐ®đ€�������¨ÓnŤ”'Ş©-a‚Bˇ1Ü.Ó$��‹ˇ-a‚������QŤa X ñbÄk=ƢgňŐĐR(4čŞ@hĐUG şlŃU ��1�ˇ8ĆWýŻ:H���������$ăxÔ € �*ęŞÇú€Žx­h[H�����"ă¸Â���@E]ő±!��B¸âµ!X¦›Łëwˇ\Ź©HBÝĹ8¸í a@ahKx€�����@Ĺş đCÄşµm9…R �€ ŘÚ” l–(Ŕ« $$«Ž0ôŞ´•DaPZ$,ę—ýA¦0čjD € 8âe˝:z­Ç! 0¬‹&�…Ż6���ĆlYjíbÇҲР4(ŤpÚ&‚bĘ^_¦uŃ�€eucqýš&�� (xµ)ĆĐV< ������PÄëzĽ„��‚€­MA�������Śă¨ŠşđZŹ�„âŔkťfk)lwÔ+Ô¸QżěąňĄ=L K7pËĄ:––…p”FP‚Ą Ȱr±iJ°”ÉI¨}»$BB –2�( JŁ “¶Đ���€€jnx÷˝pÚŕ[7G­Ŕ4XQŻQ����� „˛`kSP¨˛cý%O$B ¶2Ă lá¤ö ”F»Ú@/ĺ �������‹•˘¤6!(Pŕ���@deZŰ M  0´…2¬´…*”`) �� (Lڱû˝‡đf'XĘ@���…[›H€ 0`kS` m ”R¨…z„ĆŁţV‹¸��Bqŕµ!�€1¬+欻ÖÇ Ť¨%C[hNËŽĆÚÍAě´ ULŰ„ĺ¤5@���`1¬…ŹAWµCkð´�'­…@¤îŠ  ��€(:Ă_—S˘ÍN´•'ĄŃ�BF –2�������€’Ę‚C›‚�X ë ° ëŠ ¤Çq˝¤´6 ˛”€,ęÖu=¸ę ˘ćÉ%1”µč���`Ö���RÇqĹ���$â쏯ń1•ňHË-L �����@(qŕŐ¦ �������€ÔĄłÇ .Ôq\ń€��HÇ€eXołĎ^×cXÚ@����������@Ôq<ę«`҂òLA����,WІÖ���jÔK>–e G|Ő´Y ®:H€Ś\6‚q× ĺ˛uĹ1®_á����@¨xčŠÓNŹk$�DŤuc……Z†uĹ���,ĂqĹĂ޲ÇőżÂQ˘ÍN´•Ąˇ1YV4Ön6š+ HJ"� …[H���X¬,ŚÚţŚŢ»‚JląUÓŘrłi��� ( ŘÚDm ���A!cŰ%¤��������@dLSŮ @ őŇNwWXx@0†«á0hk ��@P°µ)T ×���˘eÇőŻę9Ú �$aŔV���AaŔÖ¦�…#ľĘ?h+‰â¤�© $�ŚaYÂÁ–%L��+ ˇu„��!\x­G€1\ ¶6Ĺ×jŽ–F�Ŕv5™kZx@�@bŘőB¸đ€�����˘ŽÇ#< ����Ô©»_ą§¶Ń 4hŤ���% ŘÚ�ò¤^ë��€¨8đZŹ��ŠŻő�,ĂuĹ��€ŠÚ˛×WŚ��������€ ˝ă?.§C€ 0„­= Ű-Ś0iŤp´F� (LŘÚDch[z‚­ $���€  &Ą0đjS����*ę…×z������É����’ńřÔ›–-L����€Č¦0A Źř*˙ˇ ­ $�� [; »e®\Úád[H����š†ĺUě°´)›¤‰% ˇKH��0†e �����Śi ����˘Pűq '-YL[; MŤ•m4g/ŰáĐa©ÝĘÓä*Úp[Â@U´­É0�(NZŁ�����€Ĺ°,a‚�����ŐŽrS» p) ��„lm ,¦e Ş®+śX] �bËŽë_ň@@q°¬rˇÓ¶=L[&e GÜm‚,Ăŕz… Th°FCk ��(ËB8mcŹÁ—ĺiÚZłÖh����R°•�����Ó&sÖk K_]›¨É”l) �������˘Ó&���D˝4 ¨ełş.úLŰ’ °usáR¦aYÍŃŇŁÜöĹž`Ił$%‘�%XĘ@�����B ¶6��X źzIkúěî’,e ����BI)TměŹĺŤ=·ĽPH ���°–…ŽikhN–F€Q‚Ą›ŁeÚB����€PÂT–>ÔŠNáRr‚µ‹M™f­Ń�������˘Z:»¤ń—6��X,ĽÚaÚÚ@�‹iYÂdNËB�X®4µcÜfÇ۵2‘HI$Š“ĄŃ���‹áşčmK@��������j Ą|„?pW›ÚB��,Vő–‚0@ŇăřvŹB'KŁ�`1-K ��� ęâqŲL×Ȳx]LĺÂćÚ¶ “�%XĘ`±,e ����^ë4«·¸đPNËB¸XŰ]q@�€¨8đZʱâ€WQ4ŕŞ����1�����Ô¨‹Źă-ĂuŃgz-a���@Ôń8đ1”­M%ĽÖ�� T<đZ§™^í0,-‹ŮZt(Ě Hj��Ëâµ>WH���BĹG]qÚ]Px€��QńŔk}�Sř*ҶŠÁE"†-› ŘĘ@�������(ˇlŘÚ”Z°µ‰�����%” [›&lm"‡eI1vµ§4)�Ŕ-Ë*Ä´`”’ą¶mŁc¶4”¦Z+@ `íMž†KH�­Ń�B’É&*4Ŕb)XĘ@�����`1<–đQ4…_ĺ‰.6PJË- İíB)ă 5”­Ń��°–% !a+Ó���������DŹGyA:Wx@�`łZ­#�@lłăú—ž¨��%<°µ'��ŔbX–đ€�X ×������¤ŽÇCßaą{XŢä ��¨–…&–2���¤Ă°˝„( ��� ”0akSB #vąQJ @P°•!Ąřet) ���AaÂÖF1kŤp, AáĂZH€„2ěuAą´Z8ZčA.e �Pě Á@P°µ‰–%L ���ŔÄÚ›>L—6 °ó†n!h0€Ă 5@�°XŘÚaXÚ@$4ŔRˇ–2���1���”P6lm ĽÚ��� „Ţé_—Ód��ư,Ń1mK@` Ë’&����SítŁsĺER��` Ë&AaÂÖ¦ ����Śi “9[[Â�@‡áň �ŠĂ˛Đ����ŘöŇť­]y´˘1y)T�����X®4µ!��ŔjaZŇ!”đQ®đ¸Ú@�������(Ł^|´)�@ Q7Öµ0"^ë˛L×5€(z¦Ý������������”T6m ,†eI���Ő–4A����%•¶6Ąá—=ĐĄ $ 0h- �cáŇĂŇ`) ��˘ąęµ[š t9ZZLX,…�K9H×Jě >Ń­ $��$4ŔR†Ph€Ą ‚ĆäírL������… —6‘ò¤IiX–a¶´0€Ă`ilNŰZJÔZ����� ¦ě¸ţU}Ś»´0Pˇ¶n­5@��€ 0áŇ&� îjS·pĐ`��cX–a —6�`LË’&��� —v.-‹Yka„ ����‹ézËMË€m/vL�§e ���Ëi ‡ę56z€KH@qR–ô�—2�������°–%MP(aÂUmT.Â`0ŔVٶ2�¤D®mËt*ČŠH”ŮZq€Ă`­8¨č€W$������Bń_ú#• Cv×P TtŔ«$�¤xŕ«›Ł­…���€ L¸´C¨–%M €1,Kš �@¨bŹ×›|�`+9 Z � (L¸”‰Dqe€ešl+ ��„ —v@–% € 0áR†`+Ň µ0€( Ë�Lěő"‡)ŘV&����&\Ú Ş9ůr9:f$4ŔÖ Üvi§»ŘD����������€Č¦4A���@ÔŤ©\ô����”T6\şcᲄ�����QŤiI‹aYŇ�`1,KšĚٶÖÚrx°‹M$�ŠÖB†ÉVĂÖ&� ŁŚŰ.���‹aYŇdKĂa˛­Śb¶j �%<p) ��Ëi §îžŠ- B˘B“-4íjCŮÂTa©ýKž¨���������� Ş…áněiů&OT�€ŚŘĘ(f­±9mka BÚ+P`�Q€-7; &��şŘÔŢä yĐZ µW”4@���°–%M,†eI��`1ěŠm Ň�YĚÖ¶‚hr—%dś•-=ŔÍ�������Łą%M��°ÓnlZ.a�����D5¦†ĂT®jS��°–%M��ˇ„.í ¨úŮđĺ—á��@���€m/ĺ4����,†eI�ò¤ �X Ë’.eB¬´Ęph[€’H�����–áşĆ)«ë:Žř*¤Akq€��Xf×ka��éGÚ¶–i¤].É–6����%L¸”‰�JxŕR¦€|Ů@��������(©^śĘ!��”|•C@‰ľĘ$”xŔ—M$��¸«Mm ���€Ĺ°,i‚����PR˝p)‡ ���@ÔŐŹĺ4şÖ Ŕ (LŘ–Ăd[5G[ Ň µ0€����,†eI����”T/|•C� (ö]C �Ll{+§©Č�›M$ bÖ$ m™&Űl"���@(aÂĄ¨ŠaYÂ�Aá/›H��P›ľý2|� bÖ XI$$4É%<-oá�¶Š Ë�P´������QŤiI�Aa •tłle"������� 2¦ŁÜtµ—°Á� ”0áŇ̰[–t€,†eIX Ë’ŕbX–”(©˝…R X6Ěę8aż¶!•2Čq°V|LŘ×R!ٶ2…¬Ř,®˙’Gśmĺ0\ÚD@Ble"�����AaÂ]mj—0�IÔµ%$Jpĺ e � °•QĚv˝�;nX¶0Qˇ¶2‘��������@d–t€������"ă0µ&\Ú!�Śa[Ň� (L¸´C€Â„Ëj޶UlX¶0�������� „˛áŇA��…Cą¤ĂÖ&r,-L �€ 0áŇ&�&\VÇhkaP-KŁCş´‰�[ ��ö¤Y¬-J›H` Ű’ ����‚¡\Âa[&��ư-éd2ÁĄŚ8[Z@�����ĺ[›KˇĂ`[™H�ČqĂňE>PP,ŤÍi[ ��������"ă°¤ (L¶·…€®7,—0č0˝şwHżČČE%D���€Âdil»tdž//§Č�@‚ÉŇ 8YZ@Čh€­L$@Y‘2ŠYŰŇ“ÜĘD ¶Ą'ąuçd Ë4ŮV&¤ÉҤ4Y ŰĘD@Fle"��XLŰ’ °¶% ş”Óí%@�Hh€­L$@B,í0Ů•7µ-L ��2Ť®˝„���Ŕ¶%@‚ÂÝ.h,µKz’K;Lv) � š_¶O‡MÄŕR�2ěrˇ””&KŁĂPí(4 p±!$¸”‰��a��@(a­H������DµpŘŇ�‹iŰŇPpkĹ´ma�������J(§ĺt(·2…‚ćäËĺt0�4'_.§ �����AaÂM¦0Ŕ%=m_Ň������ ‡rI‡­M$���€ 0…—ňn6‘���ŚaŰŇ�`,\–‡´Č©” ĹŤŃU/Ŕ‚ć´m ����3hŰ҂Ŵmi†•mas˛-a����”†PZŃ#�����PQ/ţh‡ ���������ŹÓňA/młe Â`YÂ$a‚[™H�ö…É�—2‘���@PBij§I¬™L$��Ą!”Ąőqän› gŘË…˘1Ů–0Ă`Y¤4X–0��� wµYěeK�H€$LjŻ@ˇ D1l[J4ئ­M$�������`1ś­Ea[ ¤!”Uz„BńŔŻ6‘�����ă°ĄSѡ\´µ‰@h€K™Bˇ¶v8ŘÖ§˛…iYfcćm™#$,K@�Hh˛]lÚÚD����cض!Q‚­&»ŘDä¸aů¦>&wk]«@„ٲ„ �Hh€‹MˇĐ›H@aŞ·`¶-a˘BŰŘÜö˘Ć†Ër..���@BÝěÝl"Q,KŔa°,a˘B\l .6‘�����‚č~ąś&��@*v€­Nĺ¦m5GŰ&��������`ŚĂ–NEÜl"ĹÂĄť¦K›Ča°,a “���ư]ŤMŰ&*4ÁĹ&� ˇ\l‚)mK’2��¤J+:€Ě°›M$������@ ĺ‚[9D���� 2gc‡Űvšnm"��€ 0áf… Ë7xĆ•easÚ˛Ą'xłdadd.76������pł i°,i š%+2��”†ĐZ©ć貤şf �( Ű&€ 0áf IŕŇ“mí0ŮŦPh€‹ !ÁĹ&�������€ 0á¦) ¸•C(4¨k…MNeI“��… —vŕĹ>Đ‹Ť8[–4‰��������� „rÁMLÓí-Äa°,Ă� .6!M–%M ���0¦m&pśí°p»&�� “eI©Ž ßţ= EE°°gË’&����€1lŰ0€1lWąaŮŇD&ÓpyK�����‚č~ą<ś������Aရ¦4ŕf @P8ŔÍ&��°XYµ^y[=–®] BšŕΛږ&����@P8ŕVˇĐ·ęlKa¶ÚröĄI�������� „rÁ‹¦4ŕĹ&¤Á˛Ą'y±‰@a˛ŰbňÖNS‘n2„7›H�����… Żj‡`0 ··t�� ĽŘD˘8k@†»ÚÔ¶4‰���ŕ0ÝŢŇAHhP× 4: pł‰¦0Y¶áI^l"������Ŕ[6±—·đ`Ű4É+oj—4‰€ÂdYŇ�$4ŔÍFŕm/íéÉ^,fË’&�����… /6‘€bÚ¶4 aşZ °Ń pnoé��Š“eI�¨¶e¸°üB¨��Đ»ÝqI.áI^l"�� ˇv»ŔD������cÚ¶á����Y8lĂ����@TËŽ] Ň€‹ią ¦ĺ­ “ n6‘©5HĄd1[–4ÂlYŇ���ưmiÄ����� „rÁK9ö 0�`1,[úaxyK0P]Úizĺ ‹śĘ:5'żTČ�����'Ő’&0����B ĽtÇčŇč0ŘÍ&2���@(ရČ�����€Ĺ´mÓ»W`ˇ �‹á¶<E{�_äňŕŇŽ†{o‹«8Y–4Ałˇ”Ś´ĺ›ü0Ľ¸D Ń›Č����Ŕb¸-§éÖ&2P€movĚ��'Ë’&0����J8ŕVTqŐŢV $0˛¨“I`‚›Ťbr)‡Ci&���B x±‰ ���@NÓË[:€Mpł‰ 'Ë’&ĄI» äĄ:F—%M`� 8Y–4��XLŰ–&0�����B Ľ”C(�T=6ýö—Ă'Q�Mpł‰ ���@ĺĘQm%KV¤•—Ú–&0P,Kšf ‚µé`7›Č����ö šŕfŇ`itěfŃ7›Č�»^ Křŕ®-A«•<Ą[›H “_.1��Ë’&02šŕf€ n6!Mv˝� M`@FÜl …&¸ŮD�d4Â./ô”nm"SějD@Ą d����%đ˘)$xĺMĺ6|;(,[űeI�Mpł‰*–%M`�������„’†ĐZŃ ��°–ËđaZŢ–a����°¶m8€�,†mP��@(ဗr™a·Śr`��Nö­=›»µŇ`Ůĺ¦ĺ6|3��P,KtĚmKŔ���‹aۆ ��@(tNżÝ=w¸\Ň�������%›~ ;�� (ĚŘËŤ†$Ë’&1�������€ĘŽ˝Ľ SµF°Ń% PŠÉ@ ö¤IDč`—aŘhş´‰Đ7;� MpłgŰ’&1�����cضá @=V~łk(ζš;˝|;|hzyŃöĚ€��@B¬ě„Vf€ Ęܶ–'� ë.l™����€1,şh F rifçě—Ĺh` ����\–w÷ô8ÔćĚ„,LD ��PtU’‰(ŔŞ9‹vM,Ěş*É@ڶH˛®:ĚM‹#Ka ���P,KšŔŰ’&0��%ŕֻ٠���`1\¶4‰�¤Óáö–Nb 8Ů–4‰�������zeAZŐ†ĺ6L`€PÂ^l”k „R2�P`—3\B˘{yĹ%Űh$ŢöĹ&«8Ů–4)N¶%MÔŦíw´e ÁĘ…oż ,ťh…E0Ó KŔ�Ĺɶ¤ €, TŠÉ@¦8Ř–4ÂěŞd ŤÉ/—łsĺŇĹR[X���Mrł‰ ��§Ë’FmKšŔ�Ű’&0�€PÂAn2„An6‘����Óe`����������J*—đTˇ„z±‰Ś, TŠÉ@�¤Óěµ/B‚B“ÜŞct·ääm{ô1őKuŠŚ��ŞbÓŐŻT@d4ÁM†0 {6‘�������@(ဗr ˇ„˝fĐh�B ĽŘÄh‚›Ű’&1����–Ó%|XŢN§7ű¶ë@€Á¬«ŇÁd‚›Č��¦8ŘvcÓvI“ ^iÓ˛Ńl®úµŠ ]Ô Ŕnf"#Ł n6‘�������¤ÓámMÄ��������P$ĺ‚—rŞŘéöËh´yw7lÂŚÎT4‘e°˛ŚÄ(•ed��������P$ÁoĹ!�Ăeb�����–+†ĄL©čtxyNb��������J8ŕ­BB ĽŮ ����������@ ĺ–ž¦ĂK9��Ćp·7Č%Lb��X —mÄČč�/2„AÝ3ha„ٶDÇ䲤I �Čh‚;�€âčÚ“Ë’&12šŕĹHm‰ŽÉeI“�Ť°—‹LOňf2�����X —-Mb���������ç~z‰ž3�P1Ü-I¶0AˇIÝ3ha����`1\¶á €ĹpYŇi˛›Č��€J8Ŕ;,K+/-—4‰���������ʨw¸ü%|€��ÓeI“Ń·r:Ř‹Md�������ˇ„Ţʉ ��,¦ívř ov ��Pą˛Aj6©XŐ“ňN!Ŕ­śv+§CuĎ@ “TślKš¤â`[†DĽŘ ČhR÷ ZÄ���,¦Ë’&1�°.KšÄ���B ˝”ÓÉŢiÓrI“Mđ"U€m_äpHň>‘ťH������¦Ë6LPh‚›¨âdŰŤ Ű%Í4�PślKšÄ����B ˝ÉD�����@TËŽ]ІA]L—mÄ��������ʨwyő{aXhizyN`�Š“mI�ťěĺđamA€šŇ0é Yiiठ��@q˛-i�ÂĂôň6a¶íćb‹Ąf���€Šé˛¤ÁA^ ĄA^d"���„2Ld‹Mé•7-—!ŠĄËoáQÄÂA^d"�2:Č‹;F·%Mb��������������� Ş…Óa8 ��`1<-†—2QŘÝ{%%¨8Ů–4€â䪗dÓd/ŐąđÖžÂĹ›#[aIlnĚĹ$b�€ěňĹi)Q«<±&0 “ĽČD��ŠÓeI��€ĹtٲÇĘ©Ů@������€¨NŰ4„Io6‘��XL—m8€BIył‰ ��������PR»čM‡´¤“ĽČD����`1]¶é����Óe(�J:éÍťC×¶4ÚNÖ d�TŤĄĺ…–Ë0���b����€’Ş×đo»,ďÍjě4ő˘šD¡H,DB ���Č‚¬$#Sa¶fÍUp V"„3M$`�����(N. ť&{‘‰ �����€ĹtąL3Đnßl™�Â��Štűr)������˘Z8]¦ `Ý~‘Ăl®üe1‹Ś�dÁ©\˛c·/hÄ6*d˘iBÂŇ$6´—p����������%µSőZŃ’ČĺÚĂRÍŃm&já /Ň /2ŠŮ¶ “ÂäŞ5›ň"����ˇDŹÉß.O§y‘ ·¸±RÜn˛ ']e`�����€ ¤“Ţd"����J:éM2�@_ޢ€â¤ëRÇäU“d �Y8¸kŤVXZ.Ů1ąmĂ���dá /2ŠŮ¶M‰őš;F·mŔ�������%zL˙˛ť"{‘ŚŚJąéňwaŁf),����� L§öe™&©8ضa¦�€îňÍž"3˛ŕ�ßč.DF��������°°`UťD»"#���‚"ťäM&2������€¨N—éÔŕűjOÄR�€Ĺpą “âdۆ Lq°mĂ��� ”č1ýËĺi ;'oz㢮 `���������°.—éPŕŕ0âlۆ ��������Č��€¨Ćé4PB '˝ÉD`1\.á cňćŽq·m8tÜáň9ČÜF$Ä�‰]M`�@ň&UŔ]ľŮ,2# &Ĺmšn*0ضa�˛p7™Č��€,äM&2�PÝÚ‡čÍ22�����`aş\¦ ÄÂAŢdBÂ]ľŮ,2Pśt]”���€ ;Üţ–P�Š“j38‘ É&]Ĺ8ëş(St]4X8Č›;F·*ś&ó&b������XL—»ąárEť“ż-&‘ ÄNdÄ�@qŇuQ¦0éŞŕ4Ů›dd�������`aş\¦J:É™Č���������µ‡_Ęłcĺvul¸Ü˘ @qnm3��Ą“ĽÉD 8ąlĂ���@(é¤/2‘�����()ťôEł1۶a±pp݉,a� yé;˝üŤ›GvnlLB � öĘfćŤ"E`GĆp» $Ě‚® a�����€Št’ݏ¬ZD“Y8•Ű4˝TçČ­ )™›HDX8Č›8ŕM&2�PślŰ0‰‘…ĽÉD@ĆÎÉż«›Á&É„)Nş.ĘÄ��������AI'}‘��� ”tŇ9� ”t˛÷D–!Ń ^YŇ$Fđ¦ÎŃm&1Pśl[v ŢÚ‡á;YRl!¸+_Ô)������J:É5Z8Ŕ¤4Ŕ¤4•Ű4˝ŘD� 8Ů®Ž —Ű0‰! ��'Ű6Lbdá o0!L¶mŔ��€,䥜Nö���(N—m¤îňÍ=Iň���…ĽÁ(fŰ6Lb����„’Nň¦ĐÂAŢ`"˛4 š}[fŠ“»µA^¦Ô&J.&âą=´wąˇÝ†ęU^đ[7ŠŚ��‰&š&D4ł´„� bea‡ĄÝŢ`WĂpą ň&2������� ”tҨâä˛ “…ĽÁDFňŰ~“ )5čşIlť`,€,Ą°¸žŇ¶&C����%ťô&2���‹évÉŽÉm& ÷šČ’&1��˛”ĺ–Ű—é �Y8ČLd�����,×6;vu­H’�¨Xµw%Ú"Ň/đ“íBq·-Z˘Z@$›HDTcŁ˝Q!!a��€âä˛M!dÜ— L Z8ČK9ťĚH¨…Ľ‰ �€,ä TqrنŮĂôĺ%tLl- âb†i(oeÄMš#Wµ`–„F—’Đ�wůĹś‚1���€Ś=&˙ŇDĆ�����¨°Ňl m9Ą›Č���@qşmS˘÷ĺ‡$FňU,•6!í˛Ů!9 .Ű0‰��(NîÖ†j-ŘŐ0vą°ç¦—ß‚ ���������� (é¤/r{ČvW“±±`�������E2Ń-.ëÁ$łť Č���T«[D‰Ăä˛ “H76ÝţUܸf$a����� brٲcrۆI �¨„{M\ vI“€ŠÉe §Éľą,úo7g7b ·Ű Z™OUM)‰ H���������MrŇČćę&Q"RÂA^ĘÓMČ�TL.Ű0‰�P y)§ň€ŠÉĺęŘp· ¶Ái*o � nl´÷/* "dÜŰú€V&"���ParYÂéPŢŕ@RŘ ű·‹`ÄŚ��������KÓ¦ &b2� Qvq‘M„�P d§a«+1 ŚPa°ŞÇŢt٬ ‘X„˘PжŞ@Ä„���Š¸Í•Ě"3�Pa˛čbĂdŐe™��¨0Ůj‹Şm¬üRž«br٦I ������Ëév™&©»ý§ITŢ #����@hé$_`"*á _ŕ@����bďľg‰…$*&·«cĂĺ6 ä Ld�@% Ôdˇ,g—mšÄ���€J8ČEÇÂö·|+O™ŠÉ]o°Kš¤ŠÁ[ű^Ě@ ���P1ąlÓ$�����Ëévť“—mšÄ������„‚‡o_˛)Í€ŠŕˇÝNÁe^Ě@ ¨\¶a §éŰE2P 'Ű€„2›vóFĚc�Q(♞ ´2d:– ������€Ąév&©brنI¤„“ĽÁanm+2$1����@(řčŘ·/ÓI ����`!öň L††5ŻšQd ���Š¸Í•Ě"3����€ I&˛ŚJaré˛I ������Vs§wɨE–‘ sm+$WZ„„»wŹfŞ#&«("��Paré˛ÉađV|Š.$‰2ŮŚ ����������őÂĂeöĽtY&�������őt»b�,§ŰešŔ¨¤“ĽÁ–pÄý¶†‹Č��@Ĺä˛M“P 'wOl‰Îąk[‘!ÁžłYś¸HDˇĚl@B ����� "¨ŘBP '{I '{�€ŠÁe›&1���XŻVÇĘ_ÁA„v\Ôű"‡pÇĄí2Lb������ŔrşÝ›n[xHRlˇ!,ádor �PÄÝ~‘HŞŕdo2 Ł"śěMA í6„‹Éxfi)‡F°— ̂˖’Ë6:'^ZJÂ���������ˇĄ‡ňVş{ -îśÝĺŇ/ËŃ1ui)  'ób����������@Ň~ ?âľm`���P“<ŘE—eb�������Ŕ‚ŘËo0dvśÉ )’ «("� "śě d���–łkŰBź‚/6  "™ ŘB“ŘÓáŰE’ ������–†—.ËÄ@…ÁĺŐcG»7Á (��)‚Q­.sWl���ÁÄv0 ˛`b;)Nőu…¤ňä¶ś©�����������E|™\í’٤µN¬JfłÁÍ*É„P,J,Đ)Ú® ���������XZłH˘N������Őxş*�`9Ľ\¦C“˝ÁÄÂÉŢŕ@�����°^î†e›E6(ŕdo0 Sapë˛I �€Jxh/§áÍd�Š[:wjob@�������KĂË"ËÄ���BKĺ Č@wűE"3km‘-’IŚL>$»&j2P '{“������������d���QʧÓá �–ĂËĺ0IS—µrł‡Á ��������)‡—Ëá ���@héˇ|SŹ©{[‘!‰"îŐ÷,° …“}Â���������D=ž.‡��������P†ö˘ßŇäd@&łěćV^ÔuI" Â`Ó%‰0�*ád_ŕ@��������X˝ü&‘Pśě Č�€Šŕd_`@� Âŕ¶4-Ř m2������BKĺČT nK8ť¶Űiř –, šőb���� Nöd bpۦ Zxhwç†73����@%śě;îp· vI“����•4@±2���ËéĺîŘtű깣͛`&ŮD×$‰0��*‚“}b�����*L^ş,����`izą 21�������()|9ür154± 5ĎP^·2Q ´0Řt±qjŚŞ]0p$ĘtdlůEŚc�����¨„“}QŹ©m]!C��*ád_ŕ@ bpۦ Z8Ů8��P öd������������˘^tîÔąC§ň TĹŕ¶M“����ˇĄGŘ—1ŰŐąéĺ–’E+[H› d����@-<Ř8P öd���*FßV,ú®xu†‰ !lXń‚L CĘĚ DÄ����›ĄiŮj-/Ytˇ<±hRUlşý%= ��@Ĺŕ¶M“ň��������–ĂËĺ0‰X/Űč|éśÜ\D9™��������Ŕâš­´�şg˝��������������������������������������������������@� ������� ����@� ������������������������������‚ ���������������������€@������������$���������� �� ����(€��� ��� ���� ����� �(€���� ��@��������� �P@����� �����P��P€��@�����P !€����@@�����������@A"��€‚�€@���@ ����€���A��€�(��(�����������…���� P�����������Š�€"B€P��� �P�P!P�ˇd@ *��*H€‚ H€‚(�����H@¨�����¨�P���€ ��L� €Â„�X�&(@�(&����`†�0T �(��&��  0IA���� &�€‚ (������„š�����„� P�Ĺ*&LBˇ����(�&�����&˘P�€I��`���&˘JQŠ����“ �”Ŕ$�P�P�s5Ô$“�”Á\m�&aŔ�(�� RL2�Ŕ��� ¬ ��  �(�PV0 �e�“���e�Le�“�C�d�P€!e�L��”Ŕ€á2��C��  €2�Ę���€I�  (€I����  €I*�eŔ¤lB�����  ����“�����j#���“�“��L�Ŕ$���0 ��0`����”C �“ a®ŰL€2�¨Ť� I�`(€!��e�e�P����”MÂLÂ$¨���Ŕä˛�¨m�����L����(`ŞŐF����(›If�����Ŕ��@“�PĆ$��”Q   ���€2� l€ C��`e��������P�Ŕ����� l’2��Ę��L�€I��@ĚŐ�����„:���e“��e�0d�&I�€ �����s5†€2��&€I�†”1€!�C����� �0��€!�TjŁ„á˛!<Wc0ąl��e�P 2€I�����������0dH�P ��Č€IĘ��€!�� ��d�”P � 6�����€I��€I��€!0 �ŔĘ��€! ����C� ��0„Ş2„™ë0Ő��”QP†�P�L‚�u����`R¦¦��Ŕ$ µ0™���0����Ŕ���P6„'dL�@Ŕ��  �Ę��@�@���0 ���@L ěj0T++cÔ��ćjLÂ��“Lť a„��j#�Ŕ$<I�T��€É�0 �”��Ŕ j��“��e €ąC�������(€˛!e�`’!��ŔË Ŕ„2����Ŕä˛!Cµ‡d �0 �Ŕ$������€ ��`��������Ę„( ��`Ő€2Ş�”É€jČ �Ő�PV ��€ ������L2���������“T*�L(Ł������L@ŞAŮ@�`ʨ6Ŕ@�¸ ”��`Â@j aPV������Ŕ$@    �����€2�(2Y€2���`2&Ń��e��e��0W9 „  `“ ���TŠ �ŔL�Â����“�a€2����€2�  �€2ŞA€2����&�a�`2WŁZ `�€2¦SŤ ���aČLÉ���e������ĚŐ€0ˇ ����������((���d��0L€jL�(��`2�Ăä2P±j�P���L�ÂČ�  ����„�������(+��€I(P��P[�ž�„ˇ �&�a��`€� ����YQ�e�“�€ �„�����(��e�C€0������0 ¦lrm†�„a€�5������&Â���e0�”�Ěul€a†0�@�������ĚŐćáđ �L„�€ŠUj�(�„!¨Cµ �Ę���`†0�0 “Ă��&ˇZ �”1ąl�Lsµ!™ �€™„!<I$ — �� aHĹ&‡‡Ă ���”�0 C�„™d � a”A�†0� a� b��(@V����ĚŐd†„! ŔT{8™ąl¸ÚÚ* a.ÂĂa’2HŮT+�  @„!<!Ŕ�” Ę��&©Ť0„j0�����Ŕ$<9 A @”Í$3„�����Ę  `��“”M€jŐÂ$CjL���Ę &aĂ$ — 0�����“0„��«ˇ–™ 0“ — — *a�����&áÉa’2�P0��0�“ˆ0ePc2Ŕ�0×1%Ú�“đä0 �e�`®6OÎ< Ŕ$<9L.›Éņ0��eePöpÂ��� c¸l�e0a ĚÔ±Éá�†0„5€'g&a�€!¨e82CjLÂ�Â��†0\6„��� \mC„��Ę L5�0 C†0“ #™`C`C�€j0ŐP‹,C�€! ©4��@ )0“0����”Axrf��† 2�¨a€! �C.ľÚCĘ �����e���¨„!����dęĆp´A†d& �Lµ“kŔeCŞÁŐD�`C€j“d� aÉ<„'‡'a�( 0OOÂ�@„„! e@jm0 C����&a��Lµ™d.�C˘ �€j@�Ŕ¦\1BmL2SŤA„™«Íä̤ ‚ Â���CÂ��€ ��� Śá0sÎLÂ��e†0„®lsÎ<tŚ„2�“0„��������2\mćĚ„á˛! ”A„! �Ŕ$ áIÂ����T0� a����Pa`j �0µ g&a�`† a aŔ†0���P  �Ő Ě� a0„©[M¨6€jL2“ )#Wl’™0\6d€'‡'�C2ČeC2Ŕä˛á«=„���&ać0�(0��0 OOÂ��“0\Ű$čŘCušZ¨aŞa�`��L€2Č�j ”A�¨ąLÂ(” É ��ef��������€IP ä�Ŕ����Ŕ$e$Ă”A2SV„§n2eĚ��2�¤Śd€˛‚�Ęŕj3ÉL����`† áÉáI€IR$˛‚�@Ĺ < C��„'gVŁZţâ- ĂeĚ��  ’™0!L���\6žÉeĂá€I”A2 ¬Ŕp�“”ÍÉ ‡ą ’™�������”A2  0„ PÉL(d&�L`Ăp�����0©ŰĂáá0���Ę“™Ô ™ ”1'39L€,pmC®mHf”A®mHf��@$3��€ Ě|Ů3O&ÔF&”A2���Ŕp���P1B$3�”ÉNm@f��”A2  ’™�ľLŤŔp����������L`8 á0�Ę“yr®Ć\·őóÄ™ ��eĚÉ<9L`CPO5HfB$ó†S$3�����  ’™�PÉL���(+`�&0&eTcČ áË&ąŘČá™S·™dž†3S@$3aR6üeś8L��&0ś™��ŔfNž �@m!S·G·óĚçÉ<Ë%šOÁ$2Y‘�����Ę yĂ™ 0áĚ«Íä<O0pFŤdf”AňpŮđ™áĚ�&0ś™ aćäÂpFŤůrçĚśŁH&€2¸lŇŠ#cđäk{ôŕ@€2HfL‚Z†<„©ŰĚÉL�`Ă—M’™P†Ž‰0a�Ŕ†3�`epň���€2Hć LÎL«Íśó|F¦š��&arf��”A®m’ ™¤6˛I2��P‡epµ‡Ż6şŐF`Ô€ĚLŽ63™P‡™ą $3—1'Ďj2s1HfPÉL�����`&g&��0ÉLÎL��d&g&�L2“ó�Â�� ¶"Č€I><“3��\ŰäĚs���0‰63��&™É™ �eTc’!��“ĚäĚ��€2CĘśgrk›Ëŕ<M"”ÁeĂÂd&'�ÉŐž9 0‰¶ś™�Ŕžd&©mr°ě @m´M’‡Ë=8@2““��0ÉLÎL�����d&g&������”1'Ď“Łmrř±·äĺ^î`�Ô2jĚÉp$3�������(d&€ �  mĚŔä<„I&_Ű$�������Č��`“3C`r´A2s†':6ç<ŹćŕW‹¤D��L`rfeĚsĘž|p @äb#g��@sň<×§ÓlD�LÎĚĹ€3399"L��&093™dćş%Ł ��e &093����Ę ‘Á•ź~ňÉŃ$ĆPÉ<LN"��@ulrć!���PÉL(›„ź|ćÉ™ ”A2���ʨĆ$z;dÔ“™0É™ ś™”A˘ ęz›$ÚB®·Hš ����@Ő2|fČ™ xÎyÎĽnç™(˘É šd1c’áŃŘ7=8"��PÉL������Ę ™ ���“É  ’‘_o3źł~“°Ř#I!�eĚ—=5ęśĹ�é‘°ŞâhrÖ0H˘3ůjGR˘óčÉ-XAĹĐş8R"Ŕ1 fehÎ 9arf„Q;“¬7<+7<:€&Ŕ„™śPd&@$3d†đ<sÂäĚĘŕâá0jf���ef2a&ç!CňĚy&'Ag&g&YĚĚ������€ 3|xŞ2Ďa†r���&Ěäk{fBĹ8g.‹‡ĂL`ÂLN"�Ô–dHmf�����PA„™�PV–3( 093€2ŕĚ3���€ 39Ń[NfH�frfL2“3��ĘŕĘ93äĚ&SF’çY s0�(ä™��0ÉCňÔ7m'ĆĚeĹ•Ma&“ŚÚ2�&™ąn9ŹÎ™ˇ'���  Â3Ifrf“Ě$h›ó×9Ź����€IfrfB„‡�@„‚63s2“3���`’™ś Ú$3džóyÎL"��eµqµáĂO5 3ä<ĐŃÉOš-zr1��0ÉĚőÉňL���eÔŤIž!Ěđ™‘ÚćůYDZ*B�����É`°dĚÉóŚ‘YŮÉLµ™eĚáÇś0â§ą!)šśA˘Ia&'�€28<€28ü>óŔá |4B��•ĚóµăŇ 7Ş0Ş HI4ÉRÓčd@.üčI���  φđpÎS•3�€28<jpx*�€2ęĆ$Ď�Ęŕ‹‡ĂQ•3€2řâ©cTE��P‡g�����Ŕ\6óWË`°BˇÚćüÄ�É`°����H‡§Ęŕđ<Şśy†ÍPkŚÂ($šB˘É$‚ÉI@Lç|ž3“������@€ �&™ÉyČLÎCfr��  ���&ĚäĚ�&Ěä<jËŐ”oĚ™)Ä>ƨżĹ( 0E����Lf“ó“¬Ú9ĎRE€Ifrć%R‚ÉIe&'GĘ™çsfNd šKžçĂÚé@@¤D™Aç=9PF„™ś™��euNă\oGc9xĐqxLĐ–BF€ÚrµáĂ�¨ &g&”‘ĂC�����`Č<ü‰‹��*¨É™ ������eäđ&Ěä<€ 39ëí$ŁŰpxâĹ"Ďó4eńłĆh‹LµÍ† ŤA…!B˘94 3ç@0“ó±BöóŠ# "fNĹ�`¸¶gúLUǨm’Ć@ir+¤��d��TP5FUÔe3ź:Bdćd1ŕŃ'uéËkËyÖ����@ę’ g&LfóŃ��”M>üĂCcÄ YÄ`E!b&�`ÂĂWűg{7Ž«F(Ş"��˘jT"0ać̉€2rxÉ0 y"<ř«KM:�0aćś@9<ŐĘÎy‚ÁśD(#§Ţ˘—ÝđÔ@ĽňjQ�PF’gřş=*\ZŚś™AíLň@��“Úćü«Ć¨Š, !™I�����0aćś™�eäđ(#‡‡�Cćá3L>k *"`2QK>ç�™É™ Ëa”C�PF�€2rx���•ŘçĂóäĚŁK���PAŐU������ĘĘN`eäđ�¨ŤÔFľěç~â��������@mäđ,"?qT��Po‡ a��0g’‡OULçŃKšDŚp¬Íc žáčG���¨`,;G„�“ar±<¸9<��”‘ĂS_¶řĐ#T±jŚŞĆ ˛ćĄVĄż•PD�A2“�€z yr˝ŐŰ`ÚňyĹ7­��PÁĚ™#‡�`‚¶óˇŠ��������PF&<I–’gBÉyΙ �Ŕ„™sf.F�€ą¶áĎé٨€€"Ş"�Ŕ„™sfó<5ĆŞ¬I ”@9<„2rx�Ô–dČL�0sÎL€2’<ç$Š9Ż[fp �”qµ e!y&�Šq5&y&����µ‘Ă3���ŻmřŻö“ bPa„��0aćś™�”‘3 sÎL��0sÎL�€ 3çĚ€2rx��LĐv>T��������ÔŰ|ë€�*¨Uë8ę”I…Ơ€� ‚ŞQ#cđáŠU#��¨ C€™9ç ��0sÎS����� “���”‘/{âĂ"����’‘ĂC0ažĎxĹҡ5B��c5*ŽvͰÖx`Ő��CoěQ5Ö‚"„"ŞF�`F����”‘ĂC����¨lç䇡c¬ˇv†+ťa]ńŘX`­ÇĂš6ę‚&¦R 0F���€dÄ`U����@ęS·ęÁ«"�PAÍ9‰@9<s1rX[rđD€ą¶áOŁ�cĐ–…ąQk<j1`Ĺtv­X1̤1 CĄˇ!�€1äŕ‰ĹŔÇÎĆkŤG-šI…��!ŞFE���@2âđČR˧ޞӳŞ1P!�����j#‡g��ÔŰ!Cę-9ő6çĂś×l,šŰ,ŞÂŇćg=Ć ĘJ "DHf���0sÎL��ʸÚúíú@ž™D���L† _öĂŁ}†"B�� 1Ň.Şl38Ěë–y±#���LxÂç ĆXYbzć\Lś���� ¬Ú!óĚçĚ� lNć'>1 9<2rx*�j;Épřٲ°íçˇâČ48�€2rę7šÁ‰�������µq5ž×zę"F�@ęR;™0ÉsÖoŇÖ Á‰��µ‘Ă�€ÚČá™ÔFϤ¶9Ď9çčLµđ€€¨¨@Ä™9G����“™9§nZ"bäđÄb–#0�&Ěśó…™ó)DfÎ���Č����@fÎyj2âÔoQ� �(#9?c¬Q5j„��0sÎzCU>Zi&1IÁ䀲9g~´Ć��*XŚŘŘ h„�0a朣žÇ¨[KaY=źxÖ�����T9ź5 óś���€ 3糊`ć<TÔvýD�”UÎ×fś<@Ůɇžˇ Ăś©TMb<ęxÔC€1¨0Bˇ�ńĚgFŚr’™����eäđ“Ěó©c,bčÂËćY rĐŕD�(#gfóśr������� Śž eäđL�jKÂśy�smŽÇ(�@UcM™��$#«(#‡g�����eäÔo“˙˛^ë1 �` *RD­1��±–^:Â��€ ŞĆ1Bˇn< ŞFĹÁyÖ1Ö!��BÄ<u“4(„…ˇ×!ĘęDzŃĆŇ#Ö!�0†VŇ�L9Ď ��)ĆĆő¨k„­¶C”F4F€±x&]c!DĚs!™çD���€ 3çł*€ 3ç3B���*ő6źŹń��0FŚt‡* ÉÁB���)şĎ1˝‹K!��ڬ &3sž�� Ś~R«v3$ĎŁt„�Ë Â�€Âňůş›ÜÍĹٸ®Ç(����¶+(0j �@ęÁŞ F-hşĆ������ FUŤc-@F˛#†9ź5d 1X!@ĄŢćó ����������*Şjk$#W��@ęĂO���fÎg]µVÇZ#cPá€�c±*şĆP("jŤ��!›QýŠز¨ÂCЍŠg„¬˝ <óźăZ#�!DÔŁ1ĎČnyţ ���� ‚Şq rĐŔeŘ2©pˇ1İ3V n…ô����jęŠ?OcŽ(DÔ팪 �€ ŞĆ!�TPőµ¶X”�ŚŁjóŚ€2rř��şůŚzŐ•fRáÄ��€Ô'[Z8 aqă�Ë +�@ÚĹ•îę±đkŤ!X\ńkŤ!����� uÄન[—˛‡Qk T$óś# Ť~â?„ ˘™T8ĐT8˘™ç����ćůŚqh‰]ÉéÂZcád~ťŤ*���T°j¬ŤA$#?�5Ůâ±~DEÔŃT8 �!˘ž˛&)ç'Ô!��Bx2Ď! >PÁ39Č<‡4ř@Ć ¤°ü©xjŤ���T9źm×kz&!„şŤY­ëxPU���������’‹��� u“ăx­��€ ŞĆÓ]Tá€����’‹ 1¸�H1¸’Ąëvř3±Ö,¦ «âQ×4« 1 ��Ś\ćq>µŇLmCF@L’yÎ�Ŕnťúm;«ڱ0P:ÚnŕÂŁ±Ŕk}Ś�������¤>u/|­ŹT�B¨•fRŮYÔÂ1‚şŇ2eşÖqH�€Ř˛×úH´đ‚şEpQ:B���©#!X†8p„��HÓHk,ÄYfn=óY2áÂc\k ����@ę”\�@ę§îŇ…#���H1Ƶ°íĆ��RG¸B�@ŤZ±ÖjłcýĄ?Č���� ŃĹc‡��@ę+ uÄÁ€Ô/)b­‘X ˇńЍ���Hńaˤ#"ČóśrĐO�¶Ęg�Lň3ůăŠ)«ŚC:P:tŤ!���„°b­1�±b­1 ŚXk �������T°ę8Ö� ‚UǵĆP#ÖC��„0â¶;pá€��� ăŕ‚���PÁŞăXC���Éę8Ö­»B: �!ڍk<°ngc-ćP ��€dŚ���T°ę8Ö�T°4;B: �RtńXÇŁ4b­1Ë$�xŤÖC���@+ÖŁ1ÔÂB#ÖC��ÚěXáŹ(�°LĄ@ĹPG\ú_đ€ŠˇněĐ…` eá€�����ÉW@k]ëq\#b­1������HĆx˛k:C”Ž� ‚UÇ“`ŚĹ2F¸B° qŕ–A+"@Ý !†ŽŞ�ž1Í®+UŚĆP )ÍÖ…1B!ŚXk+"T€ÍB˙¬§™Ö[aÄZÇ����PÁŠŰîŔ…Bv+„ŰîŔ…B±Ö4ÓÖ!6wčÂ…kC������ ăŕ"�����’1.˘‚UÇ:†�ŔăŔ�¬:Ö1 ŚX·ł±něĐ…������¬:Žk�PÁ…C]Çh µp@�µŽ!�aÄşťŤµp@€1S-ŚŁ®c€1ÔÂ�Śq`š•X1c ��PÁĹ/]Ç�ŔĆÂC±Ö4S-����\zč:’C•޵Ć-řZ?Â�ĆPËÎb-������Hăŕ"€,ÍŘ,đŔ4·wńń«ť†Ą„ ���X†Zö,®möX_i�¤´p„�Ë …#1ÖCUͤ+>ƵŽ®ř×í L"®°j0 µpC•kC@#Ö:†��0†Z8 X†ZxHq\×ÇG˝`�„Š1Ö:BÂuÜş �§î ��ŔâŔEÍÖËf_ń1Ök ¨!�!›ŤŻ×ń±Š¨ę�aY]ˇ40Ó#Ô®Ht�ÂU1kC�@ ��¬:Ö1����@2ĆÁE�$c\µęXÇ1ÔÂ����� ˘VŤŹëŔZDZlŻŻń dłx}ĄI����A±*FÄĄř…����€\8ô(×��€ Öx­Çqµ! ��c¨…�ŐQǡë‡J@µŮ¸í0V{ĆÖÂ���ÄR1¬c2Ő˛gX ���¨±XUR ����Ô¨UÇq ��������RG|Ô׸Ö4S-e¨…BTŚXë,C-<¤kC���QC롂b�€P`©bŤ[WŤÓěz!Íb-h µpC-��ĆęÉŮÇ늀0„íVHd µbÄŔŇŁ®c����� §ł´ÖBŚ€"†JЎF¬u ���Śqđ’,=tµŽcaD]Çě)9äJgp˝ĆCDa`ÂÍ=ęC���0†Z1"˘®ăµŽ!DcC_·źŃ­ćĚ@ĘT G@#Ö:Ž…kC0fÝ*ĐČÖÂ1¬öL_.µâ¨5B��� „1^ëă¸j„( jáĆP ÇX±*FÄZÇ���€Íâőu|H�€06˘®ăCKŹz›E ������Śqđ’F¬u ÁX¬5ë:Fc¨…PD¨¤��HĆxĘ]8baÄZÇ€F¬1F]C�ŠFú@W{žc�����T°ę8ŽÉ���ŚńÔ˝Ö5>Öu �€F¬ő07ôk}ĘĚJ=ăě˘GÚĘ”–2†H ű‚����@#®u$‡Z1†ĆŞŇ�„"B…m6ÖŠHwë` µp@@#®u …0b]Çë¬Ă hYŃŞ������¨`ŐŁFD\ë…Aw+J‡9ÔÂ�B±®ăŻő1®J™XÁ�������@«ă@<ę>ĐjĹ@ĵŽäP ��Ś1h™67ęk|H�` µđŔ6;®˙‚2ÔJ+p€����cfڧŘQ/QGýÂ���@őĆë6Ě����P­-%Ą×:†€ƸÖ1�€eŞJÚáz{vÚ˝ h@aÄŰîŔ ��� ÄŠkŁ0âş=‹µ0ejWö° ������@«5FĵrĐ+>Ćk Ŕ¶+Żëń0 ´,‚hŐ ��� „·Ý1¤qÔ/|€��aĵŽe*zlw^x@��4Žú…„ ¤´[QúF\ë1čăŐ�����@dŚ#]Ů륏°Ą»Z‚ CYx@�‚0Ƶ¦pu]Ź´”(+8@����aŚk!C-< öĂXz�Đ8ę> �ĆP&€1”)~­?R€ HłëńÂGXĘ��!¤ŮőÂ����Śqđ‚���$cĽ����’Ąě1¨EŚxđzÔëŇ×!*+ŐŔJ3ŐÂ)S-< ��` µđ€@ ��� ˘V=Ž+9Ô€dÄC?ë X,¬5>Vµ$6čK˘b´]†I����,†Ň0A���PRiăşÍ…µôHXÚ�� *ƸÖ1����Hă#vW”�Ëb­ăÔ­ăëúÁ<ŞbŹîË, â8°¸ĚÄV §_öx\K d´j„����–ĹZăc˝FX˝Öă�–ˇ���PŁÖ¸Ö1Zfî*Ä€˘Fę€F\kšé*ü¨%5†��@TڏÖ1���±Žú…@1âZÇڎć W|Ś×mŚJÁ€e¨…�€e¨…���jÔŞÇ:†� ÔÎŽëÁ*@FZIA���°¬T‰ÝX-Ä0VUĂv/< C-<Ś•jÄu<p­#��Ŕjá+F\ëHUz \ëB(F\ëŚaŰáxé»»†Óä%ĂP® *Ł××0‰��(†Ň0AA1âZhĵ¦aŰa,=@ĹkÇ‚WŤ�BHłő ŹG]#Da°uÖ���BXqŐo»#ľâG\u(Ťi_×�!ڏÖ1C-< �����&šÄ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/empty.wav������������������������������������������������������������������0000664�0000000�0000000�00000034630�14447736377�0017023�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFF9��WAVEfmt �����č�� ����datal9����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/empty_alac.m4a�������������������������������������������������������������0000664�0000000�0000000�00000012404�14447736377�0017662�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ftypM4A ����M4A mp42isom������ moov���lmvhd����ĘÇĘČ��¬D�~@��������������������������������������������@��������������������������������jtrak���\tkhd���ĘÇĘČ��������~@���������������������������������������������@�������������mdia��� mdhd����ĘÇĘČ��¬D�~@UÄ�����"hdlr��������soun����������������Ľminf���smhd�����������$dinf���dref���������� url �����€stbl���Xstsd����������Halac���������������������¬D�����$alac��������( �˙���$�� Ě��¬D��� stts����������'��������@���stsc�������������������´stsz�����������(��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ���$���0stco������������ ��@��ŕ��€�� ��Ŕ��`�� ;udta�� 3meta�������"hdlr��������mdirappl���������ń��§ilst���"©nam���data�������empty_alac���cpil���data�����������pgap���data�����������tmpo���data������������(©too��� data�������iTunes 10.2.2.14���g----���mean����com.apple.iTunes���name����Encoding Params���(data��������vers���acbf���vbrq�������˘----���mean����com.apple.iTunes���name����iTunNORM���jdata������� 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000��^free��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������żfree����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� mdat ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ��� řÁ˙€�� řÁ˙€��˙‡˙żá˙ü ���€� řÁ˙€�� řÁ˙€��˙‡żáÇü������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/empty_flac.oga�������������������������������������������������������������0000664�0000000�0000000�00000021631�14447736377�0017756�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������{Ç^d����yě3FLAC��fLaC���"������ ÄBđ�~@ćKŚÔJÂŁ©şSüy±~ŃOggS����������{Ç^d���%Ĺs©,��( ���reference libFLAC 1.2.1 20070917����OggS����������{Ç^d���đB t�������������������OggS��˙˙˙˙˙˙˙˙{Ç^d���ŻpµŔ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������{Ç^d���"b$˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙$���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS�@~�����{Ç^d���n5Ł(˙řÉ�Â������¸î˙řÉĹ������/›˙řÉĚ������˙řÉË������t˙řÉŢ������e5˙řÉŮ������ň@˙řÉĐ������ËÚ˙řÉ×������\Ż˙řÉú������]˙řÉ ý������(˙řÉ ô������-˛˙řÉ ó������şÇ˙řÉ ć������^†˙řÉ á������Éó˙řÉč������đi˙řÉď������g˙řɲ������Ď˙řɵ������Xý˙řÉĽ������ag˙řÉ»������ö˙řÉ®������S˙řÉ©������…&˙řÉ ������ĽĽ˙řɧ������+É˙řÉŠ������ô;˙řÉŤ������cN˙řÉ„������ZÔ˙řÉ������͡˙řÉ–������)ŕ˙řÉ‘������ľ•˙řÉ������‡˙řÉź������z˙řÉ "������V"˙řÉ!%������ÁW˙řÉ",������řÍ˙řÉ#+������o¸˙řÉ$>������‹ů˙řÉ%9������Ś˙řÉ&0������%˙řy'?8������Îŕ�������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/empty_vorbis.oga�����������������������������������������������������������0000664�0000000�0000000�00000010350�14447736377�0020351�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������¶Űż;����Zëfvorbis����D¬������€µ�����¸OggS����������¶Űż;���îăr„-˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙vorbis���Xiph.Org libVorbis I 20050304����vorbis%BCV�@��$s*FĄs„BPăBÎkěBL‚2L[Ë%s!¤ B[(ĐU��@��‡Ax„ŠA!„%=X’'=!„9x„iA!„B!„B!„E9h’'A„ă08 ĺ8ř„E9X'Ač „B¸š¬9!„$5HP9č„Â,(Š‚Ä0¸„5(Ś‚ä0ČÔ BšI5ř„gAx„iA!„$AHAČ„FAX’9¸„ËA¨„*9„ 4d��� ˘(Š˘( ˛ �Č��@QÇqÉ‘ɱ  Y����� HФHŽäH’$Y’%Y’%Y’扪,˲,˲,Ë2˛ �H��PQ Eq Y�d�� 8ŠĄXŠĄhŠçŽ„†¬�€����4CS<G”DĎTU×¶m۶m۶m۶m۶m[–e Y�@��Ňif©0BCV���€Š0Ä€ĐU��@��€J˘ ­9ßśă YšJ±9śHµy’›Šą9çśsÎÉćś1Î9眢śY š ­9çśÄ Y š ­9çś'±yĐš*­9çśqÎé`śĆ9çś&­yšŤµ9çś­iŽšK±9çśHąyR›Kµ9çśsÎ9çśsÎ9çśęĹéśÎ9眨˝ą–›ĐĹ9çśOĆéŢśÎ9çśsÎ9çśsÎ9çś 4d���@†ŤaÜ)Ňçh Fb2éA÷č0 śBęŃčh¤”:%•qRJ' Y���@!…RH!…RH!…b!†rĘ)§ ‚J*©¨˘Ś2Ë,łĚ2Ë,łĚ:쬳; 1ÄC+­ÄRSm5ÖXkî9çš´VZk­µRJ)Ą”R BCV� ��BdQH!…b)§śr *¨€ĐU�� �€����OňŃŃŃŃŃńĎ%Q%Q-Ó25ÓSEUue×–uY·}[Ř…]÷}Ý÷}ÝřuaX–eY–eY–eY–eY–eY– 4d���� „BH!…RH)ĆsĚ9č$” Y������pGqÉ‘I˛$KŇ$ÍŇ,Oó4O=QEÓ4UŃ]Q7mQ6eÓ5]S6]UVmW–m[¶uŰ—eŰ÷}ß÷}ß÷}ß÷}ß÷}]BCV���:’#)’")’ă8Ž$I@hČ*�@�@��Šâ(Žă8’$I’%i’gy–¨™šé™ž*Ş@hČ*���@������ЦxŠ©xЍxŽč’h™–¨©š+ʦ캮뺮뺮뺮뺮뺮뺮뺮뺮뺮뺮뺮 „†¬�$��t$Gr$GR$ER$Gr€ĐU�€ �€��Ă1$Er,ËŇ4Oó4O=Ń=ÓSEWtĐU�� �€������ ɰËŃM%ŐR-US-ŐREŐSUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMÓ4M Y ��S--Ćš ‹$bŇj« c R쥱H*gµ·Ę1…µ^‡”Q{©$cŠAĚ-¤Đ)&­ÖTB…¤c*RR 4d…�šŕp@˛,@˛,�������4 Đ<°4�������$M,O4Ď�������������������������������������������������������������������@Ň4@ó<@ó<�������Đ<đ<đD�������,Ď4Ń<Q�������������������������������������������������������������������@Ň4@ó<@ó<�������°<đDĐ<�������,Ď<Q<Ń����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ŕ��`!˛"��pH$ ’ÍH–M¦Á4’eAÓ i0M����������$M¦AÓ Š�IÓ iĐ4"����������’¦AÓ iE€¤iĐ4hD����������Ď4!ŠE&Ŕ3M"D¦ ������������������������p��0ˇ ˛"��p8Še�€ă8–��ŽăX��X–%Š��`Yš(������������������������������������������������������������������p��0ˇ ˛��p(ŠeDZ,ŕ8–$ɲ�–Đ<€¦D���(p��°ASbq€BCV�Q��ű,ME’¤iš'Š$IÓ<OišçyžiÂó<Ď4!Š˘hšEQ4M¦iŞ*0MU��Pŕ��`¦Äâ�…†¬�B�ŠbYšćyž'Ц©š$IÓ<OEŃ4MSUI’¦yž(Š˘iš¦Ş˛,Mó<QEÓTUU…¦yž(Š˘iŞŞęÂó<OEŃ4UŐuáyž'Š˘hšŞęşEQ4MÓTMUu] ЦišŞŞŞ® DOMSU]×u牢iŞŞ«ş.MÓTUUu]Y¦iŞŞëĘ2@UUŐu]W–ŞŞŞ®ëş˛ PU×u]Y–e�®ëş˛,Ë����Ś “Ś*‹°Ń„ @ˇ!+€(��Ŕ¦SĘ0&!¤Ć$„B&%ĄŇRŞ ¤RR)„TJ*%Ł”Rj)UR)©” B*%•R��Ř�Ř…PhČJ� �€0F)ĆsN"¤cÎ9'RŠ1çś“J1ćśsÎI)sĚ9礔Î9çśsRJćśsÎ9)ĄsÎ9çś”RJçśsNJ)%„ÎA'Ą”Ň9çś��Tŕ��`ŁČć#A…†¬�R� ŽcYšćy˘hš–$išçyž(š¦&Išćyž'ŠŞÉó<OEŃ4U•çyž(Š˘iŞ*×EÓ4MUU]˛,ЦišŞęş0MÓTU×u]¦iŞŞëş.l[UUŐue¶­ŞŞęş˛ \×ueŮ–,»®ěÚ˛��đ� VG8) ,4d%��@B!eB !„”R ��p��0ˇ ˛�H��ڱÖZk­µÖ@g­µÖZk­€ĚZk­µÖZk­µÖZk­µÖRk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk-Ą”RJ)Ą”RJ)Ą”RJ)Ą”RJ�úU8�ř?ذ:ÂIŃX`ˇ!+€p��ŔĄs B)ĄT1ćśtTZ‹±B1ç$¤ÔZlĹsÎA(!•Öb,žsB))ĹVcQ)„RRJ-¶X‹JˇŁ’RJ­ŐXŚ1©¤ÖZ‹­ĆbŚI)´ÔZ‹1#lM©µŘj«±ck*-´cŚĹ_dl-¦Új Ć#[,-ŐZk0ĆÝ[‹Ą¶š‹1>řÚR,1Ö\��w�D‚Ť3¬$ťŽ˛� � RŠ1ĆsÎ9ç¤RŚ9ćśsBˇTŠ1ĆśsB!”Ś1ćśsB!„RJĆśsB!„RęśsB!„J)ťsB!„B)ĄB!„J(Ą¤B!„B©¤”B!„RB(!•”R!„B)%¤”R !„RBˇ„”RJ)…BĄ”’RJ)ĄJ %„R))ĄJ!”RJJ)ĄTJ ˇ„J)%Ą”RJ!„J)��8��A'UaŁ €BCV�d��˘”R)-E‚"Ą¤KFsPZЍr RÍ©RÎ ć$–1„”“T2ćB BęuL)-•BƤŘrKˇs���A�€€��3�Ŕŕ�ástG�€ DfDĂBpxP S@b‚B.�TX\¤]\@—.čâ®!!A, €śpĂox NĐ)*u ����� �đ��\�ŃĚadhlptx|€„Ś������|��$%@DD4s !"#$�€����� €���������OggS�Ŕz�����¶Űż;���fŻ}[ˇ� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/excessive_alloc.aif��������������������������������������������������������0000664�0000000�0000000�00000004172�14447736377�0020775�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������FORM�+÷ÂAI€Fid3 ���ń�X÷��H ľD˙ů����ID3 ���ORMCČHAIFFBOMM������€ň�FOR>cXůČ.iCOMTTMM���2�X�7 ¬#��€˙˙˙Xí�FiRMc˙���ID3 ���ORMcČHAI FCOMM���ňĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘĘ�ö˙�������APPL��� stocG726��ś@aUTH���Prosonus(c) ���C ú�������G726 CCITT G.726MARKid3 ����Ý˙ beg o ����d�end ň id3 �INST���<������������APPL��� stocG726��ś@Aoop������ ezd s loAME��� €odblock�SSND��Á�����˙˙˙���đ˝+ő¦�W¤f„rýjÔśŇ}{ Ęw+CµQťú5.>IŰÍţÍ's lTpyright 1991, ProsonusNAME��d oodblock�SSND���Á�����˙˙˙> ßđ˝+ő¦��W¤f„rýjԜҶ}{ Ęw+CµQťú5.>IŰÍţÍ's loop������˛ezd s looCOMMč��� beg r loop��W¤f@rýjԜҶ}{ Ęw+CµQťú5.>IŰÍţÍ's lo����� begCOmMoop������ end r .Aht�G7�G726 CCITT Š.726COMM���€�����Ý˙ beg s loŐp������ Dnd s lo€p������ beg 26 CCITT G726MARK���J����Ý˙ b%g s˙oŐp������ Dnd�s loop������ beg r loop������ end r loop�INST���<�Ţ~����������APPL��� stocG726��ś@AUTH���Prosoú�������<726 CCITT G.726MARK���J����Ý˙ beg s loŐp������ Dnd s loop������ beg † loopŮ����d�end r loop�INST���<�����������3 k�SSND���.ÁI€Fid3 �����€Q`CTTTTTTOMM���"���&�@ ú������) ���C0pyright�G726 CCITT G.726MARK��›J����Ý˙ beg s˙oŐp������ Dnd s lgop������ beg rCloop������ end r loop�INsT��<��������INST���<������������APPL��� stocG726��ś�����űAPPL� oodID3 k�SSND���Á�����˙˙˙> ßđ˝+ő¦�W¤f„rýjÔţÍ's lopyrdght 1991, ProńonusNAME��� oodblock�SSN1���Á�����˙˙˙> ßđ˝/+ő¦�.ÁI€Fid3 �����€Q`CTTTTTXOMM���"���&�@ ������) ���Cjpyrigh Ęw+CµQťú5.>IŰt�G726 CCITT G.726MARK���J�� ��Ý˙ beg s˙oŐp������ Dnd s loop������ beg r loop������ end r loop�INST���<����ű������APPL��� stocG726��ś@AUTH���Prosonus(c) ���C ú������G726 CCIT] G.726MARK���ight 1˙ beeID3˙oŐp������ Dnd s loop������ beg r loop��}{ Ęw+CÄQťč.>IŰÍţÍ's lTpyright 1991˙˙ProsonusNAME��� oodblock�SSNC˙˙ćÁ�����˙˙˙> ßđ˝+ő¦��W¤f„rýjԜҶ}{ Ęw+CµQťú5.>IŰÍţÍ's lÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁight 1991, ProsonusN� oodblock�SSN1ÁÁÁÁÁÁÁÁÁÍţÍ's loop������ ‘zd s looCOMM���� beg r loop�������÷Ńdä r ü|ňËţ|‡ď‡÷op������ ezd s looCOMM���� beg r loop�������÷Ńdä r ü|ňËţ|‡ď‡÷�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/excessive_alloc.mp3��������������������������������������������������������0000664�0000000�0000000�00000001635�14447736377�0020736�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3���� `TIT2�����BushTPE1�����RihannaTALB�����Musicśof the SunTRCK�����10/13TCON������ReggaeCOMM������eng�www.torrentazos.comTDRC��� ��2005-09-05TSOP�����RihannaTCMP�����0TXXX�����MusicIP PUID�TXXX���;«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««�:��MusicBrainz Album Id�f42cd50e-feb3-439-8e4e-8bb78bd00919TXXn�����M�����������������usicBrainz Album Type�albumTXXX���"��MusicBrainz Album Status�officialTXXX�X���*��MusicBrainz Album Artist Sortname�RihannaUFID���;��http(OMM������eng�www.torrentazos.comTDRC��� ��2005-09-05TSOP�����RihannaTCMP�����0TXXX�����MusicIP PUIDXX�����Musi���inz Non-Album�0�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/extended-header.mp3��������������������������������������������������������0000664�0000000�0000000�00000000237�14447736377�0020611�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3�@�����  :;TDOR������2013TDRC������2013TCON������Folk/Power MetalTIT2������DruidsTPE1��� ���ExcelsisTALB������Vo Chrieger U DracheTRCK������03�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/float64.wav����������������������������������������������������������������0000664�0000000�0000000�00000205750�14447736377�0017147�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFFŕ �WAVEfmt �����D¬��@Ä ��@�fact���ą��PEAK������2!dU�5?Ş���5?Ş��data ����������������������°¦?�����°¦?�����˘¶?�����˘¶?�����ěŔ?�����ěŔ?�����uĆ?�����uĆ?�����čË?�����čË?����€źĐ?����€źĐ?����€:Ó?����€:Ó?����€ÁŐ?����€ÁŐ?�����3Ř?�����3Ř?����€ŚÚ?����€ŚÚ?����€ĘÜ?����€ĘÜ?�����ěŢ?�����ěŢ?����@wŕ?����@wŕ?�����há?�����há?�����Gâ?�����Gâ?����Ŕă?����Ŕă?����@Íă?����@Íă?�����sä?�����sä?�����ĺ?�����ĺ?�����€ĺ?�����€ĺ?����@ćĺ?����@ćĺ?����€6ć?����€6ć?����€pć?����€pć?�����”ć?�����”ć?����€ ć?����€ ć?����€–ć?����€–ć?����Ŕuć?����Ŕuć?����@>ć?����@>ć?����€đĺ?����€đĺ?����ŔŚĺ?����ŔŚĺ?����@ĺ?����@ĺ?����€„ä?����€„ä?����@áă?����@áă?����Ŕ)ă?����Ŕ)ă?����@_â?����@_â?����@‚á?����@‚á?����€“ŕ?����€“ŕ?����€(ß?����€(ß?����� Ý?����� Ý?�����ĎÚ?�����ĎÚ?����€xŘ?����€xŘ?����� Ö?����� Ö?�����…Ó?�����…Ó?����€ěĐ?����€ěĐ?�����…Ě?�����…Ě?�����Ç?�����Ç?�����ŽÁ?�����ŽÁ?�����ę·?�����ę·?�����@©?�����@©?����� t?����� t?�����¤ż�����¤ż�����\µż�����\µż�����JŔż�����JŔż�����ŐĹż�����ŐĹż�����KËż�����KËż����€RĐż����€RĐż����€ďŇż����€ďŇż�����yŐż�����yŐż����€í׿����€í׿����€IÚż����€IÚż�����‹Üż�����‹Üż�����°Ţż�����°Ţż�����[ŕż�����[ŕż����€Máż����€Máż����€.âż����€.âż����€ýâż����€ýâż����@ąăż����@ąăż����@aäż����@aäż����Ŕôäż����Ŕôäż�����sĺż�����sĺż����ŔŰĺż����ŔŰĺż����€.ćż����€.ćż�����kćż�����kćż�����‘ćż�����‘ćż����@ ćż����@ ćż����Ŕćż����Ŕćż����€zćż����€zćż����ŔEćż����ŔEćż����€úĺż����€úĺż����@™ĺż����@™ĺż�����"ĺż�����"ĺż����Ŕ•äż����Ŕ•äż����Ŕôăż����Ŕôăż����Ŕ?ăż����Ŕ?ăż����@wâż����@wâż����@śáż����@śáż����€Żŕż����€Żŕż�����dßż�����dßż����€IÝż����€IÝż����€Űż����€Űż�����ľŘż�����ľŘż�����RÖż�����RÖż�����ĎÓż�����ĎÓż����€8Ńż����€8Ńż�����"Íż�����"Íż�����µÇż�����µÇż�����0Âż�����0Âż�����2ąż�����2ąż�����Ô«ż�����Ô«ż����� „ż����� „ż�����ˇ?�����ˇ?�����´?�����´?�����Nż?�����Nż?�����5Ĺ?�����5Ĺ?�����®Ę?�����®Ę?����€Đ?����€Đ?����€¤Ň?����€¤Ň?����€0Ő?����€0Ő?�����§×?�����§×?�����Ú?�����Ú?����€JÜ?����€JÜ?�����sŢ?�����sŢ?����@>ŕ?����@>ŕ?����Ŕ2á?����Ŕ2á?�����â?�����â?�����çâ?�����çâ?�����Ąă?�����Ąă?����@Oä?����@Oä?�����ĺä?�����ĺä?����Ŕeĺ?����Ŕeĺ?�����Ńĺ?�����Ńĺ?����@&ć?����@&ć?����@eć?����@eć?�����Žć?�����Žć?����Ŕźć?����Ŕźć?����Ŕšć?����Ŕšć?����@ć?����@ć?�����Mć?�����Mć?����@ć?����@ć?����@Ąĺ?����@Ąĺ?����Ŕ0ĺ?����Ŕ0ĺ?����Ŕ¦ä?����Ŕ¦ä?�����ä?�����ä?����@Uă?����@Uă?�����Źâ?�����Źâ?�����¶á?�����¶á?����@Ëŕ?����@Ëŕ?�����źß?�����źß?�����Ý?�����Ý?�����SŰ?�����SŰ?�����Ů?�����Ů?����€™Ö?����€™Ö?����€Ô?����€Ô?�����…Ń?�����…Ń?�����ľÍ?�����ľÍ?�����TČ?�����TČ?�����ŃÂ?�����ŃÂ?�����xş?�����xş?�����d®?�����d®?�����đŽ?�����đŽ?�����čťż�����čťż�����̲ż�����̲ż����� ľż����� ľż�����•Äż�����•Äż�����Ęż�����Ęż�����qĎż�����qĎż�����YŇż�����YŇż����€çÔż����€çÔż����€`׿����€`׿�����ÂŮż�����ÂŮż����� Üż����� Üż����€5Ţż����€5Ţż����€!ŕż����€!ŕż����Ŕáż����Ŕáż�����ýáż�����ýáż�����Đâż�����Đâż����@ăż����@ăż����Ŕ<äż����Ŕ<äż�����Őäż�����Őäż����@Xĺż����@Xĺż�����Ćĺż�����Ćĺż����Ŕćż����Ŕćż����@_ćż����@_ćż����€Šćż����€Šćż����Ŕžćż����Ŕžćż����€śćż����€śćż����€ćż����€ćż����ŔSćż����ŔSćż����€ ćż����€ ćż����@±ĺż����@±ĺż�����?ĺż�����?ĺż����€·äż����€·äż����@äż����@äż����€jăż����€jăż����€¦âż����€¦âż����€Ďáż����€Ďáż����Ŕćŕż����Ŕćŕż�����Úßż�����Úßż����€ĆÝż����€ĆÝż�����•Űż�����•Űż����€GŮż����€GŮż�����áÖż�����áÖż�����cÔż�����cÔż�����ŃŃż�����ŃŃż�����YÎż�����YÎż�����óČż�����óČż�����sĂż�����sĂż�����ľ»ż�����ľ»ż�����|°ż�����|°ż����� ”ż����� ”ż�����Ŕ?�����Ŕ?�����‚±?�����‚±?�����ÄĽ?�����ÄĽ?�����ôĂ?�����ôĂ?�����rÉ?�����rÉ?�����ÖÎ?�����ÖÎ?����€ Ň?����€ Ň?�����žÔ?�����žÔ?����€×?����€×?�����~Ů?�����~Ů?�����ÉŰ?�����ÉŰ?�����řÝ?�����řÝ?����€ŕ?����€ŕ?����Ŕüŕ?����Ŕüŕ?����Ŕăá?����Ŕăá?�����ąâ?�����ąâ?����€{ă?����€{ă?����@*ä?����@*ä?����ŔÄä?����ŔÄä?����@Jĺ?����@Jĺ?����€şĺ?����€şĺ?����Ŕć?����Ŕć?�����Yć?�����Yć?����Ŕ†ć?����Ŕ†ć?����Ŕťć?����Ŕťć?�����žć?�����žć?����€‡ć?����€‡ć?����@Zć?����@Zć?����Ŕć?����Ŕć?����ŔĽĺ?����ŔĽĺ?�����Mĺ?�����Mĺ?�����Čä?�����Čä?�����.ä?�����.ä?����Ŕă?����Ŕă?����Ŕ˝â?����Ŕ˝â?�����éá?�����éá?�����á?�����á?����@ ŕ?����@ ŕ?����€Ţ?����€Ţ?�����ÖŰ?�����ÖŰ?�����ŚŮ?�����ŚŮ?�����(×?�����(×?����€¬Ô?����€¬Ô?����€Ň?����€Ň?�����őÎ?�����őÎ?�����‘É?�����‘É?�����Ä?�����Ä?�����˝?�����˝?�����ı?�����ı?�����Č™?�����Č™?�����“ż�����“ż�����:°ż�����:°ż�����~»ż�����~»ż�����SĂż�����SĂż�����ÓČż�����ÓČż�����:Îż�����:Îż����€ÁŃż����€ÁŃż����€TÔż����€TÔż����€ŇÖż����€ŇÖż�����:Ůż�����:Ůż�����Űż�����Űż�����şÝż�����şÝż����€Îßż����€Îßż����@áŕż����@áŕż����€Ęáż����€Ęáż����Ŕˇâż����Ŕˇâż����@făż����@făż����@äż����@äż����@´äż����@´äż����@<ĺż����@<ĺż����Ŕ®ĺż����Ŕ®ĺż����Ŕ ćż����Ŕ ćż����€Rćż����€Rćż����€‚ćż����€‚ćż����@śćż����@śćż�����źćż�����źćż����@‹ćż����@‹ćż����€`ćż����€`ćż����€ćż����€ćż����@Čĺż����@Čĺż�����[ĺż�����[ĺż����@Řäż����@Řäż����€@äż����€@äż����€”ăż����€”ăż����ŔÔâż����ŔÔâż�����âż�����âż����@áż����@áż����@'ŕż����@'ŕż�����BŢż�����BŢż�����Üż�����Üż�����ĐŮż�����ĐŮż����€n׿����€n׿�����öÔż�����öÔż�����hŇż�����hŇż�����Ďż�����Ďż�����/Ęż�����/Ęż�����µÄż�����µÄż�����Jľż�����Jľż����� łż����� łż�����đžż�����đžż�����ŕŚ?�����ŕŚ?�����ä­?�����ä­?�����6ş?�����6ş?�����±Â?�����±Â?�����4Č?�����4Č?�����źÍ?�����źÍ?����€uŃ?����€uŃ?����€ Ô?����€ Ô?�����‹Ö?�����‹Ö?�����őŘ?�����őŘ?�����FŰ?�����FŰ?����€{Ý?����€{Ý?����€“ß?����€“ß?����ŔĹŕ?����ŔĹŕ?����Ŕ°á?����Ŕ°á?����@Šâ?����@Šâ?�����Qă?�����Qă?����@ä?����@ä?����€Łä?����€Łä?����Ŕ-ĺ?����Ŕ-ĺ?�����Łĺ?�����Łĺ?����@ć?����@ć?����€Kć?����€Kć?����@~ć?����@~ć?����€šć?����€šć?����Ŕźć?����Ŕźć?����€Žć?����€Žć?����€fć?����€fć?�����(ć?�����(ć?����@Óĺ?����@Óĺ?����€hĺ?����€hĺ?�����čä?�����čä?����ŔRä?����ŔRä?�����©ă?�����©ă?����€ëâ?����€ëâ?�����â?�����â?�����8á?�����8á?�����Dŕ?�����Dŕ?�����Ţ?�����Ţ?����€WÜ?����€WÜ?����€Ú?����€Ú?�����µ×?�����µ×?�����?Ő?�����?Ő?����€łŇ?����€łŇ?�����Đ?�����Đ?�����ÍĘ?�����ÍĘ?�����UĹ?�����UĹ?�����ż?�����ż?�����T´?�����T´?����� ˘?����� ˘?�����‚ż�����‚ż�����P«ż�����P«ż�����đ¸ż�����đ¸ż�����Âż�����Âż�����•Çż�����•Çż�����Íż�����Íż����€)Ńż����€)Ńż����€ŔÓż����€ŔÓż����€CÖż����€CÖż�����°Řż�����°Řż�����Űż�����Űż����€<Ýż����€<Ýż�����Xßż�����Xßż�����Şŕż�����Şŕż�����—áż�����—áż����€râż����€râż����@;ăż����@;ăż�����ńăż�����ńăż����@’äż����@’äż����@ĺż����@ĺż����Ŕ–ĺż����Ŕ–ĺż����€řĺż����€řĺż����@Dćż����@Dćż����Ŕyćż����Ŕyćż����€ćż����€ćż����€ ćż����€ ćż����Ŕ‘ćż����Ŕ‘ćż����@lćż����@lćż����@0ćż����@0ćż�����Ţĺż�����Ţĺż����Ŕuĺż����Ŕuĺż����Ŕ÷äż����Ŕ÷äż����Ŕdäż����Ŕdäż����@˝ăż����@˝ăż�����ăż�����ăż����€3âż����€3âż����ŔRáż����ŔRáż����€`ŕż����€`ŕż�����ĽŢż�����ĽŢż����€—Üż����€—Üż����€VÚż����€VÚż����€ű׿����€ű׿����€‡Őż����€‡Őż����€ţŇż����€ţŇż�����bĐż�����bĐż�����kËż�����kËż�����őĹż�����őĹż�����jŔż�����jŔż�����śµż�����śµż����� ¤ż����� ¤ż�����€p?�����€p?�����Ľ¨?�����Ľ¨?�����¨·?�����¨·?�����nÁ?�����nÁ?�����őĆ?�����őĆ?�����fĚ?�����fĚ?�����ÝĐ?�����ÝĐ?�����vÓ?�����vÓ?����€űŐ?����€űŐ?�����kŘ?�����kŘ?����€ÁÚ?����€ÁÚ?����€ýÜ?����€ýÜ?����€ß?����€ß?�����Žŕ?�����Žŕ?�����}á?�����}á?����€Zâ?����€Zâ?����€%ă?����€%ă?����@Ýă?����@Ýă?�����ä?�����ä?����@ĺ?����@ĺ?����@Šĺ?����@Šĺ?����€îĺ?����€îĺ?����Ŕ<ć?����Ŕ<ć?����Ŕtć?����Ŕtć?�����–ć?�����–ć?����Ŕ ć?����Ŕ ć?����€”ć?����€”ć?����€qć?����€qć?����@8ć?����@8ć?����€čĺ?����€čĺ?����€‚ĺ?����€‚ĺ?�����ĺ?�����ĺ?����€vä?����€vä?����@Ńă?����@Ńă?����@ă?����@ă?�����Lâ?�����Lâ?����@má?����@má?�����}ŕ?�����}ŕ?����€řŢ?����€řŢ?����€×Ü?����€×Ü?����€™Ú?����€™Ú?�����AŘ?�����AŘ?�����ĐŐ?�����ĐŐ?����€IÓ?����€IÓ?�����ŻĐ?�����ŻĐ?�����Ě?�����Ě?�����•Ć?�����•Ć?����� Á?����� Á?�����ä¶?�����ä¶?�����4§?�����4§?�����€P?�����€P?�����,¦ż�����,¦ż�����b¶ż�����b¶ż�����ĚŔż�����ĚŔż�����VĆż�����VĆż�����ÉËż�����ÉËż����€Đż����€Đż����€+Óż����€+Óż�����łŐż�����łŐż�����%Řż�����%Řż�����Úż�����Úż�����ľÜż�����ľÜż�����ŕŢż�����ŕŢż����Ŕqŕż����Ŕqŕż����Ŕbáż����Ŕbáż����@Bâż����@Bâż����@ăż����@ăż����@Éăż����@Éăż����€oäż����€oäż�����ĺż�����ĺż����€}ĺż����€}ĺż����@äĺż����@äĺż�����5ćż�����5ćż����€oćż����€oćż����€“ćż����€“ćż����€ ćż����€ ćż�����—ćż�����—ćż����Ŕvćż����Ŕvćż����Ŕ?ćż����Ŕ?ćż����€ňĺż����€ňĺż����@Źĺż����@Źĺż����@ĺż����@ĺż�����äż�����äż����@ĺăż����@ĺăż����@.ăż����@.ăż�����dâż�����dâż����€‡áż����€‡áż�����™ŕż�����™ŕż�����4ßż�����4ßż�����Ýż�����Ýż����€ÜÚż����€ÜÚż����€†Řż����€†Řż����€Öż����€Öż�����”Óż�����”Óż����€űĐż����€űĐż�����ĄĚż�����ĄĚż�����5Çż�����5Çż�����®Áż�����®Áż�����,¸ż�����,¸ż�����Ä©ż�����Ä©ż�����Ŕxż�����Ŕxż�����Ł?�����Ł?�����µ?�����µ?�����)Ŕ?�����)Ŕ?�����µĹ?�����µĹ?�����,Ë?�����,Ë?����€CĐ?����€CĐ?����€ŕŇ?����€ŕŇ?����€jŐ?����€jŐ?�����ß×?�����ß×?�����<Ú?�����<Ú?�����~Ü?�����~Ü?����€ŁŢ?����€ŁŢ?����@Uŕ?����@Uŕ?����@Há?����@Há?����Ŕ)â?����Ŕ)â?�����ůâ?�����ůâ?����@µă?����@µă?����€]ä?����€]ä?����€ńä?����€ńä?����@pĺ?����@pĺ?����ŔŮĺ?����ŔŮĺ?�����-ć?�����-ć?�����jć?�����jć?����€ć?����€ć?����@ ć?����@ ć?����@™ć?����@™ć?����€{ć?����€{ć?����@Gć?����@Gć?����€üĺ?����€üĺ?����Ŕ›ĺ?����Ŕ›ĺ?�����%ĺ?�����%ĺ?����@™ä?����@™ä?����Ŕřă?����Ŕřă?�����Dă?�����Dă?�����|â?�����|â?����€ˇá?����€ˇá?�����µŕ?�����µŕ?�����pß?�����pß?�����VÝ?�����VÝ?����€Ű?����€Ű?�����ĚŘ?�����ĚŘ?�����`Ö?�����`Ö?�����ŢÓ?�����ŢÓ?�����HŃ?�����HŃ?�����AÍ?�����AÍ?�����ŐÇ?�����ŐÇ?�����PÂ?�����PÂ?�����rą?�����rą?�����X¬?�����X¬?�����°†?�����°†?�����ˇż�����ˇż�����Ňłż�����Ňłż�����żż�����żż�����Ĺż�����Ĺż�����ŽĘż�����ŽĘż�����ěĎż�����ěĎż����€•Ňż����€•Ňż�����"Őż�����"Őż�����™×ż�����™×ż����€řŮż����€řŮż�����>Üż�����>Üż����€fŢż����€fŢż����€8ŕż����€8ŕż����€-áż����€-áż�����âż�����âż����€ââż����€ââż����Ŕ ăż����Ŕ ăż����€Käż����€Käż����Ŕáäż����Ŕáäż�����cĺż�����cĺż����ŔÎĺż����ŔÎĺż����€$ćż����€$ćż����@dćż����@dćż����@Ťćż����@Ťćż����€źćż����€źćż����@›ćż����@›ćż�����€ćż�����€ćż����@Nćż����@Nćż�����ćż�����ćż����Ŕ§ĺż����Ŕ§ĺż����€3ĺż����€3ĺż����@Şäż����@Şäż����� äż����� äż����€Yăż����€Yăż����Ŕ“âż����Ŕ“âż����@»áż����@»áż����ŔĐŕż����ŔĐŕż�����«ßż�����«ßż����€”Ýż����€”Ýż����€`Űż����€`Űż����€Ůż����€Ůż�����¨Öż�����¨Öż�����(Ôż�����(Ôż�����”Ńż�����”Ńż�����ÝÍż�����ÝÍż�����tČż�����tČż�����ňÂż�����ňÂż�����şşż�����şşż�����访�����访�����€ż�����€ż�����ŕś?�����ŕś?�����О?�����О?�����Č˝?�����Č˝?�����tÄ?�����tÄ?�����đÉ?�����đÉ?�����RĎ?�����RĎ?�����JŇ?�����JŇ?����€ŘÔ?����€ŘÔ?����€R×?����€R×?����€´Ů?����€´Ů?�����ýŰ?�����ýŰ?����€)Ţ?����€)Ţ?����Ŕŕ?����Ŕŕ?����€á?����€á?�����řá?�����řá?����€Ëâ?����€Ëâ?����@Śă?����@Śă?�����9ä?�����9ä?����ŔŃä?����ŔŃä?����€Uĺ?����€Uĺ?����ŔĂĺ?����ŔĂĺ?�����ć?�����ć?�����^ć?�����^ć?����Ŕ‰ć?����Ŕ‰ć?����Ŕžć?����Ŕžć?����Ŕść?����Ŕść?����@„ć?����@„ć?�����Uć?�����Uć?����€ć?����€ć?����€łĺ?����€łĺ?�����Bĺ?�����Bĺ?����Ŕşä?����Ŕşä?�����ä?�����ä?����Ŕnă?����Ŕnă?�����«â?�����«â?����ŔÔá?����ŔÔá?����@ěŕ?����@ěŕ?����€ĺß?����€ĺß?�����ÓÝ?�����ÓÝ?�����˘Ű?�����˘Ű?�����UŮ?�����UŮ?�����ďÖ?�����ďÖ?�����rÔ?�����rÔ?�����ŕŃ?�����ŕŃ?�����yÎ?�����yÎ?�����É?�����É?�����“Ă?�����“Ă?������Ľ?������Ľ?�����ľ°?�����ľ°?�����¨•?�����¨•?�����¸—ż�����¸—ż�����@±ż�����@±ż�����‚Ľż�����‚Ľż�����ÓĂż�����ÓĂż�����RÉż�����RÉż�����·Îż�����·Îż����€ţŃż����€ţŃż����€ŹÔż����€ŹÔż����€ ׿����€ ׿����€pŮż����€pŮż�����ĽŰż�����ĽŰż����€ëÝż����€ëÝż�����ýßż�����ýßż����@÷ŕż����@÷ŕż����ŔŢáż����ŔŢáż����€´âż����€´âż����@wăż����@wăż����€&äż����€&äż����€Áäż����€Áäż����€Gĺż����€Gĺż����@¸ĺż����@¸ĺż�����ćż�����ćż����ŔWćż����ŔWćż����Ŕ…ćż����Ŕ…ćż����€ťćż����€ťćż����@žćż����@žćż����@ćż����@ćż����€[ćż����€[ćż����€ćż����€ćż�����żĺż�����żĺż�����Pĺż�����Pĺż����@Ëäż����@Ëäż����Ŕ1äż����Ŕ1äż����Ŕăż����Ŕăż����@Ââż����@Ââż�����îáż�����îáż����€áż����€áż�����ŕż�����ŕż����€Ţż����€Ţż�����ăŰż�����ăŰż����€™Ůż����€™Ůż�����6׿�����6׿����€»Ôż����€»Ôż�����,Ňż�����,Ňż�����Ďż�����Ďż�����±Éż�����±Éż�����4Äż�����4Äż�����F˝ż�����F˝ż�����˛ż�����˛ż�����Đšż�����Đšż�����’?�����’?�����đŻ?�����đŻ?�����<»?�����<»?�����2Ă?�����2Ă?�����łČ?�����łČ?�����Î?�����Î?����€˛Ń?����€˛Ń?����€EÔ?����€EÔ?����€ÄÖ?����€ÄÖ?�����,Ů?�����,Ů?����€zŰ?����€zŰ?����€­Ý?����€­Ý?����€Âß?����€Âß?����ŔŰŕ?����ŔŰŕ?����€Ĺá?����€Ĺá?�����ťâ?�����ťâ?�����bă?�����bă?����€ä?����€ä?����Ŕ°ä?����Ŕ°ä?����@9ĺ?����@9ĺ?����€¬ĺ?����€¬ĺ?����Ŕ ć?����Ŕ ć?�����Qć?�����Qć?����Ŕć?����Ŕć?����Ŕ›ć?����Ŕ›ć?����@źć?����@źć?����Ŕ‹ć?����Ŕ‹ć?����Ŕać?����Ŕać?����@!ć?����@!ć?����@Ęĺ?����@Ęĺ?����€]ĺ?����€]ĺ?����€Űä?����€Űä?����@Dä?����@Dä?����€ă?����€ă?����@Ůâ?����@Ůâ?�����â?�����â?����€"á?����€"á?�����-ŕ?�����-ŕ?�����NŢ?�����NŢ?�����$Ü?�����$Ü?����€ÝŮ?����€ÝŮ?�����}×?�����}×?����€Ő?����€Ő?�����wŇ?�����wŇ?�����ŻĎ?�����ŻĎ?�����OĘ?�����OĘ?�����ŐÄ?�����ŐÄ?�����Śľ?�����Śľ?�����Nł?�����Nł?�����řź?�����řź?�����ĐŠż�����ĐŠż�����`­ż�����`­ż�����öąż�����öąż�����‘Âż�����‘Âż�����Čż�����Čż�����Íż�����Íż����€fŃż����€fŃż����€űÓż����€űÓż�����}Öż�����}Öż����€çŘż����€çŘż�����9Űż�����9Űż�����oÝż�����oÝż����€‡ßż����€‡ßż����@Ŕŕż����@Ŕŕż����Ŕ«áż����Ŕ«áż����€…âż����€…âż����ŔLăż����ŔLăż����€�äż����€�äż����� äż����� äż�����+ĺż�����+ĺż����€ ĺż����€ ĺż����@�ćż����@�ćż�����Jćż�����Jćż����@}ćż����@}ćż�����šćż�����šćż����� ćż����� ćż����@Źćż����@Źćż����Ŕgćż����Ŕgćż����Ŕ)ćż����Ŕ)ćż����@Őĺż����@Őĺż�����kĺż�����kĺż����@ëäż����@ëäż����€Väż����€Väż�����­ăż�����­ăż�����đâż�����đâż����Ŕâż����Ŕâż����€=áż����€=áż����ŔIŕż����ŔIŕż����€‹Ţż����€‹Ţż����€dÜż����€dÜż�����!Úż�����!Úż�����Ă׿�����Ă׿����€MŐż����€MŐż����€ÂŇż����€ÂŇż����€$Đż����€$Đż�����íĘż�����íĘż�����uĹż�����uĹż�����Đżż�����Đżż�����–´ż�����–´ż�����˘ż�����˘ż�����€€?�����€€?�����ĚŞ?�����ĚŞ?�����®¸?�����®¸?�����ďÁ?�����ďÁ?�����uÇ?�����uÇ?�����ăĚ?�����ăĚ?�����Ń?�����Ń?����€±Ó?����€±Ó?�����5Ö?�����5Ö?����€˘Ř?����€˘Ř?�����÷Ú?�����÷Ú?�����0Ý?�����0Ý?�����Lß?�����Lß?����@¤ŕ?����@¤ŕ?����Ŕ‘á?����Ŕ‘á?����Ŕmâ?����Ŕmâ?�����7ă?�����7ă?�����íă?�����íă?�����Źä?�����Źä?����@ĺ?����@ĺ?����@”ĺ?����@”ĺ?����€öĺ?����€öĺ?����ŔBć?����ŔBć?����Ŕxć?����Ŕxć?�����ć?�����ć?����€ ć?����€ ć?����@’ć?����@’ć?����@mć?����@mć?����Ŕ1ć?����Ŕ1ć?�����ŕĺ?�����ŕĺ?����@xĺ?����@xĺ?����Ŕúä?����Ŕúä?����@hä?����@hä?����@Áă?����@Áă?����€ă?����€ă?����€8â?����€8â?�����Xá?�����Xá?����@fŕ?����@fŕ?�����ČŢ?�����ČŢ?����€¤Ü?����€¤Ü?�����dÚ?�����dÚ?����€ Ř?����€ Ř?�����–Ő?�����–Ő?����€ Ó?����€ Ó?����€qĐ?����€qĐ?�����ŠË?�����ŠË?�����Ć?�����Ć?�����‹Ŕ?�����‹Ŕ?�����޵?�����޵?�����$Ą?�����$Ą?�����Ŕhż�����Ŕhż�����8¨ż�����8¨ż�����h·ż�����h·ż�����MÁż�����MÁż�����ŐĆż�����ŐĆż�����GĚż�����GĚż����€ÍĐż����€ÍĐż�����gÓż�����gÓż�����íŐż�����íŐż�����]Řż�����]Řż����€´Úż����€´Úż�����ńÜż�����ńÜż����€ßż����€ßż����@ŕż����@ŕż����Ŕwáż����Ŕwáż����€Uâż����€Uâż�����!ăż�����!ăż����@Ůăż����@Ůăż����€}äż����€}äż����@ ĺż����@ ĺż����Ŕ‡ĺż����Ŕ‡ĺż����€ěĺż����€ěĺż����@;ćż����@;ćż����Ŕsćż����Ŕsćż����€•ćż����€•ćż����Ŕ ćż����Ŕ ćż�����•ćż�����•ćż����Ŕrćż����Ŕrćż����Ŕ9ćż����Ŕ9ćż����€ęĺż����€ęĺż����@…ĺż����@…ĺż����@ ĺż����@ ĺż�����zäż�����zäż����@Őăż����@Őăż����Ŕăż����Ŕăż����ŔPâż����ŔPâż����€ráż����€ráż����€‚ŕż����€‚ŕż����€ßż����€ßż�����äÜż�����äÜż�����§Úż�����§Úż�����OŘż�����OŘż����€ŢŐż����€ŢŐż�����XÓż�����XÓż����€ľĐż����€ľĐż�����'Ěż�����'Ěż�����µĆż�����µĆż�����-Áż�����-Áż�����&·ż�����&·ż�����´§ż�����´§ż�����€`ż�����€`ż�����¨Ą?�����¨Ą?����� ¶?����� ¶?�����«Ŕ?�����«Ŕ?�����6Ć?�����6Ć?�����ŞË?�����ŞË?�����Đ?�����Đ?����€Ó?����€Ó?����€¤Ő?����€¤Ő?�����Ř?�����Ř?����€qÚ?����€qÚ?�����±Ü?�����±Ü?�����ÔŢ?�����ÔŢ?�����lŕ?�����lŕ?����@]á?����@]á?����@=â?����@=â?����� ă?����� ă?����@Ĺă?����@Ĺă?�����lä?�����lä?�����ţä?�����ţä?����Ŕzĺ?����Ŕzĺ?����@âĺ?����@âĺ?����€3ć?����€3ć?����€nć?����€nć?����Ŕ’ć?����Ŕ’ć?����€ ć?����€ ć?����€—ć?����€—ć?����Ŕwć?����Ŕwć?����@Ać?����@Ać?����€ôĺ?����€ôĺ?����Ŕ‘ĺ?����Ŕ‘ĺ?����@ĺ?����@ĺ?����€‹ä?����€‹ä?�����éă?�����éă?����€2ă?����€2ă?�����iâ?�����iâ?����ŔŚá?����ŔŚá?����Ŕžŕ?����Ŕžŕ?�����@ß?�����@ß?����€#Ý?����€#Ý?����€éÚ?����€éÚ?����€”Ř?����€”Ř?����€&Ö?����€&Ö?����€˘Ó?����€˘Ó?����� Ń?����� Ń?�����ÄĚ?�����ÄĚ?�����UÇ?�����UÇ?�����ĎÁ?�����ĎÁ?�����n¸?�����n¸?�����HŞ?�����HŞ?�����ŕ|?�����ŕ|?�����Łż�����Łż�����Ř´ż�����Ř´ż����� Ŕż����� Ŕż�����•Ĺż�����•Ĺż����� Ëż����� Ëż�����4Đż�����4Đż����€ŃŇż����€ŃŇż�����\Őż�����\Őż�����Ń׿�����Ń׿����€.Úż����€.Úż�����qÜż�����qÜż����€—Ţż����€—Ţż����€Oŕż����€Oŕż����ŔBáż����ŔBáż����Ŕ$âż����Ŕ$âż����€ôâż����€ôâż����@±ăż����@±ăż�����Zäż�����Zäż����€îäż����€îäż����Ŕmĺż����Ŕmĺż����€×ĺż����€×ĺż����@+ćż����@+ćż����Ŕhćż����Ŕhćż����ŔŹćż����ŔŹćż����� ćż����� ćż����Ŕ™ćż����Ŕ™ćż����€|ćż����€|ćż����ŔHćż����ŔHćż����€ţĺż����€ţĺż�����žĺż�����žĺż�����(ĺż�����(ĺż����Ŕśäż����Ŕśäż����€üăż����€üăż����@Hăż����@Hăż����Ŕ€âż����Ŕ€âż����€¦áż����€¦áż����€şŕż����€şŕż����€{ßż����€{ßż����€bÝż����€bÝż����€+Űż����€+Űż����€ŮŘż����€ŮŘż����€nÖż����€nÖż�����íÓż�����íÓż�����WŃż�����WŃż�����`Íż�����`Íż�����ôÇż�����ôÇż�����qÂż�����qÂż�����´ąż�����´ąż�����ܬż�����ܬż�����Ŕż�����Ŕż�����€ ?�����€ ?�����ł?�����ł?�����Ěľ?�����Ěľ?�����őÄ?�����őÄ?�����oĘ?�����oĘ?�����ÎĎ?�����ÎĎ?����€†Ň?����€†Ň?�����Ő?�����Ő?�����‹×?�����‹×?�����ëŮ?�����ëŮ?�����1Ü?�����1Ü?����€ZŢ?����€ZŢ?����Ŕ2ŕ?����Ŕ2ŕ?�����(á?�����(á?����� â?����� â?����ŔÝâ?����ŔÝâ?����Ŕśă?����Ŕśă?����ŔGä?����ŔGä?����€Ţä?����€Ţä?����@`ĺ?����@`ĺ?����€Ěĺ?����€Ěĺ?�����#ć?�����#ć?�����cć?�����cć?����€Ść?����€Ść?����€źć?����€źć?����€›ć?����€›ć?�����ć?�����ć?����ŔOć?����ŔOć?�����ć?�����ć?�����Şĺ?�����Şĺ?����€6ĺ?����€6ĺ?����€­ä?����€­ä?����Ŕä?����Ŕä?����Ŕ]ă?����Ŕ]ă?����€â?����€â?����@Ŕá?����@Ŕá?����@Öŕ?����@Öŕ?�����·ß?�����·ß?�����ˇÝ?�����ˇÝ?����€mŰ?����€mŰ?����€Ů?����€Ů?�����¶Ö?�����¶Ö?�����7Ô?�����7Ô?����€ŁŃ?����€ŁŃ?�����üÍ?�����üÍ?�����“Č?�����“Č?�����Ă?�����Ă?�����úş?�����úş?�����lŻ?�����lŻ?�����‘?�����‘?�����Ř›ż�����Ř›ż�����H˛ż�����H˛ż�����†˝ż�����†˝ż�����TÄż�����TÄż�����ĐÉż�����ĐÉż�����3Ďż�����3Ďż�����;Ňż�����;Ňż�����ĘÔż�����ĘÔż�����D׿�����D׿�����§Ůż�����§Ůż�����đŰż�����đŰż�����Ţż�����Ţż����Ŕŕż����Ŕŕż����� áż����� áż�����óáż�����óáż�����Çâż�����Çâż�����ăż�����ăż����€5äż����€5äż����€Îäż����€Îäż����ŔRĺż����ŔRĺż����€Áĺż����€Áĺż����@ćż����@ćż����Ŕ\ćż����Ŕ\ćż�����‰ćż�����‰ćż����€žćż����€žćż�����ťćż�����ťćż�����…ćż�����…ćż����€Vćż����€Vćż����@ćż����@ćż�����¶ĺż�����¶ĺż����ŔDĺż����ŔDĺż����@ľäż����@ľäż����Ŕ"äż����Ŕ"äż�����săż�����săż����ŔŻâż����ŔŻâż����ŔŮáż����ŔŮáż����Ŕńŕż����Ŕńŕż����€ńßż����€ńßż�����ßÝż�����ßÝż�����ŻŰż�����ŻŰż�����cŮż�����cŮż����€ýÖż����€ýÖż����€€Ôż����€€Ôż�����ďŃż�����ďŃż�����Îż�����Îż�����2Éż�����2Éż�����łĂż�����łĂż�����BĽż�����BĽż������±ż������±ż�����°–ż�����°–ż�����°–?�����°–?������±?������±?�����BĽ?�����BĽ?�����łĂ?�����łĂ?�����2É?�����2É?�����Î?�����Î?�����ďŃ?�����ďŃ?����€€Ô?����€€Ô?����€ýÖ?����€ýÖ?�����cŮ?�����cŮ?�����ŻŰ?�����ŻŰ?�����ßÝ?�����ßÝ?����€ńß?����€ńß?����Ŕńŕ?����Ŕńŕ?����ŔŮá?����ŔŮá?����ŔŻâ?����ŔŻâ?�����să?�����să?����Ŕ"ä?����Ŕ"ä?����@ľä?����@ľä?����ŔDĺ?����ŔDĺ?�����¶ĺ?�����¶ĺ?����@ć?����@ć?����€Vć?����€Vć?�����…ć?�����…ć?�����ťć?�����ťć?����€žć?����€žć?�����‰ć?�����‰ć?����Ŕ\ć?����Ŕ\ć?����@ć?����@ć?����€Áĺ?����€Áĺ?����ŔRĺ?����ŔRĺ?����€Îä?����€Îä?����€5ä?����€5ä?�����ă?�����ă?�����Çâ?�����Çâ?�����óá?�����óá?����� á?����� á?����Ŕŕ?����Ŕŕ?�����Ţ?�����Ţ?�����đŰ?�����đŰ?�����§Ů?�����§Ů?�����D×?�����D×?�����ĘÔ?�����ĘÔ?�����;Ň?�����;Ň?�����3Ď?�����3Ď?�����ĐÉ?�����ĐÉ?�����TÄ?�����TÄ?�����†˝?�����†˝?�����H˛?�����H˛?�����Ř›?�����Ř›?�����‘ż�����‘ż�����lŻż�����lŻż�����úşż�����úşż�����Ăż�����Ăż�����“Čż�����“Čż�����üÍż�����üÍż����€ŁŃż����€ŁŃż�����7Ôż�����7Ôż�����¶Öż�����¶Öż����€Ůż����€Ůż����€mŰż����€mŰż�����ˇÝż�����ˇÝż�����·ßż�����·ßż����@Öŕż����@Öŕż����@Ŕáż����@Ŕáż����€âż����€âż����Ŕ]ăż����Ŕ]ăż����Ŕäż����Ŕäż����€­äż����€­äż����€6ĺż����€6ĺż�����Şĺż�����Şĺż�����ćż�����ćż����ŔOćż����ŔOćż�����ćż�����ćż����€›ćż����€›ćż����€źćż����€źćż����€Śćż����€Śćż�����cćż�����cćż�����#ćż�����#ćż����€Ěĺż����€Ěĺż����@`ĺż����@`ĺż����€Ţäż����€Ţäż����ŔGäż����ŔGäż����Ŕśăż����Ŕśăż����ŔÝâż����ŔÝâż����� âż����� âż�����(áż�����(áż����Ŕ2ŕż����Ŕ2ŕż����€ZŢż����€ZŢż�����1Üż�����1Üż�����ëŮż�����ëŮż�����‹×ż�����‹×ż�����Őż�����Őż����€†Ňż����€†Ňż�����ÎĎż�����ÎĎż�����oĘż�����oĘż�����őÄż�����őÄż�����Ěľż�����Ěľż�����łż�����łż�����€ ż�����€ ż�����Ŕ?�����Ŕ?�����ܬ?�����ܬ?�����´ą?�����´ą?�����qÂ?�����qÂ?�����ôÇ?�����ôÇ?�����`Í?�����`Í?�����WŃ?�����WŃ?�����íÓ?�����íÓ?����€nÖ?����€nÖ?����€ŮŘ?����€ŮŘ?����€+Ű?����€+Ű?����€bÝ?����€bÝ?����€{ß?����€{ß?����€şŕ?����€şŕ?����€¦á?����€¦á?����Ŕ€â?����Ŕ€â?����@Hă?����@Hă?����€üă?����€üă?����Ŕśä?����Ŕśä?�����(ĺ?�����(ĺ?�����žĺ?�����žĺ?����€ţĺ?����€ţĺ?����ŔHć?����ŔHć?����€|ć?����€|ć?����Ŕ™ć?����Ŕ™ć?����� ć?����� ć?����ŔŹć?����ŔŹć?����Ŕhć?����Ŕhć?����@+ć?����@+ć?����€×ĺ?����€×ĺ?����Ŕmĺ?����Ŕmĺ?����€îä?����€îä?�����Zä?�����Zä?����@±ă?����@±ă?����€ôâ?����€ôâ?����Ŕ$â?����Ŕ$â?����ŔBá?����ŔBá?����€Oŕ?����€Oŕ?����€—Ţ?����€—Ţ?�����qÜ?�����qÜ?����€.Ú?����€.Ú?�����Ń×?�����Ń×?�����\Ő?�����\Ő?����€ŃŇ?����€ŃŇ?�����4Đ?�����4Đ?����� Ë?����� Ë?�����•Ĺ?�����•Ĺ?����� Ŕ?����� Ŕ?�����Ř´?�����Ř´?�����Ł?�����Ł?�����ŕ|ż�����ŕ|ż�����HŞż�����HŞż�����n¸ż�����n¸ż�����ĎÁż�����ĎÁż�����UÇż�����UÇż�����ÄĚż�����ÄĚż����� Ńż����� Ńż����€˘Óż����€˘Óż����€&Öż����€&Öż����€”Řż����€”Řż����€éÚż����€éÚż����€#Ýż����€#Ýż�����@ßż�����@ßż����Ŕžŕż����Ŕžŕż����ŔŚáż����ŔŚáż�����iâż�����iâż����€2ăż����€2ăż�����éăż�����éăż����€‹äż����€‹äż����@ĺż����@ĺż����Ŕ‘ĺż����Ŕ‘ĺż����€ôĺż����€ôĺż����@Aćż����@Aćż����Ŕwćż����Ŕwćż����€—ćż����€—ćż����€ ćż����€ ćż����Ŕ’ćż����Ŕ’ćż����€nćż����€nćż����€3ćż����€3ćż����@âĺż����@âĺż����Ŕzĺż����Ŕzĺż�����ţäż�����ţäż�����läż�����läż����@Ĺăż����@Ĺăż����� ăż����� ăż����@=âż����@=âż����@]áż����@]áż�����lŕż�����lŕż�����ÔŢż�����ÔŢż�����±Üż�����±Üż����€qÚż����€qÚż�����Řż�����Řż����€¤Őż����€¤Őż����€Óż����€Óż�����Đż�����Đż�����ŞËż�����ŞËż�����6Ćż�����6Ćż�����«Ŕż�����«Ŕż����� ¶ż����� ¶ż�����¨Ąż�����¨Ąż�����€`?�����€`?�����´§?�����´§?�����&·?�����&·?�����-Á?�����-Á?�����µĆ?�����µĆ?�����'Ě?�����'Ě?����€ľĐ?����€ľĐ?�����XÓ?�����XÓ?����€ŢŐ?����€ŢŐ?�����OŘ?�����OŘ?�����§Ú?�����§Ú?�����äÜ?�����äÜ?����€ß?����€ß?����€‚ŕ?����€‚ŕ?����€rá?����€rá?����ŔPâ?����ŔPâ?����Ŕă?����Ŕă?����@Őă?����@Őă?�����zä?�����zä?����@ ĺ?����@ ĺ?����@…ĺ?����@…ĺ?����€ęĺ?����€ęĺ?����Ŕ9ć?����Ŕ9ć?����Ŕrć?����Ŕrć?�����•ć?�����•ć?����Ŕ ć?����Ŕ ć?����€•ć?����€•ć?����Ŕsć?����Ŕsć?����@;ć?����@;ć?����€ěĺ?����€ěĺ?����Ŕ‡ĺ?����Ŕ‡ĺ?����@ ĺ?����@ ĺ?����€}ä?����€}ä?����@Ůă?����@Ůă?�����!ă?�����!ă?����€Uâ?����€Uâ?����Ŕwá?����Ŕwá?����@ŕ?����@ŕ?����€ß?����€ß?�����ńÜ?�����ńÜ?����€´Ú?����€´Ú?�����]Ř?�����]Ř?�����íŐ?�����íŐ?�����gÓ?�����gÓ?����€ÍĐ?����€ÍĐ?�����GĚ?�����GĚ?�����ŐĆ?�����ŐĆ?�����MÁ?�����MÁ?�����h·?�����h·?�����8¨?�����8¨?�����Ŕh?�����Ŕh?�����$Ąż�����$Ąż�����޵ż�����޵ż�����‹Ŕż�����‹Ŕż�����Ćż�����Ćż�����ŠËż�����ŠËż����€qĐż����€qĐż����€ Óż����€ Óż�����–Őż�����–Őż����€ Řż����€ Řż�����dÚż�����dÚż����€¤Üż����€¤Üż�����ČŢż�����ČŢż����@fŕż����@fŕż�����Xáż�����Xáż����€8âż����€8âż����€ăż����€ăż����@Áăż����@Áăż����@häż����@häż����Ŕúäż����Ŕúäż����@xĺż����@xĺż�����ŕĺż�����ŕĺż����Ŕ1ćż����Ŕ1ćż����@mćż����@mćż����@’ćż����@’ćż����€ ćż����€ ćż�����ćż�����ćż����Ŕxćż����Ŕxćż����ŔBćż����ŔBćż����€öĺż����€öĺż����@”ĺż����@”ĺż����@ĺż����@ĺż�����Źäż�����Źäż�����íăż�����íăż�����7ăż�����7ăż����Ŕmâż����Ŕmâż����Ŕ‘áż����Ŕ‘áż����@¤ŕż����@¤ŕż�����Lßż�����Lßż�����0Ýż�����0Ýż�����÷Úż�����÷Úż����€˘Řż����€˘Řż�����5Öż�����5Öż����€±Óż����€±Óż�����Ńż�����Ńż�����ăĚż�����ăĚż�����uÇż�����uÇż�����ďÁż�����ďÁż�����®¸ż�����®¸ż�����ĚŞż�����ĚŞż�����€€ż�����€€ż�����˘?�����˘?�����–´?�����–´?�����Đż?�����Đż?�����uĹ?�����uĹ?�����íĘ?�����íĘ?����€$Đ?����€$Đ?����€ÂŇ?����€ÂŇ?����€MŐ?����€MŐ?�����Ă×?�����Ă×?�����!Ú?�����!Ú?����€dÜ?����€dÜ?����€‹Ţ?����€‹Ţ?����ŔIŕ?����ŔIŕ?����€=á?����€=á?����Ŕâ?����Ŕâ?�����đâ?�����đâ?�����­ă?�����­ă?����€Vä?����€Vä?����@ëä?����@ëä?�����kĺ?�����kĺ?����@Őĺ?����@Őĺ?����Ŕ)ć?����Ŕ)ć?����Ŕgć?����Ŕgć?����@Źć?����@Źć?����� ć?����� ć?�����šć?�����šć?����@}ć?����@}ć?�����Jć?�����Jć?����@�ć?����@�ć?����€ ĺ?����€ ĺ?�����+ĺ?�����+ĺ?����� ä?����� ä?����€�ä?����€�ä?����ŔLă?����ŔLă?����€…â?����€…â?����Ŕ«á?����Ŕ«á?����@Ŕŕ?����@Ŕŕ?����€‡ß?����€‡ß?�����oÝ?�����oÝ?�����9Ű?�����9Ű?����€çŘ?����€çŘ?�����}Ö?�����}Ö?����€űÓ?����€űÓ?����€fŃ?����€fŃ?�����Í?�����Í?�����Č?�����Č?�����‘Â?�����‘Â?�����öą?�����öą?�����`­?�����`­?�����ĐŠ?�����ĐŠ?�����řźż�����řźż�����Nłż�����Nłż�����Śľż�����Śľż�����ŐÄż�����ŐÄż�����OĘż�����OĘż�����ŻĎż�����ŻĎż�����wŇż�����wŇż����€Őż����€Őż�����}׿�����}׿����€ÝŮż����€ÝŮż�����$Üż�����$Üż�����NŢż�����NŢż�����-ŕż�����-ŕż����€"áż����€"áż�����âż�����âż����@Ůâż����@Ůâż����€ăż����€ăż����@Däż����@Däż����€Űäż����€Űäż����€]ĺż����€]ĺż����@Ęĺż����@Ęĺż����@!ćż����@!ćż����Ŕaćż����Ŕaćż����Ŕ‹ćż����Ŕ‹ćż����@źćż����@źćż����Ŕ›ćż����Ŕ›ćż����Ŕćż����Ŕćż�����Qćż�����Qćż����Ŕ ćż����Ŕ ćż����€¬ĺż����€¬ĺż����@9ĺż����@9ĺż����Ŕ°äż����Ŕ°äż����€äż����€äż�����băż�����băż�����ťâż�����ťâż����€Ĺáż����€Ĺáż����ŔŰŕż����ŔŰŕż����€Âßż����€Âßż����€­Ýż����€­Ýż����€zŰż����€zŰż�����,Ůż�����,Ůż����€ÄÖż����€ÄÖż����€EÔż����€EÔż����€˛Ńż����€˛Ńż�����Îż�����Îż�����łČż�����łČż�����2Ăż�����2Ăż�����<»ż�����<»ż�����đŻż�����đŻż�����’ż�����’ż�����Đš?�����Đš?�����˛?�����˛?�����F˝?�����F˝?�����4Ä?�����4Ä?�����±É?�����±É?�����Ď?�����Ď?�����,Ň?�����,Ň?����€»Ô?����€»Ô?�����6×?�����6×?����€™Ů?����€™Ů?�����ăŰ?�����ăŰ?����€Ţ?����€Ţ?�����ŕ?�����ŕ?����€á?����€á?�����îá?�����îá?����@Ââ?����@Ââ?����Ŕă?����Ŕă?����Ŕ1ä?����Ŕ1ä?����@Ëä?����@Ëä?�����Pĺ?�����Pĺ?�����żĺ?�����żĺ?����€ć?����€ć?����€[ć?����€[ć?����@ć?����@ć?����@žć?����@žć?����€ťć?����€ťć?����Ŕ…ć?����Ŕ…ć?����ŔWć?����ŔWć?�����ć?�����ć?����@¸ĺ?����@¸ĺ?����€Gĺ?����€Gĺ?����€Áä?����€Áä?����€&ä?����€&ä?����@wă?����@wă?����€´â?����€´â?����ŔŢá?����ŔŢá?����@÷ŕ?����@÷ŕ?�����ýß?�����ýß?����€ëÝ?����€ëÝ?�����ĽŰ?�����ĽŰ?����€pŮ?����€pŮ?����€ ×?����€ ×?����€ŹÔ?����€ŹÔ?����€ţŃ?����€ţŃ?�����·Î?�����·Î?�����RÉ?�����RÉ?�����ÓĂ?�����ÓĂ?�����‚Ľ?�����‚Ľ?�����@±?�����@±?�����¸—?�����¸—?�����¨•ż�����¨•ż�����ľ°ż�����ľ°ż������Ľż������Ľż�����“Ăż�����“Ăż�����Éż�����Éż�����yÎż�����yÎż�����ŕŃż�����ŕŃż�����rÔż�����rÔż�����ďÖż�����ďÖż�����UŮż�����UŮż�����˘Űż�����˘Űż�����ÓÝż�����ÓÝż����€ĺßż����€ĺßż����@ěŕż����@ěŕż����ŔÔáż����ŔÔáż�����«âż�����«âż����Ŕnăż����Ŕnăż�����äż�����äż����Ŕşäż����Ŕşäż�����Bĺż�����Bĺż����€łĺż����€łĺż����€ćż����€ćż�����Ućż�����Ućż����@„ćż����@„ćż����Ŕśćż����Ŕśćż����Ŕžćż����Ŕžćż����Ŕ‰ćż����Ŕ‰ćż�����^ćż�����^ćż�����ćż�����ćż����ŔĂĺż����ŔĂĺż����€Uĺż����€Uĺż����ŔŃäż����ŔŃäż�����9äż�����9äż����@Śăż����@Śăż����€Ëâż����€Ëâż�����řáż�����řáż����€áż����€áż����Ŕŕż����Ŕŕż����€)Ţż����€)Ţż�����ýŰż�����ýŰż����€´Ůż����€´Ůż����€R׿����€R׿����€ŘÔż����€ŘÔż�����JŇż�����JŇż�����RĎż�����RĎż�����đÉż�����đÉż�����tÄż�����tÄż�����Č˝ż�����Č˝ż�����Оż�����Оż�����ŕśż�����ŕśż�����€?�����€?�����č®?�����č®?�����şş?�����şş?�����ňÂ?�����ňÂ?�����tČ?�����tČ?�����ÝÍ?�����ÝÍ?�����”Ń?�����”Ń?�����(Ô?�����(Ô?�����¨Ö?�����¨Ö?����€Ů?����€Ů?����€`Ű?����€`Ű?����€”Ý?����€”Ý?�����«ß?�����«ß?����ŔĐŕ?����ŔĐŕ?����@»á?����@»á?����Ŕ“â?����Ŕ“â?����€Yă?����€Yă?����� ä?����� ä?����@Şä?����@Şä?����€3ĺ?����€3ĺ?����Ŕ§ĺ?����Ŕ§ĺ?�����ć?�����ć?����@Nć?����@Nć?�����€ć?�����€ć?����@›ć?����@›ć?����€źć?����€źć?����@Ťć?����@Ťć?����@dć?����@dć?����€$ć?����€$ć?����ŔÎĺ?����ŔÎĺ?�����cĺ?�����cĺ?����Ŕáä?����Ŕáä?����€Kä?����€Kä?����Ŕ ă?����Ŕ ă?����€ââ?����€ââ?�����â?�����â?����€-á?����€-á?����€8ŕ?����€8ŕ?����€fŢ?����€fŢ?�����>Ü?�����>Ü?����€řŮ?����€řŮ?�����™×?�����™×?�����"Ő?�����"Ő?����€•Ň?����€•Ň?�����ěĎ?�����ěĎ?�����ŽĘ?�����ŽĘ?�����Ĺ?�����Ĺ?�����ż?�����ż?�����Ňł?�����Ňł?�����ˇ?�����ˇ?�����°†ż�����°†ż�����X¬ż�����X¬ż�����rąż�����rąż�����PÂż�����PÂż�����ŐÇż�����ŐÇż�����AÍż�����AÍż�����HŃż�����HŃż�����ŢÓż�����ŢÓż�����`Öż�����`Öż�����ĚŘż�����ĚŘż����€Űż����€Űż�����VÝż�����VÝż�����pßż�����pßż�����µŕż�����µŕż����€ˇáż����€ˇáż�����|âż�����|âż�����Dăż�����Dăż����Ŕřăż����Ŕřăż����@™äż����@™äż�����%ĺż�����%ĺż����Ŕ›ĺż����Ŕ›ĺż����€üĺż����€üĺż����@Gćż����@Gćż����€{ćż����€{ćż����@™ćż����@™ćż����@ ćż����@ ćż����€ćż����€ćż�����jćż�����jćż�����-ćż�����-ćż����ŔŮĺż����ŔŮĺż����@pĺż����@pĺż����€ńäż����€ńäż����€]äż����€]äż����@µăż����@µăż�����ůâż�����ůâż����Ŕ)âż����Ŕ)âż����@Háż����@Háż����@Uŕż����@Uŕż����€ŁŢż����€ŁŢż�����~Üż�����~Üż�����<Úż�����<Úż�����ß׿�����ß׿����€jŐż����€jŐż����€ŕŇż����€ŕŇż����€CĐż����€CĐż�����,Ëż�����,Ëż�����µĹż�����µĹż�����)Ŕż�����)Ŕż�����µż�����µż�����Łż�����Łż�����Ŕx?�����Ŕx?�����Ä©?�����Ä©?�����,¸?�����,¸?�����®Á?�����®Á?�����5Ç?�����5Ç?�����ĄĚ?�����ĄĚ?����€űĐ?����€űĐ?�����”Ó?�����”Ó?����€Ö?����€Ö?����€†Ř?����€†Ř?����€ÜÚ?����€ÜÚ?�����Ý?�����Ý?�����4ß?�����4ß?�����™ŕ?�����™ŕ?����€‡á?����€‡á?�����dâ?�����dâ?����@.ă?����@.ă?����@ĺă?����@ĺă?�����ä?�����ä?����@ĺ?����@ĺ?����@Źĺ?����@Źĺ?����€ňĺ?����€ňĺ?����Ŕ?ć?����Ŕ?ć?����Ŕvć?����Ŕvć?�����—ć?�����—ć?����€ ć?����€ ć?����€“ć?����€“ć?����€oć?����€oć?�����5ć?�����5ć?����@äĺ?����@äĺ?����€}ĺ?����€}ĺ?�����ĺ?�����ĺ?����€oä?����€oä?����@Éă?����@Éă?����@ă?����@ă?����@Bâ?����@Bâ?����Ŕbá?����Ŕbá?����Ŕqŕ?����Ŕqŕ?�����ŕŢ?�����ŕŢ?�����ľÜ?�����ľÜ?�����Ú?�����Ú?�����%Ř?�����%Ř?�����łŐ?�����łŐ?����€+Ó?����€+Ó?����€Đ?����€Đ?�����ÉË?�����ÉË?�����VĆ?�����VĆ?�����ĚŔ?�����ĚŔ?�����b¶?�����b¶?�����,¦?�����,¦?�����€Pż�����€Pż�����4§ż�����4§ż�����ä¶ż�����ä¶ż����� Áż����� Áż�����•Ćż�����•Ćż�����Ěż�����Ěż�����ŻĐż�����ŻĐż����€IÓż����€IÓż�����ĐŐż�����ĐŐż�����AŘż�����AŘż����€™Úż����€™Úż����€×Üż����€×Üż����€řŢż����€řŢż�����}ŕż�����}ŕż����@máż����@máż�����Lâż�����Lâż����@ăż����@ăż����@Ńăż����@Ńăż����€väż����€väż�����ĺż�����ĺż����€‚ĺż����€‚ĺż����€čĺż����€čĺż����@8ćż����@8ćż����€qćż����€qćż����€”ćż����€”ćż����Ŕ ćż����Ŕ ćż�����–ćż�����–ćż����Ŕtćż����Ŕtćż����Ŕ<ćż����Ŕ<ćż����€îĺż����€îĺż����@Šĺż����@Šĺż����@ĺż����@ĺż�����äż�����äż����@Ýăż����@Ýăż����€%ăż����€%ăż����€Zâż����€Zâż�����}áż�����}áż�����Žŕż�����Žŕż����€ßż����€ßż����€ýÜż����€ýÜż����€ÁÚż����€ÁÚż�����kŘż�����kŘż����€űŐż����€űŐż�����vÓż�����vÓż�����ÝĐż�����ÝĐż�����fĚż�����fĚż�����őĆż�����őĆż�����nÁż�����nÁż�����¨·ż�����¨·ż�����Ľ¨ż�����Ľ¨ż�����€pż�����€pż����� ¤?����� ¤?�����śµ?�����śµ?�����jŔ?�����jŔ?�����őĹ?�����őĹ?�����kË?�����kË?�����bĐ?�����bĐ?����€ţŇ?����€ţŇ?����€‡Ő?����€‡Ő?����€ű×?����€ű×?����€VÚ?����€VÚ?����€—Ü?����€—Ü?�����ĽŢ?�����ĽŢ?����€`ŕ?����€`ŕ?����ŔRá?����ŔRá?����€3â?����€3â?�����ă?�����ă?����@˝ă?����@˝ă?����Ŕdä?����Ŕdä?����Ŕ÷ä?����Ŕ÷ä?����Ŕuĺ?����Ŕuĺ?�����Ţĺ?�����Ţĺ?����@0ć?����@0ć?����@lć?����@lć?����Ŕ‘ć?����Ŕ‘ć?����€ ć?����€ ć?����€ć?����€ć?����Ŕyć?����Ŕyć?����@Dć?����@Dć?����€řĺ?����€řĺ?����Ŕ–ĺ?����Ŕ–ĺ?����@ĺ?����@ĺ?����@’ä?����@’ä?�����ńă?�����ńă?����@;ă?����@;ă?����€râ?����€râ?�����—á?�����—á?�����Şŕ?�����Şŕ?�����Xß?�����Xß?����€<Ý?����€<Ý?�����Ű?�����Ű?�����°Ř?�����°Ř?����€CÖ?����€CÖ?����€ŔÓ?����€ŔÓ?����€)Ń?����€)Ń?�����Í?�����Í?�����•Ç?�����•Ç?�����Â?�����Â?�����đ¸?�����đ¸?�����P«?�����P«?�����‚?�����‚?����� ˘ż����� ˘ż�����T´ż�����T´ż�����żż�����żż�����UĹż�����UĹż�����ÍĘż�����ÍĘż�����Đż�����Đż����€łŇż����€łŇż�����?Őż�����?Őż�����µ×ż�����µ×ż����€Úż����€Úż����€WÜż����€WÜż�����Ţż�����Ţż�����Dŕż�����Dŕż�����8áż�����8áż�����âż�����âż����€ëâż����€ëâż�����©ăż�����©ăż����ŔRäż����ŔRäż�����čäż�����čäż����€hĺż����€hĺż����@Óĺż����@Óĺż�����(ćż�����(ćż����€fćż����€fćż����€Žćż����€Žćż����Ŕźćż����Ŕźćż����€šćż����€šćż����@~ćż����@~ćż����€Kćż����€Kćż����@ćż����@ćż�����Łĺż�����Łĺż����Ŕ-ĺż����Ŕ-ĺż����€Łäż����€Łäż����@äż����@äż�����Qăż�����Qăż����@Šâż����@Šâż����Ŕ°áż����Ŕ°áż����ŔĹŕż����ŔĹŕż����€“ßż����€“ßż����€{Ýż����€{Ýż�����FŰż�����FŰż�����őŘż�����őŘż�����‹Öż�����‹Öż����€ Ôż����€ Ôż����€uŃż����€uŃż�����źÍż�����źÍż�����4Čż�����4Čż�����±Âż�����±Âż�����6şż�����6şż�����ä­ż�����ä­ż�����ি�����ি�����đž?�����đž?����� ł?����� ł?�����Jľ?�����Jľ?�����µÄ?�����µÄ?�����/Ę?�����/Ę?�����Ď?�����Ď?�����hŇ?�����hŇ?�����öÔ?�����öÔ?����€n×?����€n×?�����ĐŮ?�����ĐŮ?�����Ü?�����Ü?�����BŢ?�����BŢ?����@'ŕ?����@'ŕ?����@á?����@á?�����â?�����â?����ŔÔâ?����ŔÔâ?����€”ă?����€”ă?����€@ä?����€@ä?����@Řä?����@Řä?�����[ĺ?�����[ĺ?����@Čĺ?����@Čĺ?����€ć?����€ć?����€`ć?����€`ć?����@‹ć?����@‹ć?�����źć?�����źć?����@ść?����@ść?����€‚ć?����€‚ć?����€Rć?����€Rć?����Ŕ ć?����Ŕ ć?����Ŕ®ĺ?����Ŕ®ĺ?����@<ĺ?����@<ĺ?����@´ä?����@´ä?����@ä?����@ä?����@fă?����@fă?����Ŕˇâ?����Ŕˇâ?����€Ęá?����€Ęá?����@áŕ?����@áŕ?����€Îß?����€Îß?�����şÝ?�����şÝ?�����Ű?�����Ű?�����:Ů?�����:Ů?����€ŇÖ?����€ŇÖ?����€TÔ?����€TÔ?����€ÁŃ?����€ÁŃ?�����:Î?�����:Î?�����ÓČ?�����ÓČ?�����SĂ?�����SĂ?�����~»?�����~»?�����:°?�����:°?�����“?�����“?�����Č™ż�����Č™ż�����ıż�����ıż�����˝ż�����˝ż�����Äż�����Äż�����‘Éż�����‘Éż�����őÎż�����őÎż����€Ňż����€Ňż����€¬Ôż����€¬Ôż�����(׿�����(׿�����ŚŮż�����ŚŮż�����ÖŰż�����ÖŰż����€Ţż����€Ţż����@ ŕż����@ ŕż�����áż�����áż�����éáż�����éáż����Ŕ˝âż����Ŕ˝âż����Ŕăż����Ŕăż�����.äż�����.äż�����Čäż�����Čäż�����Mĺż�����Mĺż����ŔĽĺż����ŔĽĺż����Ŕćż����Ŕćż����@Zćż����@Zćż����€‡ćż����€‡ćż�����žćż�����žćż����Ŕťćż����Ŕťćż����Ŕ†ćż����Ŕ†ćż�����Yćż�����Yćż����Ŕćż����Ŕćż����€şĺż����€şĺż����@Jĺż����@Jĺż����ŔÄäż����ŔÄäż����@*äż����@*äż����€{ăż����€{ăż�����ąâż�����ąâż����Ŕăáż����Ŕăáż����Ŕüŕż����Ŕüŕż����€ŕż����€ŕż�����řÝż�����řÝż�����ÉŰż�����ÉŰż�����~Ůż�����~Ůż����€׿����€׿�����žÔż�����žÔż����€ Ňż����€ Ňż�����ÖÎż�����ÖÎż�����rÉż�����rÉż�����ôĂż�����ôĂż�����ÄĽż�����ÄĽż�����‚±ż�����‚±ż�����Ŕż�����Ŕż����� ”?����� ”?�����|°?�����|°?�����ľ»?�����ľ»?�����sĂ?�����sĂ?�����óČ?�����óČ?�����YÎ?�����YÎ?�����ŃŃ?�����ŃŃ?�����cÔ?�����cÔ?�����áÖ?�����áÖ?����€GŮ?����€GŮ?�����•Ű?�����•Ű?����€ĆÝ?����€ĆÝ?�����Úß?�����Úß?����Ŕćŕ?����Ŕćŕ?����€Ďá?����€Ďá?����€¦â?����€¦â?����€jă?����€jă?����@ä?����@ä?����€·ä?����€·ä?�����?ĺ?�����?ĺ?����@±ĺ?����@±ĺ?����€ ć?����€ ć?����ŔSć?����ŔSć?����€ć?����€ć?����€ść?����€ść?����Ŕžć?����Ŕžć?����€Šć?����€Šć?����@_ć?����@_ć?����Ŕć?����Ŕć?�����Ćĺ?�����Ćĺ?����@Xĺ?����@Xĺ?�����Őä?�����Őä?����Ŕ<ä?����Ŕ<ä?����@ă?����@ă?�����Đâ?�����Đâ?�����ýá?�����ýá?����Ŕá?����Ŕá?����€!ŕ?����€!ŕ?����€5Ţ?����€5Ţ?����� Ü?����� Ü?�����ÂŮ?�����ÂŮ?����€`×?����€`×?����€çÔ?����€çÔ?�����YŇ?�����YŇ?�����qĎ?�����qĎ?�����Ę?�����Ę?�����•Ä?�����•Ä?����� ľ?����� ľ?�����̲?�����̲?�����čť?�����čť?�����đŽż�����đŽż�����d®ż�����d®ż�����xşż�����xşż�����ŃÂż�����ŃÂż�����TČż�����TČż�����ľÍż�����ľÍż�����…Ńż�����…Ńż����€Ôż����€Ôż����€™Öż����€™Öż�����Ůż�����Ůż�����SŰż�����SŰż�����Ýż�����Ýż�����źßż�����źßż����@Ëŕż����@Ëŕż�����¶áż�����¶áż�����Źâż�����Źâż����@Uăż����@Uăż�����äż�����äż����Ŕ¦äż����Ŕ¦äż����Ŕ0ĺż����Ŕ0ĺż����@Ąĺż����@Ąĺż����@ćż����@ćż�����Mćż�����Mćż����@ćż����@ćż����Ŕšćż����Ŕšćż����Ŕźćż����Ŕźćż�����Žćż�����Žćż����@ećż����@ećż����@&ćż����@&ćż�����Ńĺż�����Ńĺż����Ŕeĺż����Ŕeĺż�����ĺäż�����ĺäż����@Oäż����@Oäż�����Ąăż�����Ąăż�����çâż�����çâż�����âż�����âż����Ŕ2áż����Ŕ2áż����@>ŕż����@>ŕż�����sŢż�����sŢż����€JÜż����€JÜż�����Úż�����Úż�����§×ż�����§×ż����€0Őż����€0Őż����€¤Ňż����€¤Ňż����€Đż����€Đż�����®Ęż�����®Ęż�����5Ĺż�����5Ĺż�����Nżż�����Nżż�����´ż�����´ż�����ˇż�����ˇż����� „?����� „?�����Ô«?�����Ô«?�����2ą?�����2ą?�����0Â?�����0Â?�����µÇ?�����µÇ?�����"Í?�����"Í?����€8Ń?����€8Ń?�����ĎÓ?�����ĎÓ?�����RÖ?�����RÖ?�����ľŘ?�����ľŘ?����€Ű?����€Ű?����€IÝ?����€IÝ?�����dß?�����dß?����€Żŕ?����€Żŕ?����@śá?����@śá?����@wâ?����@wâ?����Ŕ?ă?����Ŕ?ă?����Ŕôă?����Ŕôă?����Ŕ•ä?����Ŕ•ä?�����"ĺ?�����"ĺ?����@™ĺ?����@™ĺ?����€úĺ?����€úĺ?����ŔEć?����ŔEć?����€zć?����€zć?����Ŕć?����Ŕć?����@ ć?����@ ć?�����‘ć?�����‘ć?�����kć?�����kć?����€.ć?����€.ć?����ŔŰĺ?����ŔŰĺ?�����sĺ?�����sĺ?����Ŕôä?����Ŕôä?����@aä?����@aä?����@ąă?����@ąă?����€ýâ?����€ýâ?����€.â?����€.â?����€Má?����€Má?�����[ŕ?�����[ŕ?�����°Ţ?�����°Ţ?�����‹Ü?�����‹Ü?����€IÚ?����€IÚ?����€í×?����€í×?�����yŐ?�����yŐ?����€ďŇ?����€ďŇ?����€RĐ?����€RĐ?�����KË?�����KË?�����ŐĹ?�����ŐĹ?�����JŔ?�����JŔ?�����\µ?�����\µ?�����¤?�����¤?����� tż����� tż�����@©ż�����@©ż�����ę·ż�����ę·ż�����ŽÁż�����ŽÁż�����Çż�����Çż�����…Ěż�����…Ěż����€ěĐż����€ěĐż�����…Óż�����…Óż����� Öż����� Öż����€xŘż����€xŘż�����ĎÚż�����ĎÚż����� Ýż����� Ýż����€(ßż����€(ßż����€“ŕż����€“ŕż����@‚áż����@‚áż����@_âż����@_âż����Ŕ)ăż����Ŕ)ăż����@áăż����@áăż����€„äż����€„äż����@ĺż����@ĺż����ŔŚĺż����ŔŚĺż����€đĺż����€đĺż����@>ćż����@>ćż����Ŕućż����Ŕućż����€–ćż����€–ćż����€ ćż����€ ćż�����”ćż�����”ćż����€pćż����€pćż����€6ćż����€6ćż����@ćĺż����@ćĺż�����€ĺż�����€ĺż�����ĺż�����ĺż�����säż�����säż����@Íăż����@Íăż����Ŕăż����Ŕăż�����Gâż�����Gâż�����háż�����háż����@wŕż����@wŕż�����ěŢż�����ěŢż����€ĘÜż����€ĘÜż����€ŚÚż����€ŚÚż�����3Řż�����3Řż����€ÁŐż����€ÁŐż����€:Óż����€:Óż����€źĐż����€źĐż�����čËż�����čËż�����uĆż�����uĆż�����ěŔż�����ěŔż�����˘¶ż�����˘¶ż�����°¦ż�����°¦ż���������������������°¦?�����°¦?�����˘¶?�����˘¶?�����ěŔ?�����ěŔ?�����uĆ?�����uĆ?�����čË?�����čË?����€źĐ?����€źĐ?����€:Ó?����€:Ó?����€ÁŐ?����€ÁŐ?�����3Ř?�����3Ř?����€ŚÚ?����€ŚÚ?����€ĘÜ?����€ĘÜ?�����ěŢ?�����ěŢ?����@wŕ?����@wŕ?�����há?�����há?�����Gâ?�����Gâ?����Ŕă?����Ŕă?����@Íă?����@Íă?�����sä?�����sä?�����ĺ?�����ĺ?�����€ĺ?�����€ĺ?����@ćĺ?����@ćĺ?����€6ć?����€6ć?����€pć?����€pć?�����”ć?�����”ć?����€ ć?����€ ć?����€–ć?����€–ć?����Ŕuć?����Ŕuć?����@>ć?����@>ć?����€đĺ?����€đĺ?����ŔŚĺ?����ŔŚĺ?����@ĺ?����@ĺ?����€„ä?����€„ä?����@áă?����@áă?����Ŕ)ă?����Ŕ)ă?����@_â?����@_â?����@‚á?����@‚á?����€“ŕ?����€“ŕ?����€(ß?����€(ß?����� Ý?����� Ý?�����ĎÚ?�����ĎÚ?����€xŘ?����€xŘ?����� Ö?����� Ö?�����…Ó?�����…Ó?����€ěĐ?����€ěĐ?�����…Ě?�����…Ě?�����Ç?�����Ç?�����ŽÁ?�����ŽÁ?�����ę·?�����ę·?�����@©?�����@©?����� t?����� t?�����¤ż�����¤ż�����\µż�����\µż�����JŔż�����JŔż�����ŐĹż�����ŐĹż�����KËż�����KËż����€RĐż����€RĐż����€ďŇż����€ďŇż�����yŐż�����yŐż����€í׿����€í׿����€IÚż����€IÚż�����‹Üż�����‹Üż�����°Ţż�����°Ţż�����[ŕż�����[ŕż����€Máż����€Máż����€.âż����€.âż����€ýâż����€ýâż����@ąăż����@ąăż����@aäż����@aäż����Ŕôäż����Ŕôäż�����sĺż�����sĺż����ŔŰĺż����ŔŰĺż����€.ćż����€.ćż�����kćż�����kćż�����‘ćż�����‘ćż����@ ćż����@ ćż����Ŕćż����Ŕćż����€zćż����€zćż����ŔEćż����ŔEćż����€úĺż����€úĺż����@™ĺż����@™ĺż�����"ĺż�����"ĺż����Ŕ•äż����Ŕ•äż����Ŕôăż����Ŕôăż����Ŕ?ăż����Ŕ?ăż����@wâż����@wâż����@śáż����@śáż����€Żŕż����€Żŕż�����dßż�����dßż����€IÝż����€IÝż����€Űż����€Űż�����ľŘż�����ľŘż�����RÖż�����RÖż�����ĎÓż�����ĎÓż����€8Ńż����€8Ńż�����"Íż�����"Íż�����µÇż�����µÇż�����0Âż�����0Âż�����2ąż�����2ąż�����Ô«ż�����Ô«ż����� „ż����� „ż�����ˇ?�����ˇ?�����´?�����´?�����Nż?�����Nż?�����5Ĺ?�����5Ĺ?�����®Ę?�����®Ę?����€Đ?����€Đ?����€¤Ň?����€¤Ň?����€0Ő?����€0Ő?�����§×?�����§×?�����Ú?�����Ú?����€JÜ?����€JÜ?�����sŢ?�����sŢ?����@>ŕ?����@>ŕ?����Ŕ2á?����Ŕ2á?�����â?�����â?�����çâ?�����çâ?�����Ąă?�����Ąă?����@Oä?����@Oä?�����ĺä?�����ĺä?����Ŕeĺ?����Ŕeĺ?�����Ńĺ?�����Ńĺ?����@&ć?����@&ć?����@eć?����@eć?�����Žć?�����Žć?����Ŕźć?����Ŕźć?����Ŕšć?����Ŕšć?����@ć?����@ć?�����Mć?�����Mć?����@ć?����@ć?����@Ąĺ?����@Ąĺ?����Ŕ0ĺ?����Ŕ0ĺ?����Ŕ¦ä?����Ŕ¦ä?�����ä?�����ä?����@Uă?����@Uă?�����Źâ?�����Źâ?�����¶á?�����¶á?����@Ëŕ?����@Ëŕ?�����źß?�����źß?�����Ý?�����Ý?�����SŰ?�����SŰ?�����Ů?�����Ů?����€™Ö?����€™Ö?����€Ô?����€Ô?�����…Ń?�����…Ń?�����ľÍ?�����ľÍ?�����TČ?�����TČ?�����ŃÂ?�����ŃÂ?�����xş?�����xş?�����d®?�����d®?�����đŽ?�����đŽ?�����čťż�����čťż�����̲ż�����̲ż����� ľż����� ľż�����•Äż�����•Äż�����Ęż�����Ęż�����qĎż�����qĎż�����YŇż�����YŇż����€çÔż����€çÔż����€`׿����€`׿�����ÂŮż�����ÂŮż����� Üż����� Üż����€5Ţż����€5Ţż����€!ŕż����€!ŕż����Ŕáż����Ŕáż�����ýáż�����ýáż�����Đâż�����Đâż����@ăż����@ăż����Ŕ<äż����Ŕ<äż�����Őäż�����Őäż����@Xĺż����@Xĺż�����Ćĺż�����Ćĺż����Ŕćż����Ŕćż����@_ćż����@_ćż����€Šćż����€Šćż����Ŕžćż����Ŕžćż����€śćż����€śćż����€ćż����€ćż����ŔSćż����ŔSćż����€ ćż����€ ćż����@±ĺż����@±ĺż�����?ĺż�����?ĺż����€·äż����€·äż����@äż����@äż����€jăż����€jăż����€¦âż����€¦âż����€Ďáż����€Ďáż����Ŕćŕż����Ŕćŕż�����Úßż�����Úßż����€ĆÝż����€ĆÝż�����•Űż�����•Űż����€GŮż����€GŮż�����áÖż�����áÖż�����cÔż�����cÔż�����ŃŃż�����ŃŃż�����YÎż�����YÎż�����óČż�����óČż�����sĂż�����sĂż�����ľ»ż�����ľ»ż�����|°ż�����|°ż����� ”ż����� ”ż�����Ŕ?�����Ŕ?�����‚±?�����‚±?�����ÄĽ?�����ÄĽ?�����ôĂ?�����ôĂ?�����rÉ?�����rÉ?�����ÖÎ?�����ÖÎ?����€ Ň?����€ Ň?�����žÔ?�����žÔ?����€×?����€×?�����~Ů?�����~Ů?�����ÉŰ?�����ÉŰ?�����řÝ?�����řÝ?����€ŕ?����€ŕ?����Ŕüŕ?����Ŕüŕ?����Ŕăá?����Ŕăá?�����ąâ?�����ąâ?����€{ă?����€{ă?����@*ä?����@*ä?����ŔÄä?����ŔÄä?����@Jĺ?����@Jĺ?����€şĺ?����€şĺ?����Ŕć?����Ŕć?�����Yć?�����Yć?����Ŕ†ć?����Ŕ†ć?����Ŕťć?����Ŕťć?�����žć?�����žć?����€‡ć?����€‡ć?����@Zć?����@Zć?����Ŕć?����Ŕć?����ŔĽĺ?����ŔĽĺ?�����Mĺ?�����Mĺ?�����Čä?�����Čä?�����.ä?�����.ä?����Ŕă?����Ŕă?����Ŕ˝â?����Ŕ˝â?�����éá?�����éá?�����á?�����á?����@ ŕ?����@ ŕ?����€Ţ?����€Ţ?�����ÖŰ?�����ÖŰ?�����ŚŮ?�����ŚŮ?�����(×?�����(×?����€¬Ô?����€¬Ô?����€Ň?����€Ň?�����őÎ?�����őÎ?�����‘É?�����‘É?�����Ä?�����Ä?�����˝?�����˝?�����ı?�����ı?�����Č™?�����Č™?�����“ż�����“ż�����:°ż�����:°ż�����~»ż�����~»ż�����SĂż�����SĂż�����ÓČż�����ÓČż�����:Îż�����:Îż����€ÁŃż����€ÁŃż����€TÔż����€TÔż����€ŇÖż����€ŇÖż�����:Ůż�����:Ůż�����Űż�����Űż�����şÝż�����şÝż����€Îßż����€Îßż����@áŕż����@áŕż����€Ęáż����€Ęáż����Ŕˇâż����Ŕˇâż����@făż����@făż����@äż����@äż����@´äż����@´äż����@<ĺż����@<ĺż����Ŕ®ĺż����Ŕ®ĺż����Ŕ ćż����Ŕ ćż����€Rćż����€Rćż����€‚ćż����€‚ćż����@śćż����@śćż�����źćż�����źćż����@‹ćż����@‹ćż����€`ćż����€`ćż����€ćż����€ćż����@Čĺż����@Čĺż�����[ĺż�����[ĺż����@Řäż����@Řäż����€@äż����€@äż����€”ăż����€”ăż����ŔÔâż����ŔÔâż�����âż�����âż����@áż����@áż����@'ŕż����@'ŕż�����BŢż�����BŢż�����Üż�����Üż�����ĐŮż�����ĐŮż����€n׿����€n׿�����öÔż�����öÔż�����hŇż�����hŇż�����Ďż�����Ďż�����/Ęż�����/Ęż�����µÄż�����µÄż�����Jľż�����Jľż����� łż����� łż�����đžż�����đžż�����ŕŚ?�����ŕŚ?�����ä­?�����ä­?�����6ş?�����6ş?�����±Â?�����±Â?�����4Č?�����4Č?�����źÍ?�����źÍ?����€uŃ?����€uŃ?����€ Ô?����€ Ô?�����‹Ö?�����‹Ö?�����őŘ?�����őŘ?�����FŰ?�����FŰ?����€{Ý?����€{Ý?����€“ß?����€“ß?����ŔĹŕ?����ŔĹŕ?����Ŕ°á?����Ŕ°á?����@Šâ?����@Šâ?�����Qă?�����Qă?����@ä?����@ä?����€Łä?����€Łä?����Ŕ-ĺ?����Ŕ-ĺ?�����Łĺ?�����Łĺ?����@ć?����@ć?����€Kć?����€Kć?����@~ć?����@~ć?����€šć?����€šć?����Ŕźć?����Ŕźć?����€Žć?����€Žć?����€fć?����€fć?�����(ć?�����(ć?����@Óĺ?����@Óĺ?����€hĺ?����€hĺ?�����čä?�����čä?����ŔRä?����ŔRä?�����©ă?�����©ă?����€ëâ?����€ëâ?�����â?�����â?�����8á?�����8á?�����Dŕ?�����Dŕ?�����Ţ?�����Ţ?����€WÜ?����€WÜ?����€Ú?����€Ú?�����µ×?�����µ×?�����?Ő?�����?Ő?����€łŇ?����€łŇ?�����Đ?�����Đ?�����ÍĘ?�����ÍĘ?�����UĹ?�����UĹ?�����ż?�����ż?�����T´?�����T´?����� ˘?����� ˘?�����‚ż�����‚ż�����P«ż�����P«ż�����đ¸ż�����đ¸ż�����Âż�����Âż�����•Çż�����•Çż�����Íż�����Íż����€)Ńż����€)Ńż����€ŔÓż����€ŔÓż����€CÖż����€CÖż�����°Řż�����°Řż�����Űż�����Űż����€<Ýż����€<Ýż�����Xßż�����Xßż�����Şŕż�����Şŕż�����—áż�����—áż����€râż����€râż����@;ăż����@;ăż�����ńăż�����ńăż����@’äż����@’äż����@ĺż����@ĺż����Ŕ–ĺż����Ŕ–ĺż����€řĺż����€řĺż����@Dćż����@Dćż����Ŕyćż����Ŕyćż����€ćż����€ćż����€ ćż����€ ćż����Ŕ‘ćż����Ŕ‘ćż����@lćż����@lćż����@0ćż����@0ćż�����Ţĺż�����Ţĺż����Ŕuĺż����Ŕuĺż����Ŕ÷äż����Ŕ÷äż����Ŕdäż����Ŕdäż����@˝ăż����@˝ăż�����ăż�����ăż����€3âż����€3âż����ŔRáż����ŔRáż����€`ŕż����€`ŕż�����ĽŢż�����ĽŢż����€—Üż����€—Üż����€VÚż����€VÚż����€ű׿����€ű׿����€‡Őż����€‡Őż����€ţŇż����€ţŇż�����bĐż�����bĐż�����kËż�����kËż�����őĹż�����őĹż�����jŔż�����jŔż�����śµż�����śµż����� ¤ż����� ¤ż�����€p?�����€p?�����Ľ¨?�����Ľ¨?�����¨·?�����¨·?�����nÁ?�����nÁ?�����őĆ?�����őĆ?�����fĚ?�����fĚ?�����ÝĐ?�����ÝĐ?�����vÓ?�����vÓ?����€űŐ?����€űŐ?�����kŘ?�����kŘ?����€ÁÚ?����€ÁÚ?����€ýÜ?����€ýÜ?����€ß?����€ß?�����Žŕ?�����Žŕ?�����}á?�����}á?����€Zâ?����€Zâ?����€%ă?����€%ă?����@Ýă?����@Ýă?�����ä?�����ä?����@ĺ?����@ĺ?����@Šĺ?����@Šĺ?����€îĺ?����€îĺ?����Ŕ<ć?����Ŕ<ć?����Ŕtć?����Ŕtć?�����–ć?�����–ć?����Ŕ ć?����Ŕ ć?����€”ć?����€”ć?����€qć?����€qć?����@8ć?����@8ć?����€čĺ?����€čĺ?����€‚ĺ?����€‚ĺ?�����ĺ?�����ĺ?����€vä?����€vä?����@Ńă?����@Ńă?����@ă?����@ă?�����Lâ?�����Lâ?����@má?����@má?�����}ŕ?�����}ŕ?����€řŢ?����€řŢ?����€×Ü?����€×Ü?����€™Ú?����€™Ú?�����AŘ?�����AŘ?�����ĐŐ?�����ĐŐ?����€IÓ?����€IÓ?�����ŻĐ?�����ŻĐ?�����Ě?�����Ě?�����•Ć?�����•Ć?����� Á?����� Á?�����ä¶?�����ä¶?�����4§?�����4§?�����€P?�����€P?�����,¦ż�����,¦ż�����b¶ż�����b¶ż�����ĚŔż�����ĚŔż�����VĆż�����VĆż�����ÉËż�����ÉËż����€Đż����€Đż����€+Óż����€+Óż�����łŐż�����łŐż�����%Řż�����%Řż�����Úż�����Úż�����ľÜż�����ľÜż�����ŕŢż�����ŕŢż����Ŕqŕż����Ŕqŕż����Ŕbáż����Ŕbáż����@Bâż����@Bâż����@ăż����@ăż����@Éăż����@Éăż����€oäż����€oäż�����ĺż�����ĺż����€}ĺż����€}ĺż����@äĺż����@äĺż�����5ćż�����5ćż����€oćż����€oćż����€“ćż����€“ćż����€ ćż����€ ćż�����—ćż�����—ćż����Ŕvćż����Ŕvćż����Ŕ?ćż����Ŕ?ćż����€ňĺż����€ňĺż����@Źĺż����@Źĺż����@ĺż����@ĺż�����äż�����äż����@ĺăż����@ĺăż����@.ăż����@.ăż�����dâż�����dâż����€‡áż����€‡áż�����™ŕż�����™ŕż�����4ßż�����4ßż�����Ýż�����Ýż����€ÜÚż����€ÜÚż����€†Řż����€†Řż����€Öż����€Öż�����”Óż�����”Óż����€űĐż����€űĐż�����ĄĚż�����ĄĚż�����5Çż�����5Çż�����®Áż�����®Áż�����,¸ż�����,¸ż�����Ä©ż�����Ä©ż�����Ŕxż�����Ŕxż�����Ł?�����Ł?�����µ?�����µ?�����)Ŕ?�����)Ŕ?�����µĹ?�����µĹ?�����,Ë?�����,Ë?����€CĐ?����€CĐ?����€ŕŇ?����€ŕŇ?����€jŐ?����€jŐ?�����ß×?�����ß×?�����<Ú?�����<Ú?�����~Ü?�����~Ü?����€ŁŢ?����€ŁŢ?����@Uŕ?����@Uŕ?����@Há?����@Há?����Ŕ)â?����Ŕ)â?�����ůâ?�����ůâ?����@µă?����@µă?����€]ä?����€]ä?����€ńä?����€ńä?����@pĺ?����@pĺ?����ŔŮĺ?����ŔŮĺ?�����-ć?�����-ć?�����jć?�����jć?����€ć?����€ć?����@ ć?����@ ć?����@™ć?����@™ć?����€{ć?����€{ć?����@Gć?����@Gć?����€üĺ?����€üĺ?����Ŕ›ĺ?����Ŕ›ĺ?�����%ĺ?�����%ĺ?����@™ä?����@™ä?����Ŕřă?����Ŕřă?�����Dă?�����Dă?�����|â?�����|â?����€ˇá?����€ˇá?�����µŕ?�����µŕ?�����pß?�����pß?�����VÝ?�����VÝ?����€Ű?����€Ű?�����ĚŘ?�����ĚŘ?�����`Ö?�����`Ö?�����ŢÓ?�����ŢÓ?�����HŃ?�����HŃ?�����AÍ?�����AÍ?�����ŐÇ?�����ŐÇ?�����PÂ?�����PÂ?�����rą?�����rą?�����X¬?�����X¬?�����°†?�����°†?�����ˇż�����ˇż�����Ňłż�����Ňłż�����żż�����żż�����Ĺż�����Ĺż�����ŽĘż�����ŽĘż�����ěĎż�����ěĎż����€•Ňż����€•Ňż�����"Őż�����"Őż�����™×ż�����™×ż����€řŮż����€řŮż�����>Üż�����>Üż����€fŢż����€fŢż����€8ŕż����€8ŕż����€-áż����€-áż�����âż�����âż����€ââż����€ââż����Ŕ ăż����Ŕ ăż����€Käż����€Käż����Ŕáäż����Ŕáäż�����cĺż�����cĺż����ŔÎĺż����ŔÎĺż����€$ćż����€$ćż����@dćż����@dćż����@Ťćż����@Ťćż����€źćż����€źćż����@›ćż����@›ćż�����€ćż�����€ćż����@Nćż����@Nćż�����ćż�����ćż����Ŕ§ĺż����Ŕ§ĺż����€3ĺż����€3ĺż����@Şäż����@Şäż����� äż����� äż����€Yăż����€Yăż����Ŕ“âż����Ŕ“âż����@»áż����@»áż����ŔĐŕż����ŔĐŕż�����«ßż�����«ßż����€”Ýż����€”Ýż����€`Űż����€`Űż����€Ůż����€Ůż�����¨Öż�����¨Öż�����(Ôż�����(Ôż�����”Ńż�����”Ńż�����ÝÍż�����ÝÍż�����tČż�����tČż�����ňÂż�����ňÂż�����şşż�����şşż�����访�����访�����€ż�����€ż�����ŕś?�����ŕś?�����О?�����О?�����Č˝?�����Č˝?�����tÄ?�����tÄ?�����đÉ?�����đÉ?�����RĎ?�����RĎ?�����JŇ?�����JŇ?����€ŘÔ?����€ŘÔ?����€R×?����€R×?����€´Ů?����€´Ů?�����ýŰ?�����ýŰ?����€)Ţ?����€)Ţ?����Ŕŕ?����Ŕŕ?����€á?����€á?�����řá?�����řá?����€Ëâ?����€Ëâ?����@Śă?����@Śă?�����9ä?�����9ä?����ŔŃä?����ŔŃä?����€Uĺ?����€Uĺ?����ŔĂĺ?����ŔĂĺ?�����ć?�����ć?�����^ć?�����^ć?����Ŕ‰ć?����Ŕ‰ć?����Ŕžć?����Ŕžć?����Ŕść?����Ŕść?����@„ć?����@„ć?�����Uć?�����Uć?����€ć?����€ć?����€łĺ?����€łĺ?�����Bĺ?�����Bĺ?����Ŕşä?����Ŕşä?�����ä?�����ä?����Ŕnă?����Ŕnă?�����«â?�����«â?����ŔÔá?����ŔÔá?����@ěŕ?����@ěŕ?����€ĺß?����€ĺß?�����ÓÝ?�����ÓÝ?�����˘Ű?�����˘Ű?�����UŮ?�����UŮ?�����ďÖ?�����ďÖ?�����rÔ?�����rÔ?�����ŕŃ?�����ŕŃ?�����yÎ?�����yÎ?�����É?�����É?�����“Ă?�����“Ă?������Ľ?������Ľ?�����ľ°?�����ľ°?�����¨•?�����¨•?�����¸—ż�����¸—ż�����@±ż�����@±ż�����‚Ľż�����‚Ľż�����ÓĂż�����ÓĂż�����RÉż�����RÉż�����·Îż�����·Îż����€ţŃż����€ţŃż����€ŹÔż����€ŹÔż����€ ׿����€ ׿����€pŮż����€pŮż�����ĽŰż�����ĽŰż����€ëÝż����€ëÝż�����ýßż�����ýßż����@÷ŕż����@÷ŕż����ŔŢáż����ŔŢáż����€´âż����€´âż����@wăż����@wăż����€&äż����€&äż����€Áäż����€Áäż����€Gĺż����€Gĺż����@¸ĺż����@¸ĺż�����ćż�����ćż����ŔWćż����ŔWćż����Ŕ…ćż����Ŕ…ćż����€ťćż����€ťćż����@žćż����@žćż����@ćż����@ćż����€[ćż����€[ćż����€ćż����€ćż�����żĺż�����żĺż�����Pĺż�����Pĺż����@Ëäż����@Ëäż����Ŕ1äż����Ŕ1äż����Ŕăż����Ŕăż����@Ââż����@Ââż�����îáż�����îáż����€áż����€áż�����ŕż�����ŕż����€Ţż����€Ţż�����ăŰż�����ăŰż����€™Ůż����€™Ůż�����6׿�����6׿����€»Ôż����€»Ôż�����,Ňż�����,Ňż�����Ďż�����Ďż�����±Éż�����±Éż�����4Äż�����4Äż�����F˝ż�����F˝ż�����˛ż�����˛ż�����Đšż�����Đšż�����’?�����’?�����đŻ?�����đŻ?�����<»?�����<»?�����2Ă?�����2Ă?�����łČ?�����łČ?�����Î?�����Î?����€˛Ń?����€˛Ń?����€EÔ?����€EÔ?����€ÄÖ?����€ÄÖ?�����,Ů?�����,Ů?����€zŰ?����€zŰ?����€­Ý?����€­Ý?����€Âß?����€Âß?����ŔŰŕ?����ŔŰŕ?����€Ĺá?����€Ĺá?�����ťâ?�����ťâ?�����bă?�����bă?����€ä?����€ä?����Ŕ°ä?����Ŕ°ä?����@9ĺ?����@9ĺ?����€¬ĺ?����€¬ĺ?����Ŕ ć?����Ŕ ć?�����Qć?�����Qć?����Ŕć?����Ŕć?����Ŕ›ć?����Ŕ›ć?����@źć?����@źć?����Ŕ‹ć?����Ŕ‹ć?����Ŕać?����Ŕać?����@!ć?����@!ć?����@Ęĺ?����@Ęĺ?����€]ĺ?����€]ĺ?����€Űä?����€Űä?����@Dä?����@Dä?����€ă?����€ă?����@Ůâ?����@Ůâ?�����â?�����â?����€"á?����€"á?�����-ŕ?�����-ŕ?�����NŢ?�����NŢ?�����$Ü?�����$Ü?����€ÝŮ?����€ÝŮ?�����}×?�����}×?����€Ő?����€Ő?�����wŇ?�����wŇ?�����ŻĎ?�����ŻĎ?�����OĘ?�����OĘ?�����ŐÄ?�����ŐÄ?�����Śľ?�����Śľ?�����Nł?�����Nł?�����řź?�����řź?�����ĐŠż�����ĐŠż�����`­ż�����`­ż�����öąż�����öąż�����‘Âż�����‘Âż�����Čż�����Čż�����Íż�����Íż����€fŃż����€fŃż����€űÓż����€űÓż�����}Öż�����}Öż����€çŘż����€çŘż�����9Űż�����9Űż�����oÝż�����oÝż����€‡ßż����€‡ßż����@Ŕŕż����@Ŕŕż����Ŕ«áż����Ŕ«áż����€…âż����€…âż����ŔLăż����ŔLăż����€�äż����€�äż����� äż����� äż�����+ĺż�����+ĺż����€ ĺż����€ ĺż����@�ćż����@�ćż�����Jćż�����Jćż����@}ćż����@}ćż�����šćż�����šćż����� ćż����� ćż����@Źćż����@Źćż����Ŕgćż����Ŕgćż����Ŕ)ćż����Ŕ)ćż����@Őĺż����@Őĺż�����kĺż�����kĺż����@ëäż����@ëäż����€Väż����€Väż�����­ăż�����­ăż�����đâż�����đâż����Ŕâż����Ŕâż����€=áż����€=áż����ŔIŕż����ŔIŕż����€‹Ţż����€‹Ţż����€dÜż����€dÜż�����!Úż�����!Úż�����Ă׿�����Ă׿����€MŐż����€MŐż����€ÂŇż����€ÂŇż����€$Đż����€$Đż�����íĘż�����íĘż�����uĹż�����uĹż�����Đżż�����Đżż�����–´ż�����–´ż�����˘ż�����˘ż�����€€?�����€€?�����ĚŞ?�����ĚŞ?�����®¸?�����®¸?�����ďÁ?�����ďÁ?�����uÇ?�����uÇ?�����ăĚ?�����ăĚ?�����Ń?�����Ń?����€±Ó?����€±Ó?�����5Ö?�����5Ö?����€˘Ř?����€˘Ř?�����÷Ú?�����÷Ú?�����0Ý?�����0Ý?�����Lß?�����Lß?����@¤ŕ?����@¤ŕ?����Ŕ‘á?����Ŕ‘á?����Ŕmâ?����Ŕmâ?�����7ă?�����7ă?�����íă?�����íă?�����Źä?�����Źä?����@ĺ?����@ĺ?����@”ĺ?����@”ĺ?����€öĺ?����€öĺ?����ŔBć?����ŔBć?����Ŕxć?����Ŕxć?�����ć?�����ć?����€ ć?����€ ć?����@’ć?����@’ć?����@mć?����@mć?����Ŕ1ć?����Ŕ1ć?�����ŕĺ?�����ŕĺ?����@xĺ?����@xĺ?����Ŕúä?����Ŕúä?����@hä?����@hä?����@Áă?����@Áă?����€ă?����€ă?����€8â?����€8â?�����Xá?�����Xá?����@fŕ?����@fŕ?�����ČŢ?�����ČŢ?����€¤Ü?����€¤Ü?�����dÚ?�����dÚ?����€ Ř?����€ Ř?�����–Ő?�����–Ő?����€ Ó?����€ Ó?����€qĐ?����€qĐ?�����ŠË?�����ŠË?�����Ć?�����Ć?�����‹Ŕ?�����‹Ŕ?�����޵?�����޵?�����$Ą?�����$Ą?�����Ŕhż�����Ŕhż�����8¨ż�����8¨ż�����h·ż�����h·ż�����MÁż�����MÁż�����ŐĆż�����ŐĆż�����GĚż�����GĚż����€ÍĐż����€ÍĐż�����gÓż�����gÓż�����íŐż�����íŐż�����]Řż�����]Řż����€´Úż����€´Úż�����ńÜż�����ńÜż����€ßż����€ßż����@ŕż����@ŕż����Ŕwáż����Ŕwáż����€Uâż����€Uâż�����!ăż�����!ăż����@Ůăż����@Ůăż����€}äż����€}äż����@ ĺż����@ ĺż����Ŕ‡ĺż����Ŕ‡ĺż����€ěĺż����€ěĺż����@;ćż����@;ćż����Ŕsćż����Ŕsćż����€•ćż����€•ćż����Ŕ ćż����Ŕ ćż�����•ćż�����•ćż����Ŕrćż����Ŕrćż����Ŕ9ćż����Ŕ9ćż����€ęĺż����€ęĺż����@…ĺż����@…ĺż����@ ĺż����@ ĺż�����zäż�����zäż����@Őăż����@Őăż����Ŕăż����Ŕăż����ŔPâż����ŔPâż����€ráż����€ráż����€‚ŕż����€‚ŕż����€ßż����€ßż�����äÜż�����äÜż�����§Úż�����§Úż�����OŘż�����OŘż����€ŢŐż����€ŢŐż�����XÓż�����XÓż����€ľĐż����€ľĐż�����'Ěż�����'Ěż�����µĆż�����µĆż�����-Áż�����-Áż�����&·ż�����&·ż�����´§ż�����´§ż�����€`ż�����€`ż�����¨Ą?�����¨Ą?����� ¶?����� ¶?�����«Ŕ?�����«Ŕ?�����6Ć?�����6Ć?�����ŞË?�����ŞË?�����Đ?�����Đ?����€Ó?����€Ó?����€¤Ő?����€¤Ő?�����Ř?�����Ř?����€qÚ?����€qÚ?�����±Ü?�����±Ü?�����ÔŢ?�����ÔŢ?�����lŕ?�����lŕ?����@]á?����@]á?����@=â?����@=â?����� ă?����� ă?����@Ĺă?����@Ĺă?�����lä?�����lä?�����ţä?�����ţä?����Ŕzĺ?����Ŕzĺ?����@âĺ?����@âĺ?����€3ć?����€3ć?����€nć?����€nć?����Ŕ’ć?����Ŕ’ć?����€ ć?����€ ć?����€—ć?����€—ć?����Ŕwć?����Ŕwć?����@Ać?����@Ać?����€ôĺ?����€ôĺ?����Ŕ‘ĺ?����Ŕ‘ĺ?����@ĺ?����@ĺ?����€‹ä?����€‹ä?�����éă?�����éă?����€2ă?����€2ă?�����iâ?�����iâ?����ŔŚá?����ŔŚá?����Ŕžŕ?����Ŕžŕ?�����@ß?�����@ß?����€#Ý?����€#Ý?����€éÚ?����€éÚ?����€”Ř?����€”Ř?����€&Ö?����€&Ö?����€˘Ó?����€˘Ó?����� Ń?����� Ń?�����ÄĚ?�����ÄĚ?�����UÇ?�����UÇ?�����ĎÁ?�����ĎÁ?�����n¸?�����n¸?�����HŞ?�����HŞ?�����ŕ|?�����ŕ|?�����Łż�����Łż�����Ř´ż�����Ř´ż����� Ŕż����� Ŕż�����•Ĺż�����•Ĺż����� Ëż����� Ëż�����4Đż�����4Đż����€ŃŇż����€ŃŇż�����\Őż�����\Őż�����Ń׿�����Ń׿����€.Úż����€.Úż�����qÜż�����qÜż����€—Ţż����€—Ţż����€Oŕż����€Oŕż����ŔBáż����ŔBáż����Ŕ$âż����Ŕ$âż����€ôâż����€ôâż����@±ăż����@±ăż�����Zäż�����Zäż����€îäż����€îäż����Ŕmĺż����Ŕmĺż����€×ĺż����€×ĺż����@+ćż����@+ćż����Ŕhćż����Ŕhćż����ŔŹćż����ŔŹćż����� ćż����� ćż����Ŕ™ćż����Ŕ™ćż����€|ćż����€|ćż����ŔHćż����ŔHćż����€ţĺż����€ţĺż�����žĺż�����žĺż�����(ĺż�����(ĺż����Ŕśäż����Ŕśäż����€üăż����€üăż����@Hăż����@Hăż����Ŕ€âż����Ŕ€âż����€¦áż����€¦áż����€şŕż����€şŕż����€{ßż����€{ßż����€bÝż����€bÝż����€+Űż����€+Űż����€ŮŘż����€ŮŘż����€nÖż����€nÖż�����íÓż�����íÓż�����WŃż�����WŃż�����`Íż�����`Íż�����ôÇż�����ôÇż�����qÂż�����qÂż�����´ąż�����´ąż�����ܬż�����ܬż�����Ŕż�����Ŕż�����€ ?�����€ ?�����ł?�����ł?�����Ěľ?�����Ěľ?�����őÄ?�����őÄ?�����oĘ?�����oĘ?�����ÎĎ?�����ÎĎ?����€†Ň?����€†Ň?�����Ő?�����Ő?�����‹×?�����‹×?�����ëŮ?�����ëŮ?�����1Ü?�����1Ü?����€ZŢ?����€ZŢ?����Ŕ2ŕ?����Ŕ2ŕ?�����(á?�����(á?����� â?����� â?����ŔÝâ?����ŔÝâ?����Ŕśă?����Ŕśă?����ŔGä?����ŔGä?����€Ţä?����€Ţä?����@`ĺ?����@`ĺ?����€Ěĺ?����€Ěĺ?�����#ć?�����#ć?�����cć?�����cć?����€Ść?����€Ść?����€źć?����€źć?����€›ć?����€›ć?�����ć?�����ć?����ŔOć?����ŔOć?�����ć?�����ć?�����Şĺ?�����Şĺ?����€6ĺ?����€6ĺ?����€­ä?����€­ä?����Ŕä?����Ŕä?����Ŕ]ă?����Ŕ]ă?����€â?����€â?����@Ŕá?����@Ŕá?����@Öŕ?����@Öŕ?�����·ß?�����·ß?�����ˇÝ?�����ˇÝ?����€mŰ?����€mŰ?����€Ů?����€Ů?�����¶Ö?�����¶Ö?�����7Ô?�����7Ô?����€ŁŃ?����€ŁŃ?�����üÍ?�����üÍ?�����“Č?�����“Č?�����Ă?�����Ă?�����úş?�����úş?�����lŻ?�����lŻ?�����‘?�����‘?�����Ř›ż�����Ř›ż�����H˛ż�����H˛ż�����†˝ż�����†˝ż�����TÄż�����TÄż�����ĐÉż�����ĐÉż�����3Ďż�����3Ďż�����;Ňż�����;Ňż�����ĘÔż�����ĘÔż�����D׿�����D׿�����§Ůż�����§Ůż�����đŰż�����đŰż�����Ţż�����Ţż����Ŕŕż����Ŕŕż����� áż����� áż�����óáż�����óáż�����Çâż�����Çâż�����ăż�����ăż����€5äż����€5äż����€Îäż����€Îäż����ŔRĺż����ŔRĺż����€Áĺż����€Áĺż����@ćż����@ćż����Ŕ\ćż����Ŕ\ćż�����‰ćż�����‰ćż����€žćż����€žćż�����ťćż�����ťćż�����…ćż�����…ćż����€Vćż����€Vćż����@ćż����@ćż�����¶ĺż�����¶ĺż����ŔDĺż����ŔDĺż����@ľäż����@ľäż����Ŕ"äż����Ŕ"äż�����săż�����săż����ŔŻâż����ŔŻâż����ŔŮáż����ŔŮáż����Ŕńŕż����Ŕńŕż����€ńßż����€ńßż�����ßÝż�����ßÝż�����ŻŰż�����ŻŰż�����cŮż�����cŮż����€ýÖż����€ýÖż����€€Ôż����€€Ôż�����ďŃż�����ďŃż�����Îż�����Îż�����2Éż�����2Éż�����łĂż�����łĂż�����BĽż�����BĽż������±ż������±ż�����°–ż�����°–ż�����°–?�����°–?������±?������±?�����BĽ?�����BĽ?�����łĂ?�����łĂ?�����2É?�����2É?�����Î?�����Î?�����ďŃ?�����ďŃ?����€€Ô?����€€Ô?����€ýÖ?����€ýÖ?�����cŮ?�����cŮ?�����ŻŰ?�����ŻŰ?�����ßÝ?�����ßÝ?����€ńß?����€ńß?����Ŕńŕ?����Ŕńŕ?����ŔŮá?����ŔŮá?����ŔŻâ?����ŔŻâ?�����să?�����să?����Ŕ"ä?����Ŕ"ä?����@ľä?����@ľä?����ŔDĺ?����ŔDĺ?�����¶ĺ?�����¶ĺ?����@ć?����@ć?����€Vć?����€Vć?�����…ć?�����…ć?�����ťć?�����ťć?����€žć?����€žć?�����‰ć?�����‰ć?����Ŕ\ć?����Ŕ\ć?����@ć?����@ć?����€Áĺ?����€Áĺ?����ŔRĺ?����ŔRĺ?����€Îä?����€Îä?����€5ä?����€5ä?�����ă?�����ă?�����Çâ?�����Çâ?�����óá?�����óá?����� á?����� á?����Ŕŕ?����Ŕŕ?�����Ţ?�����Ţ?�����đŰ?�����đŰ?�����§Ů?�����§Ů?�����D×?�����D×?�����ĘÔ?�����ĘÔ?�����;Ň?�����;Ň?�����3Ď?�����3Ď?�����ĐÉ?�����ĐÉ?�����TÄ?�����TÄ?�����†˝?�����†˝?�����H˛?�����H˛?�����Ř›?�����Ř›?�����‘ż�����‘ż�����lŻż�����lŻż�����úşż�����úşż�����Ăż�����Ăż�����“Čż�����“Čż�����üÍż�����üÍż����€ŁŃż����€ŁŃż�����7Ôż�����7Ôż�����¶Öż�����¶Öż����€Ůż����€Ůż����€mŰż����€mŰż�����ˇÝż�����ˇÝż�����·ßż�����·ßż����@Öŕż����@Öŕż����@Ŕáż����@Ŕáż����€âż����€âż����Ŕ]ăż����Ŕ]ăż����Ŕäż����Ŕäż����€­äż����€­äż����€6ĺż����€6ĺż�����Şĺż�����Şĺż�����ćż�����ćż����ŔOćż����ŔOćż�����ćż�����ćż����€›ćż����€›ćż����€źćż����€źćż����€Śćż����€Śćż�����cćż�����cćż�����#ćż�����#ćż����€Ěĺż����€Ěĺż����@`ĺż����@`ĺż����€Ţäż����€Ţäż����ŔGäż����ŔGäż����Ŕśăż����Ŕśăż����ŔÝâż����ŔÝâż����� âż����� âż�����(áż�����(áż����Ŕ2ŕż����Ŕ2ŕż����€ZŢż����€ZŢż�����1Üż�����1Üż�����ëŮż�����ëŮż�����‹×ż�����‹×ż�����Őż�����Őż����€†Ňż����€†Ňż�����ÎĎż�����ÎĎż�����oĘż�����oĘż�����őÄż�����őÄż�����Ěľż�����Ěľż�����łż�����łż�����€ ż�����€ ż�����Ŕ?�����Ŕ?�����ܬ?�����ܬ?�����´ą?�����´ą?�����qÂ?�����qÂ?�����ôÇ?�����ôÇ?�����`Í?�����`Í?�����WŃ?�����WŃ?�����íÓ?�����íÓ?����€nÖ?����€nÖ?����€ŮŘ?����€ŮŘ?����€+Ű?����€+Ű?����€bÝ?����€bÝ?����€{ß?����€{ß?����€şŕ?����€şŕ?����€¦á?����€¦á?����Ŕ€â?����Ŕ€â?����@Hă?����@Hă?����€üă?����€üă?����Ŕśä?����Ŕśä?�����(ĺ?�����(ĺ?�����žĺ?�����žĺ?����€ţĺ?����€ţĺ?����ŔHć?����ŔHć?����€|ć?����€|ć?����Ŕ™ć?����Ŕ™ć?����� ć?����� ć?����ŔŹć?����ŔŹć?����Ŕhć?����Ŕhć?����@+ć?����@+ć?����€×ĺ?����€×ĺ?����Ŕmĺ?����Ŕmĺ?����€îä?����€îä?�����Zä?�����Zä?����@±ă?����@±ă?����€ôâ?����€ôâ?����Ŕ$â?����Ŕ$â?����ŔBá?����ŔBá?����€Oŕ?����€Oŕ?����€—Ţ?����€—Ţ?�����qÜ?�����qÜ?����€.Ú?����€.Ú?�����Ń×?�����Ń×?�����\Ő?�����\Ő?����€ŃŇ?����€ŃŇ?�����4Đ?�����4Đ?����� Ë?����� Ë?�����•Ĺ?�����•Ĺ?����� Ŕ?����� Ŕ?�����Ř´?�����Ř´?�����Ł?�����Ł?�����ŕ|ż�����ŕ|ż�����HŞż�����HŞż�����n¸ż�����n¸ż�����ĎÁż�����ĎÁż�����UÇż�����UÇż�����ÄĚż�����ÄĚż����� Ńż����� Ńż����€˘Óż����€˘Óż����€&Öż����€&Öż����€”Řż����€”Řż����€éÚż����€éÚż����€#Ýż����€#Ýż�����@ßż�����@ßż����Ŕžŕż����Ŕžŕż����ŔŚáż����ŔŚáż�����iâż�����iâż����€2ăż����€2ăż�����éăż�����éăż����€‹äż����€‹äż����@ĺż����@ĺż����Ŕ‘ĺż����Ŕ‘ĺż����€ôĺż����€ôĺż����@Aćż����@Aćż����Ŕwćż����Ŕwćż����€—ćż����€—ćż����€ ćż����€ ćż����Ŕ’ćż����Ŕ’ćż����€nćż����€nćż����€3ćż����€3ćż����@âĺż����@âĺż����Ŕzĺż����Ŕzĺż�����ţäż�����ţäż�����läż�����läż����@Ĺăż����@Ĺăż����� ăż����� ăż����@=âż����@=âż����@]áż����@]áż�����lŕż�����lŕż�����ÔŢż�����ÔŢż�����±Üż�����±Üż����€qÚż����€qÚż�����Řż�����Řż����€¤Őż����€¤Őż����€Óż����€Óż�����Đż�����Đż�����ŞËż�����ŞËż�����6Ćż�����6Ćż�����«Ŕż�����«Ŕż����� ¶ż����� ¶ż�����¨Ąż�����¨Ąż�����€`?�����€`?�����´§?�����´§?�����&·?�����&·?�����-Á?�����-Á?�����µĆ?�����µĆ?�����'Ě?�����'Ě?����€ľĐ?����€ľĐ?�����XÓ?�����XÓ?����€ŢŐ?����€ŢŐ?�����OŘ?�����OŘ?�����§Ú?�����§Ú?�����äÜ?�����äÜ?����€ß?����€ß?����€‚ŕ?����€‚ŕ?����€rá?����€rá?����ŔPâ?����ŔPâ?����Ŕă?����Ŕă?����@Őă?����@Őă?�����zä?�����zä?����@ ĺ?����@ ĺ?����@…ĺ?����@…ĺ?����€ęĺ?����€ęĺ?����Ŕ9ć?����Ŕ9ć?����Ŕrć?����Ŕrć?�����•ć?�����•ć?����Ŕ ć?����Ŕ ć?����€•ć?����€•ć?����Ŕsć?����Ŕsć?����@;ć?����@;ć?����€ěĺ?����€ěĺ?����Ŕ‡ĺ?����Ŕ‡ĺ?����@ ĺ?����@ ĺ?����€}ä?����€}ä?����@Ůă?����@Ůă?�����!ă?�����!ă?����€Uâ?����€Uâ?����Ŕwá?����Ŕwá?����@ŕ?����@ŕ?����€ß?����€ß?�����ńÜ?�����ńÜ?����€´Ú?����€´Ú?�����]Ř?�����]Ř?�����íŐ?�����íŐ?�����gÓ?�����gÓ?����€ÍĐ?����€ÍĐ?�����GĚ?�����GĚ?�����ŐĆ?�����ŐĆ?�����MÁ?�����MÁ?�����h·?�����h·?�����8¨?�����8¨?�����Ŕh?�����Ŕh?�����$Ąż�����$Ąż�����޵ż�����޵ż�����‹Ŕż�����‹Ŕż�����Ćż�����Ćż�����ŠËż�����ŠËż����€qĐż����€qĐż����€ Óż����€ Óż�����–Őż�����–Őż����€ Řż����€ Řż�����dÚż�����dÚż����€¤Üż����€¤Üż�����ČŢż�����ČŢż����@fŕż����@fŕż�����Xáż�����Xáż����€8âż����€8âż����€ăż����€ăż����@Áăż����@Áăż����@häż����@häż����Ŕúäż����Ŕúäż����@xĺż����@xĺż�����ŕĺż�����ŕĺż����Ŕ1ćż����Ŕ1ćż����@mćż����@mćż����@’ćż����@’ćż����€ ćż����€ ćż�����ćż�����ćż����Ŕxćż����Ŕxćż����ŔBćż����ŔBćż����€öĺż����€öĺż����@”ĺż����@”ĺż����@ĺż����@ĺż�����Źäż�����Źäż�����íăż�����íăż�����7ăż�����7ăż����Ŕmâż����Ŕmâż����Ŕ‘áż����Ŕ‘áż����@¤ŕż����@¤ŕż�����Lßż�����Lßż�����0Ýż�����0Ýż�����÷Úż�����÷Úż����€˘Řż����€˘Řż�����5Öż�����5Öż����€±Óż����€±Óż�����Ńż�����Ńż�����ăĚż�����ăĚż�����uÇż�����uÇż�����ďÁż�����ďÁż�����®¸ż�����®¸ż�����ĚŞż�����ĚŞż�����€€ż�����€€ż�����˘?�����˘?�����–´?�����–´?�����Đż?�����Đż?�����uĹ?�����uĹ?�����íĘ?�����íĘ?����€$Đ?����€$Đ?����€ÂŇ?����€ÂŇ?����€MŐ?����€MŐ?�����Ă×?�����Ă×?�����!Ú?�����!Ú?����€dÜ?����€dÜ?����€‹Ţ?����€‹Ţ?����ŔIŕ?����ŔIŕ?����€=á?����€=á?����Ŕâ?����Ŕâ?�����đâ?�����đâ?�����­ă?�����­ă?����€Vä?����€Vä?����@ëä?����@ëä?�����kĺ?�����kĺ?����@Őĺ?����@Őĺ?����Ŕ)ć?����Ŕ)ć?����Ŕgć?����Ŕgć?����@Źć?����@Źć?����� ć?����� ć?�����šć?�����šć?����@}ć?����@}ć?�����Jć?�����Jć?����@�ć?����@�ć?����€ ĺ?����€ ĺ?�����+ĺ?�����+ĺ?����� ä?����� ä?����€�ä?����€�ä?����ŔLă?����ŔLă?����€…â?����€…â?����Ŕ«á?����Ŕ«á?����@Ŕŕ?����@Ŕŕ?����€‡ß?����€‡ß?�����oÝ?�����oÝ?�����9Ű?�����9Ű?����€çŘ?����€çŘ?�����}Ö?�����}Ö?����€űÓ?����€űÓ?����€fŃ?����€fŃ?�����Í?�����Í?�����Č?�����Č?�����‘Â?�����‘Â?�����öą?�����öą?�����`­?�����`­?�����ĐŠ?�����ĐŠ?�����řźż�����řźż�����Nłż�����Nłż�����Śľż�����Śľż�����ŐÄż�����ŐÄż�����OĘż�����OĘż�����ŻĎż�����ŻĎż�����wŇż�����wŇż����€Őż����€Őż�����}׿�����}׿����€ÝŮż����€ÝŮż�����$Üż�����$Üż�����NŢż�����NŢż�����-ŕż�����-ŕż����€"áż����€"áż�����âż�����âż����@Ůâż����@Ůâż����€ăż����€ăż����@Däż����@Däż����€Űäż����€Űäż����€]ĺż����€]ĺż����@Ęĺż����@Ęĺż����@!ćż����@!ćż����Ŕaćż����Ŕaćż����Ŕ‹ćż����Ŕ‹ćż����@źćż����@źćż����Ŕ›ćż����Ŕ›ćż����Ŕćż����Ŕćż�����Qćż�����Qćż����Ŕ ćż����Ŕ ćż����€¬ĺż����€¬ĺż����@9ĺż����@9ĺż����Ŕ°äż����Ŕ°äż����€äż����€äż�����băż�����băż�����ťâż�����ťâż����€Ĺáż����€Ĺáż����ŔŰŕż����ŔŰŕż����€Âßż����€Âßż����€­Ýż����€­Ýż����€zŰż����€zŰż�����,Ůż�����,Ůż����€ÄÖż����€ÄÖż����€EÔż����€EÔż����€˛Ńż����€˛Ńż�����Îż�����Îż�����łČż�����łČż�����2Ăż�����2Ăż�����<»ż�����<»ż�����đŻż�����đŻż�����’ż�����’ż�����Đš?�����Đš?�����˛?�����˛?�����F˝?�����F˝?�����4Ä?�����4Ä?�����±É?�����±É?�����Ď?�����Ď?�����,Ň?�����,Ň?����€»Ô?����€»Ô?�����6×?�����6×?����€™Ů?����€™Ů?�����ăŰ?�����ăŰ?����€Ţ?����€Ţ?�����ŕ?�����ŕ?����€á?����€á?�����îá?�����îá?����@Ââ?����@Ââ?����Ŕă?����Ŕă?����Ŕ1ä?����Ŕ1ä?����@Ëä?����@Ëä?�����Pĺ?�����Pĺ?�����żĺ?�����żĺ?����€ć?����€ć?����€[ć?����€[ć?����@ć?����@ć?����@žć?����@žć?����€ťć?����€ťć?����Ŕ…ć?����Ŕ…ć?����ŔWć?����ŔWć?�����ć?�����ć?����@¸ĺ?����@¸ĺ?����€Gĺ?����€Gĺ?����€Áä?����€Áä?����€&ä?����€&ä?����@wă?����@wă?����€´â?����€´â?����ŔŢá?����ŔŢá?����@÷ŕ?����@÷ŕ?�����ýß?�����ýß?����€ëÝ?����€ëÝ?�����ĽŰ?�����ĽŰ?����€pŮ?����€pŮ?����€ ×?����€ ×?����€ŹÔ?����€ŹÔ?����€ţŃ?����€ţŃ?�����·Î?�����·Î?�����RÉ?�����RÉ?�����ÓĂ?�����ÓĂ?�����‚Ľ?�����‚Ľ?�����@±?�����@±?�����¸—?�����¸—?�����¨•ż�����¨•ż�����ľ°ż�����ľ°ż������Ľż������Ľż�����“Ăż�����“Ăż�����Éż�����Éż�����yÎż�����yÎż�����ŕŃż�����ŕŃż�����rÔż�����rÔż�����ďÖż�����ďÖż�����UŮż�����UŮż�����˘Űż�����˘Űż�����ÓÝż�����ÓÝż����€ĺßż����€ĺßż����@ěŕż����@ěŕż����ŔÔáż����ŔÔáż�����«âż�����«âż����Ŕnăż����Ŕnăż�����äż�����äż����Ŕşäż����Ŕşäż�����Bĺż�����Bĺż����€łĺż����€łĺż����€ćż����€ćż�����Ućż�����Ućż����@„ćż����@„ćż����Ŕśćż����Ŕśćż����Ŕžćż����Ŕžćż����Ŕ‰ćż����Ŕ‰ćż�����^ćż�����^ćż�����ćż�����ćż����ŔĂĺż����ŔĂĺż����€Uĺż����€Uĺż����ŔŃäż����ŔŃäż�����9äż�����9äż����@Śăż����@Śăż����€Ëâż����€Ëâż�����řáż�����řáż����€áż����€áż����Ŕŕż����Ŕŕż����€)Ţż����€)Ţż�����ýŰż�����ýŰż����€´Ůż����€´Ůż����€R׿����€R׿����€ŘÔż����€ŘÔż�����JŇż�����JŇż�����RĎż�����RĎż�����đÉż�����đÉż�����tÄż�����tÄż�����Č˝ż�����Č˝ż�����Оż�����Оż�����ŕśż�����ŕśż�����€?�����€?�����č®?�����č®?�����şş?�����şş?�����ňÂ?�����ňÂ?�����tČ?�����tČ?�����ÝÍ?�����ÝÍ?�����”Ń?�����”Ń?�����(Ô?�����(Ô?�����¨Ö?�����¨Ö?����€Ů?����€Ů?����€`Ű?����€`Ű?����€”Ý?����€”Ý?�����«ß?�����«ß?����ŔĐŕ?����ŔĐŕ?����@»á?����@»á?����Ŕ“â?����Ŕ“â?����€Yă?����€Yă?����� ä?����� ä?����@Şä?����@Şä?����€3ĺ?����€3ĺ?����Ŕ§ĺ?����Ŕ§ĺ?�����ć?�����ć?����@Nć?����@Nć?�����€ć?�����€ć?����@›ć?����@›ć?����€źć?����€źć?����@Ťć?����@Ťć?����@dć?����@dć?����€$ć?����€$ć?����ŔÎĺ?����ŔÎĺ?�����cĺ?�����cĺ?����Ŕáä?����Ŕáä?����€Kä?����€Kä?����Ŕ ă?����Ŕ ă?����€ââ?����€ââ?�����â?�����â?����€-á?����€-á?����€8ŕ?����€8ŕ?����€fŢ?����€fŢ?�����>Ü?�����>Ü?����€řŮ?����€řŮ?�����™×?�����™×?�����"Ő?�����"Ő?����€•Ň?����€•Ň?�����ěĎ?�����ěĎ?�����ŽĘ?�����ŽĘ?�����Ĺ?�����Ĺ?�����ż?�����ż?�����Ňł?�����Ňł?�����ˇ?�����ˇ?�����°†ż�����°†ż�����X¬ż�����X¬ż�����rąż�����rąż�����PÂż�����PÂż�����ŐÇż�����ŐÇż�����AÍż�����AÍż�����HŃż�����HŃż�����ŢÓż�����ŢÓż�����`Öż�����`Öż�����ĚŘż�����ĚŘż����€Űż����€Űż�����VÝż�����VÝż�����pßż�����pßż�����µŕż�����µŕż����€ˇáż����€ˇáż�����|âż�����|âż�����Dăż�����Dăż����Ŕřăż����Ŕřăż����@™äż����@™äż�����%ĺż�����%ĺż����Ŕ›ĺż����Ŕ›ĺż����€üĺż����€üĺż����@Gćż����@Gćż����€{ćż����€{ćż����@™ćż����@™ćż����@ ćż����@ ćż����€ćż����€ćż�����jćż�����jćż�����-ćż�����-ćż����ŔŮĺż����ŔŮĺż����@pĺż����@pĺż����€ńäż����€ńäż����€]äż����€]äż����@µăż����@µăż�����ůâż�����ůâż����Ŕ)âż����Ŕ)âż����@Háż����@Háż����@Uŕż����@Uŕż����€ŁŢż����€ŁŢż�����~Üż�����~Üż�����<Úż�����<Úż�����ß׿�����ß׿����€jŐż����€jŐż����€ŕŇż����€ŕŇż����€CĐż����€CĐż�����,Ëż�����,Ëż�����µĹż�����µĹż�����)Ŕż�����)Ŕż�����µż�����µż�����Łż�����Łż�����Ŕx?�����Ŕx?�����Ä©?�����Ä©?�����,¸?�����,¸?�����®Á?�����®Á?�����5Ç?�����5Ç?�����ĄĚ?�����ĄĚ?����€űĐ?����€űĐ?�����”Ó?�����”Ó?����€Ö?����€Ö?����€†Ř?����€†Ř?����€ÜÚ?����€ÜÚ?�����Ý?�����Ý?�����4ß?�����4ß?�����™ŕ?�����™ŕ?����€‡á?����€‡á?�����dâ?�����dâ?����@.ă?����@.ă?����@ĺă?����@ĺă?�����ä?�����ä?����@ĺ?����@ĺ?����@Źĺ?����@Źĺ?����€ňĺ?����€ňĺ?����Ŕ?ć?����Ŕ?ć?����Ŕvć?����Ŕvć?�����—ć?�����—ć?����€ ć?����€ ć?����€“ć?����€“ć?����€oć?����€oć?�����5ć?�����5ć?����@äĺ?����@äĺ?����€}ĺ?����€}ĺ?�����ĺ?�����ĺ?����€oä?����€oä?����@Éă?����@Éă?����@ă?����@ă?����@Bâ?����@Bâ?����Ŕbá?����Ŕbá?����Ŕqŕ?����Ŕqŕ?�����ŕŢ?�����ŕŢ?�����ľÜ?�����ľÜ?�����Ú?�����Ú?�����%Ř?�����%Ř?�����łŐ?�����łŐ?����€+Ó?����€+Ó?����€Đ?����€Đ?�����ÉË?�����ÉË?�����VĆ?�����VĆ?�����ĚŔ?�����ĚŔ?�����b¶?�����b¶?�����,¦?�����,¦?�����€Pż�����€Pż�����4§ż�����4§ż�����ä¶ż�����ä¶ż����� Áż����� Áż�����•Ćż�����•Ćż�����Ěż�����Ěż�����ŻĐż�����ŻĐż����€IÓż����€IÓż�����ĐŐż�����ĐŐż�����AŘż�����AŘż����€™Úż����€™Úż����€×Üż����€×Üż����€řŢż����€řŢż�����}ŕż�����}ŕż����@máż����@máż�����Lâż�����Lâż����@ăż����@ăż����@Ńăż����@Ńăż����€väż����€väż�����ĺż�����ĺż����€‚ĺż����€‚ĺż����€čĺż����€čĺż����@8ćż����@8ćż����€qćż����€qćż����€”ćż����€”ćż����Ŕ ćż����Ŕ ćż�����–ćż�����–ćż����Ŕtćż����Ŕtćż����Ŕ<ćż����Ŕ<ćż����€îĺż����€îĺż����@Šĺż����@Šĺż����@ĺż����@ĺż�����äż�����äż����@Ýăż����@Ýăż����€%ăż����€%ăż����€Zâż����€Zâż�����}áż�����}áż�����Žŕż�����Žŕż����€ßż����€ßż����€ýÜż����€ýÜż����€ÁÚż����€ÁÚż�����kŘż�����kŘż����€űŐż����€űŐż�����vÓż�����vÓż�����ÝĐż�����ÝĐż�����fĚż�����fĚż�����őĆż�����őĆż�����nÁż�����nÁż�����¨·ż�����¨·ż�����Ľ¨ż�����Ľ¨ż�����€pż�����€pż����� ¤?����� ¤?�����śµ?�����śµ?�����jŔ?�����jŔ?�����őĹ?�����őĹ?�����kË?�����kË?�����bĐ?�����bĐ?����€ţŇ?����€ţŇ?����€‡Ő?����€‡Ő?����€ű×?����€ű×?����€VÚ?����€VÚ?����€—Ü?����€—Ü?�����ĽŢ?�����ĽŢ?����€`ŕ?����€`ŕ?����ŔRá?����ŔRá?����€3â?����€3â?�����ă?�����ă?����@˝ă?����@˝ă?����Ŕdä?����Ŕdä?����Ŕ÷ä?����Ŕ÷ä?����Ŕuĺ?����Ŕuĺ?�����Ţĺ?�����Ţĺ?����@0ć?����@0ć?����@lć?����@lć?����Ŕ‘ć?����Ŕ‘ć?����€ ć?����€ ć?����€ć?����€ć?����Ŕyć?����Ŕyć?����@Dć?����@Dć?����€řĺ?����€řĺ?����Ŕ–ĺ?����Ŕ–ĺ?����@ĺ?����@ĺ?����@’ä?����@’ä?�����ńă?�����ńă?����@;ă?����@;ă?����€râ?����€râ?�����—á?�����—á?�����Şŕ?�����Şŕ?�����Xß?�����Xß?����€<Ý?����€<Ý?�����Ű?�����Ű?�����°Ř?�����°Ř?����€CÖ?����€CÖ?����€ŔÓ?����€ŔÓ?����€)Ń?����€)Ń?�����Í?�����Í?�����•Ç?�����•Ç?�����Â?�����Â?�����đ¸?�����đ¸?�����P«?�����P«?�����‚?�����‚?����� ˘ż����� ˘ż�����T´ż�����T´ż�����żż�����żż�����UĹż�����UĹż�����ÍĘż�����ÍĘż�����Đż�����Đż����€łŇż����€łŇż�����?Őż�����?Őż�����µ×ż�����µ×ż����€Úż����€Úż����€WÜż����€WÜż�����Ţż�����Ţż�����Dŕż�����Dŕż�����8áż�����8áż�����âż�����âż����€ëâż����€ëâż�����©ăż�����©ăż����ŔRäż����ŔRäż�����čäż�����čäż����€hĺż����€hĺż����@Óĺż����@Óĺż�����(ćż�����(ćż����€fćż����€fćż����€Žćż����€Žćż����Ŕźćż����Ŕźćż����€šćż����€šćż����@~ćż����@~ćż����€Kćż����€Kćż����@ćż����@ćż�����Łĺż�����Łĺż����Ŕ-ĺż����Ŕ-ĺż����€Łäż����€Łäż����@äż����@äż�����Qăż�����Qăż����@Šâż����@Šâż����Ŕ°áż����Ŕ°áż����ŔĹŕż����ŔĹŕż����€“ßż����€“ßż����€{Ýż����€{Ýż�����FŰż�����FŰż�����őŘż�����őŘż�����‹Öż�����‹Öż����€ Ôż����€ Ôż����€uŃż����€uŃż�����źÍż�����źÍż�����4Čż�����4Čż�����±Âż�����±Âż�����6şż�����6şż�����ä­ż�����ä­ż�����ি�����ি�����đž?�����đž?����� ł?����� ł?�����Jľ?�����Jľ?�����µÄ?�����µÄ?�����/Ę?�����/Ę?�����Ď?�����Ď?�����hŇ?�����hŇ?�����öÔ?�����öÔ?����€n×?����€n×?�����ĐŮ?�����ĐŮ?�����Ü?�����Ü?�����BŢ?�����BŢ?����@'ŕ?����@'ŕ?����@á?����@á?�����â?�����â?����ŔÔâ?����ŔÔâ?����€”ă?����€”ă?����€@ä?����€@ä?����@Řä?����@Řä?�����[ĺ?�����[ĺ?����@Čĺ?����@Čĺ?����€ć?����€ć?����€`ć?����€`ć?����@‹ć?����@‹ć?�����źć?�����źć?����@ść?����@ść?����€‚ć?����€‚ć?����€Rć?����€Rć?����Ŕ ć?����Ŕ ć?����Ŕ®ĺ?����Ŕ®ĺ?����@<ĺ?����@<ĺ?����@´ä?����@´ä?����@ä?����@ä?����@fă?����@fă?����Ŕˇâ?����Ŕˇâ?����€Ęá?����€Ęá?����@áŕ?����@áŕ?����€Îß?����€Îß?�����şÝ?�����şÝ?�����Ű?�����Ű?�����:Ů?�����:Ů?����€ŇÖ?����€ŇÖ?����€TÔ?����€TÔ?����€ÁŃ?����€ÁŃ?�����:Î?�����:Î?�����ÓČ?�����ÓČ?�����SĂ?�����SĂ?�����~»?�����~»?�����:°?�����:°?�����“?�����“?�����Č™ż�����Č™ż�����ıż�����ıż�����˝ż�����˝ż�����Äż�����Äż�����‘Éż�����‘Éż�����őÎż�����őÎż����€Ňż����€Ňż����€¬Ôż����€¬Ôż�����(׿�����(׿�����ŚŮż�����ŚŮż�����ÖŰż�����ÖŰż����€Ţż����€Ţż����@ ŕż����@ ŕż�����áż�����áż�����éáż�����éáż����Ŕ˝âż����Ŕ˝âż����Ŕăż����Ŕăż�����.äż�����.äż�����Čäż�����Čäż�����Mĺż�����Mĺż����ŔĽĺż����ŔĽĺż����Ŕćż����Ŕćż����@Zćż����@Zćż����€‡ćż����€‡ćż�����žćż�����žćż����Ŕťćż����Ŕťćż����Ŕ†ćż����Ŕ†ćż�����Yćż�����Yćż����Ŕćż����Ŕćż����€şĺż����€şĺż����@Jĺż����@Jĺż����ŔÄäż����ŔÄäż����@*äż����@*äż����€{ăż����€{ăż�����ąâż�����ąâż����Ŕăáż����Ŕăáż����Ŕüŕż����Ŕüŕż����€ŕż����€ŕż�����řÝż�����řÝż�����ÉŰż�����ÉŰż�����~Ůż�����~Ůż����€׿����€׿�����žÔż�����žÔż����€ Ňż����€ Ňż�����ÖÎż�����ÖÎż�����rÉż�����rÉż�����ôĂż�����ôĂż�����ÄĽż�����ÄĽż�����‚±ż�����‚±ż�����Ŕż�����Ŕż����� ”?����� ”?�����|°?�����|°?�����ľ»?�����ľ»?�����sĂ?�����sĂ?�����óČ?�����óČ?�����YÎ?�����YÎ?�����ŃŃ?�����ŃŃ?�����cÔ?�����cÔ?�����áÖ?�����áÖ?����€GŮ?����€GŮ?�����•Ű?�����•Ű?����€ĆÝ?����€ĆÝ?�����Úß?�����Úß?����Ŕćŕ?����Ŕćŕ?����€Ďá?����€Ďá?����€¦â?����€¦â?����€jă?����€jă?����@ä?����@ä?����€·ä?����€·ä?�����?ĺ?�����?ĺ?����@±ĺ?����@±ĺ?����€ ć?����€ ć?����ŔSć?����ŔSć?����€ć?����€ć?����€ść?����€ść?����Ŕžć?����Ŕžć?����€Šć?����€Šć?����@_ć?����@_ć?����Ŕć?����Ŕć?�����Ćĺ?�����Ćĺ?����@Xĺ?����@Xĺ?�����Őä?�����Őä?����Ŕ<ä?����Ŕ<ä?����@ă?����@ă?�����Đâ?�����Đâ?�����ýá?�����ýá?����Ŕá?����Ŕá?����€!ŕ?����€!ŕ?����€5Ţ?����€5Ţ?����� Ü?����� Ü?�����ÂŮ?�����ÂŮ?����€`×?����€`×?����€çÔ?����€çÔ?�����YŇ?�����YŇ?�����qĎ?�����qĎ?�����Ę?�����Ę?�����•Ä?�����•Ä?����� ľ?����� ľ?�����̲?�����̲?�����čť?�����čť?�����đŽż�����đŽż�����d®ż�����d®ż�����xşż�����xşż�����ŃÂż�����ŃÂż�����TČż�����TČż�����ľÍż�����ľÍż�����…Ńż�����…Ńż����€Ôż����€Ôż����€™Öż����€™Öż�����Ůż�����Ůż�����SŰż�����SŰż�����Ýż�����Ýż�����źßż�����źßż����@Ëŕż����@Ëŕż�����¶áż�����¶áż�����Źâż�����Źâż����@Uăż����@Uăż�����äż�����äż����Ŕ¦äż����Ŕ¦äż����Ŕ0ĺż����Ŕ0ĺż����@Ąĺż����@Ąĺż������������������������taglib-1.13.1/tests/data/four_channels.wv�����������������������������������������������������������0000664�0000000�0000000�00000150420�14447736377�0020346�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������wvpk˘����G”�����ŕ.��M Ľ$÷Qę!"RIFFt˘�WAVEfmt (���ţ˙�D¬�� b��������������€��Ş�8›qdata8˘�BWWGVH�CŮăń!������������� e`��Š �ď_|:đĺŔ§ŽŔË€"h�ŕĹcDَˇ„‡F‡4Đ0çA1‡‰…;Äp0›9˛'; ě!)Ż&ŃÁŽ®ŚŘĐ—ŹE?U3Pź;Ô őÄMČrj˛ŕ¦~WS_Řc\ +>3>âßáLŇëŽ*ŚÇ>Ѣ¸j±ëă*˛CĆ,%䱂żaŃÉőhâw`BLâ÷|ÄgO5…5)˝ů9‡t'ĘI<g!Ľó°Źb…zh¶?­‡4ńň|hŤŐ;8tLđɱ#Éţ?¦ĂË|x‡˙ńřŽa?™HĆn"-Řw,‡UDy>OŢ`źJÖgx˙9Ť–$}ýQĨ(%Ź`e Ü˙AŞŔÜlä1Ž˙ŤhŔ)ÜLĺ5ĄbÖp?łp©9úüYâŮç0&ˇ¤Äě(Ź„ Čx‚9áxR#ř+:AôhĎŹ¶P˛UŢ+adlůńÉlűA«Ä€ŤL”yagěýxĂ*ç(¦Ăvšĺ6ł˙FűŻĽ]í·}üۦ±÷g<"Ě2O€G›Ăz0CbÎá5PeđúŔŕw$‡VXç? §*É$„­˙I<`čŚ •jůR”íŠĹ3¬äJĆ?±pĺvă+ć-”—úőy-ÝĽÁŰÖÂSż˝ęţŰżí÷oďýŰďŰďÍz˝Ţëp(‘@©ˇ’ Ěc‡’ČČ0 k`Ž&3Á#98@B_cOkmJ­ßkzÎVťďţsţäÜ˙ű/Łô_÷ď,JůČ$\'@brBĐ#! Çx€¸Ĺݸ“˛d˙ú0c†Ô�ć…“ZŢ«9›[bŁzYôîmým{żýŢ÷ßßżî[}A„BAÔ:’ç(’•… •UŞ4¸)súsŽć4 °�¤wHRëÂđ—sŇë‹áď~ óţ6I3Âą}}~ýőůŔüýů÷|óÁ—˝>w:m‡ZüH®G­^ Ň”˘É ™Ŕ¸®#ć¬1‘cb<IH;Úě¶°˝Ö%cZnT»{ý~oűíí­ßz«ç�Mh‚eČHŚô"ĚŇ…”¨ś EÚS˛Ä’Ď0đă»Oňg7>ůű;ţ?ó+Ą>Á܉żfČć»vGô.[ú^OW%tŠaÓý›°ů©×Ăü<ÝeذúĺĎÁwB¦[Iţ<}_¦ň r§ ăŰd§ö7„z:x€÷`*8'8ŘdWŻĄĹőÍZKć˛v´ł»÷nŰ]żľ¬>d# ’"SŽÔsI1ž˘THHwŽŠdn„h]gĆŇgś’Ť ÖÉ9n–ň‹‘~Ż«˙:ü˙ŢóS÷ßçç·|ýó÷źűú?őý Ý©h\OÎ樭eŇ}=LKÄ`†ďĄĽST*¤Ą„ B˝ šÓqˇZ‰%‰°đ9>'dZÚ±Ąí62Í#Ý(—ŰÜ{ď÷ţú}}]»’Ä2…?âäělJB’!™¸$É!`ÉÁôx’‘”Ĺ5»|a>dŽŔ fŞWçč^RÍŕkXQ§7Ý˙[v5˙ľ.vÇż?á5k˙ÉĂ÷Âöܧ–źFv2î”$©•p…4…n€'Ú %ó!Rކ¤˝# çç’ś˛Ö’Ëň4ŐŐFőmë÷ţýíőď÷ľ·{5EBšťb„Ăăb1˘"“RD˛G„ K2Ż\Ľ#ą',ńĐ8ź‘10<«xj˝µ¤mŇĽľşvÍ:sťďţ<ŤţÉ]L ‰ăG|yüăL—Ň?ęŤý\R7¤A§ë‹ő)mă¦@0r-ŽnîRŠ‘W%~Ö¶#Ű׿Ż÷~_żëŞÎ7›Ąé.±Č '˘X¤$í)‰$ ŠČe©Ľć‹wP ýáSçç…<öÇžž)+¢Ďň‘ż±c{‡µĎ¸=š¬ő`ÚĂ×ţůˇŕ°#ŻPYăâ "üë,[?BHćf~Wçá»8YŘä3Ů-=şcŠŘg#˛`ĽµUgďţú÷îλ»;ÍZ‘'‡‰KăžR%IÂgËH‹2§'Ńrb‡âšťí„ JśđDçä€AđÓxTăŁĎ­7mR$,ő9×YŻCüQůđAV’B–ř‡˙űŤ3|©˙šoČŽs}Úüůąc (#óîŕĎŻŐé&J ›>öć;­÷îěÝíĄŠdXb©Ó?U^ÎR‘ć kŃŘ%vz ‹$±1ĹşčÔk_>¨@áüa�ŁČ°ůâ_ĽŹË÷ŘĆž8&ŠjćGĂefO öŔ󌿨~ü~ž‹ßNŮďź˙‡«wÓî‡C+*¶Jäű°ËWoş_ g¸°l“ŞżµŁÝő«%Ą3gÁŇ,KBEú\JńúČź5n¦+~–-Që)‰éÜ x1ŽY’Ć+—1cÉ‘đĘ=Jµ}=˙~bĽFţć8ä%žÍŹ˙ú“ýĎůż÷?§˙ěăď…î¬xŚŮýşěĘŚ-9‘ \4"[4YŞ *Z;ŻĘŽk°ŁÖŁ8YBŤLÚôşl.5g™m߆n Eë)c¶™Qô0lpľźsíSŞ"j–NDÂ,‘͡oCvýă÷ÔĎ}ö˙čÂzţz†·üďý˙~˙ĎSNď‘{Düçö2ĐĘŔ+|űˇüZ›ŹĹS#-Ĺ�›ÍXĄśGа+C{W‘QcMUsš¨fĐ5ĚrÁóUäĘ3ňă|o>Â;ĐZĄŤr Q!éNK|?vz<^˙1V3x¶¤ţ=ă«<ň˙ßŰ˙ďç?ť‘ßţ˙ő ›­† ކ7%žfĽŤÇÎÜaX™…é”PD«Ą¨§mSV<AňbÚ Z *ŕtÄZeíg~ä´žúí‹ręOűpxĄP.a‰=Ws.°w°qž~p}Čáë‡lřÚóř?˙˙ëË˙çcĽmëśÎmü0"ęaX#Ayé’Ů`ŔHC,Ł„f, ¶-;^•VGW"Rłű!C0†‡Jşy+vÓČ ¤uSRŤć‚d6{ľćNŹgŹJŢ|n‡_OÝ"ą˘ŕŤ˙ńí˙żá˙/˙ü˙÷˙Ć˙çC>Éâ}đ‰ót_ŇśĂLâ°ČRA 7¨©Ě*ąŽ‚ô”«kÓňdß”% ¬CN”‘n´c˝¸!#"*ÂM1ęyťJ^Ëô,Üń~č÷Ăě>˙é{~â5ňéűţżŰ'�µ ŚóźiÚ„´ĽĹ_‚ ĺ11"˝–ˇP¤ĹµckS6RqAŚx8fÁ9YZ۱,É "|a4Á-ŻxĹŘź…S•eőéÍ|?z3/űř5?§Ćçż˙˙ć|Ć�v>9˙źˇÉáGÄN}R‰$eËGµ‰dŽ€S¶ąb:5Coş‚©G=ÎĂ©˛’˝±hDrb¤LN>ˇ)X±n<«Đ„ĺđ-ď‘çżň9ůýĎvý9ýçďźď˙ńŘ ŐýGÄőUŃTAĚŐŮRšµ1ňh ­ÉUy0§‚”©MIŞ|‰çęZĺŕQ¤UI•¸<3É79Ë O,<S”x:âÚx|~\ĹMö3óU¬ßű9÷˙_˙ő˙9°Žlź>ç?Ă|(“VíBNśÂYű -nđ€(ČŠ(*V·˘Ż±×$Äť‰<i`ÚXkiYôdt¤x’0±ĺŞ_ľBł ĺńßű¸ňţqqďßo>†‡~ oüúă*éuĐFyçSĆQ*ŽZíeFę<„Qđ©(")»ľ6żF= Ď9]p•g$ٶmSĐQ I)= • .•{*łĹ‹žŇ›v|G5dääŽoţů˙ýýJ>Ź>Ěüńq8smSµ<Gđ™ć‹Ż]O›n)ˇA�š)%ČŚ¤ťîl»mkh…Řě¬ EĐňÇÚ¬\Šť<EŠ‚ CĆҲ±ídŃ<mHCďϬĽţĎů˙ţ[éůä$űĎźń4âśšĹ{VÄ ŻúRő‘XMAŚ:‹¨hrR¦–˝ýµč®x#ŚĹ±SbY^o˛š$©ô„‚MéXŐ¦(Ś–ŃSŤV"5}=âóéëôŐß9?zĐ©˙ŚĎŘ"cě‰,‹1¶ľęZ¸¨9Ŕ,H;˛łłë˝ĄmgVçą2Ý‘ĄtąąÓ”JÁSfX°*í8ZËŽHž‹)źŻÇţć¤/Íüż÷ż»W˙ç˙|<:rţt”»XG; Ţ 6»~ŰlÄĹÁŔ““ࣜ¦UŐu˝lF’°šťgĆŃęĘű0Z•¶h—•´¸áŕ HP’<—µväĄ)HÂ"Ĺ•Yg´ ŢŹ÷ jÔżŢűăżß®hüç??ăń!b͵K´dö\ŮÜąŽDcˇC¸đ„Ŕˇ±Ľşö¶,-j§ Sđ%)»öjyÝ3wDˇ ˇKťDWůř/˘őZ¨:éN6ę‘Dh3—‰+jwţţůÎ\î㊿˘}uóăűo˛“dň'ţç‰Č†{Á&ÁĘMełŽ«%Ä“ 1}DCŽTŮ»7K†)˛išBQ0$QqŮ”Ě*VT :pgĆńĐx…4?Ž`meméÝ$úŽç‘@‡Ôť˛XY•‹~îyĘ%r=ŢCeŠeT$‡ű9}}„Wçßüéý?ů˙×˙»îýüźÓĎř¦Ďóź±çI4Ôţ(:ś 2IËŢis:C€Ďhš2Š:*¦4Ek×5V¤M,ę(D¨µ´LRkk™"|â”rr–˝¬Fv‹·<®¦(P¨“îĎŻ3î…Đ÷,»GvTšżź:«śäĐ¬ą±¤ ľĐVNüwvpk4�������������ŕ.��M€$2=l�������������Š��˙?p÷wvpk4�������������ŕ.��M€$2=l�������������Š��˙?p÷wvpk4�������������ŕ.��M€$2=l�������������Š��˙?p÷wvpkf��������ŕ.��ŕ.��M Ľ$ŕq÷BWWGVH�C_ń�ďó�ô* Ç�� Š�đ güD×űĎLň˙ďĺ˙żŻţ˙ý?˙˙Öą‘óůä˙÷űyµ8©[n x›­2 ő| §IW&đ�NŁ€ŕ(­réjŻŽJO‘"š�8…ĄµcR´Ö˘ÁŹ *!ŠĺTÚb­v?GözÔöĂűĂŇÂĎłuLł|ÁtbR†@䤤Zś{ÔÇăĹö¤ž3ĹYŹ A×™»źăź˙˙ö˙żë˙ýó˙h®ăóŃ˙ĽŹ?Ŕőčć7ě'îísFQ‹Y®’5=NdÁŔ7�iÄÇ{=ŻeË“¤”s`ZµÖ’©J†I(@ÂÇPĘ‹EŽOtc+ÜęŐ98‡?¤ç¸Ř0żäžĆ†dD’u„hâRQZ=›aŚ‹7°×ńŁYĎoĐ 3¸ň˙÷˙ßËďź_ŢkőÇË˙ĽŹ_ÇőhM{|m\vđ-¸í¦Ő?¨X‘SÓH‰Ź bËZ©žŰĘbHŃaJ$đˇ@I=gm[ËŇ=—ÔŤĘrt ŕ íWP^Đ“|mnc±€¦ČČ dÂćŐ^•‰ĘeâârćôjˇZĎwQÍňđýSóő\îÎ9ý˙w˙˙wí˙ůĽ˙|\Ç‘ćÇิŃÍ ˝E`ݬh®vĂ×öhěᇒc'šŽ(-×Ď×¶d>‚„§(bdĽ:­íSdTř˘Jڎ .mş±bZ5ĺ&ŽAŤ±( ^1cm¦ü8ˇRâćíD=RšO'žţđyżëż=Ž?Źz>é«ăŤm­HčĺŮáf_٬ŞWD¤#,Ey{ď:6‰„˛F;IHS!.WÓŰĚŻĹ_&-á˘:l9uR$YšRLĎĹK\zX3\sJśôCóa%µĆĽî8ßő !?~á©ÇţsÚßţÓŰŚŰD?úŕÇô ř:lÂŚć¦eşŃĄpŃ”XTKRĹČć­ŞŠB5#vŤîOŚ\-鉫rIôÔó5„=9Ub †¦ÇF%šGî\S‘±(”U˘%Vz®Ç"Ă×ăĺG{řIĎĂÉźŞI˙ň˙ßŰż˙żŢi›ă?Çó‰|Şú×iŤ\y~Ö¤J¸3H aP"M±%Ő"»#ÖWľn;==Ś5ý`I‚F{ÔHôPŠ0LŠ"'‰¨*XB1ׄë†u'®P§HqP‚şăÇŢɨĺ—ůśľűýőźÜ•ŕ}ŔÇCďÄ|'îsĹ«GĄ¦éĂ%¬%­"–Ti‡$ßިO-óëjk-˝ç’K¸ˇ9ŮY¨©B) Ń2]ČP ˘…ěC6$‰ŘcŢőHÇöw‡|Ś˘É'‹ÍóäöüůţţsđM@2�5Ć–í —Ć7‡p÷A,8›z ×ÔňCfč’Ʊ7¶7­żwŰşűë˝mSÚc‘Ł Ą:´†(őŔb9ăIFFV‘Ţŕĺi•>0řp fřçă˙“ć<đ2Ç˙‡-1í§‡–Ş#—jÔĽ•ýŘOÁ•ô‹2aeťěŃK.ąp¸ÇNşhľ×^ý:˙Öożt•—öb$jÉ˙lÇĺúçű±` :m¦‘ösŢ—Šśö?˙÷?%ÎBXĎ= ( h3oÂ%}x|±sö©úöQWV4,•Űüă® H)�Ž3ŔR3Ľqi-ůĘħţĺ§•3ś-ŘFyďČ~©óJÚU|”úóĆ_Ú…Ő\ôĎ**`łDžÎ¬ń­(%?+¤śÇT b\Đ?×Ř_d94 QKŁ›´\ŘwŠőPs;V¸(kb=6Ţ:˝‰aá& /Ăg·có™ăĄçţg©]¸đá’<ۇ^p&“_¸‡Ţ…Óá҇îÔg9Ô4Ćo3eőô‡” Úďîű´T˙%Ëşę‹ËçýŽŹV\ey»óžľ'V~O.Ęőä’–<őć´_§ť:›t¸ç…EEôäÄ2ĎČ%ťă,Öúń%רčg•Ü~řÂçßăľüĺaŐXxI‘´Ö”Č]BYsÁ®Ž¦ŚłŚtF>Ôë—ŕ‰řaĚH?Lî(ÄÉBOů@ëţßú)rxŽ5Důë,ÜaDĂ„ćJÄrý ¶Y°Á&őiĂáźýlĽ2;MtńÄ,…‹h?Ţ˙$’ýsM‰7„!‡ <Ă/ţŃúç—®“…µ~^TĆÍł°t‡u(ę‚RáIÎhć Ůiđ® ÷ÄE?.őyŤKTőQösMIöéSě°ŃY¬hzšŠó;g{)V›ŤK#ëż$•ŢŤ5¬ea^ů˙Ňůď·‹6â¶uw#ĽŞńůmĄÓ擜ŇX& ~ĹCĆĐçŢá˙ţ”›ńA —ɧůńyúhüŹTĎv Ľ‰>…:ÜĐŹH„ Ť¦©ŕ�SE“ @ŁAĆ÷A€0é4=sh đs™*$â ëa$ O×DŚ’#Ç@î@Iź™&:Ě(‹�ŃŹN\ţŕwâČ3,rźÓĄ˙Śoř±ćPS$'Ď,&…xvśů…\t:BĂrHÖ5TÔÇrţŻ÷|Yď˝ÂîíŻm­˝ÔţoÓůëüfo—cĎ÷oIçuŚ|H%ĆÁ8ź9' ç$ĐĎr>ňěăăJ:1' ň„MţQ9Ł:€DĺSĐÁ `hp R -r2"vĎËţVý*ŘNGĐTáeX6Uąąć†˝·éşÚ7F…˝+2ú®,ýşďŹß«ÓŢqŤë·ť}ŮĄ­mnk/­3o[ků ZUşËh—¤Ď§ĂĂ˙Á:AŠ üÇ&řä¤ćěźyé¬ÉóyĽ&Atů�1ýôç)¨¸LÓ†ŽP0ř‡Ç0ńĚ䟡†î�aŕĐ….fÜ:ŕ&bZ^Ȧի×Ü:ÝĽľĂc­ć ˘ŃÜ ’CŁc¬=źŹ`  đ”Îźíů? Ö‡Ę?ę˙śÄěÔ“ Ś ŽŹÁ >'JśĹ,>†0•±ýhTbnfٵ0ó۸gö’iŔ8ň‚J–ś.‘™rü�ŕ1€Ç�2źc �Ŕ�8PNp’)ÉѲmW۵«íőÚ¶m­eYN#-ɤ$“¤(’$IH—Ó“ś.'N�hЦ 'ÁS–ś‚íÝ& 7Ek˝`Ę0y|!6%gˇňi¤$±<ľ%M­sCĹHÉ$¤ąŽI‘Ń4±}uÇEˇú8±źŐL!a ŻáW°źKÓ0×óúą`QS;ŘťŻÄBÖ„zęO:Â"ĹFÖ‰dެgáCŁëéŻÓăá ăĹÔ˘"v†Lűń śBä#{óŕ‹č ÄOM˙= ď‰č$€©LOĚŚĺá<IŢQ{¤4ĹC˙SĂ>ińô|vŘAáł3ˇ˛XCî‡8ÔŔb Ďh¬ăÄ3ŢĎ‹˘$({b¬PĹYM 8ÔxT9–űXÇMÄąXóIN,܇fóßĎçú‡CyÔó‹‹UâŃ›Ňń“ !ř~(–!Y°đĂĘĽ€™?~nH ß<üˇÚŕő,?UJXžÎŚŹĄç–Ú)mÄ;…ŢöéSŹ×ÓHą¶taŠĹ-&©ÄÇĄşÔűń¤Ĺ(б‘ö8ŠFľ0ťé; ŤUţőŘh±°�ă’’ś.őä÷)DôO­Ďš:~JQ;86ÔÂb!w;\Łąô Áă:ľ�¨x~.=Ó‚ö¤_ 8E|áL)˙7GGÔÔG‹Ě˙çMBË÷?~#ć=ܸ ńŻ©PŽ[2¤zöp/í‡_ 5v±§Ž•˙5ę6ĄJÇ” ľ.Ě!:‡^?9ý˝îyqź¬#­‡[R°=2™]ŔŁö˙˙ü˙{đ˙_˙óő˙ďë˙˙ý ˙˙űµż˙˙}Á˙żŻô˙ď‹ü˙űf˙˙^÷˙Éü˙Żü˙ňĂ›»‹?ůŁc~űăÓW9÷‰ţöŃđúëřc7€Ď2ä18ě/ănĐe ćýđV{W¬›[Ŕ8f=ÖóK”ËM;Ó˘$1şŠ¨yÍ-ĺ•Ě?6śiď@?ć�ôÚť€Äu×ĺÄuŚ˙§óî„ ŕW—PxŘ•_D6—GĆH˘[ŔZPśĽ7żŤžJ®˝ýW —˙˙î1Ç—8eŻ‘«“ âúŹBvŽôe¤~…}ó‚ô7_{ňŕ%~´“$Λ˝ä >‘öMµĹ1"™2ŔFF§•>B€gěĚpŹ‹ń+&»wpąÎĐýÝ/ş]z•Żkă>ďŠä-Aę•ßżł”đ`uO*‰”Šý?röhN^>ŻAXđG9B‘GjnzfŁ\Ý0űxČĐCnă傍€‘č*-€*!űçÄ‹(S }Ď1sż¬=ô i\wKh;šµäJ]‘Iěc/X»źsż>Éň=:đąE™ďěa\—óc†j^S€ź*>žóůôŁĘd¬DR1şŇăťšR>ŤPđGˇQ|Ę0ŕCȝОOł$_ě—íó×^5ׯď^Úfµßš&¨ĚQŚGGň))ˇF—d,3Ő»—¶÷YÚ^ٲK›>Š;ČňT‚µň,ŹKˇĂăť�‚ěyh"P€O�ŽđÇiĐ„âÉś(ć3ťsrđ€Ôń””§TţśF`„JĚh(ü0™‹ZyZšÖE^ńc ÖźVŕČ‚.äŮśö�·Bµ“Ź—7>‹ŔĚ"&Ł’şc–¶UŐźmä«x˝y—ŢXnĹ˝ ›\ĂV݆úR98ͧľ)ŻK”×qę=¸V ˝wśw ÖŽ¸óžŞýwvpk4���������ŕ.��ŕ.��M€$2=l�������������Š��˙?p÷wvpk4���������ŕ.��ŕ.��M€$2=l�������������Š��˙?p÷wvpk4���������ŕ.��ŕ.��M€$2=l�������������Š��˙?p÷wvpk* ��������Ŕ]��ŕ.��M Ľ$š` ĚBWWGVH�CsČř�Ĺ÷Ď÷ o ů ™�� Šs�ŔŢÔć~ż°ßxëŻ×5šÚŻąkňě˘ĚvŔ{”"Pý1édnf�Ç0ĹŕËáB€ŹůĘN#8|gzĎŽSîjčIm*&Ń®Ĺ~l0DŮmŞŽ)^K�…ŤÎ™^óIĚzAZÂ6Ľm.ăđ•;*s~`h`IźÇXe´7&úŤl©l÷z‰f#ľőňđ<T8iˇ€¨„ĚQ€i$Ä<N99Ś<ł¶ĺ D÷hÇ$rÉďŚIź�żéW\śwýECŁK`;Úű‡âşd Ô‘9 Éď™SŻu e“3"şÔáiií!WV‹|ýâ$c¶ńzŕÓ¬@:ĺŔ �ňó<«�‡8Ä~̆«LQ ż5Äë ňEA6ŕđ2±EęÝ`ôĆŰLs`P`ÜŔBËSôcĆçď$š—ą69ŰFüŕu0~ŇđR�@ß»×Ví/ĆjÜ»ˇ+`N]Îç¦éŚůĹýÔďhNä ÉÜűQڎEŮ|ö“MKčáđĂěźA™‡čaEXůŕ•ýi¨˙ł?ĽcköĎz˙|ŞŃ= q›ń×aĹŔ!‡–4&±ˇbÂÉR0K™ĐR‰$ PŽÂS2;N!Їá9HžažHD†?śËŇĘ<–7.8ˇA^˘ťÔĐŕ|,Đ' Ę,˛€ć*ˇ%tÁ˙8>/ĂňlĽ)ÂÄá~EiÎ%ŘŮqĹ\ü ĹYCŘ“B;?W'±–”Câ rišˇôdʬ#RXN<Ěé3u§BϵŽ1Ě> áęaż$;W’a™T?T ™2^±¸1Ţ˙óU — ¨uŢT㹣t±‡ –¸Q:7pő?»Hö‹P1ÖôCÓpAI^ÚgQÇËřŻę®™ /±ÜÁ^ˇ*AĆÚ\żá…vlNXđI‹&ß)Íř#ę5Ł'Â<'\Đ…”™ýs“ť5văátŃŇ;1¤ űä[kĘÓz“ÄR §ŽüŻĎЍ§±Ť7ąřçčá.´¨€cQ[Úáß ńOps–€ľ„ĺ&7^ĂÂkIÖ|:žGt˙ˇÉ‚úÇďVžĘéˇ%Bă4ŹW¸Ć.´i±ß~¦8őQź cu±±%ť—rń ˝‡Ľ›‚ŘÜ0TŽçXłĐdĎâô?™©‰šť öC–ôrbeŞĚ(ŽRlŕwąG]XцÂÉ_¤ďŕîÉž“Ć%aŔS‡O´9z>•?E4d¸ Cdfâ?ŃăĂ˙$K\žŁxDxAqDňšâ ¶ęɱ‘§üľ$s wňÉPţÇ~P)zzř!4S0f$Ń?X`0@Ůyj`BaI€ĘSáđÁÓ‘¸Ť¸ë;ÜG3Š4đ#>Y*ˇ‚§÷Ŕxë˙DČ8%z3 $ű7¬ÇFź;0Ćš>ł0pQläŰçąń«%&ËN–Ďuľ 5Ô&ĺ‘iŚIYĂP %N9=ÇRÉé€ŃP…Ľ3DĎ®Ţ]DľŹ%tFRg™±ć^$©JÉŮřčsÁ_,}RűXxňŹ×Á-g8ô€ÁN6syčÄ)hd?WÄĹ_@Š˘D(üzT!ˇ&î,†1Ţ<hóÉNş¸đbޱÎĘb™Źď±#J‰'uńžK]-Í5Eť_{=Ťőq̧ăgL=wieqMîĐH}đ™á˘źkűź°ăgVٵIź—¦~a,tđ Š2-¦V ÷çëůń)Ëű„Č„eśaQ¤ÎâĄă–ŃĎá9_P‰=‡!`Čü§>{ţ©¸9üd$NPűÄ’ÇFżtÉĹ?ßă+ź…EpŠSjŇ/S„źOe˘ß1ů¬P?w:r.ÍěÁ…qŹŠm¶Šć2n oTEv‹ĺSšC*ç]Ú%ąQ_|ĘâůX~’ţ7ÇR­˙ń>Ý˙çTźö˙侢îßvPÜŔ™ČăÉ”y Ş ý#B¤‹!…É=\¬ŁršOkrÁuQĽŁ‘M2Oíźe“}éőˇ7ĂW°¬§ŕvťńÔ1"uélŐ͸±i9†É/“,wJ¨'#–R‘ÎíĐď°†ň}č8 §çŤ—^ذ?ôwFžö-8Ed ><§¦¤'űiÇÚ„ć2f–çŠ\ĺ ŔŤ;ă“͢šÎ§ZTh8řě§Hť #4Ca/j¬{j¦ş¨)čzř7—V.ýO˛§sĎÉţGĄÄ;Ç äQrŞ0&5CŤµsZ2żŃe’2ü÷ ?ÜOpOĘL ‚ŞçtńŮ@^3)VEŤG<Ř)şă"ä÷¨ÂÄ <ĘŇ0aL:ÇŁuŹÇ‹žGţp oóüĄ6čYBí1˘§GÄÉ>Ńsçg`…4Äđ?ëBYyËŹ›Ťxň˙'o=_}źąX3*UţBE‘™Äsá¬SĎŇŚŤ¬,ŠXhÁ!aźŹI^ĆI/ —T¨e—+ĆĘË˙Üsŕ]_ÜCjđďŽ`Ó I=IÁĎćÄ|.†šËŹĺ9đꀩ`Aůo>˘°ÁěăÂt?pčYr5ěź!gt¦ý ÎJĎúłLöąĘ>Ĺě™ép§X˛řĂ÷J;c8hɢš^Z/D#Ľ÷0áfťKsGC<ř řĎQ 5q<LsôˇÁâ;„KŔ“ĂOËPtőO-7OBó°Ăšă;‡C {¸ |áx73t‰o8Y\heR,bśD?/řçů;Yhä xXgN–C™˛žPď¨;%•Ír±0OYVs ·CpP¨BŢ}źśĐđĹ\Ă™b§`\ň~<[B5Ú!é;ľhF$2ĹŮC]4J,r(DÉArôżŁţဌűÔk'5óÜA?|y¨á”č3KË š…ł ,h”ä`'č ‘Ňű'bF;$&¸¸XÇ?R|‚;$şf‰e1EhŇ(="\6Ç%ý1¦î˘‹w@R4Rs5°€ďsÍ/ůýą3® Äó>ßFU§Ść”ÖŃśzâ5=Q&¤ťą`OTůlŇuúfś Łw,÷!Č©öˇłřço(lĚ5UżÂyA€Ф.4¶�ş e&–q żBůÁ•¸ĐŔ#~x’Óž‰ŕ‘;&‡Ć$^Ká(´xÂrÍ $ŚÉĺ©vj8ZeĄŢ#ůČ…6·Řĺ¤*ŐÁĎ/Ćâ9é†$Ĺ,ăéd+»ĐˇĽÝň! ™Ů“ÔŻ)ę¤W‹OQĆ:3>RÔL‚ýˇQÉJĂđ„ŇôäŹ×„;3š@ź3Dů(pyě<„ŁýŁ!Ĺ™č=<„'čh*ň*é„Xűs š3 NB.ľă!6súčŔk´“xÁč>¬„Äa 6>č ¨GÜGöE1´‡AH%“Ô2˘yîŇŁŔ( ź‘Ăú€š}”@>ĘÂOÜD€‡”ýHřŔC F˛O$rĚNŁ:đ?Ę©‚™ł yŘa!!6FV‡<fgÄđŞŤÍ9 řp©Ož%FcŹNx0|ŇĎ ]~h\B1\„Tť±C2‹CŠ&Ë™ěq ĂSŞ9‡~T“Ů|µŘ0žCe˛ Áb>äx5l8ˇâˇŔůC‹gŔaSʧs´HŹ!Ť. LBÍď1‘ňň ™d‹@5 8ě9WÇaüŚ€Ł^đP`ġQč9 e†0/řđŕó‡:°ĘůǦ@ěŚ*8’łŚpů0PPtf0cgij,ńů`ćt±XĽ±xÁ0*^ećÔÁٲ!¤pˇ8Z/‚*ËYR»ŻřQ­I,Í«ě8ţ!¬Ŕ?�˙<€1;]ŤWńX óĄyvŚ O#É[8ë=¦±(*6žôQt0'ťË‰×ŚCS»j†a¤Aü“¸!„b;ś2Ń‹ĹP¨‰™É˘ŕ@°P jŽÎĆMřˇž~ŠŁţQHLřÁBAĚĚđŕ!†Ç}fb6, ś±ŮKl|¦T˛śÁn¦QJ3˘~ěŚ=p>`óµ”_e‡ZRk~ř 1qńĽ ţ1Ł<´8ĐL?ŕ„Á†y•¦/QŘIĎÇŇ晆.i•ękś95˛KŔgVíŘł¨IU°'ýX>'¦µ35^N° ”ťęw*ýÉ\áÁÎâ cĆŹELE;Ç+›h!*;ŮIhf#٬‘éÂ8s´!Ľ8>ôÔ„î<°Ö8Ö=´˝43łŘs ŮXH)ăŁu^+†M8xs7رx¤łČOń<¤yt vđ˙wvpk4���������Ŕ]��ŕ.��M€$2=l�������������Š��˙?p÷wvpk4���������Ŕ]��ŕ.��M€$2=l�������������Š��˙?p÷wvpk4���������Ŕ]��ŕ.��M€$2=l�������������Š��˙?p÷wvpk�������� Ś��ŕ.��M Ľ$ĺŞ^BWWGVH�CÖßí�ŐĎĄĎ�)�� Š*�"n�7€‡&|ŔÍÉĂ bŔźÇÄ Ě|f€±Ń1l 9ń˘Kľâžt"„J.űäE<艑?J(�G>Ú1wܡđ€ç�ô‰{Čp cü¦×*|Aá‹éö™‰×žtžŢ‡ÚĆŹ]”á€84Ř~„ĘXEF×r<Vť%C'gE~-ţP‘Ź456ĘŤ#bxú©âyĆVĂ`Qń‡49BB@Pá0’‚;f&GA0€áĹžz˝ą,aćëůŮÁ> ËŮI–©îb¦Č\›Ë«Â„äA+›ó0ćŻB=T8ý¨Ă�+ݰ3ÔN,좔Kčď#¨ř‡ąđa€ŹEQ›ĎÂ>“/<1/V'č‘ĹA†ăˇńq3ăgD €Äf®qKŠVÇY‹™kCâXűá?H)rŻ[(–ĚÇCÇ ÷~Ž(,>v‰Ź˘3Ä.xeź!¬‡°ŔC,ŚŽáQp9đ!†Őňř!HĐĘÉ;‡ 5ŕŕĹć ”Ě'ĄxĆy˙¤ˇ‰ö@ űhQđP yF/`0!Ž›±w†wĚ= crřçshdőp‰3f8ź ‡YşśXŹégßGĎŹ †žSk7S,Pe` Y›O\Ňh¸±2g8‡šÉŔCĂ'„?(č§DŁ8ŐĐÎŐPiüĚĆÝ=D)k!Ť±Öß±L?ôř!VŽă/a¬Lŕ°ĂsŕFZR–ó,ä9ŕ3qŕź1‹ßĽśÄâ"Ŕń`ů‰^%$<PÜC8Pńž]ÄđXŹBc M"đçÄ´Ě'a‡SŃD% –†×äxd’Ď=´’O\€ňśXUˇQđ3řj&ˇ8đ™>Cč`ĹšMAĆÍ4đ‹ŮĺLECäC,&ŠÁ…G„'ÔD|0śgrř ‰ Śľˇbaftř€"źČÂpŹ-ÉÇ ăHž‘ťĂě!ég<Tv ĺF–Ę»?P˙!q Ź6Ó § ÷"t( >Đ{0h˛‚q‡†yÁvřš.¦ŽKŁt#/íŁ—î;©–ŘR ¬{ˇA8{ɤ{̱ y ő. Aö@G#q˘§€ńPđÔÔ¨â!®˘LHdFĘ>OÇŘÓ‹*ÂZ�8~(<00ĹśŢö ¦Ő#Ct°ŔVĆBC8‡áČeâů;ă•…1y!ý¸SZ‹í€ęţđ!Ř™ěĥϤPp aą†đśjBO˛«,¸äfÎa°—ĽçOŕ<˛ł0Úgó¬…ČOvbŹB(<AśÉ¤Ă™ţÄ”ŞŐěŕP=„Byž j0Ô‡â9x(O.eŤxČ݇V Ť<©őFŐ”áhQŹÂcň€žPËX,ŔÝCv˛=0ô‹ᜪ{ fóÉ;„ßţ˙ű‹ţ˙»˙˙{ő˙g& ţżŹ˙˙wvpk4��������� Ś��ŕ.��M€$2=l�������������Š��˙?p÷wvpkV �������� Ś��ŕ.��MĽ$ŞšwBWWGVH�������Ą�ý��Š�˙ô˙˙ţÍý˙ű÷˙ď_Ü˙żm˙˙ţV˙˙ţZ˙˙ţZ˙˙ţ‚ţ˙ýü˙ű­ţ˙}ź˙ßí˙ßwú˙÷ľ˙/ů˙wË˙żµ˙Ń˙ýňîżöú+ä[ľŕ>čŽ;nw×mwÝvëÖµkW.ť9rĐŐÖŐŐŃŐÖÖiu­ZŁV+E.É"ôOďxĎyŢó^çyĎ;Ţóž»a†1çĆť›aÜ™3çÎť;wnÜ5Í6dČ›Ě2hĹb±Xl˛YLC&[@I T�p b88…@@ @�¨…âpOŤłČôd âä„Đ÷(‹FH¸‡ś˛h–�4‰ćĽ$ŐăDâ†?fZ–3et#DĂSÖ˘Ëňť!Ü#PkřsYźűŮ „ZÓcJ<Ő4Ćěç2 $Ĺf<#y.6*Ő4FĎĹ>ć!Ď„Ä%Ůy‰/c‘éçţç˙ő˙ß‹˙ďý|ş™“{˙âyýôörÖ‰˙Ţ‚†]íčŠĺĂĂćřˇsSä•&t¬ő˙§Ő2˙ĄzĎŰŞhé?îýěBŹ#°łżÉç ďK€ .\sŘgˇÍňŔz-¤¬Z˛@Ż?ýĹýi˙Ńââ7eÖâqťřř*„iăç=Ŕ\˘,ĽŔU-€ÂŁČ śŕxzeş‡üÚĎŁ=đ/źě‡íl•¶ţĄŢ=Ň ‘OĂů<ÁńëцŃ5¦ă¸ýHŽV>˘ŞqĂŇÔĽ żÄp a8Î: ÜëÁ6Ö .FŔäo°ŃFG(a#78q°ţh„ţEö†ź°çc룊~.ę5ę?ý—!Ňx'FJ#ŻIZ¶Ž#- &ăB UŮ“S-6čÓ*np7PÔč©ňóđ7y˝ďˇŢóˇ±6“p±Îp2„Đž^´Ą'­¸˘?îńąď¨8Ö>üąď¶iĹěÔ4ŻÓż‰jä§] ‰“‚ţ¸ÔÔnʇţí¸ĹÁž¤L˙8§üGá&"»âĚ(ěĘą5ńÇ—ŻÜ=Ä©`z ý©l°źRn˙ä´ ¨˘`’ŤpMT@‚ýg Ćź¦‰;=Í‘CÜ´€FŤżŹŰX`Î{Í!1B@ˇAĺ÷!ĄwDhÓh±ˇ’ťU)x˛™űńťx˝CQM)cZ¸ýş�|OýS'"ť™“ňóKcĺ™>ćőź@Ŕźţ# xsJeÇ Áä×˙Ś &<„…~°ÄL„RÖ‰ęH,÷çŮ%ž3÷Q™%é„w&@{ĆęGŠ8g-HQŘFDüx'N2= hú?ůz„0˘ l!¸‡“l!rĄůY¦CwŕtÍĚ™ŽaŚAYĎÂłŕŃ\gŁśsÔ)~päcŠ)”’?5µ3©ŽŃţŰ?ĽcIJé:aްőĺ_ĘG<[wa§Pű…ŮUy»!ŠüFŽšť;ű‹2ó‹ńúęCÖ+¬űçz^-Đ=*řHůs?ů‘ŠAPMŚü@˙|ĆÔŕŽ3sž<#ˇąhhŇŚĹëťž~†çÇ2‚ŽBůAľsKşŽÜVRaĺţŠĂ=źŮN1 oL3ß kś„2T$xáQ†źÂ?ÔSŮyČjÂČř„(5ĘŕÂŃüL‚çÁA üô 3 “/,:ci5Á’V ăhmî€ÚzÎ\‡zVř(9¤2ô­CJßk7A BΩMaIÔ1'đâLé¬Űś˙ą3V˙?5đgF‹ôĂćŃś#á�1ňOźé†pvđý~Ő$€ĎÎĎÇsŽyPâ�Gj4LH<Ď9‹‡LPëýŕŹd”ú‘((*p6ŽC¨=¨ˇśµBĆ(#Île÷F*č(÷EôEG&epćr uǦGtNźˇ9‡ĎGô‡šůk AőÔ®ʼnƯ�Ůşc.&�ţQ2I€x `č€|"2†;öaŐF>ű'Őy*a6`ĘĹ/…VĽZcŕë„QV°Âl¨ t9ňáćÝAćŹ;ŮĚ -Äú©±Đ Ę $óŠ 8;˙D‡�3‚ŕ”;Č �rřß™Q<•d†B_Cű¸!xÔĎ 0Ă?ţ`u/ýř4ťŔJÎÉq7 Ç=›XĄG9ÇzĘCţŞń‹בŢeŤŠ\ŘOýŕ=ÇqGpFŇ.§ńbTH Kgx€ĐcŇiEtÇ5§w¨ Ś-˝đć/„7Háż'P®án€W'qţz¬ĎC ‚rŕ a0+ů„A;x Ť"‹#$Çź€‰ńë�O†ÎÜc̱BxŕÇ‹#A…¬ˇž?YFpA€Ä|ZÎŤ×XĚ–SÓ%ĚNr~ôí±ço/¬/É_ŕY?÷đŹcm…QáPĚţ|ĺ€ţŁ‹¬dS«|wtŁŃ»kVˇńÄyçÔĚ¬Ź ubő°2±H±ś:"˙Šüvs®ŽČäˇu1ZC} ö$FЉ ‹}fj|Ř ľ#Ää‰ręÂĺřĎ|l!˙ڎól.XçişźźĹ° :\ýDĐś ?Š�¤" ’ŇC©Bꂾˇ ˙ŠúńµAťW¨ÉWŞLzIبÁ ‚ô:’őgăŔý XźCž38ńÁ–sé1"…şEÔÁŮĹ›6—ją56Ď_łćď±ö/UŻw-mxĹeżpĹ‘ľ”ˇ_{ž%˛ÄÓâśŇ˛dÎi‡Â0qF*äÇ»JĆ:fŃ92@žcŚ`ŕá<>I?\-’6lVż«z«Ú«¶üÎŽmkkW\¤É5qO”:á$x"AÇř1‚4ŔP>�L˘0C†Â”‡ ”%'>HÄ�ęŕČŚ˘0@K˙”ç=="¸4¸\T6ö¦˛-ĹÂëR2LĂŇâJ*[Řć ßËÁ"Öh<źÜ9Çq1(("tş^Ä1 ‹O;ÓŃŁ%Hő8‹·3ňc­ěq5w W’Áv9Ń3VI .}pđ Ň\[ň.Ż©îť·^{_íŻÝnyËÓO#Ůq±úoô}¦ě‡*źëłţĎ˝ŹżŕůýIˇĽfßCń˙ďňůż˙ý˙ţKý}űŁţřŹ ëPǨ”Ç!áfPwwÎ[9 ¦”Óöť|ľj SוCz«„‚ŁQÎ)ŔŁÔDĂZ- MIHä„ 9HŇ XŤÝÚľ\–é´¸PĆ›îĐć`Żń=Ýýżżńźń?ţJĐĘqŕ`Ř\((2}ź÷˝ż;Šm°L‘qâ]o‹óQÂĄLV(GČ­˝˝—Öö˛č¤•ÂčŃ…Ŕ‚0ą<almúÚŰ’.‘ŇÔ…fz|’úç·Łwŕ…b˙é˙ż˙űż†\|=âßÍÇqŕwvpk4��������� Ś��ŕ.��M€$2=l�������������Š��˙?p÷wvpkH���������€»��ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpk4���������€»��ŕ.��M€$2=l�������������Š��˙?p÷wvpkd��������€»��ŕ.��MĽ$­ Č6BWWGVH�C~@��‡  á Ü��Š�=sŚŽŢsľ›ŕĐB@(1ÄěÖB©€IBśŢŐŔ“Żq«Őą—^%xqŽÂ0ľä$ ˇQy‘ĐҢ\Ç:«G…ÔE±do¸&RŠôźó÷žó˙ý˙·˙űů?â˙úJŇÓ?®•ň’A†P>oó&…ÉékfŐ'•seĘÄŠ+`Č]čĺŰ)Źc–Ó®@P"Z®RXÔ„(Y«•â˛YĆ9.y5mö“ýřóĚżżoç8ůÄ÷řä@Ná�Ú*Gâ·Î‰Ä~a@Řf”k=E1!Éę.¦Ö>j®,nfˇŘŮ„FZ6<H K&G ›ĂąŰ¸xbÍ|ú˙÷˙őŮź?źńçÜ·®óH°Ä–Ż’ń}·6°µ4éhúl_ŽB )Z~ý¨fM­˝Ńε(¨ŽHĺ´,81»1(@·™{ _ęČß?ąó˙÷î~ľŽ1Ż˙ôp^Ka#�#ĺďćMŞ«čC2éŘĘ9‡$-‹L˛hs{ÇĽđ)ŚoÄK¨$eŐŘ0˘ČĹő ͧ˛;Öcî˙ýžű·˙ůĂóĹźŽ0sť4B 3 źţÜ öĺ![˛W5€rÂŚ"•ŕš[­­ÖX°ŹgqBbi{-‰,çĄIĂŹúńô1?˙§÷ś~˙őçüű˙řâ먾#řUSÝL (By{븤„Ç…Ęv93–�A™J•«çbóç2Ľx†¸gŐH"w%‘…±âK Ď'˘쑿ßřó;ËÍËG‰ĺ@f NzzWÇhwQjIÖłCL‡%ÍHAkí-mUˇćâžZŇ )Q^6ŕ‰ĺ^*?ő¨{TťŹ|~¦ź×CzĽ|óęăc¨Iřâ·îŚ·�›v'(&§ŹäFÓGć˛d4˛#CKŠŤÁškň‰÷č™Üsťőóýą˙ý›ż®ýăŕ ľ]�ÍB"!Îóuë ‰]LájoqNł $*rQ˘%/–žäČ„¬IK‚áI2ž*\2GEShŹtűsţźçŻă<?<ľ§?F®sE’‡ýúb¨¦[0{Zśä✊HnŞ).ĎMCFµÍšž)UŠŚ<Di6îQĄĐ©2~ß×} E>›‹aśAd‚“!î4†cŘĺ÷EĐTAQ4÷%YbŃrĄ"ÖŢ[^Š"BđŤE`ëHžČDäóîŚ7Gç”ăë1Xz@KǸPą·@Ë’%mF@iI´ĽÝرeÔ MŠń)Iž0ĺp•TÇ*ÖÎPOő € †×óů9 Zětl žX´áiąŠWýMë}ëýÚ{»¦äÉ2%YŽEr–Q)|ąˇ+ě'Ž‘ăń99Č (§. K‹Oi™.#dŮY¨µ_évŻZ{/[Vş$<;×\“>qމýÓ¤˙©iBűáP&x|€ěŘŚqTţ"Qľ¦'©Ł_Ź%zľŃ­÷ŽßéöŽ®¸'5[+zî˙gős‘0§¤2ĘB„řĚ÷˙p}fz°ó˙×uTd±!?—˛GüäÂ×x•‘6Ě)ÇŞŐťz{çZ}©FV>FśéQa‰,¬y™rěľŘ™ q~üÎ?÷{đ:XŻAÂ~XtâÉbCž,):|?,Uř[§{zĄŞ§vÍ·ĽͬźŻÇţa= soJö±TÓŁ l Á€(EËjDÉXd‘/É#Oc# ¶ęą}˝ď~·˙ž÷ąßßŕß?v¦ß'†(Źí©ŃŽĽ‡ůUC(:°OMĐšVŁĄĘ>ŠhśUŇ“ŘČ"–±·ąQ˝[×_±Ż?Ý3‚řřýs‡*VXj?)Žh¶śUÇëQŤ®‡{¨߀ErŠŤMŹ×1#yŠé§×Çd<#ÝŮ’Ę&Żu+®ó¶Ţ}üŢc‰ď?‹áĄŇĽů\KDő¨:eű<_Ç?żafáLë)°ç~ o7x¬é ‹†ôBĹłD`—Ů}Ü’Ô}A{lŢ8>ŮÔŮŠěXřB"®üĘ÷ă |ź°ŢyŞÎOő3ßk¬9™uýcsx…±b°Ă+ńh±üĐŠ (wQÄÚÔd_ćőšŽ$.lŞFż@7W#ďNŐoě0ŠźßB¨Üň†:Ëť|J‹#‹Slö(^S†ĘI ŘŤť Ö…IE„­Ů2/žš ©áž=Ţ<ĎeT\äž K¨WŔ;G,~“ ‹Ů$źëSÁĹE÷HrąDˇL¸ă‡ČŠĺĺŚSCŹĎ±„řCaüwźQŇ_Ź%ö ¤V/hĹŕţ?VgCÖE\Rî8Ĺ›Ó$O€ôôź} ÍŹÜź^…nđ⟊ŕü>[˘ţv›Q‡2<˘NĽáÂ&ľýĎ˙żü÷˙ţçü˙{ý˙ď«ß˙˙˙¶˙Ź˙úĘďß?Ď Ž:óŘ6 ±°ť°î F< Đł˘d˛HͦzyxŤÖş”Ţ®>łF?űČ5ÜýxG_îŁďÜ˙|]rVö Εΰwť$XâĂcn` 1ßóń˙ü˙o˙ź~ć_}|şĚ–�·/‚‡8ŘŠÖ�NŕŐęű ú‘Xţ¬Š< ľÝ >‡ţćÎ,PMS ŘXüůź€YGÉ©'řRËŚSŘO8ë0đűńCŻŞB]rĆqФdă+~ňĘ<Ě5nÜ(j'e«iĐ—Ň©GôÔc?-BP™‘<^}Wa`ˇ§+áÓS¤qť‰¨ŠMŘ ÚźÝµŤáĐź$0h" @0;RŔ–·ÇŕÓ?ä�Z!ł,ź]ÜS(řÓq5_SňieÜĂÔ‡w>ć dˇ­˛^{8щńŃ=Ü^ 鉎âä­Ň‘Ń`)5Řk#ë 伷,źÖ*ŚďúiVŽ%O�ę 'H4(éř(ŰrG5ú ˇ8fňń`'o‘ň¬ ‰żˇ‘µ�Ůâ�˙˘ďąäüO%l VňęYm4#Ď(´Ng¸ 3łŠ…~ĚÚVíúWk»Ş÷µŹ–~)[~…Ö”ř<Ú€Řđ[ťÄ^š[ĂI'–VžĎaV€Ś¤ýp>ŚIâž…&?'‘Đ9ćŕ  †ůÓ  *—vޕÞ^ëĄř–N¶*ýÚl)Ö4µţ’ÖFäZËîboRŽ-hČŻÄŇŔd/ł?ĂbX!(á…9˘3I{¨zaQ3b´äš÷ÚîdplI˛ŚĎuk˙ĎÍżţvŁőž˝wŰţkŃéu/5Ţß5&cÔ[„´ż&0ŕ|ž�c H�Ŕ´çpIۦ8íMÉŚ·Űíě}őíľmť­·Ö–ˇT…r´™EbÎÖ‚ůÔ©ć˙R®Zš@xë3şńOîL˙z^’ÄdTľ߬3Žóźq2ůy #Ň;Ż×ÖZ¸ĚňzmćĄMÓZŻ]żßŰŰşv·«µt j(U‚’ŔI’Ö¶]y­µ(“ŕŕś( Ĺ(ŠÁŕ‘Ś @ć|sgVÇI{MOR¦Í2Ĺ,$ŤP9°tżďü­rÎźĎřś?ĐZK›Ů‹ĄIĆvízi©öűŢţýŢţí·˝ő{uGş1IÖA –%+@dm±ŞlÓšĄŃä Qr”:h’şŃRMٻ޶ ËÁęô3Řh†÷ŮžY= R;Ęß˙ýŰ~Îř˙$Ďý9kţ9ůŚl…6›IV@ťYdhďĘş˛|]÷˝kďčÂpI’$TžĐŇ‹–†ËŢŰ„Śi ąBMŁ—ć%Ś4Óɡp‘{âËöXU$ĂĄťł H4Öńđx%~Ü{xáľđ;#˘Sá˙ßţ˙7ç|Îçü÷ž˙J]ůůOήç˛Lýňđ& ˇÁŔ,ˇ¶”¶b (ëe_±/ Á™š Ż)–ł0„”Úhi’dśĘŻR¸řfFVő®ţŃ{°V •ŃXÂ;™†ITZn)’†§É‰˛I,ě!{\Ú·GÄĚÎÜRŞGĐ{sďůţ˙{ŮäĎĎ{’?mţ˙ŕѨÉ?OÁ‘G„RőoĹTyaK´Ô—ÎĚíjáĄľŞş]ćśŇ%C)""Y4 +őqĚ‹Bď±°zşţ¸źŕĺ‡Cîpć¨`č§lIÖŚ˛Lu‘. 3yD„$´gT˛€‡VďX•3›Ţq“=S?żĂĎćÇ˙ß÷ďż˙“sŞţźĎúţ€é÷(ŽaT‘ă€@m"ůţÁ˛ EśBL•5]Á ¦´šŢu"ţOsE !D "’ ÂÖ¶J°lŹ” Ěüöä$íúÇzîĆŘĎůČžŕľ#"iIµDÔŤ$Ĺs‚Ô$˘Ň'âĽi¬i}˛Ä=ŃĹä›?÷ś˙ď˙÷ô˙_űü<sľýź¸ç?říÜ–—ގC|`aĂ­ :˛�Cą‘† dh-Eîz˛ľn™$JX;’¦P˘—gDŞĆ†í AˇMwťÔžsuó)†#‹áćł•W´„wDSçž$=ŢPô”¤„ÁČśB4ŃRYaü‡ůô˙Ţüýîϧ7˙¸ź˙dt˝gĺđ9b2ćZEs4¬Ál”Cv‰ÍM’Wíż®TQŚ™Ď‚sN\:‰EŔÚ¤\Ł… A˛.Ąáä6ç|rű͇kŤîCÎŽ;äű}’Љ Ëx5UÉŠSĆ6(" Eń,(M•Ę…˛S¬çřŹ˙Ő˙wÎř×˙ăűçĎ·ů=`„=đ ůNXČŚÇDزEW)¬—ÔčĂnkSË|‚U ĂCá„h‰"ŠČ4-fĘŹaŻ_ ň9M”+ Ĺ˙wvpk4���������€»��ŕ.��M€$2=l�������������Š��˙?p÷wvpkH���������`ę��ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpk4���������`ę��ŕ.��M€$2=l�������������Š��˙?p÷wvpkp ��������`ę��ŕ.��MĽ$ˇ%0yBWWGVH�C{\.ö'�iô:ôÄ q Ă ż��Š�ť'Z TMxć’ŘĄ˛aFË“F$R‰DĂ=sA‚Á” :Öü›ŤĎľů˙÷_źsfŰĎł˙çŹ>y"`Ž:ÎÉgr€ş 6r-[WďČśşË0ok»f•áąÉ‹ ?„IČ«\$8ä4Ik$J¦šVxL•ŚĺPŔÇ+"[DXÔt)U´Q?EDâ2 8žßŕŤFç‡b|±ÂăpČŹ˙÷źű˙÷žüűďů˙ńĎŕÓµ/ÝĂËt˘Źö®�Ľ+"·źÓČ-rJ™\ †„rhůJEżQw(2–aÎ#*7L1]ÎeÔŘ™†äĆ =(ĚĄ”ZdŮy$”űéă)˘¦‹­E‹Ř9žFL÷Č‚˘Y,ÂH‰›(츇Kßýą˙×çĎĎě˙üŹo?× ô0y?ÓŞÖWðOGđĺP`¨‡ů‚© Î×ę»çĽAŠa)B !îĚž>*.’ž Ë…5)IzQkFübóáaRĘ:žpHcÓ†éĐS”„ť“ęhXMÇ&Ç‹ăË9Öă5]|˙›Ď]÷ő?Ę˙ĚţIçAË č^řUŕ+Q_𵄂¶ő¤§im·«ëőŇKLĹ ‰źKß&ÖcˇjV/§MĘTŹX&ˇä$ä#‰|2$*ě0mµ’ŘűlZlöx,%…ŤI?őCĹßśż·cľ:>íů|`$;Ď[ZęŮ[!WÓzř˘šĘ;ÜŤH2^7öNoů•ŮRZ’ś’(l[OĹĎŰ‚ Ĺ{žĚ4<•XŽ:Eřp‹/Ä<Zö±č1͇ţöŕ˛ĎćÔďÇ«Í�ţüü hÜŽĆ˙¸ý^ľŘâÁ ٰ"EĄeĽđ¦~ůzßÝŻŮVH%U§buř_ökö"ňřČ\ /‹´ŔBk XkJZÓ´ł;ŁŠďĐź·zÚśfÜ“|âtňl'vĽ*űośpęg5«ĎĘäR2ź.)-Ůg{oő·˙NĽ˝±Ęr;s Ă%©dIÎÎĄp‘ĂŠ:ÉR° [ăK[Wśž<~Ôăď§e?č㜣ÇĐ' ôůé?±geĂ#ŤXbYŇ9ňÄëxrá-]Ă4OwÖ·»őöËć•ŢńÔ´ĆFÉŽjĆ?^Ä*#bOř±`Č”á2‚§áUJäCř˙~­ýßü<źłŢĂ›‡Ď'×tS7´ĆF^ťŐ”L¬eP‘ò/¦UN{żëŻw·ííÝr# č~„–Ú™r’D¬É±‡5]ް(DecQ.ń±ŕyđ ĐÎlFzá,ľ>-Ďńëó}=ßĂřRt’Űylcn 2RäMÇ[{;vť[ikĂ(ĘăEBą˛Çş¤ž]©±Hx¨(ń‚¶Ě#Ŕ×c~ q&2~Býpř1ąÂmś=aĎňď; Wń»žÓÂ\&Żt7í\·őß^ď÷wÓ6ßŮä5CciMŠ ©bŹ— *áQ,ĂäĽ?á‚•Ę×óđ˙Ńň\ĹE˙׳śę)vž”.uüřMdIŻO^2K9îxi{ţöŢďí^{w-ŐAdĽždg!.a‰ÓtqSvrݩƇ"Çq — ¤P¸Ň “€?¦đQčé˙đîŮĺÄďĚť0ď‹G )ŻţŘęĐÖÓ“Ł(˝đ†Ş-oßwzëĽ~wéš&yÄN=WQ©Ř“OJXQeJăK2HL8Đ }G€ŕęنŮ,?®ď0Š˝ţ°~A«'ËpÝŁ=™µ°çĘîŹZ“¦S§zÝĘŻ«íš4;^ňÁĹ) F©©ŤÎ!‰ź;Şc}şđčť“ŕĂyއBBOžb˝żšOĺ…Ş‰ĄŚ9‰]řy¤úńřżŁďLkraŃĽŹťeuó[]§ŢÚÚ°‰)G‘â±äů„!Ş$o NZ?pŚ‘ć‰ćaX1W¶đ~ÔKż4Áď,IVŹe/á]üž|…m č \ĎŽLĘ;ţú×űşzsÁ,Ä$Ë!ňɰҊ‚EűhO¦äÓ?X@š …ńcž>śIśpgç5>©Xpč÷cě.áůžOşĺŚ OĐ…JíÓŹ_ZǢ܍WoŢłËq­µ‰Íü‹Ň'~,Aşä˘¨ł!EĹăbęŃ�Ď|(ĹřŢçeîpüÄ%Ĺý”– ˇ"Î/fźĎnÜň({PxĹžëč oÄĄ%Ă»ě»ń›ÜÓthŠSˇţňąž.Č‚ űs-ôéA4š×™wđ bb}x1nŕI"ŐÔ2ŞőĄy…ÜoމBĽ(ąXDÄłET>G{ÜďČ/ˇR¤c3Ňž,/éŠÍň¸…ůŹŢÁNšiŔńÜĂ(35Ń<DĎBĽgjÄ™îXŹ*ťóűŹ«±`,Ă0ćů=–°ů/Ćôă®ůYĘú§§VľM̱°áepăÂ~–$ýćâ/™0)—”đšeU¤MŚwđ:>Jé૟TŇĎ > †8fa0˘ć79˙‚¤_>y‡×<'`|;¸20‰Xo=Mp’M+:ůÚĎÎt˛ąźJˇxYřKĽ2ęŮÉCÁ/[!Ŕ•y‘eäž§u…čëą°˛FOxŚÝ硇cS)U~'ÎíO1igač;t¨‘~JůčăLŤąĆyŕ JĘźCťC kęü*ް$úL!vl q¶Ô¸"”c±YŚT~ÚA‰Qňó"Ňt#Sůt˙˙ü ĺ§ŃŚđżń«g·< f„ę -¨aÂźÓ_˙\â,|đž0Á#…E¬Đ�Z^ŽNĹ*™ečRĺřż‡˘.G=iÄ? ±Ďű¨>T"čŹ;ůŃ!őĎţX˙Éűř~ŽE?ßx\őŔ+Xq5ĆW?ě FkZ#r±l,x^ÂSD~üMĘ',lMŐEIaáŘ~<“ ۧČHSě,KuzŚyĚf'ţ4—ě4Q˝>~^lw‘<Y˘–”}螲‚uŞĚâëé~‹ŁC˙ý'çt\pˇJ:Ů‹}â8/ krŤBKI řŕZg™s†5Iőxřűăm¸“ŔBéł~ô�üÄOĹ7T(„Ţ™)ĹĄ îcs=őíÁŇö‘‡”’˛Â¬çîěđłá†ŮDĐd1(¨ ĽONůű´Ž×žx˝ź$v‰­xöu¶¸Ţ;ç˛Ě7\¤Ń1b˘_¤—Ew?ŇF¸¦vŃ’X ?;Ô˙ą‚ĺ � žť>i:Ep?Äżá$Zńŕ'ňéý?.ś,r*…®üô!;'őłś܇‹FpYŹźĎaeÁ«LŞ!3|tŃ0ľ€;çbçŹÂů¤°éü;ýÇßűcÉŔ.Řńš¦F‹?Ë›ůŕCë?ŘX ‡( v¸Đłs®]$ 0PóTgUK†7ť-˙úX^Űř®]Ź+ëürdkť˙•é¸ÂĂ2?ÄÚ#ÂGQ$´Ă§€¨ŹýÇE§|P6Sb6Ô÷P*z‘»uůéŃR©Írü%’E<ľ ÜáÉ…u ÜŕOZ#šĐPć}rř<<ľ˙3Ł#„˙p0€ŽTDgQ"ďwĎŤQíÄ÷,+ô¸ >*q(‚óŘŹjžöp±ŽU¸Ďú<ţŢźěp˛–NąF¤éÉČzŇ,ug¦|Ňď‰`J‡°?kĘ(^—Ő%Qyô2Śl‘yňăˇbŤvÓEPžgŁpŤUĐ“­÷B—¸!čśťSOép4é…ŘĎ(ęDůčkR" ˇ‡4tŹźráĚ‹(ç @ˇü4”Ă™§@füÍçqšăaT0JOźĽ†Úł÷4ő ®7‡ńĽXOÁF$ěaIŃź×ÇŻiPÔć°.X›áE?ů5•?� ä«™@(HO<s\úĎŃ ˇy"?F \PńD RýôÎRö˙Gôą0DŃaP=±ŕD=¦8´˙ĎKť«ť©Ľ›ĘŐ3^ˇĎ˛PqÁCjJ÷DŮĐxq ódř)ÉbI\đ錨đăßăÄ˙©ÄőĎß~ř&î& Ř ô"<•‹ěžŹö™Ől&Y~^8'_: <±řhlÁ>Ü q;MřCˇş˙Źß źľ‰.FŞA‰|ŕőeTCţ'¸0_ǡĂő‡ÍÎo§!Źĺ"K„×ČJQŻHRüf&d„9 ř3AňÄ đ‡8˙?3@ýČÍ€•?‘0$N (G•©s,N°Ă9rRô<Ĺ*ˇ)'ŞX8S4ŢđŞp“**ň/Ň( X¨Őł?_.GL™‰}9Íą˛Ź®˙c\ĽOiÔŠâH6’¤ž•Â|4ďpH7ąIŃü\3Ĺ~öŚE’šĘ×llü•y…ü’d˝R´\ ´ötQđýý`9éŤňW4—řšG˛3^cĂá^ôŘđ‡žá‘xf…h*~ešć›Á•,ţN\DÄŮéŁâ˙wvpk4���������`ę��ŕ.��M€$2=l�������������Š��˙?p÷wvpkH���������@�ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpk��������@�ŕ.��MĽ$É’ăBWWGVH��������â,ý��Šq�˙Đ˙˙ű7ń˙ďßĂ˙ż˙˙ţeü˙űu˙˙~Ů˙żßö˙ďú˙÷ü˙űŞ˙oű˙÷˘˙/ú˙wé˙oţ˙đ÷ôßüî|ĺsúŔu7]sŐŤë.ť;wîÔˇC­^§Óč4­Z­VÔŠ˘(’$ŠĐ-ç –·Ľă<ç´ŕXŻËY^óŽs ”›!¦0ăĘŚ:u„Wć̸¸Ůl6›ÍVŤXd›- # ’ŔJ Ä@ˇ�B¨”B%r© „äx:x:-�"§ce¤€ËSDÍó,%€˘Ź"<EŔ ZA~46˛ĆĐĺ‘őQPŽÔ¸C&ĄGhB"ˇ{Ýç~ľĂ&žeS’§1Xě#€4VFßáűą)ëc„hĺsgĐ Ń „R±2±ÇüTÍJgű,,,b‘Dł?EˇťÄJnŠŐéY¦$;#–$§DťKa±,wćΔĄÇ—G,)†$\Šřň) é| CSâ’$;…ĹÓ(š:žpbdőé9†¨-˘O; I:ţŁ’¨&± Cwd˙¤ŕ‘äśMާŘéŚ!â,QÍďĂ Ć ń¸0V§ŽTÚÁ;č'Ź"x(b„WĘB겟ŇýȢÎ=nf…/âaČ˙G\ËaÄŹýôĎ’ţ©ăÂŃŘ3‚¤b?I("Îíd"ÁXT‘ő1g±uJgöőT´XěCĺ"žXřĚłđšR4ŤŇîséxXGxŤ÷‰§Iç¸5ŞÇżČ#‡†sD-iZcCšzĄÉ‹,ĺ>ż€űÔôă5śéC1űá_YśĄ4v? &{•¸Řgš÷đh:o¦ÇĄ ‚Ňă/Rěwý° PŹŤ#*,‹;śłפŠČ9‹Raibřú84Ę™ A‹€<ć:Ç[rywČ3ńX‹čŃÎ ćł˙cOrOöđCĹĽ‰?ÓĘÇŔžt(Ł‘Dc}?9ÎúÇűy±Aý8 š,~ŠČ%/9!OT‡šĽ&ŕˇy1Ő§qü=^ëS0ráL?ĚéCń,!4‰{˙dO‘Eí,PĚ—3Fľ'Š…¦ÇŃ‘06 .>ďXđŹ+ť™Śň1„˛řpö±÷ćš3×á;tč#ŕM*„׳xaˇ¨†CĚÎ-â¨e®U űsˇ”ڰ4Ě ůĄ ýëŁČl"폥Üd-c‰bqäv$Ć~dŁK1˛I¶ď?·~.h…&︞"7„ZĐ˙!5 qĚ×pç°¦yŇHX,‡˙GSĆ˙Łz\ÂČk ÇĘHTx`çńeŽ;;b¬$xD=éO<Ôç@ąG¦ Ó;—áXÜD«‡Ş>ł~,,đ=4uJ¨Đó+X|0d‡˙ă@Âeć ŐD-<ü)8đ.Ńçk@>ˇ`=Vńsü8‰‹f4ÜđB B(6KSD@ă~Ďű^4€\ł‹W<„—9)tj—w,€…;ȱB±OřŃ`–ě‰ Ç‡4~,Ěđ ¨tA4ń#ýąČ?˘B?ëărPţÉŇ\6ö|áŇCGZÓ?üÄ/2ń”ý1ޡTGš¶ľö?ËxśjÔ;†Ęŕű#{ęUęÎNn<ąń*̡@ÎR(ýăwvpk ��������@�ŕ.��MĽ$Ş!hŻBWWGVH�C~ŢĎđ�ťÁR?Ž��Ši�Ł*TX “żpOŢÚÇSř4›HáGöŕ)~�D&ÂĎśŹ�Ü9†pČ@Ŕç÷ Ę)xÄ™ą°Řy؆ś9 B, ňbvúĎgCťZ—I–°¬!c_éĎ/űR-»ylëxZüČűi5YÜôsp…аyVż˙Q•ÎôŤŽÉ!,ę˘@RrŹÂŃęTĂ.ô¬?Ű8/­Y©”‰­lbqŕo˘˘pŘyÜýpžxź¬KB匸�“ubÓ˙śf(vŇ!çĘĹGé=˛AŹ‚3ůpżţ˙ńuę3]pIÓyÎp%149‚täź—6¬g×ţÓKÔC5)=7/za܇§°.â şß‘âʱ~%ä-4KůÞُd_.'_čŹ=áĎÓťáě§x…śťńűM|áâË‹bQŻÂ ĹNź¨,U.Ű!Éţ Bd|°Ĺâ#¸T?$*Ŕ¸`2«AO‘;Ź÷G/ÔL±ův ťTc”Ć~堂 óĂĎC…cÁëźúČł;j $aťřDúEĂ ůńsÍ(úéˇŮYDž–õ9ęžč\ ö84*F(Ăřu­›é„vĘ©‡ą¸ňSH}|üáö?¤É)Îe>Qއ„ŹFOŁŕ=đ—ÔĆĎ·řËRŤ¦XšU~öěţa‚ŤŚ^pˇďóN|YeŃz¸0~€b ň†1/ç:&®dć%ő‹ŽÍżIv.ĹŃ$V^#^ĚYnr±<üPÁĂBqv2ÄÉËS¨‡3ëLqé{nSŚŹ,Z-~šĽa<•óďĆŐ¬cbżKľhĽ;Ě>‹ô?Ť„źŇă›P!~Ŕť äçŃůý ŕ™5ĄËWçŇSwČYÄc1±"Ł‹9ö¦|F<őŁ Ł)E�úĘŁ>Gŕ s$Ŕ#äMÁÎ)CüĎ櫟Ć-ެGqŃ`MHĎ ŽÇŃ)†äţçĄçâŕóŽ˘Ě€®#ü‘…ĽĆ:’¨ď‡ěˇ†JцF¤‡›áź…´Ăŕ…˙–éĹ(^3ČřͧPnAb1öá~PŘť·)ŁaMw@ť~,öO)bîíĂg‚„ź÷Ä!ő‡!Âű05 ČĂ-ĄJÔ�Öţ\Ç‚Łěäď|™c™#Ě_ř(´ši>‡Ć>:ď§°źžÄšíˇ>Ę1"vJ}\¬ţ¸x¦r$ę°śÔă¨g\čç‚'Ç &¤č›PXX)Ő; ‚ ¬ŔI¸?°2ţłrö…ÂGĐB›†lÂ,<­Bó‚ ś©Q­ł¨BĄ ň>W—âp,¦Ď«°Ó\3]‡›ă۰Xf…;Ź:<żPxľ†@ýÔ‡üřţŃ…v˛AűO?Ô˙‘)!§N'thBXŁya{ -ë÷äŽDáµĂ{”EňÂÁ űŃĺ Ńů…†ÎýÓ=ÔűcÁ?Ŕ1nîa‚vŘs ‘…hľ†9śÜ§/N'ËPŇî€ýŁ ËŽs ů€Éż µýhý0;ť\Jd×\¦ĄŰéłt“uĽŽ ĽË­ó•*§y“Ť­éߌčdQÎKzőriűÔÔ^cGµ©jă]QôďÇîia®ŃUŠ´Đ_0^td{ú›X–óІŹ÷˙©ĚďÜ%óŃα,ęÜx±śKiľůÂ6aÄ%ôrÇűŹ6 q {LűGq×(M`áđĎXz:Ř dňÇGÜ/ô,Ť‡ ^k¬Äśl(–ĚtÍE0üË š÷yVH$‰ŢěXČ{D[9űX‹÷~hö„2ý„öĽp1„2#”żĹ:úů>Ś=mZäMdĺ#ż†XN>;ň=<´Ú‰«?|aîÂ˙Ô +wřNˇI± †ű?‹/ŕ3”g ‡ę\'F޸Ć5¸9źÚÓ˘á˙X3ŕë\ľćř cë§9ˇ2}ČKYÇ~PX6o ąčüĐÓÁ;ĂÎĐŁX<Ôé6¨;Úðśđx°!:BĹÄ˙O>&úiPÁ*ô 3Są^€â‹ŁřSŽ‹ảADć(řyřNy`?ĹÝGÖBŹčüÜ :ĄćE^„t¦ďT¨ĘŐô7?éÔä\Gˇ÷S‚-SŐ8oŇBeŽąĽĹź}áOË)+$zZB°˘¨řN ßyč“gcÍ’ â)CwÜYýĐ|)R&í‚4Îéż&”:çe9ň|%_á^\sYÜOé¨üĆdĐŰŮSě5F• ·ćŁÂÂt‡ ݧčCHţÖŁâ,ąĐpO¸‰ţ ý 'sŇ)°‰‰–3Q/d†§Ç ĘsÇr’ţë“yůČy÷Tň=™\Je!żĂ?÷äsŤŠ“S,ůű˙gíńyִڬđĄŢÇţㆠ Mq3źÝ©É ŮŐcń žő‰çžŞ"léń^˙ÜZSä…>†›cvMÄ&©†)¤Í5fĎŻs;T–Dor™đăr…řB é Źčˇú­)†">KÂý˙C @x™źFeĹŇ Uţ~Î^–wěIĘÄx %ÄjöIź)ĹcIGZÁ/Ŕł“AŚWöť‰©±`>Ë…˙üoţŕxý1ĂuŞź¶"YÔY?×ň¬aŕí•T:&SÝůőW0rÉßüI˝,¸/ŇNQ‘z2ő‡=¦őŁ+łXLXަ3u‡`ëź°ú,‰ ś“u‘őq ±ńś–úQ|ËjľČ|1— `«ČŰáSÎp4V45+ŃÄsé\ř‹±AŽ2ŕŻt4,°÷x.ŤęˇK–Ľ1Ě rBoŔxf‹X i<LŞ™=M^Ś0ÉpÇČkĚżp>Zź×óă!—€1.ÄĚ4ů†Ě Hx1“Áx‚Š ń€Č1T„ąĘX@¶‡V…Ü/‡÷Ü˙ ĎraÂ<Íę!ţ˙É…?~ „Ç(2 ĺ|4±fč€e§iĺ˙ß_ň˙_˙?˙yZ0@"4�ŕ˙…ýwvpk4���������@�ŕ.��M€$2=l�������������Š��˙?p÷wvpkH��������� H�ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpk�������� H�ŕ.��MĽ$ů[¶BWWGVH�CÚŰď!�666Ü,ŕ��Šä�Ľ�JÇá@ö=Ę"ݱŽ~q„w:}6÷tąôĄůÄň*d>â…‚/D"HĚÉg'ŚTăŹÍÎđ_źlŘák҇zě†DÖ˙CçĄYë¨/S%ýŤB‡•tvXkEíÔ*®�]XSĄ3‚ĺăőÔđlřż]˙ŕ0A°ňPÁŮŁc:Ĺ 7śS?ŮžI÷źňz27Ť5!‡îĐ.„Ωo`: ÚÓýÔO?ń1Ăů—ŠÇĂšÁËrŃ>‘(>áÂQřť'/P{„©ďŔ%@iB3‹ĎżX%c\j’Í ZáY[¨ół…8‹éAÍ”jś§9őÂKŚ>ćůeo´bC5ŚŮďćżTZ.˝âqozŕ`ä$JbĺfVOÄ?ŁL6ĽdĎĆŁ~đďSΩB{^´@s@ú)śŞiśrřOeĂŰt0×đ÷‡VĆŻÇÖx‡KĹ‚fŘWÚóJěÔ*µG;?bh‹ř4z¤ ńÄD¶´¶‡'íh™=vZRďËxŹĄĄÜźÁ »đ Ĺ?Úˇwž€FJ ľÂąŘ(_?<¦áť¤ÉNfŞx.O2^a٧§ą˙\Y5¦úÜKlô†8‰4GD Żś&…üŔ\† .Üś÷ç©p˙™bAgĚ*Xśť„NDcBŮQÎ5D „ýCŔEä‡ń!Љ~f2 U>Ź6=–'–gâBi÷9•Í`Cí!Yć‚%±8:ŹXż=ZG>“!^eÍ;KbĆWˇ34g†ŽN] đx9ŹhŻĂĂd!JäđţĚĚćď]pŔkpK\ĂŁěäZĘŇ,â!~Ś%-cďÉšĺçÍ­â• bjÄăr†$•ßÜÁÎĽá;śĂ3Oí‡?źđ€~ŕ‰Ŕ9˘ĄŢɆFĆČÎd><ňësŞj'±:4'v(S‹ŔŽK¬ËŤD~&CţŕâĚÁkM”Ř=S1ED“†K~Tc}Kö!tĚŁŠşX+‹:,HŽŔQ҆QMř1ˇçÇ:Ă@]ťť zx>śhĆűzéEeÔÔÖŃ4źĎCŁ'¬@â ę‰_ď±EćyágĂ÷ä)câÍ čÄÍqçÔR´†äB%÷P°űdŹýcA <Z:ś(D™tOj|ŠńÇDÁ`ÁŮŮB!=Ä>Ť rŚĚłłą"xLdT?łŘŃ~ů'%˙Ĺš+O3? ´)W@3j„<ÄĂŃΛÄ߉c=äbńꎓiś}Á;hî0fW#.(†á•Ős´š…ŕÁŃ0–51ŃĎü^@ÍŘÇ„TĂ ¨‡„&�8Ú(U& üp ďÇ[؉;„, «âz°ŠFDx(˛ń›­Óqľ¦şJĚžačÔĂ!‘ĚĚăQQ`=ňŔ·(Á MÔĂsęWÝâ%vNĎ,}';ăÎcÂÉ"ť*†J?Ěrň˘Ü +„žs�a †,ćŔ‰#łOb™ÜŕśÄ!=ăh@`„ň‡gj!;`†S śMµ;dĂ yÉ;Ôl Yz&©ŔL+=đđ�üc 33 ™9‡3čMN45M_T]YÖ'µÄq0<üĂA…Î'â  ň`źˇPÓ ˛®GźFćž3ĘXžäˇ,g6dbD=bp°ó 8öˇ˛ăá|čý±B€g" €ęSä=-#tĎ#;±Ń‘ÓŚJ©:"¬AUĂ1 ´9p¤ě RwŔ p4Xúن üCĺ ˘cŚB#N†ýäKĺŇ<Ăg82¸r}ž¸dI%Ť˙ł÷I˙˙ .ܸó@3F¤ĹÎÓďł[řɵĘw ĂDü>řý‡XăSL®ľ`ÝĘř D×ćÎ)'עh0ó¬b÷ąZŽŮ*ÖkfüÜÉďŨ…2x˛ %K÷#ÝšśÍmäY|ŕ3¨¤°zŔśÁëž’ÔÉćRŠŽ j},­cŇ‚clhěóŮúé2 .Ôq °Eţl˛§ÖÄ&qq,U/1aU™¨é4#°@P�Çűó¸ćČűŮČ\ÝaGăżţjZ [ć…RŹ]LUĺ¤<UXpiţ°N ęěĽřN|ڧ45÷#.E#WÓZ.Í_nĆďO5˛<Űnč¶pŘ#úź^??ą&$rüÎY Ńąć"ÂÔ@ő?…Ł÷Ó ŮŹ4K "ű“kČ“ţD˙ÓbŽ"’^â’łńĎo`b:gS"Îâęó¬q–Y˘1Hac}©ĺŘýľ•˘J<!î˙©="1őpź ~hᣔłČÍŮ‚$@S{ěCÚ“z¶äE”ő˙é«AíüTÉđI4#â:eöPľ<şś?÷÷‰™š¦]î•­úŢĆ«űŞĎwú;ßńk8Y±bâI{z?‘â&♂füĂţˇf (0ÎČcś„Ô„¨A™„řą0!°ő»NßíŽWJÉzTł±»±[­Ű×ţĘ×ß÷÷÷ż~űľßúę=çbڵŽ4p<ó‰Na’(áź:Ń AĆ Î‚ꇠ39ý÷‘¬—|^.e‰ÇV–öRŐZĂ.’Δ?Î…2I»“¨śL¬€hű8Ë>ÓŁ‚*mĆüäG�ąŞA“~ŇĐąÎGrčé4M«»ďÜ«ÜÝöűţý~ż˝ß÷oýuoµfu–B�…ó(…DË‚(’C‚:ÎĚŚ$xŚ�Ę$^«ă7/Ź,WćŮKô1VůréŠ/Ó¸‚ŢŽĽńŚÎˇó}ţĚóŕ잍‹I m䱿<ÉšI¬¬_kń.—Á�UBšFĘ©´×S¬rš»gŻíşú~÷ßűľ÷ŰŢ«Ţ[oX”ŽÄ ÁqŽź“ŇLź*QŃŹňÓ‡ˇ1ů|>(HüpŠ+w?¶š_wl\>e<ŮQÝqŘűű?t˙×˙'בâŘ7źÜý‰†Úî?A»ś14ijEÝKâتĉŔ\>󆣿Ä~k|hsů“ ÍŕµPđ3˘—XÎ9­ífżk˝ß˙Ţ{ë«…fˇôdDáÍ'IiQĎ“4Ié rhÁzŽý$Žúˇď ÖNćŮ#WΖź?űćś6ô}¬ţ>źě÷ ”˙:ءe9pWđšÍděÍŹ; ;0îIĘěj(%ń<X&lŔd78* ßš?n»¸á*LĂ#qŔÍƨJ1ŢĐ“˝QÉ÷›ň­ťýţëí÷¶Ed$¦„äń¤OA.k•SßH" >¤Mˇ p źěč¨óŘĆ?řn3ÎúŰS])L=A{>Ő…^Ő˙Á˙ý/l?ć•çżçO˙˙żyľ}ňdÜźîöh€łŕqźAćÓ—aŢ•-xa°Ú�"AŮś¦5 V«”şZIpr2R®E–ŤŢ4Z2đR9`™3·Úv»}ő~_ǵ%X- R©!Ę‘PŇDÓčĹ s äULç/pxÁ?ę ş,íÇÜXóx•Đ/!i7Âw˙őCßđUÖă˙öx(ß~ţÜ=©“űÍńOŢŐCô=şO|—6ů‘°d‹ůQ\)52ě % ®áţ+h^gź�†O’S@ ·ÇeŮŤ «üm ˝­µo»»^żjL—…B†D*RHb} ¶Ú,d­9Ł=!®€Pái­XFĚUH| B@„ Ě”—Ó©HU„Ů{ľČűłĽ°vtňßťOú÷ŽďńÉż‡×?\y\>iÁÁČ˝źčŕcŘ˙ám$P`eťB€™BuĄ€¤ßwQóízsţäĂÉ _‰Y7JKĹ®pL·+˛żŻ¶ż}oďß{±·…, >RʸDÉ–Ń©ĺůÔňs’|‘´ëµ´ĺQjˇ)U""`0�2ž(­µdT‘ÖÚę^o÷n~/»ÇâĽůńŻá{ÎíĂĹÎóo¨Ä…8ńq#x‘O•ę˙÷üř~ţp4Nđôť„« ˛@Ë´ k[i÷Űľí—u÷ÄjłJ!®#†˘!+*U?96QŇ%´IĽ¶Í,‡O,tTR8đĎř@ăÂslí™óâem^×µŻ6¶á‘Ĺ’>«ĽĂ…$ÍÄÄÍ|d˙ŁţĽ~sv›ü˙{ý˙ďq˙˙ůô˙»˘?>LR>Ŕâű ‰ľo GYĐű×4™Yîp…¤÷‡đ÷ÂĹ_Ä5¤am`@GÔ”µ¤J mPŢ ´OšF ÉrôČ3ťy”b˙ř>ÚqĎśřCçěA炏¨h~éŇë%Ű ČY*©×‰ńţP‘ńĆMvÖ¸É÷ćŹÖłĚçű˙ëăůĚ{7ň˙™k\˙ĹôW‰üë� 3¤ČÜ´ nÝąéŰe3 ["hń®˘hq“ü „râRKŰŮń1#ňT’čŔĂś!Ĺ1=4X RÔ!I´®ÎýĹÎťo˙ŚÜőgý9żČŁXśM\C1Ć–§ő˘S¬Xk\î§” Oa…=;Ďű|qŠkŠhöO˙ÜJ_˙é=•Wg=~`˘·¤ë“„­´GHšâE㦽ŽăwvpkD��������� H�ŕ.��M€$2=lBWWGVH�CvÚÚď �����������ý��Š��˙?p÷wvpk4��������� H�ŕ.��M€$2=l�������������Š��˙?p÷wvpkH����������w�ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpk.���������w�ŕ.��MĽ$'ě"şBWWGVH�C{d1�*�tň¦ňn G ń ˛��Š÷�˙ŻN—}¤R’& TJ»şöZ+É«1(¬NŔ Ǩ—WÔRŠ/–đúäbˇóN˙ř~˛žÁÍyQYsC2^ÓËÖ¦.Z\˛Ä*.§DÔ•üx7âe‹áńţź:ßűŁÍzüöĽČĎx‘|ůG÷c{~’˘ż™íă~d¤á… âF›i~6ŕJx#�$ˇP knZĐĘ’YcaÉĄeňY(E(j„ĘÔ˘!lěąL@�BAĎĹń\ň1ɲč=çď˙ýüŮţ|™ţ±ąďŻëĚ?r{<Á6Îq $ţ>®ś™ŤqjGvćĚ(Y/9zkĘ”mö´€ź×u“ýGSß</Ńź~îßéĚĚqşÁ©Ţ>üs¸ř$ŕpCAűÁ´‚i® )J<‚€ŠäX46Vµ,mN)*Ť ž¦śś„JUzĹÖR#¬)JL™ňś…J°Ś–¶˝,Â%đúÜ›t´ rŽšŇ}ë7*ţúń~úáéáIä°/9«©´¦˘ŕ‚ǡ«4$uaŽř˙÷uý™xßäó9źČ©ü…™žs0`ż/Ú@OŚllȬF@5śÔ%µ3Ű×ç(= iA¤Q–ÄĄśuk»†1K͉Ł9I––d,ąr-š|ĚŃSigÇË÷đůEďŚbmT©Jq=<1'^ÓŘčŦx6ů‘öČ%†…–ísĹ(ľĹúăě<ÉĂÎÎ˙żŻ{ĎŁĎďöÉđů˙äŰx=ąę]D|yHÄJ…śĚFą€0ĚČ@ „eƻڮ8Ź%ÁH˘µBI7Z®kš<…: Ť‚%#GË2SJ’EÂÇĹüčd=ŞőŘšŻź›=ľHoh1;_îxÉČ”nGÍP{†{ʉTěá( ŞĎńXűĂň׳Aúă˙ď˙ú®˙?é'w÷ĎOź˙ś.÷f2úď—*żŢK< ËąE†ĆÂCÚŞÓ:›-5"Ä*KFžQ$ÖÖUŤ5ŹŔOQˇ°¸TiOä$Id`Ţ˙xÍUÜ;~O±‚&Tf% +ę\đ0*W&ĹYřcřxĽbč•\Xç,j†fźý‰~gé˙ôőçvěť|˙ŰŻţtΩ‚?źăë5=7ŹŚ>oĎ0<“CČ(v"ÓPG�… •Rťk˝ëEI†p#•ś.ÉÓńzím‹P‚ĄÉ$EZµwE �Ě„g.;÷˘> ŻY*…CU“hAzʤ\L¬ŮÂTĹyá +=ŮÇű ŤŢŕýă®ýąëÓ›hăöź–Çűđ˙}ůöü?ÍAť:"×ÓŚř¶‘TĽJ!n81S¨ŕÁ`€Ś#€®ćµëbtĆ*’†H'#-ď×Ë7’'(5eS–ä„ bĹzy[«,uAŤźz®O_?‹‹ĺOîW ęŮÎS*")ĺňH–.ÍxĽ&ĹaI˛°Yr™éůÍ3‰˛Çâ˙=Ůł™Ĺř˙ţ˙»ţ­ţü'ĆWóç|ţĚß{9‘órXsH‚ř^RNZŐ’µÍáSÚ(Ą.˨ZZ&IŠĆšŕŔĐ,!sqĹL)Y‘$€cťÜož9ąE×'˝Ü(ŞÎ×X]0ă;őÇdiC\D +Âk‚ŤPš9‹ŽžÚa†V›ěśęŃ仞{]Ü|ú˙Ż˙ÚöźáĎđíTÓŮw›@źîÁY%UĄ‹Ŕ1$%ó4Ť•’ͨuµHM’Ä.9(RÍŞŐ^TIĆ"9ç`PBZŽm-ÓĐ’q;ôń9íř3‹›Üţřť":űsYę~˘r$Š’Z@\YĽB7gJˇ~,ţúą–ß3LĹî¤{®\<V¬Ď÷˙_ßý{ţźOŕ×ĎOűŰ“‘€�ĺTĎžÔSCHÄxm¨P8#«Z‘wED[– Î9ř$IŞQi,W®Ö"Ŕ°$‰"śDD­µ,yŐľSsařýś÷‡‰ÂF7>÷Ěž˛QĎ("9!řé§(–˘±•Ť»žŻąNáé# í3Ź%çu&?÷ř›|˙ďŻŢóů|ÎŘ'˝ÎÁĂH(ŃĆ®âŘí ›†[[HJ Ńž°QŰ‘»wM‰$WTęhÎçäiJ„$;ŐŽ Îđ%Ë2s˘Ľ¸+~`¨‚wş˘±Ŕ„XňY€ˇ–Ľ´ĘiĽTÇK"Ç"˙ąĘ|=ŐčhVśk~OZř“ő§nî_vž3ÜđĄ÷?řvú˙ďĺżÁú?˙çĎ\7€˘z(°ę)Ą +ĄBAüę)ôţÂh^‚đ®ÔhG(µw$•Ł( GK™`Č电H“Şj{ „Łą ®9ž¤;‡rđ]¦&¤»há‹ ’X~b#Ψýą7iÇ›řŤŰ?·#ţ2/÷źŹ>ü&r®J˘ű¸§î?íę˙ď˙űÜţ|rĆ» řĆc'NS¨‡€ŔĹ’y‚Wß!eŻTŁíČ@!‘઄)>z{G­%QŔ�)O5ĺPxš<:R :öÖf{|ĎÝ(ň ËÓĚ×3ôÓ?¨écAo,JnŁ*·Š,1Ň“:„đWţ};Ü™űcŤ*.ńúQüűą˙[=˙ů?źĚ~ź×/őx&U·Š/¶"1âë$q¸]V3Cc¬†nË(á,ňSć@dŹEyJK«ÚBA1Źćđ b,”*źä„äŽýčúĽOÖ|Ďvü+Ľdůš~¶SĂ$r*ńăý¨(Ć&÷xŠ~î˙züë©©?+qç~jččŮţŘĂ:Ú˙Âů|rŕö—lŔÉ/ˇšą÷ĆC~,ä}!b¶=!Gksí¸aęŐrÎ#‘“k©PIRczN®mä, 7ž{<ůRŹ=ÖŠ ŽÉHĐf$cɶéZJăą$Ať+"ĚF‡ëůzĽ żđ„ă[ ·çůšbźoľßćĎůü9€ż»dđŹ› ZR •Ó„˘Ę‰$Q‰Ďrg[v6 k­­ňs•¤ÜpĚ).’““á4_&h.™u…€Ł¶ćó;¨Á±E!($†ĄáŕčňKKŞ¸Ž™Í%N#kć>_ł¸ĺ~ú°Ľcř}ĽfS´ľŁř*ЇîćśžŮtbdŽ-OÎ żČc[RöŞkď¬7#1Ë�ɲ$ •€’ÉŮ´óoľď碹¦”-×\^D#M‹ `q#"Üů’ľŕŃÇ?ţ=ˆ+ěpyÇŻ˙ô =˙řß˙‰đA*ťˇFdľ�śŠëM—Qłµ ?µĽ˝µŻ˝·ßľňRŤ"NPř_źSÍő1y—9óf®). ›5×\4ŤŤ fúH˘éŹ ÓňGŃĽ¨ţÓ6ńăŐąA4řţßżţ|˙ďůěsR†UuóÓňO>xN%ŢRl>î(>ʦĘ=]ĽJą¶Ęµł^©k3âbś8ˇšJ{†!|;T6q¦ŕˇřň˘YŚ˘•Ą·6¬J‹ä”ŕyY\‘"¸p‡‘˙ţ˙»˙÷Ď'ů<żoë1ĎNň 0»Og+Ŕűu‰|Rz­ĐŢ´·6i×XzŘËă8ůö“…‹şd˘Nq2‹!±´˲Vł4•;Lâ´úçű÷<ţ×?ż9g{ę9’ ýGY ާ-Đ^0óa-ŃS;”%łşflµ{k—¤6ŹűĂ J—J>Ą,¬R“ĺ’ť’c‘*]JżŔĐ?ßOIŔzţ˝źSźăp= ˘@ÇéAâ° ‹>{\=ßăťţż?'énóxŻÉIA$—ęŘQĹ÷ń/ľ§ÇĆ…–ČRSQ„E’¤°"’‘$Šžţ±áϨa„¦~D â©9 >ÇJISĄ,E/‰=^S\kÓ“qšűţ“^äŤďâ»ýä˙~˙Oţ˙Ý˙˙í˙ü˙őWú÷źgŽŐýüű€gň‘ś;Č©)gj3`CĐcR& „­`?ľ%Ë2$čÇŠ ……‚Ń„\rň¨„dH ‹¤ČRR#J",ú0EK2ŹIÉ”n,űŇZiäH‹Ü!S‹GĹšwH$98ŇB#~p (ÂĚA7€ś9hMM#2ąHKŹ QsEŕÜ|bPŠ>†OĆCZĄŽ‘‘2ĘđöČD†CCUĆ2ÇyŃ\Ö}˙˙źţ˙ň˙/˙˙‹˙ßţ˙5‡˙ź˙ÇÇßüĹÁ·ÇźśÜZ>hÝ•Ó|QÇÎ(éiG0PŠ(„HA‘"aH4(BR Á Ä„‰4š,LĹ *ŤFCă‰2NŹ!2iĂ= OELP×çŔ€Vńˇő€=E«\‡dD^xÉeDŁĹ"w‡Ţ ŢńsŔëŘ(6ł„‡%L‘Ľ•¨É!Ź ,N?(ž%' ‰~`•P}2­áE¸‚,V>ÚŚ3ôpc»ĺCřu±V©ŚĘĄĚ3F,}ÄŁ‡Ë&ÍráŇT“ن9ö— ďäŃŔ‚†~ ͆÷ඨ‰Y,B0¤t(™ŃÍa|X…ÄŚđôčYk=,vĺ(…0ýy"Hź=Ä:Óă“E?®ćDü0Ä9öŁl¦$deŠ0sÖŘÂRüi*]6= —wŠlćęD6đ˙ťş”Qˇ +ž4(ONÓcÎwƉ5ËXsˇ&*ä*4Wü46Vň/^JŠčń řď0â#Â:ĺBÝ(wD÷Ź"-ąŁâÄ4ĘףXXKÇš›P5® ŇÍKĐ«Š2§Đ›‹T÷ĎRÄDą ýgAňżţd‡Ç¨.Hެ ą=¤ń"Ë;%ąD‹KŽ÷áźú˙wvpkD����������w�ŕ.��M€$2=lBWWGVH�CvÚÚď �����������ý��Š��˙?p÷wvpk4����������w�ŕ.��M€$2=l�������������Š��˙?p÷wvpkH���������ŕĄ�ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpk&��������ŕĄ�ŕ.��MĽ$fý…áBWWGVH�CÝěë�‚~6Ág��Šó�šâÄJřßĚţŹ@Źä>q˛G ´ g#6Ř'›äř%†á:/vJJęĚK˘üˇđzjąĂGŃ„1ŤÔŽÜQO1~Zmčr,Šs¶? ę9$čóĹX0 RŁţL„îTBă}^ăzLâĹ0ŹeČÇ~ŽżÁ\@ŮSJ?EI¦t¤~C7çŻčłE$´ÎĄőSű>l=bř†—!j¨x©ĚÄl;/QĐOa ‘ůÇ\YjÄ5=N×Xű C‡™?÷čř‘…›ôůÁR! ¤#ŁS&;ý·€°4AKlje­?Ž•5#™ęc7Ô”ëÓ2zjŢQH?^Ýۇ”Ž©ÎKEÂoNóŹŮf¤Ĺz¸Ą˘ú3_pAç7t“_~â.śa&®¶@‘çŞ8wŽ˙ÇoýXd˘é‰sĚ?Ô"ŇpŹń,ŰU˙ )x–l Á"’ED_–‘Ţ4”®Gę§›řż!–}üOý=ŃG;0ÚQP&4¤‰kÇýż˙ź˙?Ă˙ż_ű˙ďŐ˙ż_ô˙ďW˙˙űË˙˙÷{˙˙{ë˙ß÷ý˙ű˛˙_č˙ß ţ˙-N˙˙^ř˙ďţ‡˙?Ë˙ôł˙äĂ˙O˙ýkă+w>véř÷żzđĘFüA|4/Ćňq˝Ę}˘2<ŞÂ’§C˘N! Č)ŕĹvdY@}éĂĐ>˙űŻóµĎî\[ěcĎł'44B$ť—ůVžI=˘é.ŕÂĎ1Ló1Ä!+:éŽdt`=ýť_�pĆî?­l!˙¦çK˝Ţ¸źz‡č&gÚă˙®ů„~ËÎe�lŇŕ$ %¸0ŐXc˝ěrx†pëK.#’?ä$Hşŕ„&ŠDţ9»í{c�žZÖKă—ܬ °íGo±¶t2ČëČV&qW"ÜUÄ €–CS‚íĚ1¸ßĎŃXżëI#wj Y1,N ¸)^\~=ďđjDÄď‰UńTĬÜíq#ˇŤh¤ág ˇpÚU‚ČćZ^źq OŃř#.wţÄô¸R_~bXdRÇ ´çC‡la µŞüóăríźZˇŇç{ŠćB"JdĚT Ją—΂)/ŽŮׄoCş´a^^�áĚßlOę÷‘Ą5ŁI”G<ńôë“~ŘëA7 1Hú6d¤…#܇„&Śpi…yˇĐW(^-d@v"}ôö˙Cü»§§vĂ-/éž·tvÖMŃP^fśâGůB‰#Gö%ý*ĎŻ_—GoÉtÂ+őľQ#sfG% „†Ŕ0?Aś “ C@ęĽŇ8Ů ‚˝“ÓŤÁčh“C¨ŘĎGENĽRi€i˙g¨w)řőc§ČFź@ů8“#IJÔIj ”9ă‹ Ź1ÇĎÇx”89”>A¤A$Ć$P(ĆKń…GTÂE� Đüq°ŰÁůČÎs|,LţÔ É“I§ SŤ¤ŤM~06˘Ă2ÖC“Ć?™9ܡˇ>”y>G ţ$t¨Ç-`"äh ‰‹ Ą—j÷Ů@»Ő¨‡v÷'^ę ňoŽĂkfĐČB&u�ú9Pz2[ĎVđvŇw=ßű˙vnu˝ßäµöZ¶/RIâ>â^8~Ńq®­Řb,guę­>vĄč­€ßŕ”Dě‹X%Ąń!”‘©âQ` ůĚC*ČĂ™“r>ŔPˇŃŚţp€#Ü' 4ä�ěO±,Ŕńę§PłŁ7xŻ�y}RHďvP„ĹşřŔřŇŹEćú@3†ôş$uĹşá‚'™÷Wă÷YŤăˇĽÍÉoCŃrl¸„f47źÓ*@)Ç_!xŁGŘKAę‚"nôń2îý!p0‰Q* ?ĂCČ™ĺ3üˇ‹RČ?'Eó‘Q®Ašď˘Ś',MxÚ^™ŕ&ر@!ED<äŃ1B¤Pb4#OmTČ™C}q6•Vß8ě5'˝űĺěăh8Va༙ačS‚ăG€YŽG˘ŕsŰ3  Ëšb&6† ™p…ňë<rŰ‚[b¶ sOSú°ľ8ôţĂąu  Ë’hżÁíU/MoŹX@Ď·:i>ă…9V‰ÇŔĺ=hˇ‰Iś5ˇŚRŚL?Kç’xD)ţHPp÷ń8lĎ.]…h†G—<÷OtŤýś}' ĺ˘`JB/V\Ý|!xďpi•ć{‚¬2 ˝0ňÚĺBöÜâ}Řy‰d!ë“A/1.đś–©Fpgvb˝Ŕ¤ś´×Š ü–-@šńăÚ€Đx˙¨Ú…ű'ýáĂFź)śĚ{Ž'Ä˙ äc˘ňct!})ŁUŮ#´)˝&ý.˘P d#tŞ>q1zĽ¤ńĺ<Î҆hőÇŽPżăečtˇĎ_ż ˝Ęa/XX-[,ż…í PÎ1§) ç¬W%°—ş‘.-‘ţ: ŮôĽĘ×Cvš7o`{¤±•¸ Á$ĐK\ZxQďü2#,UĹYä¨z¸ő#!řŕŘČ7P!o7�úhY“lĎž628ßm!ж–o!2 ±ç—BŠe¬°Ň٧A KŁŇsłó—+´ň=ŤúAiB@?ąHçaČ`R"tü(Ńa‰ .­ěw¸RIZě?†ůˇ˘?KNgä^†ě|jÁáCT°˛h+Ďň5§9lěOăKucj˘äČĚOIZ¨ˇĺöÇÍLöÂ{ţ˙ó˙żů˙›óßćż˙Íű?ý˙ćOĹŐýë‹Á“ź˙í›Ájú(:ŤôČp"'Ë ‚ŚXMjĹP E í6€äjł$1`u†ă¬i ĂY]?®ÉŕbsÍU“ę°+Ę%Š× ŮÍá®ANo¬áŮAĘFöĚžĐĐTR(‘4;ćąš9\X’Ś×iěXn—»s©â^Ń>vđ~®áO3MŹ L†űga *t ý§4:öźk–/i^¬ďźkx‘=±3Ź(°‚űĚťaČCH`‘ă9Öüe˝„Ţá+©†ű¤â�ľ .4Ý*Y‚B„_ťS8ÇĂC#j> ŞţŃ€ź…ßŕ5< BeyAh.!ÓcęĄkHU :,ź ěyóH>cřODđ Ď"*°žŃlŇ-ý„)’űIˇÎńăRřEĹ”VÚąţK. ę”ĺh^(ëÓŇ ŕđüP’`�ĹčźĚ  xˇ~‚MHĎ…'&ň\˙Ó' BţÉéĚJâ}uŔlčÎŢédasr.Ś+ŤWú´í©Wĺ8ô.ZţX›K±ŹR1!P(-Jůł’ú)ůĐ™Ôç[®ŹYčkEłýą:¬“ť#]ł‰Ň…çŚEÂĎ˙ő§=đžęĂĂ!1Ü ‰ćÓŽ©M€#Ł�ŕ |ĚđLăŮ̆0ž€Â„  ©á‘ęáţ™ t(ulů‹c˙*@Ď3;–ĆŇôźÜbQĽ`I`Ţ?ŮeřôüÇčgŇk®BF(@L rf®y‡“ÇE`Î~xćxbfŕ‰1Đ`� Â`TQŔąSt1ŘÉą74C¦÷ś6ńĐ˙�Íń'ć™!@O &5ďs‡/R:Nüť¶îLc’Ĺ>zIfŚĄTČ{ĘĽă÷0–(8ŕĆuˇ ň9ˇöĎ1h±“żwîçş\&Sgq¨‚ŹŽ Âť‡ňgRX¸ #Źőç%]á÷Yq˙ąNÜ˙?˙˙Î˙˙]ţűŻ˙ë˙ń÷÷Ěٲ( Đ �č@@c�%`ńđś*9<|˘PÓcĽ °Č†Z7öP!Qáz¸Q>GÔ¦ýωČh†Ť2Ň’g.Ěa>~LšĐŚ Ý‘ Ž;ľžűPS ¨ujŢ Ű`˝t1ě`Žőt§ÇB5Pe)~¨Đ3 6gź1őÍ{’„Čç âCÁpĎLAęhZ2§ŠďQ ’őśţ±v̇žc?âč ö$ńăřáŔ÷Pd"ĹŹ(d¬[¤€˝´ÜµÂĄ9đo°¤,>PtÎ3Ř OzřG8‰&Ľ„GáŔzüÎĽ‰`ęŇ#ŻHŁá€4Ő3ٰ˛&żąĹ#I3`ŃâD6 §ř€8Ć`ĂD`Řcxč°Bí üđĘĺ™äž§›{Ľ<şÄGýÁ1xAĚĄD"ÖL?ôDCN­.°4’s© v°ó¤dI™3F4ńb�ý@gâŃiç«á‡‘¸S›łŃő ‰3 üc3ĆÖ¸.ŘÇ‚ÜLcô éOŘXŠó¬!M7ą$űřńćŘ`YjíI,Dl çˇĎž‹ ‰đ‘hÔO:1ŃC<`˙L$…2t ×ţÁ1ţąFů$�f>9.ZÇ?łgLŁžCęĹ“Ř ´gtĚŽ‰; aĆ‘úe4cE~Ă GAhĘ‹ů  sÍŕÍ Ťdw,ĺŕÖó#>´˘÷xÇśŕ‚j•Jü‰=ÄăŔs,ôôXËOJíĽÔUĆŘ‘˘Ťßąr3‰HDA$.y`á%ţn`čé[„‘ GІ}<‰ ź± Žyč4đ†Çî=`xNĆZ2͢<p3–sžaÎuĹ ďŃ˙˙ ˙˙wvpkD���������ŕĄ�ŕ.��M€$2=lBWWGVH�CvÚÚď �����������ý��Š��˙?p÷wvpk4���������ŕĄ�ŕ.��M€$2=l�������������Š��˙?p÷wvpkH���������ŔÔ�ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpk\���������ŔÔ�ŕ.��M€$çČoBWWGVH�CŰŢě���I�vR3��Š��˙˙~Ů˙żßŻHˇNá,¤'€˙§űwvpkD���������ŔÔ�ŕ.��M€$2=lBWWGVH�CvÚÚď �����������ý��Š��˙?p÷wvpk‚��������ŔÔ�ŕ.��MĽ$ďás­BWWGVH�C|Óŕň�śúśúĎR���Š!�&ÍśëĚSMĹ\ *…JkFÔhP1zą+‡Vć%Ń͡éE^x&*ŕ„=Śł‡z{â‚;VXŮ[1»_޶žXâ;ZÔš‰épŔóŃG±�až98dh,e= \>0}¶Z°îćÇw)°€pdń1čłQbąL0Ç™  ufAčxDbĎ„>â(ˇ‰ˇ§÷TÇ‚_>Żů ŕěB#îH jł †˘Ůˇ'q <ż`çŔ HO‚}ŚU@O ţD Ý&›{jGV‚^Ĺô ŁľžĆüb¨ě“Ë›+Ŕ˛ü\•?¸ vÚA°îŹ×Ě|ĆC‰6ĚŤBC|= ;ŕ' Í R1›­z+T<XvöIȩ鱲GŻâB>…¤/˙‡a3çŁę?đ Š*Đť‡đb3'Ź;4 ßĺ`…B[O®ĺ2䙞Ů)ČÇđ„�ź‚ČYˇ–ëńˇC‘šlçA;ŮŮT4ÍŃ;¨9 ‰ÇÉ.µ`”%źBq€˝JPů=búgłŔťŹŘ@ ;áŃBQx/ 3g©{4#VPŁEލ9�1l>6cOěbÍؤŰćĚSć0šŹ¸‡±ˇŮTALĚÂ�8ŞzđÖP=żĐy˝FLľ¤ŕ(Ç &BO<qŔĚ~Ča8™@ÎBŐCTšĎq©ĄabBăsÖ‡n<vŃ3ĺďţ˙ý¦˙‹˙oţ˙}ó˙ßďţ˙÷{˙çů?˙1ľ›C;Ůp”�řë˙ř×ţüĎ÷ Ä ÇEÉé×zť‡ śßsK8vî|™­Ŕóti,ô>}܇†xźofŔÜ˙öY"˘d®?]ŤŤś3YÎřćQǡč˝$˘w.(÷öž5FŢűŁŢűŐ(É0Üľe€`Ä®1‚´ë·Ľ©^RjŠęďuô Ńť 1š°‘ŘzőüľÇ™Ę˝uęö%¡†ą‹ý˝ăď/uČú^ď?<çŢÂ[ŢK>]°łĺˇĚ Ä صţ8őĚÄ˝CíplA™÷W1čPgđĚń8sŠ!(Ž+>$’˝ ţQáDÓžK ] Q×ßCÎCÎ:čúâ(Ś>ňk żŻ‘ĆŮ[üi«BęîřY̸4!kÍôÝý?Ł;çoFaďą�^-fýK7==˙Űßô‰e”ă´ň˘ČÍ›•´$m„OäVźÄ_0eŹĽrúS/|ë„ߏŮ;?CŰ\«Ś8K�Ş>Ű^r‡ţO×›ą ŮĹW ´äâśs…Ű.˘tC4űťq^ý˙ż79Ů6šô梵ÝbÇśŚ[G§Ó‰' BM\ü±őqhúhVđlîČ%Ú`łĚ¤ůňsň٦:]%ĎkŹ‘ţyY'먻cJu,Đöô§çZ°~ţ$‡Ď%ÓL Sű!”ř;ă @ÄuŃnŽY=˛˙łX<Äżą©BřÚp_ňiŮ6§…6ěHzÉÄ9Űë›HuďLŻMÁîÁŁsŰo'G,?}ÄýŞž×Ä,=Zl38±eăµĺx„#ČHVĐőâé~†ďe¨‚H]ÜxdKnţ‡ĺ/ơ° ”CíżT~aíá,łÄŽâÁ±KĽ¨Ź®Ł˛ŻôcVQ#3Ü•„8o–×úĎÉý»«sá·xäl$áo’ĎŻŕfĘ3L|«ž Ťś¶ż şéóBž/Ď ’Ö‹ČĺBNrĐŰ6hłŕĂx¨$ ËÓO‹Ź› e:µKŢ™Â{ĎĎ ŚĘç/^dűŽö+~SaZ>şÉłĐč(XĚ8‡#Ćaľú?c$—ßSZŻŚ?łÍ�möÍţÂjs$’ďçbsnöôg¨ÂIg‹F5>Ż{*SYHÎ9ćáĘaű"¸čŰ€ÉOń㌦\űBë gÖČ­mő¤¸c  ćMŹ#€OpĎŰúiŢ�˘Ç(J–7Z’Š?«~@Řöh6‚YśłJ6Uř—9ĎëXg™zG쬝řë/Ţ”śáT˝”¬Ű‘W9/ »Ý‚™a´:W˘&ü©dą^4X-;Đ«Tš˙šçW×óOay…8ńj¬ >=UH6Xëj5Ő˙hu`VaËGęç)â(z6…̵˙őúŚĎę° Î§xEô˙q)’Hýâ˙w䎰qôóI|#nRZ7:=»Ësýbq#ĚźvRŤ«ĆŠôöôZ˘ŞNýÇpŞ"ŚK® —ěÇţ1šÖ|č7'ľä9^Hőa{¦GަŇčjČ)đóČäŮs8;Z$ňő2ůâç«BB-Îő ~“›?§ţ;°baKři?yVúď…ëć”aÖQˇŢ Mk"Äĺ˙%Ěŕ%iŘxÂÁ\ëęÎ˙Mm˘”oE+úmcŘŃ&ţ­R•ş;–aýxvW˙ć ~aúEč¬Â~‰ăéFGçúbóźY&Ô;ĶG‚lŁltdźŕW7&'óá;cóÇßSřăJo€^ď×Ę—«ŽDJ+ň‘žąKoOTň^“.!aíŻ5~ZÖÁśë‹µžËgç’ú/G„Q¶BF@ąžBŘĽ:4z {w˛čd˙1u!ËÇ棔-ŽĆKÜ<¶ŐQłţfüc˙oů„QkŰdů…Í-éÇČ5ŹĚ»Ź¤ŰŮÍČśú˛óÓ—÷Kd%�T!řn®WĄm&ŢŚđżŽýc¬ú_~ćźóf™S;žŚ>n!Č?ŻuöśčÇĆ«![Q‡dgÜh2„^¶ţb]Ş€hŁ8ĐâqOhÔeÇŁ–5Ô0âż0lĹţYb…ÝÓzpâ_šś·â?'[G|˘Ő2Ň7ăč˝$ů:÷‰ëe>ă\éu)ióO‹C;RíwÇ@)şŰrĺ÷ŁÇvëĂoZ? ňPŁFľ5G~^$Ý mÖüěŮŢňµÜ ő°!Ųľ͡[Áß.#?Ęf/ž•Îfµd궵ðÝ9@Öâ9B˝ö{ÎńŘQ˨$Ő< ř_ËŹ°l”Ťr‘…OřlßÚ9Ňűî“�•Z€ëĽůź`řß‹Ďé/MrHü-ďi9‹Xo=\ÜVąeňü5hłn`?i müNžŐ—‡łÔ^,J1”‹­Ź`ěnńŞĎ2SÖ`F©7Or«â·üă”Zň}»â�8_ľ^8đ[$M˝ßóg fĎ8}ęEÉxĹ•÷)Uăëąşo’y× Öć.¸Vw;łŮ™Y8%îÔŠüÄÚsfqhyâÉyˇ„_śť~Ŕ‘C”¨V9ɵ#DţmQňÚÚGuÇz óľÇĎZc"Ů ÄŰ!„KtÄđâϰp€dlôI”O„!ĎÁUGf©Ë4-pýxîw–áú…ă#±r•2Ôµgř®Ţ(ÖWËŰŃ^>ű+MwSŢĘkS±UĽ_Ŕż=hŹËKDYłsb=¸…Ŕ,”rŚ‘©őăéŤĚ༝o/>×{>¨Üň<Ć{…XăVz˛DČhÂAIŘ,rpUět ˝9Ô—ž‘öŚűĘo›®ś­ĺşŠą*Ů•ö®˙î{YY¦ iŕŁĆD†‡H¬Ě®|$›S[¦ÖA­4Č~ő$¨Öéý®žoŽMţ_[ŠÖîšă}÷ç?ŹŢëLżz`­#‘ŕčđß˙~Ż­x3„ŚBÔˇyĆÁÁÁŹ�A!–EÇmC¦”˛ô×;>ΖfcbHt†ŕPh’Q5i“ßMeWŽŢ†ŽY°SlH2ŤôOľĹ#ŻĆ>ü$ř{˙ď˙˝×›iŐOňźA­}(â�‹ ŹÇpH†>b§,Ve‰ëĺÁ®öŞ#G,G@Ďp:sĘĂÓćrlłÚ¶ş#É…ńę0UacB˘"ĹŻP_1ňLÎŹď˙ýżßęµřUÎÉçĎH‹–ć�90ÎI’dĺAÄĽń{.Ď,G2ɬĄZ›ňłPd •’^>ZŰęÖŽ6d6…K6^ѤÓpoľPż8ś?ăż˙÷żŻđŐ¶Ęç|rN7>ś—ńÉĹN¤8źÚéËĎ—)ł4EŮ^#Z(ÇŘw8*\NőB¦™µQoj>« \ě@&Ęů Mud Í}Ź+gů$ăÜ˙ď˙÷ý‡}íîśóÉČ]'Á–Ĺń ?,P éâDR chSëĆ$^›Ť,¦4 Ń«!m äŕĬ؄(ě§v–Ě+ł4ä°Ń‘śÉµF]\zƨÇŢ@ĺ69‡˙ď›3ľ^ŃřsţŚîś3PWšGµsŽĂ™€ëĺČ…ź/hů”+l.JŃÇ›"Áĺ`fĆ(+tľ/°<=´ GZŮbąŹ‘‘F x=ó’1ĽĘÎ*RŢ ›döţßź¤e6Ćź1›óa‰v°âů1ŚIJüPŤKť¤ĘĄ˝™âšákÍŇÓ(aÂÄk`éŤÎ—Éq)uiy­"ÖĐ|Eă\glCĺ >Ľ‚CÉhżww/ň˙qţsúçsBLb‹>P&ü‘1q�¬iůcgůéŮąäŇk3VeHŠâ®Ę \¸…ăČÓśîcČËrđ~ěůô›ő±aî ŐĂKjýăµÂÜď5úmĄ źO&óźŚ ,Ąđ~ 2 ”˛ź–O^,; GڞiÚŠ‡\Şś›@ŁÓąz°ö˛ń/Łü=e`-•.Ť©xt ^'Fá}©.>×Ď(§ÖdV”™ű×yć˙âüś§Ľś|€� ťó¬€4FqČc� Y±Xb‡ú˙wvpkH��������� �ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpkD��������� �ŕ.��M€$2=lBWWGVH�CsÚŕí�����������ý��Š��˙?p÷wvpkD��������� �ŕ.��M€$2=lBWWGVH�CvÚÚď �����������ý��Š��˙?p÷wvpk$�������� �ŕ.��MĽ$ží†“BWWGVH�C~q%ů�Ycž  ¬ š��Šň�Ńs9YÚQ3†°QjZ¸ĐńC#‚Łă˝´ÇkĹâ3ݞđ¨ř!N)hÁ…,Ěëůz ć´'V™~ďëÇ퓟“ńŘçχŒ9šë,Î Ĺ1™"©ýĚ&ČhúăźËG\Žlyq–«8rřDAÍĆÓ<αĆ{aĹ1Ź;©5<_ś—SY�UâB”1mH2­é=%í}żßâÜű.^řxú|ěŤ_ýá¤üŃ),U)MŕW˘#ňĚâ‹¶lNp5ĐŇń(|ĐÇŐĚ‚ř˝X­\ČĄYhI"fÄiÄ3;Ó&©^dëq[€·ß_ßďBo’źŹ¸źóx/s¤]¨śxčuRjiW‘HÚQË|Q—'ĹĎy‰ęq‰w8~•0ĽôÔF´™Í*//A1&Á)@VbęČkč],ÉZĆąűßw+«Éʎ}ţ`MŐ üŐ™ĎNŹt•ŞFˇ`Óc»Rĺ#ŽLű�—C¤héň^ ó&~żÇuŤ!M,ŔU Ą±f†˘Á/úĎŤ^đÔ˘ůqLă—Uőí÷{źvĹź‡ł?'¬YđÁ~óGâ„čp ëŤoڍ6‡Ś’P–¨w$-A¨:F= ČU`cę2Nyj·uđ~÷€ÓSýÉ{ř1ń ¬ČâŘ‹`LĘhµçňfÉLöűmĎěß-Ź?çQóĎřřČFáW3�ĚGT=çćž’j†‚źęč؛Ӏ‚!! Ł—pńž˘UH–kÖű%Ŕ“ä‚č9.2đŃŔЇń^“ó5…KěRŢqüEĽ°Ŕ'łż÷ď˝˙ÝđţsžµÎ±ó»řF3ŔŮËŹ˝®9/ŘĐĂë(vͦü ? HŚá^ޱX ­µły$¤16Ĺvpu2[]- 9 *M,cíŹË÷$5ą0¶2K˙˙Ű˙ß_˙9÷v‹ů˙üç'ď:?ć¦÷ŽqôÚ02@‹Fľ:™WĹ+Ä®Q� -őv©(8őË3/ŃšĄ1‘BŻ–úÚšÝů?ůö<_ŹĽC)kĽPÂŔQăy–*E‘źbá§YZ¦«C/0kp ]¦˙ý»˙Ńn ýçĎ™÷näś]űŔ¸Ź4RXo°—k{0Ć<)Ě™•P˘#:ŇÜ1ź›ë’ĂÇ2vŰ�88ái˘Ůâ¨p縠&cOŐ…Č>46–Źőš,/ {ČTŚĽ6>Ç+ýţ÷ýů™ż>çĎ˝Ż“ŐW eîüx&čTĐăßEŹľđ5@ű2掳$±—ëŰŇ.Gą­2–4ł0<Ť/čŧŤËŁŐái‰ěţůCźđ˘hŃ茪5d·*jýů$é˙ýďď|’Ţýn>ţOŇ«qr€¶/9=čÝNÓU#~‚}× ˛®ľB…,ĺ”Ŕjł,úČ%µM®íý|ra=o({>2 ‰ýkHŮÝ�~-`/aŞÂ�|$9ބÑž˛9§ą'v–°g§Öă$é˙÷żßüműÎů?˙™ľ;­ó řűzÔíAs‹­ ňö�™ţĘăa°Ś¦Ę)Jđ1ź#’m-i“‡sm;ć#”1Y٬ípe•”—z(,~071Ľ×Ħ ĂŔ†¦_DłĚAůqUFÍá˙ýżuszýu?ţ3óőM°®ş üJĐ0[ʆţÝ ¶+=<OAFr!M(>Š$ŻUY2šGÔ‹‘ĐPYšXŻ–°í'GŁ´Ö“ą@„q!+›űqO‹X2UBň cŕµ'/ąů 5î˙÷˙^gäî(ţ˙ĺ?¸·ţä3ŘĽ®ÎŽë¨B–ŻÜűj€‹ÍĂ0§Ŕ b}Ń#X–QĹŃfŚ×äXňłÓJÁçŇĽ!fď,ČKŘň€ aREˇh™3›Ä„áŃTžĄ 2Ă4›viTv…Ő‘óçç˙ż˙÷ęsĆţúć˙üţĎč߯>Îů`;˝ţ"űćŤ>j2źłşďz‚4 č攤nŠšń:EŽŮŽ<#Pćŕ\žŁŃž“1—ńÚ(j‚rO {N(%Gnë05! Ő‚¶&íAV"sL•“ZóËMcs}$ ź˙äţß˙żß͇Ż÷ţüç?Ťź÷mN>ÓŢmé<ŕ»»8};  ·+ ˘ UH)PT}”Rq$íl¨”<— Đ.We˘˝%skđcr[B#y‚Ť–Ą— Á9ÉŤ$YZZ4<˘„gŁ}¤ /Ęës±KxŹŢ ÉçÇ˙üósÎőĐłçžŹŻŻKú9o'yŰJťFó='îJŘî«R:OwdÖŠa€Ć-c‰ĺR…ĄmN8š¨Í ¦5 şśěC^~ ¬‹Â\Ď9-–¶±Mp*o}0?Ë Gń^ËU‚Ś0†iÉIšZµ=–=§iUĺ&ţôűź~žw®qő<őÇ×Çâž“Ěq-ütEcΗL‚íÜL˛ü.l’śŁ E‚ń -™—Ťą¸$Rśaąđ8âĂŃňŘ©#_ŻYINJZÖ†EĂY�ă1ę®Î¸E!y@Q'Öâ¨.K2 MášĺiWµ"±©?ůüüű÷ß÷÷ôő‘ř{>×Ç×ďÖ#×ă™_AgDďžPŐWŮ­˘IX Ź«Ś,™˛eJQ”jS€6�·’ůôäPÔ(ČBÓitD˛”©ĄíÉů Ť ĹŞĘNQĆĎÎÉąéę|XeBh«â©[伄‡JtR˘*µMÇÔÜ#—$”Jźóăď˙ýď÷gŹŹŹĺóěŮ||WäÉŁŽ:đéMŃÄ÷-ŕ~nüUz`´)a¨“`y[˘l]Ę!Ь9\ň6*ßr–ţÜ9 Ď™*E‘śŇ’xÄÔä4ĺ¦đľ Ô‹gÖkŞ|¨D©Řś®@IŚ:Q°Xł4»ÂËô,Y5ŘŽd˘3ŃŢ9źţű˙ýďźw>>ľŽ¶çöőq]Wtg“\´_I:{+Áë†$wµęAZ*I8DÄČ‹)Ęˆ*˘¨PČ&†öš9ň–±˝Ęłôł°–i‰¤)s•ü´PĘĂłao†žo<Đúńcv­ç3^—. ›rç`Ä6(§D<ećK-h:­2·ý™soÜ“ó™˙ß˙ď˙ýľţřúbĎSçăş.ĽwÇqěą­dďvtˇîŞyřű^š9M(dĆd0+Z65cŇ™HŁś19¨˝hzCâ ["*X‹Ć&§¨9 Ťv´b|iNaŹďÄŘ>Íî*#·Ď´îö 2÷ ’dŻÂŃ~"ĄPFBĹ5ą±QÖţQóL.é¨9ç˙ý˙ţ˙~×˙ůŻĺŢźűąľ®/yNŐG¸˝]M0[S5ÄďK…@żżŞ°-¨…"@<Ü‘ÔYđi„’S,Çĺ"ÇG`,sfÓŔeɱ¦&–Ií Yé#IBáI@•–ą*‘L<ĹŹM<µ; 9w/<oU¬ĹŔĂť ¨Y”ösVK„§¤ÉI’¤´ilWŇV{˛š¬gzĘ ś•śś?Ź˙ţ÷˙ţ˝Í篏žç=÷ëë8{T#~Rp�Üi“–ë•Pęwe}7ŕh #óŢDR<ŐMGŔŹ\‚ńĂeŹĹ‰SŇěç”$Ď AĹSjDHł Lqíj9’8 QŤp™ś~Wđy~żjÝŻĎ8˝î™ŤőˇŞÇqüč¬5a.Â""é#s—.¶ g‘’'"Ź/,~j®Ăľž…×Äć˙ű÷ë|÷>}sÎÉŃt�Z¬Sv$€_‚žxŢĄa’ÝyRzF®-Zň˛#Dµ$ä)ŞŠĆŠTNšBť˝$GžBI—¦\Ę "^ŠŠ Ď9'Q’«ÎňŽ x‚ˇ K5¸{'źsîż:źgďݟǹ?á Đ>SwńĚÔ~(.dib‰‰äDqÉ8‚Ľ$lNi‘ j®đ˘Ë’…ÇR ăĎ~ţ˝˙ţů÷ťŹáśßźçÉW 9Ş L'd°-č#ொCtŢZDW1Qc€ô^c¬'-NBrd8Ž4Çb9L?QŐ5ŃŃĂCË8ЍE0jyQ†'ĘIRŃÖUd˘GQˇČr>ĎťđŚßď7ÇÇđů©ć!»Î¶ú@äŚ1;đ™ĹĚ6ŔĹbs•P.Ti]–q rŁ´ąřÔ*.]đfŁ.Áłń•‹°ós>çďýŰ{óT˝÷űÎq€pE €QKhĄj’­v†‰|#d\W–4�R�c7Úxí,ĂXX$ČX/JŻśňťMł>Ň,4‡'ĹŐRY,„Ď)ŮtDEĄ±öĽ‘(,áqżmţś~ż÷žsžżóÇůyë“ sąˇą˝�[ÇFśR�¸¤ŤbůΑä°Kr-RFIâ™Tn E€gz’¦őŔ±ŽĆ.ch¬Ĺśďw˝úŕ·×#ça>;ă‰Mu^˝ŃŞč§.x—2?‚ââEÚŞśY&ŕĆ%Źą‹E–XDD;˘ŔË ‘sˤ#QI 8$¬—cÇ 5¤öHVé9…Ď9ßż÷s”“»‘Tgv081°ĆµžŐÇ;“ŃÜ'bʡ!í9L‚Ř”ĎX DR ×ËŮ�ÓôŔj0»1ňĄ5}o&./‚îńT¸O}đ'řď÷ë{ÎřýŰď!I)B‡Äę ‚)ŰÉ ŕ]yť`É�ńJĄŠY|&ÂRĘxÚgSv¶%fG�~]¨±8 ÝIM\ÖĽ "?wvpkH���������€2�ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpkD���������€2�ŕ.��M€$2=lBWWGVH�CsÚŕí�����������ý��Š��˙?p÷wvpkD���������€2�ŕ.��M€$2=lBWWGVH�CvÚÚď �����������ý��Š��˙?p÷wvpk¦ ��������€2�ŕ.��MĽ$*FăBWWGVH�Cl1ő#�ôô˛)ý*��Šł�‚R”#Í%• Ą•™[ËL‰ŕ ˇśs˙żë?8ç~ŻNĆ^¬0Â^NK.F6…GęBóŠw< zH$µ&cŠZGbJ0Š2TňH�}GŁHGćCFiŕGż«™ř^>ČŰüčŞ0]qb˙çó9]ůű{LÜď˝Îy á:‡*RáŻQ4徣 …W?ŕQWp±`""yĽqť*~îËŽ|V&8÷¤¦ĂËÉᇠ>§6EŐň„¦ź—D2ŞN©ä?i¬żv—#O0S2u>ý˙®źë?é]Čđy'OÖú„ŐO. ˙0"5\z eb#p5‹l ›łŠP.ěÉRZ)ůY=#0báů>‘<=b¸0"ĎhţĆ=쯧†żň›ąÍŚ?gżúôŐYX˙AČ$ÉgÂ… ‘vKÓB­)0ˇ;Ň…ÝHč@ ÚSxgGXĆ{l®ŰďĘq=ÔŹqůsMEŚHaOňçšbáҤ¨â"wvBIÉiżSôX˘§D‚ŕcýçôűú}ţä^źĂ_sśVŔ™¤I• «y‹ŮÚ(ŹW†a‘<ă #*ÍM-l[R •z– Á…łÓ„çÔ†ĆęüÎ)ONóRjvwěBîcďGµ‡ő'ú“ă´ëÜŞ]|ćÇ7SÎ0 (Ń—ś2ĺFM%Yź"°#AŤK)˛´ąöŐŢökG’¤ł–~R|xÎPŠć˘<–Ë!‡Ć–©ť)>ˇ‚p#&‹;ďÇ“ÚG?îżĎýŰĎź ʇ±.~î÷=ř jd=ÖŇ:VIa‰¤4¨ńŠ–©E«.˙’:žŃ†°R¬űă9١Âaę2 ~raMBř%_Ľ&5^ îůśźQ˙®˝ű]Ńa ŚÁ®aôđ@NBŠŕuq&\Ľq$żČ-’đŠ%m.JT,OóÝz_Ű{RaTöxv,ěłdüĐž…J@OQůŇËŠˇŮÉ(ŮrÇĎľ>ýŰś”8s{ĂŮxx3›8ĎŇđKÍń‚f_wV» /×Hi¬Yľé,Tĺ QňŁBXÔçEËg }V CÂ= Í3šśgś{{Mä‡ňH8¬ íÜ•3ĆDˇě…SUä+ s­źŕ&Cý×Yx`űP±_Cٲ&bjWŐË^”9Ö)ąźs¬x"%ʦƞ§ţ &VǢf‰¨ *4˘*TśYCîSĆ~÷?x?üŻţ°7/|SkĎčź”9ćJ‘b â‚iă\Ě g˘÷ňŁQ™¦´űsŻfC[Ţ˙°Ęł–Q8ĹńĆ0<ˇ5V!Ľž’€WŽÇůč}¤€V°óĂ}pžő—Č(äyPÜC°šŮU˙čŤ)O§Zçń2t#N okJż÷{ďý»uîöŇţQ(ΚX…ÁRX_(Ů'é)a8ó1Ç"CShYx,,ň¨0;7‡ĹčhUöř­Ĺ_XšZŕ¤ŃŐ‘őôOrŢ$í Edq‚fş4ô¨ÇýżĆY!›N>˘­&sxŕ5sĆxrřY©†qfłDž/˙ŃoĚÂŚjĐŹÖŐ2ľuű×ýî÷®ęn“ÇţI\ř¤ôÔXJ‰×•„Ŕ„QdčÉ?ôx;XŇ‘ 7Ř{ě=.Ěw‹6‡6YçQd®ť ’ęć"5úŁĐá>î4l~c}1ôî35Ë,joVF…©ç˛éÓÓvć…¬á0Sś§ÄÁ`Ćô*Düę‰${x8dĎyâ:ł>¤1*'Ąđ"aľT©ř±ćëZgö׾úÚďÓľ–Ţ’(tTS“ó‰ dé”|¬{X…áŇ0ˇÉűźĺ  f846<(q~j–ÄŻ˘í6ó{q¶ćRĚ?ň,Üá "‰Ěă=8Ł'/ŕŽ#B7Xţ'1‡Z°“_Śv kŚ{AjšŹh?ä>˙ó_q2xÜ ŐO=şČ@ß RŤ87ÜáxíŚÍ5R´¶â\W÷vwďüjŠv ;Ľ†DNtTÄÎcu0Ő?$üĺĂ:1ŔOĐ Ś�!ÂÂŃřĹ#>óžLńk R mB[˛‡î*buć.PrĺG6:Ő'!đ"ă‚ęş°L5IÍIK‘4}‹‰UqĚŞ0;ҸČţó~żßŤ?ˇFÜhR‚É µcΰ‰xBT÷ţ]O&,ňîE„xÔ®q¶•`šÚwĺ|ŰsÁó˙Ŕ’š ş|zĘ,Ďp°Ä©óK‹ eîĎ`5 Í˙·˙żç˙ßßä˙ß÷ţ˙ţ˙űţ˙żßů˙ďţ˙űÍ˙˙~÷˙żďţŹ˙_ő˙ď«ţ˙˝ô˙§żäüŹ÷CÉ™O7â ńę~ş ¸u×óóůˇXü‰ťVíŮ|B´úJ' Q†=on*j$LÎH­Ej1:řxŻ0O0°W!kd^xŕ<łĂi-śÄ–č \r ŐAŰ 1xŚ2RđĺŁAĽ t3Ú΂̲óÉĄ¸PdlIřsíź“‘¨¤ućČn9‰ť«  ëôŞ˛ňl˙đ5°÷çĂÍAş?řßťą/uŔŻ Uä0 "çkBĎ1S— *c]Č34f7;UbWčŃHN†-ÎXNY–󱤉ÂÇXíč¤Vä9Y("ËĐ59sŹödĚR §ŕ8ĘM ˙$ł_Đž}Z$üëů‡şsJ”Ő :Ęyďű ç/ÓRĂyMJ µ°Ö~¨Ď™­:U؇Ä\ď?¸~} zN• ŇnP?\`CPť1@62…30żő#&â™ŇÓě<ńÁGćŠ â†&›=ĚüôĚ:Šă˙4·`9j0W}J)D’”Eóɤ$ĺJwýbOm’ÚGá3ŢH¤Iřţ_ýĐ‚÷ץré™Ő1ĺźÜ%E>F¤E‹ŁsŁÓQ'QV Š‰ŠŹß*źK? ‹r>Cij7hsŢ�sF°úyk~Ô˛ˇ�îyđÓÖW>ˇLŢM}ŕiüÄÉŻ1<GŕwI´°Ë3´ďf´ĺüe:<úNluH/[…Ľ—bwPöłCeŃťÓ"ř{™ö÷oäeźę®N"‰ MŇ�ňcGQ¤ÜÔâ÷j`cNůrě·Ďä}<őzÚ ňc VA­Y ~>+M}9RîÇśŔ”G~úŚĽĽ`@xě„;0őúDŃ(˙wAýơbřhże±4˘KZ]nôď €«asô.ÝĄDë§»˝7w‹ŠˇN—5Ł`<Ś‘eL.Ť…AÎđ˙×Ʋz DüůŇRççĎ‹Eďö! \Őá“óq�ćŮĺ<ëč !÷6˛A� Ůč!€‘OR•Â{ńřľ6Ć\y°s°üed’€Ű(Cwş<cŇ)đ6źŽ'n¶«8dň¸Í’6sńŘ~ŇqłYŠtnÄ-ĺHÇ�\°‚Ć"łĂ®ŕ5žş‡Ţáţ ŇŕĽÁë*Ě;$:NH!WŻ;)$މ &Pć·Ő?ţ™Ý9”Đ…‚Öck‹¦)Í!Ž×ôđ †~wÄ x•°ŔÄźC‚0çĽ!ľ"Yúµ±>0źcłw3*rň›¶™0¨_8]k¬,&ߌYZôQ$Ľ@gđ´¬{A›Ěťß#qÖhU˘ŔGŘ \cý™îů·B~¨GŚŕ6�" C,ĹäĐ˙ >€•„L2ěÁˇNć\a˛É–é3wó°â7†ů?—hP{=Ç‹¸ţÜɲ’`¸>l¶–N߇÷]ÄĚÚĐ›,J˘ůĹŮ©ŽJGotf:`Ľ›Dţń"o€M îŠJ 1&˙Ń‹tňłŔžŕč?LQ•ŹhT€&FÂüýŢÔ„??¦˛BűĎ€±Pěńč<Ę™§5¤–{†ÎçŁX¦°Hú…hŕźyĎí.t§.¨F2Ż…Ôšžď˙ňCÓÉŚŻpő3 ö3¤9üđ1Ě<˘zÂC(8‚`#ŘŃ„€/ç•1Ţ™6ő~ ďŇ×Lŕ_sü•'Q…졕 Y ‰ÁçP'ĘLóS +Î`§Ď”(?Ł1ů±´§7?ÔŹŻóˇ1"eźâöäy €çŤÄäzPŘ=ŘcqzB{¸,•Ő }ůpĄ3¬ÎrIYxQz-+C{ů÷*ĂE¦ţLéO˛Ě|˨OWŕ X;< lŚnњݙëŇ{ÎXÇ´D|׬BőC&sü<ďÁÓř# )ŃP56:nHŽLV?_.Ťß)hYÁ©Ý­rłQŹŕ+¦ó—eĚúc …â;†ĎŮ­-ţĚd™4 ©Đ-ß×<îzgÇ.ĽŁ«éqY‹ÚôÁw!2.eÚą(˙Ś7Ş?&őgž5ŕ„Ě ” ÝNĐĐ–ÓQvÄ{ÄśÖ^ţ*5íĎÓ ş,P)!řˇqĆ3)Śń(¨FžFkr±˛„nŻ’‡SĘ™T©ł&ćx^čR$)č‘%ÎĚwvpkH���������`a�ŕ.��M €$2=lBWWGVH�C|Úŕę!�����������ý�� Š��˙?p÷wvpkD���������`a�ŕ.��M€$2=lBWWGVH�CsÚŕí�����������ý��Š��˙?p÷wvpkD���������`a�ŕ.��M€$2=lBWWGVH�CvÚÚď �����������ý��Š��˙?p÷wvpkZ ��������`a�ŕ.��MĽ$‰K«BWWGVH�Czě �ë�ÔűjűÁ†�Ü��Š �^ÄÚ{Č[˙R˙ß`ßŐf®"ôŠçŻgi¦ÓÂgń!;/Á Ec#Ž xaýśPp·OâCt�7É!‘SAťQëÇZܲ…ˇşÍâظ/ŔżĐkňͧ‡8¸ű%ĘĚĎźĐĐ„Ř?V ~<­rÜ‹‡eLţŰŘNÁÍ\o,C˙ßÝL^M ×BÍqĄźäě)ôë^@â¦?™@YC@%{d;5†^ÁBĆo 1{÷Ŕ»”ŽD“Ö!ĺł5pĎţbE5ôÔJYZ8+B|ţ0;Š)ĄŮ€1 łE˙1ţ+EaćI˛FľGW¦ăöúíĹÖúííš©ýFöZ öŞá®@i)ąŰŘß­ TĆ8R`śKëEśün2§YôYÎé2ŘlÎĄÄň@±žsĂŇď}řÔś`ů`$i†ť>Źa(!‘gTĐÉ(ĘCüôÄžߡÝAůńä"Ínň]ĄÇ±BWöűlFFŰzO٨W’=ĺQĚi µđ{q Uż ňufKćQ&~q(Şb¬— ľ4=ٱŔŻń‘Ô…'Šúű™!hŞ ˘•Áxţ Ö&¬űa"L®-ĚX-Uč~O¸sČSC)ĘpĹĚиřŁ#ăÚ…§•G©’ÇĚ5Íú^7ŹGŤ {Ŕ™~NCúskL¦áC&d‡N¸v´äŐ‰†Çs¨’=TÁBfZýČ2ý÷‚f\?˙k�3…‚ٲ8ěgbŔ‡f$” 0ç*·÷tBOPâ ‡)ĂçYĂÎşŞDj3rvČlż˝ŁĽ‰íŔ;EěPPÇe˙éh T ľ‹&}t˛Ô(űĚ 9ŔѬ)°@vŢ“ŮXZW+–\ŽëČyl¬�ďo°ŇÍyŃŠ7©»˘ăI“şŞA®2ÉýŹ0îáŹHšFĐ©hÔë§Íç/S±;ŹŻ‘µŮ¬Í˝Č]ŰXż+}ä+/-NO|5–ťőÜw2bŻ=–­á—mĎĚ˝iEě+Xżő2±RJ“ď ôŮČĐĆä}ć,źQ*ňÚcIXd€—ĎFȸ̄üDűC”ůCsŚbýŽgر>ę(ĚńS#rUÍŠ^Ň}n{µ”rŻ3öÖßzě»’›ŔŚléźsýĂ  ËŮĹńjF·ţ‰‹,pˇňđhGyŁ"%¨ůĐŻ9�„Důř(Î˙ s0Ă=„D#±źedőp=_xí¨2ë-¬żŽ®–YşţněiŁÖ™RŘ"ŁŹĘžńoßěs¬Ń©bÝ#71(ţs§C%<ć,=źÚů€đőc¨CĘE‰lâ'ÇdbA”űgbf PC°ř”÷ÁăL´O­od ş‚»cş)v†ÁĄ*˘Lű6ócxHřUDŽéĹbź%Â)ć?28_*&Ž‹ŽiuŽŤ1d˙ٰpH¨ÔŻďÁő…fo÷ń” üRĎBě ˛ńŻ;Xč:;sXŽü=ÇĹâ+(…ŤC•#‚?´ŠF}ę6Ď\^Đ·ůÄŁÄefŁ Ó@úˇ?=/0Ř‘cÎEĎXČ÷�o­Şˇ…śłÓˇÎ9ľLĦ¸âřŞţĚl Y›ç±ëAŹ"Ôű'ދĆ®¤_פ™»Ő<X/¤"Íř`˘źY>ÓAj˙C¬¤Ů1†<3×HB"^í@PGÉąśe© }<Üí÷ńü;5:<VŻH±D˛Ó!çY>ĘĚ‚g CŕÎÂÂ… ze|•ř:x“SŢ Š¸ókŘń*éţˇ”Y˙řXŘäy#‹Ág˘ĎçâGT´ĎŁ b@$\ž~_ ‰ăŻV\űűŢŚŻđÝqőěŞkưí-+›ž‘ˇ÷ňÜZ“ż§.?Fďűz” "°ç«x\®® Šó°ů´ç#đül(††Â4Cţ!ś•ČsĦҫŞb˙.¤_G6菻±ł"GžşâÎÎ{¸_ZS{LĐăäH ÁYP@N<%7ŘöűÁo<±cúŕQŻ]ARD߯Ś)jöLďd`Ĺcü`ďŘš¬L-GÝ~ęő*óűT‹RęĄw,ĺj“<~Oë]ĘH‹K“c3¬2Ěé< ~ŕ«a°‡é”pŘ� gÂRbŞč;ž”?°ńď«CRô~¨źç‰"e0 ¦ĚđůĹę‚°F{‚ô-ŽÝsřÚ kA�ËjW·:ŠHW™Ł ô“‡yóAiwh4`@öڎB™0ó'Çŕ&Çp1¤`ęy¤nNźÍŢ µôn©ŻÁwčŤzUňŽŢ Ź'©÷0ně0?”q  2Řń>Ś˙<Ź/xwö_8˛ö1ÔT ł§gĐ#D$řs´™RËśTˇ-Ţ« ůáĽ4ü ů‡é.p‰č .Lsď1ś—ŘŕIÎr¨Ě쬞 ¶%Ił›ą~÷‘V´Ř šÉË1=I˙Ýé‰ěj¦–%ˇ;~śPCä,xˇţŮ‹ĹD?„_T ? 5NYř°DÂBĐÄĎež[ň­E›pŤű5s=<­'Ţ< ßN—çq%´¤–�xĚaiv˘…7uŐMß|EEŞ8Äkv†&-ČŽçĽđX1;*Ś&¦üÉ!ťđ! B»'m�ě(G©'Ď ¸ř(DťŔř X(ńĎ’ĐÁĚ`1–ß!7ČÖ!­ń®9Ďw±ÖŃń^ŐěÔWŮŠő:Y©r…j16cG;«ę~ –4ç»Ó¬®řS=dبíěřü¤9ĎíEĽ5$Ĺ%ą|8Ń"#ćČ­ŚDçɦ!ć™)Âç€0Ń5ô>dÁŽl\múŃě(rÁMł'–G¶ç¦b1Ĺ 3&?O4Áü(•"wkXÜεŁZĘŐ®ĹÂsäšŘŽJéçÇŹ[?Bčq�ż®3Ňč(„łDCJ7C-<kÜAŢÚ=´ŻKw>[† jxpÚč΀–ź!‚OŢ@3JŽx@pjh21{ýNÍ^k;{ł›ĎţĚ3Č)ڍ‘aěś-a ügřŕř€ŔDQŔÉ9™äD4±:—4ż.S+ú»S~í Sä.ŚžLt GĐBźh°ÄđŕHţAĹÇĄý'!Iă!h4ˇÍˇLßrjňËÝĐ5ĺ?Ęf„VQڧôCŁČ*áˇAžYüÎËÝ+ĺţ®ÍmĘDpkC4fN¶ IÍٵ#r4ą¦ń‹Ź5d¤™ăşˇr(ÄĘ´¸ńň‡$Śg†ÓĺÁl<ş‘Qť`q,” ˛ÜÂLĆödÇX „Ž:€9¸CÉĚa–cMŘ[ÖjňŞžsŐKfëçzč~@h&ĐAC0ŕh�?±0@t((<;đ1?„G'J+TĂŻ9ăÂÜĂÄŘŻ1ŁĂq a ~&GŮ- śč`Ź‹M{Ľ şEÍ©ÁN‡ł8ň‰O0\…gy0@«E}y°3' Č�ôĚá3śč�:ľÁh€�vŕexh�: ŠŽ˘(„QÎ Ť†Łč$�§�‡Ś#Î Í)âČ�š:eŕ’A˘cęšRGOSźÉŔČŔ‹“‘i,fŐš=ZĹŞ¶%`eŕ´!‡ ¬RŁch†g–2 *´Ł‰‰©0Ń›'Ă2đ ßčÔAo“t”wtp`€fbtN(tOýŔäh§v‚®Ń l°‰u ĐŠŇLĐ15S/S×,AF şF«7UŕG´6pĚ©ŠQ�9ľt&F8bŤš<MPS?4K¤cj§¸”]±DA…ém‚fřšún€LHŁÔŔĘ Ż•L6@Ź6h )ˇ@2@kŔ‡đ»3Ŕ=Ž™€LĚ€2ÄNýŕ$=Ď€ą†HŁS?¤Ó&"CÜÔL4ń4ĺ0ÔŔQL^ő˝ţŽš94�<,©Cřna��ß5ŕ‡€cŘŕ`CÜŔü˙wvpkH���������@���M €$užBWWGVH�C|Úŕę!�����������ý�� Š��˙wŔ˙wvpkD���������@���M€$užBWWGVH�CsÚŕí�����������ý��Š��˙wŔ˙wvpkD���������@���M€$užBWWGVH�CvÚÚď �����������ý��Š��˙wŔ˙wvpkŚ���������@���MĽ$ýŚnBWWGVH�CoŕÇě��ţ�ţ��������Š&��6ŕ€€C/ŁÄˇ?R&Ě ? yřăF ü2ţÔĚČČ9Ś0Y�řĺ°�ţî™h�řů„€ź�ţ0řjŕ§˙������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/garbage.mp3����������������������������������������������������������������0000664�0000000�0000000�00000017776�14447736377�0017173�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������e"x˝“HąüÓÚ– šF0ĐCgőíÁ5…°á[ňĄ¦OÜĆ89�}—˝üő4¤Ă9ó2 ‰¨Žoble°jĎ"ŢWč ŮýÂćý wž‘ăčÁ˛—†»ĽłĽď[Ű8�ĄŞK[ů`Íc5ŢwU˝dkmř9őc°_ßľży=ů$—3a¸)ČlĂkłß`Cščv ¦ş»ó©˙k8´ä˛9rńW>Ž\15-‡ä¸„ŇÂ/©e€oi‚´ůc É*ń:g6_®ä*źÖÇN(m˛)ŇÝ—źěXZ†Üô|¡´'ÇP§—®3ĘTŻĺB€˘Ş%´łlŽŔ ŐOtŞŰŔ'ąw€ĘAH/bT.Ůbg9Ôĺ"f3 #ôhG˙óÔ@6jÎ9ĄfćXŚ‘ĂěŇ÷|5ýQn°Î6囫ůĘ˝sµ.m ÝN¶Š(éľĺĆn9�$Bě\ýzpÚĚä?í˘@H›x˝\Š˝·o¸űŁĚŐ"#Ďť’¨•—ň±‡1°ę`TdBˇ˘ĐűĽ„śNýµqŁ?Km }ôR1ay¸9‰ć(:µÜ©Ú˛>łš,V^FŃăŠUŰGÁßnµ8˘ÜĹęVý‡ga5Śĺ=©cOˇ‰©ľ¦k§Č˙‘„“»5tz´-…ćy 2'«Ů’YűT‘ŤXNQÝtĂĘŕĽă)Z˰&1uéÖ›[j:ŢÇŘLvE’y?l-&äg•ˇ›Ň•1,ę=™`'‡áŘA‘Wʉמ¹·uÔÝ3M8ÄjR$VsĽ}¦F{3Ľó€~ˬ.“˙á(~|QáBť¨"ĐAŰv_?çČLĹťN`ÉIť0°SĽ›źĎŇ”r—¬ ßĚč­ą7‹úhV1{hďČұ eťÜôu/qÍÄ»´Ţßn‚T€]b¸L6ţ%ĹâKĂŹ¨ÇÍ7zD~_ouŕśňTËźwt¨ܧc3[˝aˇNÁ: mŮ˙”.U=\ŮЌń^ľŢ~ ĺúM(˝˘}bĄĎĚÇ»N‹‚ °{L{%k†J…ĄŔ~sÓp‚ĹëWą˛Ě®TM‰m˙¬Î+ýŤÖk9 �¤ŞÎ̶Ţíă˙ ›y«]h*V,?˛ń€§k41^Śű–îŞt§6D%›‰ď%ܸ‰[Ôé™×˙0üÓ{†nŻ ŮÍŐA®Ů8úY:í\†UoeBŢÚŽq?y4@{ňhÄ÷+Vxxb 8óRT+pĘŁ0¶Ńt]UÖHŐ~ rĐ”ĽˇYeq$ţBăĐýâćëÉü˘~ĎŇ·9ťŁ¬y‡ąMö,o,nđAUBÉEóâÄoŐ ŮÁ*Ű×Oăľ1‚ŘĆGÉř»áÎś·Y«âE›µŞÉ!FHŐeN+őł‹ŰŚ˝…· ˛ř$Ŕ�mëŢP_ĆÜaČĆo ŤŞ™ź˘˙ŤŽľÉĽĄąćdŮÍ/Ô¶ÄŚ(×Y5p;6%ŰńÖ¬ú‡Ţëć¶P µí˙†qăß$3®bۧ�¬€-Š[„‹‚ß á °ú\JY­ńµlC =§{pG´3#ue··ß›7éűĚ„nłżn©U�_žś{)K`Ë!¸őóJëÖ B„ dL=ť€,'wKCC¨?);¸í2qŰüX™ 5;lBM¦+Bc€Ú1yÔzy;b'˛Řsâv‡7ápš…�}Z°•0‚ćŕHşd‡J‡xÝÉłž~}|ĽţůŠpş.ŐIˇ¶°2„‘9š„ö ÜřŚ>޷ˆňßrP$Ż€‰=\Óö3FźŠFźaH1z,Ľ—˘Žłu$Q@”ů•šŔQŐÔĺňYÎd“ T$¶ůI;đŁx€§eŇĚ0jşľ §dźÉě¶ŇZfš—ť’°›b¨ţík$2±‰ˇ—^ ÄŤ»Źę!ňű˙<›§ß”-Ű6\Y´bˇĆLmüĂ0µöÂ]!#÷řˇáé*3|ťi{Śx+Ô˰ŤWżKŘNĆ!ˇ´}IíôX ^A×&ŞT5č) ł8AÄQŚ}×Çč§]šLŢ€á­Çž˛ X:-$űôVÝĆ«Đ:Î 7ÁÓĎ Ě×;@%IvŘ„p‘÷>śe'héEź&şk{8·pË«î—]`,•˝řŢ’—¨(NúďđĎ’ŚI.)Ť}y´·­J’l(üFéű±óŢęĹ6TzěâDćŮWÚ&ž__yÇĆeN$=C8ł4Ă«čIZň‰ Ö 7%t‰\´Z+ŁTÚ´4 #P)hÝQXÄ[Ć÷đTĎęÉż0ôÖ÷zKQa;y*ĹąĹC˛=Ű*_÷Âş|.á`cŐůľ‡”ż8m™=zßIt#ş—ą#ŞŚD#lH€3 ”âϸçÝ•Ďâő6xRy±ŕJó\ ×k–ÂÁŢöńčĎóŔŘ(ˢ6Ťö ů<ŹNJgű4étŹĺ‡Šk!…Öcž ć–´ż'gíY•ÉóŐĎďŘ®‚óŁ”ő7e ÍăÖ¤#nrÝőĄlZ”őČtˇyč)Öq<–eÉ?4pë”Ů9s¸gzdĂm…Ţ5ŇŁž1†^ć l/ř€ ÖQĂF&ńó§Ň�´g’˛S:ÖŘ#˙ZID3����FTXXX������replaygain_track_peak�0.920032TPE1�����˙ţA�r�t�i�s�t� �A���TIT2�����˙ţT�i�t�l�e� �A���TXXX���#���replaygain_track_gain�-1.020000 dB����������������������������������������������������˙űPÄ�����������������Info����3�ć^°� !$')+.0369:=@CEGJMORUWY\_acfiknqsux{~€‚…ŠŤŹ’”—šśžˇ¤¦©«®°ł¶ąş˝ŔĂĹÇĘÍĎŇŐÖŮÜßáăćéëîńóőřűţ���9LAME3.99rĄ����."��@$@B��@�ć^°x»,¨�������������������������������˙űPÄ�Í"Č!„|Hµa�č?/etyeb#K?˙˙2#˙̋쬣Ž!ŇËŤö“˙ů´űOý&_˙‘öV"4˛ĹpLâŘeÔ4ó@@Mšš6r°á“=  bvŤî?%:8…źoçśúëŐó‹>€ ¤ň+ĐŚé9˙Őś ŹůĎިO!TlŦ§!•ZBť[ý°âßąĘt%żĐŚú´�E*—ţ[ch€mQX ŁXPO;ź¶é7ÁĎÂţhĺ ‚˙űRÄ�ë%DzAxłdÁ hŽ]É÷ 0HPV<ňvLXóĐ0"2đ†'t‡Ĺ`B´'rţ»žő÷=Ü ŔŔÔp@bÁřů�&4&'—ßČľź(ü»ßw†• Łw‚$©–™ČÝI›#Ë43",”žeî{šąž\iq§ĘNŞÔ#ű‘%žńc’s)›ňo‰/¦‹:FĆUĺ%–F{žÍs6“éď rÓuě—ó#ő۵˝ ví~µ¸”DQ*_˙űRÄ€ x—3§lX&tô‰XśGqÚ„š(§íPXCŔZB$‰đ‚Ą¦ę`”:·ţM§oŐ?#:(­``”YBŐbÔřşhÔ­V˝EĐĄ\UÇÖŽ+îU»×ÖĹż i¶ö4”d’yرŁWHzÚ1�Ε.e€…(ŘE©j<3Ňr3ÜE5bŮ`J޶f—cĹSA¤¦‚«CĚŇžD_˘†–µîy¤[“Óe5öQÝąěŞNŮ.¤Ě¨�d¤I»ÔAÄçqÓ*‹˙űRÄ € <o/‡°g‹ ep¶ 9‡ĺEDË×&L~Od1űŁđ—N Ęu©é?a’Qą0¶u EP3/h°şFĹ<ĽŔá[TDxˇ†´"»H*ę.ĺ‘\˛?«0BuĽŔ5��€d,„Q�’Üľ=6,M—R8Ô÷(ÍĺG€p"ů¶aŕďqa7ç q˝ŠŢĄßËŽgđô«o“řjżÁŰ[ăőήÎřąU?2—7is“j÷ekR_˙<Er[nŃŰŠ�«(ŘĚhQ„Ús­‘ß˙űRÄ � ‡/‡¤iAoŹ%ôö 8@D\™4 �źUÍe˙¬ĚBŠ[!•ňÁśˇäŕĹšő ŇtđÚĂ lŽ„©"Ńw :ö*4†*‹Ňy-KHĘ1xQ©[fF(• I¦ĺ·J¤%�š‚ĺ LB Ć Ż10 ‡R¦![S âÄčwúSŮâňäP¶`ř*0M!“ŹUŹ‹$Y’e* ŃVÚŹ!†ű˘‰n¦ű€´”{Ż3ý*6[ľrF‰$Źk/tRn˙űRÄ€K,M1§¤Čd‹&0ó Č­$ď’d˘:H� ĆÓ[ J ,ąý;řZĺ 1'ÁłIr‘•6Ă‚˘‰ĄÍkTÇÁ$vL4ţöjRN}TęÚ›5BäČZoPšÁňM¦ůŻť.Mb2% ôŞ|yśíN[TK Ti>|"âVPŞül.0$<U.•DEĎTš z‹8$tm§Ú"»_îÜŻŇ™QF̵rěPĘl"ŠÝľ’EQ$C'%č'&C˝¤h\đ'D˙űRÄ � m1§¤Çb ć4ô`=Ă áŔĽĎME#9>_wćJdOĎO_SÂbŻ;˝KR]”Ť}c˛iYçďf±Ź8 ®×čc®M‹©>“«’Ç©˘@&©Ę‚–xJS:ŮŔM DŠÜmZF˙崼颕©EAŐ0‚gmTĽ:ńavZ–b”T0›’ ŮgŮäęgóÂÖ¦ŰĎ ôʦ%*Ůl‘|Ŕ'O:G Ô ‡$ä«mBő.\�Çó˙űRÄ€ ¨ź/‡°aÁG‹ftö 8…¤Bqvö—o­çRđ˘š]â¬'Fg”š¶5”+QgCw>ěh«čˇşÇµTEdm@»zśŰiô’*Ń� ň2¨ „†Äé˛ZśăóĄÇřˇÜP /UÖ7q[üFа"\p•`sĐ©ˇ=6¦”—ÜŢĎR«sEWîRąŐ©?!S´ôŐ*,‰Á0�H`3]5B‚V)" Ă »9źG(đ†"y’‡Ă€u¬' 9ÍjÂĘP˙űRÄ€ ôC1„j=&´ÁŠ  BÎ^ŰĚäiŇČĹnŹ(+­’wĚ!ţkľH¬ź]ü˛FĘ$€Ĺx.AhëxŮ/Şlý{0ł lÜQJpáIO¤Ď¸ŠKď/lľ`Â0 H˛±ŁË8:Enu®>­4-ęÓŹÉ jÝ÷ú>Ťił~¬uĹRI7N…Â5r9L¤5“ $ ‰•Ď4Ň1ŘĚCM:yď‚z:a&ÜšL.PnTš­A5„(ܵ“±+SXŤZď®ű;~CC‡˙űRÄ(� Pg5§iC†fpĉHŁv„ť’ë ꨴŹ$Uü śQł4R$ Ńš·,´LÓ– …4/cM˘ä cĆ­$T[C¦ę9BŹx¦źVĚ™á–1šž«â’*Wm4ÉWR‚tĽFůägş)ÔĚ Ę— Á®a=&hň¨#ą+ŁĽ˘:(PTBŢÎ[:ĚÇţŁáŁş*ÓŤb˘Ť¦ŰTK"㯢ť/1{/m*Ç©Ži6m¨ŰH€¤_ČHÂđŔŕ>ČéJ˙űRÄ4� LĄ1‡ŚNÁL¦tôŚ xěŢÔj Šgi)Ś` X.UŔ«  *ŃŔťeBFÁ¶8`ö¤5Ooú'µ˙Óńu¶‘h:–ŹźX:X\ZšS-u‘×Ěz:YPea¸UP®‰ú ÄÓ]SHTj9µČĘ+qmÜ$ť˝€ň̉­JzďX„Ěđ:Xé,ČôTýď»uhů 3NřVŇ—6ÓV×2 ‰"P~/&§±ęŰ®>}ađ8±Í5ľŔ”ňD-(AŮš˙űRÄ?� p3‡¤eA.ćpÁ ŔR˝ęlAaM© 9Źyk?F?ßşśnŇî+jĐ5mµB”U-ékMÍ*¬?Ů ˛a–X)őa+JDa®‹Ťc7Ă}?—fć•ńosÄd%Z±´H6뇩p§â¶ŇýΫhłw.ä%±łáv°ń& “=>â&µµ6ÖÉch¤ˇLز$‰ Ä„ ŔĺhÇľš/V P†áM»ś¸Ŕ°Ś áÚ6)iV¤PjŢ8cÍLĹ ;ýß˙öË˙űRÄM� „k/‡j,&´Ă(bÝ"ŰćU4hguD8ŃH—cčTŘđŠ['‚PâÇ,bËfé5yš: Á–� ‡ˇEÉEa˝¬[HŃiłĆŁs­o|߾ͿoŢ'ť<B„´őĎ8­-۬¶ľ™Q аŠq%1‹†ą[R¨UşĐEe & ‹ń�¨˛¶˝Ď ›<Á!»Nž1Í.3=ˇ>‰Ýţ˙ŽŰfň$ďž@ŁąóŐ9r_ż†\0=Ebhč Ś„˙űRÄ[� lG5ćjÁI†¦pÄ™�"PŘh`6 $‰Đŕ~‹€;b†@`Ú† Áv 5BôRŐ⢷‘`yhIQNÁTËžűÎ,¦d^Öćz.Ł®…/×jU•™â ’6Ń$ `% iDr(VS?'—ŤC±;XŁE[ďY*—şE(ŞŠj>pŮ”ŔÎŽ ćŐ 4¨Ěű$U@• mJ÷7ţżű_żő*%DW†D.ŞTÄ`Ř–ÇŔ콓°Tľ Ę‹Ç0¦mp§F5[˙űRÄf� h91†$hÁGŚfĽÄ ŘHç{Uά7ŘŹ”é˘Řűo«ëaO"ˉšęaš˝KÖ,ÝiWŠË‹I 9 ŰíŘ.ęL×5šď"­” Ţ-§T<¨E Ó(©< `m·#’N#–…öś"=©ÉP 7Čf¨Ę EŤ8ę‡^˛.’r‡!ďĄĹÜíŻ[˙¦¨łnSSxžĄ0ť UNY´iČ �Ł9‰âŚ~© ÔęeIĚ|fŕ(– 4(˘śźçşäĘ|Ő´đa’_ĂŚG%>• ‚Pś˙űRÄq� Ü­3Ć PI ćpôŤFŤĎhI䬂×â ´QuŻä’›¤˝dQé;ľy»JÜq[c®6I�\KfF`ŕř°”¨9@$“†Î!ă*$±ň|Ňô¨żFÁR(…IEAĄay :Í› )Ő,V1•˝n°ş^#,|Ź7C—Â+Ü0ókrőΠ)i+«Ö`˘µ%=%¬�ŕ4:?Xłâ…#Ú#•úŞŰ+\%ĄS0ŢŻ"‡ J„×"Z1GŠh8 ą’˙űRÄz� H1§mA‚ĺôÁ€!űd¸łś…Ś­(R[qµˇ“q¤ţ¦$âŻVşłbç×§SÖÜŮĄż!¬W3}#TJy|JN8B¨âhń ŐE¨6Ë“*Ŕ«Ü «Ö˘uKzĐ<ŰRĐÚ ?Ô"sŞz·&‚ä×§µWÚšˇőÓn«ŃdŮA{:ś$® Ía’t*ĺxʎ�ô€ŮB‚<X]3®I‡Áô $ 9-XăÉX>%JJ‘8AŕP˛F4Ś]ˇÄ¸Á; yç˙űRÄz€ Üc/†rA_fq‡¤ Ü«"V%ŽK¬¶˛O]ÔC^´­‘ATś–ÄTĘ*+K’9vT ‰”Ú¬QŻ,´’÷É„qjŁľµMF-2.ʧE‘&ńĎ"�".±ĂK|ą°Č¨µ,Ą6´“ R/>bő/[ş?ZǤý‚®l,’2[3|”hłdc˛O‚Ą˘†Ú]©Ţ߆âsŚhÁW1Ą&€űLŃW‰"›aőů'„%yüˇĐÓg3m:‚ţ/‹v)ÝÍËbs5cd.;Ń«Éř,ý^uĂvÔö™muü†ę‡]ęýĂűTq ÷&˘żµ~…›<*渣ćMŚv÷ľKN nˇ]Ň~˘¨6ÎěoTŞwĺĹśá1 ăJ¤˙[*QW©[cňŰ·»Ŕ"Ä[™‚b·Ëi[7ä<`:®V˝Oßg&ÇWĂ»]żŠy„еó䣿 ő)ą%Ţ-“ Ô)ă]\"©ŘŇ©hMĂ`ÖJ!:•aňůg7â†T†±śśln(bő¶ÓV-Éhcééju3v3Ĺo˛*úđŔdIHŔ“Gń˙ I#é#-k„Cç¶cşž)AS$â7N†Í @Ö&űWé̵ä›Éy —í˛a:2JyřťŮ´q±_4ű¦”öŁCŚŔ˛&bóVőÝp3Vć<ř<eđĘť‘»u&7ôĹyř±k9s0.Ć °|üä*ÎĽ/?BE7Şšk"rYFĎúą›•Î©=p7”’?CŞčşOő©š†Z ˙çŃĹĄ#üÇÓŞĽĂĺüiÖŔŃľÓ©¤Ô$Î2áđ@źó+ˇ40€l~ YA° 7żQŽPáqů»šË©Áą^0·{Ď.ń4�¤5/=-l˘j*¬¨fŞngěÜq „nŕżÍ*75žÂoŤ±Ł1ôK,N&‘ć~ă7¸—Ľól'hHH¸Í˝Fý;”AŰ]­©‰@d tŽj&gXá–ÜťŃ(Ś=r©ŘŔ>ÔaLąBä}+âýÖšöJ·\I&¬Ö˙¶\‡:gQŘŃ)QË”ypÝ ‘˘0#!ĽşZŹIol ŹÚY˛}›µźˇĺ˝b&=Q›ďLác©ôÉú‹h.ÓÖĚhÉ#RËEúŰJ7Ůí˙�Č=ĐGiP˙Ú’ËĺBő ĂŔ‰†<|łW/ „Î:™‡#Řu?ńŹ0j^šě‚´eŰ©ŽjJc–Ëpąç)™�˙M_Ű®müIéĺ\BęL¬ß(AŐ€‘Ťa“ł6$qn/čČ~Çv›2Xśq*Χ]�<4¤ŰG FÂł?{iOŠ€ ňzV+żřЦXŮÉÚë×*9¤ň ĐîsuyúP6± o¦ŤÖŤ÷†2ŃcŔŽJ’Íoچ!U¤•]oë"FOíĆú…˛j�ümĘ‹gGí<˝Ă?µŘ¸öň[Š{7* +ţ± ú_ڤ×Ů­u-Áé+ýá°2ń›ýÎ96rÝj3eÂŘ+Ά3âo8v ČÔĺ¬b["69&93bć}¤ąćŕB=Ka*ĘNާ‹ź“‰üŇőTó“Ě–‡s¨M2«5ťńSLŇA}u ¬=Ű$˙@M˙›µ-qXŇŁź[ńŘf˛3‹–/Ţ ®tčí_¬YÖXŰŇ…ŢŁZö®ďáłFÖgČQ .ł†§âÍń ë?˝ŔëY4’»Á|.·ĎÖ5ě’™mµšóÄ'Ą@Ë,G”(,Jž6MęşzŐŮł!âÄéę>gŮ2ĄĘ˝ÝMXť¨‘܄֮­í@ćĐŻöţ{/ŽGęÝ9ďç#Ť_š-…=»Ý.B3.�o—ľ+uF§ĺęď@űHÜ´’őčĹçüě‘\ňęÖű˘j©5|€öÚ+ßś»˛¤J*°˘tr~ę;Üę'&Q Ţ'~ §ÇźWfÚťś*8-ů ®B—'ŮŚo§˙Tě&ÂL“¨†Ř dÁŰđۡN˝ú4á­Ąjrżľ–p‹ąéˇQJÇÎm˝:vnlsÇąŔd€m‰c@cŹ úź yŰŮačŃŠůşŐ’´Y-$ąi!Śíů:ĚŹ{ČL#¨R˛¶>ŔđŔŁť÷ň˝IĹţ#ŰukţĹs(+¤Vd.pUµîŹ)ľ:«Dm3ş6ź˙öďdęňa–Pš‚•‚ËůótĂČ�_‚'†§~pIË Ś˘L$Ľö'T*Ťsć„ČT¶˛Đ ś°Č§BőDŃęu)V7V]0Óŕ›!şăpÇćÂ*÷vÄsnŹúĘD.$ŁŁqźá-Ąŕ“鋦µ…6ůÜúęŤZŞŚiF 1VDđŽ?𤶍ŕ¦'¨‚Ň|OÄăËáŠ,r+9=€ŰDb^ľs5Tą/Üő\‚[Ć /M=,:yö&a<H&ťÚ×')ë©DĹ e ×Ů„ČŇ.s®–‡ţ–Eň†Půž ‰őzÇŁ·Â3 ü_K(Gł zď×Ú‡±Ž é`¦µ%ą­«?ŻFňlŃVĺÚŠĘ:­ĹJ´…ÁšŮ¶{zIqÍó%âžłŇ˙řŇ<ęÍ›äsĹ,źhnűÁŻűu×ĘďZ˘Kđž4—Dz(-i^˝ň(î3Őąá§„ą÷„d]´t‘±Ďě PütßyLunXşt «Ś[+öXP4–/7T"iř"ř•ŁýĹÝٵ"Om» u8“ű·¶ŘÔ¶K%pćŹčĚ‘]ۡú•\ßčnžY‡D•jŕč˙,vyÁÜxUÖ‘˙€?¦ „×`B·˙óJżmˇĹËĚ�~M‡.㎚Ů0ú6jˇÎŁ˙ ˇRz;»µý5ŰPw¨/}ĆB–ţ¨] Ýń.»(ó®`��taglib-1.13.1/tests/data/gnre.m4a�������������������������������������������������������������������0000664�0000000�0000000�00000011642�14447736377�0016502�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������ftypmp42����mp42isom��ąmdatŢ��libfaac 1.24��B�“ 2�G!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€���mdat�� Xmoov���lmvhd����ŔôEŮÇl�_���������������������������������������������@���������������������������������iods����€€€�O˙˙˙˙��ttrak���\tkhd���ŔôEŮÇl�����������������������������������������������������@�������������mdia��� mdhd����ŔôEŮÇl��¬D�~Ŕ�������!hdlr��������soun���������������Çminf���smhd�����������$dinf���dref���������� url �����‹stbl���gstsd����������Wmp4a���������������������¬D�����3esds����€€€"���€€€@���� č�� b€€€€€€��� stts����������ź��������Ŕ��”stsz����������� ������ ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ���(stsc�������������,��������������� stco���������� ��˝��I��Ő��� ctts����������������ź������Xudta��Pmeta�������"hdlr��������mdirappl���������Q���free���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"ilst���gnre���data������������qfreehdlr��������mdirappl������������Lilst���!©too���data�������FAAC 1.24���#©ART���data�������Test Artist����������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/has-tags.m4a���������������������������������������������������������������0000664�0000000�0000000�00000011764�14447736377�0017263�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������ftypmp42����mp42isom��ąmdatŢ��libfaac 1.24��B�“ 2�G!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€��#moov���lmvhd����ŔôEŮÁLII�_���������������������������������������������@���������������������������������iods����€€€�O˙˙˙˙��ttrak���\tkhd���ŔôEŮÁLII�����������������������������������������������������@�������������mdia��� mdhd����ŔôEŮÁLII��¬D�~Ŕ�������!hdlr��������soun���������������Çminf���smhd�����������$dinf���dref���������� url �����‹stbl���gstsd����������Wmp4a���������������������¬D�����3esds����€€€"���€€€@���� č�� b€€€€€€��� stts����������ź��������Ŕ��”stsz����������� ������ ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ���(stsc�������������,��������������� stco���������� ��˝��I��Ő��� ctts����������������ź������ #udta�� meta�������!hdlr��������mdirappl�����������„ilst���!©too���data�������FAAC 1.24���#©ART���data�������Test Artist���˘----���mean����com.apple.iTunes���name����iTunNORM���jdata������� 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000��–covr���_data�������‰PNG  ��� IHDR���������ýÔšs���IDATxśc|źĘŔŔŔŔÄŔŔŔŔŔ�� X«Űo����IEND®B`‚��/data��� ����˙Ř˙ŕ�JFIF��d�d��˙Ű�C�    "##! %*5-%'2( .?/279<<<$-BFA:F5;<9˙Ű�C  9& &99999999999999999999999999999999999999999999999999˙Ŕ���"�˙Ä�����������������˙Ä�����������������˙Ä���������������˙Ä�����������������˙Ú� ��?�Ť€¸˙Ů��jfree��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/id3v22-tda.mp3�������������������������������������������������������������0000664�0000000�0000000�00000010000�14447736377�0017327�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����vTDA���0304�TRK���1�TYE���2010��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙űd�đu�=�@��€€"ÜŚ`�1€ @Ś�?ËĽN«(ăř|ráü™ür„ďDO xťűK†ŘĄ2â×ěM˛w”±ę3ęŠĹ•Ż™Qv.Ň ĘsRÄÜ„»î$˙űdŹđyA�Ă� 0�#�¸���4�`Ŕ���ś ADYŞa ^O-c7 šE‘­íbíJ!Sw“uk‹örA%5Ä:´=Í´jwË0l%RPÉn@MD] uŘ•Ń˙űd ŹđoA€`�� €0������=� €���ç[ńÚ[6mŃe´s’|ćŐčÖ !ĆĐ)V®+”Ž -Ż.˝XÚ¤¨4ŞĎąđR«[ˇâŻ"[™”ëK• !Îm‹µ˙űdđj�Á€Ŕ�� 0���¤€��<� Ŕ���ŁÚú=ŤĎ|TóV‹‹YrKăç“>ÍŽľńŔpęu1ĹD{·-ŁÖeRa¶7t‹fĆT×bú)JT*˛˘¤vŠ©Űö¸ű˙űdŹđkB�@���0��Ľ€��=�`Ŕ���P•«”Td˙ˇZOÔáz S–¶—GmĚ=F*=)2g—µ˛K¨ĚŤ´ËęY +ci7ŁbŐpý§yÄnďÂ˙űd ŹđdA€@�� `0���ě���0�a����ĺUĹ^´!6˝´2zö)Şü}Hµ˘:ň]Xą7ÚNqíUÇlđ™ąλcjk„´)h{Řech·čľ…*Ěk€T˙űd(đjA€@�� Ŕ0������8€ €��{T:TäVuÜw0őÇQląKőJ©4ĄŤ8Ů'ŠŐŢ‹á†}D9Ž’ĂűÚ<íÚĚ!ŻcW=ńvŇEÖÇF­âčŁbźJ˙űd/đz�Á€Ŕ��  0���Ŕ€��9� Ŕ���\ĄEŇ7i…îęÇ*˘of81˘›×CQIx˘™˛ç°D1ŰÜ,‡Q,<_/§m ±uŇ,ÁV)öŐJȆݕZůkËU ˙űd6đSB�@�� €0���Ě���7€ €��†o*âikP)¤U1u(“1wR+TÔQÔ t­ë»‹–<Ţ» ˇ˘jď2ŔĹű9ÁNâ¸Ő¸ŞŘ„©üąÇ[ÝJĹ˙űd>đlB�`��` ���ś���5€ Ŕ��� ™ŘµŇĨâ3ś`:4\ęĘČ´"ˇbśY Óž¸«"‚0-d/uďŇĄmgučő„ΔšB(Ů‘ńtĐn”¶á˙űdEđyA€ ��  0�#�¸���4� €ŚHG*°ď¨PŽőęŁĚżębŤ7xx¤ĄĘrűŤm…ŞC—ŮMM÷ţ•¦ç©m*Ěşt ę­A±"(BÍŰT†Ą.?8•şE˙űdKŹđ`�Á€@��Ŕ ���ä���:€ €Hm~Ë©µŚ˝›—2 NPĄŽrYĐŞŤ1E…叼»˝ďŤXĄRîZa°éĄ”˝ŞĆ mVî‹ß˛ĘńŰŇ-Cžö8Řş™˙űdQŹđz�Á€Ŕ�� @0���P@�8€ Ŕ���»InÍ űź*™ÂY#V$ś.ú9ŁŻsgnF‘‚ť˘Ě›?ÔşŁbíRä…\ľVkµo’*ŇU(VâćźIi±Ž{˛˙űdXŹđXA€@�� `0���Ř€��/� Ŕ���,Ş`śrŃ˝¶ MŠvĹX÷ˇşú*<Ö>YLzJ1öץĺ/›;Ň ©ą´µ ]&Řu¨Šp‹+¬ČýCî­±¨ §”˙űdbđz�Á�@��@��t���:� €���:D\©ŰŘ=XY‰´zSsW˘ŐÎN‹}x­^Ăw]!F ďUĚFY×­űÚ$FçĐt‡e Q;1¤F÷!-UPYołL˙űdgŹđt�Á€A�ŕ ��Ľ���4€ Ŕ���ĽÍě jČ6VÓ”*{Űź‘8×^ÚűŹÍ(¤ó“rmÚÂ&‹^±H“XîěRőF¬µKŕAý"Դðč"Ďj˘ů#:* ˙űdmŹđv�Á€Ŕ�� €0���„���2�`Ŕ�Ś�‡ĚŻĘŇaŃr-X‡Ę±+84ΕÇúT1±XqĺǸ’Qs›ş‹醥Ă–ݩKe˛+™ Î]ŃŰęSá*c—RŔ¸˛˙űduđuA€ ��@ �"�Ě���-€ Ŕ���|©A‘uĚ�OŃŢ€řom6˛¦1ć«W�´ŕŐŔϨp®„±řłĎ9˝ XÚѵů¶9}ä©ő$í©KSµ<žÓ¸ĺ•‡ŘňB˙űd|đ`�Â�@�� 0���Ô���5€ ŔŘi´Óu ¶dŤČ5µ·'2ÓhańµęąŽż2ąą$!Ä/& Ép˝4  ”¬vÝZÝcŘçÎ9ĚŞf¶r˙űdŹđf�Á€@��ŕ ��¸���;€`@��ŠÝM93b†ĄR˘qĎŚ]Íą(µu2"*+bŐ­ÇŐ?C\Ť(ts’űŞKÍŐ¨V6ńĂ'ŇŰ]9Ú[h;s‚=ăP˙űd‰ŹđqA€ ��  �����.�`Ŕ��BÇď2ĘŔĹEáL“v<ÍíFŤT!ĎőńĘĎ©$%sĎŤmňN›ş—±”´şĹwŐóôzj Ó` LĆ$´Ňúř`Sqcb˙űd‘ŹđoA€ ��Ŕ �#�°€��=€ €���Ë0FŹť?ˇÉxņú^aW+5B.c›HyŁĽVĄçŞ)Bބҩ4U  ňŮŰsYz!㏋Źć]őja{†ë®Öł`6p˙űd—đ^A€`�� ` ��Ľ���9�`Ŕ��p­KP¦ĺ©lw4ŰiĐŢĆČ=Ç [qUJ1*«rv_•®Ą\×V…j”EÚ.ç"íذ°ě†şŽ+Ї lŇ‘ÎÁn`˙űdžŹđdA€@�� @ ��Ř@�=�`€��Ćş#kQŻqĺUĄ)8Yëšă¦ĐşQąIöĺ…Ë4 wšUk’….MÖ RÓüË ¤ĺăÎ5;ßY;R‹ÎäŚ˙űdĄđz�Á�Ŕ��  0��� €��;€ €��� ľ•±ŹE˛жäz†¦QuVüŁTşqW9ަv ^®Ř±•¦}ăN­~HX”ň¸|˛\¤6łŠJŻyyNg0ÉU˙űdŞŹđu�Á�Ŕ�� `@���Đ���+�!����™Íě˛E5ťNb2@m† 9HFÖG.9WlutÉBiÂhU†Ą• ©KÖ­3N¬2‡ 1şo ŰčÎ- #Š˝Í{S˙űd´đfA� ��`0��ä€��3€ Ŕ���zǦć^Tľ©Čkő QÂMIűć(M@@ε°xžsË 4ą§uk=DÇPŇË~ć5ˇ3‚FŇW`ĺTx[©<˙űdşđzA� �� €0���č€��1€`Ŕ���ÁĘŁ“#AMoěc.ĘŞIKnÁč±5P4«Š5+8?em¸×ś·Y˙Ńww¶1śĆqĐ@Ô$ŐŇT)Ůq.…żŠ˙űdŔŹđ\B�`�� 0���¸���;�`€��ąMBśp™*PĽÉ«ÖŠiN¶7ú*Ôd^D|« aţĄíŇź(F~h[ţűzQŻHŞőÁÄÍ­Hi÷Şy…†"˙űdÇŹđsA�`�� Ŕ ��ä���7�`Ŕ��Ezűv˙µ*źS{Ż^Č[byżžŇU ±Šk C'™Ňí-[V¤HVQO?UB‰QQWˇĚ‰M (7fA®pbŲŇä1w”ś Y’˙űdÍŹđiA€ ���0���´���7€`€���ą0“ˇš4ÜB†č4U–­[«ÎdŢă7ű&?Ä%s›Ů’6|”ÚG| Ŕ1/k{&Ńó]iăËĄ÷)G‚hl6>ć6˙űdÔđgA�Ŕ�� Ŕ #&¸€��<� €���Ô(kŃěrčśůqÎt¸)–)ŕG©»§ yňN ĽŃJälz… €¬C†µŞ)Ň’Ęą3* 7Ż©9‡˘x„˙űdŰđrA€ ���@���¬���3€ Ŕ��h«­ą(¨UĆš´›,rµ ÚEËęĎĐĐT7—_۰}L)¶¬!™!˛IŠľä;§ć˙˙đěIĂfw›Ő=pÁ^íS Żß_ú˙űdáŹđo�Á€Ŕ���0���ŕ���-�a����mťWI¦n ž‰¬ŤqŃ­ =gŃë—yÓ+0VĚŞ'LĚ9 (ÖµHs÷oZ‡kklłhžÁ0Ź‚˘î,ĘT>ç˙űdčđ†�Á�@�� �#�Ař���9€taglib-1.13.1/tests/data/ilst-is-last.m4a�����������������������������������������������������������0000664�0000000�0000000�00000100000�14447736377�0020057�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ftypM4A ����M4A mp42isom������3;moov���lmvhd����Á1„Ć'*��¬D�,D���������������������������������������������@��������������������������������0trak���\tkhd���Á1„Á77��������,D����������������������������������������������@�������������/¸mdia��� mdhd����Á1„Á77��¬D�,D�UÄ�����!hdlr��������soun���������������/ominf���smhd�����������$dinf���dref���������� url �����/3stbl���gstsd����������Wmp4a���������������������¬D�����3esds����€€€"���€€€@�Ą�”p�o†€€€€€€���stts��������� ������(stsc�������������������‡��������,Xstsz���������� �����×���Ö��������˝��µ��ą��Ŕ��É��Â��ľ��Ľ��Ă��¸��Ĺ��Ć��Ä��ş��ż��´��»��·��®��±��¶��±��Ę��´��ş��Ĺ��Ľ��¸��Ľ��Đ��Â��Ă��É��Ľ��ż��É��Í��Ă��Ý��Ň��Ő��Í��Â��Ë��Č��Č��Ń��Ć��×��â��Č��Ă��Đ��ę��Î��Ů��ä��â��Ţ��Ý��Ţ��Ő��Ý��đ��ä��ß��Ý��ä��á��â��Ó��Ř��đ����g��,��C��G��=��?��ĺ��â��"����*��+��1��b��U��Ô��Ő��ő��[��9��´��®����Ä��Ô��Ç��Ó��Ř��é��Ć��Ă��¸��ľ��”��Î��Ę��ý��í��¸��ó����Ŕ��Ň��˘��ˇ��¦��€��ą��ľ��˝��µ��Ď��Ô��*��Ä��Á��Ö��Ć��Ď��ä��ű��×��Í��Ő��C��$����ˇ����™��¸��ń��Ü����ć��ě��Ë��í��ü��ç��Ď��ż��Ö��Ë��:��­��y��ł��;��ł��—��Ç��˝��˛��ş����°��ą��Ń��÷��Ö��§��¤��®��Đ��Ç��ń��«��Ó��Ď��4����Ě��±��§��ß��·��Ć��˝��Ŕ��Č��±��î��ä��®��Ł��ă����đ��Ţ��U��×��ŕ��Ř��4��»��ť��Ś��ş��·��®��đ��Ě��É��¬��ö����§��Đ��Ň��×��Á��ć����ě��(��ľ��%��Ű��‘��’��y��‡��Ä��ŕ��˝�� ��ô����ú��˘��¬��ä����Ď��8��Ż����Ű��ń��ű��ż����Ł��¤��Ş��Ë��Î��đ��Ă��Ű��˛��ń��»��Ă��¸��ŕ��Í��O��Ţ��Á��ş��î��:��Ę��‚��ś��ź��°��Ł��¶��¶��ŕ��Ç��Ç��ú��ä��ő��Ň��Ů��÷��Â�� ��ş��»��Ő��@��đ��ą��ą��Ł��ź��Ď��´��˝��Ç��Ó��Đ��í����đ��Ĺ��ĺ��Ň��˛��¨��á��Č��§��P��<����Š��—��…��é��ž��Ů��˘��Ă��Ż��Ů��Ç��ń��Ń��Ó��ß�� ��î��Ń��Ń��ő��(��ń��š��Ż��Ł��ž��´��ŕ��Ë��°��ő����@��ĺ��á��Ń��´��ą��ç��ş��Ô��Ż��č��,��ă��Á��‘�� ��˛��Ą��ľ��ŕ��Ĺ��Î�� ����á��Ć��Ŕ��Ţ��Ú��Ń����Ý��•��‰��5��Đ��›��Ź����Ą��Ă��©��é��Ń��ü��Ű��D��Ľ��˛��µ��µ�� ����Ő��Î��ě��×��C�� ��‚��–��•��ą��´��µ��í��Ú��Ó��ő��ě��Ô��Ű��Ü�� ��Ý��Ó��Ĺ��Ó�� ��â����ř��j��‚��¤��Ť��Ą��Ä��Ż��Q��,��»��‚��Ş��Ĺ��Č��¬��¤��Ĺ��Ë��ß��é��,��D��A��s����›��”��ť��˝��»��Ă��Ŕ��˝����á��¸��Ć��Ř��ě��ď���� ��Ó��ć��5��2��{��Ť��ž��«��Ľ��¶��ą��ľ��Ű�����O��ź��“��¤��°��Ł��´��/��@��ĺ��Ý��.��”��—��Ž��–��˛��¸��Ď��›��Č��Ě��Ó��ŕ��Í��O��ł��ă��Ż��Ý��S��#��/��’����Š��Ź��Á��‹��»��»��8��´��°��Ŕ��Ń��Ü��¬��˘��Č��2��¨��ż��˝��¸��Z��-�� �� ����|��—��Ł��Ą��Ŕ��­�����Ľ��Ă��Ç��Ŕ��»��Ľ��±��Ň��Í��ť��Ě��·��Ŕ��±�� ��ć��×��Č��Ŕ��¸��ą��Ö��˙��î��í��ě��ô��Ů����č��ë��ľ��“��‘��·��ś����!��ö��Í��‡��~��š������Ç��Ě�� ��×��Ę��Ř��Á��Ö��Ű��Ň��Đ����â��ę��·��Ň��ť��„��ô��â��č��˝��Č��ş����Î��¬��Ř��­��¶��»��ý��×��µ��·��Ĺ��|����¬��ś��é��‰��É��ł��ł��Ŕ��Ň��Ő��Ý��†��™��­��Ľ��ś��±��Ć��‚��‰��›��ł��Ě��¤��É��µ��…��t��{��x��¬��Ç��–��ą��Ş��×��µ��Ď��á��ż��Ć��Ŕ��ó��Ń��Ý��ç��Ë��ą��Ë��Á��ě��ż��ą��¸��Ĺ��ë��Ć��Đ��Ô��ä��Ć����Ů��«��Ü��Ă��É��¸��•����˝��¬��¸��Ż��»��…��Ż��­��–��ą��·��Ç��Ä��Í��Î��´��Ń��×��Ä����Ń��Ď��Š��Ł��©��ł��±��«��Ă��Ŕ����Č��Č��Ő��Ý��Ę��„��Ş��¦����Ş��©��ě��ş��Â��ş��¨��Ő��”��’��l��x��Ž��’��t����ž��Ł��»��´��Â��ł��Ć��›��ľ��Ł��Ă��¬��Á��ł��Ľ��Í��Ę��ú��Ç��»��Ŕ����Ż��Ć��Ĺ��Q��Á��°��±��ľ��Á��Đ��Â��­��Ë��Ö��ł��ż��Ľ��Î��č��Ť��ż��­��¶��ń��®��ľ��ć��Ô��É��Ü��Ç��Ó��ý��„��k��X��M��u��Š��˝��©��©��¨��ł��Á��˛��Ô��ú��Á��Ń��Ţ����¨��—��Ë��Ş��˛��Á��¨����Ę��Đ��Ţ��¬��Í��ě��’��ź��Á��«��Ľ��‰��X��s��Ś��ť��Ľ��Á��Ă��Ľ��«��ş��¸��Đ��Ë��Ĺ��Ö��¸��É��ě��Ë��Ř��ŕ��Ę�����Ó��Š��’��Ş��Č��Ç��ş��Ç��Ŕ��Ą��Ć��Ŕ��×��¸��Ú��ú��đ��Í��Í��ą��Î��»��â��Č��ń��Ý��É��ź��˛��Ć��µ��R��·��™��á��°��ç��Ň��×��Á��ô��ź��ě��č��Î��Ő��š��•��°��©��Ŕ��¸��®�� ��­��¸��Á����ă��Ô��ë��?��ŕ��µ��Ô��­��ű��Ú��Ë��Ĺ��Ŕ��î�� ��Đ��$��Ń��s��·��Ľ��â��Ć��Ł��x����!��ž��Ť��»��»��Á��ĺ��Ä��…�� ��ś����Ę��´��Ą��©��ô��Ń��Ç��Ü��č��¬��Î��Ť��‹��°��Ľ��Ă����Í��¤��Ĺ��©��¬��Ę��â��Ô��Ä��ř��Ď��ż����–��±��Ć��Á��°��¸��Đ��Ľ��Ő��µ��Á��=��Ď��Ę��¶��×��®��Á��ż��Ţ��Ŕ��Ë��Ć����ď��Ä��â��’��Ž��§��´��¨��Í��˛��µ��Î��•��›��¦��Đ��Ú��´��›��Š����Ą��§��´��×��‘��®��ľ��ş��ä��ä��Ď��Ń��Ď��“��¶��ô��®��ş��ź��±��·��Đ��ŕ��ď��É��Ô��Î����é����«��“��Ă��°��Ç��Î��·��Ű��Ú��Ń��ě��«��»��B��×��ž��ę��Ď��Ď��Ŕ��Ř��Ň��î��ë��ë��˘��‘��Š��Í��ş��„��„��Ŕ��©��Ň��´��Ľ��Ů��ş��Ľ��É��ł��·��Ŕ��@��ž��Ř��˝��ş��©��˝��Ń��Ü��á��Ć��†��Í��Ł��~����•��Ŕ��Ě��°��˘��Í��Ľ��Ô��ŕ��ĺ��Ú��~��Q��?��U��Ź��«��Ť��«��Ô��Ą�� ��Ş��ď��Ă��ä��‘��Y�� ��a��q��›����ź��Ž��©��¶��É��Ć��Ž��Ł��­��˛��Ë��Ă��Č��Ć��Ń��á��Ć��¶��Ľ��‰��˘��¦��î��ł�� ��˛��¶��Ě��´��Ó��Ä��ż����¶��¦��Ĺ��ë��ĺ��˝��Ć��ľ��Ď��ě�� ��Ů��Ţ��ť��«��Ş��Ă��®��j����“��Č��´��±��ŕ��Í��Ç��·��Ň��Ď��·��ă����M��e��z��†��l��Ś��­��ç��ľ��ł��˘��Ę��Ô��Đ��Ü��µ��Á��Ň��o��ş��­��ĺ��Ŕ��Ň��×��É��ů��Ú��¶��Ţ��Ě��Ů��ł��Á��ą��Â��Ç��Ű��Ô��Ő��ă��ä��Î��Ü��/��·��–��ş��®��Ĺ��ľ��ĺ��Ć��˝��Ů��ľ��ë��Ô��ş��Đ��Ń��Ő��Ż��ę��é�� ��ń��ż��«����ŕ��ě��—��Ľ��Î��¦��é��¸��Ň��Ö��Đ��·��ę��é��Ň��˝��Ů��«��»��ä��đ��Ä��Á��Ń��Ą����…��–��~��€��ś��¸��Ď��ą��ŕ��é��Ü��Ţ��Ě��Č��Â��Ţ��‰��§��ś��·��ł�����ş��»��Ą��¸��˛��˙��Â��Ń��Ď��â��Á��ľ��ż��‰��’��¤��´��Ő��Ó��č��é��ß��‹��¤�� ��Ą��§��Ę��¶��Á������µ��·��„��Ż��ž��Ž��Ž��ł��ă��Í��Ň��ą��Ë��ú��É����Ř��§��»��´��Ű��!��ř��Ő��™��ś��â����á��â��Ľ����˛��ř��Ń��ˇ��^��!��Q��…��ś��–��Ś��Š��t��Š��›��¨����ş��Ü����›��¬��ä��â��ł��µ��v��|����i����š��Ŕ��Ś��P��_����Ŕ��‰����ž��ą��Â��¬����›��’��¨��l����Ş��·��·��ą��ż��ż��Ç�� ��µ��•��‡��±��›��Ť��—��¬��Ă��ź��É��˝����–��Ż��ą��µ��Ă��»��Ć��™��ž��—��Ł��ť��Ę��Â��Í��Ô��Ő��Ô��Ô��ß��ß��Ę��Ä��Ň��q��Ť��Ŕ��·��Ľ��¸��Đ��Á��ô��Â��Á��Ě��Ę��č����Á��Ô��ŕ��Č��Ü��Ľ��Ň��ě��Ő��Í��Ű����Ä��Ĺ��Ĺ��â��Ě��Í��Č��ś��Ą��ż��©��Ĺ��Đ��·��ŕ��µ��Ľ��č����ć��m����|��w��q��±��¬��ź��™��7��Ż��‹��¸��ź��Ě��ş��Ú��ŕ��Ŕ��â��”��—��ˇ��±�� ��¸��Ĺ������Á��Î��Ý��ô��ž��ł��Ł��Ë��¬����Ý��Ť��Ś��¤��µ��ĺ��ľ��—��}��„��©��±��‰��ś��Ś��¦��Ŕ��š��\��O��ë��ú��F��M��7����-��?��j��t��Ž����š��¶��x��ś��›��¶��•��A��(��ý�� ��P��]��o����Ź��®��Ľ��˛��A��¤��ť��r��…��«��b��‰��ś�� ��x��©����ť��ś��ş��h��‘��{��‚��‰��·��š��Ű����¬��±��¬��Ă��W��€��s��“��©��L����Ž��Ł��Ě��¶��č��ľ��Ź��˙��q��-��1��K��Y����–��„��“��¤��¬��¶��Ď��Ó��ľ��1��®��Ŕ��Ć��Š��˘��¦��Ę��ż��Ä��Ř��Ě��Ŕ��Ć��Ö��Č��Â�� ��´��¸��Ĺ��Ě��I��Ż��±��}��š��˛��™��ź��Ę��Î��˝��đ��˛��‘��°��Ë��š��‡��~��o��y��›��”��˘��·��Á��ž��Đ��Ě��Ç��Ú��•��Ě��¤��°��ż��‰��Ž��Ĺ��™��°��¬��´��Î��×��ř��ż��Đ��˛��Ę��Ŕ��Ě��ŕ��Ç��–��ł��®��`��M����t��š��°��Ĺ��”����ť��™��ş����¨��Â��°��É��Ü��š�� ��Î��b��m��h��’��…��¬��Ş��Đ��«��ł��·��ˇ��ż��ó��Ă��Ö��•��Ë��Ź��Ď��Ă��Ě��É��É��Ä��ľ��Î��ľ��Č��»��Ä��é��É����H��Ă��«��ľ��Á��Ç��¤��¸��Ě��Ď��ë��Ă��Ř��ą��Ů��Â��†��^��Ś��ť��«��ż��°��Ă��Ő��č��Ú��ź��ş��Ç��É��ë��Ý��‰����Č����¬��Đ��Í��Ę��Ę��Ţ��Ő��Ë��÷��Ň��“��Ľ��–��w��t����´��˝��Ş��š��Ĺ��Ä��ż��Ö��&��´��ă��Ż��ľ��}��ť��§��»��»��Ś��š��Ť��ľ��&��š��Ń��»��Ń��˙��ď��Ť��—��˛��Ć��¸��Ř��Ł��Ô��Ť��‘��Á��Ý��Ą��Ż��9��¨��É��¶��Ă��ł��Ű��Ę��Ĺ��˛��ľ��ß��ł��ă��Ő��‚��¶��Č��Ď��Ď��•��ś��­����™��Ň��Ď��Ö��ą��Ň��ł��I��Ą��á��Ć��´��µ��ż��Î��Â��Ý��ł��Ř��ę��â��¶��…��ą��¦��˛��Ä��ă�� ��¤��ˇ��ł��Ń��ö��ş��Ć��˛����â��­��Ż��Ľ��¸��»��Č��Ç��Á��ľ��ç��ľ��±��Á��Đ��Ę����Ń��Â��Đ��Î��ż��ľ��ż��Ę��Ě��Á��Đ��Ŕ��ë��ş��A��°��Ä��Č��ó����©��ą��Ů��ä��č��Ŕ��¨��ç�� ��ą��Ł��ŕ��E��ź��ş��ź��á��Í��ó��Ś��¬��¸��”��Ç��¶��Í��™��Ń����ž��ś��¬��ľ��Á��2��¤��Ę��Č��Ă��ŕ��ť��§��Ž��š��±��¶��»�� ��’��»��Ţ��Đ��Î��Ö��ů��…����ľ��}��Ž��ś��Ş��·��Ç��š��Ą����¬��Â��/��Î��ş��ź��Ž��Î��–����›��ż��˘������Đ��Í�� ��ń��ß��…��µ����Ş��¶��ť��Ě��ż������©��Ă��˝��±��”��z��X��®��f��†��‚��ś�� ��›��‡����‚��Q��b����+��{��‚��ť��ž�� ��µ��µ��Ë��Ĺ��y����ľ��m��‚��§��°����©��ľ��±��Â��Ŕ��Ţ��·��Ń��Ă��Ď��R��Ĺ��·��Č��ł��Ń��â��$��ż��Ř��˛��Ĺ��Ý����ˇ��†��‘��ť��ż��±��ą��ł��Ç��Ă��ą��ş��ć��â����Ş��ł��Ĺ��ă��Î��Ľ��»��Ý��Â��Š��´��Â��ę��¬��ź����Ś��¶��ˇ����—��·��ŕ��ź��¶��µ��Ř��Ĺ��ę����Ă����ź��Ć��´��Ě��É��Î��˛��×��Í��Ý��Ă��Ń��±����Ľ��Â��Ä��Ä��×��Ľ��»��Ř��±��Ä��Ä��Â��Ć��¸��¸��Ĺ��â��¸��Ý��ě��Ä��Ň��Í��­��đ��Ń��R��É��Ŕ��Ć��á����Ę��ŕ��ş��Ć��ě��ä��Á��Ű��ę������‡��’��˘��Ă��¦��µ��Č��Â��Ő��Ď��ş�� ��á��Ô��ł��ť����ľ��ż��Ř��ž��§��ş��ä��Ä��Ţ��×��Ŕ��˘��ş��Ü��Č��Ă��Ć��Ä��Ţ��ú��ä��Ý��¶��Í�����í��ß��Ç��Ń��Ă��Ë��Î��ż��˝��ý��Ľ��ě��¦������ď��Ă��Ť��Ô��Ş��ż��Ş��×��´��Ř��ó��ľ��ë��'����»��“��±��ł��ą��Ç��Ý��î��µ��â��Â��´��ă��Ś��ü����•��ă��¸��É��±��˝��ô��*��ť��—��ň��©��,��‹��©��Ŕ����Ĺ��ş��°��¨��¸��đ��Ż��´����©����ć��ł��Î��ś��Á��Ţ��Á��ę��Č��Ë��±��Ó��H��­��Ô��Ş��5��¸��·��ż��¤��Ě��ľ��®��É��ľ��Î��Ň��Ë��Ŕ��ę��Ě��ó��·��Ę��Ď��ă��Ĺ��Ý��ľ��Ü��´��Í��¦��É��ľ��Ő��Ń��Ö��»��á��á��ý��Ę��ă��Ë��ą��Í��ŕ��»��ű��Ö��ć��Ć��±��µ��ć��Ç��ô��×��<��Ű��¤��Ö��ŕ��Í��Ż��Ř��ş��Ţ��Ő��ĺ��ď��â��,����j��q��ß��Ř��Ë��Ö��Ň��ť��°��Ú��ý����~��Š��‡��q����”��Ł��®��Ş��¶��Î��ż��Ě��ľ��Ţ��®��Ä��ł��®��S��Î��Ç��Ľ��É��±��ň��Ř��ő��Ę��˝��Ü��Ż��Č��ď��ă��Ř��o��Ł��­��Ě��®��ş��Đ��¶��ŕ��Ď��×��á��Í��ă��Ú��Ż��Ě��R��±��˝��Ř��Ü��±��ë��Ľ��ŕ��ť��ń��Ó��Ě��Ć����‡��Y��r�� ����‰��Ç��ľ��«��Ű��ź��Ë��»��Î��Ë��¨��†��¸��Ŕ��Ş��Č��ă��ŕ��Ú��Ë��á��·��ś��@��˘��„��˘��Ă����€��Š��­��µ��ľ��•��—��É��Á��Ć��·��Ň��Ä��Ă��Á��ŕ��‰��–��Ď��Đ��µ��¬��ü��ľ��ĺ��Ř��­��ş��Á��˝��Ň��¦��ľ��‰��˝��Ć��ę��A��ł��ź��©��ć��Ľ��»��Ŕ����Ş��Í��Á��˝��Î��ť��¤����•��Â��Ě��Ą��ś��·��Ľ��ş��˝��Ů��Ń��Ĺ��â��ż��P��;��§��±��Ž��´��ş��Á��Ă��Ů��Â��ą��Á��Ŕ��á��Ç��…��Ŕ��Ü��Ć��±��Ă��Á��Ö��Î�� ��˛��)��Í��Ď��ę��í��'��j��‚��¬��˘��ď��ö��+����˛����•��ń��ą��ĺ��Í��(����›��¤��Á��ż��·��±��Ę��·��Č��Đ��Â��¸��Â��¸��ľ��ą��«��µ��Ŕ��Ć����ô��ş��­��˝��Ŕ��Č��ş��ö��ç��Ŕ��ł��ć��Î��Ě����^��Ë��Ç��·��ˇ��ř��â��Ă��Ű��Ŕ��ű��Á��>��·��×��Ć��Ń��ě��€��™��ť��°��Í��˛��Á��Ď��Ë��A��Ě��Ý��Á��Ř��Ă��€��ś��™��Ł��°��ą��¶��Č��Ě�� ��,stco�������‡��Â��â%� �,ľ�V]�e�§�͇�ó�–�>ę�e\�‹Ç�±Î�×n�ýç�$�JA�q�—#�Ľý�ăx�«�.ť�Už�zĹ�ˇ§�Ç�ěÝ�E�;‡�aŞ�†ţ�¬S�Ň’�řX�¤�Eµ�jŢ�¨�·ú�Ý|�Ć�*�OĂ�vT�śa�Âs�čş�T�5+�Z‰�€Î�§0�ÍĚ�ô� +� ?ř� eW� Ś6� ˛� ŘJ� ţ}� $¨� Je� pż� –š� ˝P� ăˇ� e� /ť� U9� {“� ˘� ÇÄ� îO� � :� bX� *� ­R� ÓR� řě� Ö� EŻ� kŠ� ‘ň� ·ç� Ýč�Â�*�Q �vź�ť�Ă�čĘ��5 �["�ć�¨�Î�ô^�Ţ�?z�eí�‹ü�˛ĺ�Ř-�ý˘�$�Jž�pś�–ú�˝^�ăp� ł�/‘�UG�{‡�˘�Č7�íę��;ĺ�`´�†�¬}�Ó �ů!�Y�E‹�j�â�·b��«udta��Łmeta�������!hdlr��������mdirappl�����������vilst���©nam���data�������Intro���!©ART���data�������Pearl Jam���M©alb���Edata�������1995-03-22 Brisbane, Australia - Entertainment Centre���©cmt���data����������©gen���data����������©day���data�������1995��� trkn���data������������������cpil���data�����������covr���data�����������6©too���.data�������iTunes v6.0.5, QuickTime 7.1.2���Z----���mean����com.apple.iTunes���!name����replaygain_track_gain���data�������-0.67���Y----���mean����com.apple.iTunes���!name����replaygain_track_peak���data�������0.45���]----���mean����com.apple.iTunes���#name����replaygain_track_minmax���data�������82,164��LĄfree�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/infloop.m4a����������������������������������������������������������������0000664�0000000�0000000�00000147710�14447736377�0017223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ftypM4A ����M4A mp42isom������Ĺmoov���lmvhd����Č/"KČ/"U��¬D�µŔ���������������������������������������������@��������������������������������Ŕ%trak���\tkhd���Č/"KČ/"U��������µŔ����������������������������������������������@�������������żÁmdia��� mdhd����Č/"KČ/"U��¬D�µŔ�UÄ�����"hdlr��������soun����������������żwminf���smhd�����������$dinf���dref���������� url �����ż;stbl���gstsd����������Wmp4a���������������������¬D�����3esds����€€€"���€€€@���i �k�€€€€€€���stts���������-p������(stsc������������������*��������µÔstsz����������-p������������������������������������������������'���ś���ť���—���Ť���Ř��°��2��P��V��Y��n��©��x��Ť��†��‚��€��€��…��„��w��†��€��y��…��‡����Š��v��ź��Ž��Ě��É��¦��´��¬��˘��ť����ś��ť��—��ˇ��­��¤��•��š��–��Ą��­��Ą��¶��Ő��®��•��Ą��ł��’����ť��Ś��‹��������������������������Ď��Ů��ä��Đ���� ��ď��ă��é��Ü��Ű��ĺ��ě��Ő��ń��ń��ŕ��Ü��Ë��â��Ţ��ĺ��ä��˙����ý��á��ß��á��Ő��ß��Ë��Ú��×��ŕ��Ď��Ů��×��ĺ��Ď��Ô��đ��Ň��ç��(�� ��ě��Ř��ř��ę��í��Ţ��ë��ß��á��Ň��ä��č��Ő��č��Ň��î��ë��Ď��đ��Q��ě��ý��ő��ç��á��Ů��Ú��ĺ��ć��Ń��Ő��Ő��Đ��É��Ň��Ě��×��Ň��Ă��`��ů��ů��ń��ď��î��đ��ă��é��Ů��č��Ř��í��č��Ű��î��Ü��ĺ��Ĺ��ó������Ř��ç��Ů��Ý��Ŕ��Ř��Đ��Ó��ż��Ě��č��Ö��â��×��Đ��â��Ę��Ů��z��ó��ë��ţ��ă��é��ă��ě��ă��ô��Ů��ŕ��Ď��á��ë��Ý��á��ĺ��ä��ö��0����í��ö��ç��Ű��Ď��Ě��Ű��Ű��Ű��á��Ö��Ó��Ř��ä��Ú��ĺ��Ě��Ű����ě��÷��đ��ß��ă��ę��Ű��ě��Ú��á��ĺ��Ţ��ĺ��Ú��×��č��Đ��Đ����L����Ö��ă��á��ä��Î��â��Í��Ř��˝��Ö��Ë��Ź��ˇ��“��ś��˘��Ť��|�� ����ž�� ��Ż��Ż��›��’��•��†��ź��ś��ś��Ą��¦��“��ž��“��¦�� ��d��ä��›��š��—��ś�� ��ś��‹��–��’��„������€�� ��“��ť��™����”��ä��»��©��•��—��ˇ��Ź��”��Ł��”��™�� ����¨��‹��–��¶��Ł��Ł��p������������ł����&����<��â����´��‡��‰��Š��¶��±��›��{��×��¶��ą��®��µ��Ą��Ł��ź����5��=��+��*��Q��M��n��z����z����a�� �� ��á��ň��"��b��V����¶��•��{��‚��»��¶��ś��Á��Ţ��Ú��˛��¤��›��¸��’��”��}��o��€��“��Č��•��®��·��Ľ����{��‰��x ���ś��×��&����)����A��+��>��7��������%����������î��ü��ű��$����î��ô��ß��ď��Ň��ţ��ô��÷��Ů��Ű��Ĺ��Ů��É��Č��˛��Ŕ��Ć��ń��„��^��B��S��W��]��‰��ˇ��Á��¸��Ď��¦��†��ˇ��ź����m��‹��u��„����ś��Ś��Š��‚��x��m��v��l��n��y��i��q��k��V��n��{��b��~��¶��ń��·����[��[��D��‚��…��ť��“��Ć��™��»��Ł��ˇ��€��†����{��m��i��{��z��U��S��x��h��†��Ť��j��I��—��s��n��t��…��g��…��d��y��]����é����"����$��i��@��|��€��Y��|��o����„��z��…��„�� ��Ż��ś��Ţ����d��=��)��4��3��j��7��v��Ź��‘��•��š��•����‘��ť��—��”��Â��—��X��=��R��O��Q��H��`��_��]��‰����Ś��d��Ś��{��L��P��a��…��k��s��p����—��Á��±��ť��÷��Ź����´��/��(��(��:��`��¸��Ú��Ń��P��N��w��Ś����ž��ş��ż��ż��ą��´��Ë��ż��Â��ą��­��¤��Ž��v��Ž��o��b��’��™��®��ł��˘��Ć��ś��†��š��…��©��¦��ç��}��¸��Ń��ú�� ��ß������ô��ç��ß��������˙��í��ó��Ç��á�� ��ŕ��ě��î�� ��=��7��>��H��F��6��3��4��'��0��$������´��¤��Ě��ą��Ă��˛��Ą����‘��¬��â��Ű��ë��ď��é��×��ú��Ţ��Ň��Ű��Ŕ��Č��Ŕ��Ô���� ������ř��ű��ä��â��ź��Ď��ě��ţ����×��Î��Ň��Ô��Ű��ă��ß��×��˝��Đ�� ��ń��×��ń����ë��ú��ú��Ř��ő��Ó��Ű��Ĺ��¦��‹��·��ł��Ä��¬��·��Î��˙��ŕ��ę��Ë��ć��ř��ő��ő��ă��Ţ��Ú��Ň��ľ��»��É��¬��˝��Ű��Ř�� ��.��ž��·��±��ç��ä��ß��ű��ó��ě��ó����č��˝����Ô��ü��ď��ř��Ú��î�� ��ů�� ���� �������������ů����ç��č��ř��ä��ć��Ď��ę��á��Ä��,�� ��-��#��ô���� ��ů�� ����ç��Ŕ��É��Ţ��Ę��Ď��Ă��Ë����*��#��=��3��H����!��>������ ��â��µ��Ď��Ý��č��ń��â��Ń��˙����¸��ş��Đ��Ó��Ô��ă��ń��ô��č�� ��ď��ć��˝��Á��Ů��Ý��í��ĺ����ó��÷��ţ�������� ����ű��Ô��ę��Í��Ę��®��¶��Ö��˘��š��•��×��­��Â��Ő��Í��Ř��Ó��ť��Ĺ��ć��÷��ó��î��÷��Ý��Ń����â��×��ń��Ç��¶��ö��ă��Ř��í��ç��ŕ��Î��Á��á����ę��ř��÷��ó��÷��ă��é��Ř��Ý����Ń��–�� ��Ď��Ň��ß�� ��ó��ó��������ň��ň��ü������ ��ď��ç������*��'��=��5��!��7��9��C��,��8��1��'����â��î��÷��Ý������ă��Ô��ć��Ü��ň��í��˙�� ������ů��ň�� �� ��������ď�� ��������������� ���������ü��ú�� ��,������#��1��)�� ��D��Ń��ă��Ř��Ű����+��9��-��;��O��;��0��C��F��…��h��u��I��Y����ú������ ��,��>��2��_��<��4��V��V��^��™��&��7��?��@��4��N��Ă��S��Q��•��ˇ��“��›��°��ś��ľ��·��¬��Č��Ľ��¦��»��Ą�� ��–��L����í��ď��˙������� ������ ��đ�����ö�� ��4����C��S��8��Ö�� ��ć��ń��ă��Đ��!��+��=��c��Y��2��$��>��>��N��c��†��m����Í��ř��î���� ����0��`��D��<��?��U��Ô��ď������L��q��m��K��b��Ó��é����'������G��K��\��„��F��g��k��u��g��f��q��q��[��P������N��T��G��V��e��€��W��|��H��C��~��l��G��2��|��F��b��…��ň��ŕ��Í��ú��ë����B��Z��j��†��s����N��Z��x��˝����_��u��x��Ü����ú����������C��E��D��c��J��I��H��q��h��h��€��Ż��ś��×��K��ô����/��@��5��@��;��`��‚��:��M����~��M��e��{��E��l��}��w������$��4��U��Q��‰��‚����l��\��o��÷����5��5��D��¬��˛��p��Ů��ţ����2��P��|��Š����Ą��Ś��Š��•��}��“����’��“��‘��|������A��G��`��c��s��X��q��°��`��:��s��w��§��¶��a��’��p��w��M����X��`��Ž��l��v��Ž��ź��®��Ź��©��ž��h����Ł��ş��˛��Ł��±��‡��j��“��Ă��×��ß��ń��ň��˙��ü��Ó��Ĺ��ö��Ę��{��¨��†��•��¨��«����)��ć��(��F��8��e��t��š��Ź��µ��†����t��ž��’��¸��“��}��“����Ź��`���� ��®��ľ��Ç��ć��Ń��É��Ő��Ô��Đ��¦��ľ��ż��Ľ��¸��Ő��Ú��$��k��…��ą��Ô��Ä��á��Ç��·��ĺ��ş��Ô��Ű��·��Ď��¤��±��«��˛��”��D����-��@��i��G��m��S��s����‘��^��‡��U��r��{��˘��Ň��Ć��Ě�� ��(����K��B��‰��›��Ş��¤��Ó��Â��ľ��°����·��ż��˝��˛�� ��Ę��ţ��v��É��´��˛��Ň��Ä��ĺ��×��Ö��Í��ş��¤��­��•��|��ą��ş��˝��·��ę��5��S��z��Š��Ś��¨��‘��Ú��ş��Í��Ş��™��š��k��“��ľ��š����‰��—��’�� ��©��¨��Â��Ő��Ě��Đ��ě��ń��Ů��Ă��Ă��{��‚��¶��¦��ş��Ŕ��Ă��{��č����8��j��`��w�� ��»��Ë��Ä��«��Ä��•��É��»��Ř��Í��ß��ú��Ż��o����«��Ě��Č��Č��Ç��·��Ć��¶����…��~��e��…��®��…��ž��Ô��Ž��_��a��|��˘��»��Ą��Ł��Ó��Â��É��ä��Ú��á��Ę��—��Ň��Ţ��Î��Ô��’��n��Ź��¦��Ú��Ż��®��Ă��›��·��ş��‰��ť��¤��Ĺ��Ž��ş��ˇ��}��˘��ť��÷��ó��1��S��x��­�� ��Ó��·��·��Ň��Ł��Ó��ś��°��»��ş��Ö��Ř��Ĺ��Ą��Ľ��ŕ��Ő��×��ň��ô��Ţ��ä��ě��ë�� ��ö��Ą��Ű��Ĺ��®��Í��Ě��©��|��×��Ü��ß��ď��í��ň��ů����ü��ř������ő������������ď��$�� ��Y��[��[��4��/��2����3����#��.�������+��6��.��)������ń��ú��$��;��Y��n��r��s��’��†��z��ś��”��š��±��­��Ş��Á��Ç��ń��_��Ś��«��Ľ��Ë��Ň��Ő��Ô��«��…��r��‡��¶��Ć��ą��Ň��Ń����ü�� ��h��p��ť��˝��ą��×��Ĺ��ď��Ű��î��é��é��î��ć��ć��Ä��ĺ��ő��ä��‡����4��1��'��R��2��\��K��|��Ś��w��u��­��±��­�� ��Ň��Î��Ö��Ć��8��ä����s��…��©��Ň��Ú��Ü��â��í��ę�����Ö��í��ď��ď��ý��ř��ň��™����ş��ş��ŕ��ě��Í��÷��ú��ă��ć��´����Ş��¦��‹��Č��ő��ł��ż��Ú��Ş������ŕ��ö��Đ��ä��˙��ü��ń��Ü��Đ��v��r����±��ź��ś��x��°��ţ��˙�� ����������đ��ë��ŕ��č����·��ş��Ę��–��¨��—��ľ����O��ô��u��»��Ĺ��Ý��ë��ć��ó��ß��Ż��¸��Ě��¦��Ę��×��·��Ô��Í��˝��Ů��í��ú��â��ĺ��ń��ŕ��á��ę��Ö��Ă��Ş��›��ă��Ď��Ö����ß��Ä��ň�����ó��ô����ô��'��÷����î���� ����÷�������ó��ú��ô������Ó��×��Î��Ô��Ó��Î��Á����ń��Ă��×��ę��ń��ô��ĺ��ú����ŕ���� ��ë��©��7��±��Ă��É��ř��ó��������ď��ő��������÷�� ������ę��Ř���� ��-��������������ň������ý�� �� ��ď��ě��ä��ü��ě����Ő��ô��ö��Ţ��ţ��ç��ö��ö��ů��ä��ü��Ć��Ů��Ľ��Â��ę��ć��­��Ě��Ű��Ę��ä��»��ˇ��Â��ť��®��Í��«��Ĺ��§��Ż��Â��ż��˛��»��¶��Ĺ��Ä��Ď��Ç��\��¦��ˇ��˝��·��š��‡��ß������l��Ŕ��•��ź��ˇ��‘��¨��}����0��—��‚����~��±��›����Ű��÷��]��{��’��t��‰��Ś��y��~��Ć��(��H��p��Š��„��‡��}��j��f��{��P��a��{��r��s��q��‹��‰��d��„��]��f��X��r��y��r��r��e��s��m��_��l��n��/��í������5��\��ú����¸��ŕ����z��}��K��x��t��˘��é��Ą��Č��4��b��:����(��&��ţ����Ş��±��É��Ë������ő��ó��Ů��Ç��¸��×�� ��@��#��H��#��S��o��Š��˛��Ý��ä�������G��h����„��a��¤��”��¶��Ż��Ý��Ě��ç��é����ç��ď����'��1��-��Z��e��\��Ł��Ş��±��Ö��Î��®��A��˝��ä��ż��ů��ş��ó��É��Ý��Ű������D��K��l��r��Ż��Ż��—��š��Ë��ŕ��Ř��Ń�� ��Ł��č������!��L��J��„��]��z��W��V��b��s��t��m��)��ž��¦��v��č��&��Ű��ů��"����7��S��Q��y��y��—��±��€��Ç��Á��ˇ��Ę��¶��¶��¨��k��&��s��B��c��‚��g��Š��ť��‰��°��¶��Ž��ź��®��˛��ć��ů��°��ţ����Ę��â��ě��ú�� ��K��_��e��Ś��Ŕ��Ć����ş��Ë��»��Đ��Ä��9��˝��u��ů��&��F��q��u��~��¬��Š��e��n��>��’����n��N��U��z��‡��Ż��:��Ú����!����-��U��m��l��„��ž��š��”��ž��±��¬��¸��Ć��¨��Ę��¶��,����,��_��y��j��‚��ź��Č��´��ś��Ä��ľ��ž��Č��Ę��Í��&��=��Ź��%��Đ��í��Ó�� ����d��Q��v��Ś��”��§��Ľ��„��Ř��›��Ń��Ý��·��ë��/��.��G��%��1��_��o��_��]��~��c��J��c��Ą��‚��¸��ď��§��˛��S��ű��ŕ�� ����,��5��\��r��u��Ę��Ż��„��Í��«��r��Ą��­��¬��Ź��x��”��ô��ú���� �� ��ú��î����8��6��W��{��H��`��›��U��b��©��Ž�� ��ă��Ř��ď�� ��ł��Î��é��˙��ý��ć��â��7������/����+��,��4��f����ł��ĺ��í���������������6����˙��Ă����Ř��ű��ú��ů����9����6��c��h��†��»��­��Ľ��Ü��ŕ��ţ��ô��ó����ű����÷����"��7��ž��ś��±��»��ď��ç��ć���������ü��ę�������%��!������M��I������ ��,��k��ž��Ą��¸����č��ó��ţ��������%����#��1��Ű��J��p��o��Š����ą��Ş��ą��Ő��Ý��é��ł��×��Ý��Ŕ��Ó��$��Ě��ä����*��V��m����€��—��¨��Ż��ë��×��ű��ű��ĺ��ô��ě��ţ����Ď��ç����±��}��Ť��’��ş��Ň��ć��đ��ç��Í��ç��ŕ��Ď��î��ý��ě����Ű��ő��ă��ô���� ��<��[����¤��Č��É��Ć��í����Č��%����%��9��ů������Ź��p��›��´��ö��â��ň����˙��ý����ú��ó�� ��Ç��Ü����ă��Ü��ö��˘��ú��8��+��N��K����Ą��°��í��â��â��đ���� ��´��¤��¦��˝��Ř��Ĺ�� ��4��@��]��x��…��–��‡�� ��”��‡��¸��Ă��Ń��´��Á��´��Ę��Ň��{��ć��Â��ŕ��ű��ö�� ��Q��I��†��‘��§����•��¸��Ě��Ĺ��Ô��É��ĺ��°����&��4��9��`��h��h��]��s��g��‹����Ś��Ů��¦����_��y��Ç��x��č������'��[��K����”��~��‚��Ń��„��ĺ��í��˘��Ä��Ż��»��Î��ă��l�� ��ü��ü��ö��ő��â��ę��ö��ů��ů��#��I��U��]��„��h��Ŕ��Ç�� ��ř��Ý��Ř��ä��ő�� ��\��c��g����ź��Ą��–��p��®��ą��ş��Ż��¨��Ę��ş��ö��ň������=��Q��k��|��‚��†��u��t��M��k��Q��A����‚��š��é�� ��ç��é������=��P��\��s��…��¦��™��°��±��¸��°��Ĺ��´��Ä��ä��R��Q��n��~��Ť��”��›��©��®��§��É��ĺ��˝��Ę��ŕ��˛��ů��ç��Ń����#��×��ĺ��â����6��e��y��}��—��Ą��›��˘��Ě��Â��î��Ú��Ý����Ä��H����9��@��I��W��X��d��{��P��i��c��–��y��š��l��“��¤��É��ę��ű��â������)��>��U��w��t��Ă��­��Ü��Ę��µ��ľ��Ş��‚��Ţ��Ž��…��m��)��€��`��m��—��«����•��ť��‘��ś��›��¤��č��°��É��»��G��i��”��Ú��Ő������=��B��m��g��y����É��•��Ë��Ř��–��®��ß��ý��v��ß��ö����U��R����~��Á��Ť��f��•��†��D��>��g��I��@��i��w��{��Ă��˙��ŕ�� ��ó��>��A��€��€˙�r��“��«��|��ś�� ��v��Č��Ŕ��¤��Ď��Ł��–��D��S��F��P��p��Š��¤����ŕ��–��ś��¶��©��Ó��ľ��Ë��ş��á����ü��â��Ô��â��đ�� ��b��v��€��“��¸��ą��Ż��”��›��ł��°��Ń��ő�� ��J��Ü��������0��M��f��b��`��h��{��h��„��®��]��·��Ž��‹��Ő��t��Ń��ü����,��<��D��V��S��l��·��‰��’��µ��š��Ś��Ŕ������ż��ž��ú��ă��Ň��ă��í����Ü����������,��H��K��Ť��s��{��°��Î����%��Ö��ä��ű����0��^��l��‡��·��Ľ��“��Ě��˘��“��Ř��Č��č��ń��Â��~����_��_��t��’��”��€����°��‡��f��w��‡��ˇ��«��®��´��˝��‡��Ń��+������+��@��G��m��U��x��t��U��g��^��>��‰��T��T��‹��‰��Ű�� ��A��h��o��r��ť��–��•��Ŕ��…��¦��§��y��g��}��Š��™��Ę��ť����ĺ��ć������ ��3��I��x��¤��Ź��›��«����Ť��–��Ť����š��r�� ������K��)��Č��°��Ô��Ú��Î��Ł��á��˝��Î��č��×��ß�������Ń��F��$����j��Ś��›����Ú��Ä��ů��Ĺ��Ő��ő��Ó��Ę��ţ�� ����˙��Í�� ��Ű��j��¶��ć��ˇ��»��Ę��Ţ��ę��ó��Î����ę��Ä��Ń��á��'����č����������Z��S��c��“��·��Í��Č��Ý��đ��ú��Ý����ň��ţ��C�� �� ��H����b��e��ˇ��Ľ��Ř������ü��ö��ů��ž��Ş��í��ç��ą��Ó����Ř��­@�)��=��M��i��x��­��®��ž��«��č��ö��ú��×��ň��á����Ú��č��(��K��x�� ��‰��–��©��´��ä��é��Î��˙����ě��������������q����e�� ����9��;��s��˛��Ö����ß��ż��ß��ö����������*��H��D��ô����§��ź��Ş��Ŕ��»��Ů��Ć��Ľ��N����Ć��Ó��É��Ň��î�����ú��Z��b��&��a��j����‹��Ż��˝��Ú��č��ý��������ő;��:��7��S��*��!��]��v��Ł��Ü��Á����~���=��9��T��_��«��©��…��µ��ĺ��Ě�� ��¶��Ü�� ����8��V��l��š��Ó��Ż��é��Ú��ř��.��ţ�������� ������Ź����x����š��ź��ô��Ü��Ĺ��Đ��Ń��ź��Ö��Ç��Ń��Đ����Ú��ŕ��÷��Ň����ö��H��Z��d��™��Ô��Ď��ď��Ű��ć��č�� ��ő�� �� ����˙����á��ű��¤��Ą��»��ż��Ů��ô��ď������ţ����#����*��#��"��)��H����j������#��@��Y��Ł��®��Ć��ř��Í��������&����(�� ��ň��7��°��C��^��[��‹��ż��ă��ˇ��Ł��ż��·��µ��đ��ę��á��×��8������Ů��Ń����>��l��™��‚��¸��Ŕ��Ä����î����"��A��˙����ć��Ô����Î����Ą��©��É��ł��«��Í��ă��ů��á�����ř��4��˙��×��˙��$������ô��‹��Č��˙��H��_��e��¸��é��ä����ů����(����ú��E��§��ć��-����8��Ĺ��ą����ĺ��$���� ���)��+��.��G��-��D��9��&��=��%��8��@��‚����I��c��‚��v��Ł����ä��Ú��ă��č��ě����ď�� ������ ��Ń��ć��������4��W��~��Š��—��Đ��Ŕ��Ż��­�� ��Ă��Đ��Ů��ŕ��Ő��Ń��:��Ů��Ň��î��ě��"��%��U��S��Ž��m��¨��Ł��‰��«��Ş��ă��ĺ��É��ô��7����ů��ň��0��&��A��l��]��s��e��s��’��~��‹��˝��Ş��Ł��s��Ź��ý��#��ú��,��@��F��Y��^��‰��w��l��Ź��“����¬��¸��ś��µ��•��ż��č��T��ç��ě��ă��ř��ń��đ�� ��!�� ����1��9��j��~��†����´��¸��˝��&��É��×��ä��;����C��’��›����š��Ó�� ��Đ��ß��¶��ř��®��Ů��Ó��Í��*��^��†��|����Ą��Ö��Î��Ń��č��µ��Ě��î��Ú��É��ň��Ő��đ��ë��Ö��Ę��ß��Ü��ń��ó�� ��ě��ř�� ����ä�� ��ň����3��;��P�� ����H�� ��.������� �����÷�������� ����/��>��+��A����B��*��a�� ��ä��ă���� ��M��~��c��k��‚��h��N��p��Ž��u��d��Ą��©��t��’��=����P��~����›��z��l��q��x��g��j��k��o��›��Ŕ��‡��l��w��ó��·��ó����3��a��q��Ź��e��Ś��©��„��¦��ş��“��ľ��š��Ľ��°��Ő����Ů��A��”��°��ť��t��ś����}����‚��y��—��ş��±��ż��Č��°��Ű��Ô����Č������J��[����t��}��˛��z��|��ł��¦��·��Ő��Ă��ĺ��Ś��������i��µ��Ă��â��Đ��ď��ę��Ă��á����>��+��H��]��‘��”��j��a��„��é����.��2��^��[����ž��Č��“��‰����Ž��¦�� ��Ź��Ą��Ó��ś��Š��V��U���� ��®��Ě��µ��Š��Á��v��a��/��S��–��Ź��•��´��š��ž��Í�� ��Ţ����6��K��W��s��u��†���� ��8��‘��‹��ź��±��Ç����ň����@�� ��N����Î��¸��ń��Ć��§��“��Ü��������7��s��f��™��m��‡�� �����<��\����H��t��U��r����`��m��x��Ľ��´��Ş��©��ă��´��Ö��)����č��÷����ţ����ů���� ������.��C��w��;��{��e��’��—������ĺ��ń����B��X��y��s��¶��—��M��g��†��‘��Ě��Ö��Ë��Ŕ��Ó��Ü��%��…��˛��¤�� ��ľ��¬��†��u��«��€��Ů��,��„��‡��z��›��z��«��Ŕ��Ó��'��7��Q��•��‰��Ť��–��…��”��m��\����Ë��–��ś��Č��}��ž��„��•��1��X��j��ş����—��ą��Ž��±��Í��G����Ą��ť��ś��Ŕ��˝��–��’��y��-��ţ��*��i��\��~��~��‹��Ź����p��Ş��˛��§��Ç��Đ��˛��±��Ö��0����@��t��·��Ĺ��˝��±��Ŕ��ĺ��Ĺ��e��Ť��¬��Ş��Ă��ş��ą��©��g��[��î����$��X��t��v��Š��}��‘��ž��Z��‚��˝��Ĺ��¨��Ź��Ĺ��­��Á��î��N��@��S��w����¨��z��r��Ŕ��¶��I��g��Ś��ł��ź��ś��Î��Ö��Ň��—��¤��ć������F��R��j��\��Ť��Ť��p��{��˘��ź��·��˝��Ň��Ă��µ��Ő��×��ć�� ��‰��w��®��Ť��ş��´��‘��_�� ��÷��3��!��Ž��–��§��ł��®��$��ŕ��%��?��|��c��w��`��p��”��|��\��Ž��ź��Ż��Á��­��Ó��Ă����Ó��I��t��“��…��‹����T��©��Ů��O��-��h��”��z��ś��·��´��©��×��3����č�� ��2��V��n��{��„��‘����R��Ť��x��Ť��z��§��˝��Ú��Ő��ü��÷����"��]��Ś��˛��–��z����_����ć��˙��E��~��J��w��ť����m��­��8��C��.����I��X��r��“��“��w��Ś��Ś��p��u����}��˛��°��ş��Ż��÷����ú����������������L��9��S��h��r��ź��¦��Ś��v��„��Č��ĺ����R��V��š��{��…��¦��n��X��›��ś��˛��ž��đ��·��†��©��¶������Ö��µ��Ë��…��‰��©��™��m��:��J��y��¦��ˇ��Ő��®��Ö��ë��m��ă��#��;��z��m��–��Ź��n��´��u��;��n��€��ł�� ��›����˝��ť��´��!��G��P��V��x��y��Ś����ż��‹��;��@��p��d��Ž��Ł��Ó��˝����k��í��â��ě��ń�� ��A��b��b��c��p��u��j��˘��˛��¸��Ş��Î��ž��Í��É��“��}��‡��Ď��Ý��?��V��›��·��Ű��&��’��”��…��p��‹��Ć��ś��u��m��Ţ����"��ű��"��E��‚��Ł��Ź��“��’��Š��‘��Ă��„��­��ş��™��¬��»��»��5��„��Ť��Ż��˝��“��—��|��˘��¸��&��Ž��Ą��g��¦��§��—��ş��€��ß�����ß��ě��)��H��e��j��…��ť��§��|��Š��•��§��Ë��É��Ô��¶����?��ç�� ��U��·�� ��Ş��¶��Ő��¬��°��m��ü��ř��ö��"��v��g��‹��š��›��ż��˙��W��I��v��x������~��Ž��}��}��z��ˇ��˛��Á��ˇ��Ż��Ą��‘��Ń��f��?��r����~��–��s��†��ž��X����^��Q��j��u��‘��›��ť��x��ä��Ţ������^��I��Ź��{��z��¶��Ă��M��†��•��Ł��¬��µ������(��_����ˇ��ś��‹��Ą��’����¶��Ů�� ��ë��!��<��9��p��c��X��§��¸�� ����ţ��ć��!��P��_��e��Ž������i��m��‡��µ��¬��’��Á��’��t��ţ��?��÷��î��ä��ú��ú��?��4��M��;��E��P��@��‚��g����ź��§��M��Ę��T�� ��a��~��Ł��·��Ö��Ď��Ý��ű�� ��Š��ń�� ������������ě����_��Ň��Č�� ��ú������ý����ö��K��n��ł��ą��ń��ň��ţ��´��ł��‡��˙��o����Ŕ��Ç��´��˝��©��é��Á��»��Î��ç������đ��ř��×����o��C��Ç��Ę����ę��Ů�������é��.��[��Ď��ö��ř��������#�����„��C����0��Ž��–��Â��Ă��Ó��ŕ��É��Ľ��ë�������� ��ń��5��7��Ú��T��ž��«��ĺ��ú������ý��ć��Ô��Š��Ź��ń����Ŕ��ß��ó��Ô��ß��ç����g��–��Ĺ��Ó��˙��Ú��˙��á��ű��Ä��÷������í��÷��H��ó��>����W��©��Ţ��ý����ö��đ����ç��ď��ő��Ż����3��í��đ�� ��J��5��g��o����I��€��§��ľ��Í��Ó��Ç��ř�� ��Î��$��%��ě����:������*��6������'��D��&��;��:��7��S��*��!��]��v��Ł��Ü��Á����~��{��ť����T��f��Ż��Î��Đ��á��Ř��í��»��®��Ú��î��ö��ţ��ä��!��Ü��ć��+��ž��Ľ��˛��Ô��ć��Ě������1��2��Ń��_��›��É����.��ú�� ��˝��Ŕ��9��)��`��q��±��­��Ă��µ��Ó��č��ô����×��Í��ť�� �� ����9��»��#����t��Í��â��í��ń��â��Ě��Ă��p��Š��˝��Ă��Ż��×��ş����Ž��<��Ĺ��F��‘��Ł��Ń��ŕ��ď��đ��ń����É��Ą����Ä��î����Ű��?��,����a��2��3��%��*��:��D��$��H��S��G��`��~��†��±��ď��´��Ő����Ů��Y��ë��ý��;��l��Ś��ú��â��Đ����ł��z��ä��Ő��&��%������������†��¬���� ����,����'��,��M��‹��'��•��ß������,����.��0��Í��‘����ß����ť��Ý��ö��â�� ��—��Ş��ľ��ä��ä����!����ö��ř��ä��ć��ö��ú��ő��á��×��ë��ß��ř��Í��ő��÷��ŕ��9��+��G��Í��Č��Ó��Ĺ��®��Ń��Ě��ß��â��ę����^��Ö��ć��ć��Ú��ß��Ę��°��Ç��Ç��Ř��ľ��Í��ç��Ő��×��â��ż��Ă��ľ��Č��á��Ě��¶��Ł��w��{��r��}��K��d��š��ď��8��‘��„��ž��ś��Ľ��¸��Ő��°��Ă��Ă��›��°��·��Ž��Ť��y��®��‡��ź��Ś��¬��Á��¬����®��·��«��ť��«��z��}��‹��k��t��Y��m��o��t��ą��‡��|��’��[��Ť��[����€��‚��S��[��o��X��1��W��b��J��L��K��O��\��X��r��d��x��r��i��s��W��P��5��n��U��P��©��@��5��9��#����Ń��°����9��S��Z��‘����€��s��Ś��…��Ş��‰��š��Ź��Ž��—��–��ť����ˇ��ş��„������e��‘��Š��b��b��ż��s��K��X��G��k��q��‚��o��Z��{����p����Ś��Ł��”��ˇ��Ť��‘��„��­��©��Š��‚��‡��•��~��Ż��«��¬��ľ��®��¸��Ż��©��Ł��ž��†��Ť��‹��ł����j��N��c��3��I��^����…��]��G��j����?��\��|��l��T��j��x��P��„��z��†��›��Ä�� ��o��‚��¨��Ą��´��ˇ��°��®��©��—��Ą��Ź��¨��Ś��§��‰��\��v��m��ť��“��™����Š��Ś��Š��“��Ł��_��v��‘����‘��ś��„��j��[��Z��R��D��0��G��D��5��Y������E��h��A��@��)��3��&��:��C��1��v����/��_��E��2��~��;���� �� ��<��X��~��@��6��W��}����’��Ź��q��q��“��ś��¦��Ź��}��’��–��„��—��Ť��„��˘��ˇ��h��†��o��w��€��n��q��q��y��Ż��}��‘��y�� ��g����{��p��Š��q��z��|��R��¬��¤��{��i��‹��t������„��o����p��y��Š��”��Ź��”��‹��ź��·��u��Ś��™��¨��p��–��Š��~��Ś��‘��Ť����t����^��h��‘��s��v��o��^��[��‹��ť��—��w��w��‡��s��u��Ś��n��‡��“��«��‚��š��j��¸��¬��¬�� ��™��‚��‹��w��c��Ž��°��]��|��r����z������q��v��}��u��o��b��{��^��u��}��j��‚��t��}��š��€��{��™��€��…��ť��‰��Ľ��ż��Ő��Í��ô��#��‘��Ť��[��“��Î��{��5��n����ž��¸��«��´��‡��Ż��«��¦��ˇ��ś��Ż��±��­��µ��ż��Ş��ś��ź��Ş��‚��~��ą��Ł��Ź�� ��{��Ž��Ł������»��Â�� ��…��x��Ô��Î��«��‘��­��›��Ş��ť��•��«��”��¬��·��š��©��°��©��˝��‰��¨��™�� ��‰��¤��Ž��„����‰����¤�� ����×��’��Ś��b��~����˘��\��Ż��9��»��Ś��ë��?��\����”��Š��’��}��‹��”��ś��ž��o����q��Ť��ś��Ź��´��§��“��¬��—�� ��®��“��€��ˇ��ś��¤�� ��‘��ź����Ś����…��j����J��‰����”��›��•��µ��±��ż��ş��Ă��Ć��ť��˝��˛��Ľ��ł��§��¬��±��§��×��Î��˛��Ë��ł��˛��Â��˛��ą��·��˝��©��Ľ��ť��®��Ý��‡��I��Q��U��F��B��Z��?��>��H��M��T��Q��D��X��L��Y��i��M��Š��ľ��A��s��:��K��h��E��O��_����§��y��~��µ��Ŕ��Ô��Ö��Ô��Ű����·��m��\��€��Ď��°��Ě��â��ń��#���� ��Q��L��^��s��Ť��x��h��u��î��#����:��R��w��€��v��_��V��7��!��U��I��Q��[����$��C��!��1��ľ��±��˙��.��>��>��B��@��M��+��@��n��Z��p��@��W��d��I��^��.��{��î������"����(��,������(��$��<��B����Q��-����:���� ����9��t��Ś��¨��ď��ö��ä��ä��÷��ő��<��"��-����F������� ��Ĺ��Ň��ú����� ����ţ������Ç����x��l��u��¤��­��ŕ��ŕ��ă��ý��z��ž��©��€��¨��´��Ĺ��Ű��Ű��Ú��Î��•��Ö��"����"��)����'����ß��ž��é���� ��ý��đ������%��\��µ��Ţ������O��!������ö��Č����I��{��„��Ş��­��¶��Č��ň����ü���� ��#�� ��-��$��H��0��M��¸��3��K��F��'��C��A��-��#�� ��_��Ţ��ó��Ú��í������'��/��%����t��Ĺ��Ô�� ��ý���� ��é����M�� ��9��(����B��˙����B��d����g��]��R��z��q��d��e����˛��ś��‘��Ę��Ş��Ä��ä��ş��Ö�� �������›��^��‚��©��ľ��Ţ��ň��á�� ��î��Đ��ŕ����î��������*����é��¨��Ő��������2��:��š��Ľ����Ň��M��€��n��c��ś��f��`�����ţ��ë��=��o��c����v��Ś��t��]��X����d��™��¤��ś��š��ś��¶��Ş��›��Ý��T��r��[����‚��•��Ť��Ż��Ş��Ń��v��˛��š��·��»��»��Ç��Ç��·��–��ę����/��C��‰����›��–��°��Ł�� ��»��°��Č��Ţ��Ř��Đ��Ë��Ţ��Ę��“��Ą��·��×��Ę��Ě��»��Ć��Ş��Ň��¬��™��ˇ��Ń��Ă����ź��­��Ś��č��R��˘��š��ź��°��˝��­��Ę��Ő��Ľ��ß��Ů��Ć��â��ĺ��Ü��Ů��Ă��đ��Ň��Č��ć��Ů��ő�� ��č��ű����ů��ü��ĺ��Ş��Ř��é��č��É��Ě��•��ˇ��J��t�� ��\��S��e��€��­��¸��»��Ľ��—��—��Ě��ł��Ű��ď��Ě��Ý��ă��Ř��Ů��ľ��×������ě��Ü��Ô��ą��Ö��Ó��v��Q��f��[��z��‰��”��s��Ä����%��Z��Q��u��u��z��Š����ś��{��\��s��´�� ��‚��Ż��¸��š��˝��Ł��v��¶��ž��˘��Č��–��’��Ł��ś��ń��6��”��§��Ę��ë��Í��Ô��đ������U�� ��;��f��~����ž��Ś��§��’��Š��®��ł��¦��Ř��Ů��˛��á��Ô��Ŕ��µ��ľ��Á��ĺ��ŕ��Ĺ��ç��Ć��Ď��¸��ˇ��z��™��Ż��«��µ��Î��˛��°��Ú����‡��©��¦��­��§��˘��­��›��¸��™��”��˛��Ż��Ó��ç��Ç��ş��Ó��˛��n�� ��-��"��D��;��S��]��|��Š��a����Ş��š��–��ş����°��Á��‰����R����:��N��˙�–��¦����Ó��Ż��‘��Ą��¦��Ë��Ę��Á��Í��é��Ó��ĺ��Ą��ˇ��Ö����Ö��â��ő��Ţ����Ç��ö��A��—��Ń��Ă��µ��Ŕ��Ď��±��1��-��S��H��f��v����o��s��’��v��`��y��µ��Ş��Ş��Ő��ą��­��˛��†��{��[��~��®��‡��–��Đ��×��ŕ��+��y��Ł��Ű��ç��Ţ��ć��î��ď�������� ��<��D��a��‚��«��’��ş��µ��’��Á��ä��Ţ��ö������������Ş��p��ą��á��ĺ��í��đ��Í��Â��¸��Ú��·��á��ŕ��ę��Ő��Ě��Ű��×��ä��×��'����‰��˛��´��Ő��©��đ��ä��Ą��ě��ä��Č��ő��đ��ň��ó��ň��ţ��/��o��Ę��÷��ü��ň����Ţ��ŕ��¬��`��‰��š��«��ş��É��ä��ç��Ď��đ�� �� ����E��K��q��Ł��š��¬��‰��Ŕ��Ż��–��Ą��Ü��ß��Ä��ë��ď��Ů��Ě��b��ů��Ű��Ô����ĺ��ż��Ň��đ��Ý��x��Z��t��•��f��ż��Ç��˝��Č��Ę��©��W��V��s��Ź��˘��—��‘����–��ś��@��’��›��Ö��É��¦��Ľ��¸��Ż��™��J��"��>��x��°��Ę��¦��Ŕ��Ň��=��q��Ń��›��¨��»��á��ß��Ó��Ő��,��ŕ������g��g��•��­��±��±��ě��˘��Ř��î��ę��Ý����ô����$��k��Ŕ��č���� �������� ��ę��,��ą��ß��ö��Ú��Ö��ö��Ő��Ű��ö��4��m��ˇ��˛��Ä��Ţ��Ű��â��í�����Ą��Â��ý������(����Ë��÷��ř����j�� ��0��<��w��p��p��¤��¨��µ��ł��ö��ń��ď��ú��ô��ň��ő��ú����<�� ��@��e��Ź��­��Ô��ą��í��Ć��Ć��Ĺ�×��í��ô��ü��Ű��ö��W��Í��Ý��Ź��Ů��ř��Ő��ë��ř��Ý��ü�� ��:��=��ş��Ş��ĺ��Ó��ď��ü��ž��ś��˘��Ý����ß��ď��č����ů����� ��������$��'����ô������ ����ö��0�� �� ��)��A����&��6��E��ů��1��I��]��B��R��€��v��Ł��ł��:��Q��C��w��R����±��ż��Ę��Ň��¬��ĺ��Ő��ô��F��đ��Š��¸��â��î��±��ą��Ö��ě��ü����í��í��ë��ů��Ă��×��ľ��â��Ý��ă��ď��ď��-��­��é��n��É��ř���� ��î��˛��Ů��×��¶��ň����ü�� ����ę��đ��ý����%��ň����Ě��Ý��č��ě��Ď��ç��ˇ��¸��ö��ô��î��ď��ě����÷�� ��ó��©��ď����0��X��ś��«��—��Ą��É��’��ş��ŕ��Ĺ��Ü��ô����°��Ę��Â��ľ��‹��Ő��î��Í��ç��í��í����Ó��G��D��a��{��¤��®��Ż��Â��Ş��Ľ��ń����&����˙��˙�� ��ü��ő���� ���� ��#��8��3������ ������#��-���� �� ����"��,��:��Z��(����5��"��(��@��K��u��V�� ��8��3��B��$��Y��‘��•��Š��¸��Î��§��˘��Ä��Ű��Ĺ����j��¶��ţ��Ů��Ű��Ů��ä��ö��ë����÷��Ů��Đ��®��©��¦��¬��Č��Ó��Â��Ě��Ă��¨��¸��L��b��˛��Ş��Ô��Ď��ę��ó��Ü��î��Ö��Ö��Ú����ô��ć��´��ë��đ��ę��r��)��-��>��m��~��™����®��Ď��Î��¬��ß��ű��É��č��ç��ä��ý��č��«��5��I��Y��Š��ˇ��˘��ř��ä��Ó��Ű��ş��ń��ý��Ů��č��ă��ľ����ň��ö��ç��������"��$��������W��ř������� ��/��ý����;��*����,��>��*��D��/��I����?��;��7��1�� ��N��J��@��E��<��L��6��N��F��F��5��:��9��7��G��(��4��-��?��7��F��/��D��6��)��9��#��,�� ��3������������(����&������%����ń��������˙����,����ú����đ����ů��Í��Í��Î��Î��Ř��Ă��§��É��ď��Ó��Ű��í��Ŕ��÷��î��Ń��×��Ý��Ď��ŕ��Ń��˛��Ç��Đ��Ĺ��Í��Á��Ż��Ő��Č��¸��×��©��ß��á��Ů��ě��Ş��ˇ��§��Ô��Đ��Ű����É��ź��đ��Ň������ ��ď��������Ô�� ����˛��Í��Ü��Ţ��Ń��Ţ��ń��Ë��ä��ô������ ��!����1����â��ă��ě��Ţ��Ň��ü��÷��ü������÷��ů��˙�������� ��Ę��ę��ę��Ő��ă��Ç��Ú�� ��N��±��”��¸��¶��®��É��Ú��¶��Î��ş��¨��Í��Î��ż��Ý��Ĺ��­��Â��Í��Đ��Ć��Ń��Ŕ��Ô��Ę��×��Ů��Ą��Ď��ü��…��Ł��¨��˛��Ż��Ż��Đ��Ĺ��ţ��8��“��’��›��‚��¤��Ž��˝��Ę��Ł��­��ˇ��Ł��Ž��d��Ű��*��ę��Ě��ä��1��c��—��h��C��o����$��!��'��9��-��C��A��P��…��w��(��N��n��{��x����•��Ą��ś��ž��ť��•��—��Ś��ł��©��¦��¨��›��š��°��…��ś��·����´��–��Ž��·��·��­��Ú��±��Â��ć����Ź��é��ę�� ��0��7����m��g��™����˘��§����ě��Ë��ş��ż��Ý��˝��±��°��A��ű��é��A��i��w��ť��”��c��Ť��:�������b��w��z��„��“��‹��n��Ë��đ�� ��;��l��–��j��Ž��}��€��Ş������Á��Ą��•��Č��š��¬��«��¤��Š��Ż��™��­��¬��§��Ć��Ë��Ň��Ř��¤��´��ś��‡��Ü��Á��–��­��ô��Ő��ň��ň��@��f��{��°��”����¸��Ż����«����¬��­��Ş��±��»��±��Ë��f����ţ��3��4��‘��“��[��[��F��ű��ü��?��_��y��{��€��r��Ś��h��Â��ř��ö��/��[��R��F��i��b��q��5����v��u��–��Â��–��·��Č��{��Š��~����ť��ź��›��«��Ů��—��Ľ��ş��™��ł��\����(��L��P��‚��Â��j��Q��Ś��–��ł��ˇ��ś��‰��‹��ś��•��®��˛��—��ť��—��¤��˛��¨��¨��»��^��ŕ����*��`��Ś��_��w��[��1��Ó��˙��I��+��?��m��f��Ź��f��Â��í������]��{��p��†��X��i��{��{��«��Ŕ����Ĺ��Ş��¦��Ľ����ź��E��n��š��­����¦��·��†��č��˛��€��­����€��©��–��~��µ��+��ć��$�� ��K��t��M��|��v��^��‡��‡��e��—��•��w��˝��Ť��Â��Ĺ��‘��:��)��:��}��s��”��›��ˇ��Ď��$�� ��%��I��1��–��ź��‡��˛��Ł��r��{��C��ä��Ř��˙��=��f��]����g��o��a��…��ˇ��š��ł��ž��Ł��ą��˝��µ��ż��˘��·��Á��¦��Á��Ę��ż��ť��¬��ł��Ę��Ě��Č��Ę��Ľ��ý��Ě��˝��×����Ĺ��˝��ü����F��^��Q��L��o����y��…��˛��‘��…��ž��€��Ž��›��•��\��Ř��ě��%��1��u����U����ţ��đ����3��@��Q��‚��Š��g����]��M��ů��%��$��i����m��Ž��p��n��•�� ��Š��Ŕ��|��•��´��—��ż��ľ��–��”��˛��Ż��µ��Ć��ą��Ç��Ű��Ţ��Ţ��k��¤��©��Ş��Ä��©����)����!��_��c��„��–��¨��Č��ż��ł��Ě��ż��‰��Ň��Ä��«��Ę��Â��Ó��ż��Ţ��J����N��W��~��d��™��r��Ď��ł��ĺ����A��j��€��ž��Ľ��j��’��®��Ź��M��ř����i��X��S��Š��q��J��Ł��d��–��Ä��§��¦��ą��Ô��Ö��ş��ś��Ć��Ń��¸��Ó��Ü��Ń��Ô��÷��í��ĺ��Ĺ��«��ý��ü��×��Ú��é����š��˙������2����‡��ł��¦��•��Ě��©��¤��Ý��©��Ď��â��ľ��Ó��Ĺ�� ����{��ô����E��h��k��r����,����T��B��G��°����†��Ž��v��…��b��9��Ď��ň��V��t��j��•��t��[��Ž��µ��’��ç��’��¨��Ë����ß��Ë��É��Ô��»��Ľ��Ň��Î��Đ��ĺ��é��Á��˝��č��Ů��í��ę����á��Í��đ�� ��g����×��N��g��€��Ż��–��z��ž��¨��Â��¸��´��°��Ä��ż��Ď��É��ž��Ş��F��é��+��X��k��Á��q��c��b��t��Ř��î��6��E��U��n����W��t��X��…��ű��˙��-��D��^��G��j��T��Ş��‘��r��ˇ��Ł��®��Ă��«��®�˛��Ä��Ö��ş��·��•����’��¸��Ĺ��¨��ů��Ĺ��Ě����·��Ł��Â����Š��7���� ��w��]��ź��©����~��–��Š��±��­��Ą��Ű��‰��¨��”��ž��®��Ą��m��J��ź��f��Ä��Ü��ź��ą��ˇ��w��;��R��}��–��¶��Ď��Ç��˝��ë��ć��“����ú��7��‡��‘��Á��Ä��ą��Ş��ź��´��Ľ��Ć��ň��Đ��ł��Ń��®��¨��ă��Ş��Ź��ł��´��®��Á��É��µ��Ň��µ��Ä��Ě��˝��������Ë��–��›��ż��ž��«��†��ű��M��K��˘��…��—����n��–��·��Ť��Á��°��˘��Ň��»��˛��ş��­��K��"��f��Š��ź��©��Ş��Ż��É��ź��#��-��I��}��§��”��©��–��·��ş��î��Ä����'��y��–��Â��á��Ë��Ę��±��˝��Ő��Ĺ��˛��Ş��·��Đ��á��Ű��Ę��´��Í��Ů��Ů��ĺ��á��Ö��Ţ��ä��Ď��ş��î��Ó��ň����č��í��î��ŕ��Ň��Ý��A��š��É��T��|��·��»��©��¤��Ş��˘��»��´��Ů��Ä��Ë��Ă��ą��ä��¨��»��Ç��Ń��Ń��Í����ý��Đ��Ŕ��ä��Ú��Ę��đ��ę��ö��Ú��đ��ß��Ę��g��X��:��é��ý��#����'��y��‘��Ł��y��s��b��·��Ľ��Ď��ç��Ń��é��Ů��ř��ń�����á��ß��ë�����Ů��ř��Ý��ä��ĺ��Ú��ç��Ó��č��ę��Ý��Ţ��Ň��ń��ć��â��ň��ő��ă��ć��Ř��Ő��Â��ń��ó��Ł��Ę��ç��Ó��Ř��Ď��Ĺ��¶��‘��Ď��Ą��«��ť��Ç��Ż��›��x��‚����Ů��Ë��ä��ď��Ý��Ď��Ę��a��Ž��“��V��†��L��ý��3��‹��Ť��Ö��Ú��Ë��ó��Ř��ć�� ��ť��Ć��¤��o��­��Ź��‡�� ��Ł��Ă��đ��Š��Ő��ť��­��˝��Î��›��«��p��—��‹��“��z��l��ł��u����J��Z��’��j��„��«����t��›��´��ž��Î��Ť��ŕ��ń��¶��ć��«��Ć��đ��ŕ��ô��Ů��Ő��ĺ��Ö��˛��Ü��Ę��Î��É��ž��ť��Ú��©��ć��Ň��Ą��Ä��‘��Š��Ş��W��F��v��–��Á��Ä��¶��â��ĺ��«��Ě��Í��É��Ü��Ő��¶��ď��Ú��¶��ň��č��ë��č��Ă��ń��Ď��Á��¶��ť��¬��î��Ă��Ő��Ő��Ď��ď��í��ˇ��ľ��Ą��¤��­��Î��Ú��÷��Ě��Ű��–��Ó��›��Â��Ů��ě��Ň��Ü��¶��á��±��˘��¦��Ë��é��ę��¬��ě��Ú��ď��Ź��Ŕ��Ŕ��Ă��ö��Ľ��´��ĺ��ő��ç��č��ň��Ë��ň��×��Ú��ŕ��÷��ű����Î��Ň��Ő��ć��ć��ö��ŕ��ö��Ô��ë��ő��Ń��ë��ń��î��ď��ř��ĺ��ů��Ü��ŕ��ę��Ň��Á��ú��Ü��Î��č��ş����t��š��Ň��Ő��Ţ��á��Ę��ě��ő��Ü��ŕ��â��Ű��î��÷��ń��ň��ő��ç��Ę����D��u��Ł��Ă��Ď��Ĺ��´��Ň��î��Î����î��Ę��l��ą��Ů��É��ą��Ű��Ŕ��”��ď��*��'��u����–��±��ť����’��“��Ł��¦��ł��¦��§��§��¸��±��‘��i��J��_��z��t��E��p��i����d��&��`��Z��G��f��C��M��H��]��K��#����J��8��z��e��a��d��^��<��P��B��I��+��S��k��\��j��y��Ĺ��Ľ��ó��L��Z��G��Z��d��x��J��N��T������*��|��ć���� ��]��„��b��Á��*��H��U��R��a��b��p��n��v��u��€��n��S��j��M��u��[��N����7��7��^��:��q��?��'��"��@��0��Y��+��G��?����D��#��Z��÷��'��(�� ����+��ű��(������ř������ ������ ��F����ý��®��Í��Î�� ���� ��ű����)��í��÷����ö�� ������ő��>��+��C��€��Ě��Ň��ď����g��h��}��r��F��T��x��W��U��=��K����5����D��"����-����b��Y��D��€����i��z��T��d��ž��†����b��€��t��ß��'��I��6��^��^��X��N��V��™��b��H��K��^��O��w��N��T��h��™��ž��H������,��Q��v��~����€��i��v��€��Ľ��ľ��Ş��ľ��•��©��–��x��ź��-�� ��0��i��’��ˇ��ť��Ł�� ��¤��•��¬��ž��s��\��€��|��‰��w��r��=��Z�� ��j��•������-��D��`��c��}��k��‚��4��T��[��d��t��Ş��s��‘��Ý��3��h��m��j��y����Ś��…��z��h��h��˘��›����‘��_��]��z��k��_��Q��^��R��Y��P��7��)����!��"�� ������7��6��`��D��g��ś��„��|��X��ö��F��g��8��9��]��-���������� ����������>��w��™��×��H��^��{����v��o��I��(��3���� ����9��R��¤��ž��¨��ń��S��{��x��|��«��†��Ť��µ��°��Ź��n��t��j��A��%��đ����#��a��G��*��8��x��Ź��—��€����v��>������)������0��+����O��h��ś��N��p��p��ź��ž��ž��\��G��2��B��M��,��&��@��g��J��i��”��w��¤��Q��|����~��p��r��”��‘��ˇ��Ź��ť��Ş��ž��„��k��m��’��q��ź��k��(��Y��]��_��©��Ą����Y��w��D��&��"����!������O��i��–����9��`��^��Š��d��r��c��Z��‚��^��Y��X��t��f��‹��z��W��u��z��w��V��5��@��������ó����‚��¸��Ŕ��ň��ý��Ř��î��ß��÷��´��Ä��ü��Î��Ŕ��Ü��ö��ď����ä��Ŕ��ć��Ň��ş��Đ��Ń����»��ź��Ľ��Ü��»��Ő��Â��©��„������ż��‡��Ň��Á��ŕ��é��ă��Î��Ô��Ó��§��©��ć��ě��Ň��Ű��Ě��ľ��˛��Ľ��î��Ó��ŕ��ç��Č��˛��°��v��s��Ĺ��č��É��Ô��ú��ň��÷����]��t��Ĺ��Ö��ç��â��É��ň��ă������ü����ó��đ������Ů��Ç����ú�����ŕ��â��ű��ă��ţ��ĺ��Ú��Î��Ô��Đ��ż��Í��Ď��˛��»��Í��›��Ź��“��Ć��§��Ę��Ô��É��Ĺ��ş��Ń��ś��·��Ś��y��s����“��Ż��˝��Ă��Ż��™��Ç��Ţ��ľ��Đ��ˇ��§��ž��´��”��ť��«������Ž����¦��ł�� ��m��w��{��Ý��»��ť��Ě��Ę��Č��Ő�� ��×��Ż����ő��ľ��´��ŕ��;��…��Ă��Í��É��ä��×��Ń��É��Î��ä��y��§��Ô��ß��ů��Q��S��W��S��ň��V��Ľ��ą��Đ��*����Ý��ţ��ű��ô��‘��˛��‚��—��|��ˇ��¬��™��Y����6��j��‹��“��Ž��“��t��†��Ž����†��b����­��¬��}��`��™��Ş��O��Č��4��Š��v��Ą��ź��…��Ś����˝��’��ż��‘��ľ��ˇ��Á��‡��‡��|��=��Z��r����˝��Ż��›��Ž��´��¬��‡��ą��Ş��—��Ł��‘����ń��ę��đ��ď��ď��%��2��,��_��‘��ş��Ď��Á��ć��Ď��Î��Ă��ż��Đ��ź��f���� ��A��‰��­��Â��Ú��±��Í��ż��¶��Â��›��¬��°��Ż��ž��e��ť��z��ś��·��’��8��0��C��^��n����l��b��Š��f��„��}��ź��«��s��•��‰����p��ť��Ź��Ş��s��~��_��‘��{��¦��¬��…��ś��´����“��¨��˘��Ť��r��€��˘��‚��{��í��“��<��{��p��o��ş��ś��µ��ž��Ą��Ż��¬��§��«��Á��´��z��ť��¬��Ł��Ż��T��z��¨��µ��´��“��Ł��}��{��›��ł��Î��©����ź��Ż��“��{����4��z��Ŕ��ă��N��M��†��„������š��…����—��p��s��‹��´��¨��®��Ş����‘��ˇ��”��±��•��¨��±��}��{�� ����©��‘��|��±��j��V��h��V��U��M��e��`��V��‚��Z����g��w��m��r��T��t��v��[��Ž��†��b��t��x��~��w��s��j��g��K��I��@��F��U��A��H��K��N��c��l��T��l��p��c��i��l��o��l��b��h����€��l��r��k��Ź������‡��„��x��f��a��|����y��€��v��`��‚��j��j��z��Z��’��Z��l��]��u��„���� ��¬��Ž��Ź��‘��”��X��y����w��w��ť��™����’��Ś��‰��€��Ž��{��n��Ş����ś����ž��p��„��}��Ź����o��W��i��{��„��U��\��N��&��N��K��5��>��&��M��L��[��:��K����5��+�� ������ �� ��˙��ń��ţ����ű��ţ������ú��������ň��î��é��á��í��ă��ý��í��ű������ ��ţ��ë����ę��đ��đ��ö��^��h��Š��w��u��‹��n��Q��<��V��h��\��i��Y��h��|��…��‡��Ą����}��v��u��_��k��t��c��Z��q��h��j��v��y�� ��~��Ź��”��Ś��™��Ž��Ź��…��‹��”��†��Ś��«������ ��»��Ż��™��Ş��›��©��Ť��—��v��~��z����‹��z����a��±��ö��˝��¸��—��Ą��Š��•��L��H��c��}��•��«��˘��Ą��Ä��í��§��Ş��Ž��Ł��‰��“��|��ź��’��é��ż��–��‡��ˇ��Ľ��ě��Ď��Ű��Ĺ��µ��x��Ť��Ď��Ę��Ü��“��µ��Ô��ď��H��ş��ž��Ą��©��ď����ü����2�� ��������0��1��,������'��6��Ť��E��>��R��o��ź��›��™������l��_��Q��z��n��•��°��§��’��¨��–��[��{��i��Ź��©��ć��ă��Ů��ë��‡��Ą��ą��Ž��·��Ć��Ö����ô��w��Ľ��\��t��r��e��\��z��‚��•��}��t��W��J��°��µ��Ł��™��Ś��¦��ł��[��F��c��t��Ą��™��Ä��Ţ��ç������1��˛��ľ��Đ��´��Ŕ��Ď��Ń��Í����Ú��Ź��Ś��†��Î��Ŕ��Ä��Á��ż��Ą��‡��ť��Ę��¨��Ž��Č��¶��č��č��†����`��]��`��Ž��¦��Ú��Ř����ę��Ý����—��°��Č��ż��ť��µ��°��Ĺ��R��I��`����ś��–��˝��¶��Ć��—��Ó��ź����§��®��˛��°����.��ű��Ö��[��|��‘��Ś��ˇ��¶��˝��Ř��ĺ��Ł����›��É��Ç��Ż��Ň��«����ě��Ú��‘��•��Č��´��¸��ż��Ń��ú�����ö��…��‘��Ż��‚��—��Ż��©��đ��+��3��F��z��Í��Ě�� ����(��D��=��*����?��,����/����ü����G��ű��u��x��”��Â��ç��ď���� ��ŕ��Ě��˘��¦��Í���� ����Ő��đ����’����Ü��Ü��Ń��ă��ó����.��.��M��L��ů��&��÷����â����1��ę��ă��Ţ��Ň��Ř����I��G��G��W��u��t��r��;����!������8��&��>��Y����n��™��Í��ö��%��<��]��ú��"��ř��”����‡��Ł��î��Ű��Ä��×��ü��÷��Ś��–��É��Í��ľ��ż��é��Ů��Ü��î��•��Ą��ş��Ú��ę��ç������đ��‚��X��Ť��ş��Ő��ň��ý��Ű��ö��)����ę������ű��ý�� ����*��/��1��`��)��]��e��ź��Ä��¸��Ě��ľ��¨��›��°��î��Ý��ű��˙��'��F��a��}��í��B��¦��Ţ��â��˙��˙��������ĺ��&��ú��ć������2��)��*��T��˘��Š��Ź��¬��î��ň��ů������ů��ĺ��Ţ��»��Ý��î��ö��ŕ��Ë������ž��\��š����˛��Ë��Ş��ě��ä��ů�� ��Ć��·��†��†��ą��Ă��ß��Ä��Ň������}��µ��Á��ĺ��Ň��á��Ě��ü��ď��˛��Ń��{����Â��Ý��Ö��Č��â��1������t��x��­��Ç��Ă��ń��#����«��”��š��®��Â��Ć����ë����ś��8��ü����?��E��-����:��C��K������ú��Ö��Ö��ţ��ý��÷������ő��[��q��…��¤��¶��x��Ź��y��T��Z��j��`��[��_��r����P��a��z��U��1��6��P��s����x����’��p��~��L��u��<��>��D��[��]��u��d��Ä��Ö��ű��/��…��«��¶��Í��¤��Ö��“��ś��“��‰��~��…�� ��š��Ä��Č��^��@��U��v��|��Ś��ł��»��†��©��p��x��r��a��n��Z��1��Z����d��-��Ă��Ý��ß��ä����ú��ů������ü��ö��ć��+����ň������ů��ň�� ��ý��ę����ď����ë��î��ď��â��Ü��ß��é��Ü��ţ���� ��'����ř���� ��Ú��Ö��Ů��ů��ď�������� �� ��đ��ń������%���� ������&��Ö��Ě��đ����ň����4��5�������� ��%����é��č��ä��ó�� ��)��ď����5��]��A��h��k��l����\��K��c��l��u��†��s��r��j��}����ç��â��ĺ��Ň��ä��ŕ��Ň��ß��Ö��č��Đ��ß������ö��ű���� ����4��Ŕ��ľ��Ö��ä��Ţ����9��7��<�� �� ��G��z��;��Y��o��|��t��Ĺ��v���� ��%��.��@��N��3��M��Q��3���� �� ����B��S��8��B��f����°��%��/��6��5��P��T��j��z��˝��»��f��T��v��n��e��v��{��o��m��V��»��ú������J��T��K��p��f��c����=��L��e��^��h��c��Z��Ś��‚��ú������5��T��w��~��¤��¸��°��'��"��E��K��c��J��Z��e��’��×��#��/��>��9��0��4��8��L��i��ś��/��2��g��c��w��«��®��ż��Ň��ę��ů��ý������%��0��N��Z��’��–��D��G��b��r��W��^��d����j��Â��.��+��B��I��\��x����§��z��‹��W��H��I��"��1��X��X��­��ő����~��"��M��c��z��¤��ˇ��Ö��Ű��×��­��Ó��Ö��Ć��ˇ��¨��Ŕ��É��Ę��¶��&��)�� ��D��R��w��”�� ��p��`��J��A��f��‘��Ĺ��ě��S��g��S��‚����G��a����¨��ź���� ��ˇ��ŕ��Ć��V��f��[��ť��‚�� ��Ć��Ľ��Ë��ě��…��§��š��Ż��Ő��Í��Ó��đ����á��©��Č��Ć��Ô��ż��ć��Ţ��ŕ��ő��ľ�� ��/��\��ˇ��´��Ő��Ń��Ö������¶��›��Ł��¬��Ö��đ��×��Ő��ĺ��˙��e��–��Ő��ĺ��%��%��#����*��ú��Ć��ă��±��ż��Ů��ä��Ľ��ë��÷��$��Ô��_��v����Ô��ł��Ŕ��’��«��Â��°��¤��¸��ś��¤��§��¤��Ű��Ő��V��������0��e��n��|��€��ľ��Č��ť��˛��´��Ľ��•��Ô��‚��Ć��ú��ď��ţ����Y��ť��±��­��˙��ţ��î����ź��Ŕ��������´��Ř��Ş��Ů��ü����ý��v��Ď��Ë��˝��Ă��ę��ü��ö����Ţ��Ĺ��Ü��Đ��ů����Ý����á��÷��˛��;��j����ž��Ż��§��Ý��ű��ó��ă��Á��›��ž����„��ë��Ë��ń��®��Í��ˇ��Ž��±��Î��ö��ű��ü��Ę����ç��ç��Ü��Á��Ź��‰��Ö����Ń������ý��U��N��x��‡��§��§��Č��Ú��ň��»��Ä��»��°��ô��ě��ń������ü��w��ş��Ń��Ď��ő����ţ��(��8������ű��î��Ú��É��·��Ű��Ď��˛��˝��W��µ��•��•�� ��®��©��Ľ��Ö��ď��Č��Í��–��Ć��‰��w��Ţ��·�� ��®��Ą��z��­��Ą��‘��Ň��ą��˛��ö��é��Ď��‹��Ş��Ö��ß��ą��ä��ô��â��ó��j������b��¤��¸��ů����ă�����Ĺ��ó��×��Ń��®��©��ĺ��Ó������ ��Z��“��˝��ę��!��ů������ ��ô��Î����Ö��ô��ń��Č��§��Â��í�� ��V��������#��"��-��&��7��5��<��)��;��F��:��E��F��;��J��N��N��F��_��!��[��^��C��Z��s��n��T��A��E��Ś��m��C��i��a��„��…��:����4��\��Ž��ť��µ��±��ą��Ű��ľ��f��^��;��w����¸��Ë��Í��ň�����–��ˇ��Ľ��Ô��˝��Ľ��Í��ä��ç��Ń��…��ś��ł��¤��Ë������(�� ��B��<������Ľ��Ţ��ę��ű�� ����������ü��đ��ü���� ���������L��9��:��h����j��Ž��„��ź��Ř����Ö��á��ĺ��Î��ä��đ��Ý��ů��Á��0��9��P��—��§���� ����ú��ú��Ľ��˙�� ��Í��ő��5����0��-��X��®��l�� ��­��–��ň��ę��ţ�� ��đ��Ů��ľ��É��ľ��ç��ľ��Ę��č��ą��Ç��ş��¶�� ������/��(����5��:��+��˛��˘��Ž����Ż��Ë��¬��ą��¸��ë��ř��ď����ú����ü�� ��đ�� ��±��´��ď��ă��Ŕ��É��ö����í��������$��Ä��Ü�������ü��-����&��´��ş��Ň��Ň��ű��ď���� ��ú����"��0��S��w�� �� ��ě��ü��é��ű��ą��§��Ą��Ł��¬��Ă��Î��Ę��Ô��´��w��\��y��y��Ť��›��h��•����p��q����f��©��†��™��ż�� ��Â��Ú��[��y��”��Ť��Ä��´��±��Ď��Á�� ��«��—��‹��„��Ź��r��z��b��Ż����ˇ��ĺ��*��]��g��Ĺ��°��ľ��˝��˛��g��”��i��„��n��ź��ś��Ą��É�� ����Ż��ˇ��˘��Ó��Ç��ŕ��ď��ä��É��°��§��Ľ��¸��~��¦��Ť��e��¦��§��ś��®����$��+��.��7����(����*��:����ç��Ř��ö��â��Ţ��Ă��Î����5��2��3��*��+��%����/����*������Ă��Ś��ť��’��‰��˘��Ó��đ��˙��Ű��,������ü��ů�����������Ü��Ą��‰��…��¦��©��—��Ý��ĺ��������$����ö������ ������ ����„��Ś��™��•����¬��Ó��í����'��.������������ ��'������Š����‚��š��¦��ě�� �� ���� ��+��������'����#���� ��5��±��‰��y����˘��Ä��č����(��3��.��3��)����(��"����1����#��‘��D��L��o��8��\��«��ď��&��$��)��$������˙��ý������ţ����Ü��Ž��ť��Ł��ą��”��°�� ����F��B��>��B��(����%����%��&����˙��‹��›��—��~��•��y����E��Q��;��=��/��7��/��D��;��B��A����ý��z��Q��ť��™��…��Ň��ţ��\����6��"����'����)��"����;������y��’��z����Ł��Ú��ő��.���� ������ ��$����"��%��A��ň��ú��[��J��m��{����Ţ��č����������������������1��÷�� ��Í��1��n��o��|��Ő��ý�� ��������÷����ó�� ����˙����˙��ő��Ř��D��U��p��e��«��»���� ������ú����ó����������������9��4��0��F��(��Â�� ����÷��ú��÷��ô��ě��ń�����ř��ü��ý��ü��é��W��H��\��e��X��J��H��^��q��X��L��R��T��d��a��]��U��G��[��^��F��V��l��J��b��Z��b��Z��^��T��l��P��d��M��^��g��_��q��T��[��\��U��X��O���p�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¸stco������*��Đ���Ó¶�Ć�=î�u€�˛?�î˝�+É�hX�Ą§�âF�›�\z�™�ŇŞ� }�A!�u®�«î�Ý �m�Q>�Źň�Č�üm�1•�e!�—�Ë�ţÔ�2„�jZ�ˇš�ŕ%�ć�[›�—f�Ň«� d� L[� Šţ� ÉÔ� ă� DĆ� ~ř� »€� řr� 9x� kz� –Š� Ă � ó�� )U� W2� …ř� ´c� ĺ?� W� G§� x8� ¨Ó� Ů� ľ�@ß�x@�®˝�ĺG�d�Uś�‹Ç�Ĺ^�ü†�5�j•�ŁN�ŰE�©�I�…!�°µ�Ţ�e�Kr�‡“�Ľ�÷�2;�m8�¦ě�âv�I�]�š_�Ú�@�Rµ�‰�˝|�ń/�#“�Qá�{%�­\�âĆ�g�HN�{�°Â�äÁ�ż�Ký�€H�´­�ć’�ç�K&�Ь�Ä|�%�;Ą�vŃ�°w�ě�&ô�d7�śd�ŇŠ�‘�9t�ny�ś±�Ď-��\�4†�k� S�ŃY�d�<Ś�r„�ŁV�Ů9� ô�@¦�s0�˘:�ÔÔ� Ţ� =™� r� ¤8� Ü(�!1�!R€�!Śc�!ĹĘ�!˙­�";9�"vć�"Ż•�"ę”�#Ę�#[´�#“Ę�#Ń�$ Ď�$Fý�$|�$ľË�$ű-�%;t�%w�%®Š�%âž�&É�&J§�&z]�&®Ă�&č)�'Â�'?�'qź�'Ą[�'Űń�(˙�(H�(zł�(±j�(ĺ3�)U�)K˝�)}H�)Ż�)ĺA�*N�*P)�*‡Ý�*ľő�*ó�+)"�+]Ź�+’E�+ÇŠ�+ýö�,1n�,c¶�,–m�,Ć<�,ü•�-3�-g\�-š �-Îź�.:�.<�.o�.¤[�.Řă�/Ä�/B�/uŘ�/©�/ŮÂ�0„�0Qu�0‹>�0Ëg�1z�1B˛�1€ż�1»¬�1úÝ�25E�2qd�2«»�2ć �3ň�3WĹ�3L�3Îů�4 �4GŽ�4€ý�4şÝ�4ďš�5%ł�5Xľ�5Š:�5˝�5ńW�6'�6[Ě�6Ź�6Ĺa�6řA�7'/�7ZD�7Ź �7Ă[�7řď�8-2�8bŁ�8–Ĺ�8Ę5�9�98č�9oČ�9¤c�9Úŕ�:ĺ�:Jű�:}Ü�:˛đ�:ňź�;7é�;{ľ�;Ľ|�;ůˇ�<5>�<rl�<°�<ńo�=1â�=n—�=Ş_�=čü�>„�>Rc�>‡Ě�>–�>űC�?7ř�?nn�?©1�?޲�@·�@M˙�@‡x�@żë�@őm�A-f�Ag?�Až†�A×9�BĽ�BKĂ�Ba�BÂg�BüĆ�C3[�CiĎ�Cˇ?�C߯�Dt�DTX�DŽ�DĘš�Dů„�E&¤�E^5�Eš�E×i�FÓ�FK‘�F„Ú�F°^�FŢô�Gá�GTA�GŤ“�GČ=�HI�HH)�HŚ�HÎŽ�I X�IHĄ�I�IŔ–�I˙[�J7Ł�Jqô�J¦ć�JÖÔ�K (�KBď�Kw¬�K©€�KŢc�Lî�LKp�L|E�L°Â�Lĺä�Mż�MK �M€ú�M´f�Mč´�N�NRu�N†I�N·x�Nę+�O"�OX®�OŚŻ�OŔŐ�Oür�P2Ż�Pd¤�P™Ö�PÓ’�Q g�Q9é�Qp%�Q¦˘�QÝ�RĽ�RM�R7�Rą˙�RďĎ�S* �Se>�S ��SÔě�Tď�TM1�T†l�T˝=�TôŰ�U*ß�Ue¬�Už�UŮS�V«�VN„�V‹J�VÇ9�WS�W:”�Wp�WˇX�WĐÚ�W˙ë�X1�X^_�X‰š�X·‰�Xç~�Yó�YN �Y�Y´l�YčĆ�ZZ�ZG}�Zws�ZŞ˙�ZŰ�[ w�[Ađ�[r°�[Ą#�[Üß�\9�\Qč�\‹”�\É?�]Y�];U�]sC�]­[�]ć«�^�^P �^†�^şG�^đ–�_$^�_ZM�_Źç�_Ć«�_ůđ�`/”�`bm�`”�`Çł�`ű÷�a1�ab‰�aŽ�a·Ľ�aë�b8�bU6�b‹â�bĂ˝�c�µ�c90�cp�c§�cáK�dO�dT0�dŚ�dĹ�e�L�e?I�e|?�e»h�eýh�f9~�fu �fłd�fđ<�g.˝�giĘ�g¤1�gÝ{�h�hV'�h �hĽ+�hń+�i„�iFŇ�iq*�i›°�iĚ �iőĆ�j#Ă�jSK�j†ë�j¶·�jč™�k^�kKę�kˇ�k¶5�kęŠ�l"ş�l\[�lÄ�lŇ‹�m �mC$�m~„�m¸Z�mňî�n,Ś�niÔ�nŁF�nÜŢ�o¦�oTß�oS�o´�oëd�p&�paë�p™µ�p×9�q�qPĽ�qŚ~�qËŮ�rő�r: �rnć�r§�räb�s#š�s_˘�sśŰ�sŮá�tî�tT«�t‘Ú�tĐG�uť�uMĺ�uŠŘ�uÇś�v€�v>w�vtŤ�vĄí�vľ5�vľł�vż1�vżŻ�vŔ-��hudta��Cmeta�������!hdlr��������mdirappl�����������ilst��� trkn���data����������������� disk���data�����������������tmpo���data������������gnre����data������������9©alb���1data�������Complete Singles Collection Vol.1���'©ART���data�������POCKET BISCUITS���S----���mean����com.apple.iTunes���name����Encoding Params���data�������vers���{----���mean����com.apple.iTunes���name����iTunes_CDDB_IDs���<data�������16+ED451F16A28236AB4852B2C837B57231+15272277���˘----���mean����com.apple.iTunes���name����iTunNORM���jdata������� 0000036B 000003B7 0000356D 00003215 000361AB 000361AB 00007FFE 00007BA1 000361D9 000361D9���Ľ----���mean����com.apple.iTunes���name����iTunSMPB���„data������� 00000000 00000840 00000370 0000000000B5B450 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000���©nam���data�������Udo���8©too���0data�������iTunes 9.1.1.12, QuickTime 7.6.6���ź----���mean����com.apple.iTunes���5name����UFIDhttp://www.cddb.com/id3/taginfo1.html���Fdata�������3CD3N77Q212557223V982EEA5EC41A3CF8AF48C52AFD66BC57D2P2���©day���data�������2004���chpl������������NŔUdo�� ×free�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������uđ§mdat��������������������������������������������������������taglib-1.13.1/tests/data/infloop.mpc����������������������������������������������������������������0000664�0000000�0000000�00000000662�14447736377�0017313�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MPCKSČČČČČČČČČČČČČČČČČČČČČČČČČČČČČČČŇČČČČČČČpcsč�������Genre�Ballad����Trask��ArkistČČČČČČČČČČČČČČpcsč�������Genre�Ballad����Trask��ArtGenre�Ballad����Trask��ArkistČČČČČČČČČČČČČČpcsč�������Genre�Ballad����Trask��Artist�just for test�������Genre�Ballad)�������Title�mpcsč�������Gen1�������Year�2000APETAGEXĐ€ist�just for test�������Genre�Ballad)�������Title�mpc˙�������Gen1�������Year�2000APETAGEXĐ€˙˙˙���������€�������������������������������������������������������������������������������������taglib-1.13.1/tests/data/infloop.wav����������������������������������������������������������������0000664�0000000�0000000�00000033700�14447736377�0017330�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFFŁ7��WAVEfmt �����+��+����data7��€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€„„|xtx|„†‰Ž””–”Ž‹†€{pkiiknqnk{¶Ăąžpp”“dVNC>@@HlˇŃé޶plp|pVLNKIIHPv¬Öéŕ´€fafptfPLQQTXT\´Öćܰ€ihlv{kTPVX\aalľŢéܱklq|€qYTXY\acn‘Áŕëܰ€iip|€pYPTTX^`l‘ŔŢéŮ®{adnx€pXPPPS[^iŔáë۬{`akx|pXNPPSY^lĂäîޱ~cdp{€s\QSTX^an“Äčńŕł~aaly€qYNPPS[`lĂčóá´€`ap|s[LKNPV\kÄëôáł|\^l{€t[KIKNS\kŽĂéóŕ±{[[k{y`PLNNSYf‹ľäđޱ{YVdt€x`NKKKNS`¶ŢěܱyVSaq~xaPNPNQTa€±ÜëÜł|XTaq~xaPNPPPV`€®Űě޸\Xfx|fQNPPSXa~®Ůéܶ€[Tdt€|fQLLNPV`|¬Řéܶ€YQat€nXNNLPT`~¬Űî㾆\Scx††q^SPPPT`|¬ŰńéÄŽcVdy‰‹{d[YVTXa|©ŰóěÉ‘dVat„†vaXTQPS\tˇÓěëÉ”hVat„t`SQPPQYpśĚéćČ”fT`st^QPPPQ\qśĚëčČ–hV`v†‰{cTPPNQ\sžĚěîĚ›kV`v‰Ž€hTPLINXp›ĚěěĐžlS\q†ŽlYPLHISk”ČëěĐžlPXn€‰€kXPKFHPfĂëîÖ¦sTYn€‰n[QNIIPdŚľćîŘ©vYYl€†€n[QPLKSf‹Ľăěجy\[p‹p[QPLLSh‹»ăîŰ®~`^pŚ„pYPLIKQf‰»áîŰ®€^\p„Žs\PLHHQd¸ŕěŮ®{XSh~‹„q[LD@@I^łÜěŮ®{TNay†t^LD@<CX|®ÜěÜł~TL^t„ycSKC@F[|®Üóćľ^P`v‹~iYPKDHYy«ŰóëÄdT`t„‰|iYPLFIXv¤ÖńéĆ“hT`s|hYSLHKXs ĐëćÄ“fT\q„ydVPLHLYvˇĐěëÉ™p[cxŚ€iYPLKP\xˇĐěëË›p[cx‰ŽlXPKHN[v ÎěéË›nX`x‹‘†pYLFCHVsžĚěëĚ›kT[q††pXIA@CSpśĚěěĐžnSXp†‘‹t^ND@CPlÉëěĐžlPQh€Žs^ND@@Nf‘ĂéěÓ¤qQPc{‰†t^ND@@KcŚľäîŘ©vSPay††t`QICCPdŚĽăđܰyQPl”ŽxaVPLKSf¶ÜěÜ´„fct‹‘€i[SPPXk“ĚóüîĂl^`fy€sP1$.@PhŽĆ˙˙˙ÓP89FQVN<1(,Ahڦ»ČĂ«€K#1Pp„‹‹yaH38Q|©¶¨Žn`p–ÄáÓ¦i;139<>Vľëöčቈ|~pX;! 1Nx©č˙˙˙؆PH\qviYIDP`|›¬´»ĂŃб~D+>f©®¬ŁŽpK8Hn›ĽŔłt`a»Ü٬i9)),+,K€»éřîÖ±Žshp€y^1.XŽÔ˙˙˙Î|H;H^da\PFIXv‘śś›¬ÉÓą€<(P€ˇł»¬‹\03[‰«¸¸¤id†ĽÜÓˇa90,(9n®č˙˙ôŔ^Qi€~a41SĐ˙˙˙Ó‹[CDPV`c[V[n‰“Ś~~ ĚŢÉŚI)1T©ÁȤ`�F|›ˇ©®¦‰tyŁŕůŢ‘9 .<D^{ˇĐó˙üÄy<.Ns€pS,K~Ů˙˙˙Át;#.Id~~dLC\‹¬©žŽŚ‹†xdcvމ»Ŕ ‰ž¨hKP8 0l¦¨śxDDVu‚‡‰i07DWŇőÔÂďŕŹ€”§¨Ź~[Nd[e¨ žÁÇĽ®¨¦‚bJJdgfmkfM<2!I‚Y)ao\i˛řÓÂ×»’szvx^9Tw†„śÎŢ—Ź‚~Ť~lK2?c|—¦„O4;KPXN;TW4jľÓ¶®âĘ€‡­Ľˇ{mgmeşÖĽŽ†|b\uŁźr]cnfhʤŹf?5# /T.V§µ˘Łî˙ČąŻĄťŤŽ{moNLtś±˛ĚÎťnf€‹‚vrxjRSbniXO7@: DŹ›‘˛öâÄĺđŕľ­¦{kX7KsŹ“¸Ä´˘ ŻŁ“…pR+'E^e_TL5:4OźŞ‡w¬´Ž§ŰýýćĐšjUEWt|kYuŤ†”Çěܸť~`MGG<2�,W]u¶ż‰_{®°°ÂĘľś†Š™łłˇ“|cP\|†~„“•™ĄŻ©ŹiB+�'72M|ŹŚ˘×íÝŃËľ°™‚nmqnt‚†{~–Ł—±¸˘€aKFNRJJH7,;=5GZS8@dq‚ĄÓńűôŇ ~seWM@35aśĹŕó踉mZMC9�"<B_ś“zlj«ÎŰÚĘ­—™˘¬µ°–jV`€¤˛«Źzuurpxu_HAH</3<=:Jbx’·Üý˙˙Ú¨ž¨˘f[_m‡¦Óő÷Ćf]^PD8%"5RX]q„p[F;Ig“®ÉŃżµÂŮŢČ©‚qyž¤źŹ~…އ‚xhVKSZQ2 ':APhŠĄąĹÄ´˘ ź–……ž¶ÄÖń˙ýŘ­Ž|pW. @cqp]H;41.3:BKWsśĆÚâńů輕‹©ÇŰ׾›wŹ–sL%/1!�1GM]y“˘¬żĚÉşŞ™“‘¨±Ĺâ˙˙ţŐ™iPB5!"/DZ^PJGC95ATh¦Ěăéâáá׺—‡„™®¶ą°›uwzp\>�5C?/+:Uo„”¦ąŔŔÎÔ˶§¨ž’ڇ‰‘ şÔŃ©q:! �� (:a†Śyv{…†Ž¤´ĹŢěëŢÔĎĹŁuREKb~”™|P)-414BZr‰’Ś‹Ł˝ÉÄ˝µµµ¸ÍŐŇ˝ Ź{fI44@Yq„],� !6EVds‹«ĎäßŃËËĆ´ˇš ŞąĐŕŮ˝™w_?�#=]jaQPXZ\cw—łŃçďćŃżÁËŃɸ§š–“› ‘l>$ ���3[‚•‹{u{…ŽŁżÜö˙˙îĐ˛Ş««Łna\`gfTA2(! ��)Y“ÉâŘÁ±Ż˛±°·ĂĐŮŘÍ˝źw‡wO,+G[ZKCDD?5?Z€®Ůú˙đ̰§©¨ ˘§¬ŻŻ«“i<(+- 5bŽ’–ŁĄuek‡±ä˙˙ţĚźymjmspnfN+ IbcR=6Cc—ÇÝŢĎľ±˘‘Ź©ÁŮčĺĘ™sc[K0! ,:JZbS>2=Xoy|€‹™°ŃóţđÝĐĹ®Śsp{Žť©§ŹlG41+ ;Up~wzްÄŔ´®µżĎäňčɱĄžŚkL:8<LbrlJ+%-622>PkڞŐÝĐş­°·´Ş˛şĹĹĹ˝ŞŤqmpgD���Cm‚|cVX[_g|™µČ×ăâŃżą˝Ŕ˛ť‰{‡„kK3.(�� $Cg‹śŹŽ™›’’ˇ¸ÉÚäßÇ©—›śŠmXOPT_puhO@93! %Jr Ŕ˨›ˇŻ¶ŞŁ§˛ąşşŻ™zhmy{lWHAACO]_WS_lbF16PyŻć˙˙ܲť“‚ts…—¤°´Ż•lSR^aWRV[]bnulWPa~Ť‹„~yy‰§ÄŃČ´© Źxd^_hv‹›™†ofe^XTXaem“—|„‚sdbn–¶ŇŮɬ”WG1.A^~ť´±‘jUUVV\lŽ–Ł«Ą“x{zk_do‘¨ąą¤yqgUHN\n‚•ťš‡oglrqloz†‘ť¨¨–w{veSP\s‡ž´¶ť{ife`SLO\qڍł«——•†oa`h}–°şŞŽzrn]IAI_xšąĆ±€}veWT\j~™Ş¦’„‚‚vbSWfv”˛ąź|dYTMEM`x”łĎŐ˝—ufaa\Yco—Ş®ž~b]dihfjlox›žŹ€|s`V\j|šşĎÉĄnbWLJWn†śł˝­hW[ahoy†‰‹”™’{ihoqljq€Š—¬ş¶›zknne^ajt‘ ś…mepvwx{~~Ž‘uu|wjmpy„”¦¨–‚‰Š‚rpolo|Ź’”z`n€t]f}‚Śśźś†tmg`Wcv|€¦ĘĹžzvt]EBUjxť®Ł‚dZcebap‚‰“Ł±ŞŽtjhg^[k”˘­·¬ŚpfehffqŽŹ’šŠgPVr†z~†††“¤¦š€twvlZT[dp†®·¤”•—†gJEKTc€ ®˘ŹŤŹŠv\NOVe‰¬˝łˇ‘‚pS?6?Mg‘±Á¸Ą–چnVFG]uލ»«‘‚~‚tdYZdo„ś«ť…tjg`[]hyŤ¤±©”wimqjhkr¦´˛™w_Veph]e•źŞ´®’sisp]MPe€—Şş´—yyfF<McsЍşŻ•‚€{_GIYm„𮍋vpz~ocg~†Ť—šˇ…io}yhZ]y‹«ŞŁ“risl`TCRt•±¸·¬…zq]POYh ´­šŹ’’}^GAM_w’¦©›…‰„sb\`l~Ť™–…}v|„xlhpx~Š”‘‡‚†Ž’‰ynho}Ť•Ť„vs}‚~sozŤ‘‘Šwtx…™“}jihq„„€Ź—‰ymimoosvnfq•ticeklfborĄ˛ą«Ł•Ї‡…z}†Ś…{ljwuf[UL=BVex†‰µŐŃĘ»žŠŤ“ŤŚ…„“›”Ž‚o^YL0/":\{“•śąą§ ‰‚Ť™«Ş«±ŁťťśŁťrZI?-&*)*9Yh‚“‘ś§´¬–Ť{{›ˇŁ®®©ˇ©©ś”_JFHLB66;;B[r—ťš˘š–‰}‚ś˝ÍĚÄ·´¬žŹ{nnmg_T:((8[vy––š”Š‚{€Ť™¨ĄµÉÂǬ –Ž…ws^SV5,?A;BXftĄ ť‘„’›ťŁŁŁş¶ĄĄ•“™–|eOCI7))(R}ť¨Ż©Ś|sghxŤ–™Ł«®ÉÔąŻ¦•“†iPLE5%"!7hެł¨˘ťĄ™~mRRf{•Ş­Äá×ÍŰž—‹oM=5*Gt–¦¦ž–‘Šwhlt‘­ą¶©• ¦ź¤ź‘Ź™ŽqTK>-925c}‹’vq}tksy‹˘´±¬°łĆȨ–Ť„Ž…hIJI44' Pyˇ´­“„sxpw•§Ż¦”¤ÉÔŃŮÇ®Ł‰dC47!!]|ž‘~Š€€||“ ¨¨™“—·Ě¸°˘†žŤpJ9&.')e‹˘¸¨•€rta]e`zٰżÁ·ąĆÖĆ®ž|ci^C0$($1=,<e€ťŻ§—„…Š}€zp‚–ˇŞŞŁ¤¸Çşľş˘ś”x^B9"  Ov‹˘›Š———‹ťŁŁťŽ‡“´˝µ´ťŤŠ}gN6 0b}¨¨˘’‡{hgmq†ťŻ»˝ľşÄÓÇ»ŻŚum[N>94$$">j…ˇ¦™Ś€„|xn`er¤ąÇŃŮŰ×ÉŻŹwfZQI?*6b…šˇ›††ŤŚzvz’•––›¦´»żĽ°Ş ’„oV="+B\z“ź •’“’–†€…ŹŁ©¨Ą˘˘¦§¤”†ypbM5(@[w„‡†ŠŹŽŚ€uqs}Š”ťŞľÓâŢ̲kXKA2$3H_q|‰–ť˘ ˇ¤§¨Ł™Ž†„…Ś•ś ¤¨°ł´¬—gO@0#)=LRTXf|‘¨¸ľŔą·¸¸ą±Ą ŽŤŤŠ†…‰ŚkR:(#*6FNSYdw‰“•’’™Ą°ł°«®´¸ą˛© •Š{kaVH<:=@FGGKLU`gq}Ś›˘ Ť—ٱ˝Äżµłł°¦–…uk`P?+(<LZXNKG@awźŁ§Şµ»ş´Ż­Żł˛¬Ąš–”Ťn[F0)3Jj†›˘Ą§«ł¶¸¶°Ż¬¨˘ŠŠŚˇ –Ť†ydL;222-)%+>Yv‹–šśž¤­»ÎŘŰŮŮÚŐÇ®•ujaT@3($+2<DDFHNdx•ž°ÇŐÜŇŔ¶±Ż°­Łť“…zm^O9.'&*+2AQ`iny”™”Ї‹™«şÇĘÄ·§›–ž¨«¤ś•Ź_>!%/8<CPc{Ťšť›™ť¤§¤˘§»ÔâÜÇŻ›‹{m_TB,)7BI[qśĄ­µĽżşłŞĄź”Ź‘“–ž¬ĽÁşĄŚt]I;$(325=Ngy‹›Ą´˝ĹÎĐÍÇÄÁ»±¦šŽ‚~}…{eI1)7DVn›žž™™§´ŔÄşł´ĽÁş¤•Śxj[ND>8>JMMNNNNR`n}Ź™¤¬§źš™—”ˇ·ĚÓÍľ¸şľ±źŠubM/��%E]eltz}€Ś—źŞł¸¶©ź ¤©Żł¸»ş°ˇ“…rY;����&N§»ŔĽ·´°¬˘ťť ¨±¬ˇ–™ś¤©¬¦—dL;#.CYtʞŇÝŢŐż¬ťš¤©¬­¬ł˛ž†sjhhg[J=+"+28BQdloz„Ťš¦»ÔçíŕĎÁŻ —”–š—„q\E,!0=<=HYltx‚Š“—–”•ź©żÖáçŐĂ´Ąź™Ź…|raJ/��'Bcw‹š®ľŔľ´¤›’ŤŤ™ĄłÄŐÚĎĽ gTE/  (:XrʰĆÓŃËĐŃÍĂ˛Ł™�@uu€Ś™¤Ż˛¨‘nC' $2=DDM_vڍŔŇÖÎĆŔČŇÓËş§—Š~smnx…‹|kT1 /KXi“śšť¬¶ÄÍËĂ»¶°®±´°¤‘|jXOE9<FHMOI<26CQcxŤŁ˛ąş±Ş¤ ©´ĂÇľ±¤žˇźšŹ{gM0" 2Ndv|xw‘ť§®®˛´°«¤¤Ą¨ąĂÁ·¨žŽ†qZ7 �����?]|’ź¤žšž˘©«±ąÁĆľµµ±©©°ŔÁ¬–|cVH4# ���3W‚¨ÄßîęÝËĂČËÇŔ»Ľ¸Ş„ukbcbSA- !/8HNKQe{”®Îěý˙˙öŕȰž—ʉ}xuj[PB616<:1&!$;Ver€Ž’Ť’ꍭąĚăňřđŐ¸ś†xrqkeddZE3&#/>LTWUWj†ž©Ş¨Ąť–••–ť­ŔÔÚŃż¬†yuvm]OB8/(#&4L`muvzŠž«°Ż¬©ˇśť”“¤µĹƶž‡taQF9/-,,(##(5Mj‚”ś Ł®ŔŃÖĐĆĽ°©¤›— Ż˝ĂĽŞ‰fF, "$+;WwłÁÁąµµÁÎŐ×ĎĆ·© ™‘††Ź›ť‘xZ=& (-5@N[emy‹ź˛ÇŐ×ÎÄżÁĂ˝Ż ”‰}sdYPNWfuynZB/(*8HVdn{„‰Ź˘¶ËÜćáÓµł··Żˇ‘€qcR>.',=OTI9)$+>ZsŽ’— Ą¨®»ĐäóřđÜǸł±¬žŠmQ6 ���"C[d_XV]k‚™©´şÂĘÎĐÎĎŇŘŢŘÍąź‡ytjW@% ����� &KrŹť™”“›¬ÁŮääÝ×ĐŸ®§¨Żµ´ĄŚnO90) �� ,Cb†°ĎŰŰÎĂżĆÔŕâŘÇ·­˘š‹…zhN2%" +9L^q‹ŻÚő˙˙ďÚÎËČÄÂą©•…xof`\[ZP>(!-8AKUdo€‘¤şŇď˙˙ôŮ˝§ś ¤Ł†uk`TD50-.0,)*Bb}𠍮łĽÍč˙˙úŕĹ°ź—‘‰zaL8)!#.>NTQLINc|Ž›ťˇ¦­¶żĹĎÚćíěßæ‰|{~{kR;( $6FUahq~•±ČŐŃĹ·Ż­°ł°¬łĆŘáÚČ­Źu\K<$ ����&Ce†ť¨ŁťźŞżÎŇŃÇ˝·´ąş»¸µ·şľ˛—wV>.% 4Kk‹¤µşµ˛·ÉáîęŰČą­¤ť•—¦´·Ş“sS:'���7LlŹŻĆÎĘľ¸ĽĹËÍĚĆŔ¸µµ´°¨ˇ Ą¦ť~S0!$!&9Um†ť±ŔĂŔ»żŃăëĺŇş¬¤ˇ›•‘‘”śˇš†fE&  3Ka|šşÍŃËż·µşĹĎĎÄąŻ«®°® †„w^A& *.+,*,7DTbp›łĂĚÇżÁÉŘßÜĎĽ­¤›“Ť‰‡Ś’•Śy\9"" .Jas‡ś˛ÁČĘĆľ»ĽÁÉÎËČĆĆĆ˝±ž‹€}{mU5 ')$7Oap‚”©żĚŃÔÚăççŕŃĂ»¶°¦›‘†‚…qT4 �� ;Vn­˝ČĎĐÍČĘĐ×ÚÚÖĎÎÍƶˇŚ}spfU=& &%*?O]o‡ŁąĚŮÝáäĺćâÚŐĐĘÂĽ±¦ť–‘“ŤcB(���&?Vjy‹š§´ĽľŔÂËÖÜŰŘŮßŕŘČ´¤—Ź‹ygQ@643/% (3D_|–¦˛¸ľĂÇĚÎÍĘĆÄĆÇ»±Ş¬°ł§Źr[NGB8&  %3=DO^n}„Ś“›Ş»ÍŇÔŮŢăÝÔĆ·®§¦¦¤ś‹|roofU: *@Xm{…ŠŹ”ť«·˝˝ĆĐŘßÝ×ŃËÉĹĽŻźŹ„|uhXG6+# '6EOPS]l€—޸ĆŃÚŕâÝŃĸ´˛®©ˇššˇ˘›bF4*&  #7FLKEBKYl{†“ĄľŮěóńěçĺŢÓÄ˛Łž›žś€k\WZ^SA*%05+#7Nh}ŽˇŻľĚŐŘÔĐŇÖŘÔĘĂÄĆĆ»¤†lZTSPI@934;CB9& '6Gc„¤ÁÖŕçíóöđĺÖÇľľŔÂĽ«–‚}‚vcN><?@6$� #)1=Ng‚™Ą§«·Íáěđîđöůôäε ‘‡~yrqswyt^>������0Mdt€Š”ˇ­·żÂĚ×âëîëŕÔĎĐĘĽ¤Ź‡ŚŹ‡s[D4*& .;AEK\s†—ź¬şĆÓŮÎÁ˛¨¦§¨¨§Ş˛ĽĹÎĘąšy`I;- $@T_adny‡ŽŚ‰‰–Ą®®¤šŁŞ©˘žˇ­ľÍĐľŞ™‰{mX?3.(()&"-@PapŤš ź•“”ʆ~|‹”ś ®ÄŰçÝÉł†‚veZQSV]eYC,*<JQ[m…™Ş©žť™Ś…•ŞşČÎČżŻ¦­§‘umnsqcRG;* $<O]q‹ž¤ź–ŹŤ‘…Ť˘şĘÉ»­Ş¬«§š•ť”‰™–†iS?;@, 4Vku‚“  ›‘†‡Ś¤±ş¶Ş˘ ¤¨© ™ś Ş¸Ł…}sh_ULA=>+$('.>Xm„šžž©°şÄŔµ¦›’‘•’¦µÁÉĆłˇ”whkdWKDDELN7%9L^}ŁżŇÚŃŔݦś—•’•ź¬ĽĘÎËż°§śš{b\YWTOF;33' ��>k“®Ŕż°¨¤ťśš™ťĄ°ĽŔÁ¶­®°®§ťŹŽ†{‚pYI@9, �%=Whpw‡› Ł¦Ą§­ł˛¬ŞĄ¦˛»˝Ľş¶Ż¬«¦§¤gjbOA617EKA1 -Oe}—ŞżÎĎĹ´§›žźź¤§­´ŔËĎŲˇ–Ž‚ePU^eiig[E/ Ce§˝Äż·´©Łź“Ź“š«µľż¶µµ°Ş~}‹}†zcSB:62+$,9R]o‹ž®şşłŞ«Ż­ŻŻĄ¤¦¨¦ ˇ Ą®Żł±žŽz_WZTJCDGHNE,"C^p‡Ł¸ĹŇŐĘĽ®ź•“ŹŠŤ›ŻĽÉĚŔ®źŚ|wxrZQ^b_ZQB775$7e‡¦żÇ½Ľ˛ –ŤĄłą·˛Ą¤¨Ą¤ž”ŚŠŠŽŠybYYTQOE<51',23CVn ť˘¬Şł»°Ł“Ť™ ˘«¶˝·ż±›†‚tijha[Z\^^P9&,I^~źĽĎÍ˸ĄŁšŤ‡…Ś—¤«­Şž–‘Ť‰znomnnlmibYKHG6)(9Tv‰•Ş´ľż·°¤§±®´˛¦ž–š˘ˇ©Ą›ś›––ڇ}mh`XPDAAEQVK98Pa~˛ÂÍÍľ®˘śšśťś› «şÄČŔąŻŁšŚ|mbgq|{k]KC?3$ 4_zŠš§¶ľżą«ť•Ź”ž¤¦˘źŁ§©ž•‹„‡•źš„yske^[TMQRTO8)'*@bu„—©´żĘÉżłˇ“‹†…€~† °¶±¦•…xnmeUQWa`[ZRA59>;,$!#<a€”°ËŐŐŇŃŶ®®˛ŔÇÁş˛±°¬ŞĄť’‡‡†|€lSPRSMDD923..)1FUev“Ş»ĘÇÂµŁś™šśśŁ«»ČĚÎƸ®¨©Łť Ś…‚‚}qfWSP?4$ A[guť˘Ą›““ŽŚŽ‰†€Ťšˇ§¦Łž™ś–Ž€optlb]^dkspgcN:<BFYp‚źÂŐŇĎǵ¬°«˘ś–’Źš¦Ş­©ś‘‚uke]`onji[JHJJ?94,1-#%&*G\{ž¸˝şÇĚĆČĹ¶Ş©©Łťźźž©¸ĂÉŔ®ťŚ‚~}td`abdie[PLKIH7! ).Cl€Ťť­şş»´ź–’–ťž‘”—šť—‘ŽŹŤŚŽ‡zmmkirsja`fnooeUL>0-,$-Nm¨ÂČČĹÄął­šŽ—ž¦ŞĄž §Ş°®ˇ–‰€„€‚‹wgkkeZOFDLQOTL7# #(6GN]—Ł««Ą•‘’ŚŤŚ…‚‰śŞ°ł±Ż´·ł¨ť•‹iŤ˘­š”•ŹŤŠ„}plc]aW>'),*F^hzŚ› «·Ş™‘‡}zti^cs~Ť™—“‹…~xn^XX^wxhpqqty‚~vvjjrl[IIR[pŽ˘´ľČŐŕÜɵ¬¦Ą˘—ŚŤ“™žˇť’‰z|ztjaZXgpZRYVSRQI==70;D;048:Oju•±şĂŇÎÁş¸´µ»ş«¦Ż´»ÂĂż¸·´®ŞŁ~rotz…~jmuqof^TNLD<4$ 1LU`t‹¦Ş«§—‘چ†…}w‹–ĄŞ¨¨¨¨¤Ž„„~vt{|Ź“Ť€{|z}{l_ZQDHOJO`k€™¨®­µ¸®¬˘’„‚„‰…}‰Ť”•’‡}{vi`[\huxkeggfikd_^[YYVL?CGMevw…—޸ľĆµł­Ş«©Ąš— ¦­µ°¦ˇžž•”€‚}xpjjnhincTJIMMPK@;:;4250-AYj}Ž–’•ťˇ˘Ą˘źťˇŁžťťž¤°¶µ­©Łˇ¦¨¦ ›“‹‹Ś‡y|ysi^\\YSONJHHG@AP]m€‘”ŽŹ‘•™ ť”ŤŚŹŹ’ŹŤŚ“ššš—~}|voqwyzzthejkjb[VR]cdc[VNLPQRV`i|”¤Ż±´±¬Ż¬ŁźźťŁĄ©§ź źžť›—‹{z|}xwz|wyyjbgmnjd]SU[Y\\VUUXZUR[er…“š› ¤¨¬«§Ł śťť›”’š Łź“‰€‚~|€xsvvxwzsfmkf`WPN[hd_\XYZ]ZQT]gz’›—š ™ťź›——šš™™’’––—’ډ„Љ‰‚}z|yxxyzywvrlhfeebccfh^ZVPQ_iy~€†–žžť–™’‘‘‘šťťś’‹‡„Š…†„~vrnjptqlgdfjnmklpmonjbXQT\`eisz~…‹—Ł¨Ş¬Ş¦Łś•‘‘‘’—–’ŤŽ”—š™•ŤŠ†…}ulhntvvurjeehklopqtoie]VSTZ\]YXds‰’śˇ¨­°¦ťś—ťĄ¨¦˘›•‘—™––™™’‡}wsnmjgcfjmrsrpqrssmdWUY`a`XNHDHOUT^ov†ŽŽŹ‘”•“–’Ť” §Ş«§¤©¬®­©Ł™–”Ť|vsruuvz€‡~umhcc_\XWXZ_^[XZ[[_a_`ir|‘“”™•‘‘—ź ž ź›™–•ŽŚ‰‰‡‚}xyzywuqnruvwurjee`^``bhnppkd^^_]ajr~…Ś•śź¤¤Ą¤˘˘ž‘ŚŽ’”–•”•“ŚŠ‹‹‰ŠŠŠ…~vniggjlpuw€�omnornlifa`_]^]ZYY[[blw{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{bit||wkc\\_bhgc`cjnnkkpy}|{vlkkouy€‡‹’’•šźŞł˛Şś‘ŚŤŽŚŚ‹‡‡Š‹Š‡‡…‡‰†‚xmdejnmjjlqqmLkmox‚…„|rjhkpwxqmnt|€Š”꧍¦ˇš“ŹŤŠŠ‰††‡Š‰Ś‹‹Ť”śź—†xokjfhiiceimmkfehnpqlf]^cgedabdcb_cgjpy~€}yvy‚Š“—•‘’—š›śźĄ«¬Ş¦ś“Ž‹ŽŹŤŠ†‡†„‚~}‚Ś|pd_aelrrqklqrrrru|€xrmoqpprv~„‰Ś‘–ś¨­Ż¨›Ź‹‹Ź•–•ŠŚŽŠ‡‹‹Ž‹…}oa_`dd`^^adc``bckpsnf`ZZ_bhgd]_ada^cl{…ڑچŤŹ““”–—śžźˇ˘Ş˛ł«žŤŤŤ“‘Ť€{{{z{|}‹Ź‡|roqwwrqoqqoomnry€zmc`dn|†„€‚‰ŽŽŹŹ•ťĄ©¦ˇ‹†„†††~~~}}‚‰‹tg_^agjkgb\[ZXXW\bkqph\RQV\_``achjnv|‡—–Ś™źĄ§ˇś“ŹŽ“śĄ«­©ź‡…ŚŹ‹€}}}~~ŤŤ‡zohhkquwslfehkjfir}‡‹Š€wsu|†ŠŚŚŚ’’—›ˇť”†}z}†Ś‹‡€ywurqppu{€}reYWZ`^\XTUWXZ\]dlpph_WU]fpz~{z{}~~€‰—ˇĄŁť”Ž•ťžž›–•”–š›śˇĄ§˘•І‡ŚŚ|wrpmjjow„zqgcksuwqnnptz}Ś‘‰€yuy‚‹“”І†‡…„„…Ś••Ť†~~€†{smkhjjhjmrpi]RMPW_bc`\YZ\]`dks~…†€xqqz‰‹‰†Ś‘””–™›ťť›…‚„Ž–ˇ¤źš•’ŹŠ„„Š‘•‘~uqt{~}xnifhjlpqu{~|rjcfmv‚{wx|€‚†Ť–››”|w|‹ŽŠ…‚‚‡‰ŠŠ‹‰Š…}qhinx…yrlliihhqx~ztjgintwsnffiptw}‚‹‘‘‰|spu|„ŠŚ‰†‚„Ś‘”™źźť—‰€{|‹Ś‰„€~}~|xqg_cky„‡|tmlkjhjq{‡†|vuy}yrmjlqy‡Ž•™™Źxrw‡ŤŤŠ‚‚†ŠŠŚŽŹ“‘Ť€vnmrx~xurqqsvy|€|unow‚Ž’‘}xtwxyz‚‹”š’Ś…‚„‡‚yqnot}†Ž–žŁˇ—Š}uz‚‰Ś‰…~xwz}{yw{€}vkebemqqniedbdgmsw||{rkkp|‡Ť‹‚yqoonmlrx‡‡urqwzytlknqw†Źťť–}uv|‚‡„€€‚„„Ś‹…{vtw€„††{|}~„ŠŹ’”–’‹…€‚Š‘•‘‰„{xwwx{‹“•’Š€yxz~yropuy‡Ž“—”Ś‚wpopuzzyvstsutqo{…ŠŠ…~xwz€…‡|xwy|€‚„†‡†|y{€†‡‚zwvuuvy‡Ž’ʉ€zy}€€{upptz€†ŚŹŹ‹…€yusux}€‚„€{y{€††‚}yw{€‡Š‰{vuw{}€„„€€„„‚€{xvvvvy†Ť‘Ź€zy{€{wsrvz€…‰ŚŠ‡„€|wttw|€€‚„~zx{‚{y{€†Š{wvx{~€€‚‚€‚€€}zxwxy{€…ŚŹŚ…~zz|€€{wvw|†‡„zwvy}€‚„„„‚€|{{}€‚|{}€†‡{wwy{{|€„††„®~€€€~zxxx{}€†‹Ś‰„~{{|}}}{xw{€„‡‡„‚€|wvw{€„‡…‚~{{|}€€‚€}|~…‡„€zxx{|}}€‚…‡‰‡‚}{|€~|||~|z{}|}}}|}‚†‰†€‚„‡‡„~xttxz~€€€€€|{z|||{|€„„~yxwxxxy}‚‡‹ŽŽ|y{{{zyz|€„…‡‡†}||~~€€||‚€~}€‡‡…xxx|~€‚‚€€~||}|~…‡‡„€yxxyxxy|€†ŠŽŽxwx{zxxy|€…†‡†…‚€|zy{|€…€€€|{~…†}yy|€€~}…€||€~„„€|yxyyyz|€„ŠŽŤ‡xwy{zxxxz‡‰†€€€~|{yy|€‚€~|€€~zz}…‡‡„~yxz€€|yy|‚††~}€€€€€€€€€€|yy{{{|„‰ŽŽ‡€ywy||zxxz}‡Š‡€~~|zz}€‚€|yy}†‡†€yxz~€zxx|††€€€€€}||}€‚{z{{{{}‚†‹‹‡|y{|||yy{~†‡†‚€€|z{}€€}}}|zz}…Š‚}zz}}yxy}‚†‡…‚‚‚|zz}€„‚€}}}}{z{€…‰‹‰…€||~~|zxx|€…†…‚€„~{{}€‚‚€~||}}|{}€„‹„~zyz{ywwx}‚†‡…‚€€€€~zxy}€„…„€}|}|zxy|€†Š‹€~~}{xwwz†…‚‚~|z{}|}}}|}‚†‰†€}zzzzyyz}‚…††‚€€€€~{zz}€„††€}|{yxxz…‰‹Š…€}}zxvwz}‚……„‚‚„€{yz}€‚‚€}|}~}|{}€…‰‡‚}xxyzzxy|€…‡†„€}{zy{~‚…†…‚}|yxvx}‚Ś‹‡€}}zxxxy}€„††…„„…€}zz}‚€€€€~}|}€„Љ…{xy{{z{~…‡‡…‚€€€|{z{~‚…‡†€}|{xvx{†‹Ś‰„€}{{zxxy|††„‚‚€}yy{}€„‚€~}|{y{}€…Ї‚|xxyyyz|€‚„†…€}}|zy�€„‡†~{ywvvz€„Љ†}{{zyyy{~‚„…„‚‚‚€|yyz}€„…„€~}{yyz~‡‰„{{}}{{{}€‚„„‚}~€€}{z{„‡†€}{{ywwy|‚‡ŚŚ‚}{{|{yyz}…†…‚€€{yy{€„‡†}||{yy{€„Ї||}|{{{|‚…„€€}{{}…††‚|{zyyy|€…ŠŚ‰„|{|{yyy|€‚……„‚‚‚‚€}{y{~‚††‚}|}{yy{„‡‰„€}|}}{{{{~……‚€€‚‚€·{y{‚††€}||{zy{~ŚŠ„{|}}{yz{~‚…†„€‚‚{yy}‚††„€}}}|yxm}†Š‰…{z|}}{yy|€…†€€€‚{yy{€„†…~}~~{yy{€†‹‹†€{{}}}{z{|€…‡…‚€€€~zy{€…†…~~|zyy|€„‰‹‚}{|~}{yxz~……€}{yy|…†€~~}{yxz~‰‡‚~}}~~|{zz}……€€~{{|……‚€~|zyyyz~‰ŚŠ„~|}~}zxxy}………‚€~|zy|€……€|yxy}…‡‡€~~}|yy{„€€}||„}|{zyz|~‰ŚŠ…|}~|yxxz}………‚€€€€|zy|€…†„€€|ywy|€…‰Š‡€~zxxz€……€€}|}‚„€~}}|zz|‡‹Š†~~|zxyz}€…‡…‚€€€€}zz|€…†…€€~{xwwy~Љ…€€|yuuy~‚„‚€€‚€}{z|€‚‚€~}~~|zy{€……€~~|zyyy|€„[…‚~€€€~{z}€……‚€~{yxyz}†ŠŠ†€€|xuuy}‚‚„„‚€~{zz~‚€~~{z{‚…†…€€~|{zyy{…„€‚€}{|~‰€~}{{yy|€„‡„‚€}ywwy|€„„„€{yy|€€€€€~}~€‚‚€~~|{z{~‚€~€€}||~€‚€}|||{{|…††„€|yxxy{~€‚‚„…†„€|yyz}~€€€€~~~€€‚€~}||~€€€€€}||~€€€~~~~}||~„„„€}{zzz{}€‚‚……„|zy{}€€€~}~€€€€€€~}}~€€~~~€€}|}€€€~~~€€~}}‚„‚€}{{{{{~€……„~{z{}~€€€€~}~€‚€€€~~}~~~}~€‚„…„‚€}}~~}}~€€€€‚‚‚}}}|{|}€€€€‚„…„‚€}{{}~€€€€€€€€~~~€€~}}}}~~~~€€‚„…„‚€}}~~~}}~~€€€€€€‚‚‚€€~~}|{{}€€€€‰„„‚€~}||}}~€€€~}}€€~}|}~~~~€„…€~}}}}}}~€€€€€€€~~}}~~~~€‚€~}}}}}}~€‚‚€~}}€€€€~~~~~~€‚‚€~~}}|||~€‚‚€~€€€€€€~~}~€~€‚‚‚€~~~~}}}€‚‚€~~€€€~~~~}}~€€€€‚‚€€~~}}|}~€‚‚€~~€€€€€€€€€€€~~~~€€€‚‚‚€~~}|||~€€~~€€€€€€€€~|}~€€€‚‚LISTt���INFOICMT�����ICOPď˙˙˙Q Sound�INAM���ű�ISBJ���ý�IENG���UlpŤš ź•“”ʆ~|‹”ś ®ÄŰçÝÉł†‚veZQSV]eYC,*<JQ[-…™Ş©žť™pan�ICRD���05/24/99 ����������������������������������������������������������������taglib-1.13.1/tests/data/infloop.wv�����������������������������������������������������������������0000664�0000000�0000000�00000004636�14447736377�0017175�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������wvpk�h����˙˙˙˙MĽ�h����@ ���wvpk���ú��MĽ� 9ĺšö�h����˙˙˙11928D,������ú�������Track�84�������Album�ayu-mi-x III Acoustic Orchestra V˙ßsmm´rtal-anime.net�������Year�2001�������Genoe�(Pop �������Title�ever f���PETAGEXĐ��ý�������˙�]�������rtist�浜ĺĘŽă‚ゆăż$�������Comment�#osźi-anime @ irc.ixmortal-ustic Orchestra Version [AVCD-11928D ������ú�������Tx III ID3 stic OrchestraV˙˙smmortal-anime.net������Year�2001�������2enre�(Pop �������Title�ever freeAPETAGchestra V˙ßsmm´rtal-anime.net�������Year�2001��rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr�����Genoe�(Pop �������Title�ever f���PETAGEXĐ��ý�������˙�]�������rtist�浜崎ă‚ゆăż$�������Comment�#osźi-anime @ irc.ixmortal-ustic Orchestra Version [AVCD-11928D,������ú�������Tx III Acoustic Orchestra V˙˙smmortal-anime.net������Year�2001�������2enre�(Pop �������Title�ever freeAPETAGEXĐ��ý�������ű�]�anime.neĐ��ý�������˙�]�anime.net�������Year�2001vpk�h����˙˙˙˙MĽ�h����@ śĺ´Žă‚ゆăż$�������Comment�#osźi-anime @ irc.ixmortal-ustic Orchestra Version [AVCD-11928D,������ú�������Tx III Acous-anime.net�������Year�2001�������Genoe�(Pop �������Title�ever f���PETAGEXĐ��ý�������˙�]�������rtist�浜崎ă‚ゆăż$�������Comment�#osźi-anime @ irc.ixmortal-ustic Orchestra Version [AVCD-11928D,��™����ú�������Tx III Acoustic Orchestra V˙˙smmortal-anime.net������Year�2001�������2enre�(Pop �������Title�ever freeAPETAGEXĐ��ý�������ű�]�anime.neĐ��ý�������˙�]�anime.net�������Year�2001�������Genre�EPopMĽ�h����@ ���wvpk��� �������Title�ever freeAPETAGEXĐ��ý����������Genre�EPopEXĐ��ý�������ű�]�anime.neĐ��ý�������˙�]�anime.net�������Year�2001vpk�h����˙˙˙˙MĽ�h����@ śĺ´Žă‚ゆăŇ$�������Comment�#osźi-anime @ irc.ixmortal-ustic Orchestra Version [AVCD-11928D,������ú�������Tx III Acous-anime.net�������Year�2001�������Genoe�(Pop �������Title�ever f���PETAGEXĐ��ý�������˙�]�€�����rtist�浜崎ă‚ゆăż$�������Comment�#osźi-anime @ irc.ixmortal-ustic Orchestra Version [AVCD-11928D,������ú�������Tx III Acoustic Orchestra V˙˙smmortal-anime.net������Year�2001�������2enre�(Pop �������Title�ever freeAPETAGEXĐ��ý�������ű�]�anime.neĐ��ý�������˙�]�anime.net�������Year�2001�������G\nre�EPopMĽ�h����@ ���wvpk��� �������Title�ever freeAPETAGEXĐ��ý����������Genre�EPop �������Title�ever freeAPETAGEXĐ��ý�������˙������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/invalid-frames1.mp3��������������������������������������������������������0000664�0000000�0000000�00000017744�14447736377�0020560�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������k1™cŃć9ÖőÁť+V¦99¶©ü‘ŹG¨ á &gçé oDä-uB3Ů~ ń]`J4-$¤rÜŮN|oxőR¸vBŚ­Óa˙;‹R¦ĚuGZI‹Üf´^BšGýŚF Ë7Ł˙ěő#‡”Mä#ŔšîČÄ“\ńÄ·âÇ«ů}ÚŚJů-ë÷éií,¦Y>Çś2ʇśNĽ–ą%ŰÜĄňJBŐTăp˙#:Ć5O9'i'ĺY 1á^őś‡şŹÇ Ż@m$ےҡ V¨ÓńeY€řXřü‰^ŰáMeäăDě8¤‡T�Fi©ş#Ç…K…zmNˇ} ű˙–č'Ă%Č_c«ŃKI¶ĺµĎg€ťkPȨ­MÖ” ‚č ę“ŲâQˇ-p’Š— QôźştŇĎQ”c j˙ű˘lŠ€°fŰëIfFCŰzae<“ąmkL±)QM–­é„2ĐuŐa©‡kĐ<ü“Nr6"»jV¶ěŚŐĽS,ňM}bPTŇäŃs}´LĹDšŤĺĐU™VCk–JŃ(Fš'HĂm'(E%ZZńB“]6<OµŐIľ4‹ÓvE3`â`ˇ‘�zýL®i&Ürâ DJFâőJXĆüé Đx?şç˘MC—ă3 1čdźb¬tÄ&Ĺ[(ą«•-őăFzEN şżJ˝ť¨Ż­�ä""ÁÔg˝€IÄ %¦Ü’Ü2‰ż1DÎÓŞŁ%]H{˛AâÜ”_MűŽ·h9měłMřËŘ^•\.ę^g]'a`Á6Ç„‘ŘRLreŘŃą§†O3¬4’ÔąCkŮČAÍY4H{ŐUŘ~+n¨Ëő~ä’‹аÂö‰Wř˘čĘĘĐ›XĘi/&šc_wG«r”`ݏâyŽç4ú`óíŚZU(Ć“D˘í"{ĂÁN)Ä 6Ű’\˘VF“ 62XŇřüŤZd7ţŽ'ąźŘ<ś{ËlĹQľOśµĆ¤H˘ÝÁoוżP•!Xć d#j>D6śAU»Ą˙—/d·gYňâĎ?­Ý”eçá~Ią%´ŞtĚĐrŮđ bKBłJ8”.f\ŻAáč2Ł>c©aeČł§Z˙ű l—�(a[k/JćZF;}ab\“AYmM=-‘U!-čô‰rݶńô¸đ#ÂŁ‰đ îs;‰s ·±¸É%dą„I¤ČŃEč™FŞ8bŐŞle2ş·M¶5ýçÍaßş”*ÚĚťó*G2dl&şč ~LkMŔë2ě÷ŻůŻ:¶÷v~,XąöPpG‹ˇeŰJV‘~M6ĺ¸;…â¶áL<“Žs~ű:×<°É`´3¤ćz%Şîma#óc½(ä=ŽĚ–!ĎN—bk˙čÚż˙–CĄT¨gÄeű—=V˙zOĺöŁ,Ŕoý¨ä¶âˇK¤ ‰ ® Fýh{*;$˛ĐUŹÓi–g!ËŤáż DŘużěRáţĎŠzj{ ʆ‰ŘGŽi…Ő4‰Đš¬A€ůę§Źrµ .öőíщ¨ĚbŹšać*Ń.LJaţ!óě˘NŐ‚ń@‹\ĹżGdž°¬!é É-ąI•‘şMî˙*őţJáཫ}Y+Ąݞş«óťĘsfLíÖIÂm5$¶Ţŕ—gř‘çËČąÂŔ &H;6•‡˙…ßÜâg̤ “B"Č[F{Ü`Q•CÂcÜ]„ÝOm{ž\o »Ľňđ.‡ü[˙–jQ(”šrŇÄ%fś •K÷ho‚b—+(·ÝÚ[Śhę´ÔBC0Q˙ű˘l’€�eŰÓJćYkť=L” ™gL˝%™_$íµ„”ę0ňą#0u#1‰˛í4"…uŮůOu·Mʬť…(xu )šť˛Żę˙5?[ű›é9^¤˛‰yI[´mU˝Ç„z´ÂÓTś*GĽ#ÖLŘmI2HB*nj´2-jŔťµpÜ$Úµľg2kö˝Ă ëW<ú/ Aî‘čĆ A$šnKJ¦AK˛óXFŔ<Á˘Č�9 nĂ\qĉ;¨‹'Ž#䉣DrZgüüďď®Ů^?öEěCĺŐVĄô˝‘vŞQeé Á€ P7ž,B×�^d¤ŰrŇXĚ0_©j‚* »Ó^hżRöA(&GWÚ#br2PŚ-°<ůŞ+ áĘ8s\`Ž  |ě¶Ée…71P,ŠPÂoă¨ÔrDi9T•]'Âࢠďµd–ř´Ü<;üĽ?|ĄÜÁJ=;%ŠPţD<ŮjénóäĺĐ0±T SfNĺ–wúťÁ}M«Ěš´¬Z‡_Î^ľWŠh‹®ëG›Ai$Űrâ¨]~_"nĚqGBîÇ<Aj˝ş T˘”b‚@J$áQ Ü2Mĺ-* ĄR¦ß©ź˙ŢÄ˙˙ő"ŞŰŰöÓĺ­ĘĚO~ܶŽ$�¸4Ě;‹Ö~छ’[Š¸š§ ŽĂ Đ×ĂS·ű (GĽn°]Š˙ű lŤ��bŮÓ8IfZË ja:“ ‘mL±(ŮW!íčô”ę‚ZM’{!¶Ąfź7‘§Ô,NPJ( 273ŁU%¤’OżQ\ ‚şÔĺ"Âh»‹ ‰ü{d¶–ßÓ‚č˛{CśüVW"„ą ŐňÚĆ?bíôKé6 BË~ŁHšîO<bŚŻňJLÂ1_É6.y*AY{ä©#>ć­,4“nKi°bBcn#ҤtăćŤ0f§ßpýAÉŚWóĚŁ"âÄHxŁQł‘ęCOvőnÜä/ť–汑ݬ˝ÍÓm7¦˘g$uĆ*tź*ňŤ)Ř @d˘“rRĄË¶<ř`Yh Ąi4íŇz^2łŇb•ç?%2“đĚ+W\#óą2anZňz1[‰l«§Ás›ŕţWÔű‚«6sË+ QLek(™Ţ”¶gx)<фᰉzůĄŃ1qXŹ4˛T»>䏬?ĄŞůęř12×3×ĚLň·î±&bş˘Ů}ţRJa Ą’ő:Žn*0]ć$G|ť^e–Â…xPUž”ËVAqłŮKy9đ¬ęٰQ÷g뼰Çě3D ś ‰Ź“F\¸(o‰Mäü7…ď«čŞTh¤Ürщŕ%˘aŃŔ8<P"ŕ‡ŮĺŹČčť5Ó˛SâŃ$Xq_Qt¬B—Ţ˙ű˘l‹€ĄgYS2ćUeűMa‚=u‘iM%-Ům"m(öęyĄ‘@Ĺ}çQÜüéqz}¸ź]$őŁqś-Ň”„ŠŞP˘ĺÔ0„‘” &w/aüyŤ¤ˇ:÷P«ę,Ę“‰6âKIhĄüRŘDZ­ś:e”…DÓ]U šđ™¬‘vÎőŞqöíJ(ůďţ2®ŢÇçÖÇĹ ŇŇ‚Ą&Ű’…ôšé“¤)Yr7;Ťcł:k“‹ú¸7’Q9[q®`ŕÓ$�z ;¨phó�ĂŤŤ+ÚĎË=t%HRÖ~uö÷˙Ęë+–ŹĄG%Łĺ·ůňĚś9Ň®�y&ä’ŇĄ$ĉ¬Ó}ćJÜ"Ŕdz92ýăźVÂ<uĺä±X¶’l-$oŇ@ň ©ô4ŤńTß‹B<M•˝<*’±,†Fâ…BQ_!R‰Ž=…ˇäYwůÎri\ď´w–“uLKfő˘řÜkí$˛ő™ĺ¸×A!ĹHWĆ7M¶{Y®ÇQj>”v9ÇăXë˙ň[�i$›’UJGžnQ"=śëá÷ KôŠ#甉c·CŠ„«ĺwÝî˙ßĺöEW]ű’i [¬¤+łÂÖĆş—-ąOéř>Q(Č&ŇnKqR° a1S\†, 'P'g_1Ľşqç "ł·‹î@($—"D©NüOÖ¤U¨ĆݵϢi˙ű lŽ€ XŰS/IfIČ j`âL”=źm¬˝%™%­ő…”ęąř˝‡ÔŤJŕnđvd›]q1//•(˛Ń„¸˝Ehw*r5%®#©lęÍÉÝě2kQ0śúDW‰´Ö‘ŞUFŽ9?¬“>;™Ż’đy¤#™í„Xš*Am~´çmyG<·uw°˛Qm¤Ű’ŇŔŚó,ą`űŽp÷.éKę|Ë Őe¸P*x%nÂe®twđů1]ű‘ňéňÜ*!D,ţ/ö­ße�đniĽ:J2-¤›–ÜAi•ŠE=¨Rnń�rÇîŐ ÉCÍŁFYÂčv…fă«›Ź ÷Őóe¶WŰb>Ö!FŤhYŹË·´Ě°)Vżz\âëý9ox:Ő”fIGRP(ÄWDť„ŤLQ}‚Ň H™3|­ĘDÔą>E�űáŞŰh3öW˙B1UĎ5V|3QLI!µÄ˵§@¸…JLÝ›/еz é6ä·0#B©µ'›§±ÇđĆLéŰ€3Ł ćHŁ%ÝX#U;eg3Ú¤§«zřÉcbRä~#6ŕ«Î5ŕŤ?mäLź Hďµ°H}A⛎K’”Č8jls-8Ö­(©O5„u7âô#ůC$MFYX[Ă©Šw HµT±éËĆôŤ*¨ÍFŠô†(@2ÂŔ0HJ˙ű lť�%c[k/3vP%KŠ=:“Ť›kL0Í™A ­čô”ň+†[?—DöČ7c ,÷.á,ľ€ŔGů<¤ †‹HĽI×kďZßiI qÁAđ’A¸Tô±ŽH!_@0-Á†pVV%&L~)ĘśŐ-Ë/¨^ĺ¸ŘłSôMÓa Áĺ7ĆłŹ˘ôNT´ŢËh‚?ź ‹Lă’,DN{3r7äFţźÖv}ş/ÓQęń9(>kÎgĂu~łóÝŕYAy$ă’âŞBjŘ&â´1Uˇ8–uÝU<¦MŔU29ítđ0€ŞÂ’O޵F™¤1ľńŘF?oˇš©âväJ¨S—qm!I;l‘ŽNď8Ş{~ş’©¶Ě¦qXćIRQ}ŚĐ’2ËŻ<'uża/óďI!1VR—S°É”ÜgŞ”üç"€Ň’šM±4ׄ֒("ŹđŰéJ~ÓL… &’mą-."Ô•~ZzŃM-*©2QhÚÄęX8˛Ú‡<ďŚÄ†Cď”l“µßż˝gńž6v=EH—‹%0yĐÉB÷Ś5m!„[ŚüÔ˛(˛I·%ĄVAjŤb¬|ő€Ô‚[T†ÔńŚňť“„ÍŮŕ@ š@Ń0·Śg ěÉŰ}§N6QŃ _Ľ©Dn;#$+!Cĺî-2O5˙ű˘lˇ�ŃhÚÓIdTÄ›ma,•ťgL˝#™`§­¨ö 2F¬Ů‡ţr Đ0Đ8Éa” ŔŞ#"Č$yę¶…-¨…kžy2®n§îć xĂfĘšH‚)Z­˛5Ý9M“jTĎQ¨Ş» ďs˙—ę{šPżJ~żÖQÚ(ŰM¦ĺ¤`qŹ$Ét]‘ő»í C9ů“ÝЉZ‰…Ł­–ѵ÷Aö áDî™Tx˙Űůşßô“é—úö:´ŤŻru23µ]¶§<´J¸çí^č]&ä–âA‹ő&"@ćŞN¬0¸Ka z‘Łŕ€ň<ÇŇŤň6”.HVł–2Űč)ÖM @`ŢYŐôť5ÉĆ LÜä"X;Ű€ÓxId%\°ě&Ě™ąäëŚűć˘/u!Pˇ9źKŠŠ2ä ĄŮ4·U—!‹Ě—™­yUŐĽŹČBKţŃ·Ô.JŽuĽę˙mIĂşYéD˛ÖŘZ­ňŤ¤Ü’ÚY&3ô©şVk I…V§óÚŢUy~IwBźń.9[dŚ8&Öĺ*kş“QćĘ$‚U$ňüYńňspđ1ůcÔŁ”3ő ˘*RMą+ :O¬Č[*ˇDśÎëín IĂMLnś^±´/t]wĺoűó ěɡ˘˛âXőpĺFX˝âprwľ•O$e$(Ž”xňu›˙ű lť�űhŰS KtMĹ+Š="L’˝ŁgL0Í‘oíhö 2 ně~”qHŃ|=AŻŚ ˝ęť95÷dĘpRNÇFżľ˘XEóňصî×Dz‡ý×3 âüÓţĹ&ywŃTýýńZ Di$ŰrRČ˝ÉÍh´ˇ'‰ń(EšŘł[Ą·WńËŃÔéě˝ă*ÁŤ†45JŔ Óě¦\M](JtŁ~ŐĽ˝u‚‡î”T #dü©ťůS`nX�D¤›rXčNCZˇŔ& AÉQ돼]đqéź8y)9G°ˇú?Q->4 ý5Đ8Ő`Aé– “€öş ¸/L$w˛Ć` S�(‚ŞĄfąYó4ŞOňëW,ž¨ó3ęçă\Q˙8ZÍH¦ `ÔđâÄ KŮ'Ăňé·űbhYZđŹń¶jmm…ˇś'â5<u}ýŁňí> Ňi8䡡oälp 9Jˇ Ň—…ş,7„,"yA¦p<˘Ť�ea"ůPţÝţűő˙Ş|ýĄď‹÷ś>,ďň_ť‚ą^Yşú;~%De$Ű’Ůj•éź1¤(jz#’“Ř@Ł­/{¬VL©Fs=Ŕ—ŽHF`×4ŚÜŠŃ%{tĹ xéŤFâT‰\őϢ;ŽŮĹčKŇIćŠkÔWQxr­Á‹űDD) ¤j‘ź˝žÁr´ÍI˙ű˘l €ŹfYÓ 3K%űj1D“i“iL='YFíhô•2Ń‹h§‰ł“Q¤”WĘ AŽ—] ÍDâáýBĹŠĆ›Î^ęYć˘ç*“ŽĹöű¨Ę ü[=~ç‰ÝĂPI6Ü”˛<Ţ`Ĺ c,eü·#Tú7Űl§é»íü_Ś'ü™X"88đ‘6Ψ † y QžtçqÝŃ%u9"ĎWdä°”‹Ëž9Ň©WrÇüP&¤H5¶ŰRîŐů)BĘLr-ZdŁqb’QŇĐś˘“‡–eáý„O„‚bŞ- ČŞVtč†<Âř©=ƨŁNd“,ąůej„ÔßÍÉż9˙ó°A¬›ÁO=D"‡€˘XcH|˘Ú?Á$Ő§ź.X©"| ÜRâŚŃ{çš„Č/* ˇÜgůűxoźô¨e$ÚrV¨Çĺ4’D ϶©“ČFQ(;R&MË4LEmŔaÎJµĆą”HŚđdÉXëTW?˙ű˙˙˘hŢŹ@vŽŁßŘTú_ú hĚE&Ó“¤áČ@ś(&�†€¦Ös§â·Ho+D€±Ż«;7?ë+ă:ŁNô¬±ő9ż4đŞ`'.Dś).I˛^:&�‰"aLÍAäďľÇ7í-˛zoJ§:¨“ TßF–MĹ-{›îR~ŇLä`¤:nŰž|ˇ˙ű lŻ�¸fŮë 2čLHZa…&’•e¬ĽË©+­)†$˘Ë¦çfí2%«íĺ!%K#ęqčÍ;îuŢ”ŚŃI4Ü©´¸VZO'DŕUwdXhHEĺÍÖ(öK\«É¬fŔ÷o®ôeýt˙Üj˛;ť+Ĺ-ůb۰aŁů&ęd˙ůÍýż@‘i“rT¤XWRĆ-3”6ěYŘ,g+E‰v‡­n™D˝ťôĘÖĚ& ®–;}MőÝ%=  fäô,ć3‰Í¶†no+ç—NCęIVáiÉ^ţOÜ14ŃꨲĽmňWďĹĂÚ:ł¦a[%q<‹ŃżR¸çSk¬We>˝gűţF][Źń<…¤P—6kŢní —ňo/ßT�˘RMÉ_ŻGrVŃśy(Ô\hDř«‘ 7‹ źR‡xŻY°ŰľŰŤ™I?0©Ý9s7n˝rŞ­S˛:SĄŠ¨Gť?,ÚTĄőŞËŰţd űyKÉ˙(Ƥ’IÉ-$@ZüWRA$ĐzŁT•]2‡Z,fNc(+¦6@~DB‹\Ă@"čô‹F5őĄ—”ŢÚĆ˝dö{ú8dlĂH…qUE"P˝(@+®™^ęcž°ÂA÷ąXŠ~mÚ eý@nĽš×fą;Š~yą“BĚ/pĺ#&śQŚ|'ţ\؆ΛŽĘ)d'%˙ű˘lŔ€ÎhŮÓ/JdVÉëJa^“%ŤiL˝%™miršŮřcŁÔµńÚĽÉ&ä–´dUő´ő Ž,ĹßěŞ0#Z5ĽđŚl¸�@y™ż� łÚSßgCr(ű3NE?ăH㎀b´ŁŤAć}^SÔńPůUrşžéx— �ň¶:ËÎĂŔ-˘ 1¦ŰrĘU0Š@-d9&ĘśNŚKíJRăyĚĚC˛˙uS°sR,ŻĆĺ7%—-îĹnK[yąDçҦEk$…‡ÇW|nGő…eŐčĺ”—ŰAiwő[_QŹ(ćG|-ĹÖ¶ć‰o¨Ş­fŞŃŐΊµS8W—KSBp’Äu ůöĽŰ=y™‘ŽzŚ3ü÷×™­ĺ°2óu>k"A4“nKWńÔ¦=‘ŞtňBi…Á5Ë˝“RQuťĂBĎH*Ë÷Řççôůáńľë-{8ôÄpŠ–0—,ś›€Źđ[ĎÝO~ž¬”vr!>#xXaÉk˙<gŻ«˙yr$ś’ܢE¨jÂŹ ¤»IPÔ]Ş;Ś· JYeH¬^›ŕĆŔ tş+ 6ÜĘÉ«eąpFR;î)Ó>ńýŕ†'KÖął ¶Ë¨:$łÉ—dI&űu]šĆÖ~­jî˛äó‡ś?ÝëÖŻ6×ŃŇxź¤sI¬ş–~7ZŹ'w6ç[âš˙űŚcWźśŽ˙ű lľ„ËYZë8Jć`FK]?\“5ˇmLa,‘MŽ­t÷Ą$!µčéćc$kÁhł˛=‚ŰóÂŻĺĘtÖ͸廦-% čOöŐ¦ĄN"Ő y˙Ľk é$N)!VO®śN"ź ČçŢ·Ď‸Urş:Ć´šËGO“H©Łőť žH0ß;fA­ä°ŔMĆ M¤Ü–ÜAĂÔ‚B†)ÎÖFH3řD=Ĺűĺ ¤9čy¶ľáŕŔń•5 ÂďąČF|,„˘}Tćśj·”Tôąc,™Č“ŢĆY�$/˙EÜ@¬MŽ:´É]Ź4$ Í,ä5@ »g$É'nďš‚k<iłÚ&V}슟żúo T <’J+ośTÄ·)eäÜdgi6Q­ř/$›r[ .®<ëÎnŠ‚IY#ŮěcO?fĐh¸+ć~o˘ÉSPč·ođŰ‹ßő"ú-şĐ Hó|ąD` ¨ÂĹYĂäŰĎNĎrŢT¶˙]ú+I$ä—ŕt,ɤ >«‘#�Ń)őłČ4»dĘ^!P–bzÂuűŹ[c‘ŻQ”´łóµţXŢďˇAÜY=éAÚ…q›™wĹŠłTŇ=¬WKL˝°ÂÍŽ°Ş3ZfI®]śq*¨S"•¨Úč™OľˇŠ‘ńF’¸úŞĂ†;ŇÁ×ORXVžÂµ×9Z·8ŔŚ˙ű˘lľ�ăfŰë1ćSD+jać,”ĹŁkL˝+‘#mĄ¤ˇ*RŔ©¶:FGh@Ś©ž…%Ö?©ńŽ­r“_şŞŞ4sٸđPúŃEŇą˙S´P¸Ş¶ôľ©XnBŞ,bŁ/Đ@5şŻďË˙<xţ\NČpůřŮťű=ř>ŮAU€€őÚŃžŕ®Em$Ü’áŐFz"ľEQaHqZIŹUĚUŮé.®ćŻÔĘtôgNK¶qk’¬O dáü‚Ţv>gĆy)&ä\¨ç±H Ä$Ť9ĽĹÎríČ”˘E™îBţµâ™^w ‘ĄFYjJ“ťJÓ]›’H?Ë_őýRł‡JIPűS]]RŽD…íb^«µ_íť8â¤NóčnŐ,ľV(¤ć’”sřž|d“uM"šJfŽqŞ<|ˇX›,Îeó÷ţ*ňî®óĂǸgŽ�‡W@Ěľ&m÷ĎśĄüSű7úyq_Ôţuz˛˘1“ş' CUO$Ď©u˙ ¬ „˘¤čĘPZ,HL‡T2ĺ8‘4Ő’‹’íòť öńޱ±âL†ďž“ťúlť¤M M!\ Ę)"´-Y3Ž Ůoł/ĘÓ“łřĽýJu^(•ÔHIJ+×nžßФ‡źíĚŇ×4úfăÓIBSlűJ,¨ąöFÓrsfťňUi˝ě‹�±)˙ű lÂhÚÓOIä?#=eă+Ąťk 1(Ů,­)„‰*6ÜŻXo5ë·ňÍq©żÓsJ@×>Ł>2‡)bžHNÍ]—{"áŃR›3éŰň»-?Ro2éYám+wţ´‹Ŕ·?”nÂťĚŘv *Ű’ňJđz͢\*”:\¸ŇV“&ă)w‘FÔ¬hYÖÓ[Ű÷`ĺ f+M"IAÄ@™©Á ­Ŕź(íţdË ­ôȨĘ{/şa9¤ţqôŐâ±+Č‘Ö Űî'řjq$’“¨LéB‡&ʧ™ ‚ó@ię˝tŠTú÷ÄDé®×eĘçý[s8 ś˝*éĹXľ?ć±ÚtŞ˛pbž4 u˛Ů𦛗µRw'Ü�¦[)©$Ł…4¤°a¶#gĐ,&p…ć'Z»Ó3˙ČŹÝÝl`ó–>¨›ĽżcJ+Ę»JË áHĹá`ĄťimIŤ´Ü’ŇÁŽ€/±‚€,k\ÔžĺŐ;Šę;եϡ ĐᄥˇÂ„ŞŮá5-3ÁxÜ/čŮ_Ţ’´kvŕň&\»(Ś®Š'ăh^Ţo¤¸dk5˝VP$f‡=!G­¶ÄŰ6Â:NMC©Ń ayWЦnUľç+žŮuP­ŮU´jkĺŞËĺ%âŹőtŹ«ň y÷Ú_rű‰Oďßún»ÖŃ^m7$•°—I����������������������������taglib-1.13.1/tests/data/invalid-frames2.mp3��������������������������������������������������������0000664�0000000�0000000�00000017332�14447736377�0020552�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������–TĆÜýL @°ÖÍP,Ź-h¨`€fN'˙˙˙˙˙ň v0Ţvő÷˛2ŔNc( 2�R!mŔC á˙˙˙˙˙˙˙ö,o˝ţţűßď|Á@CŚ —¸xN$``k9 ”d/�‰ĐA˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŢîÝ˝sźÎóż˙˙˙˙˙˙ţ�Ć ¸„ÂF…†�aB,0˙ńĂŞf1yź÷ᦠYĂÍŰ4UÓ;Ň,˝&s ă&\ůDÍłÚ`hPŔÉ@Př‘˙'Ľ!@Lx'a0ŹÝŃ7s n°(Ŕ Đ  ‚ćďň|źUĚ �Ŕ€2$@°p2� (Ń˙ňpéşe2|qś`0oŔç± \ÖxzČ“Ś g˙ši¦™}@lĐ@Đ•¬�D�á€o[‚(`c‚�Sđ*˙ůˇ§Öp¨Tt Ŕ̉h° á0 ˙ű˛˙€ gł¶o`‘@ÍĐ�… ÷€ ˘ˇ‡žŔ� @!>Š�ç@Ů™Ľ€ p5c@*  ˙˙˙ý3u Ç Â č'˙ţ €i‡ x€Yň`T ©đ3á@`€€-€9đ$‚Ŕ°;ŔĆ?GIó­^82n ˇ‘ý (ĐĹ–xő€†8JśCĹţŞţŘN!Ž1áĎ}ć=;jŻsĚ}1­ŔV'á§ß( ÇĂËgŐţń+ü°RRH´Ě&Gž”Ćý˝1óýLŻJeűůAuźfsÝ˙_÷ł÷ţé?qC€z’ö hŽ`‹ČEŃDpČV�°`|K'Ŕy0(OŽÇ@@|X ? „™Só8íf+–č`â˙Ný[HŠP‰‡µ?_Řâ÷čäMŞ8rËćr”§l½~uo“ ©V)^iI˝ţr“G;rěP ĺŁ'ń_Űëa7vÔŠ� îÎmYÍ)E ÍiS ÎxÓĐ猢hÂ@LÁÂÜĐĤJLRDśĂ,LB4ĹTbĚ_D„Ŕ4*VÍ3ČÔĂáSŚś`2 đ!0č\Â"Râ‚GćG , 1(ě8V€€ �  "-0@ =Ó.‘ńIMšjLě]@ŕ÷™†µöˇLá5"XÚ˙Zě)^'ZäZ’ŐÔŞíbë×€ăN%ůÓ@ot)gqĘlˇĚ§+=™Kßxĺě)«NGmMîIbĺJGa®K%1ŠL?*y57ś–łůŚäłÁ�}AáďߣéčŹč©•H˙ű˛€GCM{€�˙ixi{šH\ż:YÜ� Pć±ěĽč;ĺ ¤�’—/3=$AĆ3ĘT%ú1n03(‘í1«ó "*3w$SŔ ´3H Řc‚+‚¦- [ŕhLĹŁ“!LÖ 2’Ó‹#X [€„9z€#M(@AÂbAÎŤs.8ĺ�!Lz3V,ÔFÂ!ÂA1€„ÂŹcHqx_ 2 ੦ŁËŁČů!]ęP[„ą`îĂqeó‹ ~’’V5É�`áĽăöüÉ ˝T”ĤŇȻ蠌±ŘĄ§™Ú‡)ĺ}xçďnW ‚$16#ü"ŻLŠgyGv_üľźĎ×çťKĂçÝűť˙“ű?ç?h�'ŔŢH4‚śĐeŇDě!2*n4“ đ!bÂąŔqëˇ!ź ¨ĐáÜ`Xv^ÖŰiR¤˘“Ç#Hz}§áîyXąŻH+Č-v–“=çľVżM,Ë~5íç!ď÷ź˙nÍ­Ţď1ł^'K Űśs€ÎţŃ<˙¤ÍŰtĎĐ×#“·�«á© •*A–‚&b ‰Ś<Á„pî‡`5F¶bÝť"šfŽŕ FŠ-e-˛bÂA9�h:A.ÉXO2î"ÄąĽAgh§Š˝vŔ‡¤×±J¨q/硠XäM>ÄęÓ#Yç6Ş×•“>†ýÓž"+"/·bOXáB ś´ĎHÖú� ĂA˛O7Ú?ŃěŔB$«Ě280±@ĹBálŔBŔ°,X`đ2˙ű˛ŽÄ4Ηqŕ�fyăs).Ř÷<nd«Éů#'ŤÄŽŘfeĎIT'(G¤J`żŽkc™LÖÎ…ľ_wez± uÔh, ŹwHĆWöňU™PłŢjF…#ö|FľłÔÖ÷OŤ[>ß[ÎĄ(ú°¬ŁÁrÖÁ†5{YkzĐé€�MČ Î…:l ÷ 0̢Ë*9@‰,HL˘& LŮWz—Łcf€×şŮP:®DŰÓI_ńYŔČ0©÷“ `ä`Ę/oC®j¤†ď ”· ‚Ł Öa„H6±©M…rpfç*¸ęć`Q˘Q`°šnt‰Š{W'Ňź>T�ŃHs·@ĎŞ{ÂĚV$†4 Î€·ÂĂ'Ŕ“˙óٞEňT P’ć—Ýj¨ ¸@Ĺ/;č\.ę˙vĄUźÉD+wŰx–Ţu!rü%S”óŰôVP <ć$<H ĄĹĹ«W‹˝7ěŞB•j<~„»[ť¨Qě.Űxů{�ëŽ-ťůbzôY˛“†‹"™<D<ëZ©©‚„F>7(d©(Ä‚ {ćKš™>“˛˘ňCÉ4˙7Ň—aŕjvćťwň8 <ŕW&›˘şČа˙q[4Ś<ziÍÔ†R”t–/ľ–u†úůţ[™îLc}tC"ôt(ĂĎŇž YŃ�ĺ€Ć«Ł€‡3ldŐ`srźLÂ:2`äŃ3oŤŃł{ ŐŤM!ę¦ ˇ"2†,ř u°VDÁk´ŁŇ‡eý†'@P€Ůu‡!ăĺĘ•°WbĹU,ŹŠ‰v3ŻŽjškŽ®9Z±tzÍî?˙˙ű˛:ŚÄ EĎ›šAđ¨ăpÂÄYHmŕËJ !čÍĽiřţ×;ş‹EŹľT‰­'n��\€Ç+# âŮ4­|ß"3yŽLŇ02M†ڍ1ąxć]đăé€Ef!�©‘€ŔĄö„ĐB¬‰ś˛ÓĄaśFJă,3Ů-kp!Ü‚¤ńéMH÷JŃę <IRŚšŇ„ÍŁ’,ą·›ąvCŁ×îßa"ŃÔYckňçËv‰?\ňSl”Đ�›ż�bŁŮż9{ăbu5EHeˇ@Ŕăl�*«pĄ›ŇjěĄn\+d}^­h@eŃŠ;ŤB]}Č”ŇŰ ^Ůä×:î=WĘľđÔO“mç´gď{ŮdX]˛…¦Ć“ooPPÇ-<ŢÄ'öh2wPm§~竺qĽO—0ło§@�­ü‹ŹŻ4ůŤQDÔ €ĎápSh6"]NŁ<´ ¤$7yl)…F$qh č(Ć*é±îÍ(óe Zžż!4LQhŮš^Ý“vt÷żo$ő:2…ĄŘ‡Žë:!ÖśAůäظóf§Ů ú÷żşwgşő8ĺĚBuMf†kŚÇGóJŚ7ĂXŐEÓ&™Îř3ĘCÓ ĐČx3&¨đ?oPÜDŔĚź,˘D"˛&˝Pş^5.r+6ł!‡ü ř€iU<Üb€$ÔWÝ4h¬ŤVi˛łlVJŻ>ý!őÚE7y›(5[G·â7ô•‡›ŮúM-ť!µ;ËćnÎĐ�)l €śŕźŤlÇINđ"(d0$^†Ć€2˛¤€ H‡ˇC…Ú×Xű´»a˙ű˛[Ä 3P‹šJp€HúSohO©;JM°VYô&) ¶Ńž¦ľµďJ}y“pm(˘ ¬rpß5ůćż?^ĘG1źy—ý˘řáóŮŠĺťľ%~ ¦řŢ2»ď˙¶ÉsűüÉŢq{ŘŤ4<‹łw˘śl1păŻ:JbËƩޫa@é‹x¨Ôy H:MĄb˙3f[ PŔpÜĄ äxe4b0EúěUGťĚÜeŁ6şü„Ś+Â=¤čâ^âŠ:Ć9‘P:Kç'|ĂĐ3YEµJJGäŐ´őĂ5Xl§wÖÔ/�c§�� ŕÉEŚß”ç'‹ü!kS%� KÁ `jł"/j)-Bé7Ŕ¨.ß[Îą!˘ BťÇë 6´Öízö‘ŕ˘ÍAT–Ç Š×&Žü—Ż9TźJ˝Háά´?+öކTŻI5EqeˇŰż}«n|ú ›‘ě A«Ŕł�� Í éĂdef(|jÄĆ*g`†H4.a˘&JT(�!US4 �·ń2őtéh˛ţ´Q‘–ňĚŤÝŠT Ć'Bď˦챣zËÄ€ô{§>FPÝ]í˝¬B÷Čpz„Cp1ő3¤mżw„'.Żí~°gs�ŕń ��ś á˘18DŮ@Â…†ČL2Ä4jb`F"id„�…Ĺd&,Ź« Ak¬čŚ6mü™ ĎHdią µiUĄ˛»Q;u3µe’nęž÷z¸fął(§s9µL>D}Fą_FЬ±ő~ß™ůơ @şőrĹO„÷Ň bdôA”•Ě˙ű˛„Žä IŇ›ij SlFŘ-9Jm°¶‚&) Ľ•zą<M<ĂP i8ÇŤL`d0`` jU�$ .ΧT8�¶Vă+0!&­6ĐB‚äZmĆ‹GĺK/śÝn_Ťí�đ«0†ox—őő×挵¨ŽˇD&(Ř^˘Ű ˝GôÂ×ɧ›l­Sőäăź#F č.ĺNHV\pą¦LČ`G'Rg¤ĆŔ¤f‡ � °!PXĂQ9ź9Ďpľ¨‚,;‡Z%üPđi‘SM0Ȧ”ÄYý<g!’ăxĆž śó^}©f±žŞE©Đ uPb €Ä DRD‰Kg Sލ·)ń­§FŻVŐŰ9ńGˇř˙|vë­˛��ŕÁĚoÓBLŔ¸ß”Ę !#„ç: 61�TšŘŚ+Î/¸}f&y”Ť1+™i,â˛"1xftSŢŤálčIyĄ0ýiml–jý©5›:‚â×"†ŮŃÄŐ=D…8Ţ(řÝ fBŐ±ť“FČý·.GlEs>$;Ú‚´;áá �N "&o3�ăh9( € ĂA Ŕaę‡T¨ŃAŚá'b© ĂČäÝŤ†‚Šöń®‹7'ĄŽBĺŐĂłjµŠŰxg5n+Ž&¨ň zG e0}‚µZaʇJň f÷61QťZö.§Î >łc˘>řĆĆ˝D_‹É†$4!ő6Ó?o=‘�lY,ń ŚĚ$ÁHĚLšüÄ™±" ?ÄÁMl vęb¬ XÜy-�!¶ć…‚Áá Ž§ösS:Ť�ÍM_•˙ű˛©äNR›x+`€Ş colAHMĽ´Ň() Ľť8T‰ąYăí1zMHřĽŹl5C]ť8M.3‰>3Śă4nÚě^N(\CŤâ_ÎŤůz 8/ą§–¨śČ6�ÉJĹHŽ8iśÇŃĐáÁ�hsed,eĘ6r ©0˝�§/Ĺl€BjN%*G\lUDaI+P<ŇĘÖ!€D‘‚;vÇ RĆE ™ŮCŞ2ÓOCoÇ`ß»ăëťÄçéţg}jTěׯBĘ#*ů­‰É*�� ŕÉELć,ČŚ$\ćŔ D<TbnÆćRa˘„A&ŢtŁJ„ŕ„„˛tśGež¨¶p56§xŚ4MúWPň±żüĂ–Ç\)CŻ ŠC\X9DôŃ’í\Ťď˝»H쀄™TÍŕ–ŕůw;e}ĆŐřÚ“~n•°]zńňżč(��s16zń"Ł 7!W4°Ł@3…P ˇ„#AĘŚ% đ„DüH”>c§aŹGÂüş7VDVŔË›łI¤‚e2ş‘čŁu‡9,|-ë7‡ěý™vŘ\Ş@čÂĆł‘EPĂ—ćyę›ń‹F&oĐy«ÓĹź}š‡ęř]ëÄň!a‹�8OŘŢg@ëĆ?8@`¦Ž‰Ź‚ŠĚ`|ä€5˝i‘<Î ±uÖąRÁ@¬A*ęw�ó¶ďé¶&ĐPÓਲ਼Şý=VWÄRcܲµ;ă"—8dAPůH wk˛<ŰĽă9žŁyťŁGjŘĆţgËĂÝxŢźĚřtč>*\ŕÄ c<苍ôĹP Ś!\ËĂ�Ó&˙ű˛ÎäPRl©ĘColńAHMŕ«Ň ')MĽx(fŔaóýDF%ş»1*É0Ŕ`ŰlŻ×Ţ<2'ÍÇt—4äP™<¶Ű±ř9Ř—gR?×ŢöĂŽ— ˇĂ™ 3••ľg”Yę&ßx]Ô$Ü_Ce~-Ĺ^˘š›§ě*ő'>­�� Ăi€”ÍH.0µ$Ţds1Ť n 0élÝâ I  `0ˇ¬ŇL ž®ˇŽś�¤†bÓéüý2łśD8†RľPN­í &lř×LečţI BgúÓÖ+-ĽţłvÂ8($ J¨Ô¨#ŤÇđ踰ľ& €‘ą“N˘8^±~iĄĄHĐ ćwô¬ĹĐŹ=ó¶śqrŤËĺ Č€��Đbô)ŘÎfŢ�ćS™�”ińŔ(Ôd‘ńH†@�€H„°$b!QŠ2oi•‚8$çđ8¸° ®h‘$%™4ĺ˙PDů&Ĺŕ©(Â誩˛âűH`<ń§ŕîŻ_,ÎŇ÷€lΰJx.Ě …4Ť÷ť%4­&ÁîqHÝÖhz7¦Şß×Ű#iw,1ţ˙ţ9äć üęÎŃmü7',ŕŇjA‰ŠÉ&u‰™tbSɤĆUeXc2™A¦�Îę…„ °!a€Ä† ’ę ^ú˛-A©Ą±‘Ń.Č“ŮÍ‚ß&°Đ"#ÔÍíąPÜ‚ß-PIV%•qi,T5<0Q#„śrĎiE5©L(šhëg7/ţtăů&Ç%˙Çź6§ĽĹ/"ŕ ňv¦*buö¦Ftŕ¤Q ăŁ0+ >˙ű˛ňŽäńPP›™:đ›ÇĘsKnAAFndëÂH((ŤĽťx8’S!6ű ¸�ú C„k#H…ô6G<m†)Z¬0yŇaÜ1€&9a›`äŐdEÚl‹ňQ¶\ÍŁp¦î·ęKćăX �iPŘ‹(¤\2¬pÖ\jy–4ČŮ0XÖn+ĺHóó ö˙š~q ŮčÍú=Ś?DˇRÓʤJ�� ŕÄŔCWHÁ ó08NXZ4$HpgÁQś™Ľ$`Aé”ęo‰6j 6š±ź:x vE�0tYDyşĎĐ yGră.Ţl[[$"qW`ä˘$~C+˝6ąâć ˘Ž8ťÉŚ/jŞ,”&g=Č%Z“ęY9í®’n˙ďúÔ˙ĎţßęĚĽĽŻŇˇf’{Ţ�n�ȇ1ţb¤ÇD’qĹF>ĘfEćĚ`°36B 4ńv´c`ay!şdÖJ� —şMŠ•UąÖÁS˛łŰ`h˛đ€Ĺ2ńľĄNś±hJÓkŘÉśâÇ’ą|á°ôIz„‚řĺ‡ Xš¨©ůŞKZ•©–Ô5í¶7ůťSý×öÖq_V„ße÷ßÁłĽ VzĺPŕĆA°Š”dÇć¤ڍ©0ŘČa' …J"Ă”Ă'Y0`ÄÉE2˘Ś¸“„Ă Hő˘DĽj2v"Đ!f®0„:Ĺ.,Aˇ ŞČ™¤újČě­¸´Q7c.5;âçŔŃ«šĄť¤‹XźÔ˘Ň—Ö@‹–sÎ<T*>†:bÚ’BQŽ_*HďŞ*]PąÝ˙ ô}K‡†@rykçř2x0@¸QÇó«@9GCÄo˙ű˛ëä¤?Ń›™Jđ’hz3o l ?DnhíÂu çÉĽ™đ5¦Ón 7´‘éű‚˛LaTĘËŤ,Śč(“[°KĄ^CűzÁ„/ëGÄ(ˇ%ôy”"Ú3)©šÁ‘ÁédI‘ UY|ł$–Ţ/Ć[)Ç€"äAH2…›N~ZI9;ú_ňťŁ×ű/ňî˙ł”éĽóÚŻ”xNď.Yý��ťŕ`qWdƦENŘé °ÍŘB „łPuĐ4x⓹Ž2˙¨*'! pC9:R’†đ$Ş4ÍÎ4H=ű–W¤\ÔnÍčzCvźíÁ}Ť^ Őh ‚<8‚ˇ)dĹ'xeř2'¦l9ţ?ŘŹ:¸¤T1r ¨—ÎÄT€�Nđ7‹5De’¦´b#†îl-(Čş *T)0Ĺ^gȶ»›S,†¨É„‚Kőô‡UŔĄőÔ50“% ĂnB-5‹¦’;RÉnčľ-•›µíE>8Đáš ě7Üaź—#üšla%đ˝0„G”lK˘>>4˛ť$\ ß 5F„ÍXÓSÍj¶wŽŞ™5H,Ä3ŞdŔ'"D›¦€ LL8S=ŁđŽN4‚§›Ä-vôĆDh16Kę°#�ˇ‰~E"˛ÎV6Ž”,1C§” µE ‘WaŹÇ •<®Ö €•&; L'Ş}ÔôgƲç®Č&Şq§ˇ=Em7šÔIŢřW–hň”>ă˙PBÇ ´PŻw÷†Šš…Đięy‹&dµ.tµ1ÎĎĆBZ•/Č<<Ţ l�‚˙ű˛ääAR›yđČ*So#^hń<NeoBkźgÉÍ řPâ4H"$iÉ”�¦©tqŠ€8Ş’šNVů6€Ňĺ.TĐÁ%TJVÉT˘8ơĆO&ŤGŮÚ¦§•=P• ‡Łpç*Iw+·ś˛­×Ţní­ÜéęV«Yťn*J„(ěoęHrp…?űYńCË.%nŹč��€Ă¦ŁŽdLTG¶ÍŠ3LDÉčł“Í>0°ČŮ “ˇŤl/1`lśaŇ‘ŤĂ#Ŕŕ!m,ËĽaŔ™� ˇŁS.Ą„•Ě®�Ô ń ·4‹Dj©ëąĆ«ý-u!Rë ö#a"›ˇ°€é:S°ç§‹Ś"ĘLŤ„ýz·«y:©fIЧř7ѰMôWÍ ýM`�XcSQ¬%ć/9ufi±1“Fc¤K)�L#ĚÎ)0xl*%0Ŕ\ÇaS'Ť„˘cS™´¶4Ŕbe$0ëL€Ąp^ ,1x’5("qŽŠŇÉ—şPĚëu|Řś§ i+^!Čó|§Ôë,J‰DáŇ4J%&H?Ať†l]r;l€ďUż#˘ę˙ăřŻžrma…î×ô‚°6F#ńä3`ĂŔ9PŁ (®6ŁÚ‹7łÓ/z+3:µĐă’Tđv0“&JËŢ*a–‚D–|·ńFti—Á@Uú~!şĺhJj©ˇ™[Î×j:𦟶‚tŮóÉ˝K-îĽäý[‚T?a…c’KůkC ¨a˙Śő˙Qżń­óű-÷Z}Wµ|%5*ÂŇ@< Aőt„– ň`íN ÷Ý„ ČöLŔ¬ŐV ˙ű˛ďŽä»DЉ •ÇÚs(z‰'Bmĺ ÂQ (MĽˇxpéTÖáüÉ…�8óÄľ#B’])©Ľ€TěKĚŁ9yXřÉJ^˛Q-uăNă»1Čܲo´űĹßą«¬úł‹‚°¸¸xeŠXńL @h9I˝HĦsuĂ öüuV©˙óű SŽĽ±łvXQ*a)ĺą� 1.1„h6:Ł�3sDG3Ă“Ęv2ůłN0AŁť?jćÔJ�ëLÔX„ Ó ĘŻĽČ2Ěv‚‚ÉJšB!?¤ ÂgšÓDĆ Â,©lQŃi¬r_6öµ d; +’ µ(ˇĘOÄń1U\nG•˘‚†W-ÉłÍxŮua˝nP��ô�(ŁF!;uŁö8Ł23<ćS|8dŁs0đs*t0Ő0RѢb€ÁčTh)ŤűHˇ”Ľď´© ś@ç°ˇŔş4@¸ˇ¤§€)mĽŠŔĆ)Ű„ĂŮ-n.ü †pD˛B”oiĄ"“ś8ĚîëŘôš¬ÚjÉ8ĺěáúľ©·í•–zwźľ®‰F)ć–[nPţ;ůÍÝŕĘaŤ’cOÇ/…ËćthńTnj`™‹ĚdÚ@áQ‘EöÔ €b„/a”8XPAI${S%qA¨¸j.ëŚf ţ˛ýČ›÷ŃŕgMzXŃî·9ś¸dÁhŘzĂłGŇEe ŢŻčgVÜŐ ę~cĆĹ[ăżú˙ő/¦ßKo”;ä˘.`Ľ�ŚÄ3¤`ÁDŁťĚş<* TĽł0Ňe1xf ’ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/invalid-frames3.mp3��������������������������������������������������������0000664�0000000�0000000�00000020000�14447736377�0020535�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Çu|™çFa ahß¶t%NsÉß<—MďB)Ř;ŚôTŹô Ę�ŔŹ“e$ üş9óŹő ąBŕ@P,4q0°Dw˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙‰$’I$’HŃÉF2ŔČ1’°^8�LrŚwşÇ}B)ĚFR+‘N„’čĘrÇ=FÄĚ(]îE"Š~äcôoô“S pˇĆŘCnp>qeëĘ�ÇÁŁŽ@~Ú}yB÷ôś¬˘‚!c’ĺ?˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙űŕ@��ü�K€�� ś€ p�� Ľ ���€cT���˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙�ú?Ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţ ô‘˙űŕ@��ű�Ć(��śa8Ô�%ŕM�G 5#P�”ö»Ő#˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŕ��(Ž•ýľG˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü� lüf˝3űô—ú˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü��(“ÜŕĆÔăôÔ˙ë˙űŕ@��űĆŔąś‚hŮB8PK ¦Ŕf cdŘRV�éç7ßö#0!Ćwč'˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŕ*HĘ€öŻű‡ú{­K"˝vU˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ţŤ,Ş�t×ů̡Ăvµ·gZ ˝ Ř‹V­)Ń˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŕ ŇĘ U?ÔÎ Đíjvę$4®‹^®ÄP˙űŕ@��úĆČ%1±.XŮc6 l˝‡˝+i|”#ń‡±-*¦U@89d!M DmÓlvCŰő¤ˇŠ yÍa;ţ Š‡ă:˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ĹJ©ĄP ËŃ{BBxÚOćCŠP ˘­¶ôsC‚1űş˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ä–ŰeźęWć�Ŕ�@�PŔ1F ps†¬#ŕ§Řă'l Ç‹Käü[ÄťC"±ˇçZ˝VĹÎŁŠĂb†mä`ś’(Éâ+·5'5üŃíşćĽć»{~ŰۆÂzťĎ–Űlłý@1§nŰ2ł´.B>&GÁÎ!â pŤŽ2ćŔś˘Ňěż‹x·¨ĐĹcȧdđ­y,áE*•y™™<㯯lěĚüó—źŐyú÷čÝ×ëë˙b›Ă îú~Ź©"őĎ˙űŕ@��ú-Çk2ŃĹČěc[8Ő¬áëAŔٵŚ1i*ɲFŰ@LŽ�%:ĺÓ_/ •RšÓýjĚËşŢĂ!Aä~H¦”ן¨±¦´ĺCνšžŤI-#%@Äü˘PQ,Ů,‰#Ź ČDŤSƦGľ˙ç˙Î}gz˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ę®G,ťHY$�ĆuĐ]dÇdŞ–\ĺCֱ޻-š"äH¤ReNó˝g*kNT<í?OÔÔô4((‘-ddىP0?ĹH“\šDă¢‘ ˘Odg+÷wřçV%˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙1Ëm’7d�Ý×q©@4Kş )ÁvË8^Î"°Żp@ 4…ÖOFk §| PÖr†ť‹ÍrüˇÄµ{ Dş‚‚ŞőB@9x[†CÁť ¤Kǂ̅݊<VćüBZP7$`K ‘˝ˇ^ýü;§ÖŞÔ”…?˙ĆwJDtţhĆí–HÜmÖÍ€ `âĺäs]˛ŕa­¨c‹ 0`fP·ĘPÓháoAnÍ<yذÖ+Ě8–°·ë4‘ljj€$Y€x° ů…é‘Őq=çů5ń÷Ź!ăt,'R~Úőňf»’YÂň}) ;W˙X˙űŕ@�� =Çk8Âŕ¶čík\Yy)¬ç «3"ĄuŚáu §c‘É$Ś™F L.ˇ¶:q&Ř %ë0ł X{9˝ˇßCX]áËkâbLDŇ!Jý§±°¬ĺëLĚĄččÂÔŃ Şť0Á±>ěć\íußŔłŕ'«´ä]¨>]yťˇ»—_r:&PčJÖSüYj8—Ř»i3j#™k“4‹±řë잌ˇĐMu7qái„‡1¤KYTŚŃÄ–Ç\…m݇ăµBšC‘xĆR`ÁĄô=˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙á¤ěr7$‘"Hp+0¸@QôÎOŃ�" ^ÚN)|Y ±MČŽ×ĂĚŹ ě2ĐkěÓ ľ6ąÁu.Ůú`" c˘¸^g܀ƀ6vÓeńÂÝ™B˝ÔÁĹLrěAëť Ü¸Ë#ΑŔp)ŮZáŐ`~-˛ö҆Բµ \†ň]ޤ^QGr�Mu7qâé#(–>ڞP»Gr3%r;nŕ;ť¤e iKé0©Ic˙›Îß@| Ásűm˛K« _J` ä Śd˘¨†ŘÉhÇĄßIĐÁ’�Q|‘´@B©6Ôxč8p*ň'RŠł×XáŔ¦ 5BÜ`2`§˛ł©łBIâďˇŘ‰Ď[&vZJJLTŁÉD$ń«�˝+•çT…ăEÄ'.Š&0L9Ĺ 0ÇĚâ I’®rô–ň /RĂ)8YbŁK&d]—!áYAcżí Vy –Ęi›~äʦZóPv㍠ą45ĺ’úLŻ}m÷»×uZ+Ą)ÝíÚËvŃ<:#hXB˘,ÉxK°ů™čűwVRé)€0dę 0·¤AµĺŁ�ő‚&Ua+ŕşÜ°áA@®•% ]FB¦€Ť˛ĄrŚ–�[1ŃYń]LE¸�·â2ŹE Č’4gćn« ĐŇ h€Łh†…)ȵ‚¦kNę®´Éfs éj§9~B�ú [’ŕÖ7ŃiyŠî@*¤[¶Ĺ@MaÉiťU ç7ěćU)kĚqÜkŤ9Ůkł3rČÝ%iŢÖÇżĽ˛ą¤¸l˙űŕ@�� †CJă›ÚčÚhy\sz]QG­o+łI#(ő­ĺwAMc‰żÜ]PÁŔéF&Y=šťštté”GBşqKˇčŞFč><Äj Ě6^gä¦h'¦.jS†ĽL:,.� šł¨ “ %Ă–_tvŘ›]0ł 0@QůŠ$4ÎQŃ (™( ¨ŮЎ$`lÄĂÁRżŤŤX„@j­G!K!ČĹjxnWn!e-ň§•3·^0ÜéŐ]Ć’są„Ô~ď+4†źŹż­)3P­‘ŻwâŁčęKie±†± ÖV©čáĆ7ż\Ţt“€áĘ?˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü…5Ž6˙pęŘ„^esɨŮgCNy@q¤1š! ¸ФnC¤ĚFśĚP¸c%fvJa€f~rb Fˇ0p DHÄć , 5ĂL(I-ŃýŰbné„ a‡Áń«8tŃű0o2b „fĚé4ŚoZń1 Ô)±"m«QŘRÇrQ©ů]ŮéF*–<Óiř<rőWEăćąb¤–ěıŔoĺŇWŐ‘'Ę#Ż5cy(‡[V[r"÷2µnŽŚc{őÍçI{4XR)$šRHŔNâ i6×NĂ2`ÄŔ´‘`24ĽŚ”«0Ş˘ť8QHA@|B#‹&ž3PŘ€ i™4yľ˘Ť–�”Ńř@4$Đťp„(e¬Ě°JMĺ(ř&®şšóFál\GqřkDÚ:L2‚ÁŐ„R\¤p|™á S­Ő¬‡,˘b ánCbţ%jfŤšNdĎŽ ‡|‰M®d›¨’©ÔŔÁ˘†\Y˝Ü|ĐÂ$92őČľ1$Ż+‹>­~6ěrb_'źÎÜt…"’IĄ$ŚÄ@˝(ÄBÚéÖbD ´‘T€céy”�¨Ş’ť8QHA0$xH#‹.ž4Ř€i™h4yľť†Ę Kř@f*á9` ËY™Tt›ĘţQđ"3kĚ…#…©~ČqśrQˇś †Ś x“ˇĺhätaglib-1.13.1/tests/data/lame_cbr.mp3���������������������������������������������������������������0000664�0000000�0000000�00000010000�14447736377�0017314�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����FTXXX���#���replaygain_track_gain�-1.020000 dBTXXX������replaygain_track_peak�0.920032����������������������������������������������������������������������������������������������������������������˙űPÄ�����������������Info����3�ć^°� !$')+.0369:=@CEGJMORUWY\_acfiknqsux{~€‚…ŠŤŹ’”—šśžˇ¤¦©«®°ł¶ąş˝ŔĂĹÇĘÍĎŇŐÖŮÜßáăćéëîńóőřűţ���9LAME3.99rĄ����."��@$@B��@�ć^°x»,¨�������������������������������˙űPÄ�Í"Č!„|Hµa�č?/etyeb#K?˙˙2#˙̋쬣Ž!ŇËŤö“˙ů´űOý&_˙‘öV"4˛ĹpLâŘeÔ4ó@@Mšš6r°á“=  bvŤî?%:8…źoçśúëŐó‹>€ ¤ň+ĐŚé9˙Őś ŹůĎިO!TlŦ§!•ZBť[ý°âßąĘt%żĐŚú´�E*—ţ[ch€mQX ŁXPO;ź¶é7ÁĎÂţhĺ ‚˙űRÄ�ë%DzAxłdÁ hŽ]É÷ 0HPV<ňvLXóĐ0"2đ†'t‡Ĺ`B´'rţ»žő÷=Ü ŔŔÔp@bÁřů�&4&'—ßČľź(ü»ßw†• Łw‚$©–™ČÝI›#Ë43",”žeî{šąž\iq§ĘNŞÔ#ű‘%žńc’s)›ňo‰/¦‹:FĆUĺ%–F{žÍs6“éď rÓuě—ó#ő۵˝ ví~µ¸”DQ*_˙űRÄ€ x—3§lX&tô‰XśGqÚ„š(§íPXCŔZB$‰đ‚Ą¦ę`”:·ţM§oŐ?#:(­``”YBŐbÔřşhÔ­V˝EĐĄ\UÇÖŽ+îU»×ÖĹż i¶ö4”d’yرŁWHzÚ1�Ε.e€…(ŘE©j<3Ňr3ÜE5bŮ`J޶f—cĹSA¤¦‚«CĚŇžD_˘†–µîy¤[“Óe5öQÝąěŞNŮ.¤Ě¨�d¤I»ÔAÄçqÓ*‹˙űRÄ € <o/‡°g‹ ep¶ 9‡ĺEDË×&L~Od1űŁđ—N Ęu©é?a’Qą0¶u EP3/h°şFĹ<ĽŔá[TDxˇ†´"»H*ę.ĺ‘\˛?«0BuĽŔ5��€d,„Q�’Üľ=6,M—R8Ô÷(ÍĺG€p"ů¶aŕďqa7ç q˝ŠŢĄßËŽgđô«o“řjżÁŰ[ăőήÎřąU?2—7is“j÷ekR_˙<Er[nŃŰŠ�«(ŘĚhQ„Ús­‘ß˙űRÄ � ‡/‡¤iAoŹ%ôö 8@D\™4 �źUÍe˙¬ĚBŠ[!•ňÁśˇäŕĹšő ŇtđÚĂ lŽ„©"Ńw :ö*4†*‹Ňy-KHĘ1xQ©[fF(• I¦ĺ·J¤%�š‚ĺ LB Ć Ż10 ‡R¦![S âÄčwúSŮâňäP¶`ř*0M!“ŹUŹ‹$Y’e* ŃVÚŹ!†ű˘‰n¦ű€´”{Ż3ý*6[ľrF‰$Źk/tRn˙űRÄ€K,M1§¤Čd‹&0ó Č­$ď’d˘:H� ĆÓ[ J ,ąý;řZĺ 1'ÁłIr‘•6Ă‚˘‰ĄÍkTÇÁ$vL4ţöjRN}TęÚ›5BäČZoPšÁňM¦ůŻť.Mb2% ôŞ|yśíN[TK Ti>|"âVPŞül.0$<U.•DEĎTš z‹8$tm§Ú"»_îÜŻŇ™QF̵rěPĘl"ŠÝľ’EQ$C'%č'&C˝¤h\đ'D˙űRÄ � m1§¤Çb ć4ô`=Ă áŔĽĎME#9>_wćJdOĎO_SÂbŻ;˝KR]”Ť}c˛iYçďf±Ź8 ®×čc®M‹©>“«’Ç©˘@&©Ę‚–xJS:ŮŔM DŠÜmZF˙崼颕©EAŐ0‚gmTĽ:ńavZ–b”T0›’ ŮgŮäęgóÂÖ¦ŰĎ ôʦ%*Ůl‘|Ŕ'O:G Ô ‡$ä«mBő.\�Çó˙űRÄ€ ¨ź/‡°aÁG‹ftö 8…¤Bqvö—o­çRđ˘š]â¬'Fg”š¶5”+QgCw>ěh«čˇşÇµTEdm@»zśŰiô’*Ń� ň2¨ „†Äé˛ZśăóĄÇřˇÜP /UÖ7q[üFа"\p•`sĐ©ˇ=6¦”—ÜŢĎR«sEWîRąŐ©?!S´ôŐ*,‰Á0�H`3]5B‚V)" Ă »9źG(đ†"y’‡Ă€u¬' 9ÍjÂĘP˙űRÄ€ ôC1„j=&´ÁŠ  BÎ^ŰĚäiŇČĹnŹ(+­’wĚ!ţkľH¬ź]ü˛FĘ$€Ĺx.AhëxŮ/Şlý{0ł lÜQJpáIO¤Ď¸ŠKď/lľ`Â0 H˛±ŁË8:Enu®>­4-ęÓŹÉ jÝ÷ú>Ťił~¬uĹRI7N…Â5r9L¤5“ $ ‰•Ď4Ň1ŘĚCM:yď‚z:a&ÜšL.PnTš­A5„(ܵ“±+SXŤZď®ű;~CC‡˙űRÄ(� Pg5§iC†fpĉHŁv„ť’ë ꨴŹ$Uü śQł4R$ Ńš·,´LÓ– …4/cM˘ä cĆ­$T[C¦ę9BŹx¦źVĚ™á–1šž«â’*Wm4ÉWR‚tĽFůägş)ÔĚ Ę— Á®a=&hň¨#ą+ŁĽ˘:(PTBŢÎ[:ĚÇţŁáŁş*ÓŤb˘Ť¦ŰTK"㯢ť/1{/m*Ç©Ži6m¨ŰH€¤_ČHÂđŔŕ>ČéJ˙űRÄ4� LĄ1‡ŚNÁL¦tôŚ xěŢÔj Šgi)Ś` X.UŔ«  *ŃŔťeBFÁ¶8`ö¤5Ooú'µ˙Óńu¶‘h:–ŹźX:X\ZšS-u‘×Ěz:YPea¸UP®‰ú ÄÓ]SHTj9µČĘ+qmÜ$ť˝€ň̉­JzďX„Ěđ:Xé,ČôTýď»uhů 3NřVŇ—6ÓV×2 ‰"P~/&§±ęŰ®>}ađ8±Í5ľŔ”ňD-(AŮš˙űRÄ?� p3‡¤eA.ćpÁ ŔR˝ęlAaM© 9Źyk?F?ßşśnŇî+jĐ5mµB”U-ékMÍ*¬?Ů ˛a–X)őa+JDa®‹Ťc7Ă}?—fć•ńosÄd%Z±´H6뇩p§â¶ŇýΫhłw.ä%±łáv°ń& “=>â&µµ6ÖÉch¤ˇLز$‰ Ä„ ŔĺhÇľš/V P†áM»ś¸Ŕ°Ś áÚ6)iV¤PjŢ8cÍLĹ ;ýß˙öË˙űRÄM� „k/‡j,&´Ă(bÝ"ŰćU4hguD8ŃH—cčTŘđŠ['‚PâÇ,bËfé5yš: Á–� ‡ˇEÉEa˝¬[HŃiłĆŁs­o|߾ͿoŢ'ť<B„´őĎ8­-۬¶ľ™Q аŠq%1‹†ą[R¨UşĐEe & ‹ń�¨˛¶˝Ď ›<Á!»Nž1Í.3=ˇ>‰Ýţ˙ŽŰfň$ďž@ŁąóŐ9r_ż†\0=Ebhč Ś„˙űRÄ[� lG5ćjÁI†¦pÄ™�"PŘh`6 $‰Đŕ~‹€;b†@`Ú† Áv 5BôRŐ⢷‘`yhIQNÁTËžűÎ,¦d^Öćz.Ł®…/×jU•™â ’6Ń$ `% iDr(VS?'—ŤC±;XŁE[ďY*—şE(ŞŠj>pŮ”ŔÎŽ ćŐ 4¨Ěű$U@• mJ÷7ţżű_żő*%DW†D.ŞTÄ`Ř–ÇŔ콓°Tľ Ę‹Ç0¦mp§F5[˙űRÄf� h91†$hÁGŚfĽÄ ŘHç{Uά7ŘŹ”é˘Řűo«ëaO"ˉšęaš˝KÖ,ÝiWŠË‹I 9 ŰíŘ.ęL×5šď"­” Ţ-§T<¨E Ó(©< `m·#’N#–…öś"=©ÉP 7Čf¨Ę EŤ8ę‡^˛.’r‡!ďĄĹÜíŻ[˙¦¨łnSSxžĄ0ť UNY´iČ �Ł9‰âŚ~© ÔęeIĚ|fŕ(– 4(˘śźçşäĘ|Ő´đa’_ĂŚG%>• ‚Pś˙űRÄq� Ü­3Ć PI ćpôŤFŤĎhI䬂×â ´QuŻä’›¤˝dQé;ľy»JÜq[c®6I�\KfF`ŕř°”¨9@$“†Î!ă*$±ň|Ňô¨żFÁR(…IEAĄay :Í› )Ő,V1•˝n°ş^#,|Ź7C—Â+Ü0ókrőΠ)i+«Ö`˘µ%=%¬�ŕ4:?Xłâ…#Ú#•úŞŰ+\%ĄS0ŢŻ"‡ J„×"Z1GŠh8 ą’˙űRÄz� H1§mA‚ĺôÁ€!űd¸łś…Ś­(R[qµˇ“q¤ţ¦$âŻVşłbç×§SÖÜŮĄż!¬W3}#TJy|JN8B¨âhń ŐE¨6Ë“*Ŕ«Ü «Ö˘uKzĐ<ŰRĐÚ ?Ô"sŞz·&‚ä×§µWÚšˇőÓn«ŃdŮA{:ś$® Ía’t*ĺxʎ�ô€ŮB‚<X]3®I‡Áô $ 9-XăÉX>%JJ‘8AŕP˛F4Ś]ˇÄ¸Á; yç˙űRÄz€ Üc/†rA_fq‡¤ Ü«"V%ŽK¬¶˛O]ÔC^´­‘ATś–ÄTĘ*+K’9vT ‰”Ú¬QŻ,´’÷É„qjŁľµMF-2.ʧE‘&ńĎ"�".±ĂK|ą°Č¨µ,Ą6´“ R/>bő/[ş?ZǤý‚®taglib-1.13.1/tests/data/lame_vbr.mp3���������������������������������������������������������������0000664�0000000�0000000�00000010000�14447736377�0017337�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����JTXXX���#���replaygain_track_gain�-1.020000 dBTXXX������replaygain_track_peak�0.920032����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙űÄ�����������������Xing����3�üř,�  #&)+-0369;=@CFHJMPRUWZ\_bdfilnqsuxz}€‚„‡ŠŤŹ‘”—™śž Ł¦©Ş­°˛´·ąĽżÁÄĹČËÍĐÓŐ×ÚÝŕâäçęíđňőřűţ���2LAME3.99rŞ����.'��5 $@A�Â�üř,u?—������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙ű Ä�Ŕ�ţ��� €$@��‚ šŐE(Ń$�fq ňY={Fă1Ěd°Ő.6 Ç @Â{vözîI@>¸„úOâ{HKäĂŕýÂ�BČ~>Á�ÓúÖËďě8'|>‡ĺűĽ1[mÄă’I HÜ Î&-fÜľK/iť:ÝaIĽ\«¦…&Ą)ńT,ęÂ’Ý˝J ¬ÓÓ]s‘$±I$KG¬«‘‡Î˛¤+’AżÓ”X`˝TQĄ‘âťk?¬ĄsśĺZŢłźĎTŤ{޵¸™i‰Uľň+°ę>|äúgKô_Öýeó±Ú¶Ë,µ¸Š@�:&J~ŕt˛b=/BaÖ “%Ŕ$E‚ˇÖ¦ćëÇ*OšĆ&ő0(¶¬72<ai”-Q,łëCírV«j.…*袮>±ńËú˘×°ţĹďYľ×!_®–%T¨s9cYA«[B äP?î1^ˇwÁâŘM'#=ÄX° Xz ‰U4QzJh*´<Í éäEú)�éßy¤[“Óe5öQÝąě‹U›}îHă#+‘ćŕĘAř‹ÎĺLŞ.TňDË×&L~7˛AýŃřKü|©>OIű ’ŤÄÁl4…Ł™}B÷Yčő%űuěôkr[v­*ÚD„jÂ0Ö(€D,ś/ą TvhläŮu-tZ{”fG˙űPÄů€ ܇'FÉÂŁĺuŁ%ąůQŕą›f.xö†Á–©FÁ§X” ‚!µąJ®Š•ČU3Py(·úޤ@îAłŔd5ŁM0TŐb–ěĺ͸‘H"eYŤ 0›Nu»ţăHPăf*‡Ďťmöłţ)¬ăŢâUüj™G©ĽŹóů"ű ›0ąI›dţ®VeęŹńéydlűĎg'É#6÷""ďŮ‘Š%HiÍ\˛Ó*¸š’4€C‹„‡8Dz(ÂQ%.ł‹Ť<X"˙űPÄč� X[1¬0ÁA=‰&pöŕžXČ6!PąT®ć€ ¨Ŕ¸dăŐcŔ˘É@±’ĹkÚŤ¨!x`űîŠ%˝ľâ´”{ŻĎôŐV×,r|ŞF]'s(Ť¨I=˘``n¶ ” YsúgĆZ|4—)‰Sl8*(šN´]­S<îL4ţö:,¤†*ęĄmM̡rb PmęX?[n–·#M ^. „ˇwYc<ŐćŇ3ž$„•«zOžŮťŚz“:Eť{ËE˙űPÄđ� s9§°czŽćtö xÉm–·®eŽĺXjY'ŚŞLł€őp,tm§Ú"»_îÜŻůQFĚ“ .Ĺ —Kˇk,‘ĹD’RNĆO8› )jN”f¨BxpIŢgŢŚ€PMćp]ĂĹľ§„Ĺ^Mĺ–R\Ť#_XěšVyĘď6UścŘ�MrzűÇN&Ińq‰ô­dşČěm$B+Kh”î•’Zínkƛ熉¸Ú8´‚ú\,0eą3—ęJp`8˙űPÄű€ ů3§„Ya…¦0ó$ČłjĄáÓâÂV ¨¸eŠQPÂgM6YËÎ{j˙<,HšbäŢxO—"±*rËm¶ŐJ4Í'Ľ~$BĂ’rAÖ §4^jĺÁ)¦b–Ó ˝-pĽ&Ą„T „R!2Lµ†ě ś Ř6đ d Đꚯşá®”“<Ë… )ëXŃ/±]Ą˛Ç"¬ Nf­ řH`!†-iŰąÄög‚(ŇťcpGżŔTm—° —%Xô*@©ß˙ű@Äü€ A1†<Ŕl¦tó pjiI}ÍěR«sEU~ĺ kťťIRśůB×é˛EdŠk˛„€Ś’G ĄW ôšBDa)¶ł>ŽQÁ ĐŰťôO9¦oŢ­ůĆ]{ę5\ädIEygwzľž©Ű–ű+ďÝ®Ç'=ŢŰ4S˙Ű|ďŠ+n÷/˙uľ'ľY±˛Ëd‘ČŮD€*SäĚ‚‚˘Y˝QłW9ÝĹ2ĺf(¸”ä*…|“>â˙űPÄó� äE3§°Ŕr ftó */Ľ˝Ć_ö Çlr˛DÚ,8q$J ˝›Řdśâľ’L[ťGÓ÷P„\vaMâšjß}}ÖGšm$ĄŔ€ Ő‘Ę…+^Lľ‡3b’[d]^ŞjŔŢ3Ó.ž{Ă8'ŁM ą.I%Đ7*Lr #”nZÉŮZ›G×}wŮbëÔ˛FíŰ.¶®ęQn0ý*ý¬†‡˘T♑ä@h [Xˇ˘a9ĹÁ ˇBF…ç ˙űPÄö€ X=1‡°ĂM ftö `�\€ XkrH©0¶‡ ÚÔ,r…ńJ“Ţ­™3Ă,c5<š…^taglib-1.13.1/tests/data/longloop.ape���������������������������������������������������������������0000664�0000000�0000000�00000000270�14447736377�0017457�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MAC –��4������”���¬���ŘTc���� 2�´łłłłłłÂłł¬łłł�łłłłłłłłłłłłłłłłbŕ�Ć�Ł© �“Š �ßI�¶�ýšu0� AéřÖNŘ9íS‰Hërj1g MonkeyEs AudioC.fpe MompressionAPETAGEXĐ��"���čô˙˙˙��@��˙˙˙˙������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/lossless.wma���������������������������������������������������������������0000664�0000000�0000000�00000301305�14447736377�0017517�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������0&˛uŽfϦŮ�Ş�bÎlw���������ˇÜ«ŚG©ĎŽä�Ŕ Seh�������ţÔR|tL§Ę¨Śu?Ĺ‚������Πx“Đ�������PLç����ŔS����¸ ���������^4��^4��Şď�µż_.©ĎŽă�Ŕ Se-������ŇÓ«ş©ĎŽć�Ŕ Se�˙��]‹ń&„EěGź_eRÉ�������ęËřĹŻ[wH„gŞŚDúLĘr���������� �����I�s�V�B�R�������4������D�e�v�i�c�e�C�o�n�f�o�r�m�a�n�c�e�T�e�m�p�l�a�t�e���N�1������.�����W�M�/�W�M�A�D�R�C�P�e�a�k�R�e�f�e�r�e�n�c�e���Z�����(�����W�M�/�W�M�A�D�R�C�P�e�a�k�T�a�r�g�e�t���Z�����4�����W�M�/�W�M�A�D�R�C�A�v�e�r�a�g�e�R�e�f�e�r�e�n�c�e���lZ�����.�����W�M�/�W�M�A�D�R�C�A�v�e�r�a�g�e�T�a�r�g�e�t���lZ��tÔßĘ E¤şš«Ë–Şčů �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ËĄćrĆ2C™©iR[ZX�����������������������<�$������(”�"������?4��������}1���������ß)âÖÚ5Ń4� ÉIľ"�������č�����@¤ĐŇăŇ—đ� É^¨PH��������W�M�F�S�D�K�V�e�r�s�i�o�n����� �1�2�.�0�.�9�6�0�0�.�1�7�4�1�5����W�M�F�S�D�K�N�e�e�d�e�d������0�.�0�.�0�.�0�0�0�0��� �I�s�V�B�R��������(�A�S�F�L�e�a�k�y�B�u�c�k�e�t�P�a�i�r�s����r���Ŕ]��­[��0u��şF��ČŻ��Ě*��â��G���Â�Â��€©�����0W����� ˇ�����# �����@B�����Ŕ\����� �����@KL�����€–�����@Rц1Đ٤� ÉHöâ�������ARц1Đ٤� ÉHö����!�W�i�n�d�o�w�s� �M�e�d�i�a� �A�u�d�i�o� �9�.�2� �L�o�s�s�l�e�s�s���5�V�B�R� �Q�u�a�l�i�t�y� �1�0�0�,� �4�4� �k�H�z�,� �2� �c�h�a�n�n�e�l� �1�6� �b�i�t� �1�-�p�a�s�s� �V�B�R����c‘Ü··©ĎŽć�Ŕ Sez�������@žiřM[Ϩý�€_\D+PÍĂżŹaĎ‹˛�Ş�´â ��������$����������c�D¬��€2�?4��������������ˇ��?4?4��Îuř{ŤFŃŤ‚�`—ɢ˛ ���������Şď�6&˛uŽfϦŮ�Ş�bÎlÄn�����ţÔR|tL§Ę¨Śu?�������‚��]����-����?4��¸ ����ü`o��9@Ö��Mbz”:¤u5*S*ŁUB¨Ő,¨%4)CIęMŠ]`Ž„M!(ýŽ|Đˤ˘Č°sE¸CÂŔ�˘b9)…}¸ŘŠy1šú+©»¶;ąŔđë‰ÜZ㸽Ĺ.!đŻűáą[C®Z…ˇ™©“Xą×vÍŐŞ/5$”Q‚0´(120GY(´Ě3Ú‚hp‹(đ’©Z)˘›ÉĚť)Îś)®Éf“hü‹čv‚§¬ŕ"ÄLčɡ„€h)Ʋ,ł6ĐtĹae\㬵žtľ˛Ů›“}đwńońďń˙ń—p§�nŤ›«4fhČfě°i9ž8‚bP¬2Ä18VFáđ‰&ОđŃ9ŹÄ(‹*^NŞ!N*Őz±ÖšÚ[«}m­U–Żb–Oé‘"˘do$€Đ‚ ¤/ C‘G(–Í'tJmfÍsÁ1\Ł;ÔöŽĆ9gBęÝ›»x'‡xżŤř÷Žé­%ˇłĆfĘXóŕ[šÄ©'ůn5„"ˇ0D„pčX5 KfÓú$”'ʢҿ±FĚš KjÍu°6&ÂÖšŁGg,™ŠŻ‹*’–ˇćâx¸‡Â p�d& Á °¨|^?Wq†Ěj·ü—KÜřź5´îÜ …ń>/ĆxĎáüxŰ5Ť/Ć/ÖJLŞ"Ŕŕ . 2,,,0:DVj‚G'•KfŹfÚ&­°m[VŮłkšfm_«Ó¨s°!hQHX€ř( Ř�xa(!XčxpáF—JÖ&f®ď›Ńëö»}ľß[ˇÉŢŃÄĄ€  ČG$L ÓAĐDč‚#…”ÁBśP€PA� Ä *R(.„â.@­‚ˇ™4ÂFŁŔA±D aDîVĎÁ|“¬5¶»_˛üXQK!€ň�§AŇŚCĂ+@ź$žÉł¦<+Đý ŐşĂ|3ŇĽźˇu†xG`€首łŕŹö†8Oř˛w—kµůGÁ}xNÇł= A)I‡*ě |#Á}éľ™đźeôs¶ąGAěŃÉ*ImŇ€ôMať/ĄxOłř°ü“ĽąÓ\+Łä<‘lĂ…rˇ-�«)äĽŔ »u—<8ĺžXí>Qä}�·jÉl<#�*Ńň>@[¶ň× rĎlřW”ú?Cč�\SNGD[Ń—ś '2ݸӝ¸Ű|·Ë<«Ąôźě»ŔQE€°Ř 0Ť%ŕ|‡Ŕ|‹ÔĽKÍ<[»u‡s¦´¬§g ĐžD8�čSjŇxO*ňŹ)öňCô!ôB晵ŮŘh4(łłÉlyËÉz‚ř/˘úˇú ú@@�0H”Z(°ŤKhéŁÂĽ+Ę˝+Ę}+Ň}'ÁöŹŃr;†A°Đl9G˘íŁÂĽ«µvÇ–<1Ű/–ygJĘđ»T˘QH¤Yŕňz=źé'Â<+Ę|§ŇĽŁĘ|§Áö]±Đ…2ŠEžG´rŽQÚ|§Ę˝Łá>ŃíŃčüź’đ]‡�±M"NŹ ÉĺO)á§´vź)đźIňźHň~Qŕş.G€ �˘NŠŹ(Ň6žĘ{_•řW…ůW•xG„řGgŕů.Gc°ČŘŮŇeRÄłâťK¸�{§ąz€u-Ç`�d’ÁaFW•ĺś·¶ôçntă.4ç.2çN0ŐłlR ‘Ee‘Đl9�s.`^)ć^%â^ićŢ­âÝÓ¬9¶­ŠTśťťžOG¤p|#”v®Ńá^×ĺ=ŁÂ<#Łí—°ĐdpTPI€�±đ^KÁzG´zW¤řG„öžÓŇąNѓـÎQ�Ńv]Hđż é]1Ó=3Ă<5¦rÖZËTÍ1( " •Ç%Ę8V—¦öç.˛ń‡‰x§©zŹ€đ]ź„ZbÎ ŃTąj{>‘Ň»c–xg†öă.2ë.iÍ:§Qŕx,”˘)04tÄŹHŇ´ĆZĂyw—‹x·šyyŹň> c’Łś˘vt©f˛í§ĄňÇMňß éĆśáĹ8—0Ńd “2u”SÜô|#k፵·s‡yx·‰u�ŘđŤ"•J›TK–ٰđ^ĺ=§ËđĎMpĎ m¬łlË0+8Â#(•FŃ…[ćŢ%ę>äľí>“á]/•éyb™–'�X=ř�€˛ł”FÇEÂ-4şU3Ě%°ÁŮŇÁ†K¦¤�xz|_«ĆuÎ7ŽëqĚrąáÁ«qaÄ«[=Žź‰ë<_«ŐÔÖbâÂČ)©x11qk+k»y?ŕú>€~ʇFL8•*Ő¬¬Ćăšî¶ąŤÇ5Ţ9ŤĆă5š•pӆРCS«‹­ăxŢ7ŤÖńśg©‹‰©©‚š)…".-ZĚmf;Çxć»®qÍn3¬«‹‰†š!L\4âë5šĚf·®k8ÝoÖqšÍ]LJh8Rt¦'ÄřžŹGŁářÁôü Ô„Ó§�č>€~źŁč…ňú?�Ar@+RM8ppń:tő<Oâü_‹ń=OOOSŁFÁµq1qqquťg¬ęőzľ3Äéęřś=<�&Š‚Ř[[[ŽW1ćą®cqşÝf3‹‰©Ă€�§ Ôšś>ÓôýOŕý€»Ěn-:th�¦.8xzÎźâř|>‡â|>ôx�'� 4ÄŃĂŕđý?@/k±Çć9­ÖqxšYEŽ”ĂÄéđú=Gŕívą[şŢ3SJ` )€®.§O§ŕř?éy\ĆUŐŃĂŇtu  bpôôx>č…ívą\¬ĹĆ`Á¤ŕ'�C§ �źŐĘć»ÇuşÝgĹâu88�áJ'„ᦦ&łŚă8Î3ŚÖőĽgÖőxşšhŠtĐ:[[Y;ŽW1ÜvąŽńÜw[ŤÖbâjS 0hč�.Ŕ^×ay^cµÜr+µš”ŕŃÁŕEĹŐÖjőxÎŻ‹Ôń=_G‰Đ�đ  ž�F�^ĆëuzŢłĆzž§§áú~č4 ҡŔŔW[ĹÖqz˝_SÄôř~�ô©Ŕq5:ťOáô|?Łđ~�]Šć-]NhC ĂÄń=?Ŕ^Ŕ^Wkşî6łW‰©Á ś)A84px=�•î;Ż1Ýs\Ök8Ľ^ �@Ô:0čôą? µČŻ5ć9Žăqş¸ş¸tč�Ś@đ+k•ćĽÇkĚw®cÜf˛®%M8hÁ‡&ť:xť_¬ë<g¬ńzÎŻ«Ó§NŠi€¬��€úžŹ‡Ńéúź§ÓŕéđôhÓŁpéÓĹâńxĽg[ăzÎ3WY©‹‰‰‹†Š4ŕŔ�ŕđř~Źđý/°ľ×Ęö x[@�¤+MLLM]^/[ă:ľ3«ă}_«ÔááááŃĄi§N :}OGGĂôý?Óô}Ŕ>XD"Š4ptx<Ńéř=Sčô|>„đxzx0¤<q8şÍoÇ1¸î9\®ăąČ[88pT¦ť88:xx}g¬ńž3ĆqzÎ3V‹VMMJpń8śN§SÄőž§©áő<>žŽĄ~�!Ą1SFžŽĐźÓô|OĐ>Ź…ěG€ Î 4·N®&3×+š÷cĘö�‡ŁE8•'ÄÓ§YÖőĽs[Ç5Ís\×1¸î2¶€L žŽŻYÖuĽo[®qÍs]ĆW+k ÁD8µ•°'ŕ��?�?@řŁÁÁ§F4DŮłąęö9­×uŢ;®cšćą­×8Üf..&E\5jââă1Î9¬ăśs®q˝gë5x¸paŃÁŔVĄ\]f·\ă5śf·ŤńĽfł‰ĹáÄŃ *a©‹ŚĹĆkuÍsŤăšć·[®bă1qq(¦R¬+‹VłYŽqŢ9ÇuÎ7Y«ŚââjéÁF‡SM8ś]^3WŚëxηŤëzÎ3Y¬ÔĦ"DIŔ8z8xzśgŚâńxÎ7YĆë1ĘĚeeI†¬J•°ÔÖk1Íw®Âě/gčú z:ztQ šŤ:u18Ţ7ŤăšĚn3®cqĚmeed�銵k+`Ř^Bňö˝Ż'á{Ź'Đ=,«��ʰ¤đ¶¶¶ąŘŽăµÚć;[ q¸Ę•pÂÁ tx>đ}@ú?ŕý?GĐ>G€p¬��eJ±ŤÜsŽëq¸ć·ŽqšĚ\L8pQ‚NLL^.ł­ă8Î3®uťo­ë8Î/Q�+GOS«ŐęřĎĆqś\]eJµ*Ô€§śMN'‰Äń|N§«ęxž§©ééđh�¦t¬jęquu:˝_Äő~‡Áŕ”ŕŃĄ1154ńzzž'§Ăéřźŕôú}ÂÚł…!eYŁâtđő:ž/‹ë<OĹęq:śNLLLJ••g x^_‡ŕ?GŔ>§đü?@đGFŤ�iYŁGSÄń}_Ĺń|NŻW­ńxş”Ó S‡S‰©Äęń<NŻ‹âxž'«áŕętpč:Đ\L]g¬ăśoëzŢłŚëzšĽ^&ś4`)Ó‰ŐÓŐđő<OÄř}>ŹÄđ@�"S§ŽŽŹŁŃđý>đ§éř=?O€ôŤ�Ń pptřž'©âzľ/«âu}^§‰ÔŐÓN$+8q1uĚs\ÇuÎ<ÇuÜyŽW1ĘĺYŔ44“ĄµŘú>ĂřŃđüŹAôtđč8p࢝MMf®łŽxç®qşÝf·Y¬ă1q*bT€¤ÁŃÓâzž/‹ęü_Ĺńz˝^¦&¦�§¤�Ĺéń:ť_âőťf¦.®­Jµ €­Zµq¸Ün3×8ç¬Ćjë1154ęh”S‡€č.×íyŻ+‘Šî»Žë+u¸0¤DĐ4�WŚÖbń˝gÖq:ť^§WĂŃÂĘ”®�čÍ]<>/§Ńđ|€~ň»YR¦ P‡GPčč-­Šć7ÖkxçYĹęôęu~� đ”§�â ŇÚĺs]®ăcśn3[ĆjbiÓĄ'č<ŁŃô•ív~‚öĽÇ‘®Wk+u584µÜf·Ťă5ťg[âő|_§ĂŃ´ Ŕ§OG@đ˝čü�~Âö˝ň»ŽVVâTÇF€:}>źÄúéú~źGĂčôxG�ŔpÂł‰§OÖńşć·\×1Ěw®cµµł `˘p¸µkkµĺy^Ŕ^O }OŔz880ÓVSV¬ččéęřś^łĆuśgY­ăuĚemXV Vµ••ć7]×8ć·ĆńĽgÖjéáÓŁŠ&¦¦¦®®ŻĆqη­ăzÎ9Öc5•*SSť�tčř~ô~ŁčŁĐ<�ô h�ŕŕáń<N§SÄń|gWĹęń|g‰‰S 8páÁ‰Äń:ľŻOO‰âxž'«ęôő8thÁ€¬,ĆU…¸ÚÜsŽëxćąÇ8Î3YĹÓ§+ĐMM<éřŕýô˝óÇ1•)Ó‚ʰ¬Vcšîą­Ç8ďÖk5¸şş¸téĂ‚ŠpâiÔÄăxÎ7Ťâë5uxÎ3Śă1550âbN‚ʵµ°áy Č ÜyŹ!v#±\…jT¦DCSN§©ÖxĽOĆzĎĹńť=Nť�ÁÁĄjµqšĚf3[×8Ţąă|oYŐÔâiÓ hÁ®Jşćł[×5¸Üs[®kq¸µjT¦“ť:qx¸Ţą­Öëśw\×qĘî9Žcq±Ł®%\X[ŽW+¸ó®×ócĚsÇ+1aJ()ÄÔáééđú}ź‡čř>ʧčŁ"%M:‰NŽ��ĽÇkµÜw\ĆëśoĆqq8tp‡OG@ôň#ÚňĺsĆVbâQŁQtŕY[Ť¬ĆăxŢ7®uśgYÄáééčŕŕŕŕŕ‰Ă¬ë:şÎ7ŤÖńÎą®k1¸Ěef,)¦ĂĂÄęjńšÍo×5ÍsĆĹr˛ÉŁk%!l�€˙“ářźÔő:ľ3ĹŐÔĹŦh<téÔâńś^7ŤăśoăuĽsY[ŤĹĹ©Šq!Yѡ8zľ'«Őă:Î3ŚÖő¸¸Ęµ`jUOS[ŤÇuÚĺyŻ1ĺy Éř= đথH�>'‡Ôń=_Őő:ľŻS‰ÄęjęS‰ Á‡J¸ĘÜs\ÇšîĽÇqÜyŽW1ĘĺX�ĐpŃ!X\…Éř�ýŁô~ôô|>ŃŔ 8(jT«ŤĆŐÇ5Ěs]×uĚs¬­ĆbÄJ€� Ń?Wk°Ľ€÷וĺy b2µ )@N„ô'ö˘?«Ü{]…Úň»ÚÚĘʰš0pçOSĂáđz>§čúđ~đ|•"�Š4t¦.ŻW¬ń<_‹ŕđý_§ęü�Ař~ámf%Mppt¶ą\ÇuĚs]Ćë˝oĆqu8xxx5�ҵ)©«Őń8}_‰ęz~'Ăđüđz(Ѩpp¦=>ŹÓđ~Ŕ?@ü.ÖÂÜf3 čĄ14pôřÓđ}@üKłéw¬«‰§I4iáđ|ŕý/qĺyŹ1ÚÜn·RŚ4ŕ'§§ĂáôüO‡čřÁô}‚Ú´ÂĂĐY«WĆńśoYĆőĽ^Żë:ľ/ŁGŚJuqśf·®ńµşÝs×1¸Ün2­I âM4ÔśOă:Ţ3ŤÖëšćą\Çk`ŕjÄÄş`‡N§­×5Ú󀼀€đđé©$4ÍyŐőr}čř>‰éřľ'W«ĹŐ«�•f%X88xśg×8çÖăšć;Žc¸ä�Æ 3˛ŕđřž§WĹâńxÍgWY[ §S�áÔâëuÍmv» Ř^ϧáôôőq1`….-ÓV¶O‰âřϬăxÎ7\Ĺ­… &$5g˛ą ÉřÔř~'§§‹ĹĹĆU‚¤Ĺ¶bÖĎ©ŐŐăxć·\Çó€OFšgbĺ\¬‡˛ąÓčđřž/W­ŐĆcaléÓSxj×+łŁ§©ă:Ľgëśn;Žcx4B¶¬©¦%d._ář}ź‡Äęuxş¸µaÄś8¸µ°ttu=OĹęőz˝oWW[ĆUĆU 08q•kk•ÚňĽż€ř�řŁĂáŕu(‘¬ĆăqÎ;®kĽsŽëšÜf2®-0ša4΢ăqŘŤÇ8î9\®cšîąŤ¬«RĄ0š«V·\×qĚsăşć»­Ç8ÝgĹŔ!8šşşÎ7ŚÖń˝sŚă5Ľ\LL8hŔ8 µqušŢ7¬ă:Ţł«Öuzś=N )†ť+S§OOG§ář>��üĺs S�‡O‡Đ>ř^×µä/1Ęć7‹©¦€=aáéôč.Âó×k¸ímfłSNťč.Aáy>€ý@?á|ź�€GF€4¬ŃŁ©âxľŻ‰Őń|^ŻW­ë8ş•)…)É©ÄÔáęđřť_Äń<OWĂŃÔččĐt­1M�+µĚy^cÜwc¸ć»Ś­ĆââaĂŁB%x8]ź�ú^וĺy]Ç­ÖbęaÁÁÂ(Ŕ<Ürą]Çk•ćĽ×qÜs×1k1q(ÁŁ€ś8tčáčđú=>ʇę|ź‰đzŔJ(Á€€� ý'úżęó×íyŽW1¸ć%J€‰ŁO‡Áéú>ŹĂř?ŕéy]®ÖŔVM4P0hÓÔéŕęzžSŐřž§‰ŕééčĐ4ц¤�tpttřž§‹âřż�ĎYâőťgŚâŐĹ©0S80âU­…Ř>�>ô|O§Ôřľž&Ą0 Ó‰W\…ĺy�ü€~'Óôúź©Ă¦…!YŁ€pôřž/©âúĎÖúĎÖu5xş¸”ŃN& tééęu<_SÄő|OYń}_ĂÁÓĂç ŔZ”ÔŐă:ş˝gŚńž/Śń|_ĂĐť Pphjă5•q˝oÖőś^łĹęřĽ==<�h�t­\L]^/WĹń=_SĂń=>ŕ�Q4hŕŃř?KÜy^cÍwŽkqu(Ŕtpś<S‹Äęřľ'SÄő}>§©éđř|�­aáč,ŐĹĆqĽg[Öuž3©Ôęúľ'©ŃÓĐFŚF%:¸Ýn¶·ÖĹw]Ç•Ęír¶Ö@0“M5'đôpő:ľ/YÖuśg¬«Ś¬«Ąd3‚ĄdÓáęu:˝g­ă5şĘÝl-¬‡3VŃÓŐđń:Ďă8ή·ŤÖc1•µaH4iX ŔY[]Ç5ć»®ëćą®kuÎ7©©‰˘ŚF&&¦&®®ŻĹëťo[Ćőśs¬ŐŐĦśMtppĐ]áúŃř~Ź€|Ź@đzx�Ŕ4 Ž'OWĹń|O«âuzÎM:š”S A§ ]^3[Ç1µ¸ć9Žcî»[\¬ž� JĘłÁĐ|>©ń}>§‹ęúž/S«Ă‰LD…nšb-ef6»®×b=Ç•î<×kµČ@ÁR¬Á .×!ú~źÓő>G‡ÔééęiÓ‰R†š˛čO‡ář~ő?éôú|==<0E1N&&.®..7ŤÖëšÝn·\ÖbăxĘş¸”áŔ�ŕ)ŚĹĹÖqxŢ®Ż‹ÖxĎĹńzzť<,ś�"Q)ÄÔÓĹë<gS«ŐęxxťN݉ÔáŃÁŁ51•*ÂÚäúŽ×!v#Úň» °»\­¬€��ŕŃŁ‡NŻYăxÎ3ŤëťoÖkśn·Y¬¦hH+ťJĘÚĺy�úář>GO‡N&%Zł8•++++kkî9]Çíw×uµ¸Č‰LAJŔSS‹©©Őęř˝OWÔđřz:€š0h1q18ĽN'‹âx|OSÔř|>ź�éeXEzH‹ŚŐÔŐâřľ/Śń<OSĂŃŕđx�ŕŕŃ©¦¦ł‹\ÇqĘĺyŽ×kÍy^c+`,@ŁMJµku•¸ĺmw]ÇqÝwĆĹs Ő©R¤*ââââë1xÍoĆqť^ł©§‹ĂĂ éZh áÔâřť>§§â|?OŃô~Ąä.VU§‚ti4iđô𠽯k¸ó×q•Ľf®ť0p§Ł ĺr»®×1Ţ;Ç5Íf·¬ÔÔâpčP8S'‰ář}OÁř?�ú^ÂňąYYS�Ô:�C @ đäĄŘ^c¸óĆë5şpáŇp•ljĂÔđř}ź‡Ńđ|GŔZ(Á€¦-4éÓÔéčđüOOĂń>źŕř…µ‘š4� Ä\\M^3«Öuž3Őń<_SĂéôtttš<ŕŕ�#î7[ŚÖő˝^ł«ÓĂŕđp¬A¤b'O@B<®×+šçëzÎ3Ĺéčč#€ĄpéŃĐ~ {ír+şćąĆc8šśNŤDĐ8R§‰Ôń~'§áô}OÁř>€]Ćâᢂ´S§@đzy]ź…î=Ż+ĘňĽ®×kjĎB%8pĄL8�Éř •ÜrąŻ5Ěn·W«§Ś€84hđôřžŻ‰âxľ'S«âq:ή¦&&%0Q©§žYęřľ/©âxž'NáÓ€hŁ@ččř~Ńô}?GĂđü>F€Ó8ś8ş¸¸ÝwÇíy^Ä{^Ä{ŃŕťJł ‡NŻĆk:ďăšís®VÂä)Ä©4ŕĂW¬¬­®WqÚóW•Úňą>΀4:"¸¸µk1ĚsÇqÝr»Žăšî2ąY‹V©3ĄjÖVW1µ¸ćą®cśn9­Ök1qq(ÁE8pâjękxη­ëzÎ3¬ëxÎ3««©©§M8gJNŽŕđz~ĂáôřžOS‡SS 3FśJ°Ńčđúžź§Äń}^݉ĹÔ«†�0BłFLf2¶»Ź+ĘňĽ€°KŮŃŃĂ‚¤ÓR qÜr»Ź'áü‡čú>G‰ááâjT1aŐ«:xu5xŢ7[Žëív»]€ŕ<LLY‰4Tť:xşçĆ×+µä/'Âů<<M\I†BË5jÝ51±W°|?Sâxť^łWYŤ…łR˛ĂVÔ‡R®;Ž×|ę}O‰âřĽ]f­X,IÄ­•'G¦łŤĆăµÚě/gĐ~žŽ/ H0Ę’˛@&3 °ý‰ęúĎŚăĚmlé¦T¬µÄZŘ ·ÔřžźÄęxś^/Ćk1`,”Á‚™Ŕ8śN.3ŤĆWu潯+łđÓâpá©� Ô«Y ar|Gµä/a|Ż ú^OŁŕř=FB°«V®-\]gĆqťo[Őęń5:š4čŃŔ ĂŁ€BĚf3¬ă8Î3¬ńť_Ĺđđřt�S"TçŁÁŕđ|?Áđřŕú>„lńšhÁ€pĐ “Đ>řčüđ~» ˛¬ŕNŚš‘[ Ęěđ}čř~§§ĂÓÆ¬”Ρ8šuśoŤ×5Ěsă¸î9]®AŃÓ‡ Í:ššĽ\f·ŽqÝw]×qÜr+•M�a§®3[[\ć<®ă¸óÇ+¸î¶«pQ€L:ś^ŻSĹő=_Sâ|>ź‰čđú|��S8�DŁŕ§§Ôôü?OĐ>€^Äv#qpp ŕ)‡§ŁŔ]€ĽÇ‘W+ć9®U¬Öb`Á�Ń hŃÓâxž§‰ęřžŻ©âúľ'§©ÄÓ‡ 3@Á‡SŤÇ1¸ís®×k±®×+µ“€h8i“ĄµČú>ŹĂř?Ńôü ú:x8 8(iÄ«¬ÖUĆńÍną®qÍn·W«‹L) ©XY qĘĺr»]®×+¸írąŚ«Ś©M4`”áŃÄčééř~'Óô|GĐŕřd)ŕ)Ł€¦<OĐ~ř? ÚůŹ1ÚŐĂ@tĄZ¸šť^źęüř>ŹĄŘŚĹÓ¤č q€ âęń8|O‡Ôú=đ}±‰Ł a:Tp®§O@ú^ă•Ěs\ă8ÎŻS§Ăéô"`C¨8G=> ČŹ+şó\ĆńÎ3Śńś===&Ť'@piđx=čĺyŹ1Úć»­ĹĹŐĂ€p€p®%L:xxz}_‰ę|O‡Ńđ|�ŁŔ‰  Ńŕ'ÁđŁč€ĽíwÖă5š”…1tętđtúžź‰ôü?OŔ>ź…ěG  DL4P4p�Áđ ~Ęö˝Żay •°¶­HDCŃ©ĂĂÔęřž/«âxž'‡‡§‡FśL3 ŻYÖuĽoY®qşŢ;¬®VÖA˘�bbă+k¸ä/!{^OÂň}଻pŃ U«YY]Ç5ć»®ă•ÜwÇ1Î7‹‹‰†ś1 LLLM]]^7‹Öő˝o[ŐëzşĽ\L8pčŕŕ+ ÂĚn9ŽëkÜs]ăšÜnłY©SMpQS :šşšĽgÖőťgŐă:Î&®¦¦¦ h¦…Č\Ç+¸ěG¸ó×ív¶l,…i€WR"Ő¬ĆkšÝfąĆńÍfłŚă5u8šštŕaÄÔĹÄâëzÝfłY­ÖqÍ\fł &°Uť.× ú?��µäGµÚňą[[‹R˘N<Nť=N§‹ńžłă=_Äęu:x4hĄgGAeel.V×qÚî<×uÚć»®U­Ä©M4Ó‰‰‡WN§«ÖxĽ_ĆxĎ«ă:ťN&€`ŕҸ®.3ŚÖk5˝oÖřĎÖuxśM:t (Ă«‡®.9¬×8î·Žkšć·Ś«RĄ0ś4iÓ«ĹĆuÎ3[®qÝs]Ćăşć9ŤĆÄdśJµjÖBÚĺrav»^cĚyŹ1Ęî9YV˘Âjbiáéń=O‡áúźGÁô}čú¨Č‰E)N•©‡‡ ô~•ĺvą®ëĚf.¦®ŤM� ÄÄâń:ž§§Ńčú~ŹŔ>—kk1tĐNŃĄ(ÁŁÁđ|Úív»®ëuÎ9Ĺâpđčq80q8z8ž§§Ăę|>WęúžźĂÓĂÓ@ŔV/Ŕ��-ĆÄr»Ź+•ÜwÇ1Íw[‹WRś "ŠGG€z>€?�íy]…ČŽB¸´Ń‡Ź/đżÇÁń>‰đü?Ăń=>ŽŤ4`Ń€`Ôępőzś^ŻW¬ńz˝^3Ćjjba¦N..3[ŤÇuÚĺyŻ1ĺy]đz\žŤ0Ô© Ŕ\®×kČ Ř Ř^ÂňµÚŘ€Ą50áĂ©Äâu|_ę|g‹ęxľ§SĂâthJTiâqxzľ/‹ń~/Ĺő=OO‡ÁŃáŕŕ+N C§…•Í]^7Öxž/©ęx}>Ź@Ő˘€GŔSŕř;]ÇuŢ9ĆńĽg©ŕŕč&Ť&•§�kµĚsŽqÎ3Ťęđń:z8�A¤b4p�[[ŚĆń˝oW©Ăáđř^@YR€@ ÉąĽ~ ţ…ÚÚď]ă1xťN@,äpŽSA]^'OG§čKÉü.cušÎ'Já⎩<ŕĐ;Ť­×:Ţł«ă<OSÓč¤ŕŇ�4pĺlGkkÜs]ăuĽf¦/N� ÇO‡Áéú> �^בĺef2Ą@_Éęö7[®qÎ7­ÖńśoYĹÖq8˝N:58phčđx>ô}đ~ř�/+°Ő´Q‡SOOO©éřźĂń>‡Óôú~Žž…jBšpččéôú|ĐźOŕú~đz>G€Ą`˘ĄJČ[ŤóWµĺy Ęňą>Áŕ�­ZgJD\LL]gĆńĽoYĆőťg[ÔŐÔáÓ�ĐLD§S‹©ă<^§‰ë<OWÄń<>Ť�˘Ś8@čOŃř>ř�@€ĘĘ´Â*hĂăńŕüzz}OO«ń>'©đúľžźŤtphŃŁ‡‡©Őńž'«Őë<g¬âë5*á„Â(©Łž'OO‰ęzžźSÔôú}Ox|8�&ĄJ0pő<>'©ŕđz}?Ăđý>O€�¦¦ŚzťO§Äřľź‰ęzź§ĂáčŕĐx(1ŃÁÁáęú˝N/¬âőş¸Ěef2˛¤Ă¤¸łˇ<Nł­ëxÝsŽëµĘív}�tôá…mXjUś:śoĆńĚn9[\®×+µŮč:jŐĚXtęă+!vôĂôz~'ÄčępéĂ�ÁMÓ‡Y »ŕ?čř=٧ĂĂ©ĂD‡Dť�tz|==OYâřĎăzÎ3W­eI† k!lÓÄăušçÇ+ĽŻ'ŕźO‰Ă‰q&ĂŐâk:Ţ9Ćăšĺw…Ř}>& ˘T“R˛âVÁéđőzÎłŤ×5ÜyŹk°úśMI¦ IR¶pń5qÜv» Ř�ř=M8Ęł�HysŘĘěő=O¬ëzÝną®×k°ęqjĘ›đ­«0Ő€źÄęřĎÖkuşć6ą\€p–śÔ€`©°ĽčOÔř}OS§‰ĹŐŐ¬R˛Ŕ—EJşäG•Ůô|SáđxťN®¦­XY Ó*Ă©ŤĆŔ>‰éń<^Ż­×uĘŮĐpŔa« :¸Č<N'WŚău¸ć9Ź+“čééÔŐ …rNJµ¸ä/+ä�}Äôń8ş°‰(MJÜrz<Ż©ęúľ'Śń|gYĆc1jÁ©R 8¸ĘČ łŕôAřÓđú}OSىÄÓM4âSMLLJşşÎ3[Ćq˝oĆuĽ^&¦8(Ń •*ŐÖc5Ľgë<oYÖuť^/S«ŃŁF”©E��?GŃú?A|…ě.Âî;Ť€­0šh˘ťMN/‹ÖzÎŻYâőzť^ŻS©§Fť8i¦¤�tŁŃčôúžź‰ęxťNž&šjB`D¦¦&3Ťă8Ţ·Śă:Ţ3ŚńśN&¦ś@q5xśN'WĆzĎSÄáđřť<:J)ĂÁÁŔ=?Ńđ~ĄöÚö˝évz jÂpŃaѧ§§Äő~'‡âx}_‰ń=>Ž8…“ĂŕđÁđý?Ăń>SÔđthŃe¸ĚlGkĽÇµäý/kČ Ů膙٬čŕ=NŻŚă8Î7ŚÖëśmn9®VAŃĂ‚¬E8¸ĚnąŽëÍr#ĘňĽÇ» łámôtiÁE1BÚŘ °˝Ż'č/'éy ĘěĘČY @8z�đt„ôüO‡ÔřžźSĹřľ'‹ĂĹáÄÄ«4é©SąŽW!vgč/kŘ^@�ŽŽ pÄJjB±EwŻ+µĺvĽŻ+µÚíml+J´Î”¸µ1uşŢ7Žkťn·Ťă:Ţ&łWNś‚b8u8śOĹń<OWÓń}>O‡ÁŔ4Ą:5ޏ¸şŢ/ŤńžŻ©âzž§§áú=�¬DŃ€Łžčř>ô˝źô~Âěü�ÂĘ”Ä:péÓ§‡ĂÔń}=OO‰ęüO©áętiŕÁ‡ +8Ť:ť^łY¬ÖńşćąÇ5µÍrąY�Đ)ĂV ‡SSWW[×:çăśs[Ś®c++jŔ0bT¬€tppő:ľ/S¬ńzÎ3‹Ćk5qujŐ«4D0®2�[ü�üéüÓđz| :şjk8şŢ·­ă5˝sŤÖk8Ě]]\8h…!Jµk"2#î;Ť®VÖăÝnł&§SSSSYĆqśoĆqśsŚŐÖőšš”áÁ€đp¬đ¶ą µĺy?KĘö˝®×•ĺrą[g�ÂÉ©‰k+5µĘÚ1滯1Ür#•ĘČ Ŕ 0âjëušŢą­ÖcuĽs[ŤĆU©V¤�q11kq•ÍwÇ+şóÇ•Ęó®cq~�!± ĚNť<:śN/Ćqťo[ĆqšĚ]eJµ*âSEŔ<ŕú>€�üđ�y\<�¦Ü.^>_‡ńččôú}>ź‰đú=áčŕ��J¸šÍ^/YŐęő|gŚń:ž'OO�.ś@čôŕú^×µňµä󭬬…q0ŕÄŕÁÄáčęzžź©đř}_©ęz|OON X��ä.×ň» ĘóWk“ô·V­5*S‰‰©ÄÔâqxž'WĹń<OŐđđu:84@č�®&.łŤÖqÎ7Žu˝oYĆuĽM^/N 0iÄęéęřzž'‰â|>źG‡áđ€�)ÓŁŁÁčô|?O üéú~OĂŕ=Ł@Ŕ4h4třž'©âzľ/«âu}^§©ÔÔÓN%3@Á‡S­Ćă•ĚmwÇ"9\Ç+•`AĂLDť-®@Ńô~Ář~ʇŕôzه‡AÆŠ"q*ë5¸Ţ9­ăśsŤÖëuqšş”QN��)SW‹Ĺâuz˝^źÔđřžÁŃĐ4čĐ�/Dő} ěrąŽkşÝs[‹‹«©‡Ť&)ŃŁ€ĺrą\®ăÍyŽc‘]ăç¬ŐĂF 8 u8ť_âőžł©ĹőľłĆuťM^&¦Ą@Đ@Ńôţ €Ář>Ź€z�•b�"aÁářú~ôÁřy Ęî;Ś«tŕŃÄ84­L]^.§Ĺń}_SĂń>OÄđx jSA: hĐ:[[ŽqÍnłŤă8ÎłÄâxľ'GB&šS@é\^'‰â|OŁĐ>€ Ęć9Ť«©€ôp 4xSO@�íy Ěvą®cqĚL:xtĄ1N'SŐôúź©ń=źOÓéř|…`ŕÓDD€t§‰âq<g‰ĹęőśoY¬Ök1•` 0˛âVŔ}==^/YÖőĽn·[­ĘŮŕ!Z™†®2˛#•Č^Wµě }�§ŕ�hɉ Đř˙›áôú~/§Őń:ž/‰‰‰‰R¤D©‰‰«‰­âő˝gŚęń|^ł«Őń8ś<<:0`jŐ«Y[[\Ç•ĚyŹ1ĺyŽăĚr@YR©V­Zµjë5ĽsŚÖqśgă8Ľ^'O�Đ ŕ�Ą\^3Śâńzľ/‹âúžźâx|��‡ 0 1šÍoYÄâxž'§Óđý>€ *`ĐGŹôtAv#µĘîą®kuśg‰§§‡ !a]L\N.·­âë8Ľg¬âjń58śM`µ1tÔâő:ľŻ©éń>'Ăčô|č,…i˘ ¤)‹W\ă8Îł‰Ĺâu<^§‰áčččŕ)¦•«‡S‡Ł úŔ��˝Ż!r+±[WŤ# BµqĽgÖjőzĎâő|]ř�†žžžś�"QÓ§S‡«Őń|NŻ‹Ôđő:ť_©Ăهjc!erą\źKČŹa{ŹkĘě.ÂísV€™Đ�ą “â=®Âň»ĺ{]Ż1Ěs¬˘p¬Á ÖN'©ŐâőťgĆőĽoă5şÚĚYÁ‚V ššşĚf7\Ö×1ÝwÇqÜlŮŃ é©D��<.AđüĂń>O©ń<OÄÄâa©�¦ĄZČ zÁčú~ź§Óčřžź‡F& +.šjUĆëqÍn9ŽWuÜs×qĘÚĘČĄHšaIŃŕ=>Ż«âxωĆjń¸µb,¦RŐ‡‹ĹĆc•Č]€ô|>ž'¬d.-lĹĆc}Óđúž'‹ăx¸¸ĺd‰†aśÁ©­×+ň˝‡đ}?Ăń|<^3W 2bÜIŃ‚ł ·ářźÄńťg[¬®ctjA‹ Hqqł‰©ŤĆ×+Úö~ʧáôřľ/ڬ•-[4ŐššÍsŻ'Ŕ~‰éń|^®®łY[˛¬«pÂÉÁÔâqťgăśw×qĺvÄčĂV‰ ŐĽ©ÓŐń|_[ă<oYĆńśgYVĄX�&M8ś^.ž/ŚęřĎâőzť<NžE*T«V˛˛·ÇqÚók¸ć;Ž×1şĘ¸¸`)�ŕčáęuzť^/ăzÎ7ŚŐĆk1jU© tń:śNž§‹ęúžžź‡ˇ<=�)E8tppt‡čřÂű?đ~§čÁĐ ĂEppđ‡â}?ÓčúźOÓđz:€tpiXR…qĚ\fąĆë5ĽoY¬ă5ux˝^' R¦ :88<OSŃéř=Sčô|ô�[RĄ8‚ mn9Ç1Ín·ŤÖq˝]^3«Ă§„ÄčB;^cÜv#ĘňĽÇk•Úä,­Öbâ` iÁŁŁŔ=�}€~ňk¸î9[ŚÄ˘ �€>éú>§ŕ?O ú~O@Ą`Ҹ•)ÔÖuxĽNłÄâxž'‹ęx|>G�ҰPphÄŐâębë5ĽoĆńşÍn˛®­f%J•j^ ôpO‡Äń|OYâx˝MN®¦ťJjU¸Ěs[\ÇuÝr»®WqÜmmemXR¦‚µqquĽg[ÖxĎ«âřľ'©đř<�ĂFŇiĂ©ÓÔń=>‡Óčôz>�ôz:J" :88��żA˙‡Ňö˝Ż`ěč.BÉҦ"F\ĽÜNŻ‹âřžŻ‹áń<^ŽžŽ �iĂ@ŕčź§Đáú?�����‚��]-��-����?4��ĺ ��Đŕř\ž–Ő¦‡¦ŚzťN§SÄő|OSĹő}O©ÔŕÓ‚•śĄ1554ő8ĎW©ÔđřľSÁÓáčééč0ęTĆbŔ\®Ař?��Čü`o��9@ó+FlcPÜÉv.ÚĽ(’TˇńŃ,ŁŕEđ—*(=d·ř7ŽY‘ŁZѶ;íĂn7ňŹš<řčĎLş‡ŐŞuK©9éAůÍËŢIń…›á¶šĺĄŮŃ”«6ö¸RI±#"¬P r QĚ ¶=H>‰Čř”‰ťĘ¤Ęz©Š°«ĘĽ«j˘¨j`Ł ř›©r’H·hvŤ)q'De‰P¸ �t"†±63OÔÍmiŢXOelďĄő¦ĐÝ\ÂÜSĆüɛɜ‘ÇüeÄ<˝6ÎşÓ9Ď&b[ḉ熠0DA8Zb—* ĂHç?Â1II‰=(ŐB¬ÖÎZëqp.şµVRĽUjU=¦‚OÓ`ł"†Ü!؆"Š"¨ľi;˘RęÖ}ó Çł \ܸW ćÝ+®öîűá+ă~?ä:Ni-ťó.RÇw�ÜUý==J±„ †Á`¨\0Ĺcé¬d: čÚbŁ««“cL©ś´f¤Ö› dl­Ť®56ÎY3_*BŤdˇH 5†Â �l.…Bâ1Hô–gŤĐěřno­ďő ‹oßx?âüoŽqľ1Ä86óµk&]‹_,TYD2$Ć‚�pl"8048DP`xJ¨Ö ć%•gÚ†˝´n–áµlvuŹ`ÉÄ)Č�,HŚ `lĽT¤D¬D |L<xҧÖŔÇŃÚáňyý~×{żŢîvz<ťí,JP©! tarL<�� Š"@I - F )@‚ 0hyD¤;@Ŕ ń-epO$36Ü[€J†¸± ,0Ü Ě ę B”ŃŁc•ř7’î^ŕ@â2ViPÖ&fZÉ#A˛EŁGŮö>Gä~Ŕć^)ç.đçMeť«hŮp ĐžE4z.@[¶°Î™Ű3Űĺ^‘čýŹdÝ*ŃŘ•E6ŚźČřCě��^ećŢmă­Ö\é¬1•e:- lpGe°č—j´ľUŇĽ'Â=ŁŮüČ{řĹ«ŕ‡$‹ ‡dĆXʸ_Iĺ^ĺ‘đ~Ëä~č=“ŠfŐŔlG‹-‡b»^Uµň®“á^“č˝—Á|Č{rÜłkÉä˛ZFcȰ'tďđë.´ăN8olm|'”r|‡XŔ–C“=—#ä\Ë›s—:s¶ůo–şc¦;Ohđ^ Ŕ±Ga 3Ŕ$»NĄržQÚ|“ö^Ďäľä~Cä>ą]#"Ŕ Ńląě\Ó™qN˛ďrëNvăMmťŻKÚ6z Š(4'EˇŕŞk e­3¶¸k–z_kđ®Óá °đŠěěrŚ€fZĂyq–¶ŢšŰ\·Ó<łŇůO ĺ—Ŕp%€Á"Ď%°ä< x§šx—Šx·Ś<ĺŢ\áĆ›ĂVcc‘Ŕ`rZ–Ďĺٵvž×éŹ é=§Ąrž•´i;+:D ŕ2:-á\/–zg†yompă–řoMĺ«fض)r¨ŃŃŕňZ—GáKÁ{?“ů?‚ů?‚ř/ô@{€੩ÇC±ä{ŕ}ÁüÉü—ŔüźÁ{/gŕ|EŔh0KE’Ę8NŐĂ3Ă<3Ă\µ¶¶ß e­5¦p»]*“'H±±Ńlv<‡aŕ|ʎů?“ů/’ů/cě˝đ<p:€d2[,ŽŹ„pžĘů_,t×LôĎ rĎ mzc*Âm6™8�‹ Ұ¬ł¶ôŢśéÎ\éÖ\ĺÎiÖaĹ3MRŕ4VÉÚ`6;FŰ9nÜ[Ĺ»‚z—¸ř/Eŕů=# ĄFG,&Y—>ÁxG„ůW…řc¶9c†vĆË4Í1 (ĐQJŁ’ŕ¶{W í­¸ÓśşË«x·Šx§�đ=ÎŃ*ŠDdĄ2Äp\#•m|µĂzoN4ď.˛ńn©Ý;€ň<Ź”Ŕŕhé4ąb[—.éę^Ąîń��Aň?!ä<C±ŃQĘkEiµÓÔ¸—P/1ö/sö?cô_Cđŕ». E‚łł´R)4«]±–°Ţ\鼸ӌ¸Óť¸Óyo,圪գł˘’”Ú)8VĘňĆšá®ĺ®Zá®YĺžYá[V“¤hđT4Tt›VL[k eÎÝoŔ,öŤËE‘Éhp8€X JbáŁOS‰Ôéń=_Äő>'Ăéđř|aZČr Ůôý?éüÓđú| :šjk8Ľg[Öńśg[ÖńxÎ3W‰«‡ ¤aXlú Ęň#ÚůŹqĺy]…ČYV«‰<¸ş¸¸¸Î3YĆńśgĆńu5ť\N&ś0µ)ŐÔÔâřž/©Óéő>/ĂéřžŹGĄb88‰§G€zŃôľ@čGµĺr#•µjbaÁF&Óáđđú}'ÄúľźO‡Äń<N§NŚ+0Đ<?Sŕř>©ô|OÓđú}>B°«‰‰©‰Äâu|NŻ«ęřžG‡ ôt�N4��˙‡Ńř�/öňĽ®@Śž(¸đäű?c¸íwÇuĚnąÇ5Ľg‰ŁFŤ<<<^'¬ńzĽ^ł¬ęńśf®.¦$&ĘłFÄępń:ž/‹ă<^Ż‹Äâu8ś8• č:‰ÁĹń|N/Yâńzß[Ćőuś]\]H�a«Y��ř>§ŕ?OĂôú}'ś5*Á§[[]…Úö� ääú^×g€@tP)ÔÓ©Ćqś^·ŤëťoĆńĽs‹ŚÖbâÔ©†ť8€='ŇöŔá{�/b<…Č �ĄLJšşšś^/Yă8ťg¬ń|_«ęôđôđh�¦4pOŁčř?Đ�/˝…ír¶˛©†Š0`ŃÁĂŃÔđř=>Óéôř}>Ť:(ĂR€đ§WĹń}oŚń˝^ł«ĹââjâTĹ©RЇˇ>OÓđú=>ŹGŁ x4¬�šiÇS‰Ôęx|OÄđřž§‡Ăŕč� ĄZ¸Ěeeo®qÎ7[Ćńśo[ĹÔÔÓ€h:8:|Ař>ô| ř~ʇéôx��Ąšpęq:ľ3ĹęúĎWÖ|_WĹđń:xxt‘<OÄú>§ŕúźčř>č�U é4ŚĹĹăťg«Őő<O‡Áčôř(ŃĹ`ŕµ±ĆăšÜoë5ś^&Ż€�AI©‡ŹŃô|KŘ Úň#‘ŠÚµq4č¨tŕ.cî<×"ĽÇqÝvąŽc•±WS�&§Đ ą]ÇěGuĘÝs‹ŚÄÇN€pôčÉôýěčKä Ř>�=�pâ@tbTĆW1Úěúŕ?đ}>ŹO§ÁŃ癢€q4áÖqÎ9Žă¸ívĽŻ+Čř±0Ţ Led.Ŕ>‡áő>Ôń<gOWS¦¤N%ZĘä.Bň°ŔÁčř|=:4á©R«V˛˛˛»ŽkÍw]×1Ís\ÖëxÍ]MM:(Ábbjbjęü�BęńĽgăťsŽqśsŚĆk*T§ť��]čú_ /öô!déH S#.^n'WĹń}OSĹđřž§GOG€4áÁ ptOĂčOÁř~ŹÁôÁérzZa8u4`ÓÔęu:|OWÄő<_WÔń:ťNެ)Ń€pt�</gŕü Ňö#Úív¶bBiÓ‡SGSĂâzżÓéřźŃéôôx:x§)�8xťLN/Ćőλ×xćą­ĆÖă*Î�tĹJĘĘŘ:: z>ŕř>'Áŕ=§ (§F&ŻWŚŐëťg[Ćk8Ý\f®&.¤C%"bă8Íf3[×8Ţ9ÖřçĆjjbj`Ł��¦. :xzľOÔôz=GÓôzÁčôiÁJŔW‰«ă:ťOÖzžŻ§Äôú}Ž˘ŃF«‡G‡Óđ|Gŕúŕü?…ÉôbQF �˛¶¶¶·ÖăšçÖńĽo‰Ťp8u8xšşĽgĆqťoYĹÖjęc0Ô¦śhŃÁŃĐ<>źG§áúź§Ńđú<>@Ą°ř<ŕúŃř~ô…ě���ŕáÓ†­[ˇ8ś˝gW‹ĆőšÎ9×5Î3¬ĆUĹE4Ŕ4éŐâęë1ç×uÝwÇ'ŕ-ť-š1!¦¬M\ZĘŘĐŃô}?OÁáő}N'¦Ą3@ŕçN®łŤÖkšć»®k¸î9Ż1°¶V@šq!YĐ=='§©âxž/«Őń8ľ3SW¤+(¦VÁŕôř=?Ńę}O‰ęx|_W§S‰©M4áÇMN3‹ĆuzĎŐă:ŢŻ¦8(Ń �Ymv»\®Äw^×î<Ç+Ün%JŤDĂGS§Äř}?SéúźĂđ|ŕř@&MÓÓŕđzźSŕř~ʇŃđz=ŽŃĄ`ŔRĄJ¸ššĽgYÖuž3Öxž/‹Ôń<�NŤ�ČY[\×5Ţ;­ĆńÍoÖńu54ŕLSŁG��!wWk•Üw^ëşć9Ç1¸‘¨”`ŕŕđ|Ńđ~ʍű í{Ź+Ę䵕i iL8…µĘć<×kšís^qÎ9­ÖbęjjiŇ”`ŕŕÜeZÍwŤÖkxŢłŚă8Ľ^ŻW‡AJŽ©‰©ÄÓÔő|O‹đř>'Ăđ|>€ jS@�éMM> Ůđ~�^BňąŹ1µk5pŕ&(Ĺ8tpSâ}ô}€~�]…•şÍL:N pđôř}Źéü€~—‘Ç+qš(C€x8=•şć·ŽqĽo[Őęő}_Ôčéđ¤SŁJiĂ �>‚ěGb9Ýw]Ćëušştéҵ'�)Ś«SĆńĽoĆńśgYÖqzΧFśĄ0áÔ߀`ŕ>‡Óéô}Oŕř<G@@)R‡ž§‹ęxž'«éřľź§ĂŃŁ€�‰SSSŚęřĎęřťOĹń<_S§ŁŁ€`M\\ZĘÚÚÜy\ÇóWî<Ç -€�ŃçNL^3[®k1şÜs]ăĺsŤĹ€¤�hb%Jµµ•µÜwc¸ňĽ®×kČ®×+!d)N .¦&'‰ÖzĎWŐő>'§Ááôtŕ&ŚGGQuq1uxŢł«Ćxľ3«Ôń:ť<=<<V覌L]Mf.·ŽqÎąÇ:Ýo\ăuş¸”âSX *Ηk~Ŕ Ř^ב×kĘĺmn-HRM8ppń:tő:ť_Śőźęřľ'OS§FŠVtptVVDr¶»Ž×qć»®×5Ýr­n%Ji¦śLL:şu8˝^łĹâřľ3Ćx˝_Ôęq4 •Ä…qqśfłW[Öń˝oŚń˝gW‰ÄÓ§@Ń‚Ś:¸q*ă1Ín9Çq¸Üs\×5¸ÜeZ•)„ÁŔ0hÓÄÔă55ťo[ĆkxÜn·Ś«±Á‰V¬��˙Á˙Ŕđúŕú~€~FÁ‡&.®®.łŤă5ĽsŤÖńĽsŚĆjÓN%H8VŔ‡Ôôúž§©đř}OSĹń<MN&`5*ÖVŔ]®Âňµäđ€z€t`pŕÄâjń55x˝gYÖőśgY««ĹŐÔĹÄÄÄ©Wp¶QŮô~µä/!yěČ kk1`&jT©‹‰¬ă8Ţ·Śă8Î3Śâőľ/§ A8tđôtx=ôýGŕü€}/kłŇČh “€p˛#šć7\ÖńÎ7Ťë:ľ3©Äęttp�‡�CF§SÄôx}Áô|@ř^BĺmZ”čáA]]N§O©đúÂůŕäGk+1tŕaL�)‰‰ĂĹđřžźOÔřŔ~‚ÚĘp`)©©ÓÓčřŃú]…ć;ŽëqĽ^3@…pâu8|>Ŕ~ô�]Çq•q4 4¦¦Đ\­®cĽw[ŽqşÝgĆqzşthŕĐHXYYY[Žkć9®őÍnąĆë8Î&&¦Š0S§:şšşÎłŤëzÎ3­ă8Ţ·‹©«©E4ÄJ°ĘŘ\…Üy]®×qć=×uÚ湌ũŕRš4px=?Ńđ~ʍů ć=Ç•ć6ef%R"h+WWW‹Özľ'«ářżSář=ŕqpáL�Ś„eZÍsŚŐă:Ď«Ôętř}O€ťA8n6+Ěo¬ë|g«ÓÄčč=)NÄ ĄČ şívąŽă•Ěw[[­ă11q4čt`8Áđý?€ţŁđ~ř�‚ŮčđÁ„ÔáĐf3¬Ök:çYâő<_GOAđ\JoŔ*ppzlWqÍw\Ç5Ýn·\ëuśf¦Ż8Ś88uzĽ]^·««Ĺă8ŢłŚÖqš¸•!¤Ń€q4éâřÎłŤă8Ţ7ŤăxÝną¬ĆDX â)©‹‹RłÇ5Ýw×+¸î;Ź1µĘÚ°� Á čѧ‰ÄâuťgW¬ëzηŚă8Íf­Jja čŃÁŃŃâz>'ÓôýŹář>‡Áŕ‚ś3 `Ă««¬×5¸ćą]®×b;^ă°'FŚR¬8qqÚíy]ź€ľAôŃčđôiÓMX(\f2¶»^WµäčüG§áđôđáĂH4`<:tńu8ßń˝oÖńš¸Ýe\f-I ĘłŁ ôřz|OWÄńzĎâőxĽ]LHV¬ÓÂĘČ:�ń>źGŁŃęz}OOO‰¦šb%8şjk8şŢ·¬ă8ĎÖqx˝]N'Fť:pBjT…k"6~+•ćĽ×şó]ÇqĘÚÜeXMLH©‹‰‹««‹¬ë8ĽgĹęő˝^'âéâiÁ�+Vś\MN/W¬ń8ž§‹ęú}OSÁáđt¬č‰qqśfłY­ëśo\ë|sŚâęjbjh hŃGOÁŃđ|ŕ?‡čúĐ>Ńč!54Ó‡Nž'OŐń<OâúžŻ‡Ĺő<OÄŇŘVštđpôř}OO§áú~Đź§ŕđx�&¦84đôôôř}OO‡â|>ź‡âz:<”¦śG�Ŕ^W�^ב®Bî9Ť…!4ÓN 9|ż'‰âxžŻĹő<O©áéđđp �if%555xś=N§©ę|_O§áôx=�ŕ15!IŕŮđüéř>'Ăčń<>'śŔ5fŚ:šÝn;Ż+°ĽŻkŘ>„ú}=8i…`Ó©©©‹«­ĆkqÍs\Ç1ÍwČYY )ś)†ť<>'§Áń>‰đü?Áő>ŕčč�p`+8@ôôÄř~‰đüO‡âx:žž8táÓ‡OSS«Ĺă<gŤń˝oYĹăzÍL]]JhĂŁ@ŕŕčôú>GÓđý?G§éôx<ŽžŤh…& :ş¸Ýn7®c•Úív`.Wk'!¦Ľ58¸şÍf3[Žk¸ć;Žcµ°tpj@8pS‰WY¬«\×qĚwk¸ć9Ť€¶˛pa€ :şÍn9\Ż �~ŹŁář|>'‡S¤¦‹&%l.Ăčâ|>'«âuž3‹«ŚĹśÁ§ :şĚn6ąŹ1íy í{^ĎxxšaH jÔ¬…¸íyŹ G±!}ŻkŘ>ŕŤ�¤Ó háŕééđôxž§‹ętřťN§W©Ă˘DĐ(©YŤ­…ĺvţř?ĐŃôü>ętô`ÓA©†¦&&.·ŤÖkxÍoëuśf®3Wś;đÓŐ© *ÖÖÖW1Ís\×uĚoÖbâęâQF‚Ś\J•11qqxç[Ćń˝nłŚă1u(˘L)FŤ=N'W‹ĆuÎł¬ÖqşĚ\f-Jµ¬ÄŐĬĆVW1Üwcµć<®WkÍvąŽVVâUÄ© a©N¦ł«ĹŐë|^/W«Öx˝N§S©Ă˘Ť�)Ś«WÇ8ćą­ăuĽoĆë8Ţ&®8JaĂĂÁŔ}GÁđüáú>ʧŕ�Y��ĄJb:u8śOâő<OYâzĎ©âu:tiŃŁF•€­eef9­ăĽsŽqşŢ7Ťă8Ţ®§ť4P15555uuxŢ3Žu˝sŽqśsŚĆk*Ô¦¦:88�čŃđýčüGŇů>Źŕđ'@Đ4 �pppřž'S©Őń|gWĹęńž3YÄÄ©†ś8pŕÁÄâxť_S§§Äń=>§©ęôő:thÁ€¬,ĆU…¸ÚÜsŽăxćąÇ8ÝnłWS ¬C@54đx<O§ŕ?ô�^@Ź1Ěs‰Nś88 *±YŽkşćąŽqÝs­Öă5upáÓ‡CNu5šµušÍs®qŢąÖëxÜf3WšbšV‚Ěf-\g¬ăxÎ3‹Öőxś_OO€Á@áIán6·[Ż5ÍsŤÖë+5q14Đ0pqMxz<Oâz=>źGŔźÁŕ´ÓF� ą~—‘Â÷וŘ]…Úć7 ©†¦&&&/Yăz˝^ŻŤń|gS¬ńz˝N¦–°‡ x��}đ˝Żay^cÜr»Ť¬ÄpaL4‚Úć;Žëć»®cuÍn®.łN&ś„ŃÁ ««­ăxÎ3Śë|^§‹ęřľ'‡ÁŔM4¦M<O‡ář>ô|��ČY‰Q©Á Đ>čđ}č Ř��Ă©R uĚZć;ŽDy]ŻkÉüGĐ<ÁÁÇJ`�tţéřź§áôú|>Ż©ŕÓÇQEâjquť^·Śë:Ţł«¬ëz¸ĽMML RiZşÎ3WŤë:Ţł¬ęő|g‡‰ÔéŕĐJt`�¬VbëxşÎ3‹Öx˝_©ęôtp��CF‚ş¸¸ĽfŻă8ťg«ęúľÔđtôtpš()SW«Ôń|O‰ę|?§éřÁđąZpŕ�)N&&®ŻĹë<_Yâúž/©âx|NŔ8SŠ4đháđôx}G§áôü?ĂčččáZpi:š€ą[[ŽńÝn9ĆëušÎ3‹ŐÓŁOŚ� háéń<O‹âř˝NŻ‹Őâń4ęᦤ&¦śtq8xś_Ĺő}OŐń<_WĂÓĂÁ€h€­Zµq¸Ěf3[Ç:çYĆbńxşu4éÓŁJQN�ŕú?�ö#ĺv<Ż1°ŻŔ2¬DŁ�0p�_W+ďĆńĚoëśoĹÄÔááŃĄ0`ŕŕµµ•¸îąŤÇ5Î7[¬ÖjńzÎ'´Q€ĄMN'S‡©ęz~§Ńčú~ŹéôăpŕŔN‚¸phôz�G•Úć;ŽcçŚăzÍ:tđp€p®%Ju58ž3Őń}_SĂéôôx8[V¦�G…4đtđ•ĺv#¸ís\Ćă1tđéHWN'OĹń=_SÔřžŹO§éôü>�|�tiÁ tOÔř<źO‰ęxťN§S‡ "ELLd-®OŁčú>€>ô}Ŕ}ŁN-K¦¦.-XŽBíy^Ŕ^O �_ ‡ i«Z¶v{[®ăć9Ż5ÍwŤÖăqjTÇF©‰‰©ĂŐđúżę|Źář>ŁĐYV¦4� Ő«ŚĆc5ÍgăzŢ7¬ëzşĽM:4hŕDÇžSĹôř}>źSęz|>€đ (ĂŁO‰âx|>ź‡Ôôü>źĂáđt )N‚péf-LN'‰ń~ź§čü�ĽÇkq¸¸th ¦Źôt»v#µĘîą®ăuśfłSS‡‡ "N”«‹‹‹¬Ç:ÝfłYĆë8Ţ.®®¦¦¦Š0\JšÎ/ÖřÎŻWÖx˝N§‰ĂÓÓÁÁÁŁĂN%L\n2#î;[\Šó]ÇqĘÚĺeXR YN§SSW¬ă8Ţ3Śă8狍ă*ęâT¦Ś �ô@ř�üđ�?Gŕ�˝…Č[a0‰ęčťÎĹęńxť_WĹő~'Őř~�ôx1 1piŃÓâř=?SŕřŃô |ÚÜZ”ŕ)ŁAMM<>ÓôÁř_+Ęöą]×1şÎ.ĄaNžŹ©éôü?OÁđzŕôú|Ŕ�)‡MN'‡©âxťOWÔń=OWÓÓŕĐ4¦p˛�V®®łŚęőzľ/©áő>'§Ńčč,§� ŁŽŹŕřĐ?Gčív+qµjTÁF§ ôř:<ʇáúźĂđú<ʇ‡NĄ5•n„áŕâřľ'¬ńz˝g­ë:ĽgWRĄŕtđtřz=>OÔř~‡Óčč>ŤŤjă1•Ěn3ŤÖńĽgĹëzšxĽ<: QJ@‰Ł‡Ăéôô~Ŕ^וÜyŤ®cqq0ŕŕ'F1:x}_Sář~§čú>ą[V¦4ÔÓĂáđú~ź€}/~�]íef.¦ čáL8xž'‡ář>ŹŁđö#ĘäFââÓ‡�"‚hŃĐ[ŚĆëuśfŻS‹Ôń:|O€řYM8 `řz�˙ŕ^cÜyŹkµć9\ĆVc*S§‚(:Ar¶ą^kĚvĽÇqÚć9ŤĆk1pâiĂF 80éÓĂÄęř˝^łĆzϬ߀k8˝^¦&¦šjAÁŁFť]M\o®qÍn9®ă¬­¬ś*bU€tpő<_WĹęu|gŤńž3Śë8ş¸ĄŠq4éÓĂĂĂâřzżééđxz<NŽ @)0aѧ§Ăáő>źGÓčřźOÓđz:€U é4 ŚÄĹăzĽNŻ‹ęxžźŃđú(ŃĹ`ŕ�";[\Ćăxď¬ă8šĽN �I©§ŹŃř>€^W•î<®cĚmef-J(Ń@FŽéő>'Áŕôú}>§§ĂÔéęő8q0Q‚‰Äęuzľ7Ĺńzž/S‡‰ĂŁN¦LéčĆuzŢłŤëxÎ3[×5Ľn-n,5f-Y‰©YĘěúŕOĂôüOG©âtđębU€âM4ÔťŃĐľŻ‹âřÎł¬ë8Ýfą¬ĆÂłE©šjÖVBĺv}Gŕú?řŃő>ŃĐ8p`8pD4âbë1śs[­ÖńÝoÖëuşĚZ•0Ó‡�ŕ+V˛łÖqη­ë8Îł¬ęő|NŽŽ€ :tęjęęńĽgăśsŽqşďŚĆU… :4âU«Y !vĽ®ĎĐ^×±Âöä,ť`śž'SŚë:Ţł¬ăxÎ3ŤÔĹÄĹŦŁ H‹Ś…ĘěGŔáú>ŹĐ|Ť0ŕĂSW 8şÍfł­ăšŢ7\ăśf·Y¬ÔĦ"QHWYYŤ®ë¸ĺrąŽăšî6·W‹†ŚVťN >ŹOÓô}đľ@ívĽÇ1µ¸´ŃAL\LM=g‰ęzž„úź‡đ}Ř\ĚJp“Đ‰ŁŁŔYĚn9®kśsŽqşÎ·¬Ó«ÁŁF Á §‡Ĺő:ž§‹ë=OĆtő8š10Ó‰DD…k+5¸ÚÜsŽăşďăşć·‹W &MÄ\f3¸çÇ1µÍs]×+k*Ô«L&�88x8ťN/Śęńśg\ë8ç®qşÝf¶›ˇ Ĭ‡˛¶»Đ>Źář~'«éęőuu!Xťpâbęë1Ín·×8ć·\×5•šČ‰LCN–@f.3ŚÖëxÝg[ÖqxĽN& 0h*âbqxťOÔđř}O‰đz>@đ˛¬AFž€‰ušşšĽ^łĆxĎ«âôđřzz88884bi„ÄeXÜr#Ęí{^D{rä�thĐ(ÓR»¬¬ĆÖăšî»Žëî6+µµ)˘Ś+WSS‡©Óéđü?Łŕú~ôK+10ŔÁĐ ć7]×8ďĆńśg[Ôâu::8 ĐG�"`Ôđx>ŁđµÜw\×5uťNŽ8 áYW«Ôń>€}Gµć;ŤÇ:Ţ=á'A áĂŃářĐ^c•Î9«©ĂáđxS Ô@G&§Gŕî<×:ż�çÖuž'‡ŃčőFJP:W==Ź€ţŃř^BĺsWWŽ€ťM ą[\ÇśwÇuÍs­ÖjńtčÓÁŁ��h8z|>‰âřžĹęuzšxşi¦Šh80čâpđő=OWâú|OSÄń=_GO °…‘[[ŽkĽw\ÖÖc5¸¸u4aJ)ÓŔ�-Ç1Ýsă¸ÚçqÎ7\âă8şšp4©‰§‡§Áŕ?Ńđú Ęír#10Đu�4�/őv~—óÇ5Ýs\Öęá§ JÁ°Văb;\®ă•Íy®W1Ěen.$C†€8LSOOO‡áôüŃđ|?AřÁŕ�ĄxN �x ć;Ż5ĘÜsÖëśnłY©«ÔáÓ¤ŕĂŃĄ•k1¸Íoăuśg[Őë:ľ/©ŃĄ”QŁŁÂhÓÓÁĂáđúžźOÓđúÁđř�đ¤DĂ€đ� ÖEn·®qÎ3ŚăzÎ/S©ÓÁ iZ“JÖŔ>ř?�ĺy Ęň»]®OĄ°"Â(<+‡@ô|�ĽŻ+Ęó®ă¸ć»«ŤĹÓ§�'•ĂGGŔĐ ÚňqírąŤĆbÔĂŁB€¦&¦žŻ‰ęüO‰đz>‡ŕř>ŹAf.&ŚJB¸¸šşşĽo­ë|gYâřωÔÓŁFŽLLL:šťNŻŚń:ž'‰âüO©áđôhŕ1Ť:88=>źGŁŕú>‡éř=?O‡Ŕ�Ň”č)‡�đł­Öńşş˝^/‰âúľ§G‡Ŕ<ŃĄ)Ô్ĆkxçÖq˝g‹Őęu:84€RpŽŽŹWŐđő:ž/SĆu5x¸šş¸BT¬¬śÁâzżÓâ|_SĂâxś=<M:u1!X0aĂ‹ŚÖEsÇk•ČŻuÚî; ¶Ŕš&&..-f7\Ćăć9ŽkşÚĘć¶®.-JhŔxHV®7ŚăzĚgYÖřŢŻWĆu:ť:„­ +‹‹Ôâtřźáúáú ±ĆâSŁA4`ááen7¸ç\Öë5Ľg[ŐâđčŃŁ@#�54ętő>'§ŃđýOŁéúĄĺwŤ˘ 8�ŕéZĚfłY¬ăxÎ3Śë<gŤń:ľ' çFžŹÁđüʧčř>§ŕ΀S 8Ť�<čř>§đ|ŕÁđtx8���RĄ\Z¸Üf3Ťă5šÎ7­ęńzĽMN�şp -­­¬­ĆëśsŽqśoYĹÔâq:8x884щÄŕŐë:Ľ^ł¬ă8ßĆńušĚ\\X4 1 ŕáâu58Íf·®qÍs\Çq±\­žÍÔ¬”Äd�Ăęzž§«âřĽ^·¬ĆjÖV@iś1jÖ×kÉđ‡ę|?Ăéřľž§S‡N”âD4âńśgŕĆqśgYĆuxϧSNś515qqšÜnąÇ1şď\ăšć·ăqk1q)ŁŽ�V®3[¬ăxηŚë:ĽgŚęq:|== Q@�śtôôř~‰ô~Łđ}@Ęć-L:ĄpáÔéŕđúéü?@ú�.ă¸ĘĚL SšpâqzśOWÄő}_‰éôú:|+RŚ�p¬EÄÔŐâř˝^Ż‹ń}OSÔđú} N ÔĂ«ĂÄâzžŻÄôú~OĂôú<�x�(ŕ)‡OOÁč@ýĄć>cÍwăuššhPRŚ+V¦ť<>'ŁÓřźKí{Ź+Ěmn®§‘ Ä8:3Ťăťgă8ľ3Őő<>Žŕ¸uI p®ŻGGÄúč/k¸óÇ5ş¸pčEpp¦ŹG…ä/av#µĚw\ÖńÍ]^.€N&Ť¨Úĺs]Ç1şć·[­ë5xÎŻť<& Ŕ@đ#ć<ÇäW•ć<Çkć9[ŚŠĚLLA]L:|€}Aü�ŇňqĘÜn-�Ŕxz�đäú>‚ö˝€ľBö¨öě-ž�8pÓ81)Ĺ­Ç+łđÂű_ ú~‡ÓŕčÓ§™†š51*cšî;^W•ě�ô|ŃÓŁM0­KÁ§‡‡F§¬ë:Ţ7¬ÖńĽoŐĆă1jŔ�ĂL) �ř˝č€ý�üଦ:h8pâjâëxÎąÖőĽf·ŤăxÎ7¬ŐÔÔÄĂ3 ŽžžźÔńž3Ću˝^·¬Ök*Ô€8•k'GOOSÖxľłĹęuťgW«©ĆbbB° 4Ő©VV×kĘň»^BóW`G`ô�4¤0hŇĚZµqşŢąă<o‹âřť=OGAHFŤ+‹‰‹«Ćőś^3Ĺë:˝O©ÓĂÓĂÁÁ…nŠ(ÄĹâqšÎ·®uĽs­ÖőÎ3[«‰N%0‡GSĂŐńž/‹Őńľ3‹Ĺă5xşµ11jŔpS†¦.7Ěw®Wb˝×k¸ě.BŘY�<˛Q‚śM^3‹Ćuśo[ÖőšÎ·¬ÄĆja¦ VU€¶��źŐĺy?KĘ÷×k¸ň¶ąYR®táeYá\f.ł[ÖńxÎł‹Ôâő:ľ'SAZp`Ť'Łŕü?@ý€» °ąŤÖjaÁ¤Rś<'ÄyŽW1Ýy®kšÍoĹęu4˛Š4¦µÍgĆqťgŚęřť<ŕđ8Âthqx˝_Ôő>'Ăđ}@/1°¦.ť) ‰‡€]]]^Ż‹âx~'ŃđŁčFÂhĐF“€ś�gŐşÝfł­ńž/SĂęz<Ź 1(' đqŕFVc5ťoYă|^Ż©ŕčôx=,…4đpÁ§ŁÂěú>—°ň~üGáv+k1`&*TÄĹř�„ÖqxŢ·‹Ćuť^ł‹Öř˝:ś80  bjjjpő:|OÔôú}?Ńŕ�:8SJÄs­ÇqÝy®ëşćą®ë1şÍ]L8t`Dpiđôz}ŕř?Ŕ�ř^O µ)Óˇ…••¸ÜfąÇ5xÎ3Śë55:š4 �Š�)SWŚęř˝OWÄřžźOĂčđK§ iÄÄâq:ľ/Śő>/©ęzľź§Äđ•(ŁSFŤ=<‡Óářžź‡Óéôttp­84ť:ŚĆë˝s[®qĽnŻĹâutčŃÁŁ��hÓ燉ŐńzÎłĆzÎŻYÖqxĽLLL0‡RĄZµČ]Ż!yŕüđ §ŕ�Ś� éò˫¬ŐÖńÎąĆë1šÍn%ZµjÓEp�řőy^@Źb>Wgđ#Ę󀶲¬' DĂS'‰ÔńžŻSŐęzĎWŐń<<<<:p­0"S‡«âpřľŻ©éő=OSÓŕč>€L ŕĐZµç¬ÖńšÎ·¬âőzu:x4p�M�•ĹĂ‹«ĂĹęúž§«ń=ŃŕҸ�@8‹§ř>Áú_1íy^cµĚsY«EG Ŕ€ś<Nžź‡Óń>ŹŁŕŕ@ÜZ" tt¤U«ŤăśgăxŢ·‹Ćqž3«ŐáâpiŕÓ‚Ś511jc1Ín7ŽńÎ9®cuşÜf-Z•(…'•­žG…ě?Áô|Áđú>'ŁĂŔ4iÄĂx0ęâÔ¬Ç1ÜwWňňöoهĄIŔ::::žžźŐő:ľ§Ĺęqu5q)€i˘‡‡¬ęřŢ·­ë5ĽoÖëśmeed`t ˛áő==OW«Őă8Î3[Ś­ ÓY*MšşĚsc°˝Ż|Óáđő8jâLVé«[ŁÄń|_Ćqś^3ŤĹ­¬¬A©RH‹Ś€|ŹŁŕOĂôü?OÁčń<<<N0�jc <:uuxŢ7YŽqÍw®c•ĘŘ aÓ© 2¤Ó©‹W^cČ^×Ęů>đýOO‰Ó§$qaŐĹťŃâzľŻ‰Őő˝gŚă1šĚdF@q Jł d©Ó‰Ĺă5λǜy®ă¸ě.ĎGF 3‚„Ĺ«[GGO©áń<OÄńž'ĹÔâjSM4DL:šu8˝NłĹâxľ3Öxž/Śéętč +‹ ŐĆqĚf·®q˝oŤń˝gWS‰§NŁupâTĹ×5šŢą­ĆăšÝs[ŚĹ«RĄ084iÓ§W‹ŤëšÝnąÇuÍw®ăć7 4âUĹ«Y k•Ęî<Çkµć<ÇóÇ1µ°ĄSO‰ę|>ź©đüŔ>ź zŤž‡F +�+W[­ă8Ţ7Ťë8˝g‹Őń<M=<��+đ WYÄâřľ'‡Äő}O‡Ăéô *Äič”ÔÄŐęő|N§‰Őő}OŐôřz:4 šaIč,čúŃôéüOSŕń<=:x”ÓRŠ•*U«ŤÖkśsY­ÖńśnłŽuśL]L80 15558zť>źÓéôüĐ~Ź  �Q€®=OÁđý‡đ�^Wqć6·©§F„8(śNžSÓđý?@…Ř[ ââiĐčCَWS‡Äéő>ź@ř_ ü�»ÚĘĚ]8S€ ÔÄâq|>'§Óő>éú k*aŔA€¦¦§O‡Ńđ�?K°ĽÇqÝn7‹Ćph�ŕ pł'S‡Ăŕđ|ŹŁŕ�»Žă+14 iMM ą[[ŽńÝnąĆëuśg‰ŐÓÁŁ@ ad-Ç1Ěn;Žă•¸ćąŤĆă1q”Ó@ŽŃčř~�ŕü/•äŘŹ+k+1(ŁFŽŃŃáôü?ŁŃôý_§éôü>Ž �Ŕ0`:x8xz˝=_Ťń8ťN®§WNś4Ó‰ 8x8xťN'Yâőľ3W‹ĆqxÎ.¦‰DANś4třžžźSâzžź‰ęzž§ˇ:z4Ą &¦&&'Öq8˝NŻŚő:ž'‰ÓÁ � 4đh.AčüĐ�đěúĐ aZ”aŇ)ĺřř>‡đ~Ęö˝Ż1ĺrąŽVbĆ.¦ť'Ž€‹‰©Ĺęxľ/©ÔôüO‡ÓđüG "Đ4Ź E\Mg[Őë<^łĆu:ť_WÄń:8ť T đ�SYŐâęuž'Ăâxź‡ÁčđxZ(Rśxž„ř~čú>€��Ľ­­”áÓŔx�,¬Ümn7Žkxî·[¬Ĺă1téÁFbjjjë8şÎ7­ë5ťfłŚâęęjâQL) Ŕ�ü˙ü~ŹÁôŁčř> Éŕ�ph¦¤ŕÄÄĹ«[[\Ż+µí{^Ářú< q11jŐ€� •Úň» Ě{^Dy ĘírN”€Ą1!©‰«ÄÔă:Ďâř˝_Äńz8x:84Ą: Ѩşšx:|Đŕü.×qÝs¬ÔÁ 8 áé]M:ť>'§Ńéú�úv»\Ćâb`ÄJR(ś<×"»ŤĆăuşÎ·‰ÄááéčéJ0t!áč.cqÍw\×1Î;Ćë5śf/����‚��]Z��-����?4����( [FŽ Ś0pńxś^3ŤńÎąăťoĆă1š¸¤¶DLf2˛+•Üy^W¸óBěGb9=,«��:tq4đńz˝g‹«Őë|oYĆuĽ]f®"Ä\XV˛ł[ŤĆcśs\ă˝s®ńĽf.®&& 0�MFŤ'ŁÓř~ř~Ź }ŕř>@&Nś:xtq<<OWÓâxźÔő|>/©âxťM-šgŕ x�pĘ�€'¸Ę©5ÖĄśÜµřaXÚČćUł›ŚîçďB: Ń>‰´= Üűgg6ąŠĘÖHńŃŠŚ1ŕnó­ţË+j ¨®tĺňHŁ2`† ±„Ü˝Ăú‡î–)ÎŁJ®+.¶ë¤ĽëîŔ0W˝w—j–!XÔĺCSi)ŃÁ ĎéŔ0E ‚ QŔ`/‰±˛EĘéĄ=hÝB­6JŰÝË˙„8}‹ĺů1”Ů_–™m–9S“™ŽŘą=~®ť©Żµ>ŹÎéw""´CˇXp$ ăPöHeÁžt 8ŽŞrQŞˇ`-eÖżX1†X‰Š©ŠXŤ†9~.eś¬ÔšrI¨ý4ĘaěK€ř^‰bČŇ?’%9‚lž¨şr­°m[łáĚk“ó6zŇ:Xëý“´vľ×ÚűGekÍY¦tiÉxł\Ö 39Hđüŕ,‰É śZ4ž”m/QŐ͆2nŇÚëlo®áî.ăn2ă"˘âiJÉ ł¸Ě+? !0< „Ba‘Ä~Q3 S«öüĚtŤ{uá\w—tťÖ»'kíýĂ·v®ÁŐz?4ä'qŐsśnő[śĆ! 0 |4 €ŕhD, FäRˇ™tĆ4)šŠ«,ëŁalYŤ2@ÇŘÓa ÚÔ¬(©r,{0‘E� Ś"Aŕpśt4$ $L„Ĺ%…ţGA°ŕ8Ţs©ěűĎ â|gŤńžÁöýo=Çnő9+ĘHŘĐ€I@`i 0iP9  P 11SGŇŐ×̶Y°Ům¦‰9é™( AĐ(‚ h‰Bd Š:Ę D!Pd("*‰ĺ–(€Ç€”¸Î[D4K,Ľ@[“Ń©(ˇIB(V™Ł3Ă]©6≩sC$îťV›°Žąć„m5*ÄZg–'„mZk.-ÍĽ@˝Ëć~GŕüŁÂąN•k¦c(”Ő&p‹TrÓÂôĆšÓxq‡VîŢ%âž`�|Ź'´`ŕ,ă)ś•¦–ĺÔ}Á|ÁúG”xWjĺ\Ż*©rą¤@`ĺP:-'Li¬¸Ă›wO2ó÷ô?輟g¤e4łŁŤLKô^‘äü§Â|/ñË<ł¦2ζ`Xśť"'J€ŕv|+…íŤ3§u§yunĺÜ»—ů#Ńl¬ĺQHł•@ÉđžË<3·ąŰŚ8Ă‹s.)Ô�t[;98ťśŞW�. =‡É}ČýÁ|ŁäţŃů>‹“ŕôŚ •ť"Ő•ĺy^XŰ|5¶¶ß ňÖÚŰ;gLmŤ±¤ĺX,�h8Jé‹g,áś··o—5¶ąo–xc–6­§hĐä2Š,GCŔö>Đü—Ŕü‡ĐýĐ}ŘČŔy��MB‹,ǡň�/óOo4óownpç-ś®ŃecaČd¶Y—'ŃôŽÓÚ{W†</ĘűW…ô®SÂ¶ŚžQ”QJ vZ,ŁIʲÎŰÓzs§9u—xs‡Vď.­Íą–Ąąb2‚˛’¤Ęét̵N-ÖS¬ĽáŢ]áÝą·6âÚ¦itŞL”ś˘ŃGgiʸVÓµrÇ,vÇlxcµö®ŐÚyGGÁđ: ŽO'I•Jé«nÜS›un­âÝaâÝaŐ¸§nšĄÚĄŠE"ŽNÓ„ĺ:VŘĺ\/¦;cµôż é~ÚzG'Â8-BÂŽŃIĄSÍ5nmÎáŢ0îÝáŢŰś9Ë‹jصŇiŠ83¤Úpś«KŰc–ąc¦şk¦şg¦:gĄđ®ŁÉdr: †ŔU+–)ś5‡s—q§q§<8ÓzkLiŤ' É`pX<Ł)Ęô˝/lđ× r×-pß đĎ mz^U”ĺTrrr]1,ËTâś[¬ĽeŢ]ĺÖśĺĆĂyg axE•Ť ¤ĺV×Ă<±ËłŰ3ÓŻĄňľ´íFO'C)¤@®–ĄŞqNđîťSşwoëíÍ8¶é«fŘ´IŘŕU(Â4:‹Čz‘ú�©y—šy·‹un°Ţ¶r¬†�‘cJpť+„í'Â<§á(ú?ˇůř�j—HŔŕŽ…4ŚŹŘłme­3¶ąg–{cÂü«´ůO¤xŕYĄQdtHČěU*ʶ®Ú<´üÉ|‡Č�;¦í¬/ đ# @•†¬r�uÝn· ÂôzžOŔôÁŔÔM+ŚÔępü? ä/qć9­Ćqś^§ÂŠ8G ááôňąŽkzçYÖxž'§Ńđ+0˛€4đř�/+•ÍsŽqť^§ŁĄĘĚ8Nއ…0ôz şçĆxßĂéř>ÚÎ&�@RQÂx'‡Łŕú{ŽÖëzÎŻ‰ččEŔFˇ:G ÁĐ[[­ă8ľ/«éôú�ú]¬«ĂÁ¨+ŁPŕf.ł‹ÖxľłÓéř}ŕ�łšI8zWŇň»ĺwkĚn3ŚÔÓ§K @ \gS«Ôę|_Sář~€ý jTÁŁA8tđttxŁčč�Ŕ^OĄć9=,¬Ĺ˘€:N �ýŽVă¸î»®kšŢ7ŽquxĽ<:�CGˇŁS©Áâz<Źŕüč/b<ĺeZ”háA]]N'S§Äř}ŕüGŇň~ČVš0`Ô©‰‡‰Ĺęuzž/¬ń<_ÄđthŕŇ”D8ef3­ÖqşÎ/ŐęńzĽ<::8 a p–×!r#¸îĽ×šóÇqĚn2®3śˇ4Ź �?Gá{ Č^ăĘív¶·‹L&Śpiááŕéń=OĹő~'©ęzžĂĂâś0phÓ§W\×1ćĽÇk¸ň»^cČ�Ł0Q�Ó‰Vą\€}GÁčř~/Äő:ľ/Wp`€“‡SSł®BäýGĘö˝žÓÓÄÔ€aš•&ťLLerą?@üŕúźOÄő<M<MLZłN q*TĘČŽDvą]Ż1Ř^W•ÚŘŽVŐ€¬+ŔŃĐ}źŃő>źG§ŃÓŕŕÁŁ 0¤:pâjă5ĽsÇ1ÜrąŽă‘ä-€phRtź§ÔřżO‹âxž/‹Őă8šÎ.ĄZa55)ÄÔâqzť^ŻŚń|^§‰ÓÓÔŕŃÁĂ€`¸•ĘĘć;ŽcĚvĽÇ•Ęíw]®c••¸•q*BjS©¬ë8ş˝oWW«Őë<^§S©ÄáŃFŤ€ĆU«Ťăśną­ăuĽoĆë8Ţ&®8JaĂĂÁŔ}GÁđüáú>ʧŕŕ��RĄ1<N'Ćx˝OÖxžłÄęxťNťthŃ…`+YYYŽcxîąÇ5şŢ7Ťă8ŢłW‡‡NŚ(ššššşşĽoÇ:Ţ·Ťă8çŚÖT©ML:tppĐŁáúŃř>Ź |Ź€xč@Đ80ÁÁĂâxťN§‰âřÎŻ‹Őă<g‰‰S 8pᣉâu}^žźÄő<OWŐéętčŃX::YŚ« qµ¸çÖńÍsŽqśfłWS V! ššx<'ÓđÁú�ý/"<Ç1Ěf%:p`ŕŕ,« Ĺf9®ëšÜsŽëšÍn·~�!WW8pD4á§S«Y¬ÖëťsŽőη[Ćă1š¸•)ŠiX: 1µqśnłŤă8Î/[Őâq|M=<�#…'…¸ÚÜr·^kšć7­ÖVjâbi `ŕâ&š4đôxž'Äôz}>Ź>Ŕ<=…i¦Ś<�@áyě/qíy]…Ř]®cqa0šjbbbbń5ž3«ŐęřßĆu:Ď«Ôęil+˘Áŕ‚ě/+°Ľ®×óÇšÜs[‹‰E8pŕÓOOOSÄń:ľ/«âxľ/‰ÄéÁdŃç§«ÖuzÎł­ë8Î7­ăxÎ2ł¤5*ÁĐ<O§Óń>'Äń<>݉ÔęiÉL4ÓW[[ µĺvµě/ay Úě��88u*CĂSYYVy]ź€łđŃđýÁŕŕĐpŕ©‚¤+V·[ŽVăšî»®kšć¶®.łiÄÄÔÔĹŐÖjńśgYÖqť^·‰©ĹáÓ‚€4”¦ť:tń<=>§Óđü‡ÁĐ��JtĐ4ř�˙‚˙Ăđ~Âö�^Äy •µjÓ‡8xx:=Źčř_'čü�ň~Č”ŕĐN �űĆńşŢ·ŤëzĽg‹Ôâtřzz�C€pš4ptx�řyévíyŽW1¸ÜJpč`ĄµĘÚńçăşÝsY¬ŐÄâiŃÁ śY +1šşÎ7ĆőzĎĹéń<>O@đL8 §Žč.×avĽŻ1ćĽÇqÜs­Ő©‰˘ŚtčŃŁ‰ĂĂĹń<g¬ń:ľ/W«ă:śMM4SLŕѧN&łYŤĆăîĽÇkłřŘ?ŁÁÁ‚šłÁ§˛¶»\!}Ż•ěđžž&Ą0¤ÓŁWYŤ×xć9®×1ć»®ăŘŤ¬…•aJ0čĐ<€^Woá{^Ŕ Čy]…Ěr˛¬&j%JjbbbqťgŚęń|g‹Ôń:xť<84`Ł D…•ar»®×kµĺv#Ęî<®Dr˛µ(§@á\Jtń8x}g«ęzźÓéôôzŁŔS�AŁÂšx:=€>€_+ĚvąŽcqĚL:xt¤)‹§§©ęú~'ĂéřźÁéú~‡Ŕ…gśĐ:ž'‰Äë<]^Ż­ăušÍn2˛‚ .%lŃŃÓÔęř˝gYĆqšÝef2É‚©šjÖVDrą��Łđ }OŔ:: †·7;YŚăšć·[®ëxî·­ĆbŐ©†ś8Z¸ĘşÝg\ëzŢŻÖuť_Ôéččŕŕ�Ŕ0háęu:ľ/ĹâőxÎ/WŚÔĹĹĦppéÄ©Vł\Çä/1íyä/ .Ŕ\ť�ÁAŁ&/Ćk5şŢ7\×8Ýn7ŤĆęâTĂN 4˛˛ăkšĺmn7ÖďŔ+xŢ·WY©‡ )Ôŕ�\€ąÚĺyŽăµĚn·ŚĹŐÄÄÓ@ `Ŕxx<=_WĂÔđřľWĂÓÓĂÄâpQ‚هGSĂâzľ§©â|_SĂâxś==Mtá¦h0éĹ«®kć;[\Šó]®×arŔ8*U«Y[ •Ř]…äî<ǻ؎B°¬!5jÔĆbbë8Î7¬Őë:ßâő|gS©Ó aH@ÔM8@ĺr¶ą®ëšďëśo©©§N ��,…kkq±ŽqÜsŽkšć·‹‰‡ 0PpáÓ§W‰¬ń˝^/ăzη«Ćőśg‹(€Gž'¬ęńťo[ĆqšĚf˛­Z•j@ S‡&§S§§Äôřž§ÄôúźŃŃŕĐL4ád�­]]gÖuť_ęu=O‰ęz}iŔ4`ŃŃŕđ|@ü/kÚňíw¬¬ĹÄ(ÔŕŔ4źG‡Ăđü?áôü>ʇهNťJ••n„áčâxľ'SĹńzľ3ÖuťN/WRš)Ŕ0éŕáđôx|>'ÄřźâzžžŽŹ�Ń hĐV®.-f3[‹Ćk8ÎłŚęřΧW@áL¤š8|>źGĂô~Ŕ�ć<­…µ¸(80¬čä-…Č^cĚy]Çî;[\Öă1jS§AJtôđtz=ŕř^Ďŕ/kČ]íd+(Á ś�¸ć7\ÖńÎ7­ë8ĎÔâtřzz�'�á4hččđôň˝ÇöĽÇqć9Žk5ş”áĐ8ŔKkąÜw^kşîą®kuš¸šşpph'BĚ\f®Żë:˝g«âx|OOŃĐ<iÁ§ |�ň� ţ×î;ŽÖëujâhŁ:4pq:zxž§‹ęúž'«âxľŻS‡‰¦ŠiśtáÄĆc1µµÜyŹ1ÚěýňÁčđp`¦¬Ä€piÄÄĆVcµČ\ź¨ů^×°ü>&Ą0¤Ó˘¦%]\n7]×1Ív»ŹuÜv»\…µ˛ LJ‘[Úäý/qíy^Wµĺy]…Ěv¶¬aX8VĘÚŘŽ×+¸ĺwk•Ěs 1Ě4Ń„Ä8pő:|O‰âz>Ńđý‡ŕđ€RŚ'Ačn·]×xÜną­ÖqĽfłYÄâő8té80đh�¶¶ąŽW1Íy®kqĽnłWWN <:RĂĐ xÁń>‡âz=>§Äń=NŽ'&ĄXśJµşć9ŘŽĎĐ^×°Ľ€�=(Ó†"B•·ć;^W•ĺy^W•Úĺw[ ŔR®Ň”ÔĹă8şÍgĆńzŢ3«ÔÔęęiÓi…*U¬ĆÖë¸î9ŽcĚs^c•ĚsŚ…a4áµ1158zľ‹ń>źŕú>Ź Ŕ\\M4”…qjă5šĽoż�Ç:Ţ·­ęőľ/©§FŤu4ő:ž/‡©éń=O‰éđř<>Ŕ€LDŁŽ§Ăéôü?áú~Ăáđt )N‚pZ¸šşťg¬ő>/Ăôü ŮđąYS‚8đx‰ĂŔ}�ü/1ĺs]ÇuÎ7Y«ĹáŃ t1 4bjq8şxľ3Ćzľ/©Őő|O§@0ęTĆbÂłár~Ŕ^Bě/"=®Áô¶čjBµ!50âbq˝gYă:ťNžźÄń<=�t8šxś<<=OSĂęz}>źWÓŕń=<4h�đpĐ<Gâü?§Ăéđtřx8xhiŔt`ÓĂÁÔęřľ'WĹęxxťNŻS‹§ś4ŔFś:śo­ëšÝn9®kşÜmdFÖ@ ppéŐâk:Ţ3[®qÝsÇ+¸ívą\ťJ&°âU¬žGŁĂęzžŐń|oWŚă1q!XŤ�h=>'‹ęxľłĹęőť^&§N.% 8:ś==<>'‹âxžŻ©áééčâhÁŁ pŃĐ<>źG§â}O‡Óáő<==N  ,¬şhÄ©¬ÖëuşÜn9®ëî»­ĆÖV@8u*DÔť.N‡‰ă<gYÖőşşÜf¶˛˛�Y)‚µ ŕâu5u¸Üw^cĘň˝čO‡Á©©R Hqkaâjë1šĺw®ÂöĽźřzzu5i"$�p <N¦ŻYĆqĽoŤăĘʰ�4Ô«4`Ôă1uşĘć9ŽWqÚî9 `.Aŕšq ÁŃÓâu<_©ÖzĎÖńśo[‹YŚ«�Á @4iŐă8Î7[Ç5Íw\®ëµČŽVŔ<AÁ €¬,Ŕ<ŕOŕü?GŃôýŹÓŕ@Ń€čĂÄâęqťgYăťo\ă8Ţ3Y«‹¬«Sšp`:G‡Đ=đýŕGŔ>ŕŕҰ`)��'¤ű«•Ęíy]®WqÚĺsWRšh: ĂŁ‰ĂÓÔôúźŕô}?Ăôú�ŔŕFŽÄÔÓÔń>'Áč?@ü? Ľ®ëĚ\4�J`Ň•14đđz}á}…óă¸î˛łWSHĐ@â-­ĆëĽn·ŤÖuĎă:˝NŽŽŽ‚”ŁŽź�ř>ř^×µíy^וÜv¶¬EÄŁN”§�ŕ�·Ěn9­ĆńŢ7YĆq1xšpphĐ4ÁOS‰Őńz˝^ł«Ĺë:şĽgY©‹‰‰ELiŕŃÁĐ}O‹đř}OSÓęz|=Nާ‡‡NŁO ==O©Őńž/‹ÔńzśN.ś8š”@N.®.7\×5ÜwÇ•ĘíyŻ+¸ě-ž�4Ôšh:uuĽn7Ź5ÝwWkĘěĂѦ˛ 0¬:të8çÇqÜy^@�Äôu4â@qjć$M8şż�ÜsÇ•ć<ź@ę|‡‡MH1 Ă84bc1°ą>Ź }ź‡ÄőzśM\eYÁR&Ť8µą>ůÓđz}OSÄń|^.¦­Z˛Šµ& :ś^/ÖkzÝn·\Ćëk1µ@4áÄ«S«Öux˝^3Ťëu¸Ýf7«Á Î uu5uşćą®k¸î9Žă±Đ�Ŕi¦¬Fž/Śńľ3­ëzŢ3W¬«ŚĹ©0jT¬€ôđjq8Îł‹Ćőśn·Y­Ćă+1••jÍ 1˛ł^cµČŹqĺ{ŽŔŹ+µÚŘ[Rh§ ]HV|�}?GŃđ~§Ńéôôřzš4âT€á… čNťN/Śń˝sÇ:ÝoŚĆă*ŔÓ+ áááâqzĽ^3Śă8Î9Ćbăśm\eX�ÁLŕ�§‰âřĽ_­ń˝gĆęë1•*ÔY8x0iâpőzĎŐă:Î/SYĹă8Íf%LJ %L]sYŽqÜn7×5Ýr¶˛#q`@ Ô©V¬°3ý]®×öĽŻk°~î9ŤČV°t�Y�.×ay ČŹayŹ1î9]Ç+1b0Nť=>OĂđ|OŃđ ŁčŁ'…0ŕ§K&€el/1ÚíwcµĚw\Ç5şĘş¸pч 8u8š˝^ŻWĆzĎ«ÔńzśN¦ťpS‹‰ ĎŃŕ>źŕř=?áő>/§ĂÓÆ‡&†"ęcxŢ3Y­ăuĽs®kxÍf®®&Ą80iH ŐĆquxĽ^3Ćxľ/«âřx:<=€Šś=�\®ëîą®qÎ7¬Öuž'ŁŁ¨t“€t¬FëÍs[Ç8Ţ7¬ęřΧ©ŃŃŔ84Ą8ť]=_SĂéôü>ŹŃôú]€­JtiAMM<>§čř^Ďŕ/kĘĺw\Ĺ««§�# `ĐZ•u8˝N݉â|OG§ářmn%:4¦ :@µÚír»\Ç+¸ć9[­ĹĹ©©‚Ś8hŁSFťN&§©Äęńž3«Őęőzššš)¦•ŹÁę}OO©đúžÄéń8tâi©�i«V×+°Ľ€}ô}ŕôzهEJ’R�ăňüž§‹ë<NŻŚęńťoW‹ B“ ĄZ•qšĚf3[Ç:çYĆbńxÍ:štęh”S‡G�ôü?GÁú>Łä/µî<Ż+ÖbÓ€LAe\\f®§YâxĎS§Ăáôz}�łŔNŽĆjiáń}>Źčüđ•ÚĘ•0hpś)‡‡§Áŕ Ř]ís×5Ľn®§€� ĂŁ@ÚÜsŽcšŢ7ŚÖq˝]^݉ĂĂÁŔF�§žžŽŹ‰ôü?Ńđ€x gˇ�AŔ4đôř}?ÁčúŔ�/+µ¸ÜJ"…1tięü�@č°ř�/a{^Äy]Ç++q*iĂ‚Ł@>źOâ|ŕôü>ŹG§ĂŃŔ00¬ŕáÓ§ŚëzŢ9­×5Ís\×+î6¶x‰†p ‡G«ÖuťoÖkśn·Žë+••`Đ0Ô©8©Ĺë:ÎłŚë5Ľnł‹Ś« @R"S‡SOW©ë=_WÓâzž§§Ôřz::88Ő«Y k•ÜvkÚö˝Żkµî;rtp�tpéÓ‡SS‹ĆqĽfłŚÖëťs[ŤĆcqaZ° "B°ą[ °Ář�A{�ôĽž�:4 0á§.w=¬Ç8ć6·\Ç5şćąÇ+1¸Č‹R�V4ńxĽ]^3­ă:ÝsŤă5şÍf-XV¬ŕ SML]]mf9®ëĽwăç×1ĚeX‰�F¦ššÍfąÇ5ÍsăşírąŽDn6· Á€ŕ§ L\n2#î;[\Šó]ÇqĘÚĺeXR YN¦¦¦¦ł¬ă8Ţ3Śă8ç«­ă*ęâT¦ŚF‚Ř�?«ĚvÚóc滌ĆâÓ‰˘Ž +VĹĹâë5xĎÖxĎWÖxľ'OO Ó�¸tééń}źĂđÁř{]…Ěs©‡‘JTĂÁĐl,®kšç¬ă5ťf§â-&�W‹«ĹâřĎÄń>'Äřź§ŕô"QAL4��.וÚó×k¸î9[YŤÄĹĂ€p…ĹÓÄáéń=OOŁéú>°}ŘRśŔN€[ •ĚwĆăšçă5śgS‡ ŁOIŃ€tzv»]®×k¸î9ŽëşÍf&¦ =¨Ěf&3Ťâęőž/WĆzĎĂÔđôđth"ť)\M^§©Óâ|O‰đý?ŔźGÂäE§�áSO€łŤĹă8ÎŻ‹ÔđúžŹ�đz 14¨4¦ŽÁđąÜy®kšć·­âjńxz8 ĐGIáM:…ČŤćąÇ8η«âôtú<Ł `ŕ'OO@Ęć;®Öă˝sŽqşÎ7¬áÔáŕĐN áÓÁŔ}Ář>‚ö°Ľ…ĺsYSĄ0h&ť:zz=?Ăř?Gŕ/+ÚísŤÄ§”Ă…0ŃĂáđ Čî=ǵÚóĆă*ââ`Ó śٍ¸şÍN/[ë:˝g«âtřž§Ł pĄ4h�ĄMM<=>O§áúĐ>đ1Ą0š8 ÁŔ…Úň#¸ó]×1Î9­ăzÎ'“„Ô::Nžđ»]×5şÍgYă|_SÄř|‚”`C…b&ŽčGqÝr»Çq•Î;×:Ţ7©«ÄáŕĐF§SGOOŔ>Łŕđ~ ą>UĹĂ…0`č'SŃŕúŃôř ĘímX‹§`áJšśM=OWÄřżŁâ|Óč�¶Ą4�~� ˘jháđx^Ďđ�^וĚyŤ¬¬ŐĂ€i1@&)ĂŁ€úźčôŁčüđě,­ÖjaŇphđ‡‡§§Ńčř>źŁđÂňqĘÜf¦ ŕ 8=•şć·Žuśo[Őęő}_Ôčéđ¤SŁJhĂ �>‚ěGb9Ýw]Ćëušşté°�R˛­\o×5ÍoÖëxŢ7YĆń5péŔ8:SNčđz>‡ŕŕú>đ�đ ©LC‡§‰ă<^§‰ă<OYâu<N§NŤ4iZµjă*ăšÎ9ĆőĽgÖuť^łĹâpđđp ‰©©©«««ĆńśsŽuÎ9ĆqÎ3¬«RĄL:thĐ@ʇč?GŕüKŮô|�ôą:V ś��ĄÚň}đ�>‚öńAč�iHF�¸ó~_ÇÄř} ô}?Gŕ�~…°˛"aŁ�ŃĂŇĘʰ·[Žk¸Ţ9®qÎ3ŚÖqtéÁJD4¤DááčÓř>—µî<Ż1Úkuq0iÁAeYŇć6»Ź1ĺv»Ź1ÚĺsÜen-1  8pęjń18Ľ^łÖřß[ă:ÎŻ‹ÄÓ‡•¬«‹‹«‰«Őęuzž'‰ęúz<OO hŔx8Rx[[[ŽW1î;Ž×+ć6·V®¤CNś@�x]źŕú_ ô#äŘ\®@ „ÓNM<~=_‰ő=>ŹĂń> ôp ��,…ôO Ďőv»]Ǹî<Ç+şć7Y¬˘ ÄÄÓ‡N§‹ÖuxĎă:˝^&§SN¦ś:p` ÂČYYڬĆëu¸Ţ9Ćńśg[ÔÔę`ŃŁF]N.®ŻĆńşŢ9Ćë5¸¸Ę•)¦Š4ppt@ô€}đ~ô~đ@đ¶¬Đ(ťF J¸Ür»]…í|€}ŕ?ŁŁ‡ @<4ë1µÍs\ÇqÚî<וć9]­­€˛QRh5`ŕâu8śfł[Ç5Ís]ÇqÉř g@ĂL%ZĘŘ<Ăđ|?Ăő>‡Ăń=<=<<:(ÄÓN&N3Śâő˝g\ë:ŢłŚëxşÎ3SS84` z<.OĄěđ}�~�>łŕđx�ŃŁś8śLM^3®qĚn»×5ÍsŽkĘĚeX�N 8•+1ć7Ç1ÝyŽWqÜsY ŔV€�Y €~„|€ĽŻk°+•aHL) a™fçyě]f®ŻŚë8Îł«Öu54č84iLZjbbqxşxľ3©âřĎWÄń<=VĄ�*jq:ťO©ęz}ŕř~€»[ Ä4ŕÁŔR¦&3SWYŐë<g‰Ôő|OŐđôtô0čŕŕ+Y[ŤĆă1şçăxĚ^/§SNť:8ŇşĽgÖqžł©ĹőľŻ©âúz|_€'•14ń8ť=§Ăę|>ôü�ř *DL)€j& Ŕ µÉúŹ5Üw×5ĽoÄÓ‡@Љ€��đzĐĺyŹ1ŘŽ×1Ěen.%:0ŕ ÁŁG‡§Äřž'§Ôôřž'§©âřś:štŕÄÁF¦ś:xxśN'ŤńťgŚńz˝^®§Š(„Ŕ N&®ł­Ç1ÍyŽăµĚvą[\…µ˛u4âq15ťoÇ8Ţ7Žk5şç[­ăqq•1*Bµ `Avb9ć<Ç•Ęî9YYVĄJ"‰NšĽ]:ś^3«ÖxÎŻW«ÔÓÓ©ÁN& Ұ¶đ|ŕú>Źđŕřŕ=‡‡u555ś]gÖőšÎłYĆquuuq(¦…`��ţ˙ü~ŹÁôŁčř> Éŕ�ph¦™Ŕ)ÄĹÖcqÍr»ŽÄyŹkÚí{]žŃŁF&J•`�ä˙Bů|€~ô|�K“ hŚ/›ăÄęőťgWĆuť^ł¬ÔŐÄÔĢŁ HYY<ŹOĂčđz}>źSÔőzzĽL8jS‰S 8śfŻWŚńĽ^łŚë<^Ż‹Ă§ N”ÄÓ§‡§«ęx|>SŃń=GŁ h¸1Ęó×�_ Łđô đ�4Q�rććĎIö˙Ŕü>—Čŕř~‡ÁÁC*ŐĆc+++šć9Žăć9®ëqçWWś\LNŁÓôz>ʧđţ�>Ź…ČY"85 :xz<>'Äôz~AüOŕôG€ ÁFŽW+k“ę;[]ךó\ÖăuşÝf®¦ LQ€˛Vkqqśo[Őâőxľ/OđńŠ4¦&ŤŔ�/+°»]®ăşî»¬Öńšşp Ž�V®.ł[ĆőťgŤńzž/‰ÓÁáčV!Á•0ęptôôz}?Áôý�ř>€t˛Ą4`Ŕ8�,…°ą\ÇqĘĺs×u¸Ýn..¦š4i]4ičéđxÁô� ä/ayĺr¶˛˛ÄĂ'Bttúž§§â|O‰áôôtph84 `ŕčĐ>�>Ź }Gŕú>ôz@ŕ�hĐOOS‡Äęřľ/W«ă:šśf¦Ą1&)§G‹ŐęxĎĆxľ/‹âřĎ«ĂĂŁŚ�čžŕřźĂđüĂń= ŕčŕŕŃ*UOSSŚÖqĽn3\ëšćąŤÇuĘČ k&f%I§Y­Ç5Úî=€˝€}ŕđx<<M5*ĚJ“&-emv» Č?|ź@ú~O§ÄčÁ‰‚…jN–×!r~óăÚö°•Úíl�4€pŕÇ‹ĹÄÖńşŢ9Ç8ć·[«ŤĆbÄH0†šµk++•ĚvĽŻ1漮וÚć9‹đ €˛¤0éÁ‡łŤăuŢ;­Ç5Ěs×1µ••aJiŃŁ � ĽÇ•ŘŹqÚěGšíw\ĆâÔp )MáúŇůň#ć<Ç•ć6f3Ś)č+WWW‹Öx˝OWÄő~'Ăéôx�,ĹĂ…0�§@ô#1qśsŚâńťg‹Őń:z|>ź€ťB �·Ěn9¬ÖuÎł‹Őéâtđ”§�á ĄČ şívąŽăć;­­ÖńšštéIÄ:�čô#µć=Çgč/+Ěy\®×!f7Y‰‰€S‡@¸Ěn·[­ăťgYĹńzť=NŽ� Đ4¦§ ÖEn»®kśsY­ÖřŢ3«§‰ÁŁFŁ&ŻWŚŐăzşÎ3Ť×8ÝfłYŚĹ©X(4a«ŚÖbÖcqÍs\×5ĚsĆÄf2"@R­3€Žčôz=Ăđ}Oáôtzxx80a© q1k+kµČ^BöĽź…äúŔ= aĂD)R®2łÇ5ć»®ă•ĚsÇ1Ín3¦ ť) +!msÇ+şívą]®c‘[[Ś«Rś:88 TÄÔâńzωâu<_‹âu<>ŕJQ@¦&'«Äęxž§«ę|>źĂŕô± QĄ·Ťăuuz˝_Ôő>�–b`ŔEY†Ť=Nźŕú~€Ňö»]®cqq(Ą(�EÄÓÓÔř}čü€Ľ…ČŽkupŕŕĐNś< ú�ú~Ź ~Čč/ ú Bµ(„Ó‡§OSÄń~/¬řżÄő:zť<4RłŁ ˛¶+µĘî;^cĚyŽÄr¶ą­µ*SM8pjiÔâő:ωâxĎYęxľ/OS§@Ŕ0piZłÂµ•q¸ćąŤÇ5Ěnł¬Öë5”éÆšupâTŐÖńxĎĆqxÎł­ęńu0áĂ‚Ś1µ¶ŔŹ+µÚóă¸ňą]Ç1Ěn˛‰Ąe˛ <:šşÎ7[Žkşî9ŽW"9]®AŃ€Ó ŔŚMMM]]gĆkxçÖëšć˛łY µ&ÉŁFŽŽ§‹ęxž'«ęxžŻ«âřž&§Fj@88xtńxşÎ7ŚÖkxćąĆău¸ĘÜeY˘�š“†š± Č>ŹŕôüOSĹőťN.¦,,‡¤M0¤đíř~©đřžŻĹë<N/W h5`ŕâu8śfł[Ç5Üw]Ż+“đzś0T”Î\dĂâzž3«ÖuĽoŽkşäłBaš"$ÁN%XŽÂěú?ŕú>Źęz:zť<8jT€¬ŕÓĐ:=OSÔő=>Ż©ęôń|N&ś4âS‡'SS«Ĺë<g¬őž3Ću:χS‰§ 4�@ôüGÁř>ŹÁô |ŕô�:•…)©‡ť=N§©ęüO«ę|>¦ü�C§Ăéđř�áJ‘ :ś]N3ĹęúĎWÖxž/‰âtđôđhŕŃŁJbÔ¸Üf3\ëšÝsŤăuśg«ĹÔÓ‡N0a¦¦&..ł[ĆëuÎ9×8Ţ7ŤÖqś\LL4Ó-HV˛VÂÜrą]×uĚw¬¬ĆbÔ©‡�tięx|>OĂôý}?GĂôz=�˛šˇÁĄjÔÄÔÓŐđřźWŕđÁđý.Äf.&0!Đ ÓŔ=yŽ×5Üs]ăxŢ3‰§ŁŁˇ Ń€Ą8xž'§Łáú>Ź Ŕ^Wk*Ĺ]8 aJtśNžÓđ~Âů]î9®c5xş�`�­L]^݉ęz~'Ăđ}?�úeJ0�8‡x|>źSę}ô}GŔ>ŕ�ú<0pôp®&'‰Őń|OÓń>Źčú=¸´D)LTŕĐY[®kxç®qÎ3Śă|g«ĂÄŕ‰‡�é8x88ŁŔ>ű^×µě.×+Üf&8  iL\::ž§§Ôř>ŹŁčú��Ľ­¬©‡�ŕP:N Ź€•ĺy^cµÜw×uqşştŕpi\88:<�>€^×»Ź+•Ěn7¦  pÄÔÔâřžŻ©ń>OÁđüĐf.&ŚJD\LM]]^·‹Öőž3¬ń|g‰ÄęiŃŁG%LL8šťN/Yâu<OĹřž'SĂáđ�4Ą+ TĹă:Ľ^ŻSÔő|O‰éđü>@+EJ”hŃô|/•í{^cĘĺmsWŽŃĐ|>ź§âz~Sâ|>§‡ÄčÓ‚€P0ŽŹ‰ń=O©éő<>ž'(8580ńzť_âř˝_Yâő:ť^'S‰§Nś4M@Ńëī¬ÖëśwŹ8ó]ÇqĘĺr¶Á‰‰u+ âjjă+ĺrĽ…í{^Ď ý>ĂÓ©R¤�88šu8Î/Öc8Î9×8ÝoÖk1”Ő©,Eĸ¸Î3Y¬ÖőĽo\ë|oYŐÔÔÔÔĐp`¦śZjUĆcšÍs®kq¸ć·Žq¸ĚZ•10ÓLD©S­fłÇ5şÝo]ăxç­ă8Î/`Jq11151uuśo­ăzŢ3ŚÖbńq10âaŁ�ŕ+ ŐĹÖkxŢłŚëzÎ/YŐępő88x4¦t­L:ś=OĂđ|�~ř Ęć6§(ž |đ˝ŻkČ^c•Ěs‹©¦€=aáéôč.×k°»]Ç+k5šşštčĐ@ár Ëđüčúú>ÉčĐ<4ĄfŤOĹő|NŻ‹âuz˝oW‰‹©RRś8šśMN'W‡Äęřž'‰âzľ§G h�ÄĹÖqşÎ9ĆńÎ7Ťăx牫ĹâiÁF‘ 8ť]=_SÄđř›đ§ŕđü>ŕđ�%:phčččôz>§Đ~ôý?§áđŃ `4źÄő<OWĹő}NŻ«Ôâu:ššiÄ…`ç&.łŽk1Üwc•ĚrąY8‰ Tť-®ŔŃô~Ář~ʇŕôz٧‡AÁ‡ ‚śLN/YÖńťo[ÖńśgWSRŠ(Ŕ�aZ¸şÎ3¬ă8ηÖxľ/‹Ôń<�O�+‹Y­×5śnłYÖőśgW‡S‰ĂŁG4čŕ+SW‹Äâu<_WÔôôz=>xZp¦š8ˇÇuĚsŽë1˝w­ë:ަ§OG Ń…0`ŕ�¶·×xć·Žkxç[ÖqśM<<<‰€aXW«‰‹Ćőxť_Ôń<O‡Óéđx Á¨pqGŁŔ>°#ÚěGkć2· :0h�tŽ—'Ňů~§áúźŁâzz:ztࢤŃF.,-®cµĺ{^_Áô}ŕ§Ŕ4ąśS"-ZĚn7ÇqĘć9Ź5Ěs\×+q¸±€pđiéáâřÎŻYÖu˝oŚÖőşŢ7‰V¬(ĂS­n;®W5ć»®ăµĚs¬¬«V¬)�Ń€péŃĹńž3¬ë:Î3ŚăxÝg«Ś©R¬©taÔáÓ©Őë:ÎłŤńśoYĆuĽ]f.¦%4QF8:<=ÓéôüO‡âz}>źFŤ0hŔthÓĂĂŐęxĎë<^Ż‹ÖuzĎWSS /�Á‡S‹Ĺă:Ío[­Öëuśef7˛­HŤ8•k+qĘíy]…ĺ{^Äy�ú ° +�Đ4Đ0éůxšśgYÖuťgĆqśn¦.&&%�4âSR˛·®ă±ăĘöĽŻ!y^O€xFŠiujOBu:ś^łĆńťnąÇ8Üs®V@tâM3L,‡SSYŽëµČ^×°~‡ęzž'SRĄYLÔ«Rź�đ'ÄôřźŐęuzşĽ]eJµÓ4aÄ…`„ř}?Ńáđř|N§W«©©«R­[§Y[ °» Č ÚöĽź…ć<ź@ô˛¬�h�čĐSÄń}����‚��]‡��-����?4��?��8lśOSĹőž'WĆu8ĽLa‰ ÖVëk•µÝwÇšďcšÚĚeZ´Âi¦ś\8q58Ţ/ăzĽ^/‹ă<^'ťtQ‚!©V¬-…°#Ęív»ŹqÜy\®ăć7DŇÉDŕáÔÔ¬Ć×+Ęěí|źéúź‰âq4Ó°bBÉŃŃÓÓÔńzĽg[ÖëxŢ9¬­ĆNŚ YpâUŐĆëšć9ŽăÍvąŽë¸î9Ťť,€ pÓR­f2·Ç+îĽÇk•Ěw[Ť«R­0Ä…"3ڬĆăxçăśn·ŤŐĹâępęiÓ§&šuşŢ7ŚÖqĽn·ŽuÍo¬ŐŐÄÔ§ )Z¸Î.ŻđĽ�8�ĺ�@ ëŽ=Ďo9|Ęň«Č´7ťěÍeG x°Â˝ý\ĺ›VŤ4Đ ÍS)• `d ­šăţ‰é6śĘV­ËVĽ¬bC$Ęöb3M›ŚÝfĂ3™|ĘvE1ˇL^ełWĄ@PÁGä8>f´˛á¬#ÂHq–HËŮŰG*m€µ×w°Ë±˙(r÷63·?´/Dô[Et7@óË7s*2°ëo´°uFŽNye"<„�Ä ŠHúJ†)ľ}ˇ„l•SŞ’UË!q/v aĆ*cF<cö>cĆ2bf`5Ô´’ŹM‰žF125‡ x?E±¤}#ĘěÓ:Đ”ĄK[Ůwí±>?Ë»BimS®6.ÎÚűgnmť§˛ućŞŇů˙2ä|Q.î’šä(ZAphBaXŔt@%•ĚGIS…9f_XŁ+gíM˛7Gp×q·qŐ4¤”JyM)Q"4t™%1/@F†ÂáČlF'ŹI¦şEZĎyĂr,çOŘ÷žÇyw<éG¬őŢż×zĎQčÜă”q=÷eŇrÜ>ăO—C"`ŕ@  … P, †gČÔâµdÚFÝĂ*Ë*ŕľ0FĂ aL x[Ĺ%7GĐqTlBи + ‚„Š„„†‰Ž–ž©¸Ăe´›>Śćz.·łî;ŢóĽíű.Łśă·ÚĚÖ¶V *86, T$LH P0  ‚ČDNYałŤ· ČrÜ×9ĚT(“)ˇ 8SÂĚ$Lq‘GA!p9aŁ‚.0ŃĂI$FD)0Ô$äĆtHˇ¸KÍ<ٞ–ćÄôJ$R¤ĺĆ)áyŔSF8Š@Cäž U„YK‰66)YH­*š„TDĹ3,3Úřo.ĄęŮř_†ůs§TóĘ´Ä·RĆ* â0«–nŘ—UҸc-áÝĽŔýŁđ®XŰXsNg„[­\ÁËZŤ"™ňž×¶vçNíć^ăŕ˝#µpĆšĂ-&-9¨DŔÓk€ĺ3·s/0ô^‘ĺ}±Ă[qN yF»µ\e1´ZŕÂ<ݦxknręž%ęŃyOKŇé¨ÉŦę•Thň«f]GÉ|”x_lrĎ6ăeÜHáVą‹N& 2©ĘĄşé;gN-Ü˝GÁ|#Ňü1Ë[q‡0ŁJ€¦5‹–óTĚ#+·2ó>ʵvĎ-iÎťŰĚÜů.UĄË…DZń1”ĹŞjĂ4ę ŕü§Ë=µËŤ:·Ró‹´ívĚáS,çLb,@r|1·uOPEđŹJđÇL鬹§Ę4cŞ]ËĄ[0äü'µň× íÖ[ÄĽW±í;VišU@Z r‹b\@ř/Iň®ŐŰ5Ë\9ÓŚ8·2ć‚Ę)1e�„ZĄ‰n<‡ö‡Řű?„|´yG”v}#„lđtTtT‹;M§ ´˝1¶8k†yo¦şk–şc–y^ŐÂ´Ś–  Řlrşb™ĂXo.tŢ\i˝8ŰŽŰZglm{NQ˘Ŕŕ°66x;FS•ézcmp× đ× íľá®ŇňĆU•a6TrrA1LK2Ő8§ë.ôëNňçNră-e˝1…ĺYF ĘĆŠ†‹(ŇtŤ+kážXĺŽYéžšĺŽX厶ť§(ÁŕčĄ4ÓÔµN)ŢŰŞun­ÝşĂ»qn-»fŘÂíV8Ň0Ť‡˘ň‡ä~ě�^`^eâ]Ó©qmŰ4«N‚°°Ŕä6<%ÉxO”yO¤ů?(đŹňźí=Ł“ŕöy+E˘8 O)Âđŵn0ęťSĹ<ËĚĽËÜ ÔĽĎŔöŹ’łŁŁT ă±q� ööaôö#ň^ĂČř@2É`,pŚŁ)Ňř^Ó;k–řo‡·ËŤ·¶˛ĆXµÚ­tVX €đ�äÔ|‹ĚÜ Ý=ËÔĽŔĽ@ş—4ܱDe4›U« iŚłË\3Ă<łÓ}3Ó=/–:W*ĺŁ@Y *;M« áś·–đă.˛ç.rëNtçNtÖ[Ë8c “”J)4ŠM&—…ĺzcLmžĺžĺ®™ĺŽéŽ“´ňŚŽ‡#‘ł±¤RmTĽ1†ňă.2ç.rëNrăNtă.2ÖY¦0ŞE"NQ(”RiX^Wŕťä8�č čX•@¦QGE#@DŕŇ”áĂÄń<OO§ŕôý?GŃř>‚ĺeX‰‡F‚¸«§W¬ęq<_SÄń~/‹éń<=§@ŃÁĐrkĚy]…ĺyŹ+ĘäýČV­5*S‰‰©ÄÔâqx|NŻ‹âxž'«áŕętph:Đ\L]g¬ăśoăxŢ3ŚëxšĽ^&ś4`)Ó‰ŐÓŐđő<OÄř}?‡áđ€�)ÓŁŁÁčô|?O üéú~OĂŕ=Ł@Ŕ4h:|OÔń=_Őń:ľŻS‰Ôęq4Ó‰LчZ¸ÚÜsÇ1ĺ{]€ą]€pQR!IŔzśN3¬ăzç\ăşÜwÇ+al4 Jb2ą[{Ź`@Oŕř>GOO )˘R­Zµq¸Ýs\×5Ţą­×5şÎ3‹‰‰†ś51)©‰««‹Śë8Ţ·Śă:Ţ3ŤëxşššhŁ D©V­ZÜmmms×uĚr+şć9Ćă1q"”…4éŃÁŃĐ}?‡á}ź‡ô~ŁévÖbQ„ĐxRť<€~�]ŻqŘ®ëšÝf&¦ž!Đ&:}?€Ářy Ęň»[V"ę`Ѩpčqqš¸šĎŐőž§SŐôú~'ÁŕéJpa50ŕÓáéđý?Ŕ>€?Ňěú]Ç+ +‡�C tÜn·\ăśf3[ĆqťgW«Ĺéęxz88N =�-­®W+µÜyŽë•ÍsŚĆbS‰©€`ˇ84ôđu<_Őő<_WÄń:ľŻWĹáâpbjT…jÍ<=_©ë}gŚńś^ł‹ÄÔÄÄ©LŃE8ʱć<ŻkĘö°�Đ~�8�Đ4čŠq5u11uşŢ9Ç5Î7×5ÍwYŤĆbŐ…*@�ŕG‡Ôřź‰éęzž§N aY§&.2łÇ5ć<×ě/+°»^c°VAÁMK¦­ed�‡čôýŹG§Óéčń:xštÓ84âU€Ź‰âřťO«ÖxÎ3YĹÖjU©�!YÁ‡SY«ŚÇ1ÜwÇ•ĺvĽŻ"<ÁÁ§M4Ô@čŕŕętő}g«ă<_Őâk8¸¸¸• �âc*OAđřz}O‹âzž/‹âőxĽ]LHV¬ÓŔ:8x:xĎĹă8Î7YÇ1•¸ŘŤ…°0bA«‹:ĂŐńťg­ëšć7Çarą:Š` J°�?SÓęzžŹ‡Ăâxť^§S \[Ă©‰‹Ś¬ĺr»Ź+Ęö˝Ż'á{Ź'ŃĐFŚ0DJʵ•Ěs×";Ž×+ílFăq”ŐĂ8ŃŃđz=ŕ?GÓř?ŃđzŁ p¬��2ĄXŚĆVëuçëśo¬ăuśgS �tšpiâpřť‡ář=ŁáđGŁŃÔZ!tń~� p�<��ŕ?řöµí{\®ă••aJ0‡OGÓđýGáüđ�^WäȉE�@NÎňë8ÎŻW«âúžSáôüB-80�N :<ŕ@ý€�]€»[ Ô«‚ťN ü|GĂđýOŕř} đz<�h:pŐĹĽ ĂŃĹń|N/YâńzßĆőuś]\\X4 q Ó§W‹«¬Ćcśw]ÇuÜwꀶt )€§SSŤ­×+¸î;]®ăĘäG'Ą°th8" Ő¬®cµĘňĽŻkĘňĽŻ1írĺed�€¬ŕb9±…ÜyŹ1ÜyŽkµ•Ín3ť: S§§ŁŃčř?Âů?Gč�“đ@ŚÄ§‚ph�Řć7ŤÖńÎ7­ęńž3©Äéđôô�‡�á4hččđđňŇě/1ÜyŽW1¸ÜJpč`ĄµČ\î;Ż8ďÖëšÍf®'NŽ ŕÂČYŚĆjë8ßŐë<_§Äđř==Ŕ0ŕ&ś::v�^W•ć<×î;Žcuşµ14Qť88ś<<_SĆzľ'SĹęő|gS‰©¦ŠiśtéÄĆk1¸ÜskĚv»?Ař= Šq �ptttxžŻĆxśN§WS¬ÔĦĄJ“N •qÜs×k¸ň»Źqć<®×!md,«0`ŕŕÚĘĘÜw[ŤÇ5Î7[¬ÖjńzÎ' ‰SŹĂč?áüđ ö� jT0śMKö»]®c¸ć9ŽkqşŢ3SNŤ& Ŕ@-ĆëuÎ9Ćc5ĽoĆőś^/§„ŕĂÁ täŘ^W“ôĽŻqÚî;ŽVăqišRbc*ĂáŕęxĎĆxÎł­âńšŢą­ăjÖŐR¬«VÔĬěč?B}?OÄôúž'O¦%X§$Ęíř~SÓęzž'‹âőzÎ&­J¬L3 h<:u8Î7ŤăçÇuÜwVÁč�`ĂV@š•kkłŕ?GÁđ|O‡âřťO«Ä©V¤0:tęjqĽg\ëzŢ3[ĆńÍnąĆă1qjÔ€Ŕ0aÔâqzÎŻă8Î3ŚÖqşĚ\\Z­ZČtéÓ©Ôâőť^/WŚë|g¬âë5*ᦥ3�Ă©«©«­ăxŢ7Ť×5şÝs˛®-XR8pŕ=Óđúđ}?GŕúŃčŔ:��S ś^/W‰Őőž'«âúľ§‰Ôętp`< C ă µŮř>—µň˝ôĄě x: °ji«ŤĆ×qć<®Âě/gčü�ü�x| 3 J°ÓáÓÔęuž·ĆřßĆńšĚn2¬�1˛'SW¬ă8Ýn·[®ëqć¶…`ŃE3GN¦łŚ×8ÚÝs×ĺwW+•łŁ§~�!UĽ>ź‡ÄřľŻ«ń~3Ĺń8śLML¤ĄX[\źKČ_'ŕü?GĐ~ŹG ôhĂ‚¦š•1jÖk+xć·[®qŢ7\Öăśn·Y¬˘ ©W®-f3®kuĽsŽkušĚ^.&&M8 ©‰‰©ĹęřĎĹőž/‰âřž čS :Vµu8şśNŻ‹âxžŻĂčôxÁĐYN �péáŕéđx>ŕ?GÁđđ…ČYVN§Ą°zĐ^Way^×k¸ír#qµqjDL818(âq88ž/‡©âúž'‹ń|_S§§‡‡€¬�Văkq¸ÜsŽkšçĆńšś]:thÁN¦¦¦¦¦łWŚÖńĽfłŚăuqu¸´Ä�źĐŃôýGŃô}?ô��hÁ¦Ś:pbńqxçÇ8ć·Žkxć2·[ŚĹ«X4áÄŐĹĹÖcuÎ9ŤÇxî»®ăîąY °�śq11*ă1şÜsÇ5Üs×q¸ĘČV°¬�pŽŹ‡Óčôř~O§Óáń::4p袥Y§E:şĚf9®cşó]×íy]®VÂŘ�ŕ8pÓ˛¶ą��ţŹ }/`€�vz !X�šé;=žçÜűÎkšćą×8Ţ7ŤÖqśLM:(ÁNś8pęęjă:Î7­ă5ťoĆőşşšş”SLD«XY •ČŽ×k•Üw^ëşć9®c1jD8”¦Ť>OĂô|Łé}…÷ăĘó€¶łŚ)č)WW‹Ĺńž§‰ęx~/Óđüř *D8S� tĄşć¶ł\ëśoÖőťgW§F ĄG bjq:šzžŻ‰ń~Äř}?ÁŕđtĄJ(�t­ZşşšÎ3ĹęřĎÄő|=�S�QÄ]8tt‡éüô�^cĘĺs¬Ő˘Ś„ŕštpx|Ăôz>€?�ĺvn-�Ŕ8z�˙�źF«µíy{í{ĺw…łÂł‡A‰SąŽWgá{^_Ńř>Ź€z=źšq)…!JČ[ŤŠî;Ź1ÜwÇqÝs®k1•1( đ®:x8ŁŃđŁčüč�µ°Ő«Nˇ�ü'łŐűYŤ×8Ţ3YŐÖuťN'J`ŕ%iŃŔYW[Ćuľ3Őő<OOĂđ|?@,ħ  Š‡\MN'O©čú~ŹÁř ¸ó[Y«‡F„< tçŃčú>—µć=Ż+î;ŤÖbńtđi8�)‡O‰éôz>��Úî;VłSN“µx˝_SÁčđ»]Ç8ć/‡€€ÂYN ąĚn9ĆńĽg«Ôéčđt"hÔ4�WSOÄú~ř?@ň"9ŽbâQ§�ĚHR+5ĽsŤău˝sŤÖk8Ě^&®_€:pŃÓR¦.3YÍs\Ćăkqşć7[¬ĹĹĹĂSt«YYYĘÚî;Žăşîą\×xĺZÜJi˘šq10ęęjqz˝g‹«âőž3ĹęřΧ‰ ŕ84®$EĹĆqšÍ]g[Ćőľ3ĆőzĽ<:xt (Ă«‡®3ĆăśwŤÇ5Íw[Ť¬«R­0ś4iÓ«ĹÖuĽf·[Çxć»­ÇuĚsŤČ •jŐ¬…µĘě.Âň» µŘŹqĘî9YV˘Âjjiáéń=O‡áú~Ź€}�}@ȉE)N•©‡O@čü�Ľ®×q湌ĆbęjčŃ ś�ś…ĘÝn·[Ćő˝gĹńzť== p¤EÄ‘ŚĆcqĽsŽqÎ7[Ćęâńuu14éÓ‡LCÝsYŤ×5¸ć»×uÍf7YŚĹÄ©”€®./S«Äęúľ§©ń=OGAô–BpŕĐSS‡‡§Äđz}?Ńđ}�}/qŮéef&Âx�DŃŃář>gáv#¸î;ŽkşĚfłSNŤh‘ś^§ĆxľŻ«éő>‰č>ŕđ§G8ś=ŹGÁř>—±ăĚy\ÇuĚ\]M:84tísÇ5Üs\Öăśnł‰ÔâphŕҰŔ ôđňĐŹ•ívĺr¬) …!L1›6w™‹¬âęńxÎłŚë:˝^¦¦ťF€Sšpâq:śOWÄő}_‰éôú:|VĄ4p�V®.3[ĆńĽo[ăz˝gW©âxx88�' ŐÄĹă8Î/W‹Őőž§‹âttř<�t‡€­\n7ŚĆëśsŤă1uxÍ:štéŃĄ(§O�Đ]Ż1ŘěWµŮü.W"6·ŚÄŁ�0p–×+ó]®ăµĚy®ëšÝe\]MM8VŚ<Ś«Y®ńşÍgÖqś^/©âôôh)@Ń•15xšxľŻ‰ń}>‰đú~'ÁŕéJ(�t®.&.®§Öxľ/¬ő|>Ż‡ŁŁÁŔ:©€p˛¬,Öqśo[ŐŐë:˝OÄń:ž§ŁpaŕĐ: z�ú>ř?�ü�}G ąY !Jb.^&ť_Őńž/‹ęř|Oâřž§GO@h•aXĐ]ź€~ÚůŕřŔ=ÁŃŁśS‡¦7ŽqÍs\×5Ís\×1şćłRĄ1AŕŁÂÜs\®W+µÍyŽcÚÝmeLJiĂMMN.Ż[Öqxη«ăxĽ^݉‡FVµq•uşÎąÖő˝^3¬ë:˝_S§ŁŁ€��Áه©ÔęřĽ_‹Őă8˝\N3S™ÁçĄZĚmscĽÇµäG˝€»rt ŚL8Ľg¬ÖëxÝs\ău¸Ţ7«‰S 84hŇĘČ[Ť®k•µ¸Üs[­ăzÝ_€]f¦4§S€xräGk•ć;Ž×1şÜn3WMáŕđő}_SĂâř}_OO‰ÁF Ž O‰ęúž§‰ń}O‰âpôő4iÓ†™ h箹®címr+Ív»]…Č[�ŕ©‹V˛¶+°» Č ÜyŹ!v#±…aX BjŐ©ŚÄĹÖqśoY«Öuľ7ĹęřΧS§@¨šp€Ęĺms]×5Ţ9×8Ţ.¦¦ť<@��Y ÖÖăb7ă¸ć7×5Ín3` áçNŻYăz˝^łĆőťoWŚë8Î/Q�+Ž <N/YŐă:Ţ·Śă5şĘµjU©�)N8šxzť=>'§Äő>'§ÔřžŽŹ€ a§ jęë8Ţł¬ë<g‰Ôő>'©éôpx §�ŃGGÁđ}đ˝ŻkČ^cµĚr˛łŤ‹§�Üef7ĆńĽsŚă:Î&§S‰Ń§@<8şšuťgWYĆőšÎ9ăśo­ÖbââŔ� •jăqµ¸ĺr»Ż1ć;Ž×qÉú ,€ŁťMM\\f7­Ç5ĚsÇ5ÜlVÂĘČ‹L&(ÁÁŔv» łđµĺ{^WqĺrÂʵ)Á€Ąx8\ź µČ]ÇqÜs]ÖńÍ\gS‡F‚8 aáŕčôz�üô{Ź+Ęĺw\ŬŐÔÁ€śZšĽgWĹń=OSář=?GŔ~‚ÚȉNŤ+M84ŹŁŕř� /+ĘísŽbS‡�ŕ#�-®VăşćąÇxçăxŢ3‹ÄÔâiŃÁ śY +1¸ĚgńĽgâőzťO§ĂŃĐ8Rš §Ž€\Ç+•ĚwÇ1¸Ţ7Y¬ÔÓÄŃ€�Fpčâttx~‡éúŕ��Ź+k1”`Đ8 Ő©WY«««Ćuž3Ĺęq:zś<<€tBÝs\ăçÖczď[Öń˝]^'‡@CAĐJşś^/Śő|OWĂęüO‡Óčđ�.&Ŕ-¬«Y®uś^ŻWÔń<>Łŕô"`ŕB”éL:z|Ľ®ăĚr·\ăxη‰ĂÓŇ”ŕ4t®&ťNžŹ§čú?ŕú]ź…Ür­\MLPѧ§Áđ}ô˝Ç•ć<Çkć6łVŠ0G€"âjqxť_ÄęzžŻĂęz}>€ ŕ)q5zÎŻŚń|_WĂâxźÄôôtôÁŁ•qk"9ŽDv#‘cĘň#µÚĺr¶˛ Ôši©rą>ź‡ář~O©ęzťOÔâaĦĂ:�,¬ć9\®WkĘć<®ă¸ŘŚ®VbŐ¦ ‡ŽźGÄř~éúúŇě°¬CAhqşŢ3­ńž3Äęzž§§Ôř|µ0`&(ĂÁŃĐ�đĄäýí_€{]ŻqČYZ”Ä:pé燩Ôń|N§‰âxľŻ‰ÔéętiŕÁ†Vp=^ŻŚă:Ţ9­ău¸çĆă*Íś5`ÁSWŚÖńĚmn9]Ç1Üw…Éč)€Ô­.·ŽDv»yĐ>ʇÓáčÓLEšgjŔ\Ŕ}źO©áőzxśMM\\I† Xq•—MLedG•äň€ü>݉ÔŐŐ©1 `Ä€pâkšć;^Âůń>§©âqušµfŠČ—V&,<M\es…ěúÓôř}_WNł¬ÓRa¬‡2˛'ĐŃčú>©đúžŻ‡©Äщ‰Y§M8¸šÝsŽkqĚsŤ®cqĚmmd)4T)Ľ‹ĹÖVë•°»ň�ŃáčŕÓ‰RS¤8qŃ?OG‡âz|OÖx˝o[Ćëu¸Ř[1 Ô«VŽ'¬ë8Î7®ku¸Ř­ÇqČ< 0 •+++ay^×Čŕú>ʧŕčđhŠp8q58şşĽgĆqťoYĹŐŐÔĆa¦š0`ŃŔ@ô@úĐ?ŕđ€z…µfDčŔi©]_±Úívµňô€üŽŽ4DJ•ł…Č<.ĎŁé{^Âň~üGáv+`E€©R¦.&łŚăzŢ/ÖuzÎ/[âôępŕŔ4‡OGGĂŕŃô~ÁřŇö»=,Š�é8JÄn·®qĽs­ëzÎŻŚéâu::8 Ѥ A€€ł¬Ćk8Î3ĹęřťOSŁŁ �N‚8đxqxĽ^Ż«áő>§ÓôüŇň#jÓF€S �Üs×1Î9®qÎ7[ÖńuxťN'‚” &Ť€ µĘěGuć;®kşÜo¬ÓF”Ă€t˛ĄL^.§©Ôđřž§§áô|>Đ 0iLZiÉÄępu=O©ę|>źO xdD¦Ť�©‰‰§‰Ôő<OSâ}O‡ář}Ŕ\4ŕÁÁ•qk5šÝ^3YĆu˝^3«Ă©ÄáѧIpéŕŕéđx=ŕřŃđ'Óôz~źG p”BiĂ©Äęőž/WÖxzžłâüOÓÄééŕĐ 0čŕđx}?čř>źę~§ŕř<Ŕ *ŃAJ0px=-Ç1±\ĆăšçŤÖë5ś^3S‡Z(ŔR¦§§‡©ń=?Sčô€�^BÚ± č+‡Ź «µĚw®cśn3[Ćjjiŕá1�á\Jšu58ž3Őń}O‰áôúz=ŃŕDŔh𦞀>��/'éwkćą­ĆjéŔt¤+‹§‰§‰ęú}O‡ÔřźÁéú}?€ ÎŤ"$�Óéđôřľ§ÄęńťgŚÖk1jLYq+gO‡‡SŚÖqşćą®c•Úäř�ŕÓLÓ˘p uuşÚĺr»WŕBň}�§ŕ=<4Ô†¤Nµ•Č\ź€~Ŕ~€ź§ÓáéɆĄHV��źIúâäýö» Ęňkşĺmf-\0Ššq154ń8śNł©ă<g¬ńž'Śń8ťM:0iŃÁÁÁŔGŁĂę|O§Ôřž'SĂÔčÓ˘š•&š1*U…‘…ĺ{^W°ö𼝣FŠpâT¸µ••µµÝy®ëĚw\Ç1•Ěef3N%LeH‹VłŽku¸çÇ5şÎ3Y«©ÄÔÓ¦ÓF&.®ł[Ç8ç[Ç:Ýo[Ćqš¸”âSS¦3ŠĚs]×5ĚsŽëÜn¶łWS špÔÄĆjŐÖk5Îą×zç[ĆńšşÍMJpE­\L]]MN/‹Ôń|O§Őôx€ôĐ4`<+<-­ĺyŽĎâ;^cĚv»ŽÖăq”ŐĂNś,«:Vł®qÍf·ŚŐâęńz˝N'Ž � ‰ŁFž'Ôë=gW‹ĆuťoY««‰N%0�tÔ©V˛äö» Ř_+Ř>éyŁÓÂČ :táÓ‰«ĹăxÍg[ÖńšÍf.˛ĄZ•q)˘Ł@ŕ�˙ü�źú˙€ ţŻ+#g€ĂSĺĺĺřžźSÔôú~'Ăčđx<‡Ł€� SN:ťN'‰âxž§Äř}>ʇŃŕôtŔ0&šjă+q±®×kµŘ]Ż+ČŹ1Ęĺed‡MHxjc+k /+łđ}�ý ěôzz:8t%4Ô˘ĄHW¬Ćcq¸ç×5Î7[ĆUĹă0â`ÆśLM]\]]f/­ăxÍgÖńq5šš(Æ"@V­f9ŽW1ć;Ź1ÜyŽă¸ó\Ćă*Ô©‡�)N'W‡©áéôú}?OÁđ…ěř�+Rť@ĐWSO‡Ăéú~ô˝ŻkĘíw\ŬŐÓ€…0h�­Jşś^§WĂę|OG§ářmf%:4¦:@�ą µĘěGuć;®ăşÜnł[©N€Š�<�~€ ˙Wµíyvą[••pBi˘ŚĽŢN/‹ÖúÎŻYâőx˝^Ż«§N8a5 �tttx|>§‰âúżÄń|^ŻW©‰‰†�*b@�čáęőś^łY­ëśną®VVÖÖNŚšµaÓ§Y¬Ćc1Íw]×1Č®ëµÝvą[Ń€Ń��pppđőzťg­ęęqxĚ^3"Ŕ�˘šǧ©Őë<gÖë8ď\ăšÜmeeed8!3ĂM\nąŽDvą]Ż+Č^W•ä.×`čѦV¤�¶ą\źGŇöů�üđ�^Ď@.@�Đ4ńăËňq:ľŻW«Öux˝gWWŚë51q1(©‚ŤN 8:z:>/Äő=O‰áôřť> ‡N Ť x<>ŹO§âü?‡áđx:z4iâ`4Î N&&7ŽoŔ+uÝwÇ•Ęě ň»ŽŔ@ á˘"U…k"9ŽDv#‘^k¸ňą\Ç1••jÔ˘)¦®ŻYĆuťgYÖuz˝M=:ś4ęhjă*Ő¬Ç1ÜwŻ5ÚóÇqć6ąY‹V©0ĄJ¸şĚgăuśgă:çĆqxĽL8thŃĄ*bbjjqť_âúľ§‰ęzž'©đôôtpp )«‹‹Y[[\Ç•Ę÷cÚóŻqŘ ��:4éÓ‡ŚÖńÎ3­ÖëśsŤĆcqaZ° M5*U¬Ç1Ęĺv»Ž×•ć<®ŔŽŔ[�Ň ÁŁK1jŐĆbëzçŚń˝g‹âtő<<=�śt"hÖjńxť_WÓđú~ź � jÔŁá4š4®.žž§ĂđÁú Ísăśg§…(Ô Ҹttx^וÚîĽ×1šÎ3S§§…”Ц‚8SG@ř^cšç«ĹâtřžOŁÂĘ”č BŽŹJă5šĽg‹Őő}O‰ářźO…Ůéf%ŇtUĹÖuzľ§OĂń>§Ńđ} b3�JÄN �˛łŚÖjńž3«ă=_‹ęz|ŃŕPiYG�.OÄsŽqη¬ęő<O§ŃéLĄ*`ŕč�¶W5Î9Ćk8ÍgYÄáŕŕ<E ŕDĂŔ-f.łŤâń|g¬ń<>ŹGAđxWÁĐ âęęń:ľ'SÔř}?ÓôQ‘�B„éŕ�˙cî9®qşÎłĆu|O€śM biŕęx<ŃđŔ?v+qµ0áĐ4łśMN'S‡§Ăę|O‰đz~Ař=�B&z kjÂÚÝw]Ç5ÝsŤĆqş0P�hÓĂĂáéń:zžŻ«ęúľ/‰§‡©ŁN J§‰ÄÔŐÖc5¸ćą®c滍Šä,¬… ˛kČú>źŁčú>ʧŕ>ŽŽ @ .šk5µî9 Ęň˝…ä�˝…äř<4áĂR®2˛ł\ÇuÚć;ÇuÜwÇuĘĘĚf-4`Ń•*jńś_«ęřľŻ§ÄřžŽŹŁÁŕ iÄÔâq:ž§‹ę|_Sáő>OŁÓŕ)€p:WN§‡Ńč?‡čAy]Çq•‚t¦&Ńŕř\®EyŽcşć9ŤÖëux¸štđhŔ�ŃĐ}>ŹO©éôz~‰ŕčéŕÁ†Śtq8xś_ĆxĎ«âőzĎÔâji˘šb%X8GG‡Ôřžź‡ÔřĎ‹ęu}^§MԀ৭×uĘDr<Ż1ÉélŠ"•+1Üs×kšíwë¸î9ŤÚĘ“ŁJŔ080ęőś\^7­ăxÎ9ĆńĽn®$Eħ‡@ŕ�äú{ °Ľě.×qÚÚÜmJhÁÂbśż�|=>§Óđ}Aü�?@ú=-…q0Ä:@-ĆëuÎ9ÖjńśgW¬ńzť^ާ‡ŁpičĐml.WkĘěGqÚć9Ť¬­Ĺ©‰©€ŕˇ85:x:žŻ‰ęúž/«áń<_‹âxś<N :q!ZłG¬ńxľ7Ćxη‹Ćqš¸¸•*°QSV#b<Ç•ĺy^BňĽ…ä.O…°x�+V™Ň‘¦.·ŤăxŢ7¬Öőśg[ÔŐÔáÓ @Mxx:<>ŹĂô}ŕ?@ř�łŔ ÁŁPčŕ�¶Ń®ńÎ9ĆëxÎ7‹ÖxĽNŽŽ� N”ť�ä�}é{?ŕú?�?GŁŃŃŔ0DJ°éÄĹĆkqĚwóב@>€ đ‚Šq!H'łől/č^W•ĺyv»^EvąYViĐRĄ˙�đ÷cĚw]Ç1•şĚ]]:0°#0Ó‰ĹŐâęő|gSĹń}_SÄđřz84 +tSF&.®łÇ8ç×8ÜsŽkuşĘµ*T€¬•gK•ĘócĘňayć;^cÚÜZaJ!4áç‹ÔÔâőzĎYë}g«ŐńxśN)YŃÁĐYYYY\Ç1ĚwÇ1Íw[YŽqµuq)Á€ÄÁÄŕŕđú=?G }ü�°ą b$CG˘âS§‡Äń>'ŁÓđz>ř>@ôx0ś4p𲶶ą?ÚÚî»®ëšÜn·[¬âę`Á¤Ĺ8�±\ăšÝn·®uťoŚęőzž' ( ÔŃŁ z •Ęî;ŽcîąÇ8çĆuu80�NŽNť=OĂô}‡đŔyŹ1°­f&ÂhE§€ô~•ĺv»Ź5Ěn7W �ŚN<Áđ}đ˝ŻkČ^cµĚsY‹‰FŤEÓ€n2łŤăśsŽqśgYÄÔâq8tđpphÓÁOWN3Ťă5šç­×:湬Ćë1•q`�`¬Ćcq¸ć»®ăşî;ŤŠć2«RĄH ŐĆc+1Üf·[ĆńšÎ3­âéâđđč<)E)&ާĐĐ_+ĘňĽ®ăĚmn7taH‰§‡Őő>'Äř>Łéř^O ¶­J4p ¦¦ž‡Óôüé|ŻkŘ]Šíef.ś�Š88:[ŽcuÍoăzŢŻâő8z|�Śtś�"jđő<>ŹŕöĽÇqÝn7‹ĹŕĐSIĐ…4iJť=Ź…ň˝Ç¸î;­Öq4ôđ(4žbë8śOń}>§Óđ|č�¶f&ŁH˘Ť:<ŹGŔ>Łéý@řŔ]­ť�¤ D¦¦]M]g‹ÖxĎ«âő<_W§§‡�Ňb8tiâtôř<>§Äř}G§Ŕ|Ŕ QN&Ť:8::=>ŹOâ|ôü?đG ĂE_€4ptGŁéü��?đ|�ř�•h �‡…üř}/k±W•ÜyŽă¸ć3¦ Ł@ŕÁŕč>ŹOÁéřźO§ÓŕééŕÁŁ 0¤:0âqušŢ9ŽcuÍsÇuČŽDr˛�84L):O‡ÓęúľžźĹń<g‹Őă8šÎ.­Za55)Äâq8ťNŻWĆxľ§SÔđôôđhŕáŔ0D\JĚd-ň»^×±×±@]…łŔ$MJ•| z>§ÓôüOO©âtđéÔĦh�téâőťoĆńÍs\×5Ęć;Ť­ť€é©‹‹Ęä/+Ř>ŹŔ>ô}O€ôđpa¦¬˘­XGGSÓÔń}_«âqťgWW‹ @R©‰‰«‰Ćq|oŚńž/WĹń|OÔéččŕŕŚĆkšÝw]×uÝn»­­ĆU…!Z•`ŕŕĂęz<>źO©ń=>SŁNŚ”Í4bbU¬Ç1Ř^W•ĺ{�/`—“ piÓN•!\X[ŽWqÚäWóÇqĘŘ[\¬…j@LŃĂŔzx8zťg‹Ôă<^ł‹Ĺë8Í\]ZµqfŠ1*âÖVckĚy]÷ŔŹ GµÚíl-«4TĹWRź�OŕúĐ~Ź€ü>§§ĂÄáÁD&…*լȎcšî7YŚÖë5şĚ]MLtĹ8ššşş¸¸Î3YĆëušÎ9ĆbăxĘş¸”áÁ€đp¬đ¶ą •ć;?Kµî=Çk¸ň¶ąYbAŔx4��.BňĽ®Âň˝Çšö»ŽDn6­LJpÓ‡SFť<=gO‹ń|O‰ęzľ§OOŤ(Ă ŕŕŕâu5|oYĆq˝sŤ×u¸îąŽcq°¶bT«ť:şşÍs[Žkşî9ŽW"9]Ç ,ś(…*Ŕ8:<>'«ęxžłĹń<^ŻS‹§†!LL]N.®ŻĆńśg[ÖqxşšupaÁ@Đ ŐĹ«ŤĆk8Ţ3Y¬ëzŢŻ«ÄÔáŕŔ�DÓ€immmmn7\×8ç­ăuu8śN<ŕÁÄâpjőťN/YÖqťoŤăxşÍ]\\X�a©YY\®Běě/kŘ Ř{]­ť,ś�hѧO‰©©¬Őă5Ľo­ÖqÍf.7L&(§OG‡Óŕő>‰đüO‡ářžŽźGFŤ0hŔ0iępő|N/W«Őńz˝^/Śâjja¦YjjquxŢ·YÇ:çăšÍsŽbÖc1`5*ÂÜv»Ź /`/a{ Ř^×k`� µ*SN&'S«âřĎWă<_SŐôřž p©Eš4iđđx|G§áôü?ĂčččáZpi:tn3ŽőÝnąĆëuśgĹęéѧF� :58ť^ŻS¬ë8Î/ÖqšÍ\M\Jjü�BBiÓGGOSáő>'ĂéřžźSâx<=€8�ŕŕOÄôú=?ă>'Äń}^§š)©ÁN&3®kşĺw^W!v<Ż+“Âä0!0€¶ą{^@^ĎŔGŕú>čđžL4ÔĆqĽf3ŽqÎ9­ăśn·[«‰u)Ă€háZµqšĘ¸Ţ7ŤëzÎ/[ŐęřÎ'S€�M�•«‰‹«ĂĹęúľ'«ęz~'ŁŔ<Ąq0�€FžŹGĐ^cÍr·Ç5şçĹÖpń|=A �DÄÔâńzÎłĹâřž3Ôń=OS§ĂŃĄ‘ �=�¶#¸ć<ÇqÝwÇ1Ţ9ŤÖâă4âiĂDS‰‡SYÖqšĽoWWŚă8ŢłŚâńuu0Â!IÁ pčŃĹńťgĆqĽoĆń¸ÝsY[ Ŕ&Ŕ4:śgĆńÍsŤÇuĚs^c`�˛ @�:pâbă+5Üvą]Ç•Ü{]…Č�Ł@É Ő€řüäúŃđ}Áđü>ŽŽÔĽµq•µ¸ň»^×µí{^WµŮŕ0baÄ«V��.@^×gŕ/kŘ^Ŕ>‚ěČ Ŕ4 |ľoŹÉĆuťgYÖqĽ^3ŤÔĹÄĹŦŁ HYY=§éô'Óő>‡ÓŕęxxxšpŔ©Ś€ôđęqxŢ3Ś×8ÝsĆăĺl,€pęBąRjjbÖc`ü�ľAř>źŁÓń=O©¦śX0âĂ«‰:]ÄřźÔń>/«Ôęőu8šµ*Ő)4bjbÖc¸î;^D{_1ň˝čهF&-ÔŬ‡§‡‡‹ŐâńśgĆqÍf3Ö°˛`€StáĆŔ<OŚő|gW‹Ök1šĘČ .5!d1˛ěř~źÓéđú:ťNŻW‹©S 0«‰V ?�řÁčôü>Ż©ÔáÓ‡¤ÁR¬¦¤Éč>„ř=>ź‹ń=_«âőzĽ\BA‹����‚��]´��-����?4��l��HÔH�áâqxÝn9®ëĘě/k䧉ÄÔ…e5jAŁN§‹««ĆńšŢ9ĆëuÍsYYŚ…`*Q��Ŕţ>§§Ôő=_S©âú˝^ŻWVĄI‚š•k �@ř>§đýŁáôx<=p@YYtÓR®7\Ç1Ěs®ăĚvĽÇĺrAÁ§ MIÂäáńxś^·­ă8çŚÇ+qĘÚŘN`Đq*ÖVăavÁôľAř?Ńô'Óč<F )˘"ââÖc1µšć9®kć·]ĆUĆââÓP�u8˝^§‹âzľ§©ęz~'ŁĂáđ��”é hŃár}/`/kŘ^BňĽň#•µjS‡L<<źĂô|é|đ}/'ŕř\…´ŕĐN �«Y‹Ťâë8˝gŚęu|_Ł€�‡�á4iŕčđz>…äˇוĺyŽW1¸?�XŔ€P�ěő 56ń^ AâWN*$rvŞJĎ/‹YĚ6~´Á«­lűm[ܦć7¶Íˇl;Y|ôo"‘ (>3›5+2bAzZ°Ä@„ĆY?6¨ÍW˛·Cń ň§5ôJµ/Zö eö“k¶Çk¶›fv\uOMtC:2÷#±o °…Lé%ŕěˇ84qJ1G1%‰A;)Ą|¸‡Řé”™ťžZ$’e&Ňe%!‘™ĐŃOˇĎ4ĺô¨!ć`’BřZÁđÜOH’śÇ;QĺgdÜ7ćĆY?6h}C®¶ŽăŢÜ Â3ĂüCĂÜ3ÂĽvîĂŐ:+3äL;{Yu ë#Ă.aPd˘h´3ޤ!*“'j‚Ěż±v`Ň[tQJmU«…†˛–‚ŃYë)a+EJ¤SŇaHťEé,8ŔřÁp|>'ŤČeéŐˇ]·_±ź<Ő6ÎĆywAę˝—ą÷˙đďń/đŽ˙ÜsMÇ8{\öEMCLSČÜ(€$˘1J(ŚGD"idĐwB‘äÉGVVµő…±¶NĚYË?hMźł¦bÉX«\Ą'BŤ„áx8% @qXt* €@ Iš ›<?C˛ŕůn—µđžKÎz_şď;Îóąí»«¤fąt®PäĐČ€  š � &2?E&«ŰÇ2¬Ó<Đ4 ë2Č0ëµZulD) �' 6$a‘ Ź™"<™Ôě^ĹČÍŃÖÖ××ÔŃ˵:đ@ŃD Ŕb8€�  H�PŔPĐU%Ťsŕ† bž(ÝÁ;Ątî•’ŞUBÔó4‹!H4�tĐ€�ú°Ŕ Ô ĚĽËĹ:—Ý1(Ť ¦ŃjĄŔô<ŹHđ®Óá~ŰłÓłĂ]5¶vÎlÚ 4t©µ@áŞjŃz/é>‘Ú|+µôĎLđÎŮÓ8f€ŔÚ%U¤Jă č;?)ňŻ đľŘ鎙ĺ®ZŰZo,Ű2¸ … k'i¶)'2ę�>ě>‡ě>Kč~ ŕýčą- ĆŠŽ“i¤ÚđĆYĂ:q§oN6çmđçMi­ł¦2»MŁe‘ČŞSI´ĺZO é^ĺ^•éQíŃ콟±ň�X”ŮĐä0)•Z°ś§já\§µřO•úW¤úOłôŹEŕ|@™9�ěT›VUµđľXé]+ÂĽ+Ę˝+Ę<#Áx>Ă‘äW%`'Ńž ě= ŞuNmÎéĆśíľZáŽé\§’ä8,äO!²ŕ<� »unmĆśiľĺží]gŘt*˛ŔŘhÓ‚ČrĐ ¸'tîž0ďđç4ŢZÓV“ŁĐě2)Ť€pAŘy'ěýŁô~“é“á٤pŽ´äččä¤č¨đśŁ Ú¶­Ż–:g¦9c¦{gĄôÇJĺ;NĎ%c€Čč�PK¦iś8ËŚ¸ÓŤ5¦ôÖŮá®áŽ´í=GC`Y<žQ¤éZ^áťłĂ{omm­¸ŰYg-m›^i”QĐŕ,2�ôä=�|ŹĐ|Ř}ŹŘý‡Č|ʰ� °Ŕä쥹bZ—ć]A<ËÄ˝KĚŐ˝KÄ»‚s.%Ŕ¦Q(¤a8<Ł(á<ݤöŻJňź(ňźHôźGŕűä6�'G‚ŔčxC±ňGäľCä>G쾇čľCŮ|ˇň=ŹÄ  4›M§)ʶ®Ë/Ąř_•řW„öŽ‘Ůň\—Ŕě�NϡŘp‡€aň?Aôü�~�>Ŕ>äȵ� i‹<ŹeŃöŹ ôŹHôŹhř?eěţŃú/#Čô<�� ÉŮŕň{>”tŽŃĺ>‘čý#Ú}§Ůů?'ŕş.‡Č�&ŃE„iG(äűG„zG´{Ołöč|ʎđ>ŕ6¦Ó¸ě<�ů#đěţíŹĘ<#ÂyGŇ2Tr "U,@�ů#轣řG´{G´zO”t|Ł”čň‹:L ĄSÔô>ŕ~ äľKŕľ á‹ŔřGEÉhp6‰DčmŞU3NiÔ Ä}Řý‡ŘýČü—Ŕy/ŮrZ,ŽŃ'IµRmśł†´ăN6çntănvăn7ŕ-GaAaa€°Ŕdr KGłÉhř=‘“Ę4Śť%4ÔÇ:4đő<=_Äő|>'«âx:thŔ4­50ŕÓ§©ĂâzžŻĂő>‡â|źG§Ŕ8  >Źář~§Óő>‡ŕôzŁŁŁ€hŃ pč<=Nž'Yë:˝gŚë8ĽgĹă11*bTš5qjÖVăívĽÇšóŻ1Úć9Ť€˛¤Ŕ)ÔĂR¦6˛¶ăµĘî<Ç+¸ĺlFÖVU…(ĂÁŔV¦&Ż‹ÄęřĎYęxz|„đř:hĐ:V˛·\×uĚsŽë1˝w®uĽoWW‰ÄáŔ  č�Ą]N/Ćzž'©ářżáôz<��‹‰…0�‡ k*Ökśg‹Őń<O‡Áčř=8Ą:Sžź…ä/+¸ó­×8Ţ3¬âpôôĄ: +‰‡S§ŁĂéú>ŹĂř>—gŇî9V®&Ť&((ÓÓŕř>ŹÁú^ăĘó×kqÍn3RŚ ÁŁŔq58Ľ^Ż‹âu<OWÓęzžź‡Ŕ ŃFž”ЏšÎ·ŚëzÎłĆu:ť_WÄő::z�ŕŃ€éħ­ĆÖăşäWuÜy\®×+amd©4ÓRtOGOS«âőťgYĆku•ĘʰjVCtŐ¬€x|=N§W¬âőĽf·Y[­…µ`˘‚…čĂř|O‡Óéřľź‹áń<N§&”DLLM]N7‹Öőž3«ĆuťgW¬ńxś<:tS†!«YY kî9]ÇkµÚísŠĺn6¬)LŕD©V­ef·®kqşÝnąÖëušşÍLMaÁEL515uquĽoĆqĽoĆqş¸šš”SÔ« âÂÜr»Ž×"»Ź1Ýw­®ck+1)„âTĹ©q+1šç¬ÖńśoĹă8ĽMN&¦ť4†šjbęëjăxçăšç­ëśn·WśJjbTĹÄ…"łăśs[ŽqŢ9¬Öëqšş¸q10Ń ¦ĄL\f­f7[®uÎ;×zÝoŚÖjâS‚(¨µq1u558ž'‰âxžźOÄř<Âíđ¶¬&ŚxHVł¬×8ÜgĆőÎłŚëxś^&€�‰€đ‚ĘÝn7ŽqÍsŽu˝sŚâęjjiĐ4hÁSM]oŤëśfł[ĆńÎ3Y‹RĄJ`)80áÔÄĆk+xî·Çu滏1Ęî;\Ç1°˛®-f3Žă•Íw]Ç1ĘŘ­Ç5µ°Ą *UÔÔâpôřžźÄř}?Óđ g„áѵ*bęq8śNŻWĹń=_SĂáčč<hÁ «‰‰«Äâřľ'‰âzľ§Ăáôř:<aič‘WW‹©Ĺâřľ/¬ń<OSĂŃŕđx�ŕŕщ¦ jŔŹ+Ľ…ä/gčú>€=ŽŚ)ÁRĄZµqşÜw]Ç1Ě_€wÇ1Ěw\ĆVb•*@V®....·ĆkxŢ3Śă:Ţ&§‡‡AŇ´Đ4Ă©Őń<>§Ăń>ŹŁčú�ú^BĺeZpč'F“Fź@?ú Úö»^c¸î2·Y«§F‚8 ÓŃĐ !s×kqŢ9Ç8ćł[Öjjq84()‰‡‰Ôđú}?OÁř>ô˝…ír˛˛¦&¨t�‡G@ŕĺ{Ź5íwÇu¸ÝfłN :SҸq1xšzžźO‡áôüÁđ�VŠ(ŔSštéęxzÓę}? üÂěôDJhĐ µqqšÎ3ŤăzßŐë<^§‰áŕŕŕ�šx8V®-]gĹë8˝_âxľ'GO‡Ł€0đp©W«««Ćuž3Ĺń8z|N„đôp(Ń t­f3[®qşç\ŐĆőßă8ަŻ‰Ă ! č�Ą]]^/Yâő=_ŐřźÓčč�W `ŕř[®k+8Ţ·­ęőť_ĹéčNŽ‚tj 0pÜmf7ŽkzŢł‹ă<_ŐéčđôĄ8P4— .ăĘív»Ž×1Ýmną­ĹĹÄÓ !Ń€hŹŕü…ň˝€˝Ż";\®ÖVë110pđieZşÍgÖuxľ/Śő<OSÓŕôx-JjhÓŕér}…ČŽ×ňą]®ńÜs[‹ŚÓ‰§ <O©Äńž§ÄńzĎ©Ôęq4áŁN ĂÁŔ:âzžźSÓęzž§‡ĹđôčÓ€éĐx4pôp‡Ăáő<>݉âxx|MM:i¦¤(ÄÄĹĆcšÚć;ŽăµÜrkµĘĺlč�i áÉ‹‹­ÖqÎ9Ç8Ýn·\Öëśn3 '@==>/‰ă<g¬ńž/[ŐŐââT©V¦&&&MN§WĹń:ž'‰âüO©áętiŕ”Äpéâtđřž§©éřž§ŁÓđř‡Ŕ�ŇhĐN +‰‰§‰Óâ|_§éú?ĐäFÖbéĐĐOQ588|źŁé{ Ęň»\Ćăqq8šx:‚ڇĂŐřž§Ôô|OGÁŃÓÓĐ4aÄ©YVtG‡â|?§ę|>ŹO§§ÁÓŁNś4Í0ÔĹ­ĆĎŔ^W±+ĺ|ŻgŔ=FŚLT«V˛˛¶#•µÜvĽÇšî»]×uʵ¸µ*S ˘"S«‰‹¬âń˝fŻYÖřŢŻYÖq8ĽMtQ§ÓO‡«ŐńťNŻW©ÔâőzÎŻSĄ5 ‰ŁNN7‹Ćřç¬ÖńĽs[ŤĆU°:Ľ\o\ÖëqÍy®ăĘĺyŽ×k•ÉĦa«(«VŁÓáő=OĹń|gŤęńĽf34hŃS‰ÄŐŐë8şÎ7­ă8Ţ7‹‹«)iŔtháčSáôü?čô|?§ÓéáéŃ‚š u55šĚnŻŔ9®cqĚwc•Úíl°Q†‰Ń `ɬăuşÜs®ë¸íyŹ1Ęä�hŔ”ŐÄť-€#łčú^Ŕ?�üô}@ôGF €0ęjjń58şĽg[Öő˝gĹÄŐă0âSR¤`ččččń:}OÔń<OĆu8xĽ:(Ā詋RłÇk•ĺy^×µě�°ĽžŹ�4Ó†"DX­¬Ç1±Çň»Ź1Üy[9[V¬`ŕŃÁÓĂĂÔâőž3‹ĆřŢ·Ťă5Ľn-f3�0âT€�§Óđú~'©ń=>'©ááéęq4áÄ…`ÆšµÚÚć;^cşöĽÇ•ĺvĺv˛p  ÚÚóŻ1î=Ż˝€Ľ®×•ÉĐ8Ś8(„Ä\n6ąŹ5ć;^cµäG•Úílµ“ )5`Ăáń<>/YŐâńťfł[Ś«Ť…T‚ J“N¦3ÇĽ‡éř=?Äńž3‹‹YYq ¬¦­lŐń:ť_ăž3¬ÖőşĚZłF .&%X\®×µäř_gę} ôý>§Ł‰ÓÄÔ¦Š•i€­\f7®ńĚnąŽkĽsŽku•qq5q0))Á‡‡Äôô|O§éř>źŁčú>1ĘĚJtj:V¦&§S‡©ń=?Sčřú�G˛¬C  š4tu[ŽqĚs[®qşÎ7««Ćuxtđpp�Ŕ\Ç+ĚyŽÄy^Wír»\…•şĚZ0�)ÓÓŕđú=Óô~ř�/+°#qhĂĐ Äy]ŻkČ ŘŹkŘŹ+¸ě-žś˛ Jµ¸ĺv“đľWµň€|ŹO‡‡M8”°­d-ĆĹwŻ1ÜwÇqÜs®k1•1( đ®<<ŃčGŃô~ô� ÚŘ jŐ¦ ŠđžĎgíenąĆńşŢ®ł¬ęq8xśN+‡GAe]oĆřĎWÔń=?Áđý�łś&Ž!é88�FcuĽfłĹâő<O§ x=Ă€p!ŃŁ€�Y\®DrąŽcďÇ1¸ÍfĄM4aÁAŁNť:ť^Ż«ŐńzÎłĆuxĎĹâi§ 84hŔ:8:‡áôx>OÁđü?ÁáčŃŁF�0pčŔx8zť_Äęúž/S©âu8śN&¦&¤DśO¦'\ăšÜn7Ç1ÚŘŽWkal JËLč<xşşÝs[ŽcÍyŽ×•Úäč)€¬pÔĹĆă"9ŽăµČŹuî<Ż+°ą `�襒)ÔÔÔĹÖqšÎ7ŤÖqśsŚĹĆń•uq)¦Ś€¶×"9^c±Çk•Ěs[Ś«WRŠp¬+‰55:ťNž§Ĺő>'Óő>Ŕ=�L'� )ÄÄÔă:ž/Ĺđř|?Äř=čô­4`�ÄĂ«ÄâřĎÄń>3Ôő}>'§ĂéđńD#NŽ� !_€n7Žkşć·\ăśoâńś]N�)FŔ��ář�/kČŹ+¸î;Ť¬ÖDJ(� :8�žçŐµ¸ć9®cxç¬ÖjęjčÁ (ĐR®&'‰Ôń}O‡â|OŃđz…‘=*ë5u5x˝gŚńž/WĹéáééčáŕáŕÁ‰¦ *×1Ür#Ęî=Ż"˝Ż++`,@ŁMJ¸¸Íef6¶»®ă¸î»ŽăbąŚ…jÔ©RµqqqĚn3ŚÖńĽgĹëxšxĽ<:•¦€8S§SÄđúźÄú>ŹŁčéy ••iĂ 4ĄžŕčüívĽÇqÜeo«§F„88 ŃŃĐ +•ĘÜw]ĆkuşŢ7W‹§ � ŽźÄő<OWĹő|NŻ«Ôâq:šşiÄ…`ĂŁ&.łŤ×1ÝsŹ1Ýwc•Ěmr¬ŕaIŇÚěôxĂřář>ŃččđđhÓ‡ )ÔÔÖjë8çŽqšç[Ćë5şÍg‹‰S¤& h>'©âřľłâřľ/‹Ĺęő110Ŕ8• �přž/‡Äęu|g‹Öušşşµ*Ô…'AJµ*ă5Ěf·ŽuÎłŚĹâńšu4éÔŃ…(§Žéř~Źô}GČ_qî<Ż+ÖbÓ€LAe\\f®§YâxĎS§Ăáôz}�łĐNŽĆjiáń}>Źčüđ•ÚĘ•0hpś)‡‡§Áŕ Ř]ís×5Ľn®§€� ĂŁ@ÚÜsŽcšŢ7ŚÖq˝]^݉ĂĂÁŔE:1N<=éř~Łŕ�đĎ�AŔ4đôř}?ÁčúŔ�/+µ¸ÜJ"…1tičč°ř�/a{^Äy]Ç++q*iĂ‚Ł@>źOâ|áôü>ŹG§ĂŃŔ00¬ŕâiÓĆu˝oÖëšćą®k•Ěw[<ÄĂ8ĂŁ‰Őë:ηŤë5Î7[Çu•ĘʰhjTś‡‡‹ÔâőťgYĆušŢ7YŚĹĆU… )*aÄÔÓŐęzĎWŐő<OSÔôúźGGG�Ŕ"šµk!mr»ŽÂí{^×µív˝Ç`.N€�:8téĂ©©Ĺă8Ţ3YĆkuÎą­Ćă1¸°­X‰!X\­…Ř�€˙{�ôĽž�:4 ąe—;žóŘçĆÖăć·\×8ĺf7j@ ÁÄŃO‹ĹŐă:Ţ3­×8Ţ3[¬ÖbŐ…jÎ 4ÔĹŐÖÖcšî»ÇqÝsăşć9Ś« �phÔÓSY¬×8ćą®cśw]®W1ČŤĆÖă!X0á©‹ŤĆEsÇkk‘^k¸î9\®VU… ॑4ęjjjk:Î3Ťă8Î3ŽqšşŢ2®®%JhÁ@Đ[��'őyŽĎâ;^cĚs×qÜZq4QÁĄjoŔ\\^.®Żă:ĎęúĎÄáéŕááZhÁˇN<=_‰ő=ô}čs‹N "”©ŁĄ±[Ç8Î3Śńľ/ŚđřžźOŁŃŐLHŁ�qÍg¬ë:˝NŻ«ęzľŹO§Áá\8#@,ĹŐŐâő|N§©đú~‡ŕŁ"„+ ÓŔ� ţÇ1Ěs\ăuťgŚęřž84š4ÄÓ§©ŕđ|?Ŕ?�ü…ĺr·S&…”âjq:xz|>§ÄřźĂđúÁč��W =…µµ#¸Úć;®cšď\×8Íf®®§ & 8: qµ¸ĺmsŽëšçÖń•5xştčŃŁť<N&§ŚŐë8ÎłŚă8狉¬ÔĦ (88�đú}ĂôýOŃô}?ôt�8�ŃFS«©ĆuuśgĆuśg¬ëu1q1*B°hÉ«‹ŚÖ×1Ývą^kĚy^WkĚv!mdÁLÓ†�84jjk5ć·וĘíy]€tđá«1 Ä©�áéâőxĽn·ŚÇ1Ěrą]…ĘěD)jĚLIŔzşšŢ7\ăşîĽ®×•Ř�>Ž&¦¬Ä­š¸¸ÚŘý?GĂôú|>'‰ÔęębU« )5`Ăáń:ž/YÖqxÎ7Y­ĆU­€pT‚ JiŐĹ­…Ęň~ ý§©ÓÄâęÔMI!Ä«�ááđxžŻ¬ńzşĽ]f%eXÓDŔjNńâuťo[®qÜmw^ëĚy^W'€tęS M8jU…•°»^cČ^Aú_+Úö�Ŕ�-‡ÁN%Jk±šÝmnąÇ5Ín»®kšć3"âS‰€háZ¸¸Í\]g[Ćxß‹ă<^Ż‹ÓÓÓŔ�&€@,©YŚÔÖqťgYă<^§Śń::zxAč+‰R¦&®¦§Ťőž/‹ęx|OŁÁĄµj`4xSO�ô�\®×qćą®cxÝ]M^ CLUÓ‰ÄÓĹńž'‹ęřľŻ‡Äń~/‰ętq:4đá¦"@� ú<ŕđ|źSáđř|=<:(Ó‚ŠtęaĂĆuťgÖuśgÖuśgÄŐÆŠŔG…¸ĺrkĘňqív»\Úĺn-Zh pptx<�ý�üđĽźKĘä.VB´ŃAŔ4p�ř?ŕźú˝Ża|€�yŽŔYYVFoŢo“©ÓâřžłŐő}_SŐő:ť:4hÓŁ€pttôôúľ§Ĺő<>/‹âxś=]:”Q‡ téÔęőzť^Ż‹ă:ľ/W‹âńxtáŃFŤGAń>Óéôú}O‰Óâtčчś:š0iâńxş˝gŤęőśoYŐă8Ľ]LJb$)8žM<]o[Ćk5šć·Žc+q••••& •–›Ń‡‹ĹÖńÍs®ăÚň#ÚňŃÓÓ†ż�aÄ…`>މâüg¬őžł¬ë5uš¸°¤:gF¦¦.2¶`�ř~ź§éđüO‰ŃÄáÆ‚™§­ZĘĺv˝Ż/ŕŕ?GĂń<'NŚLH8pDIĐGŁĂáń=_ĆzĎ[ÖuuqjÖT`©2Äâë+uĘäňľOŁâ|=NJ•`€C‹`8µ“ŁĹéâőĽs[\Çav‡Äń8´Úr Ë4ÖAÄâëuÜv“đüź‹‹ `¦T°Ő°jU®Aęzľ/Y×8ć9Ž×a{OR¤˛†ŐWW€ü>§‹ă:Ífą®ăµŘu5`«a•-Y‰[\ľ§Śë8Ín»Žă°čâq1n+vŤ‡§‰«¬ăšîĽÇkĘň~ĂÓ©RjVd¬†�śMLn»ŽBň�~ŹBzľžŻV˛˛Ŕe0Á‹Y‡‰Ćk1Î;Ź+Ęö٧«‰Y0ĚHjÄŐ­ÁÔéńxÎłŚÖëuÜlG'  VJ°ÁçÇ`éúźÄő<OÔÖk1k ł&¤Ó /‰©Ćë+•Úň�Ńń<N®®,jČVS g‹«®uÍf·ÇqŘŽÂäđđᩜ5*ÂÚívĽ€ľAř?�úŔ~@éčѦ™ŁAŕOĂę|?WÔřžŻ‰Őęqxi©L) a•+5şÍ]g­ëxÎł‹Öq54č84iLZiÄÄâń4ń|_Őő}OÄđtř:4­J0µ1uxĽ^§WĹń<>'§Ăáô@ée4ŕÁŔR¦]N'Äń}_O‡âz}?ŁŔ€!ŔSG@ú ĘěGî9Î9­ë5xš0()F��gµĽsŚÖřŢ'Öúľ§‹čéđx<i8S�áLNźĂř>‚ö‘]×qşĚM<= µ0aáő>�đě.ă¸ć.%848Rť�¦&§S‡§â|?OĐ�üÜv·«Ł@#ĂŔ áÔâtu=?ÁôýKłéw«WŽ  ¦Đ<ÝnąÇ8ĚgĆqzÎŻW‹ÓÔđôppśz4�[[\®Wk¸ó×+šć7ŚÄ§S�ÁBpiéŕęxľ'«ęxľŻ‰âu}^Ż‹ĂÄŕÄÔ© Őš88x8zľ'SÖúĎă8˝g‰©‰‰R‚ŠĘ±ć<ŻkĘň°ňňą@ť ٦¦N3ŚăxÝoY®qĽoŐĆă1*ÓEiŕ��?Ŕ˝€ý^OÂň~•Č\­…a4čŇthčč�_+Úöµĺy µÝrłE)Y tŁŕúĐŕüđôK“ �V¦%LL8šťN/Yâu<OĹřľ'SĂÓѧ€hŃNŤđzŃôô}/`ä€Y §AL8€ŘÚ湍­ÖëxÎ3¬ë8ś^đ �#FŽŹ54ęq:ĎĂâúž§‡Ăéđř:<V覚•š¸ÚĚs]×uÜw\ÇuÜsĆU… �pčÔÓSYĆkxçÖăśw\Ćăĺn2¶"µ`0hŃĂĹâbqxÎ7ĆőÎąÖëxÜf7¬)TĹ«[[�ôzŔ>ŹÁř?Áôýo€thŃ€iÓ‰§SŚâń˝f3¬ăťsŚÖńÍ]f­5pŔ‰DD¸ĽfłY­ëxŢąÖřçĹÔÔÄÔŃF�L\tđő|>'Ôôz=?Óôz=ŃčÂ0čÁ٧ÁÓń=źOÔř~'§Äő<O‰ĄłN :téáÔâqzÎŻÖxŢ3‹ĹĹââbaÄĦŠŤŁŃéř~Źę}Ăđzŕčđh€˛�<�řýŃôý�řĂđz8:4`¦¤N¦&.7\ÇqÚĺvĽŻ+°`˘Ś4N€Vtôôđő:ž/‹ă:˝^ł‰«ĹŐÔĹ«V¬ś4ęââcxćł®kć»ÇqÍn7Ś«‹��q15x¸Ín3ăšćą®kšŘ­Ĺ¬Ĺ…*AŁFž&¦¦łWŚÖńĽn·[Ç5•q¸¸±LSNžŹ§Áń>‰đü?Ăń=ŁFŤ80 zś=^§«Őë<^ŻWŚńšš”°iÉ«Vł®Wň#ČŹkÚö“đz]žŤ0áĂR­Z±×1Íw×qĘî»\Üed+Ja5*S‰‹«‹¬ë8ŢłĆőťg[Őâő:Ľ4č�¦uxşśg‹ÖzĎYë<_Äń:x:x4 hiÉÄępő|_Őő}OÄđtôôiX(ŃŁÁéôz>‡ŕřŃđü>ŹĐ:�Ŕ�ŕĐ8:8|O§Äęu|g‹Öuxšşş•*Ô¦¦8tiâu:ť>'«ń}OOO‡ÄčNžž  °®&&&¦¦§W§«ńžžź‡ŁÔčč'…aJšś^/Śő|OWÄő~'Äôú:€T q§ŽźOŔ�ýĺwc¸ć·W :„8Rť�®.ŻOSÔôýOŁŕčVă5š40Ś<+‰‡OO€ú>�{^W1ć6®.¦Ť)€ťAÄM­ăz߉âřžźOÁđK+xĽ<PFŹ iŕ€ •Úî<×5¸Î7‹Äâph+@&–aÄččđ~ÖëšÝs­ëxś^Ž©§Gč�Ĺ©«ĆuxžłŐřž§ŁÓčôAZhŕA…0ʵ5ž3Ĺń}?Áô}�äFbáѤčęž“@ć6·­×5ťo«Ôáń8z�a8”éčđz\ź…Üw\Ç8ÍoÄâpôôjŽ€x\ć»®qÎ3YÖuť_ÔčđTŃ)&¦žžŹSŕú~źÁô~÷߀•pJtđő:ž/§ĂéôüO§Óčôz< ¬)E��˛·ŚÖëxŢ3¬ăz˝^ł‡‰ÁŃÁ¤ŕá�¦áf3Y¬ë8ť>Áđ}álE§‚ `čP<k1śoW©Őő=OOŁŕřr­J1IŁQq4ř|OŁé{^ăĘó\Ç:Ţ3«ÓŔ<)€8BtşÍo[ÖuzľłÔđř}>@đzW¦ŤĄ•¸ČŽcšć3ŚÖqĽ^3‹§‡‡@)ÁÁĐYŚĆUĆńşÎ7Śă8˝oW‰Ĺń4ôđh)FŔ DL]g¬ńxľ/Śőž§‰ęř<>ť�"Q)ÄĹÔă8Îł«Ćux˝N/S«ÔâđŕÓ 51•*Än6+şňą\®ă¸ó®VDn,)IŔ§‹ë<NŻWĆřη‹ĆńšÎ3YDĐbA§�Ńáő}O¬ńž3®qšÝmedÓRiÄ«8tęqxŢ9Ç5ÍyŽ×kĘě/+łŔta©H[jU…•ČĐ>ŁŕúźOŁĂŃŃĹŃM0��ŕţ?‡ü~GÓôý>źGĂčđřx84ŕ€˛˛é٦7[®kqĚr»®ă•ÜyŽVÖVN 8bbNâpë:Ţ3®kć<וć9r”Á âbŐ­ĆÖ×"<®ÂňĽŻ+ĘíüłĄ“@paÄÔŐĹĹÖă5¸Ýs[ŤÖńÍe\n.-1A@ÁÁŇČ\ÇkóǸî<ÇqÝyŤ­ĆââÓNŚ">€~ô}𽀻;µ•jSŁBn9\ÇuÚć;ÇuÝsŽq¸¸şş0�N 8§ŕú>‚öň» µÜyŽc+*bQAL8ZĚ]gĹęń<=_§ĂéđOĄ”ŃŁ@DŃGSŁÄř~©ôýOářÁđ|  SE هÁĐź§éř}źGŁŃĐ:4¬�šiÇS‰Ôętřž/‰áń=O‡ÁĐ8:8�&¦ś8§ÓčÓô |Óđ�@ŕÄ8q8ĽN'«ă=g‰âpôő88x84čŇĄ4áÔâxľ/©â|_‰ń~§Äő=>ŽŤ' @ŕ,«YŤĆc5Ľgë5xĽ^/W§€đj& Đ Ęíüô� Éř�ú>kµµ`+ Aµk1ĘĚsŽkśwŤĆńÎ7YĆęęęčÁ€áĂÔâu=OĂęz}>§Ááôú|RpĄ1­LL\\gëxŢ7¬âńśf§ €MMLz|GŁŕúźGŃđ�>Ź Ú±‚–ŐŇĚeZÍf3Ťă8Ţ·­âqxu8ppaJp”©§‡ŁÔř=�ţĐ�/+•Ěn3 )X‡SG�đ˝Ż`ü/+Ęň»\®ck5qtŕѧ€đŃĐ=ŹGŁŕř~©đoŔ<>ŽŹO 8hٞ¶»ŽBňµäü/'Đ>čđpphÆRĄZĘĚwךWqÜwÇ8Üf..&EL5qq15uuxŢ/[Öő˝oW­ęęńpáÁ‡GXV˛®7[ÇxçăušŢ7ŚâęqtéŔ8N�éen2ł®qĽg[Ćőz˝gŁŁ„ŕA ś,ÄÄÓÓŃéü?€˝Ż1Ün3ÄÓĂĐNžÄÓ§§Äř>ôĽŻb<Ç1¸Í]:48†”Ł !f®łOWŐřźOĂřŇňąŽjáÁŔF… ô˛Ą<NŹOĂôŔ?Av»ŤÖbđčQ@k"2+šćąŚĆă5śnłŚâępđčÓÁK!ŕááááâxťO«ÔęxΧŚńq8š”ÓF 0p'SÓę|=?©ń>O©ŕđôđ –Uť��\€ý Ř ÜyŹkĘě.W ”ÂhŚrĺó|ΧWÖu:ť_Őń:ť<84 �t�R­ZÍeoÖëu˝sŤăśf·Śă8Ľ\ €Ń‰‰‰‰©‹«¬ăxÍo×8Ífł‹‰‹‡  aZ¸şÍoÖqťoYŐë:ť<=N iL5¦NGÓđü�?€~ŁčFŔ‹N 4µ•jăqÝsŤÖk8Ţ·«Ĺęń58x0ˇ84¤EŐâjq:ž/©ęú}?ˇ>@®&ťpÄéń8z}_SÓń>Bz~OŁÁĐ‹č8::=đý?ú>ŹŁŕřčôŔ�Ń ¬ŕôü?§Óń=NŽbTśâbVcír˝Ż+ĺ{��đGGGŠ atü<ËćqušÝną®cĺw]äq*U0&¦Ż¬Öń¸Ís®qÍsŽkĘĘʰ‡•jÄsÇk¸ňĽÇ•Ř]Ż+Ęĺl-«XV¤*UĹÖc5ťgÖxŢłĆuť^/S«ÁŁF”©Ex‡Áéř>Ăř?Đ>€�/+`,¦©Eępń:zž3âřž/©âx|O§ÄŕŕÓÁ†šjŔGGG‡Äő<OÖ|_Ćuś^Ż 1`8u8Î7Y­Ćăšîą]Çb<®@F `°âU€đđx<>ŻĹő<N'ŚÔĹĹ«Š ]ŹÇÇăŐęqž·«««¬ĹÖŐ« &· •`/ÓÁŕčń}OâńxşÍf·YY a˘h4ŔS§‡SŤë5šÝs\Ç1Ęä-…Ř:pâB˛ŚLL\f6+µĘî9]Ǹě.×qä� 1!dF×+¸ň�^W•í{ łčGĄłŁ@Ł qqšÎ7\ăĽmn9®cuÍn7Ćcuµ(ŁčáeZĚn7\×5¸Ţ7ŽqśoÖjńxp §‰§‹ÖuzŢł«đ ëxĽgăxÎłSWMLJ­X8�/ đ@OĂř~źŕôzŁF (84bju4ęqśgYÖő˝gĆqququ)Ä«LŕG‰âřľ/Yęőž3¬ëxšÍ]LZaJipéÔâq<g‹Ôń|g‰ë<N§‰ÔéѧFŤVµ••ć·ŽńÎ9ĆëxŢ7Śă:ĽN<4P15555uuxŢ3ŽqÎ9Ç8Î9Ćc5•jT©‡NŤ�tčř~ř?ŕú^ĎŁŕřĄÉҰ �¬ŕ�@ř=Áô}?Ńđz~źŁFŚ0áŁ®Ż­ëuÍn·[­ăśs­Ĺ©RĄpđđ�.Ŕ�ü�˝…ĺ{ Úívą\¬…•q(©†Š4ééępu=_Wâzż‰ń=>'@0âTĆUťŃéř~źáúźŁÓéčđtđiÓ†™ŁĘĺlú��~ŹĂúŃđz<>Ť"©‹‹ŚĆVVW1Ęć;Žcć<ĆÖW5µqq)Ă€ÄĂÄŕŕđú=?G ôŔy\®VSS"i§OG‰â|OG§áô| đüč𕦚0pđ˛ą[\źĺmw]ăşć·­Öqś^4Łd-¬Ç1qĽoĹÖuś^Żâ2Š4ĄM::€»]…Úî<×qĚn6łY‰‰NŤ'‚µ*jpôôř}?Łéú>�?ŇĺZĚ8Â)ŃĐ 1µ•šÝoĆuľ/S‰ĂŃÄŕĐ84€źDúżc¸ć7×5Î3YĆjjpđ`)BtJ0héôú~č?@ü�~ÂÚÜZ¸tč t¶¶˛w®c¸ísă¸î·¬ĹÄÔ§@0ŕĐ<�.Ŕ^×ay^cµÜr+µš”ŕŃÁŕEĹĹÖjőxÎŻ‹Ôń=_G‰Đ�đ  ž�F�^ĆëuzŢłĆzž§§áú~érł„@Ô8�ř ëxşÎ/W«ęxžźĂŕ‚µ0p á.&§S©â|>đľAřv+µu8tˇ€SÄôüŕüĺv»®ăk5xšś Â4GŁĐv˝Çuć;®kšÍg‹Á !ŃĄ0ÓÄętřžźOÔú~źŁŕúĐ^VŔV‡Ă ôx|Sę|Óđú=>ź§ŁOL&&..7×kµć<וÚňĽ€»[:5%¬ŕáÔă8ÝfąŽWqć;^W“đú<<4A†i«ś\mr•ěú~ź‡ÓÓáęđâbU¬‚™‚˛¶»^×·ĐžŹă>/«Öu5š¸Ę°`R¤Ń©©«ŤĆÖ×ěäýŕôttđęŐ…`S‰««‰Ś×8Üną®kć7ŤĆëq°€aчN¦¦·ŤŐÖńšŢ9Ćëuşµ¸¸‘¤&ŚŇäđzż�^ĎđŔ?Ňň}čô¶�RŚ:Sz|Ńř?KÜ{^WísÇ+5i˘¤ŕÓĐq58ĽNŻ‹âu=>ŻĂéř~ŁŔhG…(ÄâiÔęq<_«ęúľ§GF€0ĄJ)X bë:˝^'Śôôú}>§Ăčôz= p†§§‡Äđú~'ĂđüźAôҰŠQ4�‹‰‡OSÄő>OŃđýA{[f&&�‡�]‰©Ĺđôú~ź ţökk1utéL@Ł„héef·Śë|g«éđü?Ŕŕ,ÄÓŁ¤ŕ¤Ó‡‡§Ăéř=?GÁđŁđř�-…i˘(ÓŁ€ŹG§ářÓôý?ř=Ź€đpŕŚGOGO‰âzľ§©âřž'‹ŃÄÓĂ©‚R 80bë5湍­Ç+¸ć;Žă°ą��SLÄĆU˝:uuxŢ7[Žkšî9\Ç+ą�áÓ©4Î adáéęęk:çăîą]וÚě1 ©Yal55şÜwcĘň~Č>đúžź‰†•&ŚLLZĚwŻ+ČŹkĺ|Ż`ú=ŚtVCŃŃŃÓéđúž'‡Äń|NžŻ‰§‰¦šhÁŕÔÓ©Ĺęuž/Ĺńž3ĹęřΧ‰ŁŠtŕM4âjiă8η‹Ćqś^.ł‹ĆqxştÓL�ÂČ<ŹÁđľß§đýGŁáôú|=4` :téŐâk<oWŚă<s¬ëxÍoĆqśeK,�8zś^łŚÖńÎ9®cq±®×`čÁ�¦á¬š¸ĚrĽŻ`ú>§Ăéő<NťN3˛¬Ä†  X<&Ż®k•ÜyŹ!{§ÄĹŐ€T•f%dÓ«¬����‚��]á ��.����?4��™��X[Ž×ay äÁđřzzšpŐ‚Ąl0¬éęu8ś^/[ĆńÍną®ckkkk&Ś�xjk1•kî9ĺv˝Ż"=đ»>�::0`§J­n6·®Wuć;Žă¸î9Ěd+VĄJ”âbęjjjqu:Ľ_Ĺęřž/OSŁAáZbŚk1şÝgăzçYÖuť_ÓÄęttp�†ŤR"S‹ÄÔńž/‹ęřžŻ§âx<>Ź€�áŃŁÁŕ�»�é{?Gŕčđz\žŤ�Ł@§Äđúž'Ĺő>'©âúľ'§©ÄÓ‡™Ł5k1µµÜv˝ÇöĽŻ+Úě�>ÁEHh…'Aępőž3¬ńη®qşć·ŤŘ�ŕ4Á jS +•Čý@řÁđ‡ÓčééáÁE4S UĹ«‹ŚÖńşćąÇ:çĆńşÎ3‰‰©˘ś51)©‰ŚĹĆcxŢ9×8Íg[Ćq˝oSWMa•*Ô«ŤĆăq¸ć»ÇuÍmn3V®&&.JBtéŕččôúŕOˇ?ŕú~—amf%R”韀, ŕŔ(�”�{Ş�Q‚–đ©PŞ­UJĄT˛źÔÄŁŐ'q4icHâ5 3Ý8C),Ňn áŻđń 068l‹jS¬Ĺă¬oËńŇ˝dŮ}ÄŢîpżÜXăřĎĹţ)q … Ţ­ÂŮŤhÓm�ĚlŠÄÜ ą–*¤PI‡ !ô�‡á€C ±¨? 9R/ćśčź”Cô]G´”J”şL„ŃMTÖMČK¤¦IuEd5@óÎo _%ăôd‰pĆ €$%F©3OT}M^ŰŽ ĹY#3č=?®¶Žçß\Ă<IĹś_Ć[Äś3Á;ŰolMIˇs;ÂwE{HĚq¤…ˇ z"‰‚¸Â5Ź$)(R–¦A¸x „>ŤŇzeO 1O*Ĺr±JĎZ 1c«Őd¨ruKőźfÉfE aŔ CüCEą„ÚyD§UěVűţf:>ąşđľCÍú_^íý˙Â|WÇ<ČĽMé=ťó.PĆřs�\;<ĘŃ|&8 †á`¸d6  ĆcâA\ĘuBQ´ÉIW—6Ćc8i I­¶ĚŮ[]jŤť2V$˝,J*R…‰"0j'„A @ôn5ŽGär©¤ň‘W´n8Îw0Đu ‡lŢ8 âK‰qÁ7}ŻZŃó<oµSf1hH 8€ŁA H¸xhhpÁQŞ &ˇX/¦a˘kfńŔ¸'ŕ[¶Ů«gYňµ.‚*‚Ś Š‰‚‹…‹…Ź*…|Ť=ž/ˇÖí÷»ţs±“Ä_ŘŃÓD Ł ”"XiŔč�¦� Áä‚ 9‚�AC H”ZĽ�Z©ŕŽhj>#ä杏€ł�Éq€‚ @¶1¦:G±ýňęµÓĹ Ť¨µ ŇF¤Ä\ GhÔ)ÉrÍł–6ľ—á“đ%ô?bîâŮŇ´{-“-‡dÎYÓ±Ú»O”z?úˇsmáXNB90 ŕ‘°ě™Ę¶ž“ĺô�/Tń—YoLôľQŘvIŔm$@pŕ;&˛Î™ĺŽ“Ú=łů űwMeť'CŔž�€ x€‹c,pÇJđź)ř?ů‰smazN‹€@é“,€rŤ—eäľGä^©ęŢmă.°çn6Ď áŔSc‘�4čtʎq.%͹ˬ¸ËŤ¸áľážUĘxG#Ŕ€lŹ#°čY¦íŞo ĺ˝8áÇyqÓ\łĘřW äř†Ĺ8+$Ú2[.Ŕ�ş—TîŢ)ăw—Vç.tŢĂ9N€Ŕŕ2Z,ŽĎgÂ9OJí~Ęü/¶<3Úúc¦8W ÚrxEśť˘ŠN•jÂđĆŘÓ:gmrß ňßMtß,ňĆŐµi:FFĂ��(ŁŁŃíźGŇ<ŁŃzGÂ>Qđ_ě}ʱô>CŔ�˘NĘĂ! @Ä 2îŢ-âÝÓĽ:·Xsm[6»M#(±˘±±±É趞ʺWKíŽ×ÚűcÂü/¶;W*ĺ;FŹeH¤ĘepĐvGŃ{?‚ř?”|łöŹGäű>ŃÉm;*,"Ń„eZN×µíŽĺ®Zĺžšéž፯iŇňx;+AŔ�täŘČ|‡Řţě>ä>‡ŕ=ˇěČ�d aŃp\#”rŽ“ŇĽ/Ăí}1ŰŻ…đ˝«I­4™TKEgĄeyVZŰzk-éÎśĺÎ]mÖ\ĺ»q†­šb—˛˛”Ŕł�ä<‡±ö>ËäţŕţÚ=eŮvŽ G‚´JceH•K2Üą€°�üŘ}‡Ŕü—Ŕö=ʞČĐŮŮĘ-V›^ËykNtçN´çNtçN6çMa¬ł…áVŠ<aˇL¦×–2˝±Âřc•ôľ×á}«Â{O”ö]!Č� PŕbŠ;F‘Â9Ohđ~SđŹeđ_đ_#ěĐą‚fÓE€ŔlQŃr^ Đ|‡ĐĽKÍ<[Ľ<aÎéƙҴśž‡B‹ ‰ŕvŞVµp®•ĺ>Uí(ř/‘ů�'Ţg‘ŮCfz �µMŰXq¦öß.9k¦şc¦;Wiěú.Ë äQ%a‘:ŹAŕ=��ĽŰÔĽËŐ<ÓĚ»§tęś[tÍ*•ggEÁ`˛{=ź'Ň;O”řW…y_µyO•xOhíĎeˇ˛ł”Ňü�BŞÁdňŚQ„a9Vj´Ň%4™D #F •`Ó§Y¬Ćc1Íw]×1Č®ăµÜvą[Ń‚šĂÓâxϬő˝MgŽxŢ·Žq•¸ĚeXš'�Á©§WY¬Ćkšć<ÇbĽÇ•Úäř�:h„ÁÁŁ^łŚĆqÎ9Ç5şîą®cÚłĐY�8)…!ZĘĺr}�˝€˝Ż'é{^@^@l)  ?“‰ŐńťgW¬ęńśoWYĆńµjâSSx4ptSâ|>O§Óę|>źÁÔđôiĐ4Ń ptx|>§©ęu=OWÔń|_‰Ĺâ`„@¦šşµkšî9Ź1Úó×kČĺw…łŔ$MXYAôř=O‡§Óâxľ/S«ĹâęT€¬1‡€đpő:ľ/YÖuśgĹĹլŀ L3€`Ă«Ćk1¸Üs®cĘívą>—gÁĂ‚RÁŁO‹«ÖńĽgÇ8Ţ;­Ćëq¸ČY AŔ TÄÄÔÔă:ľ3Ćzľ'WÄń|OÔéččŕŕSS­mmn<®cĚyŹ+ĚwcŔ��čáÓ§&.ł[®kqşÜs]ăĺsŤĹ€¤�hhÄ©VłÇ+•Úî;^WívvąY !H`ŃĄ±­Ç8Üf3ŚÖńśgYă8ś^�Q…•)Äâń:ť>'Äô}?Óôđ+*ÄM8Rt¦&¦¦žžŻ©áđř}OGÄô'Ăéôt•¦ť:8zK•Ęî<Ç•ÚócĘĺsÜef-1  8péŐâbqx˝g¬ńľ·Ćuť^'‰§ +YWW«Őęőzž'«éčń==€ ŁŕáHVł­×8ÚŢ7\ăśgĆńxĽMt`ŕҵgAd,®Wqĺr»]®ckÜs[ŤĹ©‰NpęŕÓ‡‰Ću:ľł«Ôęřľ3ÄępéѧEb$k �=/`đŔĐ=Óčô𲀭Z•11uxĽgW‹ă<gW©Ôáđđpp )FĐRť=�]ÇqĚw]×5Ľo‰§©Ŕ4­©ŁŇĚnąĆńĽgYâő=O‰éř>â. �Š�)‰§OSŁĂđüüđ~»[Y‹‰F‚€!ŁG‡ŕř>€{ ĘíyŽăq¸”Đ8hé\éń8z~'Ăčú~Ź€ü?@ôą[Wť&‚”éŕ[ŤĆkzŢ·¬ńzľŹOK!4ŁŔ‹‹‹¬Őă8Îł«Őń=_G‰Đ:<('€ ­Z˝N'‰Óéř~ }.ÖŐÄÓ (ҡŔŔYŽk1şÎ3Śńzľ'SÔččč(ŕAŔ‡Ŕ‹‹Ĺâő}_©ő>ź‡ŕ—ąq00ś�¦'Äô|{^cĚrą®k1xťN€F8€ Đ 1uś^§‰ář=@đąY‹O�_€@iMĄĚ]oYÖzĎWâú}Oŕř^V´éĐIÓÂĚ]fݬőž'‰đú}Áđ!f-`áL€»\®ă¸ć3[Ćë8Ľ<<¤ápťŇć;ŤÖë5ťo‹Őń::<�‰@ : aâx<—µäGšć6łW‹ÁĂĐ:W ` 8=Ćuž/‰ń= ôĐŽăşĚg‡ ‚á'Q4t�[Y®qśo‹Óáôz�úWOHCħ@UâptzźGÂöî<ÇuÍn®ś+F„' 0đřźÂöb;[®qśgŚáčđx‡pš€¸Üo[­ă:ÎŻW«ęu<OOGGB&š �k8ÎłĆzť>§§ŕř~ʀȫ§GpŠV"iáéđ|?ĐyÜw\Öâńxt­Iáđś x^Wqć;Žë¸Ýn·­ă:Ľ<N€: QâaÔŐęőxťg‰Äęx˝g‹Ôęu:ś:(Ń piZŘ[ŤŠî;Žă¸î9Žkšć7\ŐŐÇ�ŕę&Ťŕřy^W#°»]®DmrłĄ8‚(ŃÁĐ�˙˙  ˙W»ŹkµĚsŚ”QE:thÓĂĂŐń=_Wâú|OSŐń<_S§§‡NšiśťN'Śë5˝n·[®cuµĺd 8q*Áه‡©Őë:Ľ^ŻĆőşÜnł‹ Ő€`˘ŁN§Ćk5şćąŽăşî9; pŕ©0Ő•1qG§âxz|N݉Őë<f®ł€a«®$,…Ůŕôü>ŹSáő<O‰Ôęq8¸łLD€tpđő8Ţ·ŚÖëuĚn»Ťĺv¶x8)¦SMMfłăşćąŽkĚvą\Ç"9Ť­¬…`ŔpÓ†¦.3YĚs]Ć×+kísĆÖVVT‚–DÓ©©©©¬ă8Î7ŤÖk8狍ă*ââT¦Ś °ä.WěGqÚĺsĆÖë*âé `D đ•¬ĹÖëzŢ/Öqzś^§WÄéčŕ+N 1thŕŹĐ?Gá{ŹkĘěG+k*ÔÄÁ@ŕ€˛Âäň»]®ëĚwcî·¬Ö`LŚ8téáÓĂÔń|NŻ‹ë:˝N¦§SN¦śM4PthĐ8:<>źSáôü_‡Óęz|N NF ,š88�Ăđü?ÓôzĂéôđôčÁMHŤMLMf3®kĺwcĚv .@:0a˘t ‹ÄÔÖk8Ţ9ÇuşćąŤ­ĆÖÖAÁ©‹.-ŃN/Y[Ż1ĺv˝Żgčú>ŕčáÁR`¶ą>OÄôřž/‹ŐâńηV˛˛h« °ęă đxť>/ÖqšÝn»Ťäô&‚"LâUĺr˝Żkä�}GÔřĂĂç +(F]mevą?�čÁéřť;đ tÓ Ę`x¸¸Ěrą^Włô}/}©ń:8śMJ`)ŁO«Őńzľ3¬ńťgÖńqux¸ĚJ• 0á§®2·×1滯1Üwc•ĚrąV�44DHV!r~� ĺ{_ @GĂč�ŕĂ‚Nlěö7Y\×qÍw]×1ĚnłŚĹ¦„Ô… +YYŤĆëćą®őÍnąĆë8Î&&¦ŠpÔÄɇWSWÖq˝oĆuĽgÖńu5tŃM1­Zµ•¸ÚÚÚć;®ëĺn3V®.&.JSFŽźO©đzÂű?čüGŇě-¬ĹŁ�t«««Ĺë=_Őđü_©đüđ¸¸p¦�čeZÍsŚŐă:Ď«Ôętř}O€ťB �·Ěf7ŚÖuľ/«ÓÄčč=)NÂ(KqÚísÇ+î¶·[ĆbbbiŇ“tŕô#µć=Çb<Ż+Ěvą\Ç"3¬ÄÄŔ ©Ă ÚÚÜn7[Ç8Ţł‹Őępń88 Đ4¦§ ˛·\ÖńÎ7ŤëxĽ^3Öu|Nž€: Bµ k"·­ÇuµşÝsăušÍf®¦4h”`ĂĂáčO‡Ôř>ŕú>Źář�˘Âš4t©‹­ăxÎłŚńzĎĹőž§O@' +‡žžŹSáô|OĐĐ>�l+ŕŕ č+WSŚęzľ§Äř=GŃôř qq0č�Ł@ô|?GÁř>ř>Ź  z\ť�µ1110ęju:ľ/‰ÔđřžŻÄń<O‡ŁG�Đ4¦$C‡O§‡©âzžź‰ęz=>§€ř|JQ śWO§ÄřżOÓô~�^cČŤ«‹§@#€ž˘jppř=?GŇů Ęň»\Ç1¸¸ĽM< CF :z<NŹâ|O‰ę|>ź‰éôř:@чR¦2¬č>ŹOÄř~OÔř}OO‡§Fť8”ÍpÔĹ­ĆĎŔ^W±+ĺ|Ż`ú=Ŕ:4hŠb¦.-eedG+k¸íyŹ1ć;]ÇuĘĘÜZ•)„Ó)ŐÄĹÖqxŢłW¬ë|o‹ŐńśN/@Ŕ0"Qѧ‡ŁĂę|OÓđzâ|€z<Ąi¦Ś<�@ŕ!|Żö»�.ÖÖBšjbjaŐâjřÎŻW«ë<_âu|N§‰ÔŇŘVčŃŃŃŕô|?Áô~ ~§čŕđx��Ą8”ÔÄÔŐÔâőzĽ_âő|_ĂĂáĐ4¦t¬1u8śN'‰âzž‰đúĂđ|¨Ęp`JbbiÓÄéęzžźO§â|OÓéô€Vp¤,¬š0'S‡‰Ôń|_Yâu|^§©ÄáÔÔÄÄ©Wpą…äř~ô}�ý äô஫�4iÓÄęq:ĽN3ĆuťgYÖu~�!q5xĚLJjAŁN¦®®3ŽVă•Üw®×qĺr#AѰ x8zž/SĆxľ7ĆuťgYÖńušÍ\J•1)ĂF Áâz<>źO§éô|ź§Ŕ<��R¦:xxz|>Sâx=O©đü>ŹSáđŃ •)ÇNŤ==O‰éő>'§Ôő=>Ž Ą  @ý ĘöĽÇµć;^c•Ěn7ĄL€!ѧĂŕô~Áú?�KĘív¶´Âi˘Šu8ś^§S¬řĎĹő|^§‰âtřś:4éĂM5`ŁŁŁĂáő<OŐřľ'‹âőz˝LLL0h©‹�ÓĂ«ĆqşÍsŽkĚv»]ň�ŕÁ�¬©�üľo—ŚëxÜn9®ëÝyŽÁôz:tÓ$ Ó‹ •ä?O©ń|=_[ë<gĆVăkaĂL˘u11ÜlWk¸ň“ô°|ŁELÁR˛ą==>ŻĹő|OâőťgRĄH�4@4aÄĹĹÇ5Úĺv» Éú^ŔÓŕđu80ÓRšµgGKz>ŹŕGÓôüÁéôôpđéŔ" 14ÔÄÄŐĹĆqÎąÇ8ç¬Öëqš±WOF–BÚÚć9\Ç5ćą®cuşĚ\f&: F§Nž/Śń|g‹ÖxΧW¬őť^®ť]8š•!Z°h§Óééő>§Ôń}O©Ôępá§ )Ó©§OĆx˝gWĆuz˝gW‹Öu8tŕ č<@čŔ>ŹŁđ}€}č/avx<�h jB¸¸ĚoŚÖő˝gŐă:Χ‡‰Á �†Ł€ĘĚsÇxçăuĽoĆq˝]N:0h bjjjjęęńĽgëzçă8çŚÖU©R¦:4pŃčô|?Aú?ŃôľOŁŕřĄÉĐ4 �¬ŕ��=.דčü€ô°ň@JSAJ0|G§čřŕü€Ľ®Äv#b-L84!ÁÁÔ]M:śNŻ©éń>‡ŕřÁđ�YV"i“Ą14ępôő}O‡Ńéô|>„ř}>ŽŇ´Ó§G@érą]Çň» ±W+äFăkqihiÇO©‰ĹęőžłĆú߬ęń8ĽM8pP)Zʸ¸¸¸ş˝^/W«Ôń<_G‰éčđt�M BµÝnąĆÖńĽsŽqśo[Ĺâń4iŃK*΂ČY\®ăĘĺv»\ĆÄsYYW' 8upiĂÄă:ť_YÔęu|_âu8thÓ˘Ś1��č‡ňx<>§©éń=N§‹ĂÄÓ‚¦­3&.,“Áčôz>ŕř~‰ń}>'‰ĂĂ‚ÉR��ńř~ʇę|>źSÓááępjęQŔD�­ef6¶ąŽă¸ís^kÜmeZÚ•)Ł�Ňštń:z}OOŁÓż�ń>Ńđz…•g BĘÉŁť<^ŻW«Őęńž3¬ă:ŢŻSR¤E«�<8śN^ł«¬ăzÍgńÍo­Öc1q`Đ(Ä€'‡‰Őâńž7­ăzÝn˛­f6¬�bAR˛S `đxz|NŻ‹Őă8ηY‹Ť¬¬ť:!K¦Č©Ĺâë8Î7Ťă1şć6˛˛�(jÜHY<<=^®łŚÖëšć9ŽWqä.ÎŽ0°Ő‡‰‹ŚÇ+µĺ{?Ŕ~ź‰éń}^]\X)«)«ž'ĆqşŢ;Žë¸ĺyŹ+łčÉÁ§&hÆšµÚĺwŻkĚ{yĐÁéđ T†Rt§OYâőž7­ëśną­Ćă"6�8 L5*Öcq±Ź1ÚóW‘WkµČ=“ �bTš8xś^3Y®c¸ír»^Bň�=:eDY‰V¶ôtń|^łĆőśg­×5Üml a«0âÖ@Ăôü>źŐőľłĆqťfłVh¦`HśLZČ®×ö#ä/µň‰đu:śMJ¤Ó˘¦&.®ł[®qĚs]Ç5ć»®ăŘŤ¬©801aemlG•Ůř^×°ň~�>Ź€|>Ť�aY€ŽźG‰ęzźÔđúľ§‰âń8ś]h§8pő8ť_«Ôń|^ŻYâq:˝^M:p �ŕŁŃđ|?Oŕ?čú?Ŕ>O OFťF8šĽ]^.łYÇ8Ţ7YĆë5q•*bŃ�<śM:ηŚëxŢ9Ç5šÜsŽkuµ•¸pâLLI§N-ZÚň»? í|éôz}=<:•`5.ĄH[:|<N/Öu˝o­Öë+1š&Á‡SS[®kšî;®×ň»Źkx<˛šČ4iŐÖc5Ýw®ăÚî=…äŃŕѧ JłFťMM]oÇ8çÖăšćąŽcšĺmeeZ“� bjjbjęęńĽgăśsŽqĽsŚĆk*Ô©Sť�t`ř~ř?ŕú^ĎŁŕřĄČ Ŕ4ł€t�<ŕô|ŃôüGÁéú|>Ť0hÆŚşĽf·­Öc5şŢ7[Ç8Üf·ĄJ”aĂĂŔ<�»�čě/+Ř^×kµĘĺd,«‰EL4Q§OOS©ęúżÔř|O‰éń<�ч¦2¬č>ŹOÄú~OÔř}źOG§Fť8iš0ᩌ­­źAy�ý‡ôţŁčôx|0E1Sڬ¬®c•Ěw®cóY\ÖŐĹħ�WĂčř~Ź@č€ň¶ąŚ¦¦ DÓNž§‰ń=źOŁŕO‡ŕđG€t­4ч…•ĘÚŘ\Çxî9ŤÇ5ĽsŚÖjâaÓŁÁ‡GťN§Ćuz˝gŤë:Ţ/ĆqśgDĐjC‹Y4q5ušÜs~�!]Çkµĺy^×Ęě>žž ĂY)‡SWY®k¸íy_ ŕř~'§‰Ä©RIN,Ó©‹¬Ç1Üv��üđ|ÔôřšśJS <]]ną®c•Üy^W`ŃÓÓ© Z/ 0tő:ššÍg×5ć9]Ç‘×`đtá…a©L)z:OO¬ńzľ7¬âëušÜed,¬”Ă Z°pńx¸ÍmmwW°ô| áÔÔ©¤8µđń8Íf·ÇqÚív˝…íyz8pBf‰‹Ćk8ćą®ë¸î;]Ç•É荺0jqq8Ţ3­ÖëśsÖăśr˛˛­XX4áÄââbë1şçĆăĽw]×1¸îąYYŚ«��iÁ‡Ąf3Ćăć9Ż1ĚwÇ1•¬aX�ŕ§Ńđú>O§ÓáôôtháŃEJłNŠuuĚs\ÇućĽ×•Úň»]®O€Ž†šb,,­®@�Łđ˝…ěô�rAd+�  N“Ůěö}ĎÚć9Žk˝s[®qşÎ3‰‰©˘śéÇ®¦®ł¬ăzŢłŚëxÎ7­âęjęQM1¬�˛+ĽÇ•äGµäGĚyŹ+¸ímeYŔ B­JµjŐ«­ŐÖřç‹ĹÔęéÓŤ115ušÎ9Öëxć7ŽńÎ9­ÖUĹĹĹ©D@0ŕôň»�ý�ň~�>Ź€|>ŤaH8V­f3YŽkšçăqĽsŤÖuşşşş0`�śM4x|ź§ŕřŃřĐĐ>ŹK`(ĂÂ0čGkĚyŽEwÇuĚn·[‹©F§IÁ‡Ł…jâë5śoĆk:˝o‹Őń|N§OF–QFŽŹ Q‰ÄÓ§§§ÔôúźâzÓđř�đ¬DĂ€đ�*ÔĆkxÍgŽxĎÖu:˝Nž +�Ń pčŕęřľ/YŐńťgYÖuśgĹŐ©‰LDÁáÔáŃĂÔń|_WĹő<_SÄő|=NŤ80 �ččđx}OĂđú~Ôđôôń8pS Í8q1q••ÜscĚy]…ĺy�/1Ř�E5.šµ•ąÁô€|Áčř:O‡‡FL:•1qxÍgă5śf·ŤëušÍ]fĄL4ᦅ!ZČY[]ÇqÜw®ăć;Y[WŠb•)§W‹¬ë5uxÎ3«Öuž3S‹Äð"áŁOS©âtúźÓđúźÁđú=�GFşiµ•ÚóWb=Ç•î<×kµ°‚ĄY‚"@\®Côý?§ę|>Ź©ÓÓÄÓ§¤ J˛čO‡ář~úź‰ôú~‡§F¦)ÄÄŐŐĹĹĆqşÍs[­ÖëšĚ\oWWś80žÖÖ×";Üy]íw­­ĆT«†p ŁÁż�đčúŃřéú>đz<…`�� *UĚlFăśwŤÇ5ĽsŤÖbâaĂ‚Śu11xşÎ·Śă8Ďë:Ţ/Öqś^.˘V­X !mrą µÜyŹ+µĘäFăšÚĚH†Ś„Ó§OO‰ę|?Ôř~‡ŕřŔ<-ž(�!d18zz|Áô}�~—î;ŤÖUÔŃ ÁŁG§Óčô}?OŃđ|Ńđz…µg�Ŕş¬čéđôtřžŻ‹ë<^ŻŚâjńuu*Ő«V`Ša0˛¬î9ĺv˝Ż"˝Ż++`,@ŁML\\fłŤ­Ç5Ýw×qÜlW1•°ĄJ«‹‹YŚĆă8ÝoĆqśg[ĹÔâđđč:VŠRM>O  ľW•íy]ÇÚÜn.¦ č”âu8|OG‡Ńđ|čěG‘Y‰‡:88ś=Ăô|é|ŻkŘ]íef.& ŕĐR¦z<>ŹOÁô~ }/k•••10!ĐSĐ[]Ç+qĘć·ÖńšÎ3S‡�â8K*T¬Öbńxś^§WĹęxž'©ŕččáJ4:`ŕŕô|ô~‘®×1Ěn3ŚÄÓ§@&špáÔâu:žĹń<>'©áđř:G�ÔÓG�ŕôú}áú~ôŕú~��č�‡ž/‰ÄęřĎYęxś==N :0¤)M8u8ť_Ôń~/ÄřżSâzźOŁŁIĂAĐ8 *ÖcqÍoÇ:Í^/‰Őéŕŕ<‰ŕôň»�ý€�?�GÂív¶¬aH8V­f3YŤăšçăqĽsŤÖqşşşş0`„Ä8pő8ťOSÄđúžźO©đx=>ź N¦"T©‰‹‹‹Ç:Ţ7Ťë8Ľg©ÄÁ‚ SSžź‡Ńčô}OŁčř�GĐmX‹AÁKjŔ¬«Śăxη¬ë<gSÄęü_ÓŃÓáH‡ÇO§Ńč}ŻkŘy •µ•jbPpP4Ř[ŤŠî;Žă¸î9Žkšć7\ŐŐç�ŕę&Ťŕ.BňĽŻ G•ÜyŤ®VbŐ¦ š4đtx ˝€µä.ăÚísĆă*TÁ€Š4� ęĚsÇxçăuĽoĹë<^'G�'@Áŕôüź§Óčôú}='Gš'd¦ĄZĘĘä/+°ĽÇµäG˝€»rt @ÓF8śg¬ÖkxŢ9­ău¸Ţ7‹R”ŕÁŁ@đŔŃđľW°~��Đ t�4ăđ_‡ĂăÓâřžŻ©âő:ž/W‰©ÄÄÄÄ….Śbbęëk1Íw]×qÝr»®ăć6Tš*VJ'€phâjjëxć·ÇšóŻ+°xztÂł jďŔN7Ťăxć7­®Wk°�<pÎ Y"-elŕř^@Đ?ŕ?Aú<.ß�čŃŁ‰‡W­×8ÚÝs]ăşÜs]Ćcq”ŐĂ%M8u8x˝gŚęuz˝O©Őń:ś:4ŕĂMLeH[[\źK±Ä{ŹkĘěGarąŤĹ… &tŔ@čôřÓéôü_‡Őôřľ§S©ÔŔ”M�âbU¬€`@úŕúŃő>O§§ŁÁEÔĹ«‹¬ÖńÎ7\ăşć·\Öă*ëq+1( `ҰĹÔâęęőťgW«ă=OOOGS€p�N�‘\Ç1Ěs]ăĽs[¬ăuuxştaĐ0'€ń:ś<N§‹âúĎ«âő8ťN'¦&&%JĘł…Č</'ĂđŁččř_' �đtthĐ•š4ppu<OŐń:ľ/‰Őęőľ/Rša4áÔÔâjpőx|NŻ‹âxž'«áŕętpč:ĐZşŢ7YÇ8Ţ9Öń˝gÖő5xĽM80hЉÓ©ŐÓŐđő<OÄř}>ŹĂŕ€�D§N =ŹGĂôúŔ~ź§ŕôü>Đz4�Ž���˙čř äúŕ@úŔ x•…)©‡ť=N'SÔń}O‹ę|OSÓáôřžŔ4ĄH‰†ťN/Śń|_YęúĎĹń<>ž �1i§‹ĹÓĹńzž/‹ęřž'§§ŁJÔ0� ŐĹĆk:Î3Śë}g‹âř˝OÁÁŃŔÁ…jTĂ©ĂÓÔř~'Óô|GĐŕř[Y(Ł@ŕ)SW‹Ĺâu|g¬ő<N‰ĐžŽŔŃFž�ŕú?�ö#ĺv<Ż1Č k*Ó@Â0čŕđ�ŘňkÜv#ĚwĆÖbâja´`ŕáf3Ťęń:ľ/©âx|>O§Áŕ'F ŃÔ:8:=čú^Âě.ÄvąŽc+qq)Ń@Đ�čérx=Óđ|?ŁÓđx}OOGť810Q‰§N®®Ż\ëxŢ7­ă8Î3RŠ(„ŔáÁ‡S‹¬ă5şŢ;Ç8ć7\Ćă+jÄXY Ě:šquqqĽs[®ëÇ1Ţ9ŽkjÖbUÄ© â@k"·[®ëkuşÝsŤÖk8şşhŃ "QĂŃŃáôü?Óđ|Ŕ~�…h t¦Ť¸šś^Ż‹âřż‰đü?ŕ�VĄNŃ VcuÎ3¬ńzľ§SÔôx<�xS„‡G\]N/‰ęüO§čř>ŹŁč/5ĘĚMM<�Šš4đt@�~ôĽź ˝Żkµî9l,©Lé¦./YĆńuś^3­ńśg‰ĹáÄŃF@R…µ±…ĺy]Ż+Ęív»Y ʰN€ Q‡§Óář}đ~Ŕ^ÂóBŘY0Ń~� háŕ�]ŕ@ü@č€ŃŕŔu51jăkĚy Úö˝đ€ü>ź JjT­«ĆőĽo­ăşć7Ç"7�ÓMĂ�u1¸Éř Ęö~ŹĂřĂééęq5*Tś˛EM]\\\n·®cÜs]ĆÖW5±¤� SN\\\n·\×+šć;Ż5Ěs]Ćăq‘p ™ŃN¦§ĆńÍn9ŽVăb;ŽBä jAR \JÉčôtúžݬő˝gY¬Öëu¸ÚɢV4âŔ:<Nž/YÖńÝrąŽÂě>ž¦ ‚Ô“ZÉÓÔęë8湎וí{áńzş¸łR Hj@GO‹ÖqšÝs\ÇqÜy\ž‚ĄY8ł-\mv˝ŕř~'Ăéő=_«Ő««R `ÁL,Ł©ÓÔń|^ŻÖő˝f·[ڬĆV]jâÜH[‡§©Ôńž3Ćőśo¬Ćc1•pęU”ŢRx<§©ă<gÖńşĚr·…Č:8jT”b@©Äâńu˝sŽqÎ9®kbąYdщ Hqq•łŁĂŐń:Îł¬ëxŢ7®ëad§D)tŔY�'‰Óâřľ3ĆuťgYÖńqšÜZ°¦·M5šÚĘír~ö˝…ěü�|/gÁŕčŕæśJ•q•k1µ¸î»[ŽńÝw]Ćăśsłš0h)Sť<=O‰éôüOG§âz=Áŕ •118şś_ĆzźÔő=OO‡Ńéđ”Ŕ8GxzťŁčü ľW•ĺrąŚ«‹‰F‚p\4px=ČŇö�Ź+µĚen.¦ �@ `ŃĐě}ŤÖkuĽgŚęő:ť==�šp�‡F€^‰ęúą­×8çĆuś^łĹętôô‚0pĂŁOO‡Áŕô|?‡čúđ~đ|•"�Š4t¦.ŻW¬ńzżÁáúżSéř~ámf-Mppt¶ą\ÇuĚs\ĆńŢ·­ă8şxx:x8‰€iZ”ÔŐęő8ž/Äő=?ář~@ř=”hÔ88SžźAôŁđ~ú^×k¸ín3‡tŇš8zzÓđ|AüKÉô»ŽVUÄÓ¤Ä�š4đř>đ~—¸ňĽÇuÜn7[‹©FÁÄ�đ‡‰ÓÓáđú~'Ăôz>Ź€}‚Ú´ÂĂŇ‘WĆńťoYĆő˝^Żë:ľ/ aJp”©§NŽźáô}OÁř>ŹĄä.ÖÖUÄĂ€h�¦-LMg[Öq˝gYÖuťgW‹Ötń4hĐ8:SNÄő=OSáő>OÄôxz:�Đ T¦Ś<<==OGÓđýŹŁŃđ|Ńč�Ą:5� +1ÍoăťoĆuťgW«ętôtt!Ł@ń 8|OŃđ~€~Ář Úě°®ü�AJ":tháŕđř}OO‡Óéő>'‡ĂáętiŕÁ†VhĂ©«©«­ăśs[®c¸Üs¬…ĘČY80á©ѧ‡‹Äăzç[×8Ţ7[ŚÇ1••µ`1 âh§[ŤÇ";]€Ľ€ř�ôzz80Ph4ťĎgłŘÚî»\®W1Úć;Ť­ĆVc1pÂiÄĂ«¦¦ł‹Ćuľ3«ÖxĎÔęőxť<MtéÁ …*Ő…ĘŮô•äGµóăČ °ą ad�pb,<=<<<O©Őęőz˝oW‰¬ë15q*T¦§‡‡©âxľ§O©ęü_O‰ęř|=<�ÁÁĄj΂ČY\®ăĘĺv»\ĆÄw¬¬«VM4áŐÁ‡Śęu}gS©Őń|g‰ÔáŃŁNŠ0DH Ö@<�‹äđ}đ}?@ôO§ĂÂČVµjTÄĹŐâńť^/ŚńťO§‡ĂÁÁŔ4ĄN‚”éčđî<ÇqÝw\ÖńĽgOS€éZ0śV¦ŽK1şçĆqťg‹Ôő>'§ŕř¸40�SNž§O‡ář>ô}đ�]­…i©@+Üef7ĆńĽsŚă:Î.§‰Ă§Nť818iŐŐÔĆqĽf7\ăuşç\×8Ěnł¦ 4¬jă8şĽ^'Öxľ/©ęzz t˛‡‚šś<=�ř~Łđ~Ŕ>—ä,«0 )ŁB&ާ§Ńđýđµĺwckq¸ş0pŁJS©Ôŕń=ŕř?�üěGb6łtp"q4đř|>ź§ŕK䀑¬…i§Ł€�űź±Ěv»Ź1Üw®ë¸ÚÜfł‰N"páÄÄâęńťgÖxŢł¬ëzĽgŚáÇŃ€t˛¬FÖ×uĚw^kşó\Çu¸Ý\]\L:phę`ÁŁĂčđľĎ§ŕGŔ>€vz "%4`Ń hđ˙‡ÁđŁčüŁččř�ř@ŕ��88�üň˙ţ?‡č?GÁđzŁÁÓŃ€` :téâńxĽ^3­ëzÎ3WY‰‹‰‰‹MiÁ€Ŕ?ăđýáú_a}ŻkŘ>—g ¶¬' DÁ‡Nžž§SŐřž‰áő~'Äôřx::8táXR©MM^ł«©ă=g‹âzľ'©âx:ŁŁ„BŽ©‹«ĹÄâřÎŻ¬ő:žŻ©âzťJ@E��YVł‹ŤÖńĽg[ÖqzΧ§F•ŁPp®śáü?…ň˝Ż+ĚvąŽck5(Ŕx8@ÓŁ‡Ăáôü?Łčú�řĐn-0€đôč±Çqć<Ż1ĺv» aw¬­Ä 3¦2ąŽŔ>Ź@O§éřžźSÄéáÓ‰V•*ÍLLMo×1Üw®×•ĺy�?�éčÉYŕ*c5¸Úĺv°“čGÔôoŔ5:xu)… Đt`Ó©ĹŐëxÝgÇ8Ţ;­Ćëq¸ČV€Ą`ŃÁĂáčôx=ź©đü>źG€ř<�pp`Ă:ááÔŐÖc5Ín»®ëĚyŽăĚväčŃLÓ‹ĄJČ °|?§Ńéő>'‰Ôęqxjâ@YtÔĹ­­…Ř^Ŕ�čü§éđř80á§ J‘˛łYŽńŢ9®ëśs[ŚĆęââę`Ł)«†ś]fłYŚÖőÍo®qĽg¬ÖjbS(€¤,ĆVDer+µĘĺs®c¸ÚÜef3 80­:ś:}ź§čúá|Ż"<®×ć6·š()�+‰‰§¬ń<OSŃčôÁô}�ą”ŕ'ˇGG€˛˛·\ĆëšÝfłŽqu8ĎO‚”`ęéÔâxž/©ÓđüO‰đ|? @Ehŕâ&śčô }ôČ °ą\¬„Âpщ tř<>źBz=ź‡â|>čŃŁ�4ppq:xľłÄęő}o‹ÖőxÎłŚâń”M�•`ÔÔ¬­®×Łŕř~'Äőž'YÖjâÎ fšaĹĆV×!{^Ď ýĂéđđőtââB°Ŕ &LM\ną®c¸î<Çkµć<®×k“ĄłF aHVŕđz}ź‰ő>O§Ôđôő84ba€˛˛é¦ĄLf·[­Ç1Ěs]Ç1Ýw[Ť¬¬…jŐ€Âä—ářŃôô|/“Đ€x::4hJÍ88:ž'‹ęřž/‹âuz����‚��] ��C����?4��Ç��h-z߉‹©M0Ą8q58šśN݉Őń|OÄő|<NŽ@Đ:�+‰‹¬ăuśsŤăťoÖqťoW‹ÄÓŚ"q:şzľ§‰âxź§Ńář|ÁĐ�”éÁ٧ŁÁčô|?O üéú~OĂŕ=Ł@Ŕ4h>'‰ęxžŻ‹ęřť_W©Äâu5tÓ‰ Á‡NL]f3×1ÝsŹ1Ýwc•ĚrąY8‰L):[]€Łčü?‡đýÁčôGO‡ )ÔÔÖjë8çŽqšç­ÖkušÎ3¦%H A h>'©âxľŻĹń<_«Őębja€ q*@�áń<^ź©Őńž/YÖjbęâÔ«R�8 Ő«WŤĆă1şçăuÍ]f&&ť:š0Ąáŕ�z µć;^kÚäG"»®ăşĘÝf.& )4 �Ćc5ĽoYĆőśN§S©Ôđôp˛¦Ŕť«§‡Ĺôř=ŕ€Ľ®ÖT©A!ŃÔ:: kbąŤÇ5šŢ9Öqz˝<NžŇ”ŕA@Đ:[\®kµÜsÇ1Ěs[ŤÖńšštéIÄ:�čô}ĺ{ŽĎĐ^Wň#µĘĺenł�&§€ 1Ýf·[Ç:Îł‹âő:zz8 Đ4¦§ Ĺw\×uÍsŽk5łđĽ�8�ĺ�@ ܰýĄLŮcű—W“Ů#„Ú”a´@j™˘ÂŢ<>É\ěÓÍŠÝN qc’Ăç‡EşmÔήőź­]gęßRşgŃNxs'“\há~úm®ąévräć(`¶­ffČmÂ(z# ‘Ó(s Ń‘$Rí8”HÔíT…ZŐÉ\U­XŐIOÔ™BSˇ1qQ ʬ.ÄüŤ.ÁH „PÚ'FyO×vŐ÷‡1öbĐZ“`íÝóÁüKĆüŤĘ±Ë|µĘÜ™Č]Ă<ą6.˘ĎŮ[`;^¨ž¤Čv¨5Dˇ`eČRXŞ/ÍS±ˇôr”ÓRRŞĄ],u¨· ä\k}k,Ąv©Ô‚xKhí ĆT@‹xÄńL]Ć‘ÔE§U¬6ËÎŚe9ďĽS“óÎź×»wzđO ńŇ:3Bç¬×–r6,ÂW­±ZŇ“|™@$‚1€>Ä"!H´h<#”ŚäIÓĹAd^Selݡ4¦˘Ő«Si­ś˛¦0ÁVŐU:GĹńđp �Áŕ0äb)‡Ä"QHÄ~Oay‰Ěę·ś‡AŮř/'č6Ý߀đ~Ă8gŕ¶Ő­i9¦AŰj“hÔ �@ŃPŔ@IĐ€P`p€áaň“t:YN¶aYF¬n ‡q®AČ8÷ŕۦµ c—j„‘áXl�,@„`l`d Pt,�4 $‰Ö0ł5xŽ—gŔńĽŹ/U©ÓgóĚ ť„�Ř‚ä ”h:�i€6(y%€8g@Ŕ¨a@¬p-JC° �ź!ł9U`ú“`đ«4jK‡â$"Eu ±Z«QJ§t°K3C2fM4�łŔäÇd8RtžŹÁüĐ Ĺ<eă.rŢšáŽŃô]�Ż !ŔťŽŔU…e\'„vŹ'čţŹč˙ř�w.-Ľ/Áh“<ŹšFQÂzG‚ô_ň?ařz‚w.-ÎZµi:-�JĂBś+(Ú:G“ôě>Ŕ>Ĺîž)Ţ[Xg*Éhv'`:4d˛<Aä]@ĽÓĚĽKÍ<S»sN°ă2ÖXÂpy,G‘Ůl6;.OĄvŽŐé~á=ŻÂĽ/µr®´dňŚś˘6,žS…aśłn2ëmŐ»ĂÍĽSÍ;—Šw.ĄÄ· (Ť–Q•[6Ý:§™yʰú’ů?„{O”t®UĄa2™ł€˛•NK ĂŐ8—P/0eô?#đ~ĎÉô}'hʰÁŔŕe0Ď”đÇ pÖśiÎ]ĺŐş·‹x—‰wÉpx9LÚ#%H€ hÚöĆšÓśąĂ«wo4ő/1đ‡ÁňZ;TޤëGH€ä¸G ڶΚۍ9ÓĽ:·vń. ]Ŕx‹%G¨ŔĐÚi0MSRęťÓ¸'™y—ąz‚{€ú�ôŕ:G#˛ŔÚ)4«]±†đă˛ëpë°ë­ÎeĹłLÚĺ2rV9�ŕ vĽ/+Ó_,rÇlvľ×á^Uá—hěztVzFK€m¬µ¦9g¦<1ĺ^“íËäľ�=‹Šc Ŕč tA3Čr…¬5†´ămđ×-tÇlvŻ ěűG’ě{M€ÇbX�5á:GHěýÁ|�}“Ý<ÓŹÝ7•ĺ;>dYŔpG’ŘvŔśáÎéÖ\íĆŰŰ|µÂřW)éź!°#ŔȰ;€�[§6ćÜáչˌąÓŤ7–¶Î—Ąe=#‘Ŕ`rz-•¶®ĺ|1Ë5Ó\3Ë<1Ă;^W„ŮÉŔ@ty,S…éť3–rănrăN´ëNrç0Ő7lÓ*Ŕŕ­™]1-Stćť[şx§›yĂÍ»§‹wNmŵ,Ňé †Ŕ8G“í«´řWjí~펙厦4Ľ®ŐJ”ÉĘ,ěđy= ĺ#´xO•zW¤úGň~Řô\ʞĐdS™DŁĘ´®ÓŻĄůcÂ{W¦=+Ň|'Éô}—%Ŕh¨đy ČxAě>Gě>€čäě>CŕĐx�č6@@v ŹGáŇ<«ŇĽ«ĘĽŻÂű_kĺ;FQ“łŁ€Á`­«bŮ·8uniÝ»§‹z·‰x§rć�\@·�+8Đá¨äy>SĘyc–zg~�!ä¸-Ń“˛¤R`Ę�cE5aÄÄĆV×1î<Ż`/gŃčń<^®­X š°­emrą^W•äýäý/!y]€ąY8pgMf2'Óđ}?GĂôüźSâxž'®š°Ń Đ8tń8ÎłY×:Ţ·ŽcuĚn2˛@p@![§ •Űđü>§©ęxž/‹âńxŢ.˛ĄX%K§#•Č^W°  }Sŕ=<i«)«VŃŃÔđő<_WĹęřśgYĹŐŐĆbÂ…*bbjęqś_ă<g‹Őń|_Ĺő:z:880hŠjŐ¬¬­®DvkÚ÷×µÚ÷€¶��Gť8u58şÎ9ĆcuşÝsŽcq¸Ěn,+V âDHVÖÂě/+Úň�{�ř^Ač�h<9se—;žóqÍs[Žcć9®ë•¸ÚČV¤�¬:0ięńxşĽg[ĆuśoĆqşÍf-XV¬ŕ SMJÍ\mf9®ëşî;®cşî9Žc*Â�8tji©¬âëxçÖăśw\Ćăĺn2¶"µ`0hŃĂĹâbqxÎ7Ç:ç\ëuĽn3‹‹ AÁBbâÖVŔ °Ľ…äí{^ĎÂöĽź@ô¶¬�h�đh‡©áń}N§©âúľ§‹ă:ťN&ŚL4âQ!ZĘÍn6·×qÝwŽqÝs[ŚĹ«‹‚M4âáÄ©«­âńž7‹Ĺă:Îł«ĹâiѧE"•*Ő­ĆÂŘŽW+şóÇĺw\Ç5şĘ' %3‡N&­emrĽ€~ř>ŹŃŃéŕÓ§ŁFś8¸¸¸Ěf7\Ç+cşî6Ŕ Ô &Ž�Áéôü>ź‰đú<=M0`ÁF:štńxĽ^ł¬âńťo[Ök8Í\]MH†ĚYÁ ôřzz|OSŐőž'‹âő8ťN'&&%Xŕ§WWSĆńÝsŤÇ5Ţ;ŽëqĚn2ł ŚJ°� |Óđz~‡Óéő}Ož4Q ÄÄÔŐĹŐÖjńšŢ7Śă8η‹©Ćjj`نµk1ĚrąŹ1Ü{ŽăĚv»Ź1°¶U©S�RśN§‰áéôú}?GÁô…äř�+Rť h+«§‡Ăáôý?�ú_+ÚöbąYY«§�# `ĐZşś^§SÓéřźÁôüµ‘Ť)Đ ír»ÝyŽă¸î7¬ÖęS‡@ŕ"€€Ŕ?ě{ŹkĘň»\­Ęʸ!4ŃE:šś^'­őť^łĆuś^ł«ÄęęiÄÓ†R�GGG‡Ăęzž/«ń}OĹęuzš`¦$�pq8xšÎłŽuÎ7[Ç1Ěw]ĆÖÁŃ€ÓV¬tâk5šĚf7]ăşć9Ýv»®VÖ@4`4@�<=^§ëzşĽ^3ŤĹ«`�Q Ađ>?ÉŐř�„áęř˝oŚŐâńšÍn®-IÁ)‡Ís[Ęĺy^W�>Ź€zzxpbQ�ŕ=N¦§Ćuž7¬ÖqÎ7[Ç1ĚmH0T¦ 8ś]f·Žcć;Ž×kĚvgŃč ´Â“ ôř}>§Ĺřz|OSÄń}N§§‹ÔÔÄÁF  <Nž§‰ÔęzĎWÔęzžž§Ť<8 1V@čOOÄř}O‰éń<_‹ŐńxutÔÄD€�:}>źÔâu:ĽgYĆk5šĚX,¸•ł§ĂĂÄă5śo×5Ěr»\ź�ištN®ł[\®WkŘ^O ôü‡M5!©Ó‰V˛ą “đÁřĐÁéôřztâa©R€¬ô/§ŇäGó®ă¸î9Žëk1qq0Ó†(ÄÄÔÔÔâń:ÎŻ[ă<gYâőľ.Ż8tphŕŕŁŃéř~GÁđü?O§Ăŕđř4đ`ĂL,ş0âc1qćą®ăíw®ăµąY�Đ0á©VV@>�?Âů^Ář��~@Đ�Ŕ^os|í^3YĆőÍo®qÎ7[ŤÖbŐ…q!Y٧OSŚńť^/¬âőĽ]]\]\\0�4áĹÄ€ą\éü@ú_ řŃđüŹ€é¦hÉR˛€üÓđ©řźO§ÓáętđáĂĹL\L\\ZĚn·[®kuşŢ9¬ĹÖńššpŕŔ Ô§SOSĂâ|>áúźGÁôú�ôX†Ž"iŁG@đzŔ~ʧđ~ź ô+!0ś`áŕ>GGĂč?Áéř>'ÁŕđtŤ0 V`ŃŁ§ÄčęzžŻ§Äő:ž'Ťx éÓ©‹«¬×5¸ćą®ăĺlVă¸ĺmYÁ‚R¬ŁĂâzľ§‹ë<^ŻYŐâjqšq­YFĄJ•¸ĘÚÜwÇk¸ó®W"9Ťž@��`Á§WŚă8η®uşÝg¬Ćk1*U¦ĘłAéđôtř}OSŐő<OS§‡§§‡SS¤<8şšuśo¬×8Ýn»×uÍn9Ť¬¬ĹE8`<N§‹«­ëśsŽqÍs[Ěd“F$5+%1�Äř}_SĹőž3Ĺă:Ţł‹YY¦pTĹ«[]Ż ŕúźOÓđü?ŃÔętđáÆśH†ś^3[ĹĆk8ÍoYĆqšÎłSSNś4pÔÄŐĹĹÖcuÎ9Ś×:çăšÍsŤŐĹŐÔ¦Ś8Z¸Ín·ŤÖőĽo[Öqž3©©Ôęq84ph:0áÉ‹¬ĆkxÝwŽqÝs\×u¸ć·Ĺ…&†‰:[]žŹř~§Óő>SÓéđpu4áÔĂMD4âbęńq5ťoÖő˝gĆq5xš(Ł@�©‹«Ćqś^3Śęń:ľ/S©ÓÁÓÁ �M:4� ü�CŃ=_W5şçăuĽoĆőśN'�ŇbŤ8�ŕć<®Ä{Ž×b»®×uĚf.$C€j%�đ|GŕĹ{]źÂĺr+kq¸0¤DĐ4UĹĆjęuž/Yâtř|>OŁŔ âaL�ŚÍ]MNłÄđú}?ŁŕřÂć9‹§L' aŕđzĐ\®ăć»Ćë8Î&Ż‚”ŕ4p¸qu8zľ'©éřźÁôüč•( Â(ÓĂáôúźčôŁčú>đlôx `áčá\LN/Ĺń}O§â}Ńôz qhRÔŕŕđŘŽăóÇuÜn9ŽqÍo‰«§ś8Ś88x˝^ݬń8˝^łŚë8Ľ^.®¦D)4`щ«ĹÄĹÖëxÝs\×5¸ć6#+!X�Ó˘"@Y�˙‡Ŕ>Łéř~ʇéř~'Ł©Óѧ 15555ś]^3¬ë8ÎŻÖqxşšşpQDjŐ€¶'Ňäýň» ĘívąĘÚ¸µpÂ*aÄÄÔÓÄâq:ΧŚńž3Ćxž3Äâu4čÁ§G�ŹO©đx~O©ő=>SŁNŠjS4щR¬-ě/+Úňô°KÉĐ84h§%H‹‹YY[[ŽëÍw]×5Ěn2ବĆbS ĩکjÖcqÍn·ăxć·YĆk5u554é Ä4щ‹©¬ĹÖőÎąÖń˝f·­ă8Î.%8”ÔÄ©ŚÄ…bł×uĚsăşć7­¬Öc*bba˘Nq1šµušÍo\ëťs­ăxÍ]f¦ś8(®&®¦¦ž'‰áő=>źOÄř<Âíđ¶¬&Śx8Rx[[[\ěGqÚís­…¸Üe5pÂÁ tx>đ}@ú?ŕü?GĐ>G€p¬��eJ±ŤÜsŽëq¸Ýoă5¸pࣜ:Ľ]g[Ćqśg\ë8Ţ3[Öqś^.˘�VŽž§W«Őńž7ŚâńqxĘ•jU©�)N%8šśN'‰âřťOWÔń=OSÓÓŕĐL4éX ŐÔâęjuzľ/‰ęü>Ŕ:<)ÁŁJbbjiâő:ž/§Ăářźŕôú} ś) *ͧ‡©Ôń|_Yâxľ/S‰ÔâpębbbT¬«8\Âňü?ú>§čř_' �đtthĐ•š4ppu<>/«âxž/‰âőz߉‹©M0špâjq58ś^'‰Őń|OÄő|<N@Đ:�+‰‹¬ăuśsŤëťo[ÖqťoSW‹Ă§F  D4âutő|=OÄń>'§Óářžŕč�JtŕŃŃŃŕôz>§ŕ?ú~źáú| th� �Đ=>Źŕú~§čř~źÁčôtôhÓD)0iÔĹĆcqĚn;]Ç+Ęív`.Wk'!Ł~QĐ€Vp§Śë8Ţą×8ăĺl-Ł€Ó©†#1µ°»?Gŕ@Oŕř>AčŕÓ¦¤Á†�4jjńšÜn;^W‘×}ŹOهS aÔ«4ń1u¸ír» Řŕ©ń<N&®$+0DJ•adĐ�˙áôÁřáüŕú=Ł�ŔpQ§SWŚăzÍo\ŐĆőŢąÖëśefł‹MéĐ4Ňä�µä/ ý/•íy]®O…•Ę”)Fź�/+łđĽÇ•ĺwc¸î9Ś©u0hÔ4č�ÖÄv¶»ŤÇ5Ţ7­ŐĆjé§F @Á§ňq:ľŻ_˙Ĺyž9_3ŽWgĂôřu*ȆłlÎ 8¸Éđ‡Ôő8ššÍel‡[ ˛9Ůôôúzzz˝M]J•Ř�Ă�ÍFjéeťž“ëřăňüxůľ^Yr53^–\ÜŇvt'łčţŕđŢ(JĆPš1‰ç>ő—›Ž\ąqĆ<p-Ťg»ÚóZ×»×ë/_ç ÂýkÓK-ĐŻY3˝Í4żeîÎőíŰvĎg¶Űo7{Y«ÚËÍÚZË•Ýuß}ßßßÝ÷ďż»9çĎź>kP����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ó)âÖÚ5Ń4� ÉIľR�������č�����������������������������������^4��ť��Ö�4:��3±ĺωô� ÉIË8�������ţÔR|tL§Ę¨Śu?�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/lowercase-fields.ogg�������������������������������������������������������0000664�0000000�0000000�00000010575�14447736377�0021076�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������¶Űż;����Zëfvorbis����D¬������€µ�����¸OggS����������¶Űż;���߂ޢÂ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙vorbis���Xiph.Org libVorbis I 20050304������artist=TEST ARTISTg���metadata_block_picture=AAAABAAAAAppbWFnZS9qcGVnAAAACW5ldyBpbWFnZQAAAAUAAAAGAAAAEAAAAAcAAAAJSlBFRyBkYXRh���title=TEST TITLEvorbis%BCV�@��$s*FĄs„BPăBÎkěBL‚2L[Ë%s!¤ B[(ĐU��@��‡Ax„ŠA!„%=X’'=!„9x„iA!„B!„B!„E9h’'A„ă08 ĺ8ř„E9X'Ač „B¸š¬9!„$5HP9č„Â,(Š‚Ä0¸„5(Ś‚ä0ČÔ BšI5ř„gAx„iA!„$AHAČ„FAX’9¸„ËA¨„*9„ 4d��� ˘(Š˘( ˛ �Č��@QÇqÉ‘ɱ  Y����� HФHŽäH’$Y’%Y’%Y’扪,˲,˲,Ë2˛ �H��PQ Eq Y�d�� 8ŠĄXŠĄhŠçŽ„†¬�€����4CS<G”DĎTU×¶m۶m۶m۶m۶m[–e Y�@��Ňif©0BCV���€Š0Ä€ĐU��@��€J˘ ­9ßśă YšJ±9śHµy’›Šą9çśsÎÉćś1Î9眢śY š ­9çśÄ Y š ­9çś'±yĐš*­9çśqÎé`śĆ9çś&­yšŤµ9çś­iŽšK±9çśHąyR›Kµ9çśsÎ9çśsÎ9çśęĹéśÎ9眨˝ą–›ĐĹ9çśOĆéŢśÎ9çśsÎ9çśsÎ9çś 4d���@†ŤaÜ)Ňçh Fb2éA÷č0 śBęŃčh¤”:%•qRJ' Y���@!…RH!…RH!…b!†rĘ)§ ‚J*©¨˘Ś2Ë,łĚ2Ë,łĚ:쬳; 1ÄC+­ÄRSm5ÖXkî9çš´VZk­µRJ)Ą”R BCV� ��BdQH!…b)§śr *¨€ĐU�� �€����OňŃŃŃŃŃńĎ%Q%Q-Ó25ÓSEUue×–uY·}[Ř…]÷}Ý÷}ÝřuaX–eY–eY–eY–eY–eY– 4d���� „BH!…RH)ĆsĚ9č$” Y������pGqÉ‘I˛$KŇ$ÍŇ,Oó4O=QEÓ4UŃ]Q7mQ6eÓ5]S6]UVmW–m[¶uŰ—eŰ÷}ß÷}ß÷}ß÷}ß÷}]BCV���:’#)’")’ă8Ž$I@hČ*�@�@��Šâ(Žă8’$I’%i’gy–¨™šé™ž*Ş@hČ*���@������ЦxŠ©xЍxŽč’h™–¨©š+ʦ캮뺮뺮뺮뺮뺮뺮뺮뺮뺮뺮뺮 „†¬�$��t$Gr$GR$ER$Gr€ĐU�€ �€��Ă1$Er,ËŇ4Oó4O=Ń=ÓSEWtĐU�� �€������ ɰËŃM%ŐR-US-ŐREŐSUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMÓ4M Y ��S--Ćš ‹$bŇj« c R쥱H*gµ·Ę1…µ^‡”Q{©$cŠAĚ-¤Đ)&­ÖTB…¤c*RR 4d…�šŕp@˛,@˛,�������4 Đ<°4�������$M,O4Ď�������������������������������������������������������������������@Ň4@ó<@ó<�������Đ<đ<đD�������,Ď4Ń<Q�������������������������������������������������������������������@Ň4@ó<@ó<�������°<đDĐ<�������,Ď<Q<Ń����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ŕ��`!˛"��pH$ ’ÍH–M¦Á4’eAÓ i0M����������$M¦AÓ Š�IÓ iĐ4"����������’¦AÓ iE€¤iĐ4hD����������Ď4!ŠE&Ŕ3M"D¦ ������������������������p��0ˇ ˛"��p8Še�€ă8–��ŽăX��X–%Š��`Yš(������������������������������������������������������������������p��0ˇ ˛��p(ŠeDZ,ŕ8–$ɲ�–Đ<€¦D���(p��°ASbq€BCV�Q��ű,ME’¤iš'Š$IÓ<OišçyžiÂó<Ď4!Š˘hšEQ4M¦iŞ*0MU��Pŕ��`¦Äâ�…†¬�B�ŠbYšćyž'Ц©š$IÓ<OEŃ4MSUI’¦yž(Š˘iš¦Ş˛,Mó<QEÓTUU…¦yž(Š˘iŞŞęÂó<OEŃ4UŐuáyž'Š˘hšŞęşEQ4MÓTMUu] ЦišŞŞŞ® DOMSU]×u牢iŞŞ«ş.MÓTUUu]Y¦iŞŞëĘ2@UUŐu]W–ŞŞŞ®ëş˛ PU×u]Y–e�®ëş˛,Ë����Ś “Ś*‹°Ń„ @ˇ!+€(��Ŕ¦SĘ0&!¤Ć$„B&%ĄŇRŞ ¤RR)„TJ*%Ł”Rj)UR)©” B*%•R��Ř�Ř…PhČJ� �€0F)ĆsN"¤cÎ9'RŠ1çś“J1ćśsÎI)sĚ9礔Î9çśsRJćśsÎ9)ĄsÎ9çś”RJçśsNJ)%„ÎA'Ą”Ň9çś��Tŕ��`ŁČć#A…†¬�R� ŽcYšćy˘hš–$išçyž(š¦&Išćyž'ŠŞÉó<OEŃ4U•çyž(Š˘iŞ*×EÓ4MUU]˛,ЦišŞęş0MÓTU×u]¦iŞŞëş.l[UUŐue¶­ŞŞęş˛ \×ueŮ–,»®ěÚ˛��đ� VG8) ,4d%��@B!eB !„”R ��p��0ˇ ˛�H��ڱÖZk­µÖ@g­µÖZk­€ĚZk­µÖZk­µÖZk­µÖRk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk-Ą”RJ)Ą”RJ)Ą”RJ)Ą”RJ�úU8�ř?ذ:ÂIŃX`ˇ!+€p��ŔĄs B)ĄT1ćśtTZ‹±B1ç$¤ÔZlĹsÎA(!•Öb,žsB))ĹVcQ)„RRJ-¶X‹JˇŁ’RJ­ŐXŚ1©¤ÖZ‹­ĆbŚI)´ÔZ‹1#lM©µŘj«±ck*-´cŚĹ_dl-¦Új Ć#[,-ŐZk0ĆÝ[‹Ą¶š‹1>řÚR,1Ö\��w�D‚Ť3¬$ťŽ˛� � RŠ1ĆsÎ9ç¤RŚ9ćśsBˇTŠ1ĆśsB!”Ś1ćśsB!„RJĆśsB!„RęśsB!„J)ťsB!„B)ĄB!„J(Ą¤B!„B©¤”B!„RB(!•”R!„B)%¤”R !„RBˇ„”RJ)…BĄ”’RJ)ĄJ %„R))ĄJ!”RJJ)ĄTJ ˇ„J)%Ą”RJ!„J)��8��A'UaŁ €BCV�d��˘”R)-E‚"Ą¤KFsPZЍr RÍ©RÎ ć$–1„”“T2ćB BęuL)-•BƤŘrKˇs���A�€€��3�Ŕŕ�ástG�€ DfDĂBpxP S@b‚B.�TX\¤]\@—.čâ®!!A, €śpĂox NĐ)*u ����� �đ��\�ŃĚadhlptx|€„Ś������|��$%@DD4s !"#$�€����� €���������OggS�Ŕz�����¶Űż;���fŻ}[ˇ� �����������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/mac-390-hdr.ape������������������������������������������������������������0000664�0000000�0000000�00000000200�14447736377�0017443�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MAC < ��D¬��,������� ���nd��Ů'�� ���RIFFÜ*�WAVEfmt �����D¬��±���data¸*�|���L~�c-�dą�ű= �öŇ �Yk�ć�éť�RJ�Ěn˝w������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/mac-396.ape����������������������������������������������������������������0000664�0000000�0000000�00000000150�14447736377�0016702�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MAC xĐ��D¬��,����������Ŕz��������RIFF$ë �WAVEfmt �����D¬��±���data�ë �X���Ťł����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/mac-399-id3v2.ape����������������������������������������������������������0000664�0000000�0000000�00000256103�14447736377�0017645�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����]TALB�����˙ţA�l�b�u�m�X�X�X�X�TPE1�����˙ţA�r�t�i�s�t�X�X�X�X�TIT2�����˙ţT�i�t�l�e�X�X�X�X�PRIV���'��WM/WMCollectionGroupID�mkÝóW ë@¬d&ć`ˇPRIV���Š��WM/UniqueFileIdentifier�A�M�G�a�_�i�d�=�R� � �1�0�9�6�4�3�9�;�A�M�G�p�_�i�d�=�P� � � � �1�3�4�8�4�;�A�M�G�t�_�i�d�=�T� �1�1�1�2�1�0�0�7���PRIV�����WM/Provider�A�M�G���PRIV���'��WM/MediaClassPrimaryID�Ľ}`Ń#ăâK†ˇH¤*(DPRIV���"��WM/WMCollectionID�mkÝóW ë@¬d&ć`ˇPRIV�����WM/WMContentID�ź6)$myI˘áěäžöüÝPRIV���)��WM/MediaClassSecondaryID�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MAC –��4������Čq������ČÚ����������sMNrĽ‚9¸Y=Ěl°(A¸ �� �Ś#�������D¬��r��ĺŘ��@�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~ 0´���µ$��ćuŞ41ŘŤ0îÉÔ?YŚ/ű~'´´á­ ÂoHl‚łah>äő}!PÓsŻcjűâ~"™đŹžŃ-Í=+Ë~ľ`Cß1YdÄ‚yz1Q{çü^±Âbł«ęĽűÜ}ŽË­W¨Lc [WąŇz¸Ô¨M1Vív¤Vyçlu¦ňh2ůüg¶DPF ‘ €ö¬YŤŰ='C¬Šr×fĺY]Ué(¶ËĆ<żćhĐR Ń:Â˙ÝPřë9…­}§kév—»ř˘~”¸ńußű-/íĘ…NÝ乏«EŠŐżł¤D¦é+iř•ßņfG¶ŚŕpűÔŻL”MĽ…˙¦Í¨ąĹÔź… ›‰ÄčN˛#)Ć ’,Ě 9Ąë@4úe‚•mŢ3gśR€3é§Üő¸(~PÂ.ۉ“8ĘęŮ–S?©‰a´.Ď‹řňs*˛ůM—(:ű€±Î-Vń§®Nţ†Şçpłu*ŔCÜĺŽÂĹ%^Zś¬9G‚YÓü`ÂbY»9B‘ů\^" yŘ…3Ż%¨óĚ«¦Wţß–ç9[°=@¬ú°˛Âu®nJ°#e’ł°ŕüF+Ýô<×˙'ŔE’«Â×jWđfµšŠUW« KÖÍhîA Di  Á}î5Ş®AU*“Ť3âđ8Pŕb»÷§ [Ż…‰S ÇéSpŢňsŮ?ćS…’śVૌ’}ŮŃLV�0Š|xŻÉKé%®y©űA-�Ď+˘Ds•Ę«^ÔKôiNş×Ę©ţ­†ŞlĹdĹžŐ2ę“r L©xÁ ‚JĂ)Á(Q~3kW O Ý_č?+ VâĚ"Sk™xŮ$q[ţě+.ySwÄhĘ#*Đâöťźß®Č'(ů…Ő(‰Yśů[‰ó™ĺą¤fV>ÚˇŁÄĐl©čÎ؇iÓ:>%Č&@öČ8¨Âř "ýJČ“T6~2y°7©  Şç¦G«Ńt3QËĽbôP±Qsđ xŚ‘8¦ü'$Čľ\wÚŹhŽ˘ąH^z©Ŕ*َ<eČőn5ȵ– ě§Śq¨®PD&łÉꀉIóăyeÔż…6ϡ}ŘŤ±Ţ�·Ĺ‡Z…µ†KŹ Đ)1®3Dżýâ—FËSĹ*‹…=�E#őçÍ™Öę’CÇC@%ĂişŻěU"šĺËđ©§/eAŠJ3Ĺ|Íűç9xMÝŚýŐĚ!ÇŰ Íí tŰľ’Ěč mS[D5 ęŢüGÂśĂoV#xµ—LĽ>‚˝¦`*+C<2ÇUV˘K¬¨“q긨é»Ř?ÁWĽőc±M+waŁë¨óˇ,<Ę÷Č ˇyČz\öHR^*x 0żŞ])¶‚ŹŻÍQ'l˘¬=PŃâDŘG•(Ë7PĐżGš \6ö.ÔëČ~ĆęBđ“†Ćţň’)dDÓ•JŤ úĘ—$ܰ¦b1ŕ3O7łÂa@ŹŔVňÉÄ*äĹt=ţ?H čL.ź'AďzC7ôÇzL‘dą/Ř™cĎ=‰Vô˙RNçŔźú./5¨ /„<mżŤľ$‘óČÁţň‰[´;¬Ëj‡‡kb$bEJŢšĘgĂr‚ŃŮöŹâSť†¨Coź Ő?.ŹGcÍ'Ěrţ.$ł2 č5ěőµË9đt×<&ĆpĂËŚód¨!«ĘS#ÂKs/Ĺš«±Kľ”㡠öHĹ6ň^Xbôş?ánŃž†kŇŽ$7H‘Đ3ń"Ídb~„¶„š-(^ěY>öD˱\ŤßÚIĹöÍ%ŐŢ2ll«˛CçG`™8–&…bEç81ŤĐőšm‹Ž'Ů8»_(-ďąÄák?1öý@GDS1^Ň,#¦1¶NCL-C‡ 2cŽ&+îó'@Fś_«–l\zK=xvĽ™–ŃîÚŷۢ÷÷^YÔŔ&Qť}xao$ ©ľeúčˇĹĽcĺoy#O'IÂ^V!Öť&lÂLŠ€‰+?8Y«ÎQ5J äd4n˘# ”"ˇ|»R:ÁuŰ3BűÔ8/ů Öče¶\2€Š 2dQĄ 4ţ Z2ÄAu“ˇÉo%ăü‹Ä5g‘§ÍŃă%őko1©Źr n4†Š “˘)¨ŮOŻ2(‚É„�šSŐ G*”–öuď3hTy”á÷Ëz÷+ŚŠ…ŕu[}‡mÁů�  •ÄËŽé—í­yy|ŚŰJ€ů°ŔµťSó#5«-Ě.WůÔń…©b1·™íd Ń~>Ář~+öcH=É54‹=\ĎĚ—há±[YŚ…Ç‰xF6ö§źŇÁeyr;ŘŰz·†Üi „ÜV±Îű÷O%ŐŞÄąˇ«ĆHůkôM8g“7EާŘx_�®˝Ŕ9¶99’:ä·éQ yůfWÂÍĚs_›ń[KŞŰ šXI©şDTj\ ’ަEŽÓžW†„:k(OL_÷K›˙–xźöż&†×.ëŔ‡đÁH&é<şËLé›úxč;7w‘§öťlnu_ ë©!—^lŽ!ż3�Ĺ”1ÇäÚfLţtáůÜW#˙UÖáoĄ Nz8bˇĽ´¨S“ÄeŇ€A1]r–]ľ[ż¸�Ť¸äaŁ-Ďü3Î׋Ě'5" Vó™_=SčÄçŢŢšjo™”>ҢĂq°±×Ý–ŢŇ6!Ă©ą =éaäŘ~véźk›Ľ}bŘŹťJ~ = U;Yö€´dŔ´´ŠĎE‚±¸P®R€Í¦§�YÄű–ĺ1OvËo̶‚ Ő缾qĐ2öKĄ™Ŕň ݲ˘VĹH4Y˙ĂÔGŘ’ýnH#ŁîöěŞLMďCEÓŽ”·‡Ä!Ă oS˙çVŇ)8"zźË˙ÜíM4ůŃa«+tíĎš÷_2泪[H6X!vK 6"7Ö\iI3!pf%+W!JÚbŇ6Ő˝ % ô~Î{5!×gw“%:ß  "JĺU%Ń CM@h?ĘLzř8?VÂť˝ń©ähr{ąž…PńÇL©YtM–ĎA×GA#řęŻp-BkK\–…R6ŹąřG~*["0rŕ˙jsbĆ@ťľÚ5u2+dq\cq§(D<çҦĎ5ĽśM ÇŰ?P6T›}¨ĘGÂXĹţőŐŐ»ýDyzš¬¨eČ'A­=W´âş%ŁůĽÉřśʰ(ÖűćÓożţËŚ*ĽŁ1[ß×D,Őö»Óر—·&ņë5śA ”ř&“ˇ^Ć \¨ †KTc7­ůTÔ‘îˇßą^j†R¦ŘĂń48©ncÎö¨~Ůkô™ßůtŐĂ˝˛ĘÇ«ś-RąúĹ[şĚ´Řăř.‡,ýkÍ×’MÍ;·oÜÇŇ!^ů»¤Ü1bńŹ$—ö"Q*.G:8~µtÖ"l Ýf?ĂĎR–Ae@CŤ%üׂÇŮÜË1!9T™o±Ë«ü­ąDËâ(XĆĹËýÖ„tßÚúŘ„™…¸\$ŠB!" ý—>3,Ţf·űz Ž⇇¤µ Ř]™őP­3—͵ůěw8H§Îńp ź~č¬-~XĐ)Ń]]˘˘}ŘĘ0‹2(d8–$”Yyˇ“'Yü1î ąw˘Ű±1UőçęÚĺÉ&z­Np}Äş+’ ,t!9 ?¤K–ŰóÔݰů0CśxeüěCß űPŇöËĹyó &ľ$Ţ( ŘÉô\ăžű#Ýq‡<ěÍ‚kĎCż9k3¦ł‰ö>F+ –C-âKóĄJú!msćÍNÓ�\dÇË/z‹ö¤›éóě ’ą‚†D+Ą)ý’Ś.ěvÔ¶rón̛͌]ü€@˘Űu nTÜŢE}tťvŽöŕś­a´`M§i3\=ŚWl•a ¬ĄŻnŇn%Î ¤áNůôj,A憺W¸dÝč”IÄľô7KNä®ŮĘ*Ü~K<¦Č~ž¸%cf&Í ÚĂĚB— ĄáH3Ô$ÂÍíţíúOfGޤ˘˘JZmhť$©UumÄ ;yஏĚiDÁ$pµG\ÓW]–7Ćí**ޞ– šÖNHĆOM—†,`51է¢}öeă ]y˙ĺĚ-ÖÓ˝Ş·Ö)—Öç)2ŇŃ’!i]‰‹QăîTF©;äź",O]oŃ>´Ő´-ĽŠ·äűškë§ó4ĺČĂĽî5ý’[ŞlěQśĎŤŽ‚îőşŠžO¤ü«Âűă25ĄÁłýʇ1˝“ ›×O¤oň6*Áó˛¸Ď|ŽR;Jq8Śk€đŁęq"zŢÁĐCŢŇČÝáűÜ–$Xf’ňÜÇÔX,Ś7JÝĂ“?=¨!Ŕ¦Y ONą· kýwiÚÚ–“ďźJ˛N=‹… …î‹Îüy±áŔ{Šv¬9Ч=+c(FĎ�^ŮŃđ*­ŤFLľH Ĺk,Ä ľ¦·5•†‰ #|4[ŐËS÷Ő˝MAG˘e#LŠ˝j"OşxIµvجťďĚW9ęĺŚĘ•ľ˛ nźZ+ĎŚśńŇ&6řÜLíJŘjô¨_áŠĘh‹u?Ęť×ŕ°±!Ů ‚»vÉő12ŽGoni5ł/,ż<ś8đ2ALqÍ˝žJ¦řôĂĄIůFŻŁCw$‰+[~@„/r*ylĹ™¬”î™53Ň„! ¤tJA >ćc'§śs_Č©W¦6Ç0ÄŠÜš†éH„’dʦ�‡#—”O»>k÷ügŕń5ăń!í‘ű'„ßđúĎťµúNô‘3aş-”K±ţëZó~Ó˙ˇ†U:UU^ÔÜ€U[u’P oĚČÉ©lş°K=dŃŻ1-ľÁĆlQŽĐUĺĺV±´˘W8p8ÚČ~b aǵ˝ÍĄRőšĽd>qYo‹y×™÷8 ĐTVËš:٦ë[ĐqôĚsČ‹›]®G<–ě!D| ŁŤě•›.T#’!˘şţ¬ËÖ›<:<±GĹWnĂ)3ôH2śéŇs&×AÍH<W–Kű\]kq„Cé}Ő ŇŔTĽó‡®ęFP‰7aŹ.xĐŮpu!nC8oů|‘ëŤ.j Ňß”˝ÁůŤUz‡mĽü�Cž6vç§­ąçA‚ÇřóËGoáüŮ×Dëe˙ĘtîJ Ěż bąré©4vGy(ý.”:NúhŐ˛Úçßz3\Ůń©¤'c3‚ČÚ^Ç«đď‘5¸×ÂGSy:ŐXG9ÖĽS+ČÄ08 ÁÄ…;Fö%ű茉)mÓrË*‡s ÷ţµÄ =Ô~v"®=4]jź&|u‚V¶Kuôřt<÷ß=�gRöđž7nÝëŐ!šyż&mmďVqÍßÔPé3;ĘJ;ĘKŤJ¬ęeIŻ={_b q'-JÍÁ ÷ß]‚‘Á‚µž‹îF4,žżŁź††0–{BrWÇYh2§–Ű`k0Ą®ú㉳…ÜwÖ±,‘¤í÷Ď3Ä $/*EĘŐu˛ –żnęŮSÎhESéµlĽŕVsŻ|˛)Aq©ě•¶Ę‡!ÂáŘ*ˇ45agß?–‚Ŕyz)YŤýĂ0ÚŇ'ˇIě&mť…§&Ť•Ď‹Qň‰_Vt‚ÁŘ>8–¬‚ł.-…*ZĄçţ×ëȾ穤A:45ÍÓĚđÂŮĽ62Ú|»ŐqĆtVˇ×ý ÉŘ%….îTvÄۉwŤŇú1S}îĽf Ń<™ďĎ@ud'9ŐL¦ ş ˘d`ČGkB^űžŞĽ$…mĄI7Rë0p!€ţ9©Ú$ZaŁłiĂ›t,ß2r%#CĚ|E¶Ă1ąě˝ŞśŢÁsBĺUŐŚ|¶ĄUwjâë˝Oěž˝–bź @jFŁŁoŞÉ®ŻjËŔňćńđěpîň N;ťPµUö¨ >}cÝäŤ~iÖ°÷bţ<›ßV=ůŘ˝c˝@ŘđČ}r)‹ÚŠeźs4Ůóh-exšgüu™ô)3aał•ŢÍűh®řFAAŢÖńô÷D‰ď©6Żw]đŇ_KŇ3ÚÜŔ^ČfŽ jt Uwî)>gˇŢ´mŽ0iµL«ˇe ÇŇ’t|­aŚB/i<˙}.öŰ|ö‰9†±:“Ƹ’Ý]�•Íeµ„ŢEg@>°$¬ŰNBf”á„´wr Cĺ–Áă8čCJ!rLw™Ş¨ ľ&X$ëv4}źZV. ¤ËŹdlý‚Â4ÓyicŐ¶äőď©“T“�L†^wíoŠ4@(0qc�RkšĂÁö;ÚO•›°Ö\mÖe¦ů\}AŕLšćŕQ8>Ľ— ‚>_3¤ÎuLxÝ9ĆęĐúĐHELô‰ÉFM6!cÝĽ|HK»Ă$Çx%།ŤŘÝ^=śj=öjŁŘ=bĹŠˇHO¦Qň}(.ĂůŔ}"źx‰ ă#ŚŮPÖ‰iWÝCŢ›°-»˝qĎbńţűŃůż)Š+ÎiÇš-­‚@Ú˝±Ş­IŢ'†f[B űâť} 5ű<-×@7:.zXĺÚ¸Há|KÉ{ĽSt®I‡ŻriP^â"dî3ڍ,ÖŔř–K'CŇh: )ůĚÇđ;+íI»Ýźz©ď%}~hLFK<™ŢfĂĸFµ—iBĐęRfHý>űÝNÁu�UůôÝż˘z*¶¸‡ ¨NÍh·Ň˝NĄCź14\6ŞKyÖâÍFĽ 6Ł`H˘YuŘ-ř&č§ňëS De ál"«&E:=.¬/a‡ôöĚđY˛ţ-Ü®ŢL08ćň¦ăîŤÁżfłó‡_±®/V†)Wz&uĹěëWXüůwב);ÖY_yI%6éĄç“ŔŻQŹ^ Nw=vÄL.]ĄD/dśň™É_;†G˛ůîDL?¶@úMץPSuzĐgŻ YůVfą¬M ôÚ;ß:™ĄË”ÜÉnFĂdzÍ^ĐëÚqĎ=Ák˙¦ä˝ĂšeńömŃĽ¨t–Z‹śĐ̡đ�×V P‘´�qXôŮë’=桸˦tß¶ńVçm ĚĚů—sIrsŤR35×…Ôý`ŔG:$ýÜŢ<ů)ňuę±5&űŞţ›iEwC‰#ŚXg (ßW“óă•y›ž:ÔU4ŽźE>§´äľCâŐaNŤ‹×J@ D`Äů ŕ,CE[÷°9Č©»ŮĎ4i¨<ł2ňŔ6Ő ¨ ú®zďřJČ6őač€0>˛ÄĎź"ÚUKiWâp4ŚľčąLłôTŚşVZÓY"`{RB}Dsµ™y –©ą°‹/âŁĎH“ř`L†\V%ĺ?ĐRv8±/QL "Lżn¤äAŕ4ȶŚńĄ¨MKzů@ň?YăGzöĐŘ0•‘m‚;Ď062µý}÷ü„Py|jýÝŸŰî…!ć“{§é˘;xĹ’7öDL˘ČO;G1ťˇM@Š’Jp©J>gP Ń<<e@šD‰·ÍľçŃĐ­’_Čr¤âۡd3)Őý~ŻÁaž$ă›UfýÄë&{eĐoCů’Ąh±śĆö‘˝Ô‘EÍ,ű~(3ôx©'®Öć%Ĺ0ÍÜ«đ<'S lX=¦TĐ-qĂÁ…nŠťÖvľRÇƞٚYkKńDIYľ8ěô_ŕ˙óEÄş1°ÓRŢZü7…7¬é ĺ µd‘:-ńÁi1Ýx‡ťe ™ř§€R‘„…žsWvR`•Ntďô۰©–ߡ^Í&ƶ·˝xĚ«ĺnűcfQÝMöçlpě›ÓW]—Şţ(CHV˝‚GŁôăűĆb~@Ál{H‰Ń8ë^7;Ż5Ó^R!ç˙Ňčĺ*E«  â]ű–ŕI>  k©lvôÚ?ăËIOŐ$ÔsčIr đϗ·ʼ‹¦Ä깯B8¶UÉw żx2énľ† řćHN+ÜÔ>É|KL»LTĄ19`śGíjsa;¤ÇJĺ,ß.F¦.çB3Aű‹gň˙‚@ÁvŻ_íMoŽęI‚µăäČş5GdšPÖzR°¶iTrťXľ/`±ň.p˙)íLcB ÎłŁüíĽ+eN1ÄŽĆăZ™_šă«.WŕňxŰŚ}5»y!đrBŮP…ú§JpG'V—ĘѬȖŽŰ$îJ‚ŐmĆŤ~#řJÓ^އr„ýZj”çżťbá1čć4ŤsÁF Mm}ăÍ~Úż—[§¬7Ď4Ç âC|<…Ň’`ćĚĄwź¬zWű˘ÄB¬öËßYĎĘy@¬3–ÓWćĄôĎÓďĂş)âß¶Ö}…tńO.â»l±Bł´Ó9±bKZCĽÖľę@ś‡>Rq#J*'şt_ ‡éŮ‹­@Á űC›U­čV“ëI¶SxĽÇn!Ŕ)@ßąt'zaÔŔRm‚?żëç ÍlŽQN˝čpRyěÍPíOî^őű¬(5şo¨Ł0ęŇěř7­ë2Ë»%­°wî±űďç‘lYRţńöu}Y™ĺ=źSńĘ‚şžź@>V˝±ÓČÚţ‡Ż©ˇĚBĄË­—EÝq6î4sbeU’Ş~öś .Ě­vy˝»"EYoncŹ"»SĄâµ×ŰýKx<ŘuŹ÷WąŹi' ľď•Ç.§Vń/e+üî§Cr…¶s؉$>ČŘçgß2 6á롦Amݧ+«¸ěĂďż„FdšdYć.ů™Żë°  &&6ĚĆq-Š2E¬ m%H˙!€Űż–éa\/sQůó= sţĹĹ!ďĘ,ľt·€Űߏł8}˝×CŔ2šß%ʎÂdIŹ0Vśžś;Ń“=¨z®‚ ýh)m@ٞ @ŢăňŻ4b“ľş7"J¶ÝŁgăn,¤˙#Ź€"mC(Ć"~Ć` RłÇÍK°q>ö^´űF=K•5Ő¶]DqăőísËËÎ9z™5ŘI1ŚTś^ú™"u ;~¤KyŃD€nÁbčĽs/i~t°´7ś‘}ş]éČvŠ4Jšn¨˝ä^&ăŢ>ÂúĄ3O?ÓR?ŕ…ă^Ý­HÇ”îUĚíQňőçw^W~§ý‹]=ŹÇ‚/FZŔqT8ołžž•»hń˛†ÔŇě'żšLżŻ ˙ZŢ]ý­*ćâínbčŕÚMnWLcĎQGÍG(ĺŻf\—Úˇńh˛Zdľ Şá<ęŐ¬Ř<N™ůFGú)‚2ÍŞTě˘F¦Ó8¬†x|d(ňp5^ô…¦h´ő¨ ’ôPŞűˇľ~>W6éĄ2L۱˛ü–ĚţÜZ `ÇIůÔ'•˙",ąQÜ^ŹĽţ§”đ˛ŘAvO@ן_ŢÓ·Ł–Â`†`{"®ÔÚË“ů'-¬ŁË65€’o$wJ¬“µyÚĺă|é4{›é¦|úş�ÂĘ)Ļ̌Łňôi; r/Kđ%WV°zJ¬•“SLţâćüŃŚcíĐ&RĆx7pjEęĘzp`źńţ32÷î2-ŕyAňC %ÓŠŽIQčÝĆüF#† ˛źŇľ5î~ޢMjž…Ǚݴźó ţ/Ë»5Ň_ĐD8íRŻÎXŠ'a}YkYě†`&ßŇ„źD@ÁMßčţĆąôH  ;HQB\yv@Ĺ–@4aE€ZâŤ(7Ű—'�uĘhÚ»_čcˇ.a¤YîĐÖz)Heţ°¬‡¸śas*-|@­…ç˙ďQ†#ýŢ„}‰ă•=·ioŃßrŔ$î¶`rš#EĚ;ţ{ŞdüZ6Ă;‡˙ a.Ceö‰` Őx€©~ě–ĐRźŰ*×ŔÖ6Ąů÷k5Îe\(˛éěĚŢ»|­Ń” ýzĂ·V ďľ\?×µ.¶®_|ç`¤Š,V—gMĎ YŹBǧJí!đ/ç,Ŕí pnCĘŹÂwŚŤ˙˛lýŃŞ_š“­rž˝´NÔ‡Śp—"'Şh'ŽĎŘ.ħ>üIç“Ü.d ßű“˝Y…Ţ1} _ź˘Tşµb í˙5bŁjÖ¤Htń¬”C<G<ŕŔçĹqŕ’ Sv!ćţ23&ŚăĘ ôԷɦ˙¸vÉ0 ¦ë[n-}# ˇ€«<Ö~żŤ’JŽç1Ď›ů–lćd_ó¤żŕ1ó Aâ Î˛®ÎUOţř^Âk÷ăG±łć“ Ž<—aTá50"'RŚUÖ“÷é&ťŃ‘ ;JhĄI¸Á‡ôw•Z’Ťrř¸2ŁÖ˝ű}˘Ýň@žµËu&őS+±çS3ď­ŔämR¬„ś… Ţévöć6‰9ȧ”Ěľ˛~;˝–ýÓŻbxiB€/t¨l+%ělĹSÝÔ›úâŘĄ”B˛ôúÝvŃa't_m}ľĆNßŮČ´^żčETŇ.#ź1[âş9©ÉöÎ…/Á‹;L�đ4›eVźÔ˝?\óč±4ăT„ť»caŐ´á*ňlň۬ýrżłlĚÄLÚm$ŇyčöąŃúđÓŽđ ýîP™ŽźT¨°úłÉ"µ-§ě[”&—Š™jÚ!ćôöj|8îş”˛q‡L Ő]fJÂĐ í¶únsźÄ^xĄ„˝'cä[W[˛ÜéÄť‰„ĆÝ;"5nŰ;ăőOŤ‹‘TüBŮ~ŠÖćź Rö6†1ČádIuάűÓÔ$j€ě‹Wí4Jĺ‘1˘óá´2 ÚÉçáóĘ'Bôŕ}§ńĎÚ {ě‚A žż2=Ɖ¦hôťĘţŰ·˙Ţí%Ří6Lď‘ţźv#Ő7hCrEPďĂC„ť ÇŚ5ŽÔQĽR«ö /OÓ4Ţ1ä—bNÄѵ7…×ÇžZ'[K§˝—ň]-ÁdűoݸĐ1 ßš+řő[_\)Ď^´Ů-ŽMĚ۶’šßîĺ`ýϨ’šţâ>hŔAëEŻv˝ÍW4n¶pm=ćçż$ÍĆG#Z/% Ëßj’«jR=YżŠéý<†á*tě*ç=IlŢÜRŠŐß¶ňR𜞕Ө÷íVâ LżŻj¬ž˛®TĆHoe…EÚÜ·* ŇźáfŰ›_ąť�•‘ÁwhHÖî~–S„vő˙3Š)<ů?ÎÄ=¤ąß›¦äďTźťfyßź-ŰxőµI€Q!qµÚŞłĆĚľ ¤fգݸXSřşŰí*דę«ř™tě0Î%z<!;„Ůzř#=ńĄŕňm9z;&"Ü$ÔoýůëĄtx,nyöľS,ěÉđ,Ł/i$¦Ď~~ˇšD“5SľÉR ľťstUÝĎXŘ`O{~ÉÜ?Üí¸Đ¨/éÁ¸ëŠ ¬Ţ -ŠĐ즾Ü4ót¬E•Tu}ýő&”U”uҧż˘F’i9S椰©v8-1ô=zÓUĎţ7 9 ĄÂdAÜ©VÇ.~7ŔkÇ$Ł;ÍéŽöšVkŠěŁEÁŇ^ĚÔÝ ŮČíßlˇü=[eň 7@žm”kٔٶxčŞĽŢ“Ź‰9»±ŕ;0Ĺ�&vß'@ËÎ,şĘAâÍ«Š«w+™ çDŮ˙ĂÁBĆPd‡¦ü”˘{N“—r‚‰SĂۖł{âýĺřik,ÇE~ŁĽTŢż Ťä)÷Hż ¸‚ŰŚ§‹9\ 7!IeRÖŻy‡8ÉŘ ĆhnÚŘĹ×ĚVHdeŠoŇ6-,ź‚�$�¬ …•Á{z{÷‰iżqášlRä§ Ő™Ý74€źgtOŠGç'ý8™*Ş2 Z$©”X„آQöŤ˝íĎ™˙Ú6·!<Š)ť÷őnk̰čVůp–Ó °9ßđč%‡'ŁQI)˘WŽY“˘e‡ĆĎýŽ|lP6ŘÔÝČĎÇ˝ŮěWQ!1ń’­,zĄ¸Ë1(üYyE;ž=2˙7c—ësNě—3b{ĎfżČ aaÎĆbňţ–ôjšMÉŇŁŘnÉHó¤™îâÇF‹±R±˘2gólçz3IĎ Îď{ĐËŃjëFńŻÜBsaĂL Ë{Ą> ٦AŰüLĽ–?®uµă‘vű&[{,Äńöu¶gş eµ˝¸Ő÷[‡™/@†qmÇq™ÎÉ#?r6>×U«ivä˝ců;§žăBî«9_Ś;RÇăQ"ć“‚ýĚ«‰Ąţ»vGÔšä¨u« " Ňťążx=KM^1'YŹ*yĘgü‘Ć®Ă˙^¤.fŘfIqI&,ÁĽ^%ćĹ †Qó[]lËŐîîvv2]śĆq›ď˘YVC‡űŠwj{üď[eVZö�?Č˝T–ťžŔÄŰ0~*ßĆ;źÓČ(Ţ^«´AŮr7‡đĽUČŰ.íŁ 9u4®ë8cż×Ŕ *Ăv*ři=ˇđÜbł˛É„Tl&·Ô€ŰŢOŃDY[ScĂö––¸”ý÷iIź;żWđ©ÁčäŁ8S+?Ëa–Dža¬÷†éGlQÍ\*#¨bđϰ˛…ăĎu÷-D&˝Ĺ8ŰĹ©ĹäآՒjŹUĐh`Đţ\ŕěúÖůŐĐ*đčlb6Hąů%U{ń>±^±ř.Z�Ą‚y™ÉƬ.;žó/ghť‰1˙ďî•_‰J0“µ?/şěm=,ŽšcÄĆ—!+¶@ýńĂté5„†|K'„Pżä“@ )4?®âY# pYű*äŚiĽđPXĄg«^\†#Żĺ}t>Äm#Ŕ0űţ#Gýú±$ťsŕHA•x 0!ň\ Ç©fkĚU ä�LĂÚ~“=1áŘ~ ůn n™,nbłOć]d d~č3őłćw´ÍzÁůB&&/\ܵa¸ädvş›ý”aśÔ8FŐR˘JJ’ şŮĽs‘ş€HJŞë [<ś¬ßwąŤŁ]ŃŹeŐź˛WĐ<b·lsůôx\\™g&†ŞýMŤL˘±ôsIĺ:ŻĹÖ ,j\懽 ş˛ď˙ŠᎎXSŃ=ĎɇxX^T@ի髎ä:Ť¨‰ó¤4s*xţŹ1Ş4 ‡lĎҨh ĎŁľVµÖŤv•Vß*ś¨41.*’F˝A_ŇSąžçQĂţTcűrŕ)ŇŹ›#Üß.żęę3ĽEáP` ;„.·s˙…ďă~a[–ĂTJ%Ů qó¤’˛l%n)ćÔ±Ý+´u"ç*Αµ&ł˙—‹ćďč@·–  ˝rćŽ_˙ÄéëMđ2ßÉÖ)(+oŔ€ôCN>ĘB «í(]5śË»ĎTĺÉľ0Ĺ–LVd-u|._<~*C~Ä”< ]ŹÁ!ˇđÓ‚=iLřľfy#↿Ž>*äÎ5?"ěę–qľŘb‰‹¸l•ł}}·…¤Á kŹ!BĹök›5ŮAKßoĚ]PzdÖ¦ ŃVü„ÁEŕ<>š€_-¤Cîgě ö­µÖ¸a¤Č‹z}äýíŠm`ń §!€I�q^=$őHüÎWu±ô[K;‡“ nűş}Ődé‹)b‡ű…_á4wáąÔéfWBŘéÁě”äßs ˇdeß Ęë$ŘQ‹şŐ‰âCaťŚlńŁťKZzĚ�ĂCĚ"‡®Ó§6L],gy¦^g+-Â9h”~öŻG*”žMëc_tMŠňÚ“\ť#\žĎpŤ»˛Î°š<ŕ©řŚľNAÇwçŢńĹÓ‘ŹDG…ťű$R)ew§î0éŽâľËAk†÷Ň6l<něHG˛˙ąëhéźŘśeŻ@Îbť: R„¬^ôFÔ9ŹXĐd]¬3nJĆGbH÷;Ë)˝4ę_t`›âŞ<G}ÜWrfüT·ÔZĄŃj\6ę±Ý…‘JŕĐ€3·<ôŃĐÔ"“0 Ń^2éŔÄ« žŃřëľw»†sě‹'űČi ‰†Ü˙Ţ™>Ď_?ăźó‰Ţd('ŚýŇIŮíi{=µ®źĆÍÓHVĄĚz´6‚Ö—µ/ŞŞńÚˇÝ÷N_őěǨÁŇ,“pŰäŽE8n32*­Ľż6çÉřĽţFŹ(÷QBrČ‘ćúě˱ĹMÝŘC”JĄĹűq–ýŇ+Č<öŰie9A�F’_B—Â5#i¤> Ş4ŤŰÇfľ gZa4s‰>¶Ůsš÷Â=a*¸ŢŕĹ(LŁÇęÁu¸H’©J<űŘK·°KËĽ÷Ąó˙ęX(Ą Öü’>ů®˛1·EĆiĚ0ČOÁ´Ţ®0żşžŰÎćC:uëÁKˇý#}őz‘™ÎÎA˛~Í\żeüÂŔŐkŚŰM#0»RÁ ĘX›! ďgbË‚“Łţ)Xgj=ä#{Q˛ŢKm‹Űp6 Źháx–şm�ŘF±–§}1ľűK1ĺŮĹľaO\jŮý5ŘŻ3XöQäQéBÓčDݦš<0„Đ@ruƉن)iÇO[Ĺn¨€‚Ő>†#.pőčŇp‡Ůq©WAK}g… `Zč‰aA{CŹ#ëÉĹěţYĄˇÂ%p5ˇ\cŘďhŻbŘ•uW�ă6I;+2‰ykčďż˙°˙K?'jq!m  ńăHg“· %ÍR®'čHŇEaĺ™ůP2nŐ¨xŘŮL…›ÍuĘČpÓ+=ĚG‡«{.ăývB2,méď«~źž{ř’ÁWŽĹ+BLŘÚYZ@ß 6je× Řçlü–_ŹEĘW˙]»´!B__>0«DC6ŞŔy*é>&Á·‡’Ž7wě3ĂuHŢGěÍ)§˛�ËeŔĄ’«ÂÓÚJ!Č©9|’p8©›Ż›}C&µŢO¸ġ ‡î.ĐţĆm-¬9ž,Ţń µŁücËb9MtO¸·Äľ…»ÎwOĽNq–żć <Ż^[§I™Ź‡6ťî~±†ŕźĆVę "y9‘‘Áâ¤ĺá{Łć˘HAśĺ°V©[úDkąHxrŹ(Ôv&ű˛Ř2ĆÍ‚/¦wčŕŕo±Î¶KĐ/ˇ a”:EĎŻBÁĚăX» ß2ŮgoçKÓ1'ĄD Ëę® Ó‡űĽčĚŹ˝a{ŰkQĂŘz’•żË;Ć5łiä[Ěł ´ŞduŘĽ‹2Ă"ö;č"Ű:î(!šÚăn÷Ž“& ]ɤöŹçĚźŮĆ0H6dřKŢ„‹Y%ۨZÝ"ýą$˝ŰíI?+ů#Ľ!ܱúKjăčŔ?xŕ·»ełĄë =í˙Ć«ępË8 Ůš)¦‡ČŇw˛xĚp˘R|+O1ő÷ÉĂc.„íĹń&Ě)Ř.*4ńžŻ˛2^89ö Ö=Îţ2ĹŚž¤×sńâŕ`őŇë 6Ůă§ĹŃևڴ&ŔĆ~}ţů·tőp„ډ#`óEsOP®SŤ!ţL č8ÝVĎIĽM§}yţ$o…ÔďSľ ů Ř–ťv4ŮŢB5eć˝ ňś¬Ĺť‚Şlׯ}źF®¶ bb’7 H1_9j’łY-Qt]¦)+'ąçśŚŽĂÎrgwÇšI|éprö"Q©1v;HÚP¤]@ş –Gëžçbę×®ÔFŹtáđpă×yăŘ ›ÉÝĚ­\t ôA Wáň`6lµZ+lfÉáĆ’B<8µGŐZ…Ë=‹‰Wié|™ę-F˝iúđ“<–ÜÄ;K˝.äU]ąăÄő•É·v]ç©Y[í˛ÁD.ŽxKęµg;¸t©Ě÷U'ńͰăŻdANěĐH—­]6x˘Č”U~fć=>{W¨ď‰°‹˘Ž&eY‡ëBTéۡŇ�`äűK˘TKĐß)E–˘¶źĺ»‰ľ!Q_<I%ăüßą7÷ Ć•IMĹÔUČ-«Pp î'ŐSŢň˘ řş•_´EŠĘ!0šZ!ĘË^Ĺy4a˝ă×h“$ékşWa÷ŇäWĹR9lIşX·ZXZt‚NéMĺÍżzϰÜ2]±RB‰ôş7$هę+ż&Ş<Üiđ  tD¦0§čýěˇ�ŹŘUĂ1ŐŹžżď„哼îY (íŔËş´sî˙°~G’$/ŚíbŮh=|vb›fhQprłXl­´ltëŞë˘Đ[}‡ëR`ŤáÓbßoYţ«\”ägë@i+źŞ(ßS䤿ˇz Ücl)6đ»íɆ;šŻ ¶Zp6_S˛Ť,Š…ČqCĚŕ …\’2›%…ËŚ?°awĘ+\ü_Vüaăň¬ßŤ(Ş1dĄ·ao势2őŁ*0…¶ó~Ŕç&±”kgEůµ˝dsŔ#neŮđ§UĂZËŐTÉ„ŘĺZä5Y‹›' Íţd…ÓŇ“î#ÉÖ, ÷x1‚¤‰°jOťBG[]‘n܉]¦dF´÷)›Ĺş—Şaëę?}>.sCc©:Mxç@á‚{ °YÖMěýŃ'Ěß [gu5ňzmř RçkďPD"�Ë‚!TŃúlj\ľ„Ż\�9p¤!*ÓAyëšnŹĆđ•‰oMŤQÚf˰’Kť˙v’MŐ"Ć’=új˙˝�@šć'ô!.zü˙ůŕü-Ŕ]Ď]Ł ÓQŘS9ÍŠýębäV<ZAßj‡şŃ&LĂ­ţ˛‹ |±YƉ’!żú M‚‚­…p&/”ý‡Î  Xh˙¦§rőÄ |>HÇK)hIZ^űNökµ2ĚÂî¶?É%ą?ć˙şŚ„maíMťř݆ŇO9–܉!*XEĸĄ�§‰S”ö  DÄ"äVě·<›ł”™ěoAÉj«¤mę|YmŢóHˇű3Eę؇ք(«$|Qňş“îzĚ;îš­ěVŇy ^ '–çËś/ZRe«bß)ű9A"~Ţ[H<ŞAz?„™�–Aźę\TŹs.÷&Čđ/VçµUVö4aYn\úőÜ _řźTĚŻ B"RłąS°§űV%hŰîů@ŔO1ŔĹ®ë¬=Ö€ąşf±K4cȸ˘Bb±'i4ĂŠy¬%é&]Pl@†¶ýěś¶4Óî[u‘ˇői© äö¶/&X“đüÜÚř�Wxë5 Ł ËÉŁÉ: Q/ř…ő·É|Hń퉋‹~ceiCRN¶394D čÂs‡t sşĘZPőřĄ&]`ţ(ő"mšMą37 xa°iQ¬§ĄTGĆČD5·ˇŹ—Ô8÷@řű”áwÇńd—żs»č»Š�ĐŠë÷§{uŘ\b&ć¦-ĄB5Xšnˇ�YeŃZI5Ęč¶u=ŁfWDďi´}2ô[ÁšÚ„łB_XŇ:LjjňŽvo¶ÖP€hÎŃ—ĐZiö YČÁPůžWĐ tŢŽălˇŇH•:ş·‚?ďĚî¤;É’ŕ±Ú÷`[NaŹ3Ăý'ÂqĐx(h#& ¦8Š+<|'ÍČć_\ࣇ»˘x—Źuq9¶Üྥ“M&°Bb(ëńTŔiŢ0oç*î”ҵJý˝óUd–h „1ý(;Ltşs»k§ŚÔô}‘ę`żÚŰĂżíl ďˇáŐF_śuät ®<m͉9Ô´đ­F!+čç‚Í(“Ň  a±f\Ş e ĺ´úßýM·Zy)=ƸĐęř’ ¨~áhĺ«BÂNŹý­nZѨb–`»éĆ·Ä6 çL~)Đď˛?1—Ęđí¦Őбť»ú:•ZVg Ó\ľ=¦ľČ´�f\đarźQ!(‰íş©‘“wTŤJ§›A=❼IřÂM_ąłŕ)€08yn"¦Ű5ZĘßK8ŘŢÔŢ ˝Ý*ą!9X�Ą÷̱b2ڬN"şÔäwŽ#çśu¨%”U$—ÚŘa®‡¬3mpHzF]7‹Dářc˘Ő¦Ű™§Zá——ŤA˝„´’bŔN·ăŕ5-µ* =´fµ"ó8Ś Ě7Ž{—+hë(űJŃ—řv˘AĄź—f?™"áK7CĹkÓŻ9—Ő7xÖýJOÎP«áKĎXŰPy¶€ckJ˛[o]ďv‹ĺ[ęč<użň&âÓ®ś¤ó}&ůÜ5íąa+ń ;M(đ©¸Ë9”)úĘ9P‹‰ ´–ÔĆ:Ô<𽞥 ř1ăqâĺX*ąÂôöëG&-‡˘`ţSV>^t•tń)Öűß #ęCŮćĎ!â|®OYäČ`*G&vsŤ¦PqŻ!Çę7w°·Č=nrEŠăŞŮÍ`ńŻzy›L(\˛Ő{´/5§äN {ß«“5€őźç{Ć-ą®Ş!ÂÍ ÓőY`Â…ĽČă eéjÜ3”C=Ćš^€Ëڍp- »ů킡ϹXv^(ĄSpÜ´ýŹąL;Â%ż$¦ˇG¬®>•#Yk{Eá«&A?ž.MD™DZĎΖŃUG˙AŔÂŕÄ%¨‡)ćLÚf$$ŃÓąs?řÁ•zBcŇĽ–B1"‰Ĺ´@EOäů8›\Ýäa$•Ś“jx�bŮIüREEÖX?ĚBnńBSŻçCĐŞńĽŻ€ˇü7e ÍŤ€óęV|fެÝ&_ď)¨kÉě^~‡#ŽŔ›‰ËsgŞČ„ˇ,ű$,<›Ítă#][‰Nň PďB6Ň0ŔŻ ®±ń°_IčW~‡çšűBˇÇävĆ%¨#L S],Ů”V72M9›•›Î'˝áóhÂá o$‘´5ôc–ËĐ0·ú}ľëőŘCę‹Ă çYpxÝ‚2ě‚a ÇÁ-ng+Łľ çޱŃ */÷jčU¦ ăćéÝľĽłě€M$ŽĆ22ö/8ę.u•+ťrś‚,O%ËTfťĐP} ą•â(~«•YV*Íto.Fő·[ đŃsšö62aţ ť˛M“ą*ťúžG!OGĺ…çA|öĚ�9SíĘ;űMkwő4řf. ľSÔ!ţĐÝ?‡ÖTĐJŮČmA§ŮYv{K¸8úµŽ‚& e5(|™+C_·OÍVŤfîŤhŇBď5߇Ěm÷ľ¸™<ó3»¦Äw&oŠsŇú–Dú±–&tŞř+»•ye˘j«bůŤ™öto)Űů_©ż¬%ńň4žkU÷ŃJŮ!‰ĆŽ9Đŕ4ť%9Űkłą]Uç«]ęąIBîÇĚ4ɶ4$—€ĆQdYůoŐľÄŰ–¨™8ł{V#á<´ôC‹X3ŹÇĘÝDL’ąOAĎ\ ”­ßhü…DDňwžb°i…nĆ?H mňoDňĄ—@Ě·YšyĐ­°FËpe”Ďş<alKŮÔ¦Ž¦›ć‘Ýpłź`¦@6g•çŐz˙O†ë٤ĺ»ŐHńşÔÉĹâŕ7@±­ňdhě©˙x•×k‰ďÇ.3¶ŔÔ/zµÖŁ÷[‡ý+1Ţźň>Tjď¸Ë.é?é–TF\ą&Q÷MG¸2śřEH@Ž”őú,J“­P¦Ó˧l8‰?FFL¦ię?ĹK`ń‡ËĆÎüO!Ąc Ú»$Sý~ä tť ő;ý+ĹÝů-xK>7”Éî;C˘đ!ďâłě»·i®©č;Ńf]ĂÚj4ŁÜźYljÂQŘ'ň¸m)őŕrśW‘(Xw:R71g­ńhˇTS’9ĐÎṲĘ8–%çŽ)_‡nÜY2ř‰ĐČvzD6/Kěś9Úü×Fä=HÜ?ŇS“gő?)¸U­”W¨UÂ`b“Ptp!ś®>,SkMŹróło«S9ˇ ©“Ë,f9© y‰·‘É ŽŤ/ř$Q^Ú±†¬u$~EČËŰ”�q™˙L冴Â"‚Ź-GJnl8xg1L Řż ·ó? )CeFä5YG"ÎŐŔÇ÷Bß]§&<ąMÄHY@^R‡Ú“ŁúÔ™Y'BáŰ9˘/P×UG¤Daü)pb’xńÎ>âĆ”zl8%ă,ś;€Kčěöłrpk?‚ݧ+ˇ¸j(ÎŘUvR.SťGňTúŮň“Ś ]±Ž+ZöČ5żl‰ ´Ůxí?ŕ_ť§)=×?ż•TŐĎuXš3×éäŚ -%IpÎ%tĺ>{’ű�üŽl› Ú°MDYŕyě}|ž—N˘°XO¦ťéř@Ěép]jgEşjÉ4¶‚ÖŇK † Óe–ĺôM^}Ŕ%+A]ŻťÎÍr„Ĺöě<I­Şľ÷ޞřńŕaU°'¨łg>"Ľ Ęě!ˇ|‚®’<ż5" Q ?É•|Â.ţîyťšŕN±*!--Z·]rđŘ“$";ÝMŮóŐgíQţJެűî·ŔÂŮßČËTZĄ$ĎőLË`.k'gÚŽăé)¨G'éýFié/ô­IÇĎ–YeűO˘îˇĆĘłŮg6©‹ö Ö˝É€6 ť×šś¨”ÁÇ %qĄ6ľęÔăôIÍ‘Žqf•…Ĺ-QFŻ çý™BĽ™°ŮŽU«HšĹK{wë÷ážCl(_Ö)ËM0‚ýÁ?á—ÔÜ`t*]´/8ąŠ8¸ˇůĘ Äç”ŘQw†|5ÔĚë÷ŕ‰šyh­BAY�ßĎ*žyHp‚Q±Óõ×Ű@›ĄéZ’ë ¶:(nö PőDgV„r=1 ,¨ţú˛dÍúJJ?ă×]Š7k0_fnŃJŕ[‘8ŔÉńč#ý1ˇ˙”é•fXlk´ęŮOŔ»‰ľBYV:M-´HaxF^7„žăFßĹx5Á/Śŕ¶×'¬÷ô¦ŻŤ~ ďŐŰć Ă×Óu…śrĆíĹGGâ�ó’sĄŐ§řř6ľ#HßµŕŕY©™JK-‰b:ú&˘PúkB%ýÎŘ>܆•Ş•LH){¤ÇŠ2‡ÖµEíżúü’T2“‘Ś•U\úŚR&ólë—š?7ĎĆ@T×€?ŃŻ'*Q.‡ýę&:µłĂëľ;ĘA|)ĺýŚíES–1FJ>)r<Ęuë˘#MHQMŇ5Óěáęű"GĘBǵŰv™ĄD¬Ą¶Ž…ĘbĎîěۆÎl 0C‚ý‰l}b§§eOčč(Öš®˘¤ĽJ¨[. éŕ(Ů~3ü¤)FĎ:UŞá7©ŢńŁÜú䲕ŢÓŤ)x|3u® “Ó5nßďf+ĄĂI#‡ĹSwu4_v?\sĘL ?Rsča†ĚKÇŁˇ|«Q°·ęHĽ°Qž˛ ĚNőĹäŘĎ÷%uj˘)ęŔ[łp|dy¨,N­fر{Ş% r¤(đŢPµâi[Ȳ™‹_#ÚTŠłJë )­o¨˛Hçńţîö…>T±ű:V÷54ůít—:”uĂ‘âJʢ%ĂGŢ×Bm÷ő_7;Á<Ejśzł˛ót)í¶!ÉŻĎöipOŢr٧‰uD˘ßTß|ä}ó}ÁČ2/-ć|üŠmíBä;'v“ŢbQĆ‚‰eµUK„{3×mśő!ń¤DÖÍRóÄĐłŽŘ?˘Éí}—·Ü‰ł=˙9™ŔVzP+o1Ý@ńŃŃM»ďJŮ]čhđáĆ‹>K†)V”ŇƧI˙ńěČyzš­„÷ާŤo&Űwa+$Ć®;ü0/ȦÖHߊő\‰nî6$ŞűżŻĎ ňÓLüLˇL«r„Ňf„ćĂDJdn{Ď(Ąkcź¨ćCuÝť“%:sQ˙‘˙Öš޲JdZÜäIb5%Ě;ńĎ!CO'ŻľYŁ}í剚püM‡.żgŃŃĘŠŮ•ž3„őťčELRŻ'ŃŔ7ÚEîÂŮEŢČ»ČҶ•ŐE–'Rŕąm–Ţűuřu8>’j•jM¬u0ď°ÓNşÉQTZć`!š,ÇŘ<Pô9{^_irő”*óL­Ă.ö‹:Rm?ł¬­/�/Źßř jäWÍ´Ş(3řT8ëřRö Y68…m jŁÁËś ßŃíi‹ —qş;,ąKÜčAG§ŘL¦F”¨DŇR›}�‚CAU'ĂďęóYö¶knÖxü-ÜđŹŠ>ĽŕrńČĚ?©~±2‚¶§´WN´SĄj˘…Ŕ-y6ß6t!dţrYž)Ě|Äľµ~“żÔľł…ŹxěąZ!_ŮKđdEfŃG­F|Ő0¨ /벥„Ü\�ĚÁe\łL‡ČţśÁ/¬ŃŘ”ÓË…Äď%{ź®°íŁV×áÖŘöCcĽúë>¨…!E„ľgîs_÷|IšŽ»UNkˇÇ3Z`NŚţ=I,dďĎĐL2á†-z.<űíŻéôF‚BBmČ4oÖ–˝Vó)YŐ˝VPŹ‚XË ú:ŹKQ¤XŘâĄÍĘ=ŞŚ‡Ăź‡äž¦ň¨(RşĄď…„ŐP?fÍ^ĐŞ— 7Ü,ď¶>`˙ĚŕH*VÔVÝ÷áĚ ”ď\9Ć´˛ÚzŮ‹Ł Ýşî�ł·X·ü±;;üY°äýÔsUş†ů˘<Źć}Ţ-ę8<Şă’B߇E.76ěĂŹO¨#?@Ô=°N3Í|x2#ˇűňČ%ÚŇpĹP}öyzG2µ†°łĘ°Ć)°|ŃúV5€W&‡&Ő2?Ĺ*żĐ4s¨jŹD™˝šYG©cÉ^3¸ĺ([ŹŇ6?’ÜŘóŇR]T"?ő.bǦ"ü vATî…ł[qh6ŕ}q}ˇéae{Ü•‘Çę…żĎ:؆yş^PMPćQo&ěÄzIä~Ł[€RŇVo«ŃµµŞĚ5Úëo‚Ř:~?]FúńŐİť>óBnĘűĐ]!>réŘoY˝$nč¸Ëi L”m!q^$$“>)čĹD1qˇ9 ˛¸•‚{ü ŕ^j>ë¸Uś«‹ă`7ď%m~ 2 S¶FŃwłęŘr]D^ |ĚkĆopm~+—ŹJLLxxŞcq‚ëöÓţ]×w'pďěÔá…)ů+_ŐčXĚl‡Š^ylw4˛2Ç�±NßBBvKŇëţß(r°`&Î@FC? #!křÇÝ­Ńą—XŠ˘Á˝Ý•ź¦'k¬Vąő9őđ¶CMę$ű5*oŤÎ&Ó¨,Đ©íW±Ľ'­ôY¬x“Ă(Óď" ©YQć/aG@›(ÇĹaô®‘|éáô˘Ły0=‚<Ř.޵ĘU€ľŚuUlszv IüU,HÂŔ^·Lű�íčS}H‰}[Tť*ô—G×x"–‘9®f+v›^í¸Žtžá éąľ˛ĹśÔÎľf@&…u­ć‰vťß-†“)ąmÖr´) ˛Í<ía#!ÉL¨Hs#lŠ˝É›‚LźÁµEáŞ2?o Ą‘7„+ŻwQ>ď¤ó¬ýĽ–;w<řUÓ¦O&¦Đs+óW[Pyę• ZD’ţ_f!Fi„jćǚ׋1`äđrÓŐQ]tź[tŐ„Îp űżA_­†@ŻXśçCÍÝ#[Ů­ŇŢ/Ú€„Ö“]É„wŁń@}AŐU›Škmpß ůĚD1ä@śÝ ä¶3<}ÉŤŢs’ă,č˙ęJłk ˝.ł¶ąqKo~…;ţćŘďôć{Ö[ľ¸N 2„hűc«W{-RŢÜ!Sńľj''Z$ĂÍDb‚ÁĺĘűŔÍ{öQĎË?lăÚ‘"ľŐ•/Ű“Ŕ.Yw8Őöą˛ę‹ŕ]v#ŘÖŇűŕŮN›”Q�®|1"C`Ü …ţ0�ĚÇ·żýy+DęŘ&@3‚ęíÎm—ą<ŤCoZčě `ŤYë&%꧆ŢË�TŠ^–fŔLI©ű•vű±"¬ś"‹/‡ĆÉ&4‘Ž™Ś:)úƶőľ ŕ-Ń@»ËµLv‹ţąű<ŢęÓ’Ë ŘÉ~Ú8ç@F܆ËěÔxĐ<íwť‰{Q7‹k,öűCߥ˙mžŔtb¶IăTäŐU`L„…·sź QľąţŠâqÇ7ľ”¨ßč¤q^#x_�_x_ ­Š3W=*ix=:ťWź;Y´Ź řîjŤXI| »cüą| ˙ʤKqÉaŃ÷‚:«ÚŮąNž#5z-± ÷Áš,…+şf«Éä]Íu—�ŹóqEX#ćZUĘ8ßUëZYĄÇ%#yŚ¨ď¤«‹(PŰÇ/˙gpä­fk§ ýúař ćŤ|Ń´[)LOş[۲/Ć˝»çhbŤił¬çŕ>Îť[Łó‰kÇ ”Á©Iµ)ň@ ówé^˘t¦ŢóB°HX’¨ç››\ˇ¸kŰ&OEĺŁĂË�–XÂ:MęJ“߻Ђüo×k§ĘĹŁöܢ‘Âý¸#†Ű˘ŽrýP»Âő7Ý LúÔ@ŮYRL«úĽ¶,YŻÄ$‹¶¦˙DˇsµâÍgqśM=pwe®n>gKl˝ŤÇ“ŤyCZ‘\úŞDeUUPęSňśî¬ÜM—¤¨G&Ů3aäô­w ‘â�µšđ<ĐXr®¸«‚ô4@ ŔVašűćŐ A?Đäh©´…'¦¤ d—mÂđ)Ń6„@éîů— ťşńęˇ>ž ¸)\IÍĂQ_šMfń) Č5MZ rí} 5_aMĐĺb°3Cď?şĆç_˘w[ôfkTc´ĘÔŻÓ ±?fv˝Áq^Ď\Ż‹Ď! :pÚí)?âIĄě[,˝Ň.y[BęüCü+jEďo0Ň@˝! ­,ŰÓüq„Xţek‹OumŮŤ&źŁÜňIĆ�âŞ=uű:Ź®đr'źRŢySfgpĘż_UńC©ź˛ŃĂŽ»˙FPŇ|ÂťiLô»čKa…Ť6čłÇč"F%VCÁرÎSŤ;óG´•P˝ŃXP)¨'iĘ$™‹Ý…I-öŔIén»j;vÝ0[…<m-L) Xifíž=|H2ś%Ź`É–>Ę$“Cm,;TŢ­ţď›b,ďM;­•÷ى+9@,ŤLsMŃ}ËAĂ"c]�FA�Ó)Ýŕn§kËjaěŕ‰ šă> ľLpeE_B¦ÂWăŕŕ«G~Ť‹?gľ˛±g'Ţ?^© Btč…ŢÚÍóŕ¸ŔÜä�ôŔł‰•npýs}2Ú˙{;ű\÷…h{ŻI/k— ĚÝr$4·»° Ę,ŮÇsg+ě vŮ+?“q«ż�ďšÄ4˛4­“”*ęĚÓKľIŹm´|źG@ŃŇ,ÎÄ‘őÔ:=¦i^W�ęÖbâxxćßÁ1áŁÄÎ+–“í°bŮŻBŁř·Ţ Yô™~c¸â<RA &«¬k950ëĺ}6r|8úŐÜzŕlrĽEýˇ~ô<iĂőÎJO�łiżWŽ')E ŤŠĘ… Ŕ2„šSÜč÷ŚjRoc状JO ýÇĽ—IyxÎ×ëi¦ŰůX¬ůe8�ŠĹn7[€şWdĄĄ˛Mδb ßČ3.a-ąř{ň¤Äcăíp^ą·Ědâ‡8{<vr)ČP%Oú·aYj첇„čËWŠűŰŽ/<űň»śÜă‰Ë4BŐóuŠF>,lL!C5Kş;[Źó{vČ%îKTšµZˇĂivlÚ R€·H¨ÝÇ!tÁˇu–v˝­\Č@ ŚÍĚ?O•SM8sů2‡a¦Fb ntX²† şYŻĆY©Ŕ¨3 MEś„€bÁžd+1…!÷xÄaÎQŹc˛�϶$ŕ– %2;˙Ő‹Mž˙őép©;Ž:Ř{YŤĺBŻť÷Tȉ"·çŇ+„ţ…%±–˝{­/x'Ř(ˇë$/„žë#?ňŽAV.XX5fWŇ‹ë<*d%g«LÝAťŚ'u/%ŻCőůx#‡—iF˙(y#¶>{+/ł›­©öČôd' Ł®GŕĐăZĹłénŽŃ`HaEg»đůÇŕbY!» ÁtźÍw8~~ÂŁđ¸xýü{-úĹěxĐXŔ…+FÖ=v‘¤˝·nж0Ť‹=nJcH*%ZS•­ţöżęçĹ”ĹÔ¸&ÎťďQh-qJíÇ1ż°!ŽlDĚĆđz,!?@yYpÝJ‰Ńx “ŢţT'ŹÜziT'Ecđ›¦OÉ^3Ts¨W[~Ď0$±˛^$LidĹç(~¬zdĹľy0jŮU¸Ž=ń’ü›‰h˛łŠÂK‡ŚiŇgBÝëIęńÇÍ’(Ř-{ĎK\H%1U ăˇ\fs¸7  ř›fdë©®3a0Cçi–&mľĘ“”-zŢjn{ąţżÎwăîV$ÁYYşyIçŃë·‡€ů8µ{Š8A3mjť)Żď)Ńk Ćt`IJF4j–@ń‚(•ËôzOn÷¤ădýů­#áYşYG ptR�”@9¶Ž^ A˝ýµ|rĚëţÝ ?ÂľăÔ3pÜÎľ2d¸˝HŰ,?ąŔX™I›łĆoD"qţX^—ÓĽ·ůŤS’Í`&ŽďÔD’Óę“,‘2©ť™»T«ŕ}UĂv`KmĽüĎĹw&Š4žµ€ omBoę“ÍƤL(wó[Üά2Ű÷Ź Ł9a ş´câ7*ő±Ýz+ —ŹÓµ  Ľ7Ť ÇŔ ZIdyd¨Őă=4â=>-‘ß”ćKě„;⸻oWCŽá1Pɝ߯ä”Ů|ZňĄÖ!ˇ¬”¸‘RÔᙞHl-ă±ňČJ!ž úüór;EVx]„˛ČÂ(T«;¨Ŕ˘µ?+ČÂ”ŽľźJ ŮQ�ô0IľĄĽ–őJŘ„‰§$‘Zngm®q®3aČ÷Q‚CĄs­RÜóň…(tď$ulfÖΩé«[ÍÂI=‘O)D‘áÓ¨ŁÓ[-Q&KÇDőFŃO\mVd/ ˝ž�Ęg¦‰»Őâü,—¶ľ®ý|ĽIj ş}éÚ`Ď$äě3­ŰR@=jĹ~™ΰűł0ߎüE”NŘ;6ń…N­GB˙ű–·Ń.‡g…ő:ÖPúŚTxą]wďhú>đE'áTJ‘é4"bY˛čö3ű~Vh¤.!�rčŰňćÎJşhŞ ü……°âbv®ô¬XAtÉ÷†’Ň–!wĽÓŇU*wf|â‹sHĘt–­ řĄO%bÉRnŢ»űÜnĚ?´Ä!„8ř€b ®âˇé‰­ĺ»wŔ,Ťň{6Át>A^f�›ČßnŠżĽÂfkŞRŻ?ÔrYž”:=1i“v$AŻö×§`Ł â%^BDK«łÄ«Ůé” Ľ,áýe ż[9IčrAbǨEâÔťĚ*^Xîsü±›ú= Ý MHwŘH ŘřîrčE7ýj/÷r^¨”`úmşy¶my9eJ/śđŢ ÎpĽ¦ç ×#@ő$ żµĂ'Ęٰľ&‡&ó´ML€ŻĽkFž0˝}?Q\óÇ~K»–۰·Ó?— Ź3KDKauˇë»‡ţĚ&(ŁStq 0ńü÷š+8ÖĺŃüňđ€đyŠÖM#”\bŔúŢ*jka6ÍăŕöďĚŚ&˙©ą–Äś|W÷OľP$ąĂ9䍂@ŐdĎIěË’…•…Ŕ„Ę´„J®%–gąÖ€š?{†ş}ŠĽÚ۰‹ çóňi’đ$ĽËc° €ŐљߏŤćĹK2đÝńŢňÖ‰›.áM;"ý«K–Ú·ôO×WSwšęďÖüR:,Š…çnň—¬[]3lOľ×÷ĆđV1îâ{-ORÎ÷ś‹dÉŕ`N¶ü4© ("˘ÂQfS<¸XŇČŮ@H<ĺ`ޏ!Çďţ‚öb_e5 XhđĚ~\,íşQ&ů:łÖőQ<Úˇ?U‚='Ń>t"‹Ý“}k*d§XÚ„Ä_¨™ôĚÇMÁEgŕ€"Ýšţ„%* úQá»c/Žě™%HëÁO7Ľxşň§™¤[=óüoӫʤ çAţĎo­BwM<łřQZŃŰŃtÖ]šËo—`o!úž©B¤B㡾Ȓ¤µíîN_©č§’š7ô“Cö°”ć­,Š5§úιĖľ¤Ôm ÉvLBŢ©dŔU´Qť+Lş,ź'ćvĘŽb­®&!űŽi¶îXµđ{ź1RčVőĂyŰ8 ă[�ń®—Y)’SJÝmňˇ>ů8ä¶Řjţú“ŞĺŘ´",ÎKâŇ@ͧ<Ç–_üŞîŚĆč°±qÉĽ´5lůCw•1h«Ją˘—żW-’†\t×ŕ.'ĐN7/Í&Ť}»9„c\ÄŇX;@ĚFl&9ŽlŃUĽo âĐ x›f{¸oH×ń‡ ˇ-\+÷‚ŠŽ± ZVZ§éźĹŐ~‚A1V|j7ń¦=ď0ˇUˇýă5$[K̇w±? ˘á… űjÔć‚•äúÖËŰ&mŮŃS î'ąŕ9zJËĆ!iBnşě,ÝSXä¦1>Ď ˛Âô©hÁ&†€!óY]GÓB=AśvÉáÁ»Ó -+qŽXŹ |†š 9-Aűşjr¤Yqe2·?ĆźJý/wšż­T!‰~ěţľc[˘V „řk´Ď’ŤÎtÖĐ� ÷Ëw.žxKö]ŕ0>!CΓŔĺÉä7ě˛˙ĺ‹YŹ÷z…ŕ Ń88öv— Úf‚@%Ţő”ŽW±ÓŘÄĎĆŮŕ˛�©˛łŤuˇĂÁăimÂNŹ·ę̸X4QäÍśŤúÇ*TĐk2Ă >Sóß¶ůcȧ¶M’żĺŹ?-ť‡T#Ú´á7ȉƷjĚ”1ti¶‘™ç„Î]ĆM $Eyôúőš‘s»ŞŐ,b‚6‘főf`}©sçO]T§‰c ăŚzZ:5”j3Ą‚îvĐ™Z0ׄňÎ3^¦§lđ5+ŘAÝž"ůYŮc•Éę9ĎL“¸cÉęĄçY€`†4sËwúŕŕ ˇ“ćJ€9żÖ<@á ©˛ńćÂJ˛°ńŢ)đc9Ŕu5jg•_€B5ńş§}Sř¸ŮKđ- ęn©jÄF‚*7RŰđ¶y;JsŢÝĐt©úAĄŘ ×Ü×c-§|Z‡çÄěÇ*¶5Ř<ÜŢŇ™ô•äś6Ú˙µ%*]E—/RŇű¬ŕD˝tÜę{:žâE ľ´¸xţ˘ˇ=Ą ŕV ”öd\ ây…łJ­Ö—(HH†ů¬€QŇJÄk\¤hÓ$şĘG 3Ü˝Mö%çYŚCľłcĎ •lWPÂi/ -ŃöJϡÝ`°É,….q }V•@Y&Íąô|…r]a_˝Rý+9Ľ¨Řż+ĺmîŮe#H·ËG ÓwťĂl0Úâw±ť¸€3ŤşÎGa‡r%|)'“ŘX·z!ó×ÉŞ¸UŞGť8\×*ŕíD#măś“X"¦<\˝ŠĹ§gŃľů|ńG­ż—¨AĆď§c΀uU7ÇŁ|7 n©ál—ÄĄýQ˝‹+łújrG Ö·­×ě+hy¤ÁÍąS¸űF–”jžđT˛k/|6âÍdzž‡˘N)ú•Ë}ą¬n ^^JRŻĆľ^Ďx *Ň5ě/élUֱ⚡›YŻ·`îHW§(Îíx®L,Xws”v="Ë«—óݻӿg%\ľ đŃ[«`Ň5łÁé9?qäćl"žN<Čv_@řďDůŇ?`YďĘ$> éĎBŕ}oŤ ŞcݸKěPŞf©¤ďg°˛™ú3°ULóK'B¬’ “;ĺ{ şÚŮ™ŇTAâ‰ňŔ<Ŕî¶Śâxt­­ü¶!: %1ć›ČC×röľWE‰@7p5â›Ň˛XŽ˝h F_ă´^Ę)ÖÎY1…ť ĺö–€&t…Ű9E�/ÎóUmpŐ3N †šµCĎ™zuĽKë‚qěâÖg[r ¬śˇÉlWŚň,\ž¦JGĎtSŮfŐµó΢ť°¤břŃEę”m÷Í�09ĽĆĄL)Ž_ăměâTTł)¦9żc zž§‹H9Ť·˘gp÷Ŕ—Q4T]Űk©Eőľ,@Pí…Űâś�g¸D?5‚5_wWš¦Á'ę0%Ą®1ůĹĆńI­Ň#ľÜÚ”Ö´ĐŔ`" ˙Ărů)Ű_‚;™«ą/չ̡…ĆńF]dó6]Î9…±… šSŠ Ť˝^ťëQ{ŔŕE#Q;Ť/ś_/¤ś{PŮńAÚśÁÝo%JĄŢót·h4ąÄ· WµrĽĽamŻ©Őľ˘GZü»źÎŔ‡dĎńęI˘¬ľ€¦T.U˙RĆeí©Ě?Ýc±HţRŕŁ6UëF«#`LnŔA,–tÄCA4¨tł~żĂä[iŹń‰1™:„nóév­Ë„©Ä6^âIĺ+S0*ČAt†Ď#ä)­ă%stŘüµˇXD'@ޡ±QL«”WAďÔîNÝYbµ/đ·bĆśéÎJjKpySuő t>ń�rFH¤Ü†z,٬‘pK÷úŘÔŞy\>V«Ďă—pdţÜé@YfO T6Ţd˛3±ĎÔ-“LYĂiç CÖ"ů…ˇ71ź3Z¸ŘxđŚ r׺XwĚć l¨ŐŚćgÁžZCůpu&ôô‘†h$ä•éęŐ}x(›*‡<?ď…bĆT(A,+pŕ€ó?I‹Í÷`ş“‡ČJ|?şCëTül<¨ĽrY‰t5éőűUuţ 8ßeuZd h,TC„Â2X¶™‘é3ÚzÝZĘq=BđütßQëe˝Źí¸âY#”SEžmXĽG±ýwéľŃ6í äĂ)ÖŃ}ęĐoś»6CśÖ­ńźÄÝ­‡ŁµF#ľ†Ę‚ĄôüÜEÍŐîý)ȿؒq˝9G+KÍ‚ú·Ăb»#«›%dĺ%‚np×ß4#ýÇŃGćkČ’Ŕ9éě Ű ©€Mměb®fÂŢ hą¸ö×n‰UĄőEÄTŚ6 #GŔô&˝´W ‰çźCĽăŻń:ŇI¶ŃłgĘŕŘeEµÔĄ‹ĎL(ŞVőËVˇçĚf“ÇĄüĆ1ťĽŚ×ÁńĚŕŔŤ–*„}â0ľĄżSd2‹ŕújÓ\–L%I2Ę٬lŻ#éąVSüźm™Q†i|NŢbž őśÄţ§–ËŔš2ď’ŤKž_’5Š hdŢ2Šwq)dŹ>XËmóUaWł{,nŕvÂĽ˝ł·Â‡í[–Çî Ůsíă}Ł5blřĂ´n‡Ë†ň™–M¤—9MĘé)-ý RŢľęfŐ_±<? †ÓÂâK/ Âkt€2}z[y2* z3ďDHáCA:F“nĹ€EĹ\ś6ÄÖý+*€ŠD‰şɑբZ+ŞVkŘ:ž,PÓ-űkőÝZ~ó jn;M5™óĄ6ĎŕKfg…KGąëŮ÷źíCÚÍß˙]ťÓ ”ź˝¨Ü×ëô9txšXQřąË¨ڞíä°żĐÝáÍ"ksH艾.‚ĘÂ,tdY˘˛ł ˛§©AVH-zŘÔT@»sH¶áusÓŽśě{}é%ŐĽ˛˝w9Uř–v„=A+ ‡Ż#%‘ÓžáeŔ4™bJËżëć’d· ź&0�WôxĐËáÉ]«ţ3?ś„bšđmłŔrűp;ŤIáÄ…'˝7u?;4źr"W\Śj=ůörjĄ—X°}~3ę ž}čŞôÔO|`aíߏŻTůUžŠ%Bä%/‰±i‹Şť_ĺ5©l^Ąr $}(f%f´jWk\•ń<läęťNŐ¸—Ú‹ÚśŠŔ›OvŘ@DŁněK?Ä.uÂVyňŔLë’ř‚ˇ ĺ4ˇb7ź�ÂzBä¦ĎĘnţęÚj JJtőx˛‘çvĹâąÔľőî¶~kÚJ"¦I9ľÓ žĚÓę@ Í‚űyÍ®‹ą1ű}î JĆg´ÄhŇ7^ĆfoµËˇ>K»Ă#é ·gEr’ałGě¸8#@\cŰxî\Ü>jźôÚk¦X፳ĘRSG¤|§#h>U»~°űF $jâ=ŞŻéŹFŔi®ŚKŚ>¬’üi`‡y ‰}¶Öć änjŚu¬?…ȩݪŔ$Q„.h‘x®}ęcgÂóxË˙Â]j4ľŔŽ‚YqŽ€L+qtpǪ́hjZśţËé¬J5fI÷Ű=‚‹VsÁšdÓ»ĺ‡Űłuˇ‚~×ó ‚<ş*wÍ×Ň †Aöz…CÔIÂa Ď@In˙–ČŽůŻ`pÔňÄŘWtBX­Z8,Ý"Ţ2x-Sl %ß!ąĎ qËń»Đ4Fw1Şł‰8Đűݦhőö(Öˇ‘î÷ŐŘ8Yż‡�b‚Ś`·YÔÝlď\E»đ˘±h^ü“$É›¸Äß&Ą™Ţ[oFsż‘vŞÖŐ Ćҫϭ‘Đd‡öNúş|1ÔUů”*Ë”‚¨ş<čl¶-Ăv…¶Ëż9*:ÇŁ9l?¶ë(#ŇóŽ%Kgť$Š–öiĘP Ü‘SYNAßč·’X“p«“ásű=-¤ˇISQ-¦[°ćüćźAřQĆ0§ĎI¤h+d 2�0Ó+ş'«bŢÔŔ›?ű}+•(S‰q0›ČO˘ #šnµó9űx™5;ýtĘşň§üëŇSQNoÚ®G!—űÖ‘nĽV‡{,ř“i5Ś·Q=–;&čúŽšR‡äŕÁľęňż`˙Y¬lKăźaë–őĺ#9fšŽď'űů&1Şb\Ęś-A^§ÝΞ÷t‰mĐĆ 2Î^›f úz3ŤőҲŁ}$b=1Z{ťr-W�În”§9ă§Í·#–C8;/Ţđ«[Ě#nň±a¸ŢG­[¦şrÜč%Ç×{‡ôZ-BŇy˘ Ąů‡mjř čS^ăÎŰr¨}ŃřÖ˘ˇŐ–čŽ7Ďgšh䏷7´­›O\”ŽĄĺlž2šŐ*&á9ÔM¬_§Oďןś»ř(+3¤{Č™ÎÁ‰ţśÄ޲™§,dAPŔ—8¦Âů€‰Ą`ŮşáXWkQ¤Q¤Ľđ'ËľSţä°ëĘ2µ¶T¬Ď„P©ĘSG¬ŕ?<ČľÁ€ż`·s,ű2HwwÄŹ2nŮ[ľÁA¦�‡ôäĘ‘Ş ŮH O{PrúÍěd‹+íöňMu/QŐHŠ1>ąĺ-é^-;\ {®»űńâá88SD•ŮE†üş˘ŽTMŔ_^޵[¤<úzYż©L‹•1q®˘›ăoíĐŔ´W@eÇ I1 Ž‹qJ~nwIĆą4•&]“Ŕ×ę.ęÖ“ ĎĆjĚWu15˘`Ť»©w†vuďî>•iK­.ł~É ˛{­¦fS[óÎŔŰőTđL;ľĹił›Ô€‰'Ú"8´ kö p¦(BÄr&´Ż&ťĚů©gĂźlÚŠźÇĂTí˙z^…­<ICBń§đ<o›O‰Ąś 5Tąw•”ňŇÝÝźWiÔn� t7VjÚÉ�úě}Úä–«°sçÇ1ŕu¤ęwµćä‰!LziĐO8˝Q;ÇĎ&<ŁoR§°YŐ˝kž6Wаy=YÖ| GÔî;ĂčeĆô|d‡ŞY÷łÚ†š¦gáéaçă×Öž�‚ ‚˙ĘÎöĂă'˘n{fę2ăzXr$W>3Wkč8źü#ćüm,CřpęYµg‹jm*{  ő+E;wÖtÂÁ–*•íXY¬Šś-0]ČHŢ!ĄÁo†2§ŞëĺŁ@7Žź!…¶H ,K ¤ĘřĽ>·‹×Ä.hµëÎ[ ÷ĚŮ<#ÎOîý‚!ÎćôNŚ˘ÎJ´Ľ®Z§”p;Tšî›Ön‚Ö™ťbŮ޲Ăę0.hŮü¸AÉI+«öô_q�5•y˛…HÁM`IĄ¶›’˘ŹÄŤÓÔ˘+]W@©·FmąÔ×nţŠ6Ă´úţĽHňO»Ř€ż-#•Ă 'ďúşoŹH„¬©7ĂŞĎíŚî3¤#SÜs|Ëń¬ˇcw[q‹±ÖčąÂß´—#™Ýs?˝$ @Ł··ŕĹśü0&˘Ćę¬hŃ÷âšČz*ú¸áŢŢSâ3BÝ“ŽÝ.ľEe÷µ×ŇÁpW,*"§Y58`†ĽÍjłIbp–É*kA-š&Jů"±çö€WŐ)s´cĹ&­J)KlýĽT9˛Đ{řžq0:‡{ţ¶y{iŃô_˘§§ -đ@~Ëňë¨ýÇ[-TM®ű—ă[2&Č1_…Ĺľ„UIŮŽ•„4łMĺ>YÇÂ۶_S%ÜPˇ‰=y¤}úTŘyýqşľ`íÁvŃCĎÚ/Éo»Énwŕű±KP{ qAJV‚޶éx_TćpJUđfŽŹťÜľóÉ+Áu7žaÖ'm™íTWń3ŤÚzR€‚ßśĺ—˝Ő˛Upď˙‚O¦ę4”*u†ľ*;Ąä˝Şĺ:ĘÎ啡ŕ‡ěopd(EyWźÚ"Rş+eú#°Ăb‰ř dŻ+á#ôŕ¶IŚA3 •_7�§žúF[Śwľ2{d•~4źĎ ­Ű RiU<©şŹç~ߪhÓŇŔ a›ć™ÔČă—ä}ÄťŽ7¦µX(xQĚúż®¤QăŰř‡Őöeş,‡xÖŘ<uű¨~ýÇgVIôż˛\'vîŤoîŘ€îđZď5‹ďU7s묏Čv1[çkh' Cp[”ŃŘc—ęUĐČÎo�QĄëz>É ”re˘G#š\Jo&bÔjă��Âz±“ť����ř˙�öçâ„&Ž´VxŘY™4íż‰ÄŰ[úXxŞ{g »7›»|űëÓ„đžöşÝro`ڽX…·˛ĚK1C!QŕCtráy&W6hšrčâőwxŽN0ZĺüvLěžń„d雹“, ȵŹň8›Z—ČZ2a@ş&ÚďŃ$bR8"džëÜtŤ®KÍŚĚZľ~C™mF^<‹WmĎXďqóĐm„ŽŽ‚—ëî"5/ĎĆőĆzuŮ“ŇwG”1Új ÄÇ)&1e~{? ěJi-‰-mŕ <ęÍ }H  ňč.V8 "Ż›˘·‡÷ĂÉK1 ?ÖŹVZ˝‘YĂäu”¶{÷˙pÖ]ëŐŮćűňpOuĺŤônµR_w·Şd%’tĺâzľ-;­zÉZŞ,‘xá—‚˝™Q´+t#™}´‹#qćîŃEOˇý`8RĐ~ü‰Źüއ;W· *Řž¤…™m‚P#é=>G*¸%ćzGPÖŁ 5ĎRJOî—Ě^‹| Ľ)˙(©4m[{ő gĐð´™5-÷ Šŕť>E7Đfőm´Oš›řôhM`žů˛ˇÝuŻR}ŇYuV;‰ŹÔč˘n•íiËä[ŤŻžAL˘,ö%{…´›W}ü(ÓĘúAîz÷OúŽË*ÔŠ=?tMhU‹Ş~”ŻŇˇ@ő­ť軟5‚lBlnüě­Ňtt¶!N\\hśÖ©uČZ‰čfńÔ–ě|Ö·˘—•¶—Ť2žFÉ›Âdť}ÜHí?¦V†tăZĺ6m–6 ćy'6¦FآĆâ„ÎQĐ^·Ód>™ăG\Üň\ű¨^ç×! ¬Y‘RšüýŞ…sßĆPňţ˘ţF‡bOpĺćČ%ËÎY4đŐž7žhŚY¨(Bíó_9‘4O:zşŰ±şWdm´ O·šÚ2ř—ĚÔÄł+Tł>vß~3] Ü_S9ź{@�Ň*7ö“Óö­Ąz^¶U˙şŻ7&ĽijËlĐÔűźŰd´+˙ϡ€pSN`T0«ţŹŮWaŘV /ói^(QżP7:" ŠçńU= ö3aL5`D~äúŚ…>ąËŤĐžl5….»ĺÖ¨X?E˘˛Tç×ĹE»‰Ş¨+ž^)Řw}Şgx1Qż< Y ÁBČ7\ňˇľŐ,äoä.=Ż;ëđĽě=¸MA^�· Xťiß/– ô©tfMJť﹯Ű;ÖŚÔoÚc?›ĆßV…\—HŇF—{ř‰[’~ˇt°’šęŘ,€coX«Ë;ekdů8×;(_Z°šňaŃŐ1Dö7|w{sď+ń¦ÖG8Üěí…0ěÁ8 ‘6z9ôb2CVR«čń±ź|ÝőqUŐá‹“K[(ĂLP¸9°‰B›˝d.*BŞhŁJöĽ¬Pk0éDŇ—L7ŁQnţí}°E:Ô€tůłi­nH±fŤéTčýs­ÄÜűb™HGďă3K÷…6ŹaěY°€Ź˙SŠ ^ŕÜ˝ÔţŤă‘pZöéšź¸źŚ.Ź÷e’úô˘Č=ë¤č–Źŕ7Ú7†ţů^x99űÖŘ?őíę·„‰íţb6ÖęfꟉ÷­ęŐY‹}.nUĽ.8¶OÂ\‹µ&Ô Č6ńYŻđĹO,Ą ωúFďß÷$ÓďĽX#"ôë ˘Şť p¤ş~ۨäËšĄ2^Xěcĺ\^üFµ!ĚsqenCŰĎTčnőŽ÷CÉ61ŐŻ8˝6/•¤*ąC:WSĂîŔŚ 03’ôl»9]ZÍ5aÍÇŽ™¶Pv/™‚Ť;g!fLX YđfďÓ¬ç‘Gs×t-:ÍĽ!ljnŃ ŘhšĽQk#^éɱ*pĐ›Ó7ÉŔ…6Î{Żř:‹)·ŃĄ •äµŢŰň©ÎÖ71•đb˝üśZ´ÝÜę¬cOŻy�“Ş+loŚË‚ߤžR»Z9łFx`ş Ő1™ľÉnĄ‚¬šĆGň«eç;Ř aAäŠ?öá\ŃEC‡EŕmY.\[iŁĂćÔ;MĹ›Ć,ÁÁę¬éˇ'O`¬pŮššeŔĺŃŞúy>\Â’ě*c^µbÎ…Çť łđ»^•ŰÍŻ"¦÷Řś†ŽĐ ç€ŮukŁĺż)xÓÁşZ Űżä4ąĐ!‚ľ”tüÎśU¨đě⌓&ÔáVeJvČş‘ şkŘqčÂ[lxAivŞNK¶ó ˘]Içćł*­R;ţw/O1Aˇn řwécôA!]]z¬“öś�%ďjÇRfÍK‚Ď Ás®Lëţ=5˙CžRŔ^óčř‡+ň–‰Ű4 ;”ü–˙Ně®‚Š˘“íÎ0śÖ|)ĹĘđ!Xe;ˇ±:‘˛÷÷ 30¸@(—Ns™˝ć;.ŰDľÄŚľPúťUÝR§śjüź8 ě2J †_R¸ăEx­GNR0’ž»ľÉ6ł˛ĘÓbŢw@2€A‹]yµ?3INDď9…ÁćČImĚZy±".ňR|@c×—"}cCÉ|ó$Pkh+ŮĐŇö•ŢoC§ #“űźoŃ,Ě&—XČ……LŔŔ±qUvŠ$ŐU+Ä !z�dĽţ€ÍÉŽ)2ż|gfYXđřŇľr÷ŞŐĐAUş¸CěËRČ÷A˝!)H ŁĎy±źÚĄxUAĄ…‰GuĄXÂŘ8o4łKĽˇţÝü©W„óŁŃ¤l!ě›Ňń¶˝üZÖCÔ4ľ9ţ]>łÂ§]ŹZ·}ě%ĺŮp?îRĽ‹aú@˛ÇµN­aď.3çU9¦D fůŇĎű5Ň&.°_w­:«śoTÚ?Ł3m˙ŇÄ»ú4jȆć7Ȣ :d®g–„† |Á­× c€u–ͮ׌Çâ})ôĄŠ8G9„Ë‚ZĽŠ&hÔ©ě72]+·aĎ˙ŚÁ ń\ÖZßą3Pv¶Ô3Őç(ř Ę {@ŤLŰ×m;»Ô.2&­&^ĹÔĂËkÉ«ţúŻ˝–¶ Wú4›eŠwŢ÷©Ş˘ůĚ“.P>đĽEşáĚ]Łß[í\ĐóŹ~ň–YŔnî Ąo­jăAë»V /“zŚWđ̱Â7ňÔvf†(:e§DŞ•ÂĐ ZŻőş&ěLnZ9:Ú¦ťŔç!:óY›:+)=ůÓžŢFá˛sŹĐe/Z2ď`˘é0wKˇ>ň%Ër]ßť¨©¤'šq„đ_¦7ÖsÁĺ%đé±iLĘjŁXAňWľŽ<˛ŃK±MÔ˙Ż<TŃčB •šŕĘĘzéëĺ4ĄU×íhźŠ řvmÖ „řŃ{XötálÇ‹E‡*žŞ>ůžE4ď) Ľ´x Crm;±¬¬nÓ^Oj¸7[Ęqx§>Ëçŕrą%„ľ’]uŻéďfŃNO1‰09r®oej'Ćä%%“ú@ S*ĄýĆÇ_č ů,¸·ÓťÝÍáëRěPâŤq[´pĆnuc¨Ýť!ł“¨ęÄ0Ć*M^†Ř䵫j{zB2ŻšTI»Zá¸sń‡–[w/Ĺ>±?"Č)ô™ŚÂ>ÂIĽ6a\Cďj|knůŢä˛0/Ó˙?Ů]Ăar‚zé<¬ś2°Ô“f¨ÖßäÚŞN|/×y1›öÝĄ8ߌ[˝.j:3®ôu¬ž`{ž«őü"̲óRĂÖđ,ćhµbFÍ,4y-zż&i®"Đ·âć˝1*ÄęWI×*×ař`ÍĆó+í\v}],Â-čHŐľŔ§ÍoAŤqŁŽéă{ŰÚxpa“ťŚî.Žŕ˙—çîÜfč] yÄ%kg‘ ÷ĂZŃž…2'¤4¨vĹ�.Ňaü÷űzQ)ŚŚAgÔ–÷í!@€PDZŁQŰóH;áňł ~JTo(bÍ(áĹÄ/®Uwž[2—†.8ˇĆđ/ç)îŐ) PďŐ28Ą“Ň[�ř”ËN×kŞŐďlâÔ�e:řů» *ě¤37É2>Ăľa‹-—« Ą#1:üĽ×˝`u‰eŃbëQúPňAcüë-hq°ęhZJ‡ńvŞtă;±Ě)Łš®•‹ęÇĄ¤B¸–=˘pü4¬Ür)„¤…¶§ˇ†ˇ|E 1“h[˝ěYmĆág@Üjzu^‚•#_hJÂSyćźG€j[üŁă<öwęçř;QékLFw8ĚJŁN?¶E śzď‚GV‘ZŁZŕÚ…Ž…żCIÁ÷ČYC‰$ŹÂ‹1ó^Ćy_×#öű7-UÓ´d.g”:˙»b[ćŠ<Amň$fš˘ř͸;.Q÷Y% ŹY6 Ú_MĺŁ-Ö]>ÎrI®Ë0ľm�TîëČŻ™ĄO׼ž3�Ş\¦ÜJ§üÜ8}iŤ@…†ho n˙¶ĹtÎŔ\!P˙Ł€Ţ˙{…KʧÄúEľH]T~…3]!ÁŐ.Š VtyÝîĚoáŮÔńíbçUÄ«”l:8kTK1˙ô˛"ŘBm'ĆÎ5q«±ÄáÂIě“·€/ůŘRIg Ď‹źÜÁݰ®RĘř“–űLŇ Í?ę® ŐĐh�0–˝>Mü^ĺt;Rn|Ţ(Ęmöť„%Ë]Ą^ÉöŰ„ŠnöěÂ%!¸’MA—0‚Â$ľ ç!BRécÚGµóÄ“řKěQµ:$ˇoSfč|­˙nW:٦:ť ”CňĐR¬~ÚBš:¨›\|äĆX(NŤ[’a 2 «şč.ĽmpáQÔđÚ’…”Oß$óŘmŰ�¨|I@„^‘nRŃúŽĹv,‘{ácp¬ł‹F7šs33Ôůóą^§)ăĽÖ¨ŕŔé@dĹ‚s5/.iÂCË(DHżŰ®2¸ âŠ3ﺉד %eąĚ+Šý|@źI^ËR™x8É!aĎKgibú0BŰ”[)˛Ú|á¨^Ž[€Ç‹p óuô.&Ĺ)]šČ덼ëóĆŞ8ţué•[˘Ńôîæĺ2ŹéPŕšłŐ—’+žŤŇîOě¤ô­Ą^Ĺ›ń$%RŻĄőĺ ńźš8şĆ˛iN)uťÉ­°Brü@>bßf§ţ뢻KMvĚ9°+¬’_!ä ¨ďI"J"ĄGIĚá“?,UׇşĹ*źÉQ_uäČ­ ccÝÖćîäYö™™J]5ş‡ $ „DË|CĹIŘk5qN«H#ÄęYż´j›Ő˙YŽľŠ©şäVÁŸĽđ’á¸ÁoëËĹňspÍő·Ů¶é…·śÝv—É72!îń†š¸Öąďăé .–g ŮĆăđ”ň7Ɔ[U ]4ľé�#Sú’0ŤJ•Ď ˘zşţ•«ô.·l2 >q>ȉ`e€®Á]ě™Á™źo Łd[ěuyăXÂdóŐŔ9âóţDfMi´šÇ^@6Żă/żŹtV•Ż`âI·Ü]o=l¦-ŹÎ�lď�ŻN}ëF¬PďSu?ÁóößÇ€ ŕÝKj_´/fö_±©Î5|'ň–Ra cÄ=© -†ł!÷Ě›xó߽ۻ%Wjńĺ‰q}|<-żÔX3]•ë›-‘t¨6…6¶˘žŮÚ§=._ô–éneďHx†^|ď+ĐŰ,OµcúS¤r•ÇH•OŤ•�…f-ď˙|ěŕČ=·ôÇc˙Ýš ĺ^^ 7?2Ú ô[˙Řű‘g7 C=™FÍ$3VŕlĆHs—ôůK:vűą¦śP>VŤŚ¶€ĐĹFJ/ô°Źń|űÁ?ŢśźÚFAXŰ�Ď])Ťéľ•H?řˇU‡râ¤yłŤ…ĎĺČ[ćÖérOÉuĂAę!żzsPů8\j\Ť›$>~ßg÷*{+ ¬J`]Ź ¬^ ´�W”–9»‹Fś°>%®ádě&öţ€»ěî ¨µDŢ U-‰bÂ./yđtő2śľŻ†QëtÉ{ňćΑ+oúŻđbźžM\-;šś–ĎĺM—µëśş”rŠt`CÍAvꢣZ‹µÍĚ´RŁ®ĚYŕűÖ|ŮTTô7»’O‡ĚŻ˘¨-(~ažŚäĄÍueIę1+óŤĂ%r›Y%—źç0ě ˛"K´ônÔסaźBO•CHoĐĆTs«-6ň‰ŕő±cÇ4 9á>ЎU6Đ:ň•±ˇŽ§+ą «€ćkÇo†xxFą-™·•¨ě-hŢŕd“¬sulě†f ­]„{—ŻÜ‡úq†-[BK Űł0ă íł•ę9¸5'’Ŕ݉@f“ú}Ą}(7µ«ÜQ6ŁŤNŁçăX> –¤sLKj&űJ„ž(JËGń1=äÖIdvmR™ÚŃ­ü—ʡoFMsýâÚWÍäÝ —ÖâwÍgEł´—¨Śţ—ˇŹ–Ŕ]Ćň"f<ÇYŢ˙: 2ŤćGÍ>U¶a9'j_u`eǵh}ÔôpŞŘ+8%±EçoEn’KPLť!ĂYÉ) 7ŻčÇ”ÉĆŮZlěvfî­7´0ß\ČňXÔ(ür÷'Ń «gčĎϧÎxúżźł—1íTó~‹©ű&ľúö­1µŁŮdŻřaR„Ű” €ˇđ”Î*Q'‰Ux”łH¡ŕ68•ו×>ArE|÷ĎQśW"ł4V"ć︗ĺ§F;wI—Ď™ÎňÜ'ŽŽŻŮŠA˘ëÖ˛µŰDŤÓy?çEřz‘XŹŚś,©ŕ­2…‡Ţ‚,˘P\ăëGH5 9qČą®Ď{3AĹw*—4Šx$€GŐ‚ÖŚ GŃŐ¶Yd +Ť-t2dj¨ž&Ś™YdżeÄbÍc`Ő^ŠQ§Ň–hşˇ ­;°µG¶Ű‘úÝsé^DX€ňĎ™§ÍŹĎ­n® eˉí¦ăk-ZŢE2ÂŞ ĘüŔ©ş wOŮ•0óěE Ô  óĄŁPôB“Ó›ęsʵnŞIl°<_ .zP,˛ů®Í÷Ę˙]SËÇ–Qëĺ7 0Ýßöô"HCCÜ,Íöçj|j’…'Ę'^’7_"~ô=‡ä&ߪ.yTŹ˘&† >Ů?CS¶ńlŃžCŁĹAîŹYKhL8‹ż�#8ô Ň%o‹~ąäý†fÓatŽębó!ű[vvŠĂóÇ‹‹µłrńd qÖˇ>ÎS€í܆}n ‹ CŤX¬•˙qwń7M[ˇŔ6(q_Ú*ĹmŞj ě?ÎŹS«nś`ÇčŽă(đD>>e˘…†{šWu˛YŢS’Ś”1Ł. kžO•B ‘ö¶ą°nâ˙ĆÎW:ôE«čÔ­›ŕç†"rgu@ˇŘ›HY ŐŻňy§v°gy»/@°P˘¸Ą[YÉ@Óľď?łÖůĺU¨~1F0;7‚žŃńTŘ=·—¤Yxň»§.ë1}Ż2řŚ@krţ2ˇAwÉmŚmňłÔdęîNAU¦v‡5Ó`…QűjŮúëqöŹpöésŃ?čáV4˙ĹÇ"b—3®·O_Ň=…×úóäaw¬˘.\,‹űŠ­Ďć¨%€Úüź®Y8 u4¦ŃíŇr¶2;ŻŁÝÚyĽÄ#¤dłČÖĎ‹‚×{ZˇŰ„` ě V\)Ş˘…Śy)Ŕ KúG é ”—m—¦$Ö;Tďp€ Gť¤Ű{™č{Re™Gľ…ŞŠôC:ËT4˝Ę7ŰÁöwd‡ ]wţQwôg´É/ýéůKĐuÎ<| g}ů%ÁUőđ5BČNdĂ�¬6"]¦¬BCR¬Îó3§­„~n…đ^I…!Qô6]cjb~ ] Tâ j-ÂüY Ô0Ć :~çěŢpJĆ“¬“”Ŕ8úĘëđČuťůĽŃ_KMY¤Ęˇ‘“Ś)â±ĺ: Ѣނy’łPBô8[gÝůŻIáKtî=ŐPrVrMýŁÚ‹[㯕 ‹Č˙”ě«eúýU6é [|đ˙ČÚ 5Ň·]¨ÎľĚĽŽ4Ý’,S§Ŕިŕ®É¤1„AĹ»˙jmőA…ÖňôG6GÇŘtI(µĽP#I8E]*ř^=!ĎN-±3tÎ~çőÇ ˛V¸^€7Zđkn}rĘhU‘ÇŹÖ;LfM5żšÇαĚö!6¸¶ňwŕW–Ń݆˙Ć’Ć+ŽşŘÇ#jnÄŃ"?DßůţůÚżĄ DÇ�§2˘űs&‚„YŽcîśĹ=őíQÝ÷( Ëu¸4>nyk©đgS•D{‘ŔăBšŻ¸Ź\SNçjÜÍ?ůTľ “Bض:SRüzŢhŠż8�fé…S,«Żýb÷N@çZ`ŤŻ]eź›˘4µţÖ¦‰¤°S߯ł!ĺšă3§w®ˇ¤37Sž‚íöw”ĺ~6ˇ°ĐixˇÚZ‡Đ1žÇç•FjţŽ˙ż@ bź\’Üćg•Łă,ń^cwŚŽi$âČ6˙ s×gŚ6ńs\žôŽÁ͉jj"íĹďZvE• DZ±ß_+1ţ]«˙_Ţ@ËË~lzsŮsEcKíłńĘ×dJí«÷v?K¶rTÂNë·ŞâĎSĚ‚ďŐŤMlÝŠ‚ÝB`�Ą˛ Ňúř-…ň ¤HR0jµ÷´$ŤKo¬·¶ë'•E [NÓ�ĂŤĚçÓŁC'łůńZ}BV¶“zç˘É6”‘{«LNÜ1 e’ě ł4)q§K«bDëM’ú_L f›zqÚ!Q?qÍČ˙ń`Ăc4çN]ef=DëşgâwăKCźč´1*Ť¬»Š°©ç‡'gř2¸=GťB ŞJ$đěI^ÝŻ†ď›"ľf1šŔĚť}çő÷ Ćă„–•ÉŤNŢŻ›‚p ¬,>ĐěĄf×öЄ�uDNóaôŠ<jŤ�ÎS˛Ĺ6Ô0†ČGą§J.˙ÇFzň*Fâ%ÎOß9͉łvąĂQ›]Đ)÷ąËÝp îďV4Řőy“@ABń>2ĘňžLh# đHвőI”*jŐÇ1´ŮdC*2ĹłPŃn ńT/9Ř3»iłď~ćŕĨ˘ý|&;‹8,ëóÔ Ź_¦Ú%Ěp\¶ţź†w‘BöŐ—`äMĆ‹«ŕç Q"†nUţ”ďĘĄ{0ąÂY� ÁŰÔČp k©Zž™äxjżF ,T¤|çĽ ü9Ľ˘édz÷ń©oXŤŚc[ 76Ĺ÷ŕ+cŇłšĂ˛scaĽd6‘˛— `;ď‡{)�Qz2ú É Ť©/®®f„©”ĆĄŔ(Z?M“ý Ťwiâ‹˙CŃ×űŁłp¬ÚŇ|Uőť_q ‰O†úş4ç®Ú Ú™Á(ę˝_śąÖÚŤ˛`l¤µ7 ôöÔo26-Ú§Ďwç˝ý·m ňr†±‰×NÂ:ńúR%Ňzř3X˘N^űfHG:ňK˙lCţMIśařî¤ńAőń/´¨GĎÄY`<#Ő‘˛ .éţ‰nׇ3{d!ơĎÖTęúśú‰wĂP/†eŚ[k5$ľ°Ł]eŤŘqj­ŢśEą F!üľ5Ńߡ8mIź-®§¸ÂşD\}ë v”‘lK×yĘŘ1€ď«ö‹­çć Ń•µ±¨4 Aâ‹aăâłghALmlŕ˛)Ú‹¤¸Ő­öUôF—vŠđJWWüÍÚ/Śy¬ŢL~ ?Ę|Ó\őáJ¸ô‚ošęş^B Ěý*$=ňtÇÚü'I>ş*Ĺeç7ô úA‹Şźz˛ˇ\ÍÂLí[`XP@=CĽĺŇř|fk‘˝9ś9„­3WłYć__¸GQůUáE~)÷řÎś‰Ü;üČ«WoąTL¸Sîb˘ě{hÓşĽ!*}— \ÖŘTH™(¸!sş$$Ł4J~Ż?ž wéŞ-)ŘD˙C0~Ą”đ‹·}ž'íˇ <í’Ë­*ÔU]ěM �§ĚhžşŃ¬”6*ŕ3ň.N_4r_î˛ô|}ű…úhŇë‰ýŃÓ‰ś%GhgÜBäľÚűm5¤1 zˇő‚´ÜôâŇŽÄ*€l7dŐ—|Đë\ů|š˘ťâ+‰~ĆtĄw«?Ń éňtç.H 0˘Ü^őÇDĚI­8FGß@ĽľŽ˙ĆŢŁűzQ¦ZÇ˙* µ˙ )ÄÓű>ŠOQ÷üľńţs˘âĘŰyČéOX×ŮdöĄo˝©Âó˘9Ątp÷L‘ę ŤT«rľú‰ ¨‹ß/sÍ»ĎOĽmk4ťO5"ýQ®2#Z¦€y&ĺ‡ĎŻîé€äüx˘üÍš}‹Íśżô.Ű8"g…ł—ŮCyJE릷Łᬠű żĆ˛UŤzájŕ‡ĆrKâťbq�qh2ÓÓĐëăSűĄą%cő•M~.ÔÄR•E“/ ›žçâĹÜ:µt&v‡|˙ě ęnf~ŢIöÖ<Ko–SĎęu‚¦®%Y—’ć’‘ĹĽ3L™sđ�Ś*¶×†oŇń˛ Jů]„ż×|Qj.hfîn*š÷:v¦_ăA] űgNźvŇR0ĺÁ-%ŃŹ8)z¨Źg”‹ ľÉ”`¸íÂiĐv6űyÖ–äţÔKĚ䯣ěĘĄBĆŻ”Doš!O˙ôTÖÚ‹|V›ţY-Űň°íú3«ř$ ”áVĺ)şuW«-{p˙|Úî¸Ű°5ćn´7ÉÓHűRÇi?OÇ­ŽîQŔ *€yGtfVtkŐYCŤ(+t0_Ś€eX´ř&řn�-¦Éh—�ŐYÇUŤˇě“a;Ě›­‘e Ś+ČA›ô_:ĽcĐMy)ý> z±f÷á„7„G˝ëâ+cŕ3‚÷E$znP÷‹őâëAć3ânŃWSăVH­Ibpń>ęč˙âF<ťl™\ü�ńíÇr*”~Ýi“ßť6¨l¨ŹpÄzE¶ó¨1Mer< oI3a<ţRĄ¤\÷ßóo9ůčeÇŰň\d,]ş‡y``Č‘d$¬óF) źĽČŇÔÜŻ¦żV«Ď.‹(/z›Cś• ŇrĽĹ­/™<“¦ŹŤ–Ö¶ś€„00`ŇÝć)đ#źj_¶^&[Ś»ÓVřÄťHGGéć$‰Ľęi}Íś‚űŹq»HH*Oă=7ň×Ő×wmě‚â¦Ď>=ŘDŞÇÂ:˝ ©$—Ľ—=Ůě,"@hi—_ÜňaCřIş•dQšr”ARvŽ=tßź,.rë˙Čş8„—Ń›Z bŐË °÷ÇŇŁ KľćSv iĄ§/ćż…çŔćŰĺ•^‹j^A[šMuîB*Şýör-çÓ¨v[±»ÇĄ{±˛ ojŽĄ‹P×yĆ‚oĄ]žpgĆ·Řţ¤’˝Őýâừđd7Xôś‡0(ň Ś“~Şö|ZHv™®eă˝M2µ×–­(‚v)*µ.âð€S‚pĐ ľţ?Rż ßűâ΢~Ţ=’=Űż�Uřf?xs 4$CŢ,€™y"&J˙@L?şE&öDN®“ÚEiě×,#˛–HŘ[ á@4ľöň9b'Ľ@ô,Ô¤ż®š`owXj¦4 :*}­p*;I&¶ɉŁ‹«ęű“Ě‚¬§&8â®ăč2\ĹŔsçaĺ»xe")B ‚<ÖC%ˇSbACÔ ćÜ)Že‘{Ý6p9ľ7 ŇhřŇźětfyŮ YŮkĎxU©ź|’V¨ď?®ČŢpŁö4ßÖ¸űÄ×�‘“ń ś ’H ŐÖß÷–Ý« <zţX5>4c—÷ĂăvĆô9Ë’ASśU!tÂčYő±ŃF›XEšŠRo‹K4w#5–p ç˝©Ş–Ś€ÂÍ–vÜű-3Ę3”w+Mo`ô9ĄDŽSp`ôµS•"ahv~®!—‰mK·ëűĎg„;„Ťë-,ťb˝ŹF÷ÍEĆł*0ą}íśż:Ti>ű!«Ě.#źŃő(ť,BnęL•Ž˘~ĚŘ!a’đőícKĎž®šÂvBü9x†Udž)Ču¶żG€ţČŇčrÚýp׳í>-É3Ô•ÂU ˛­tˇ˝u±zËe+>^©ŤŁńU•˙3o3Ěɶϧ»kUXd"iov„ŞţÇ3NźvIT!x®§xq‘aźç¤mp‰Vęń:a1•Ň’ů/!Ű<Žň(ŐŻ›¦ŁßJ8¸›đLĐzî×J Yř˝ź¨mm?°ö™0óaŻSŃHe’­‰ŞĐ#lí”IýßÉŢIĘ YBŐŐńÂLË5ĺUnoŞËMccš”„0$ü"¬ę (83 .8 Fqřt¤–+ä`ŠÝs›í›Ďr(˙= űžL «{ѤŹ“mDČăhö®· nfĎADˇÂ„gqž–‘łˇ-Ťę~ÄůĄĎ3†EÝ:ĽY ;-âŢ•|çjL{Ow7…ËH0'¸”Qˇ—=đçm?ž©.ŁŐę…3śŃcť±oF>¶¨Ç˙÷ۨß(ú~ýřVbÔ ¬Ő/öťŮٶVč^Ć\.�©ębřG öĽÖMz‰ó±K{´qŚ.Jź˝[¨‡:@,Ő„1ü™_cWCNěXmŮb‹°=5)ĺyńĐ=|řH~/ľčFgÄOYš<^NęĹŕşakKq.0�ź6°�ŹôBk.ăʮ•î Y„$ŤĽ6iľJűn<>1|aEş4T+’vC»ĆˇDô!4™žÇĆ�–t>Áź\UŘ0Á¸INo¬ôK8×óĎD·Y Żî=;r>Ő<F[âÍô~™Á‰rNš©Ë+Y$i‹„ű°÷­cl’1?š’›4 đË•ęm1ayş|EĐéę¨.N\˙aŻšż‰ť!Ł|bĎŽ5Śąňmr·śy(ćźlqJă±ry˝ÉůÇžE$<¸bľfąApO‡>śCHRŢşë%H´śżµNWÜő2pöć˝+Hp\>Ł×ľH‰/Źę`ĆI&ăFˇt9 źJ°Q€E}WńÝۇĹöĎÄN‡µ˝±(Ρ#IŔ*/Z•;ÂűČŰßtű‚§ś¤¸(EĎ�OĂ[§ČF(–­řř‡ü€Éů6ixˤşYp’5°°]´6{Z76ÜĂ—"3µÂĐşĹ,Ů,ŢÄËŮ4Ü×$ó4µ9?DęSKŔáÚý–Âëĺ=ŚÝą€«*aé>@'•ˉóFSôg¦P@®ŃB~}ÚÓĚÄU3Ń[`\]•±ĎÔ{«= \Y™Ë"oHťźőĽîyë˛H7č5ŘúXŤľšÓ‰†/ĺ>:°MĂęGvXíž7Q\kg4ç!Ż€3 ° [ţ©™ŕč'‰+Đ^SWŏ٢ďs Jŕľi˙¨ľ2lë( {ľ-ŘńKŮN{^<µrćVŢÝP?' Vżˇ€ViřJÄ37˝é ŻÚcšŞdöfIě悚VŮlŮq÷ň䑿9Ś2±ZT—Ť`[PŇ‘ŇËěYv7‚m[ ýM”‹ őT§č™ÂÍŐ×@ĽăXk®©MÇGÔôo3öű.TD†?ŰÄ«w•áĺ˘~˘pDGÜIW-źĚ*îVf”mw\ŮőFr˛czŤ3ˇŔžpßnLωçö+î«b‘­ŔďöŻĺ€PÄ费ɎŔ9Çd9¸A`+P®¨‘8¶IQÂC_ě7#ř†©qÂéD`@íFC5lµ�§6ﯸݒ§oŇ9ČzP}ku oŇ:ýŠ×ĆR“đÇoLŚĆúšŁ­ŐýYře5`ŇŠ­‘ćHm~ç!—ń‰Ěëę+Ř_WËFëSŠk˘rťĄ$t[Cý<m óQf8®gEڬŔ‘§v,cĚJ ÜÂ]‡;Y"÷żĐWŤ|q¬Ń3ľfÚxěa*á® ”j #ľ¶góŞŔ˛yZđkÍFńšÓ"f·iH— �ç€U§¦¨M‚Gţ*$ľ_ýî€_š1 Š_*·­*ř"(ŚŇŘů—ŢKŃjzٍ#– çläq[ĄjÍŰň±4š87ÔµrÜÔ~Iż@mˇş|x“˝{b„'ŐŐű}$¦ö:ěK×zŃŁśb±Ub7/˙Űĺ˝Dă2,fR·Z·rQ+—†da/űFJĂÓŐ‘y´ď)9źŕ?łŁ8ĄiT}J;)~žĄ3¶liVóý‰ű 4J ŠŁĘăŐÍb‹ 7ݢݱ´óÁ ]ě؇ëgÄ#XĘ’#Á8A¸k#ÁÍVůR2»8ąŕźÁYţO„°lŮTOcńĹÓ„y$€K°%Ďy´ŕ~ŕE7Ô®o;łKĘŇş6đ §°Ş›W±ł‘Ňaf~‚Š®žSsl˛˝ţ'ĐgdP-LqŐt<Ô…Řp‹+ńHÚČcňÍ'ŕl^ß,TA;żôŽi°™:Ä'˛Čaçšâ@»ŘÄŕ.đUx"ÍßJ±*UÎPÖß2÷ čgŘ•ŃÓC1oLŕ±^Ś%µ"¤xBĎođ uVѨÁYDž(˛mc´…ĂÎ ˇ*L>ÔĐ6[¸¶î/pő=5 HÔĽ@%ç<ďf´NéÂ]4sKŰ|D>Zd/ĂŹîˇ9b?_-!É˙<öÖh“=ĎmöˇgřÂt~ˇÎrL¨B•NŁ>oLŞňţ˙´†ń>µţʢ?l ÔqÚ˝•I™\}Wjö‡‰¬¦’śăâç3k„íčúYu˙Mofu0Ů{őqdIÄ®í ;×ĘeőÄYęđÔóä¤óă\�r]ĆyCvÁńYĺś* čĎšű,ěGţ’ôµű˘�ĺ´…Á7˘wá{Ńć8ďPŮĂţöílÚLôŇ…E*đ řg§×T’©áuFٱÉę«33(cËŐ]Ëgä|ĺ°M5ô9lŤú•S?s2‡ŻŤ’€IŤHtëŻŔÁ®& śšÝa7kł6'¤ąęŇz|ÖČBÔňTV˙wńÚ{KľĎĎg@WÚˇĺĘ.âY•ŠŞQÝ˝ŠJú÷TwŚlÉŐ¦.„uťŕńXk٬uŔ©¨5-62˙Ń@ ŞtCI…ćF¤_¦ şíB„!/›0is_ě!ôÍ~‹z™Ď´őUI2DQ›A+”pS¬ą&üżkŢ­ťľqݍ“ü •–€ dFHďÔâ ňĽ$©Ť/÷?ń©Ďü-”px¬íĂl­™Íá\UtžáÓ y§¤>juµĄ˘ň`ř°QÁóaI©šó˝QňŮß=w>‡1 ×�g¦9ěŻc%‡\µ Sfŕ=…řöËg2ecx=ňş6ąLjËlź]fŔ0g'=Ąş8Ȇ2]Ő�%đfck•‡b1‘u5-wmÁć9�QČ,&›ź‚?‹Tz‰ëw¬Ź?5Ú\çŃ%Ś[óÜ<€Ś˘›Ł‹¸B¸a[˝MŁĎ�ćâbŽ+ą�Ú±ÚÖ>·˙ęM1SďlšÖú•mb¸‚ď=ÉŇř8„ęKĽP˛˙LŔŮ*ŇĚ0HźGŔSňŽ�ŐjÔOăáV¨r[§y) s|tsĘ%P&űŰŢ0ODď—··ý–.ţąd[űjč[Aቚ<ú¬*I»�7áGŇ-XÚ:’ĺ-âr@Íúh©ş¦gÇŹálw8?ͰSĽ7Ç×QDpŹŹP~™"}ŢÝ;đIđmúŢĄůÔr›5jĺ5¶–ŤVş.JcF6¦GA–Ť{Jt·”Ľźů‘ŻW‘Ě›�5ęő—�X|ć řL|7Ó…ŇŰá±ÜÓ˝qAs„ŕÎnDşSĽŘ Ű'ŁŰEGÇß[™OÖH <%ÂHĚł«Ď9?W<°r÷Ňd6\ˇPL6ŢGĐ źÖ NwJĐ+lQ™ú6xŢÂç.ŞëÚĘŮ”˘‰\É='<xÂÄ}ž˛ăBč<·aÇV{†n2+ (ßĹéµ®‡Íť?Đ% ¬Ăô9Šôxő±·˘|Ć+´Ř”e·ęAvĘ,›2üž3©e[üUđ~ő@˘LYňŮ*/!e˙ő «6‰Vp1©Ś!˝iä B‰ą›"Tđ›‹/ftŁ’Vp@Âoš[˛±Ř[¦MHľ„.Ü˙ ŕŇ”xŐ+éöÍńΩ•wZŕ¦ĹLQű Ţ[%|r“˛wÓä57?5Ň*Tů9“Ť†tšO ™-ă–Giř Y‘ÔĚPćŚ&N‹bĐaĄ\Žďi%U-“ÓuVń—Ś=ńÇB7˙.XpTMĹĹzŠ3zg�(źwÜr‰Jc”Mˇ.FpUľcŇfÚ öŢ‹˘ľ/l’W ŐŠěÜ/J!íŮ—ř;03>‚äˇĹgťĎݡÉ0-NÜđ¬Y'x$ˇf, řBÓ¦W=4f†(¦y„ţ 5ĽĂ c5ŚűŹ<7MÝÎÁ;Ąç|'%ů]aŹpİp|č+I3z$q0e ©Ü^„S±ó4˘ŁG ŹE:ÔP±bÚ‡–GÓůý«L÷ĎŰäůĺŔ*v×Ű‹ˇ5Ó é Šě(›Ľ†Ţ™4áyj6U«_ÇdŰŰ6ŁÄʦńŔʏo°+ĘÜŁă>6?q ˛˘ě´ÂsjŽ|Úá$" ÚüďŠZŤČ–”ČG÷rđľé®+Q'łŹ»ÄËňăðx›/¤3s&BW%hňÂk·˝Č%˘É.'§Ř_Č,ťŃ Ťř懞�bĂx™ÉJL<´v|p^}Yô{<ÂZP3^¶Ôś¬Üźś÷6pôĹWtá÷LBĎ_YĽôIÉ)0xÄ”F“«ż!$ĕΰAôťÂW.Ʊ!ř;Ü˝3lňŐŰł_°Ąď\ŔŇ­ .“ůÚ’Gµ0„»Üˇ)˝Ůő0ĹŽÁ¸ćú>|¨Ś†\{1¨×Š—ÄáoB˘?ďMKŻ1—ĺ›lś`.dŃ#h9ÝĆĽĂäBgx€Ů”3½ Ď„Şíý<ń­Ű/<«z·{)nÎäı&r yFţµHńń»ş¬:Ç;f ăGeĺąŰ¦qŰáŮŇí}ÍÇ? ˙­ĆQÄý¬ v•ďđ—MÖ ×äOH-Á#ئíu¦3C"6ic[ąE¬|tCzçŃŃć hy¶;E\b?(Ó8AtˇYjZ >ŕ >E/«|Šß€™CŠälţÚańlšč¶–&Ż“>?âqő©˛“ĐůwłGĆą%~?ç�ÉĐúTžKçhJz|$×-·ó†�0\­4Wň©ŤŇŃ~ض€�Öś ŃŚÚÄ‘?PD PÄ©ŕ/K ŤÓ%žćsţÖ|9ěvó­ë!­äwŢ|k  .é9ţůBŤ_Â:T·YĚۢ™ÍbŢ^d˙ŠA‡‹¶Č’Î đ/ź¦ĄďĚ µ¶)féŤYă—ŮŕÝA´\Q Łg›'čOnĺkŻAUVöşNNőŠ^†Ť”?O¦ŐŤqŃ%vŃdĹ÷˝ď6O‰ đ…QĘ®eŠ|€żLHgSD‰T Ô7»îó+âÉ …LúMݰ!Ç̬3ЇW*ł¸ĆŽ+äu Ťíężóˇ e˘ÇŔš©I“ÁµąĹěŁlć:‚ÄÇdf(EzŚ<Ę}‹'Ć;d˘?}F%ä5N%:ÓňŠawň Ť¶hF6!Ý9÷ňŐqTQÄ„«Ç“§Ô_ő•‡Eő,´ä¤CkŇęc\9öN¶sX¸Mpum”TV,*Ny™˙ŚAD\˘ŮT $#ý¶…ĎąDM[Oôî\ť˙ Ž”ż˙ď-ľÎ†Sţj»Áö!4ŞIŮů'VĽĐÎʤă…Z¨Ł—&é* lĹwôśôę»rÖzެÓŮEJnČ„Y& &‰th˛Ű'Tö‡˛¬hŹn�,Á¤şŢ ĂŠX˝Nó6¶E6Z7Ő°číA—WYĘěúő:q©·–±c±¨Vúb5ŘL¤&ť‹ň··e&ł73)ZděYüëü­g•7c`‹)ŮuB Ú’ ̸* TCԛ҆xĐŚäDh˙ÝB®ë´:Äv=R{R®ŻÜŢ]ý"ĄŮî4>űŻSťó?´-P…IăűćŘľ1µśé†×KRŤ×_6ËřŽŔ8AŇřŻąŤ ŐöŚGÖ‡–Ž{ Âßç8Ç|'¸?Q€ORvuląßű¤ČÁß>Áš˘—­˝ÂmZK—S¸}ŰÎĄHCôKML‹~ĽĚ�~JÖWKś Đ/pÂ.¨;ţťSµě%· ż_ť‰‚,ű“•“đG ű‹YĚ—š‹ßiě8eŮŽşc�~zÝĄňŃŕK@Î*ŘGŇ!§eZÂ)ç†Óř‘Ăť§VFV†ď÷ŠíCˇ„Î'’ =zą•KH»ŞW †•xöVý$›đ‚Cr«%W4T›]Y´óĆŞhµĂŃŞ 0—‹őę|8&ĎÔ»a¸Ś+Ń‚ýMĘły N tňöĄđ.C•Iď2‰ş–ŮÜJűÁěuő–rU˙»MrkÚe™ł3˙‹t¶STj‚E’!i+ăťű‘Ö&ľż]ďČWϨ¤TňąKR:…Q /P » …Ş).ş— ö8ýî* Ęd”"«' »®©EČ”-Ŕ¨ňˇ_˝\SëşDw‹”Ő©Ę5ŰW c Gny¬ü›ńhŕë8O·Ó7ďŤV řŮŚĹ}őL�3îG#"ŤrÔľ“mĽ–Ś:ó‹äŐq}Mŕ©2i˘ÉĘSĄ§sđ{üŘ1ŢP|gŕűÖÄMLĄS»§2óŰ˝J0Úŕ,޸ź“™óôO�S4˝žMjؤ€Ó•ďKqŇńĆ\/™1Ő+AKťřăV©MZb˘,G*şç¶§7` ü”ŁU°)daŐ lJ2ôůć;ö〟}Řz¨˛:…<Ě‹Ł'Zu© ĹŘł«bí˛ő*ďĐP7·ÓN˝ži˛Ěź3qĂçĘÖíţýLOŁŰúŇýëy…l˘Ś¨â۵s·ü®ŚĂÓo›“Ľ[ ŹöŁ){äzV;ÜÚČÄ9%±` IJrČgű“ąŽvššý1N9Jő˝ČŃ4Ă‘ć×jޡŤš‡±}ÔV˛®‹ä¶-‚-ë_‰Cô›üŻąűŔůT ›/+óőŕxlÍ[¶L=µö4źľÇWt•âŹ6’¨Ç.ĚUmĎŕ–ál¦R˙}Vq\|ç˝ë.¬ĺĐ„pŚ&Ůąb]Â>hŇ”ő>ĎŚÚł5Őzn×Ě"™LK˘o‘˙ˇ’Lë= (‘'¨|<GĹ«ňŽđ ’ń–·OËá§¶Űň1xrÁ˘ ţÜ|čA2{`áR×…€EL˝€ŚÖ6 �ôÍ>%¶śź/«H°—ź”±piq9fcă�ť‚ †ŐK‰/¬ě§ÇÜAuC%ş–_'…˝om3&6Á˙˙˰jŚ×ç‘•U˙É'‹�9 fůĆ[¬Ë ô ă‹ňqy4ţŢw©R'\Ľ¨ěŕÁŰyI_A]żí!čĚ YűxEZÁć É —Ňl%?[¸lÓ0„˝îDÇ–¸ ŕËAµ4¸B†!٬Îě—šOg-¸ <€.Łą‚8¶Äţ‹đ'˝QS…I±Łéú#Ç>ÓžÇnŘĂî;ŞŚŐ‡{N%[ű+čő×fâĎů3ĹEş– O ĹĐ4ŤĂčÇNAł`îóíTWz~•;1Q>îPűŻ}»fĺsIvßłA›Ł5‹p Ţg żő%ű4@ÖąS®!Ó+Ş‹ŤŤť†+ŢŕQ\Ć„Öű/n<Ŕ(ó}‡×NůdŮR瓇†hĐîŕÄë ™ŰLĚ.},÷śhĄ¦y8d^˘ę?ˇ�fko ±yśÄűŤ^A?âąyűJű*F+Řʸc·RDZWł‘ĎkÍ Â„ú]Ż ćälŞ3ÚĚť¶Ë~Q$A#@TÖ˝K°±˛ă Ő/0/3«C§Űl p6}Â×l±d"SŰ>ě‰ß•^Ě&ó#sąôŐ\H žÎ^ZČ tX¤ĺ3vtmv AÜ@Żs‘MÄşDş=6”K‚=_ ˙°äjĆč{ě'4‚°[ŁČY<aN.śFó'–ë§H­O–Ă[˝ţ¬żuÜ.‡S©N")"xÇň2G»p•_\ČĽŕĚrËÚµ´Ő�Ľ‰ĺ3XĽs ą}ýŤŔĹťY‹jZ”‹6Ṏęű~DÄgŕý-�găŢ EŐ|8á?§´>Şőţ4HŤš1Ś^J,BW#�Ö†”x~u!iËöÄien˙5Ţ ˛NÉ•±=( ł€ől<:Ńw®@>şr#ČâźMvĐŇ ď9–Ě…ăaVˇŘé"S×$7)$5´šÜrńr Ŕ˝“”Űśíed’OĽzçČ[űúú=´·hĐô=qpu/VlľĎ‘@ Ž żŕęݧŻÄ”đre•’×Iyéoĺ*'Ţ‘†Î bV€tŽÜ'÷Öł1ĂÖ4M!»’ŕ>Ĺ^Łb®0#}› iúyCď¦UŻÔ–++‚ĄűĽľ#ô­OůŠdÚ—ęű\źé‡i*ôPs‰2"ÎÍ- ţůŐ±žq}é\u(łäĄ©P¸RMýŘ#"ë:[Š+\}ięB÷†ÄE@·Âę{aś§ 0o)Ž#eţŐAŰq IzojĄ˘ą ¤˘Żç¦ 'Ń ř;*¸YĄÝeú—ç–UtP‡DE%¦>+Äăě2ĄüŔ4N„ĐŞR<x)ZŞ‘ř ]ÉÉ˙ }rşŇßnNfpY†%ýżî YÝĎH[ÁË @hY"¦m˘‰Çd‡„'6ÜWËŘ™Młëq 9l©•źđ4Çަd·8#ŕs0ňy>@6•8G…ůé DKןŤÁ‚yŚ3sÔŃO€x¬Uň=1çů#v‹ďt(9?!ĂÂm•k9ÂŃl.múŤNŤ}ĐĆ’¤Á"<?f¤SÚÓ‘"…—ˇ|výĄ=©‡‡^|˛žü꬛3÷đ6W´âéĆŮ-/&!ŘO׹m#Ë–[É+j·ôIoŚ·m€o&/šeô -hzVäÁđ娣×\ÔjĺŇťsßÓţ’qQD'čĘU»>úP"ßg “wÍ™ŰĹgűóI92Żé$;RE+„§üťOCđĄ¶QucÝéŚČ»™âŽ`QC˘s©1–˝`édV@u€*”őÍ<`¸;ĹőÁ"ă’’±Ż/ăŐ¡4Mń8čVÜÄZj>¸äĆÄ…a$¨(`µ‹yö’^ýŹĂTÎâIěÉ®ÁBŘÇw’|C_•ߣne– 8ex¬˝ËĄy˛»oŇ ˝ŞĐ°ž¨|gŕ‘pÓśľ©đu ¬Ér čgÍĘpř÷<?{ŇËŤźŤÎ’X@ńăx'é\ŘuÄmϦm¨âÖ¨ p_Tb%5mĐÁś@đ ”۵D% D(Bś<Ť‡×B(pqejăh}€łµŐ’ąäű.P7#¶Ň&>a-|jsĚĂg ÄČÁŃ®·iyĂ+Řνµ12ké™ZăFÓ·AµÔ™ňi@aÓ±ç¸{QžEĎPT¨T|c‚2ÚZ;Ó`0~"'~™„ ©â۰ě~Ć•iűUsšĚD©Dm( Ikm…3ś üM˙ ¶ ?‚eÜ7׾·ŔĚĐÉĚĂ?ÁÍ/mÁ„Ă­šBË<ńžŤč”™Ä&Ř8ăČäşwÄYc°w"Âm<ÂÇPÔWĐÚüh¨rŠMôW'ŻDă}ť÷‚n|đ#L€¬ź\ÔxK6kPŮTß [2”zlhäj^ŔţV2„meV”snăŃc~:QA(`­mFŻË2 †ý)ŘŠ•źZƶd›ăł;ôá5^!+ćěj»#Ú·X»_u 1MăW˘!GÔő¸¶‰iŠŚ•Oó ­+ĆĚ/hˇI8÷řÇj¬zf lAWŚŹL]~öcŚ©wďßl"~Í Ęę® 93Ă š×Ý‘Ű\Ŕ`#E‹zÜŰ[]_´ĄĎĚyÇnÖ”MŐĺ5Ů\ęřËg”߆aáĐqŔÂűM’hb§ç±Czˇ/o/ö4˘]Ü߬aN_Uu—b᤭·K’ďí3Ő«Ý!;9łŮ°Ţ”‡q:ťF«$łď•{Cči-gŃ.ÂŞČ)żjoŠĂŢű–Ď*¨Čěĺ%8ˇ‘ÍŔ ’pDꟆ6Ä· tqľŇG÷98sˇ÷„8‘µśŻę”(k3çĽu/‘|3ţ'g«csˇK^PÄR�™VBo ŠţTýHQjöíÓĆď·ôX´qť…äë'|ąąp=’׌ľÂ;z-kÝŮj8HScźđ\GËŕS(&o/B0˛č+vaȆö”2OhS>Ŕl~VÜîăD_?Ď©¦V}ßáĂĺvĚ–ç÷eN™Đ¦ˇI—žéjđhČMÂkÉÚĆ]–ĎE×$xcŃNÎ’@›“?čFŔÓ§ďt€Őq˛ö?˘âvuF»;|g=Ú‘č<5“1ĺ/]é'ď›’}–ÎTŕGzfżŮŮUÓ*ť„3Ţ0şżT'ŕç+ojýŽfÝođş îń>GÓŽ¦L–%úÜźÂds•Î1‡—�&M~Ç÷!¬4-dęaîlo/Ç'RcEˇŽGssÁu3ëľ„pŢĐKŠço¸™q–1áa BĎ)©h‰…˛‰¤>•™ľ9Y„"'J6·+ăÓm»u«sW¤w4Tôp&FőľË™fX$ˇÍTŹS‘^+&¨·HÚůW&Ź ¶»ą `lëí}mĽ,h#SYyş3ŰDˇą[»ô*+ń€–ą¦b÷!ÁşśĎr•´2gsÝż,¨ô$˝·ób ň¤Ç±˝Ź[ ŠX3§ŘűoQ5…™¬•Ă�Q‡"ٳѧ;Vqá´ąĺäđ¤ĎW&ű¸ŚŽeHÂGlcPc¶¬`&+AëŕźUjúŕ†ŁsOđ9›¦|TĆR…¸…•©ď éÜ:úw%Q(kŞ~RĹ»‘ŕtŃ[óÍ<,gc÷ŃYŠ{č€O#™šľ±T ĐdäJŞM‹‰< +ožOăhF ü}Ô/ ćXl$8~\ťÖĐ"RđUěČâ4Ň c˙Ą$-Ť¨¶>] (�GHîó“YmÍŰ®ňÓš)Äű@&÷¸Ę‹đ:˙5� ę‘ÖWµĂ–Ф0J§U¨Ú+˛4˛Ş>±|´Ş�ĚÔ ÄJ.Ź#űt( ¨ôUČSyŻó…,Sjcőó· DrĄ×šxůÁď˘l='ć4éĚ”b°WN�“ęXpnŠUIL˝vĂW˝m¸›»ËFŤçć•kĐřDYëvÉ9?ü`V‹5<ţĹ}˘řµaý·îëňĂĆ!ÝęEYH'yřqţ>ŹNŚrÇm–ÜĚŇtQ'^Ţą'ę˛ lI9ŕkżş˘A-ýł(Ňe€ë墸ÔţÚĹşß±Ćěä4+o\p6‚Ң0¶D80¬8=i©eí“ :t€Çş7ßÜ­şy×ď~4đ Ź·˘g4řă™ŐütĆŽj:Ôě +[@ú˝Î‹Ěń˙M=:P&ÁÔ Ţ Ŕô$›-ó@$Ďrľ‡©lÇ… Z¶É ٤AgxŃRŚY 6ŹňňgŠfEăbě ¦ŕpëw˝#Ń©`#;č?ú•:é@iţ›adW‘RĎĘp8r›Rg,wÝ•G®‰°’ «ľfrµŠôę롨čgż´Vዚ·«~;čěgyHyÍŰ|b7U»a$$vŹ+–o[qnĐÜÎŚ‘É’l<ŤÓ•ŇńÎ’ńŮÍĺ!-ëţ«G˙% gŹ M2¬6Ô¦ŽŕStÝę;rŻrŇ+ĺďĺËR&WSÝ˙á—V moµ†Bzµ°ú‚¶őŃך§4ô3şloa%çżTE_~¦)�Ç~R’ž!őď[�®ÜÚČlË9J†a—ŁîÄlÚ‘ó0˛o JĂ ±@Ť¸p1`@ä@9aťHSüđ1TÝHľ8Nyí)ë´ĎÝ óÁ‘jO™©xźĎ,˝ÄŇýÎŚ,QŤÇ&+XÂJ«!˙ččY<‘ęיхô¤÷�„˝.-z˛žúD–Ślđëu&—Š·o_đń=yđďjá ҸL‡x`î,  ÉŚ…ôÄŤá[÷j¦d3GXűţR›Šq©.(Ę6¬eŞ dR°BeĚ—H’ …PÁ•ÎŃÄÜÄ&äĂ#kŘ€:pPC!"ý§dŞľ XîUţZÖᢠ×nʤR¦D[_¸«)ľĆÚ ěÚ3x´%YĆąRŻ”ů ŐŢHK‘ ŕęŇÉA |ř÷á0đ.őŁYC%o4‚VÇôúäT Źiäđń˝ÁA×2y žôżql“P­šu¬GżµJť—ŹŘ©¤ä2ň';–ž"ižň8U1cśmę˙j›žČśVł,oŢ‚&ö‚ĐŞ$hÓA’<oVŮGó‡Ë^,Ým&ÚÜ � żm?X|S*,¤T„H´ 0,çŐ/9őĎ´@ĺOÚ˝~ß$źŁ/·ęŘ­]ţ±˝îđ±%ĺyz®× ˛ďNyIÇăúbWÍBúĺˇi-MM®ťżĆ=™s=ó+Dŕ4 SĚ–Ý =Vĺ7gú%ŰIS»ë­%0”+<§RVŁUýÝ]ľŞT‚˘–†üÖ?*Ťă‹´ě –QeF2�YÂŢVdˇ¨Ľž˝®ľ»ąK€epˇĚÓ4*„®Ż\)CůÚň‚ě3Đ!čWÉ{wMáě3N\¦ăˇo©<¶ěĺ;±Ç‹IÚÜ̲®ÇŃ«´L»Śđ96Ú‘8›˘ˇ‰‚Ç€ÄO&ǵ&ZF°Zg8Ş•P  ËKˇ/[űČcîR÷ëě׊Rúň!ëvBn݆ʷŠús &V>‘ćŔ­¦C…~dí>ýCĎÉł$%OŚăo˘lđuę6Z“Ói' üŔ~.v4V©é>¨ńx6ýŁ×^ĂÎÁďşÍî.—Nęą–ß”A?¸Ď´Â72›ľĽç$łŁß¦+Bâő=óľłČm¸đ-k¸.Ťĺ/Nܰ'=› |@•ž•7Ć<â3eęw[H‚nůą%fţUő5TCđľÖ?…ÁĚ8Çţ-´hů,sÁ!"ţú´`W9+íI¬›éÄ ôsćH•˙ężä¬ń\@Żß;d\‡Aż1LJ $ɦŽ$Mąqč笹8mRÝážć®Ó·¬˝ ‰6%/qq`ÓPü‰wzdǸĂ*ý@ČümľjŇ6,Ö[Ü“Wş;ŚŹ×ŕ™1ńňHĄúµZěĺŠőă3đo˛ŕ*–óN/cÇLEäçv&ęÉ’ ůř AďéE^˝™ĺ©±‘[ĆőÔŮoYÚä| #ůe®ë‰µV˙(úżG„Á{'ŦĘĆe¸·/Ë~ŃůX ťwľż@ÚGR›:$^„Á č­h˝­Ăz8F9©±^E垣€’ČďŇŰs6µ¤Xß”Şü6E)ŔKB Ăł0`#.ÜxC%ńTÎ[u[ěn:śű}^ę6łźćO‹RVĎ`PŢ Ęů;W8[âJ’ąŰŹ b˛ €¨ôĽ„†w>=şąZçë RőÇÄť"hŠ‚ŮLŚĂH‡|Qş"Ŕ§’‰©ţ™řąVţú®˙QČižSy¤ ŃĽöĂGÜT63Š<Ä×î$ ÇĽ‘ěxŤÇSVá‹.żE‡ČŢŰŔŢ ±]>&•¨”lĄÖÄßlňm.|(üH%w°*$éďŰÇ~„Żx§–çśCxăŽřŁű3‚Źô>H`ĺfˆ …Äý·mĂü…lăůUÝŞ’ÇäăS& ?ŹkË– zŐSř}¸őWŐů63´_0Ç­‘~pĎ~Ňš¨gŢwŃŃ$Ůă- I ”qŮ>ć©őQ@\ě/é4ő^Ć. ‰łbŔ„4ăÁ&ÁŚşjzRł§¬Ĺ°@U­TĹĺRĹ> ?ÓţčD&ĹI”2{G<Ě’Á�÷%ó ;ľBFäs!»'ÚŐ´ĘćŢŹŃOMRŕ«8=jÔu€’[Ť×|ěWóŤťEOŽ2�‹5�äů+|6­vôw±j®]—˝ÉREŁŤc8e•:«aę•L¦´‹˝*Dý*čőH“y6ż–S4Š‚ˇHÎř­ô ĆÜGĹŢ´ň pĹ·(žIČ´c·:‘˛Š}4VźLmâ—Oş@¬V+>«ż‰Q½Ë‰/ůnŽ…•ćäé™ďs…VéwÁ_ fźŇÚ¬KCˇ÷ÍľDQ8yŐýaÄ6ŮůË»…ěĹäŞx”'kmü(ŚsŤťšü×!’Î`’łT»}Ë©‹]~ŕËď[baŔM*Ź—ţYA@yĘßěŕ=+ü~âfˇ Ćű¤p.IŁgŁ‘arËßfŇÁdhř©ÓŠ&}B«Á ‘>Č�EĐY{ m*Ů“¤?9xŚ›wC2őó×mÄoŰ<,Ěěw#ěâ…Öb® ˛ÇŁý0­hÔE_P‰ł¬Ž ť]˘*@ˇ:Jńţ<7ý?|Ř•â2»-‰[%'˛wĺéŚ_ż$€Hµ;ŚÂz ŞŐIM»—¸‘ ŕ`ˇ¶ČČ‚˘±Á‘JΚ~ĘÇ%ĆňR!#đŽ.}ĐN‚LŰĽyÓ 6TĂ7'TÇŰ %�ęv2;eN÷¤Mńibň]ˇaxČiFÚ¨D—âUÄX±ÔpţÍů1ť4Ł]ĂÔlĄgĆ÷á ČĺţTÝ‹ť.Ő΢^ś«Ę0čĚB2»ç9đĄuŁDt|]k–i‘F’ş×’. űĐŻąbKqźľęUú$‰ő^4e,žŘďşrŐűĎ+7kĄ}Ĺ dáZkâEÝóë4“Ür!ß:jG?5S[ľ·°�M~4ClAÖ2cđ±ÉŮ’őŽĄűh«%Nńęđ‹\ ňަfäŤyŰɇw:–Ô„°ż ¤röŤ¶ďĄ‘{®D ·ôz±ůéäm›Ţťđ§ ZAĂâ–ŰeEAĐŃ™ł2fµQMŤpR9OĄŐűę­>÷W$VĽB——/ĺ>‚®ÂĽ«‘ÄźI*PNqµB–eú”QŠq°­N»^A‡’Ąš\·`¶ ŕPU5IđÜť'mČŰhŤXDZó ‘łĺµEŤgűdf«|8G/ÇNFč×/FŮD :=°ň=iFÉk÷ űŮˬb X\,~Ć.redMhcŘ~Cú@Ňó`˙OpŃŃ™‚BµŤ1 l÷†Dą>q KčBŁ~_ţŘŰVP—ŰtC"<Éą b÷Ť¤Ł/ZxŠç âÓ!|ĚŽO5t:ňZÝ4·Eqům~„+ Ş‚–{ţóIęŘ–{"áÁIŞČĘŮőměĽfć§ü©ŁĹ ¤ĂHhÜÜ=ăČ;•ł:Ś_PlRFŞ®;…ÓÜEŮh*ąo4LóŻĄ7Ô"}Uşz”6^Ü6Ů «î쮑Ѣ)ľńŕÎ$Ą5UŤ}8¬÷ŞVÝúN ĺ ŘyB=Cćul0:°éŔ�Ć1}Öĺ*V6{“`ÎŹBI9VKfHÓ¨îůâxÎr$ěüSˇB%ÖşŢ5ÂęyęO]-%źŇ†ŢĘÎ'Lş@×9—ŘľbŤÔ靿ç�Ra·@Şč$ »ävřĂŢNŮ÷ȢŐs $ŃjBŇ›9Î2$׋tńG Ł×*Ę"ÔNA�Ó;^e0§a:'2?0xĽP†<Ëä%Ń>—ô¤mŇĆţB7vĚkf~ŹM«Cź°;č4ŠúfĎţe#ČŇöÂÎbmQďéĎş${š0EĄ;čÉw�•E:·Ö‡˙ŚŮ`&lĹfJýî”ěC!!Ť=­Ó|âFm•Ú»Ně—áuĘ˙§B_°Bżd;c8&bjĆk¦#ßôj,bś«ťŚ GQĘ04kŐŁ—Íźň- _SÔI�áü}¬°;<ýďz=„!3ɧZčí›ŰôhCę8'~/±W6@IęaćčsŐšŠîµHP"RË&ViÎö<‡[íÖśđîJÚÍÁµYWI˝ÄOA˝Nf'ůA–9•LĎ yČ\yz~mÝřvo Í�Ó%ÓR° '8ďG<yfµŤ�UÍî$ĐÖUjě"k=hDĐF…ĎÂo*Ą4´%iR@nűíáyŕhaâSýŚşďáÎYW»6ys7PĆW?§ř2ˇÓ_…|§üć"Ż>ŰĹZiÔ7Ć‘‰6—ÉyéţĹ·ĎDŕ˙Ţ V®{2ú•ĘJhrő›XXŚź%DI*nZ© uÚµŁs€—›Ąĺ¨?#k,DĂ;pÉ>Hł_Ťŕ©.2ş »ÓŤW­×Ó6´›W'Ô˛ě7KŹĘ74¶€ŞűutńěĽV)ăm7;[W‘űĐÝgĂe…´ŁJ„Uć‰_˛«g6Úńs,۴ąĺ÷+ĄţÖ^?hˉO(*~¶0fXö n‚řµĹůŕT(×ëŇv)‰W§%j,X´űg/ dÔ®§ŹŚá˙¨Łźţň®ţCr‘rŠ"×Vş7”›L Řpkľ,łí ?ë‡Ú!—ç ¦Ç- ú–çL'ŐWčŹŇöŢ!`SEŮůÂn7Ś„ŕ_ŚĐ'+Ť1;ś[„:‰(Y%śôĹÁKó”xAr§Ťúô*AS ‚ą1 Ő[zči[Ţ.ďĽÂ‰Üq ‡Vó"0E č˝ě(·2ý^č°@š¤Šu®¤"W‘滋K?}ĺşúąĽńálvFöęĆL‹řś[-C;ę>™clĂľ„ő™Á)ţ D.Éßŕű› äžÎú”Włł(ĄMż[‡çV=îZS”Ú}ý)…2Ń>;ó0ĽuVN™‡ů‹ĺŚĄÉyݏřľÔĎŚóĹP#1`€ëíÄ0*}ć™Ň1ŞÁőA+%{ńrµżě?ęŕ<íL˝+“.]YÓ˙¨zÜ´Zźm‰y\e`‹WďéÂzÄŽT${’§Ůż«$©1¦3řÁńůËßł‰ś7{„]UVpóş0łÂř=¸L袾Ԭ¦EV AB¦×·Jôţ�€ 5¶í/4‚˝¸ÂdA’5‚´ăSKBňa(c›4] LRm‚™x—#Ć3!ŹÇŽ�ç÷’&ăn”éť–Ě/ Kď4®î�Ň“Pý`ŮkvČĐ|Ţ˝TV=D`SÝňJgëPűóĘH_÷d„ŹHÍÇőuń÷îST'ç©_9J š] ´‚˘â‰áɦÎtěa¬Ë÷gáŮXÇŢ'𭱦ŮEj‡Şă~hÓ€űŻh¨q8lPü°Š˘¤ę´•°ó•n×Ěú¨»Ô'˙d“đI‹ |LÚ×w|N>ŽĘ#ł_ĽH¬ă}ŽKjyžŤ“WÎÔMűúŇ—7’™= ß7¤z;¸Ţc¶Ń0ąÚ® —áË•]K×…Đí±j8r%~wî\sĽ¬ ďÍŻpŢ>IĆ!6U;-†{Q!M˘ÖŽc·•獖仄Á‘ZűŽĆ˛‹µ/‡‡l?ďŢeů‰ťˇ!´ŁF]e×k»"üI¬çěltKýÓKjđs÷ÁÝ„4{üCýź^…WZmŤŁ¬jgŮËÍ骛(.»|Q‰‘>7ČŕĹĄgëv“ŻjÝÝ—hƧKtär¦ĺ#•–ö†•ł˛f 0‰ Ł|8v4ůůK¬˘{3ýň‰Ĺ˘PĐz=hĹ`ďĎhŠ_÷ýPĆ2ęŽ7lx“=µ†r‡‡ůŐ‹ż3ĚiÝĂ«ó“ďíJ2�3řç ÚŰ·[pqNÁކ¤ŢâÁeQYó[Éăv|łyB€ShÓléä/ę§?ŐMfy’s©(‹G­ÝűD•Đ‘Ĺ_a—$cX.”˙Đţű\+.懺éß—ĺüę"ÁOűÍLp=RVě¨` §ŤÇ]ş8ÁaÉhţś=·î÷źV'ŚV–Śq’ň8'ŐEń@‚m‡; ôČ»ßŔý)˘®ççcB†JgVaáě_-č•ÉüRŁáfç/Z~.5Ç~gŔ_ÂăŁdQă-×tâăł§üŕ@Ţ& űŮ8çuěeŢCÂ3ůĄhóoo_0(gÖÍáŘ,·ô©żłŹhŔzéM’VăˇUR*Đ.·Ę´šy[Ľň1@öu˝ývÄg§„ú Z^ĺf]JyÁŮâ]/[\ťÎŰŻJÔ0čZ«C÷ąC附f¬‹ŐÇü«MÍ[×AÚ0E#FĎ$٤ÝTz:°Î¸xÁ-Ô­}Gµ{3Ş Ä=ëŚ%ôjË4÷&>I0Ëo„2+6@ś‡€Bő%ÚAČoĺ"T¸¶ )ň6ÔX u&äűZ\WŁŚČ·3‡dB5«ÁʵíŰ×l;pú§Ć6„­UüşŢ˝§ąő0ł‘ę:‰Řl™áŚV8 ŤáŢgqR·Ĺ”©‘ëkÔlé^§‘IĺAářĆě˙\�÷BJT3Ą^ŻNÉ!ăk‡šňgȱ†WwţĽ8Ćčá×řŕ‚˙,ţ-ńFŤ îwt‰Ę. ;N ^ÄŃ P7—ţ2ĹPé|ĂÝ˙č ś¸sáë§ůó©*߆ĚĹž¬ú”o . ‹)2'ź2@Ľ%şś[ŐÇC—^đÝ´AożććFYäćĂERk“H»„ź*śŔ°ĄI/ňŰŤ$(ĺÎBŞwëű`V{—ź6$ü4ÜK;ď9DÍŻUÂ'%ŔRÜ‹đď­jŚ,7Oľ#míą¬ľ ˛n:ľ±Ťh@µëLU®ŽS%VeO÷Ň)Éo(úď…mç-Ř e U”lŤ"Íó†W˙ Ě»Ýh˛ˇ$k�ĆMI —‡¶<\& ß)ľżz†“ł·Ćť5˘dLôÉ6 @Łq”=ó%zňp˝’śÚ»#ŐŽÁöů˘¤ńڞëóxß«»­©|'¬kÇă‹1ČřĂD”‡Y¤j‰Čťý-Ĺő%î{ň+ÚBŞKg€#Ĺ4ŚćH/d.> n˛)Ű1Ći¬–Ä29hč|Ń­Đ#MăeE+MEîľ@oĽASđDqYůĎzh\7=gĽµw{”˙˝éĆZ>HaSö"xČ“LŮÔKĽúÓz`°ńÜć”ôXĄK„*$ůpˇßÓŢŁ˛>ßŃ˙:ą/Eĺ±Pžł“NI$V ¦ç•-ŰĽű2© ĽšK#ji´l$oÉ“zě8"ÇäpĚĐL¸Żő@Ąé[19Y§ööWY¬*g‡V)ô…˘If@˝ŰOësNŐĎj»Îäjg}¤c5öMa’§Ą8ss6űç.TĚw%>#]‹ŕŔ‡Ęďé5wőŘÎ Zý#°qü×Uť0žw€OÍÖ?(Q·lĺM`çS/¶FÉ'ti]â3LE#Zíć9OßWę5űhOapĹ1ئćKÄŘ'fßEţALŃě–łíRÖ'ëÂýu (fŁ:ŔŤŃüWůöżČYřdş…Â5SfĎŘ:ÚÂoĉŇĎY_Ąąn3Ę“'jů"çŚëZPd˛Ľ<83Ľeh(`óśíÜ!ň٬ŠKGfÇíçKúĆď=ÝČt‹é�8»ÂS•ŠÇ­rđ:Ç«Ň7«Ś4 Î+\Áć:îÂÎ9R8ęŻű�VęĂÇN?Ű—ŮÉ*#«~Ő${óŇ)7 Í˙9m¶Gb»‡˘v şÔ|Ť·ž©zn_¤I“–8 ˙/jśś ´ZUN0©ţP2běčmezĎ2f@• aóŮŇÁ“ĎĘç5ŽH›#˙eWßx µ(ŚŇŢd~á# ”ŕMĽ!›ÔH=N[ç—ş=|ş<ĐŞb”—¸kxso,Ô8%đďJĹÂĆŤţ2aĘ•l޵*Xqqi ¸Î˝HWź{ä{ń˙ ~ÉžąŃ`3Ő'óA1^śĂKž[ç3‘»ç‚:BýÜ&?\žýiIDy_ř‡®t~�ç\+«z/ĽöóëɧŰŔ Nוć…p\Ňë­4p=÷~»6\ť|ň/l•ň>–T)ż|Slç—¨-Šć1}”ëŘŕŔ¶Üaä+L05”É˙ř"~%ŚÇŞFEÓ7ŢG¦u}–m¸‘ŐßŢG"°“çC!.߉Ʈń]Š%8‘$Â˙.ó\á@›˘)â›­Ě8ÁE›Ú×nމ€ÁĄĆĂ\¤lÄÜŹŃ˙ŚÎVűúĂăGh!v–K,eĐ×ě;ŤhÜîŞô#[šS Ă.su)ť Ą)~Ĺl˙´Í>m(2kÍG™6ľ§çŐś×ŰX¬ŕŁż˙’™Ę®¸2ü|-Đvúv3öâ#†°‡dňJ’|j)O“uŐEűěDŚÄĚrL+Ę (ŤUâV#$î™)5ä‹Bš¶>ţ|úšî`˝\đ3.›zB€„i°wP+Ô…‚{ú“zUÖÚÍ ËţŇO¬ŕm­‰ăl˘É¤_ShŔŘ7WĘíqhWtłˇ 7¨B  ž.YžRo,-k! E$˛fťďĎäÜ$�ţuéůĘ:Üvđa<l d’ÇĂQŰ]ŁgÇIoQăvý‹E*Boť[˘ÉŘ};o«˛†C61‚8NԹ; ă˘<‡ˇĆhUpŢŘ€Š’łÇ&ţűůAQDŇOűăŐýŔXý­Üé*˝4MęßőŹ”sŤćYË1 âjJýM wáÉŁNŚC1îĘ}fGÓ©BŤV:ľRfđ®oŞ+˝"7“€H;°éĹálëȊᦞ'Öë*+ۉüĚ^Ö¨łGntůü–©Ž%:i:2I߆r Ě™`f•˛Ş˙/h÷hČ Üž»Zćh“^“6´^ I•0°g®šh!^ĚÜk]Ţr['ĎU¤v­RĎŹ¨.ÇĆ{Ľ Ît-°f1üú•zuśAéTúă˛/ĹJ§­`áT%gŃcßÖÖ™¶,ň2ͤŻ‚¶č•W+2‘nV#đž ä¬&5!É C„\ę˙ęŞx§yŠłV’ &Ły0ĘĎQ´Ž UËÇě+ľA7#âŐóąíČ„P!0<M1řyÁ¦÷ŕ:ś’U„áÝXÜżB@¦…č—ś&Uté;ZɶÜ˙ bÍŹ”|¶ if5ťńţRAĚ[ęŹ †¸ßćă†cq¶’ň ÷o`!ď…ńń mµttěwAµ˛€ć<Ŕ »ş¬+¸µäĎąÔ×ÉËVH€W˙ë×j™s6ŕżÎmxKçmQkřä(XŻMhuů*TyPži^aë đţäm<Xę[Ď~Ţ@pTŔŕĐK${ŕÚÓöű‚ÂZঠ6ă"ŃòΔşj×裋 ›źR¤%§1|®D’Ą BjZř¤˙ü·’”RL﹢r„Ŕ`P9®Ż$7+X 6ćę; DŠ;ő‹Ń~ޡўÍoßş|Ą{Üq-i®Í°éöĆܫ̭i^Ý×ďŚ(/ë‹y„’�ş˛Mnż&đÝ]ťrv9Aví‹:IÔŁNg„Ű<@ş‘;˙Ł …¬”§P¦‚%—ŇŤ»řsjWĎwwC#?tD»ăŕ¶Fđ°‚McWĘ·ĺ~.�‚‹Č7ő7ŹĂÇ޸X‚Š3¬fŁATâÓ<†[‰@ö–RűoAv­äc�ę± »Q”:zĺA˘ýIî5ŚíĆ.‘a ş ¸°?oŤµŻ¬c‚–Ó××ýŐâ!şš2ş’ľ§ĽőGƸ®ř®KP‘sˇb>FĄÚ »2׎80ę|ŘýůřBž7<c“wW»´ľř x¨Ś†‹"´Á-\…Ů©iVu(6óI'ŚgsÝđBL3ľ—Ľ[ŞßÄůˇ`úf+Ą±ťřÎFđý:“ Óżî Áđuě®,Äu™:˛ě»˘m)”tŮŐ8DŚŁT¤%r ™>ł„w۰ K5$*¶ű˘şµťßĽú\©Žúżăµ§"8vD–¤A“(tÔ‚(Z@‘$Ęu0ÁĐéO15?ŁĚşőüöJŁqž9Ćă˘9v(řµRžQ¬žżQíyÝD~ëäh» S¦źîĘík(‘eźîËâECYm!łBj§ĺţľŇç8™"˘xŰŔú×;'źq,…™YŐÚ4‹LÖJĆh^6´[c.„"<ä÷3n†´]mר*Ľ1fˇ<OÍĎiI$ć·őDßbD5ä~˘hµ*M¤Ły„ô«ÇFµĹŢô8š ÁŇe.˛KÁŽö‡ÄßnŹčňqjUaŰ]×öŤÉ8ä·ŢvËĎçŰsŮn!Ţoż.‘ţRekťşŞ•Ĺ Ŕ$6öÉ2Q‚jßFć±eß7›ÓÔť«đňť‡ÜЬý”ú vq5ůd}`ärů”Tąw_< Ú ®$± #ý=čŇ^?67€ĺ»ňĐřͰ}oäĽ7ů)i˛ŕ1 fzW~ŰÔŁ¦Úş"Äúć¨É_Ĺg5jň.W¨ôE ໓uíB›i(,…>pŰ}úô Ěn^ś‹cŹ]F¨¶{! GĚ ćNäŁ-˝şµŠ¸7´.Y őW9&&7–8_zÎ*ýÝ?ŚE~ÁȆ…Ä@ţ®ĎjMÖ%éÓOŚîbÇ"äeUkÄFł°ŘąĄÎ™´<xOĂ< –@Ţ5+…Űm‡ş&»§XŇő����ÎA �����˙˙˙}X�s=Ąëť”Jk­ś°„ÓDqi‹˝»ęthf`ZRU[1–}wšMŚQźj)Ěqü%+2/:ßf—ĎŁnćˇ÷öŻL'–śŁ¤ă~ ůHQCxhLIçm˛Üę28y‚Tv¨QÍ#7¤µfE“ş”¸ÚŚ‘ŢžH\őoe`«suóGpš%GçhƆ] §”ŤÜ™žü¸Gž$ýý’äÍ;借¶#<ŁDPD§l`/ Ôvç©vŹŤ‰ňśŕş}o HśăٱĐj»˝·?ˇdög®óľÄ9eé.c™p°0ˇŁcM,5Őĺl÷JÔ¸W0ž›9 /›2yˇ/1WďȧDˇÇń�¶vîJŐjt…×{çDZ.ˇo˘řh Π깏ÍţrW­,‚%{j ¤ÂŮşú˘űŐË8S±îdA†ĽË•;ši§÷ňv^ëŃ/¶r­őţ`uf•w|ń­źëڍGɰzÝBO?ĆČź©ů0ĺ$"şĚ‹µMďĘX>©)*ŐĄ™Á=EŢĎÇl„ŮŚżQž¬°ëPËä?»˝P ?g~ç×ó˝÷ď—Č·Ă ČUǶ• XR«7~,˛Üi˙V%!%¶ÖË3UAxŢG!Wľ�ńe]Bî’µřrž­Ăg*_o“€áŢušĂ­ŘÖě9ˇd8¦–Sç‘ɬ7/<fż…óŚĹĚŕdV/X= �‡6ÜÂF{٤ľŘĘ ü”ÔŐ˛Ä żŢ}iZąwĆ›ZťP‹Ř#nćY íŹű#5o·­`ěŹHş—ŢíSĐ—ľ]yÍźX©Ď É{ňţ“ó¦óÓvŽjŢŘ…ş R+qď{,ÓE([G–C»Ł–>BQ·´Ş™Âz #–1ŐćŢőFs‹Ň„#·ű™GvéŃfn¤qnqYŽĺb@ ĽŔ…„r@˝O«nĚâ‹é W*ď‚ć`7Gŕ&�]öř•Y†±řÇż9[í…UŇÚRpJă–ZÔ# ¸‹q®ŕRÄ?$’ŞíHĽăUݤ ńÝń˛t\^ŤvÇŐéńÇĎůĹŹňĐn„‡îyÓŔ—˘u[ĐÂ+&ňL•FćŞd+ĚĐÇ ĺŰ`*»ŘV-ɸŐ,Äť' Ä{)š9çŞîáů‹SÇ•ý ŕ^BWTRú“Ý$óĘŃ·1ę3/Šű[Bú@<Ţ+1ä·Ľ –™Xł*"Lň<f/š•˛pŞeU+číiy·T˝‚“cć$ĘT¶Tď &Ú–b\ë Ęšbç“rÔ}E¤1$E„_·sÉŠßlC`ć‚·«JÇdÄ}ţYÜąţň<GćB«x””B°Â&€@x`ľËe댱ěŽHz±ýńár Ňk.×ý}óżŘÉŤQ;şłCÝëŚ÷ú-¸ťĚůęÍË4 IŰ;„_€ĹB­Nű+:k 1zWŤßĽ€ĽmÁ–kA>EŢuS„¦ÂSąô6Ř?ĚÍs uŽ?ş´H% LKžî™w *örŹÚ` ĺ‰5&íĚŇČ[¶4$ˇk¦.Ů© �MRÎäBŔ_PI)/;żÎí ›Çݎ]9ă›ŐEüm®Ş™Z.j„·?č §=çŮďk¸t]ʶo? ;+7aCPSx§äÚ#s3L·)3öŘżrČf™;«ą+9V‹ĄäŐ-„Ř4ˇöÚ6Ʀ*ďá?ŰCĺÁm8—‘.ň»Ż®™¶Ç±@·e9˝X Iďď«Dh•ˇđ'o˛ýŲv·^d_ĎŐ Ý˝¬lŮŤ9ł#şěŞňřôDŚPeäŻ?)Ô3ĽŁúCĂzLL3QÚŐë«|NĐbÁd ‹wé*±eşŠ#Dnú_ 9ńďż @¶¤=BQą}†wDZ}NG™>ńËů^ĹŇî‡ţ]G:†ĹćŽ^ŢGŘx‘ lzĺ=ĆĎëŽRŽ<őěT‘čˇÇRhy˙î÷\äsݤYfIşÂ­ŢWżłîĺP”úRa�dvsć6+`úfŁWiA)"ş‹ŕ8ŚŐ4Ť7N9N58ŕgťŰňFŔŚ8ÁÚ5ŘnůĎŕ äźĎÚ+46»_±MŹíö.pX1ň{LHP,ĺxÁť˝r™ořŽË6ß)Íá‡Í+zEôŕýjWu6\…˙ĺ:7@úô>OwçM…ýoGQĆS’°îÇO}5…˘ŕ_‰Ű Ú”"+fH„×ČŢvďYÇ“ă—9çźCU°ţôg8+—'?¶»Ýí2TFŹÉč"†ŇV6MIăţčK“mŘĂńÇB‚úŢ÷ňl/d•y�¤="¦¬8źÎk‡,‰ZBü-hĂ‹§Śź·x §ÉgoÝ„ˇ’ڦŇĆĐé< ChJxž¬ßS©ÁăhôśpéČ8‚ĽĎđô]ú‰öÜórÂPHcËî+Ç9ß4–¨ř„´ćC­Ër·É-D–cz¬iß> éŁ^úý8w©˘{C°hüő÷ľń^O<´¬ dÓ)3ʢ$’ 2Ř(]Łäé뽿a B€Hk.,äc0˙†â&˛D „YřŁv"+Č× ¤6SZRř!(|ĄYńĄ˘Őkvţ±¬O±Ŕ&íş ţ6eÂĄŽm'nĘ©RÜz%­6ŕň2úi!@Ă F\»ă+Ŕś÷ÜĄ©;” Bl d™Ők< čđq‰LôUöuË{^aŰäěXă“Óz‘éţ>€ĽĘÂ×™¶˝ćâß wëb… ş…ÁŠüÇO¤ď_‰»˛‰Wi |ŤÎ†ßÜŰqëř° â8 ×ůŐÎLO†ß F­‰<vŠą<Ö€î™ĐRŇŚKĄ‚VřžĂÚEÉůi¬€„GMW4+†Cřţ× Śq*đ'±ýxEË”.ďK ¦őŮ–v#CßIţ3|ŻwuFť2™ÍÂëŚ"âNýzµO&d»ˇ=v�ü}v˛×nŤbD÷ŹŻ7ĺŢ·í»ué2}{ä%f8 BíâČö’^†8a'Ś}ÖŚYůx0ŽĐ$™=EŇęUÜ[#­+ˇąŠÁő =3'ťÁ‰uXW·µ"*s¤Ö4qŔćDkc]\B<’}=:âfîĘm}ŔD,RB‚ŇáFX]•ý¶ţµ‡ĄĹ�‰ŤňŚQVeipÉ뺍7śZLŤŻ}`čĄŮ{´=Ńäô”ĚŚ‚ fá—ý1­ó)XG“|p .4ěaGQ5ŻuÜŇžqEťľ/–řá1EÁd| Ş\!M$*Ú=ńż«ee/ H¤Ä*’=Ţ“ď˘\´˘ÓůY:¸\vâ˘a[1>ţ9«dX$ů@ťN!›Ü�ßL#ÓĚ?ľŻ+»TKöş!ÝióÄE†ű 6öap ,g­{¬Ň’sîĘq˙ă~@^đ¸QÇU™’gwexÁ> Řď:]S^<ѵ _m–‡\t¸–Ś °[Z˝Ĺzk2¶?e¬ëŞLżbęA®wˇo˘P»­ ű:şŔ ¬(6ŇăAÂ.Á)JŕŰŃjśĚjî•TZah\yŰΩćÝŢď1JW ÷´`¸W˙2ˇý(!‘m‰d»Ű:tŤTő°DÁ;ČY]š2ŃćŞiwff;ęi]ľ31ÇóŻĺ,_T˛‹Źý|”ňBĹpWýB§a×/ű–8Opëźđů­vwl‚ŁĂUÂ�ÁVŞ­#nŐdé–L3F7’6z‡ďŤÉksíSŰ€=”ő=ąÔočÝrŞëR]hŘęq+ľ[hd‚ëÂÇđA^Äă ¶A›ô·…˘ţ˛9v\_Á!Fąá–ÖŔŤ—ë~Éć2dÖwřŔ ô+{ÓÍ ?"a÷ŽĺďŘ7§WłÂxž[Đţ56FgUWJXŤ5śsW=Şv%Ĺß(΄+L;ˇ…°śń¦/*eO*ÚÚ˛ĎFmÖÇËv#lk`!ŃxŲdáö±4ćn�DšToä2†`Ą%§z„ÄĂĽń;·GóÜ*»µao&.ßľ|®Ş,…–hmăŁÝ­ �Jő!XWR_µ8'˙6…[µIY°·–m>Řqr‘Ľ@43-�źö5#˝Ě†'~ĆDŚ 4OmT*©WÍEŘ8U śKĚ&AĺŮ6Ůľ»‰¶6OA§÷ľ˘.k WŠ‚*®‹B˝UčßLł$8ńqKÚRË…Ô(iĽkxáöń9€Š˙ńOýS‘ě‘�ŕč|�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/mac-399-tagged.ape���������������������������������������������������������0000664�0000000�0000000�00000262707�14447736377�0020160�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MAC –��4������Čq������ČÚ����������sMNrĽ‚9¸Y=Ěl°(A¸ �� �Ś#�������D¬��r��ĺŘ��@�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~ 0´���µ$��ćuŞ41ŘŤ0îÉÔ?YŚ/ű~'´´á­ ÂoHl‚łah>äő}!PÓsŻcjűâ~"™đŹžŃ-Í=+Ë~ľ`Cß1YdÄ‚yz1Q{çü^±Âbł«ęĽűÜ}ŽË­W¨Lc [WąŇz¸Ô¨M1Vív¤Vyçlu¦ňh2ůüg¶DPF ‘ €ö¬YŤŰ='C¬Šr×fĺY]Ué(¶ËĆ<żćhĐR Ń:Â˙ÝPřë9…­}§kév—»ř˘~”¸ńußű-/íĘ…NÝ乏«EŠŐżł¤D¦é+iř•ßņfG¶ŚŕpűÔŻL”MĽ…˙¦Í¨ąĹÔź… ›‰ÄčN˛#)Ć ’,Ě 9Ąë@4úe‚•mŢ3gśR€3é§Üő¸(~PÂ.ۉ“8ĘęŮ–S?©‰a´.Ď‹řňs*˛ůM—(:ű€±Î-Vń§®Nţ†Şçpłu*ŔCÜĺŽÂĹ%^Zś¬9G‚YÓü`ÂbY»9B‘ů\^" yŘ…3Ż%¨óĚ«¦Wţß–ç9[°=@¬ú°˛Âu®nJ°#e’ł°ŕüF+Ýô<×˙'ŔE’«Â×jWđfµšŠUW« KÖÍhîA Di  Á}î5Ş®AU*“Ť3âđ8Pŕb»÷§ [Ż…‰S ÇéSpŢňsŮ?ćS…’śVૌ’}ŮŃLV�0Š|xŻÉKé%®y©űA-�Ď+˘Ds•Ę«^ÔKôiNş×Ę©ţ­†ŞlĹdĹžŐ2ę“r L©xÁ ‚JĂ)Á(Q~3kW O Ý_č?+ VâĚ"Sk™xŮ$q[ţě+.ySwÄhĘ#*Đâöťźß®Č'(ů…Ő(‰Yśů[‰ó™ĺą¤fV>ÚˇŁÄĐl©čÎ؇iÓ:>%Č&@öČ8¨Âř "ýJČ“T6~2y°7©  Şç¦G«Ńt3QËĽbôP±Qsđ xŚ‘8¦ü'$Čľ\wÚŹhŽ˘ąH^z©Ŕ*َ<eČőn5ȵ– ě§Śq¨®PD&łÉꀉIóăyeÔż…6ϡ}ŘŤ±Ţ�·Ĺ‡Z…µ†KŹ Đ)1®3Dżýâ—FËSĹ*‹…=�E#őçÍ™Öę’CÇC@%ĂişŻěU"šĺËđ©§/eAŠJ3Ĺ|Íűç9xMÝŚýŐĚ!ÇŰ Íí tŰľ’Ěč mS[D5 ęŢüGÂśĂoV#xµ—LĽ>‚˝¦`*+C<2ÇUV˘K¬¨“q긨é»Ř?ÁWĽőc±M+waŁë¨óˇ,<Ę÷Č ˇyČz\öHR^*x 0żŞ])¶‚ŹŻÍQ'l˘¬=PŃâDŘG•(Ë7PĐżGš \6ö.ÔëČ~ĆęBđ“†Ćţň’)dDÓ•JŤ úĘ—$ܰ¦b1ŕ3O7łÂa@ŹŔVňÉÄ*äĹt=ţ?H čL.ź'AďzC7ôÇzL‘dą/Ř™cĎ=‰Vô˙RNçŔźú./5¨ /„<mżŤľ$‘óČÁţň‰[´;¬Ëj‡‡kb$bEJŢšĘgĂr‚ŃŮöŹâSť†¨Coź Ő?.ŹGcÍ'Ěrţ.$ł2 č5ěőµË9đt×<&ĆpĂËŚód¨!«ĘS#ÂKs/Ĺš«±Kľ”㡠öHĹ6ň^Xbôş?ánŃž†kŇŽ$7H‘Đ3ń"Ídb~„¶„š-(^ěY>öD˱\ŤßÚIĹöÍ%ŐŢ2ll«˛CçG`™8–&…bEç81ŤĐőšm‹Ž'Ů8»_(-ďąÄák?1öý@GDS1^Ň,#¦1¶NCL-C‡ 2cŽ&+îó'@Fś_«–l\zK=xvĽ™–ŃîÚŷۢ÷÷^YÔŔ&Qť}xao$ ©ľeúčˇĹĽcĺoy#O'IÂ^V!Öť&lÂLŠ€‰+?8Y«ÎQ5J äd4n˘# ”"ˇ|»R:ÁuŰ3BűÔ8/ů Öče¶\2€Š 2dQĄ 4ţ Z2ÄAu“ˇÉo%ăü‹Ä5g‘§ÍŃă%őko1©Źr n4†Š “˘)¨ŮOŻ2(‚É„�šSŐ G*”–öuď3hTy”á÷Ëz÷+ŚŠ…ŕu[}‡mÁů�  •ÄËŽé—í­yy|ŚŰJ€ů°ŔµťSó#5«-Ě.WůÔń…©b1·™íd Ń~>Ář~+öcH=É54‹=\ĎĚ—há±[YŚ…Ç‰xF6ö§źŇÁeyr;ŘŰz·†Üi „ÜV±Îű÷O%ŐŞÄąˇ«ĆHůkôM8g“7EާŘx_�®˝Ŕ9¶99’:ä·éQ yůfWÂÍĚs_›ń[KŞŰ šXI©şDTj\ ’ަEŽÓžW†„:k(OL_÷K›˙–xźöż&†×.ëŔ‡đÁH&é<şËLé›úxč;7w‘§öťlnu_ ë©!—^lŽ!ż3�Ĺ”1ÇäÚfLţtáůÜW#˙UÖáoĄ Nz8bˇĽ´¨S“ÄeŇ€A1]r–]ľ[ż¸�Ť¸äaŁ-Ďü3Î׋Ě'5" Vó™_=SčÄçŢŢšjo™”>ҢĂq°±×Ý–ŢŇ6!Ă©ą =éaäŘ~véźk›Ľ}bŘŹťJ~ = U;Yö€´dŔ´´ŠĎE‚±¸P®R€Í¦§�YÄű–ĺ1OvËo̶‚ Ő缾qĐ2öKĄ™Ŕň ݲ˘VĹH4Y˙ĂÔGŘ’ýnH#ŁîöěŞLMďCEÓŽ”·‡Ä!Ă oS˙çVŇ)8"zźË˙ÜíM4ůŃa«+tíĎš÷_2泪[H6X!vK 6"7Ö\iI3!pf%+W!JÚbŇ6Ő˝ % ô~Î{5!×gw“%:ß  "JĺU%Ń CM@h?ĘLzř8?VÂť˝ń©ähr{ąž…PńÇL©YtM–ĎA×GA#řęŻp-BkK\–…R6ŹąřG~*["0rŕ˙jsbĆ@ťľÚ5u2+dq\cq§(D<çҦĎ5ĽśM ÇŰ?P6T›}¨ĘGÂXĹţőŐŐ»ýDyzš¬¨eČ'A­=W´âş%ŁůĽÉřśʰ(ÖűćÓożţËŚ*ĽŁ1[ß×D,Őö»Óر—·&ņë5śA ”ř&“ˇ^Ć \¨ †KTc7­ůTÔ‘îˇßą^j†R¦ŘĂń48©ncÎö¨~Ůkô™ßůtŐĂ˝˛ĘÇ«ś-RąúĹ[şĚ´Řăř.‡,ýkÍ×’MÍ;·oÜÇŇ!^ů»¤Ü1bńŹ$—ö"Q*.G:8~µtÖ"l Ýf?ĂĎR–Ae@CŤ%üׂÇŮÜË1!9T™o±Ë«ü­ąDËâ(XĆĹËýÖ„tßÚúŘ„™…¸\$ŠB!" ý—>3,Ţf·űz Ž⇇¤µ Ř]™őP­3—͵ůěw8H§Îńp ź~č¬-~XĐ)Ń]]˘˘}ŘĘ0‹2(d8–$”Yyˇ“'Yü1î ąw˘Ű±1UőçęÚĺÉ&z­Np}Äş+’ ,t!9 ?¤K–ŰóÔݰů0CśxeüěCß űPŇöËĹyó &ľ$Ţ( ŘÉô\ăžű#Ýq‡<ěÍ‚kĎCż9k3¦ł‰ö>F+ –C-âKóĄJú!msćÍNÓ�\dÇË/z‹ö¤›éóě ’ą‚†D+Ą)ý’Ś.ěvÔ¶rón̛͌]ü€@˘Űu nTÜŢE}tťvŽöŕś­a´`M§i3\=ŚWl•a ¬ĄŻnŇn%Î ¤áNůôj,A憺W¸dÝč”IÄľô7KNä®ŮĘ*Ü~K<¦Č~ž¸%cf&Í ÚĂĚB— ĄáH3Ô$ÂÍíţíúOfGޤ˘˘JZmhť$©UumÄ ;yஏĚiDÁ$pµG\ÓW]–7Ćí**ޞ– šÖNHĆOM—†,`51է¢}öeă ]y˙ĺĚ-ÖÓ˝Ş·Ö)—Öç)2ŇŃ’!i]‰‹QăîTF©;äź",O]oŃ>´Ő´-ĽŠ·äűškë§ó4ĺČĂĽî5ý’[ŞlěQśĎŤŽ‚îőşŠžO¤ü«Âűă25ĄÁłýʇ1˝“ ›×O¤oň6*Áó˛¸Ď|ŽR;Jq8Śk€đŁęq"zŢÁĐCŢŇČÝáűÜ–$Xf’ňÜÇÔX,Ś7JÝĂ“?=¨!Ŕ¦Y ONą· kýwiÚÚ–“ďźJ˛N=‹… …î‹Îüy±áŔ{Šv¬9Ч=+c(FĎ�^ŮŃđ*­ŤFLľH Ĺk,Ä ľ¦·5•†‰ #|4[ŐËS÷Ő˝MAG˘e#LŠ˝j"OşxIµvجťďĚW9ęĺŚĘ•ľ˛ nźZ+ĎŚśńŇ&6řÜLíJŘjô¨_áŠĘh‹u?Ęť×ŕ°±!Ů ‚»vÉő12ŽGoni5ł/,ż<ś8đ2ALqÍ˝žJ¦řôĂĄIůFŻŁCw$‰+[~@„/r*ylĹ™¬”î™53Ň„! ¤tJA >ćc'§śs_Č©W¦6Ç0ÄŠÜš†éH„’dʦ�‡#—”O»>k÷ügŕń5ăń!í‘ű'„ßđúĎťµúNô‘3aş-”K±ţëZó~Ó˙ˇ†U:UU^ÔÜ€U[u’P oĚČÉ©lş°K=dŃŻ1-ľÁĆlQŽĐUĺĺV±´˘W8p8ÚČ~b aǵ˝ÍĄRőšĽd>qYo‹y×™÷8 ĐTVËš:٦ë[ĐqôĚsČ‹›]®G<–ě!D| ŁŤě•›.T#’!˘şţ¬ËÖ›<:<±GĹWnĂ)3ôH2śéŇs&×AÍH<W–Kű\]kq„Cé}Ő ŇŔTĽó‡®ęFP‰7aŹ.xĐŮpu!nC8oů|‘ëŤ.j Ňß”˝ÁůŤUz‡mĽü�Cž6vç§­ąçA‚ÇřóËGoáüŮ×Dëe˙ĘtîJ Ěż bąré©4vGy(ý.”:NúhŐ˛Úçßz3\Ůń©¤'c3‚ČÚ^Ç«đď‘5¸×ÂGSy:ŐXG9ÖĽS+ČÄ08 ÁÄ…;Fö%ű茉)mÓrË*‡s ÷ţµÄ =Ô~v"®=4]jź&|u‚V¶Kuôřt<÷ß=�gRöđž7nÝëŐ!šyż&mmďVqÍßÔPé3;ĘJ;ĘKŤJ¬ęeIŻ={_b q'-JÍÁ ÷ß]‚‘Á‚µž‹îF4,žżŁź††0–{BrWÇYh2§–Ű`k0Ą®ú㉳…ÜwÖ±,‘¤í÷Ď3Ä $/*EĘŐu˛ –żnęŮSÎhESéµlĽŕVsŻ|˛)Aq©ě•¶Ę‡!ÂáŘ*ˇ45agß?–‚Ŕyz)YŤýĂ0ÚŇ'ˇIě&mť…§&Ť•Ď‹Qň‰_Vt‚ÁŘ>8–¬‚ł.-…*ZĄçţ×ëȾ穤A:45ÍÓĚđÂŮĽ62Ú|»ŐqĆtVˇ×ý ÉŘ%….îTvÄۉwŤŇú1S}îĽf Ń<™ďĎ@ud'9ŐL¦ ş ˘d`ČGkB^űžŞĽ$…mĄI7Rë0p!€ţ9©Ú$ZaŁłiĂ›t,ß2r%#CĚ|E¶Ă1ąě˝ŞśŢÁsBĺUŐŚ|¶ĄUwjâë˝Oěž˝–bź @jFŁŁoŞÉ®ŻjËŔňćńđěpîň N;ťPµUö¨ >}cÝäŤ~iÖ°÷bţ<›ßV=ůŘ˝c˝@ŘđČ}r)‹ÚŠeźs4Ůóh-exšgüu™ô)3aał•ŢÍűh®řFAAŢÖńô÷D‰ď©6Żw]đŇ_KŇ3ÚÜŔ^ČfŽ jt Uwî)>gˇŢ´mŽ0iµL«ˇe ÇŇ’t|­aŚB/i<˙}.öŰ|ö‰9†±:“Ƹ’Ý]�•Íeµ„ŢEg@>°$¬ŰNBf”á„´wr Cĺ–Áă8čCJ!rLw™Ş¨ ľ&X$ëv4}źZV. ¤ËŹdlý‚Â4ÓyicŐ¶äőď©“T“�L†^wíoŠ4@(0qc�RkšĂÁö;ÚO•›°Ö\mÖe¦ů\}AŕLšćŕQ8>Ľ— ‚>_3¤ÎuLxÝ9ĆęĐúĐHELô‰ÉFM6!cÝĽ|HK»Ă$Çx%།ŤŘÝ^=śj=öjŁŘ=bĹŠˇHO¦Qň}(.ĂůŔ}"źx‰ ă#ŚŮPÖ‰iWÝCŢ›°-»˝qĎbńţűŃůż)Š+ÎiÇš-­‚@Ú˝±Ş­IŢ'†f[B űâť} 5ű<-×@7:.zXĺÚ¸Há|KÉ{ĽSt®I‡ŻriP^â"dî3ڍ,ÖŔř–K'CŇh: )ůĚÇđ;+íI»Ýźz©ď%}~hLFK<™ŢfĂĸFµ—iBĐęRfHý>űÝNÁu�UůôÝż˘z*¶¸‡ ¨NÍh·Ň˝NĄCź14\6ŞKyÖâÍFĽ 6Ł`H˘YuŘ-ř&č§ňëS De ál"«&E:=.¬/a‡ôöĚđY˛ţ-Ü®ŢL08ćň¦ăîŤÁżfłó‡_±®/V†)Wz&uĹěëWXüůwב);ÖY_yI%6éĄç“ŔŻQŹ^ Nw=vÄL.]ĄD/dśň™É_;†G˛ůîDL?¶@úMץPSuzĐgŻ YůVfą¬M ôÚ;ß:™ĄË”ÜÉnFĂdzÍ^ĐëÚqĎ=Ák˙¦ä˝ĂšeńömŃĽ¨t–Z‹śĐ̡đ�×V P‘´�qXôŮë’=桸˦tß¶ńVçm ĚĚů—sIrsŤR35×…Ôý`ŔG:$ýÜŢ<ů)ňuę±5&űŞţ›iEwC‰#ŚXg (ßW“óă•y›ž:ÔU4ŽźE>§´äľCâŐaNŤ‹×J@ D`Äů ŕ,CE[÷°9Č©»ŮĎ4i¨<ł2ňŔ6Ő ¨ ú®zďřJČ6őač€0>˛ÄĎź"ÚUKiWâp4ŚľčąLłôTŚşVZÓY"`{RB}Dsµ™y –©ą°‹/âŁĎH“ř`L†\V%ĺ?ĐRv8±/QL "Lżn¤äAŕ4ȶŚńĄ¨MKzů@ň?YăGzöĐŘ0•‘m‚;Ď062µý}÷ü„Py|jýÝŸŰî…!ć“{§é˘;xĹ’7öDL˘ČO;G1ťˇM@Š’Jp©J>gP Ń<<e@šD‰·ÍľçŃĐ­’_Čr¤âۡd3)Őý~ŻÁaž$ă›UfýÄë&{eĐoCů’Ąh±śĆö‘˝Ô‘EÍ,ű~(3ôx©'®Öć%Ĺ0ÍÜ«đ<'S lX=¦TĐ-qĂÁ…nŠťÖvľRÇƞٚYkKńDIYľ8ěô_ŕ˙óEÄş1°ÓRŢZü7…7¬é ĺ µd‘:-ńÁi1Ýx‡ťe ™ř§€R‘„…žsWvR`•Ntďô۰©–ߡ^Í&ƶ·˝xĚ«ĺnűcfQÝMöçlpě›ÓW]—Şţ(CHV˝‚GŁôăűĆb~@Ál{H‰Ń8ë^7;Ż5Ó^R!ç˙Ňčĺ*E«  â]ű–ŕI>  k©lvôÚ?ăËIOŐ$ÔsčIr đϗ·ʼ‹¦Ä깯B8¶UÉw żx2énľ† řćHN+ÜÔ>É|KL»LTĄ19`śGíjsa;¤ÇJĺ,ß.F¦.çB3Aű‹gň˙‚@ÁvŻ_íMoŽęI‚µăäČş5GdšPÖzR°¶iTrťXľ/`±ň.p˙)íLcB ÎłŁüíĽ+eN1ÄŽĆăZ™_šă«.WŕňxŰŚ}5»y!đrBŮP…ú§JpG'V—ĘѬȖŽŰ$îJ‚ŐmĆŤ~#řJÓ^އr„ýZj”çżťbá1čć4ŤsÁF Mm}ăÍ~Úż—[§¬7Ď4Ç âC|<…Ň’`ćĚĄwź¬zWű˘ÄB¬öËßYĎĘy@¬3–ÓWćĄôĎÓďĂş)âß¶Ö}…tńO.â»l±Bł´Ó9±bKZCĽÖľę@ś‡>Rq#J*'şt_ ‡éŮ‹­@Á űC›U­čV“ëI¶SxĽÇn!Ŕ)@ßąt'zaÔŔRm‚?żëç ÍlŽQN˝čpRyěÍPíOî^őű¬(5şo¨Ł0ęŇěř7­ë2Ë»%­°wî±űďç‘lYRţńöu}Y™ĺ=źSńĘ‚şžź@>V˝±ÓČÚţ‡Ż©ˇĚBĄË­—EÝq6î4sbeU’Ş~öś .Ě­vy˝»"EYoncŹ"»SĄâµ×ŰýKx<ŘuŹ÷WąŹi' ľď•Ç.§Vń/e+üî§Cr…¶s؉$>ČŘçgß2 6á롦Amݧ+«¸ěĂďż„FdšdYć.ů™Żë°  &&6ĚĆq-Š2E¬ m%H˙!€Űż–éa\/sQůó= sţĹĹ!ďĘ,ľt·€Űߏł8}˝×CŔ2šß%ʎÂdIŹ0Vśžś;Ń“=¨z®‚ ýh)m@ٞ @ŢăňŻ4b“ľş7"J¶ÝŁgăn,¤˙#Ź€"mC(Ć"~Ć` RłÇÍK°q>ö^´űF=K•5Ő¶]DqăőísËËÎ9z™5ŘI1ŚTś^ú™"u ;~¤KyŃD€nÁbčĽs/i~t°´7ś‘}ş]éČvŠ4Jšn¨˝ä^&ăŢ>ÂúĄ3O?ÓR?ŕ…ă^Ý­HÇ”îUĚíQňőçw^W~§ý‹]=ŹÇ‚/FZŔqT8ołžž•»hń˛†ÔŇě'żšLżŻ ˙ZŢ]ý­*ćâínbčŕÚMnWLcĎQGÍG(ĺŻf\—Úˇńh˛Zdľ Şá<ęŐ¬Ř<N™ůFGú)‚2ÍŞTě˘F¦Ó8¬†x|d(ňp5^ô…¦h´ő¨ ’ôPŞűˇľ~>W6éĄ2L۱˛ü–ĚţÜZ `ÇIůÔ'•˙",ąQÜ^ŹĽţ§”đ˛ŘAvO@ן_ŢÓ·Ł–Â`†`{"®ÔÚË“ů'-¬ŁË65€’o$wJ¬“µyÚĺă|é4{›é¦|úş�ÂĘ)Ļ̌Łňôi; r/Kđ%WV°zJ¬•“SLţâćüŃŚcíĐ&RĆx7pjEęĘzp`źńţ32÷î2-ŕyAňC %ÓŠŽIQčÝĆüF#† ˛źŇľ5î~ޢMjž…Ǚݴźó ţ/Ë»5Ň_ĐD8íRŻÎXŠ'a}YkYě†`&ßŇ„źD@ÁMßčţĆąôH  ;HQB\yv@Ĺ–@4aE€ZâŤ(7Ű—'�uĘhÚ»_čcˇ.a¤YîĐÖz)Heţ°¬‡¸śas*-|@­…ç˙ďQ†#ýŢ„}‰ă•=·ioŃßrŔ$î¶`rš#EĚ;ţ{ŞdüZ6Ă;‡˙ a.Ceö‰` Őx€©~ě–ĐRźŰ*×ŔÖ6Ąů÷k5Îe\(˛éěĚŢ»|­Ń” ýzĂ·V ďľ\?×µ.¶®_|ç`¤Š,V—gMĎ YŹBǧJí!đ/ç,Ŕí pnCĘŹÂwŚŤ˙˛lýŃŞ_š“­rž˝´NÔ‡Śp—"'Şh'ŽĎŘ.ħ>üIç“Ü.d ßű“˝Y…Ţ1} _ź˘Tşµb í˙5bŁjÖ¤Htń¬”C<G<ŕŔçĹqŕ’ Sv!ćţ23&ŚăĘ ôԷɦ˙¸vÉ0 ¦ë[n-}# ˇ€«<Ö~żŤ’JŽç1Ď›ů–lćd_ó¤żŕ1ó Aâ Î˛®ÎUOţř^Âk÷ăG±łć“ Ž<—aTá50"'RŚUÖ“÷é&ťŃ‘ ;JhĄI¸Á‡ôw•Z’Ťrř¸2ŁÖ˝ű}˘Ýň@žµËu&őS+±çS3ď­ŔämR¬„ś… Ţévöć6‰9ȧ”Ěľ˛~;˝–ýÓŻbxiB€/t¨l+%ělĹSÝÔ›úâŘĄ”B˛ôúÝvŃa't_m}ľĆNßŮČ´^żčETŇ.#ź1[âş9©ÉöÎ…/Á‹;L�đ4›eVźÔ˝?\óč±4ăT„ť»caŐ´á*ňlň۬ýrżłlĚÄLÚm$ŇyčöąŃúđÓŽđ ýîP™ŽźT¨°úłÉ"µ-§ě[”&—Š™jÚ!ćôöj|8îş”˛q‡L Ő]fJÂĐ í¶únsźÄ^xĄ„˝'cä[W[˛ÜéÄť‰„ĆÝ;"5nŰ;ăőOŤ‹‘TüBŮ~ŠÖćź Rö6†1ČádIuάűÓÔ$j€ě‹Wí4Jĺ‘1˘óá´2 ÚÉçáóĘ'Bôŕ}§ńĎÚ {ě‚A žż2=Ɖ¦hôťĘţŰ·˙Ţí%Ří6Lď‘ţźv#Ő7hCrEPďĂC„ť ÇŚ5ŽÔQĽR«ö /OÓ4Ţ1ä—bNÄѵ7…×ÇžZ'[K§˝—ň]-ÁdűoݸĐ1 ßš+řő[_\)Ď^´Ů-ŽMĚ۶’šßîĺ`ýϨ’šţâ>hŔAëEŻv˝ÍW4n¶pm=ćçż$ÍĆG#Z/% Ëßj’«jR=YżŠéý<†á*tě*ç=IlŢÜRŠŐß¶ňR𜞕Ө÷íVâ LżŻj¬ž˛®TĆHoe…EÚÜ·* ŇźáfŰ›_ąť�•‘ÁwhHÖî~–S„vő˙3Š)<ů?ÎÄ=¤ąß›¦äďTźťfyßź-ŰxőµI€Q!qµÚŞłĆĚľ ¤fգݸXSřşŰí*דę«ř™tě0Î%z<!;„Ůzř#=ńĄŕňm9z;&"Ü$ÔoýůëĄtx,nyöľS,ěÉđ,Ł/i$¦Ď~~ˇšD“5SľÉR ľťstUÝĎXŘ`O{~ÉÜ?Üí¸Đ¨/éÁ¸ëŠ ¬Ţ -ŠĐ즾Ü4ót¬E•Tu}ýő&”U”uҧż˘F’i9S椰©v8-1ô=zÓUĎţ7 9 ĄÂdAÜ©VÇ.~7ŔkÇ$Ł;ÍéŽöšVkŠěŁEÁŇ^ĚÔÝ ŮČíßlˇü=[eň 7@žm”kٔٶxčŞĽŢ“Ź‰9»±ŕ;0Ĺ�&vß'@ËÎ,şĘAâÍ«Š«w+™ çDŮ˙ĂÁBĆPd‡¦ü”˘{N“—r‚‰SĂۖł{âýĺřik,ÇE~ŁĽTŢż Ťä)÷Hż ¸‚ŰŚ§‹9\ 7!IeRÖŻy‡8ÉŘ ĆhnÚŘĹ×ĚVHdeŠoŇ6-,ź‚�$�¬ …•Á{z{÷‰iżqášlRä§ Ő™Ý74€źgtOŠGç'ý8™*Ş2 Z$©”X„آQöŤ˝íĎ™˙Ú6·!<Š)ť÷őnk̰čVůp–Ó °9ßđč%‡'ŁQI)˘WŽY“˘e‡ĆĎýŽ|lP6ŘÔÝČĎÇ˝ŮěWQ!1ń’­,zĄ¸Ë1(üYyE;ž=2˙7c—ësNě—3b{ĎfżČ aaÎĆbňţ–ôjšMÉŇŁŘnÉHó¤™îâÇF‹±R±˘2gólçz3IĎ Îď{ĐËŃjëFńŻÜBsaĂL Ë{Ą> ٦AŰüLĽ–?®uµă‘vű&[{,Äńöu¶gş eµ˝¸Ő÷[‡™/@†qmÇq™ÎÉ#?r6>×U«ivä˝ců;§žăBî«9_Ś;RÇăQ"ć“‚ýĚ«‰Ąţ»vGÔšä¨u« " Ňťążx=KM^1'YŹ*yĘgü‘Ć®Ă˙^¤.fŘfIqI&,ÁĽ^%ćĹ †Qó[]lËŐîîvv2]śĆq›ď˘YVC‡űŠwj{üď[eVZö�?Č˝T–ťžŔÄŰ0~*ßĆ;źÓČ(Ţ^«´AŮr7‡đĽUČŰ.íŁ 9u4®ë8cż×Ŕ *Ăv*ři=ˇđÜbł˛É„Tl&·Ô€ŰŢOŃDY[ScĂö––¸”ý÷iIź;żWđ©ÁčäŁ8S+?Ëa–Dža¬÷†éGlQÍ\*#¨bđϰ˛…ăĎu÷-D&˝Ĺ8ŰĹ©ĹäآՒjŹUĐh`Đţ\ŕěúÖůŐĐ*đčlb6Hąů%U{ń>±^±ř.Z�Ą‚y™ÉƬ.;žó/ghť‰1˙ďî•_‰J0“µ?/şěm=,ŽšcÄĆ—!+¶@ýńĂté5„†|K'„Pżä“@ )4?®âY# pYű*äŚiĽđPXĄg«^\†#Żĺ}t>Äm#Ŕ0űţ#Gýú±$ťsŕHA•x 0!ň\ Ç©fkĚU ä�LĂÚ~“=1áŘ~ ůn n™,nbłOć]d d~č3őłćw´ÍzÁůB&&/\ܵa¸ädvş›ý”aśÔ8FŐR˘JJ’ şŮĽs‘ş€HJŞë [<ś¬ßwąŤŁ]ŃŹeŐź˛WĐ<b·lsůôx\\™g&†ŞýMŤL˘±ôsIĺ:ŻĹÖ ,j\懽 ş˛ď˙ŠᎎXSŃ=ĎɇxX^T@ի髎ä:Ť¨‰ó¤4s*xţŹ1Ş4 ‡lĎҨh ĎŁľVµÖŤv•Vß*ś¨41.*’F˝A_ŇSąžçQĂţTcűrŕ)ŇŹ›#Üß.żęę3ĽEáP` ;„.·s˙…ďă~a[–ĂTJ%Ů qó¤’˛l%n)ćÔ±Ý+´u"ç*Αµ&ł˙—‹ćďč@·–  ˝rćŽ_˙ÄéëMđ2ßÉÖ)(+oŔ€ôCN>ĘB «í(]5śË»ĎTĺÉľ0Ĺ–LVd-u|._<~*C~Ä”< ]ŹÁ!ˇđÓ‚=iLřľfy#↿Ž>*äÎ5?"ěę–qľŘb‰‹¸l•ł}}·…¤Á kŹ!BĹök›5ŮAKßoĚ]PzdÖ¦ ŃVü„ÁEŕ<>š€_-¤Cîgě ö­µÖ¸a¤Č‹z}äýíŠm`ń §!€I�q^=$őHüÎWu±ô[K;‡“ nűş}Ődé‹)b‡ű…_á4wáąÔéfWBŘéÁě”äßs ˇdeß Ęë$ŘQ‹şŐ‰âCaťŚlńŁťKZzĚ�ĂCĚ"‡®Ó§6L],gy¦^g+-Â9h”~öŻG*”žMëc_tMŠňÚ“\ť#\žĎpŤ»˛Î°š<ŕ©řŚľNAÇwçŢńĹÓ‘ŹDG…ťű$R)ew§î0éŽâľËAk†÷Ň6l<něHG˛˙ąëhéźŘśeŻ@Îbť: R„¬^ôFÔ9ŹXĐd]¬3nJĆGbH÷;Ë)˝4ę_t`›âŞ<G}ÜWrfüT·ÔZĄŃj\6ę±Ý…‘JŕĐ€3·<ôŃĐÔ"“0 Ń^2éŔÄ« žŃřëľw»†sě‹'űČi ‰†Ü˙Ţ™>Ď_?ăźó‰Ţd('ŚýŇIŮíi{=µ®źĆÍÓHVĄĚz´6‚Ö—µ/ŞŞńÚˇÝ÷N_őěǨÁŇ,“pŰäŽE8n32*­Ľż6çÉřĽţFŹ(÷QBrČ‘ćúě˱ĹMÝŘC”JĄĹűq–ýŇ+Č<öŰie9A�F’_B—Â5#i¤> Ş4ŤŰÇfľ gZa4s‰>¶Ůsš÷Â=a*¸ŢŕĹ(LŁÇęÁu¸H’©J<űŘK·°KËĽ÷Ąó˙ęX(Ą Öü’>ů®˛1·EĆiĚ0ČOÁ´Ţ®0żşžŰÎćC:uëÁKˇý#}őz‘™ÎÎA˛~Í\żeüÂŔŐkŚŰM#0»RÁ ĘX›! ďgbË‚“Łţ)Xgj=ä#{Q˛ŢKm‹Űp6 Źháx–şm�ŘF±–§}1ľűK1ĺŮĹľaO\jŮý5ŘŻ3XöQäQéBÓčDݦš<0„Đ@ruƉن)iÇO[Ĺn¨€‚Ő>†#.pőčŇp‡Ůq©WAK}g… `Zč‰aA{CŹ#ëÉĹěţYĄˇÂ%p5ˇ\cŘďhŻbŘ•uW�ă6I;+2‰ykčďż˙°˙K?'jq!m  ńăHg“· %ÍR®'čHŇEaĺ™ůP2nŐ¨xŘŮL…›ÍuĘČpÓ+=ĚG‡«{.ăývB2,méď«~źž{ř’ÁWŽĹ+BLŘÚYZ@ß 6je× Řçlü–_ŹEĘW˙]»´!B__>0«DC6ŞŔy*é>&Á·‡’Ž7wě3ĂuHŢGěÍ)§˛�ËeŔĄ’«ÂÓÚJ!Č©9|’p8©›Ż›}C&µŢO¸ġ ‡î.ĐţĆm-¬9ž,Ţń µŁücËb9MtO¸·Äľ…»ÎwOĽNq–żć <Ż^[§I™Ź‡6ťî~±†ŕźĆVę "y9‘‘Áâ¤ĺá{Łć˘HAśĺ°V©[úDkąHxrŹ(Ôv&ű˛Ř2ĆÍ‚/¦wčŕŕo±Î¶KĐ/ˇ a”:EĎŻBÁĚăX» ß2ŮgoçKÓ1'ĄD Ëę® Ó‡űĽčĚŹ˝a{ŰkQĂŘz’•żË;Ć5łiä[Ěł ´ŞduŘĽ‹2Ă"ö;č"Ű:î(!šÚăn÷Ž“& ]ɤöŹçĚźŮĆ0H6dřKŢ„‹Y%ۨZÝ"ýą$˝ŰíI?+ů#Ľ!ܱúKjăčŔ?xŕ·»ełĄë =í˙Ć«ępË8 Ůš)¦‡ČŇw˛xĚp˘R|+O1ő÷ÉĂc.„íĹń&Ě)Ř.*4ńžŻ˛2^89ö Ö=Îţ2ĹŚž¤×sńâŕ`őŇë 6Ůă§ĹŃևڴ&ŔĆ~}ţů·tőp„ډ#`óEsOP®SŤ!ţL č8ÝVĎIĽM§}yţ$o…ÔďSľ ů Ř–ťv4ŮŢB5eć˝ ňś¬Ĺť‚Şlׯ}źF®¶ bb’7 H1_9j’łY-Qt]¦)+'ąçśŚŽĂÎrgwÇšI|éprö"Q©1v;HÚP¤]@ş –Gëžçbę×®ÔFŹtáđpă×yăŘ ›ÉÝĚ­\t ôA Wáň`6lµZ+lfÉáĆ’B<8µGŐZ…Ë=‹‰Wié|™ę-F˝iúđ“<–ÜÄ;K˝.äU]ąăÄő•É·v]ç©Y[í˛ÁD.ŽxKęµg;¸t©Ě÷U'ńͰăŻdANěĐH—­]6x˘Č”U~fć=>{W¨ď‰°‹˘Ž&eY‡ëBTéۡŇ�`äűK˘TKĐß)E–˘¶źĺ»‰ľ!Q_<I%ăüßą7÷ Ć•IMĹÔUČ-«Pp î'ŐSŢň˘ řş•_´EŠĘ!0šZ!ĘË^Ĺy4a˝ă×h“$ékşWa÷ŇäWĹR9lIşX·ZXZt‚NéMĺÍżzϰÜ2]±RB‰ôş7$هę+ż&Ş<Üiđ  tD¦0§čýěˇ�ŹŘUĂ1ŐŹžżď„哼îY (íŔËş´sî˙°~G’$/ŚíbŮh=|vb›fhQprłXl­´ltëŞë˘Đ[}‡ëR`ŤáÓbßoYţ«\”ägë@i+źŞ(ßS䤿ˇz Ücl)6đ»íɆ;šŻ ¶Zp6_S˛Ť,Š…ČqCĚŕ …\’2›%…ËŚ?°awĘ+\ü_Vüaăň¬ßŤ(Ş1dĄ·ao势2őŁ*0…¶ó~Ŕç&±”kgEůµ˝dsŔ#neŮđ§UĂZËŐTÉ„ŘĺZä5Y‹›' Íţd…ÓŇ“î#ÉÖ, ÷x1‚¤‰°jOťBG[]‘n܉]¦dF´÷)›Ĺş—Şaëę?}>.sCc©:Mxç@á‚{ °YÖMěýŃ'Ěß [gu5ňzmř RçkďPD"�Ë‚!TŃúlj\ľ„Ż\�9p¤!*ÓAyëšnŹĆđ•‰oMŤQÚf˰’Kť˙v’MŐ"Ć’=új˙˝�@šć'ô!.zü˙ůŕü-Ŕ]Ď]Ł ÓQŘS9ÍŠýębäV<ZAßj‡şŃ&LĂ­ţ˛‹ |±YƉ’!żú M‚‚­…p&/”ý‡Î  Xh˙¦§rőÄ |>HÇK)hIZ^űNökµ2ĚÂî¶?É%ą?ć˙şŚ„maíMťř݆ŇO9–܉!*XEĸĄ�§‰S”ö  DÄ"äVě·<›ł”™ěoAÉj«¤mę|YmŢóHˇű3Eę؇ք(«$|Qňş“îzĚ;îš­ěVŇy ^ '–çËś/ZRe«bß)ű9A"~Ţ[H<ŞAz?„™�–Aźę\TŹs.÷&Čđ/VçµUVö4aYn\úőÜ _řźTĚŻ B"RłąS°§űV%hŰîů@ŔO1ŔĹ®ë¬=Ö€ąşf±K4cȸ˘Bb±'i4ĂŠy¬%é&]Pl@†¶ýěś¶4Óî[u‘ˇői© äö¶/&X“đüÜÚř�Wxë5 Ł ËÉŁÉ: Q/ř…ő·É|Hń퉋‹~ceiCRN¶394D čÂs‡t sşĘZPőřĄ&]`ţ(ő"mšMą37 xa°iQ¬§ĄTGĆČD5·ˇŹ—Ô8÷@řű”áwÇńd—żs»č»Š�ĐŠë÷§{uŘ\b&ć¦-ĄB5Xšnˇ�YeŃZI5Ęč¶u=ŁfWDďi´}2ô[ÁšÚ„łB_XŇ:LjjňŽvo¶ÖP€hÎŃ—ĐZiö YČÁPůžWĐ tŢŽălˇŇH•:ş·‚?ďĚî¤;É’ŕ±Ú÷`[NaŹ3Ăý'ÂqĐx(h#& ¦8Š+<|'ÍČć_\ࣇ»˘x—Źuq9¶Üྥ“M&°Bb(ëńTŔiŢ0oç*î”ҵJý˝óUd–h „1ý(;Ltşs»k§ŚÔô}‘ę`żÚŰĂżíl ďˇáŐF_śuät ®<m͉9Ô´đ­F!+čç‚Í(“Ň  a±f\Ş e ĺ´úßýM·Zy)=ƸĐęř’ ¨~áhĺ«BÂNŹý­nZѨb–`»éĆ·Ä6 çL~)Đď˛?1—Ęđí¦Őбť»ú:•ZVg Ó\ľ=¦ľČ´�f\đarźQ!(‰íş©‘“wTŤJ§›A=❼IřÂM_ąłŕ)€08yn"¦Ű5ZĘßK8ŘŢÔŢ ˝Ý*ą!9X�Ą÷̱b2ڬN"şÔäwŽ#çśu¨%”U$—ÚŘa®‡¬3mpHzF]7‹Dářc˘Ő¦Ű™§Zá——ŤA˝„´’bŔN·ăŕ5-µ* =´fµ"ó8Ś Ě7Ž{—+hë(űJŃ—řv˘AĄź—f?™"áK7CĹkÓŻ9—Ő7xÖýJOÎP«áKĎXŰPy¶€ckJ˛[o]ďv‹ĺ[ęč<użň&âÓ®ś¤ó}&ůÜ5íąa+ń ;M(đ©¸Ë9”)úĘ9P‹‰ ´–ÔĆ:Ô<𽞥 ř1ăqâĺX*ąÂôöëG&-‡˘`ţSV>^t•tń)Öűß #ęCŮćĎ!â|®OYäČ`*G&vsŤ¦PqŻ!Çę7w°·Č=nrEŠăŞŮÍ`ńŻzy›L(\˛Ő{´/5§äN {ß«“5€őźç{Ć-ą®Ş!ÂÍ ÓőY`Â…ĽČă eéjÜ3”C=Ćš^€Ëڍp- »ů킡ϹXv^(ĄSpÜ´ýŹąL;Â%ż$¦ˇG¬®>•#Yk{Eá«&A?ž.MD™DZĎΖŃUG˙AŔÂŕÄ%¨‡)ćLÚf$$ŃÓąs?řÁ•zBcŇĽ–B1"‰Ĺ´@EOäů8›\Ýäa$•Ś“jx�bŮIüREEÖX?ĚBnńBSŻçCĐŞńĽŻ€ˇü7e ÍŤ€óęV|fެÝ&_ď)¨kÉě^~‡#ŽŔ›‰ËsgŞČ„ˇ,ű$,<›Ítă#][‰Nň PďB6Ň0ŔŻ ®±ń°_IčW~‡çšűBˇÇävĆ%¨#L S],Ů”V72M9›•›Î'˝áóhÂá o$‘´5ôc–ËĐ0·ú}ľëőŘCę‹Ă çYpxÝ‚2ě‚a ÇÁ-ng+Łľ çޱŃ */÷jčU¦ ăćéÝľĽłě€M$ŽĆ22ö/8ę.u•+ťrś‚,O%ËTfťĐP} ą•â(~«•YV*Íto.Fő·[ đŃsšö62aţ ť˛M“ą*ťúžG!OGĺ…çA|öĚ�9SíĘ;űMkwő4řf. ľSÔ!ţĐÝ?‡ÖTĐJŮČmA§ŮYv{K¸8úµŽ‚& e5(|™+C_·OÍVŤfîŤhŇBď5߇Ěm÷ľ¸™<ó3»¦Äw&oŠsŇú–Dú±–&tŞř+»•ye˘j«bůŤ™öto)Űů_©ż¬%ńň4žkU÷ŃJŮ!‰ĆŽ9Đŕ4ť%9Űkłą]Uç«]ęąIBîÇĚ4ɶ4$—€ĆQdYůoŐľÄŰ–¨™8ł{V#á<´ôC‹X3ŹÇĘÝDL’ąOAĎ\ ”­ßhü…DDňwžb°i…nĆ?H mňoDňĄ—@Ě·YšyĐ­°FËpe”Ďş<alKŮÔ¦Ž¦›ć‘Ýpłź`¦@6g•çŐz˙O†ë٤ĺ»ŐHńşÔÉĹâŕ7@±­ňdhě©˙x•×k‰ďÇ.3¶ŔÔ/zµÖŁ÷[‡ý+1Ţźň>Tjď¸Ë.é?é–TF\ą&Q÷MG¸2śřEH@Ž”őú,J“­P¦Ó˧l8‰?FFL¦ię?ĹK`ń‡ËĆÎüO!Ąc Ú»$Sý~ä tť ő;ý+ĹÝů-xK>7”Éî;C˘đ!ďâłě»·i®©č;Ńf]ĂÚj4ŁÜźYljÂQŘ'ň¸m)őŕrśW‘(Xw:R71g­ńhˇTS’9ĐÎṲĘ8–%çŽ)_‡nÜY2ř‰ĐČvzD6/Kěś9Úü×Fä=HÜ?ŇS“gő?)¸U­”W¨UÂ`b“Ptp!ś®>,SkMŹróło«S9ˇ ©“Ë,f9© y‰·‘É ŽŤ/ř$Q^Ú±†¬u$~EČËŰ”�q™˙L冴Â"‚Ź-GJnl8xg1L Řż ·ó? )CeFä5YG"ÎŐŔÇ÷Bß]§&<ąMÄHY@^R‡Ú“ŁúÔ™Y'BáŰ9˘/P×UG¤Daü)pb’xńÎ>âĆ”zl8%ă,ś;€Kčěöłrpk?‚ݧ+ˇ¸j(ÎŘUvR.SťGňTúŮň“Ś ]±Ž+ZöČ5żl‰ ´Ůxí?ŕ_ť§)=×?ż•TŐĎuXš3×éäŚ -%IpÎ%tĺ>{’ű�üŽl› Ú°MDYŕyě}|ž—N˘°XO¦ťéř@Ěép]jgEşjÉ4¶‚ÖŇK † Óe–ĺôM^}Ŕ%+A]ŻťÎÍr„Ĺöě<I­Şľ÷ޞřńŕaU°'¨łg>"Ľ Ęě!ˇ|‚®’<ż5" Q ?É•|Â.ţîyťšŕN±*!--Z·]rđŘ“$";ÝMŮóŐgíQţJެűî·ŔÂŮßČËTZĄ$ĎőLË`.k'gÚŽăé)¨G'éýFié/ô­IÇĎ–YeűO˘îˇĆĘłŮg6©‹ö Ö˝É€6 ť×šś¨”ÁÇ %qĄ6ľęÔăôIÍ‘Žqf•…Ĺ-QFŻ çý™BĽ™°ŮŽU«HšĹK{wë÷ážCl(_Ö)ËM0‚ýÁ?á—ÔÜ`t*]´/8ąŠ8¸ˇůĘ Äç”ŘQw†|5ÔĚë÷ŕ‰šyh­BAY�ßĎ*žyHp‚Q±Óõ×Ű@›ĄéZ’ë ¶:(nö PőDgV„r=1 ,¨ţú˛dÍúJJ?ă×]Š7k0_fnŃJŕ[‘8ŔÉńč#ý1ˇ˙”é•fXlk´ęŮOŔ»‰ľBYV:M-´HaxF^7„žăFßĹx5Á/Śŕ¶×'¬÷ô¦ŻŤ~ ďŐŰć Ă×Óu…śrĆíĹGGâ�ó’sĄŐ§řř6ľ#HßµŕŕY©™JK-‰b:ú&˘PúkB%ýÎŘ>܆•Ş•LH){¤ÇŠ2‡ÖµEíżúü’T2“‘Ś•U\úŚR&ólë—š?7ĎĆ@T×€?ŃŻ'*Q.‡ýę&:µłĂëľ;ĘA|)ĺýŚíES–1FJ>)r<Ęuë˘#MHQMŇ5Óěáęű"GĘBǵŰv™ĄD¬Ą¶Ž…ĘbĎîěۆÎl 0C‚ý‰l}b§§eOčč(Öš®˘¤ĽJ¨[. éŕ(Ů~3ü¤)FĎ:UŞá7©ŢńŁÜú䲕ŢÓŤ)x|3u® “Ó5nßďf+ĄĂI#‡ĹSwu4_v?\sĘL ?Rsča†ĚKÇŁˇ|«Q°·ęHĽ°Qž˛ ĚNőĹäŘĎ÷%uj˘)ęŔ[łp|dy¨,N­fر{Ş% r¤(đŢPµâi[Ȳ™‹_#ÚTŠłJë )­o¨˛Hçńţîö…>T±ű:V÷54ůít—:”uĂ‘âJʢ%ĂGŢ×Bm÷ő_7;Á<Ejśzł˛ót)í¶!ÉŻĎöipOŢr٧‰uD˘ßTß|ä}ó}ÁČ2/-ć|üŠmíBä;'v“ŢbQĆ‚‰eµUK„{3×mśő!ń¤DÖÍRóÄĐłŽŘ?˘Éí}—·Ü‰ł=˙9™ŔVzP+o1Ý@ńŃŃM»ďJŮ]čhđáĆ‹>K†)V”ŇƧI˙ńěČyzš­„÷ާŤo&Űwa+$Ć®;ü0/ȦÖHߊő\‰nî6$ŞűżŻĎ ňÓLüLˇL«r„Ňf„ćĂDJdn{Ď(Ąkcź¨ćCuÝť“%:sQ˙‘˙Öš޲JdZÜäIb5%Ě;ńĎ!CO'ŻľYŁ}í剚püM‡.żgŃŃĘŠŮ•ž3„őťčELRŻ'ŃŔ7ÚEîÂŮEŢČ»ČҶ•ŐE–'Rŕąm–Ţűuřu8>’j•jM¬u0ď°ÓNşÉQTZć`!š,ÇŘ<Pô9{^_irő”*óL­Ă.ö‹:Rm?ł¬­/�/Źßř jäWÍ´Ş(3řT8ëřRö Y68…m jŁÁËś ßŃíi‹ —qş;,ąKÜčAG§ŘL¦F”¨DŇR›}�‚CAU'ĂďęóYö¶knÖxü-ÜđŹŠ>ĽŕrńČĚ?©~±2‚¶§´WN´SĄj˘…Ŕ-y6ß6t!dţrYž)Ě|Äľµ~“żÔľł…ŹxěąZ!_ŮKđdEfŃG­F|Ő0¨ /벥„Ü\�ĚÁe\łL‡ČţśÁ/¬ŃŘ”ÓË…Äď%{ź®°íŁV×áÖŘöCcĽúë>¨…!E„ľgîs_÷|IšŽ»UNkˇÇ3Z`NŚţ=I,dďĎĐL2á†-z.<űíŻéôF‚BBmČ4oÖ–˝Vó)YŐ˝VPŹ‚XË ú:ŹKQ¤XŘâĄÍĘ=ŞŚ‡Ăź‡äž¦ň¨(RşĄď…„ŐP?fÍ^ĐŞ— 7Ü,ď¶>`˙ĚŕH*VÔVÝ÷áĚ ”ď\9Ć´˛ÚzŮ‹Ł Ýşî�ł·X·ü±;;üY°äýÔsUş†ů˘<Źć}Ţ-ę8<Şă’B߇E.76ěĂŹO¨#?@Ô=°N3Í|x2#ˇűňČ%ÚŇpĹP}öyzG2µ†°łĘ°Ć)°|ŃúV5€W&‡&Ő2?Ĺ*żĐ4s¨jŹD™˝šYG©cÉ^3¸ĺ([ŹŇ6?’ÜŘóŇR]T"?ő.bǦ"ü vATî…ł[qh6ŕ}q}ˇéae{Ü•‘Çę…żĎ:؆yş^PMPćQo&ěÄzIä~Ł[€RŇVo«ŃµµŞĚ5Úëo‚Ř:~?]FúńŐİť>óBnĘűĐ]!>réŘoY˝$nč¸Ëi L”m!q^$$“>)čĹD1qˇ9 ˛¸•‚{ü ŕ^j>ë¸Uś«‹ă`7ď%m~ 2 S¶FŃwłęŘr]D^ |ĚkĆopm~+—ŹJLLxxŞcq‚ëöÓţ]×w'pďěÔá…)ů+_ŐčXĚl‡Š^ylw4˛2Ç�±NßBBvKŇëţß(r°`&Î@FC? #!křÇÝ­Ńą—XŠ˘Á˝Ý•ź¦'k¬Vąő9őđ¶CMę$ű5*oŤÎ&Ó¨,Đ©íW±Ľ'­ôY¬x“Ă(Óď" ©YQć/aG@›(ÇĹaô®‘|éáô˘Ły0=‚<Ř.޵ĘU€ľŚuUlszv IüU,HÂŔ^·Lű�íčS}H‰}[Tť*ô—G×x"–‘9®f+v›^í¸Žtžá éąľ˛ĹśÔÎľf@&…u­ć‰vťß-†“)ąmÖr´) ˛Í<ía#!ÉL¨Hs#lŠ˝É›‚LźÁµEáŞ2?o Ą‘7„+ŻwQ>ď¤ó¬ýĽ–;w<řUÓ¦O&¦Đs+óW[Pyę• ZD’ţ_f!Fi„jćǚ׋1`äđrÓŐQ]tź[tŐ„Îp űżA_­†@ŻXśçCÍÝ#[Ů­ŇŢ/Ú€„Ö“]É„wŁń@}AŐU›Škmpß ůĚD1ä@śÝ ä¶3<}ÉŤŢs’ă,č˙ęJłk ˝.ł¶ąqKo~…;ţćŘďôć{Ö[ľ¸N 2„hűc«W{-RŢÜ!Sńľj''Z$ĂÍDb‚ÁĺĘűŔÍ{öQĎË?lăÚ‘"ľŐ•/Ű“Ŕ.Yw8Őöą˛ę‹ŕ]v#ŘÖŇűŕŮN›”Q�®|1"C`Ü …ţ0�ĚÇ·żýy+DęŘ&@3‚ęíÎm—ą<ŤCoZčě `ŤYë&%꧆ŢË�TŠ^–fŔLI©ű•vű±"¬ś"‹/‡ĆÉ&4‘Ž™Ś:)úƶőľ ŕ-Ń@»ËµLv‹ţąű<ŢęÓ’Ë ŘÉ~Ú8ç@F܆ËěÔxĐ<íwť‰{Q7‹k,öűCߥ˙mžŔtb¶IăTäŐU`L„…·sź QľąţŠâqÇ7ľ”¨ßč¤q^#x_�_x_ ­Š3W=*ix=:ťWź;Y´Ź řîjŤXI| »cüą| ˙ʤKqÉaŃ÷‚:«ÚŮąNž#5z-± ÷Áš,…+şf«Éä]Íu—�ŹóqEX#ćZUĘ8ßUëZYĄÇ%#yŚ¨ď¤«‹(PŰÇ/˙gpä­fk§ ýúař ćŤ|Ń´[)LOş[۲/Ć˝»çhbŤił¬çŕ>Îť[Łó‰kÇ ”Á©Iµ)ň@ ówé^˘t¦ŢóB°HX’¨ç››\ˇ¸kŰ&OEĺŁĂË�–XÂ:MęJ“߻Ђüo×k§ĘĹŁöܢ‘Âý¸#†Ű˘ŽrýP»Âő7Ý LúÔ@ŮYRL«úĽ¶,YŻÄ$‹¶¦˙DˇsµâÍgqśM=pwe®n>gKl˝ŤÇ“ŤyCZ‘\úŞDeUUPęSňśî¬ÜM—¤¨G&Ů3aäô­w ‘â�µšđ<ĐXr®¸«‚ô4@ ŔVašűćŐ A?Đäh©´…'¦¤ d—mÂđ)Ń6„@éîů— ťşńęˇ>ž ¸)\IÍĂQ_šMfń) Č5MZ rí} 5_aMĐĺb°3Cď?şĆç_˘w[ôfkTc´ĘÔŻÓ ±?fv˝Áq^Ď\Ż‹Ď! :pÚí)?âIĄě[,˝Ň.y[BęüCü+jEďo0Ň@˝! ­,ŰÓüq„Xţek‹OumŮŤ&źŁÜňIĆ�âŞ=uű:Ź®đr'źRŢySfgpĘż_UńC©ź˛ŃĂŽ»˙FPŇ|ÂťiLô»čKa…Ť6čłÇč"F%VCÁرÎSŤ;óG´•P˝ŃXP)¨'iĘ$™‹Ý…I-öŔIén»j;vÝ0[…<m-L) Xifíž=|H2ś%Ź`É–>Ę$“Cm,;TŢ­ţď›b,ďM;­•÷ى+9@,ŤLsMŃ}ËAĂ"c]�FA�Ó)Ýŕn§kËjaěŕ‰ šă> ľLpeE_B¦ÂWăŕŕ«G~Ť‹?gľ˛±g'Ţ?^© Btč…ŢÚÍóŕ¸ŔÜä�ôŔł‰•npýs}2Ú˙{;ű\÷…h{ŻI/k— ĚÝr$4·»° Ę,ŮÇsg+ě vŮ+?“q«ż�ďšÄ4˛4­“”*ęĚÓKľIŹm´|źG@ŃŇ,ÎÄ‘őÔ:=¦i^W�ęÖbâxxćßÁ1áŁÄÎ+–“í°bŮŻBŁř·Ţ Yô™~c¸â<RA &«¬k950ëĺ}6r|8úŐÜzŕlrĽEýˇ~ô<iĂőÎJO�łiżWŽ')E ŤŠĘ… Ŕ2„šSÜč÷ŚjRoc状JO ýÇĽ—IyxÎ×ëi¦ŰůX¬ůe8�ŠĹn7[€şWdĄĄ˛Mδb ßČ3.a-ąř{ň¤Äcăíp^ą·Ědâ‡8{<vr)ČP%Oú·aYj첇„čËWŠűŰŽ/<űň»śÜă‰Ë4BŐóuŠF>,lL!C5Kş;[Źó{vČ%îKTšµZˇĂivlÚ R€·H¨ÝÇ!tÁˇu–v˝­\Č@ ŚÍĚ?O•SM8sů2‡a¦Fb ntX²† şYŻĆY©Ŕ¨3 MEś„€bÁžd+1…!÷xÄaÎQŹc˛�϶$ŕ– %2;˙Ő‹Mž˙őép©;Ž:Ř{YŤĺBŻť÷Tȉ"·çŇ+„ţ…%±–˝{­/x'Ř(ˇë$/„žë#?ňŽAV.XX5fWŇ‹ë<*d%g«LÝAťŚ'u/%ŻCőůx#‡—iF˙(y#¶>{+/ł›­©öČôd' Ł®GŕĐăZĹłénŽŃ`HaEg»đůÇŕbY!» ÁtźÍw8~~ÂŁđ¸xýü{-úĹěxĐXŔ…+FÖ=v‘¤˝·nж0Ť‹=nJcH*%ZS•­ţöżęçĹ”ĹÔ¸&ÎťďQh-qJíÇ1ż°!ŽlDĚĆđz,!?@yYpÝJ‰Ńx “ŢţT'ŹÜziT'Ecđ›¦OÉ^3Ts¨W[~Ď0$±˛^$LidĹç(~¬zdĹľy0jŮU¸Ž=ń’ü›‰h˛łŠÂK‡ŚiŇgBÝëIęńÇÍ’(Ř-{ĎK\H%1U ăˇ\fs¸7  ř›fdë©®3a0Cçi–&mľĘ“”-zŢjn{ąţżÎwăîV$ÁYYşyIçŃë·‡€ů8µ{Š8A3mjť)Żď)Ńk Ćt`IJF4j–@ń‚(•ËôzOn÷¤ădýů­#áYşYG ptR�”@9¶Ž^ A˝ýµ|rĚëţÝ ?ÂľăÔ3pÜÎľ2d¸˝HŰ,?ąŔX™I›łĆoD"qţX^—ÓĽ·ůŤS’Í`&ŽďÔD’Óę“,‘2©ť™»T«ŕ}UĂv`KmĽüĎĹw&Š4žµ€ omBoę“ÍƤL(wó[Üά2Ű÷Ź Ł9a ş´câ7*ő±Ýz+ —ŹÓµ  Ľ7Ť ÇŔ ZIdyd¨Őă=4â=>-‘ß”ćKě„;⸻oWCŽá1Pɝ߯ä”Ů|ZňĄÖ!ˇ¬”¸‘RÔᙞHl-ă±ňČJ!ž úüór;EVx]„˛ČÂ(T«;¨Ŕ˘µ?+ČÂ”ŽľźJ ŮQ�ô0IľĄĽ–őJŘ„‰§$‘Zngm®q®3aČ÷Q‚CĄs­RÜóň…(tď$ulfÖΩé«[ÍÂI=‘O)D‘áÓ¨ŁÓ[-Q&KÇDőFŃO\mVd/ ˝ž�Ęg¦‰»Őâü,—¶ľ®ý|ĽIj ş}éÚ`Ď$äě3­ŰR@=jĹ~™ΰűł0ߎüE”NŘ;6ń…N­GB˙ű–·Ń.‡g…ő:ÖPúŚTxą]wďhú>đE'áTJ‘é4"bY˛čö3ű~Vh¤.!�rčŰňćÎJşhŞ ü……°âbv®ô¬XAtÉ÷†’Ň–!wĽÓŇU*wf|â‹sHĘt–­ řĄO%bÉRnŢ»űÜnĚ?´Ä!„8ř€b ®âˇé‰­ĺ»wŔ,Ťň{6Át>A^f�›ČßnŠżĽÂfkŞRŻ?ÔrYž”:=1i“v$AŻö×§`Ł â%^BDK«łÄ«Ůé” Ľ,áýe ż[9IčrAbǨEâÔťĚ*^Xîsü±›ú= Ý MHwŘH ŘřîrčE7ýj/÷r^¨”`úmşy¶my9eJ/śđŢ ÎpĽ¦ç ×#@ő$ żµĂ'Ęٰľ&‡&ó´ML€ŻĽkFž0˝}?Q\óÇ~K»–۰·Ó?— Ź3KDKauˇë»‡ţĚ&(ŁStq 0ńü÷š+8ÖĺŃüňđ€đyŠÖM#”\bŔúŢ*jka6ÍăŕöďĚŚ&˙©ą–Äś|W÷OľP$ąĂ9䍂@ŐdĎIěË’…•…Ŕ„Ę´„J®%–gąÖ€š?{†ş}ŠĽÚ۰‹ çóňi’đ$ĽËc° €ŐљߏŤćĹK2đÝńŢňÖ‰›.áM;"ý«K–Ú·ôO×WSwšęďÖüR:,Š…çnň—¬[]3lOľ×÷ĆđV1îâ{-ORÎ÷ś‹dÉŕ`N¶ü4© ("˘ÂQfS<¸XŇČŮ@H<ĺ`ޏ!Çďţ‚öb_e5 XhđĚ~\,íşQ&ů:łÖőQ<Úˇ?U‚='Ń>t"‹Ý“}k*d§XÚ„Ä_¨™ôĚÇMÁEgŕ€"Ýšţ„%* úQá»c/Žě™%HëÁO7Ľxşň§™¤[=óüoӫʤ çAţĎo­BwM<łřQZŃŰŃtÖ]šËo—`o!úž©B¤B㡾Ȓ¤µíîN_©č§’š7ô“Cö°”ć­,Š5§úιĖľ¤Ôm ÉvLBŢ©dŔU´Qť+Lş,ź'ćvĘŽb­®&!űŽi¶îXµđ{ź1RčVőĂyŰ8 ă[�ń®—Y)’SJÝmňˇ>ů8ä¶Řjţú“ŞĺŘ´",ÎKâŇ@ͧ<Ç–_üŞîŚĆč°±qÉĽ´5lůCw•1h«Ją˘—żW-’†\t×ŕ.'ĐN7/Í&Ť}»9„c\ÄŇX;@ĚFl&9ŽlŃUĽo âĐ x›f{¸oH×ń‡ ˇ-\+÷‚ŠŽ± ZVZ§éźĹŐ~‚A1V|j7ń¦=ď0ˇUˇýă5$[K̇w±? ˘á… űjÔć‚•äúÖËŰ&mŮŃS î'ąŕ9zJËĆ!iBnşě,ÝSXä¦1>Ď ˛Âô©hÁ&†€!óY]GÓB=AśvÉáÁ»Ó -+qŽXŹ |†š 9-Aűşjr¤Yqe2·?ĆźJý/wšż­T!‰~ěţľc[˘V „řk´Ď’ŤÎtÖĐ� ÷Ëw.žxKö]ŕ0>!CΓŔĺÉä7ě˛˙ĺ‹YŹ÷z…ŕ Ń88öv— Úf‚@%Ţő”ŽW±ÓŘÄĎĆŮŕ˛�©˛łŤuˇĂÁăimÂNŹ·ę̸X4QäÍśŤúÇ*TĐk2Ă >Sóß¶ůcȧ¶M’żĺŹ?-ť‡T#Ú´á7ȉƷjĚ”1ti¶‘™ç„Î]ĆM $Eyôúőš‘s»ŞŐ,b‚6‘főf`}©sçO]T§‰c ăŚzZ:5”j3Ą‚îvĐ™Z0ׄňÎ3^¦§lđ5+ŘAÝž"ůYŮc•Éę9ĎL“¸cÉęĄçY€`†4sËwúŕŕ ˇ“ćJ€9żÖ<@á ©˛ńćÂJ˛°ńŢ)đc9Ŕu5jg•_€B5ńş§}Sř¸ŮKđ- ęn©jÄF‚*7RŰđ¶y;JsŢÝĐt©úAĄŘ ×Ü×c-§|Z‡çÄěÇ*¶5Ř<ÜŢŇ™ô•äś6Ú˙µ%*]E—/RŇű¬ŕD˝tÜę{:žâE ľ´¸xţ˘ˇ=Ą ŕV ”öd\ ây…łJ­Ö—(HH†ů¬€QŇJÄk\¤hÓ$şĘG 3Ü˝Mö%çYŚCľłcĎ •lWPÂi/ -ŃöJϡÝ`°É,….q }V•@Y&Íąô|…r]a_˝Rý+9Ľ¨Řż+ĺmîŮe#H·ËG ÓwťĂl0Úâw±ť¸€3ŤşÎGa‡r%|)'“ŘX·z!ó×ÉŞ¸UŞGť8\×*ŕíD#măś“X"¦<\˝ŠĹ§gŃľů|ńG­ż—¨AĆď§c΀uU7ÇŁ|7 n©ál—ÄĄýQ˝‹+łújrG Ö·­×ě+hy¤ÁÍąS¸űF–”jžđT˛k/|6âÍdzž‡˘N)ú•Ë}ą¬n ^^JRŻĆľ^Ďx *Ň5ě/élUֱ⚡›YŻ·`îHW§(Îíx®L,Xws”v="Ë«—óݻӿg%\ľ đŃ[«`Ň5łÁé9?qäćl"žN<Čv_@řďDůŇ?`YďĘ$> éĎBŕ}oŤ ŞcݸKěPŞf©¤ďg°˛™ú3°ULóK'B¬’ “;ĺ{ şÚŮ™ŇTAâ‰ňŔ<Ŕî¶Śâxt­­ü¶!: %1ć›ČC×röľWE‰@7p5â›Ň˛XŽ˝h F_ă´^Ę)ÖÎY1…ť ĺö–€&t…Ű9E�/ÎóUmpŐ3N †šµCĎ™zuĽKë‚qěâÖg[r ¬śˇÉlWŚň,\ž¦JGĎtSŮfŐµó΢ť°¤břŃEę”m÷Í�09ĽĆĄL)Ž_ăměâTTł)¦9żc zž§‹H9Ť·˘gp÷Ŕ—Q4T]Űk©Eőľ,@Pí…Űâś�g¸D?5‚5_wWš¦Á'ę0%Ą®1ůĹĆńI­Ň#ľÜÚ”Ö´ĐŔ`" ˙Ărů)Ű_‚;™«ą/չ̡…ĆńF]dó6]Î9…±… šSŠ Ť˝^ťëQ{ŔŕE#Q;Ť/ś_/¤ś{PŮńAÚśÁÝo%JĄŢót·h4ąÄ· WµrĽĽamŻ©Őľ˘GZü»źÎŔ‡dĎńęI˘¬ľ€¦T.U˙RĆeí©Ě?Ýc±HţRŕŁ6UëF«#`LnŔA,–tÄCA4¨tł~żĂä[iŹń‰1™:„nóév­Ë„©Ä6^âIĺ+S0*ČAt†Ď#ä)­ă%stŘüµˇXD'@ޡ±QL«”WAďÔîNÝYbµ/đ·bĆśéÎJjKpySuő t>ń�rFH¤Ü†z,٬‘pK÷úŘÔŞy\>V«Ďă—pdţÜé@YfO T6Ţd˛3±ĎÔ-“LYĂiç CÖ"ů…ˇ71ź3Z¸ŘxđŚ r׺XwĚć l¨ŐŚćgÁžZCůpu&ôô‘†h$ä•éęŐ}x(›*‡<?ď…bĆT(A,+pŕ€ó?I‹Í÷`ş“‡ČJ|?şCëTül<¨ĽrY‰t5éőűUuţ 8ßeuZd h,TC„Â2X¶™‘é3ÚzÝZĘq=BđütßQëe˝Źí¸âY#”SEžmXĽG±ýwéľŃ6í äĂ)ÖŃ}ęĐoś»6CśÖ­ńźÄÝ­‡ŁµF#ľ†Ę‚ĄôüÜEÍŐîý)ȿؒq˝9G+KÍ‚ú·Ăb»#«›%dĺ%‚np×ß4#ýÇŃGćkČ’Ŕ9éě Ű ©€Mměb®fÂŢ hą¸ö×n‰UĄőEÄTŚ6 #GŔô&˝´W ‰çźCĽăŻń:ŇI¶ŃłgĘŕŘeEµÔĄ‹ĎL(ŞVőËVˇçĚf“ÇĄüĆ1ťĽŚ×ÁńĚŕŔŤ–*„}â0ľĄżSd2‹ŕújÓ\–L%I2Ę٬lŻ#éąVSüźm™Q†i|NŢbž őśÄţ§–ËŔš2ď’ŤKž_’5Š hdŢ2Šwq)dŹ>XËmóUaWł{,nŕvÂĽ˝ł·Â‡í[–Çî Ůsíă}Ł5blřĂ´n‡Ë†ň™–M¤—9MĘé)-ý RŢľęfŐ_±<? †ÓÂâK/ Âkt€2}z[y2* z3ďDHáCA:F“nĹ€EĹ\ś6ÄÖý+*€ŠD‰şɑբZ+ŞVkŘ:ž,PÓ-űkőÝZ~ó jn;M5™óĄ6ĎŕKfg…KGąëŮ÷źíCÚÍß˙]ťÓ ”ź˝¨Ü×ëô9txšXQřąË¨ڞíä°żĐÝáÍ"ksH艾.‚ĘÂ,tdY˘˛ł ˛§©AVH-zŘÔT@»sH¶áusÓŽśě{}é%ŐĽ˛˝w9Uř–v„=A+ ‡Ż#%‘ÓžáeŔ4™bJËżëć’d· ź&0�WôxĐËáÉ]«ţ3?ś„bšđmłŔrűp;ŤIáÄ…'˝7u?;4źr"W\Śj=ůörjĄ—X°}~3ę ž}čŞôÔO|`aíߏŻTůUžŠ%Bä%/‰±i‹Şť_ĺ5©l^Ąr $}(f%f´jWk\•ń<läęťNŐ¸—Ú‹ÚśŠŔ›OvŘ@DŁněK?Ä.uÂVyňŔLë’ř‚ˇ ĺ4ˇb7ź�ÂzBä¦ĎĘnţęÚj JJtőx˛‘çvĹâąÔľőî¶~kÚJ"¦I9ľÓ žĚÓę@ Í‚űyÍ®‹ą1ű}î JĆg´ÄhŇ7^ĆfoµËˇ>K»Ă#é ·gEr’ałGě¸8#@\cŰxî\Ü>jźôÚk¦X፳ĘRSG¤|§#h>U»~°űF $jâ=ŞŻéŹFŔi®ŚKŚ>¬’üi`‡y ‰}¶Öć änjŚu¬?…ȩݪŔ$Q„.h‘x®}ęcgÂóxË˙Â]j4ľŔŽ‚YqŽ€L+qtpǪ́hjZśţËé¬J5fI÷Ű=‚‹VsÁšdÓ»ĺ‡Űłuˇ‚~×ó ‚<ş*wÍ×Ň †Aöz…CÔIÂa Ď@In˙–ČŽůŻ`pÔňÄŘWtBX­Z8,Ý"Ţ2x-Sl %ß!ąĎ qËń»Đ4Fw1Şł‰8Đűݦhőö(Öˇ‘î÷ŐŘ8Yż‡�b‚Ś`·YÔÝlď\E»đ˘±h^ü“$É›¸Äß&Ą™Ţ[oFsż‘vŞÖŐ Ćҫϭ‘Đd‡öNúş|1ÔUů”*Ë”‚¨ş<čl¶-Ăv…¶Ëż9*:ÇŁ9l?¶ë(#ŇóŽ%Kgť$Š–öiĘP Ü‘SYNAßč·’X“p«“ásű=-¤ˇISQ-¦[°ćüćźAřQĆ0§ĎI¤h+d 2�0Ó+ş'«bŢÔŔ›?ű}+•(S‰q0›ČO˘ #šnµó9űx™5;ýtĘşň§üëŇSQNoÚ®G!—űÖ‘nĽV‡{,ř“i5Ś·Q=–;&čúŽšR‡äŕÁľęňż`˙Y¬lKăźaë–őĺ#9fšŽď'űů&1Şb\Ęś-A^§ÝΞ÷t‰mĐĆ 2Î^›f úz3ŤőҲŁ}$b=1Z{ťr-W�În”§9ă§Í·#–C8;/Ţđ«[Ě#nň±a¸ŢG­[¦şrÜč%Ç×{‡ôZ-BŇy˘ Ąů‡mjř čS^ăÎŰr¨}ŃřÖ˘ˇŐ–čŽ7Ďgšh䏷7´­›O\”ŽĄĺlž2šŐ*&á9ÔM¬_§Oďןś»ř(+3¤{Č™ÎÁ‰ţśÄ޲™§,dAPŔ—8¦Âů€‰Ą`ŮşáXWkQ¤Q¤Ľđ'ËľSţä°ëĘ2µ¶T¬Ď„P©ĘSG¬ŕ?<ČľÁ€ż`·s,ű2HwwÄŹ2nŮ[ľÁA¦�‡ôäĘ‘Ş ŮH O{PrúÍěd‹+íöňMu/QŐHŠ1>ąĺ-é^-;\ {®»űńâá88SD•ŮE†üş˘ŽTMŔ_^޵[¤<úzYż©L‹•1q®˘›ăoíĐŔ´W@eÇ I1 Ž‹qJ~nwIĆą4•&]“Ŕ×ę.ęÖ“ ĎĆjĚWu15˘`Ť»©w†vuďî>•iK­.ł~É ˛{­¦fS[óÎŔŰőTđL;ľĹił›Ô€‰'Ú"8´ kö p¦(BÄr&´Ż&ťĚů©gĂźlÚŠźÇĂTí˙z^…­<ICBń§đ<o›O‰Ąś 5Tąw•”ňŇÝÝźWiÔn� t7VjÚÉ�úě}Úä–«°sçÇ1ŕu¤ęwµćä‰!LziĐO8˝Q;ÇĎ&<ŁoR§°YŐ˝kž6Wаy=YÖ| GÔî;ĂčeĆô|d‡ŞY÷łÚ†š¦gáéaçă×Öž�‚ ‚˙ĘÎöĂă'˘n{fę2ăzXr$W>3Wkč8źü#ćüm,CřpęYµg‹jm*{  ő+E;wÖtÂÁ–*•íXY¬Šś-0]ČHŢ!ĄÁo†2§ŞëĺŁ@7Žź!…¶H ,K ¤ĘřĽ>·‹×Ä.hµëÎ[ ÷ĚŮ<#ÎOîý‚!ÎćôNŚ˘ÎJ´Ľ®Z§”p;Tšî›Ön‚Ö™ťbŮ޲Ăę0.hŮü¸AÉI+«öô_q�5•y˛…HÁM`IĄ¶›’˘ŹÄŤÓÔ˘+]W@©·FmąÔ×nţŠ6Ă´úţĽHňO»Ř€ż-#•Ă 'ďúşoŹH„¬©7ĂŞĎíŚî3¤#SÜs|Ëń¬ˇcw[q‹±ÖčąÂß´—#™Ýs?˝$ @Ł··ŕĹśü0&˘Ćę¬hŃ÷âšČz*ú¸áŢŢSâ3BÝ“ŽÝ.ľEe÷µ×ŇÁpW,*"§Y58`†ĽÍjłIbp–É*kA-š&Jů"±çö€WŐ)s´cĹ&­J)KlýĽT9˛Đ{řžq0:‡{ţ¶y{iŃô_˘§§ -đ@~Ëňë¨ýÇ[-TM®ű—ă[2&Č1_…Ĺľ„UIŮŽ•„4łMĺ>YÇÂ۶_S%ÜPˇ‰=y¤}úTŘyýqşľ`íÁvŃCĎÚ/Éo»Énwŕű±KP{ qAJV‚޶éx_TćpJUđfŽŹťÜľóÉ+Áu7žaÖ'm™íTWń3ŤÚzR€‚ßśĺ—˝Ő˛Upď˙‚O¦ę4”*u†ľ*;Ąä˝Şĺ:ĘÎ啡ŕ‡ěopd(EyWźÚ"Rş+eú#°Ăb‰ř dŻ+á#ôŕ¶IŚA3 •_7�§žúF[Śwľ2{d•~4źĎ ­Ű RiU<©şŹç~ߪhÓŇŔ a›ć™ÔČă—ä}ÄťŽ7¦µX(xQĚúż®¤QăŰř‡Őöeş,‡xÖŘ<uű¨~ýÇgVIôż˛\'vîŤoîŘ€îđZď5‹ďU7s묏Čv1[çkh' Cp[”ŃŘc—ęUĐČÎo�QĄëz>É ”re˘G#š\Jo&bÔjă��Âz±“ť����ř˙�öçâ„&Ž´VxŘY™4íż‰ÄŰ[úXxŞ{g »7›»|űëÓ„đžöşÝro`ڽX…·˛ĚK1C!QŕCtráy&W6hšrčâőwxŽN0ZĺüvLěžń„d雹“, ȵŹň8›Z—ČZ2a@ş&ÚďŃ$bR8"džëÜtŤ®KÍŚĚZľ~C™mF^<‹WmĎXďqóĐm„ŽŽ‚—ëî"5/ĎĆőĆzuŮ“ŇwG”1Új ÄÇ)&1e~{? ěJi-‰-mŕ <ęÍ }H  ňč.V8 "Ż›˘·‡÷ĂÉK1 ?ÖŹVZ˝‘YĂäu”¶{÷˙pÖ]ëŐŮćűňpOuĺŤônµR_w·Şd%’tĺâzľ-;­zÉZŞ,‘xá—‚˝™Q´+t#™}´‹#qćîŃEOˇý`8RĐ~ü‰Źüއ;W· *Řž¤…™m‚P#é=>G*¸%ćzGPÖŁ 5ĎRJOî—Ě^‹| Ľ)˙(©4m[{ő gĐð´™5-÷ Šŕť>E7Đfőm´Oš›řôhM`žů˛ˇÝuŻR}ŇYuV;‰ŹÔč˘n•íiËä[ŤŻžAL˘,ö%{…´›W}ü(ÓĘúAîz÷OúŽË*ÔŠ=?tMhU‹Ş~”ŻŇˇ@ő­ť軟5‚lBlnüě­Ňtt¶!N\\hśÖ©uČZ‰čfńÔ–ě|Ö·˘—•¶—Ť2žFÉ›Âdť}ÜHí?¦V†tăZĺ6m–6 ćy'6¦FآĆâ„ÎQĐ^·Ód>™ăG\Üň\ű¨^ç×! ¬Y‘RšüýŞ…sßĆPňţ˘ţF‡bOpĺćČ%ËÎY4đŐž7žhŚY¨(Bíó_9‘4O:zşŰ±şWdm´ O·šÚ2ř—ĚÔÄł+Tł>vß~3] Ü_S9ź{@�Ň*7ö“Óö­Ąz^¶U˙şŻ7&ĽijËlĐÔűźŰd´+˙ϡ€pSN`T0«ţŹŮWaŘV /ói^(QżP7:" ŠçńU= ö3aL5`D~äúŚ…>ąËŤĐžl5….»ĺÖ¨X?E˘˛Tç×ĹE»‰Ş¨+ž^)Řw}Şgx1Qż< Y ÁBČ7\ňˇľŐ,äoä.=Ż;ëđĽě=¸MA^�· Xťiß/– ô©tfMJť﹯Ű;ÖŚÔoÚc?›ĆßV…\—HŇF—{ř‰[’~ˇt°’šęŘ,€coX«Ë;ekdů8×;(_Z°šňaŃŐ1Dö7|w{sď+ń¦ÖG8Üěí…0ěÁ8 ‘6z9ôb2CVR«čń±ź|ÝőqUŐá‹“K[(ĂLP¸9°‰B›˝d.*BŞhŁJöĽ¬Pk0éDŇ—L7ŁQnţí}°E:Ô€tůłi­nH±fŤéTčýs­ÄÜűb™HGďă3K÷…6ŹaěY°€Ź˙SŠ ^ŕÜ˝ÔţŤă‘pZöéšź¸źŚ.Ź÷e’úô˘Č=ë¤č–Źŕ7Ú7†ţů^x99űÖŘ?őíę·„‰íţb6ÖęfꟉ÷­ęŐY‹}.nUĽ.8¶OÂ\‹µ&Ô Č6ńYŻđĹO,Ą ωúFďß÷$ÓďĽX#"ôë ˘Şť p¤ş~ۨäËšĄ2^Xěcĺ\^üFµ!ĚsqenCŰĎTčnőŽ÷CÉ61ŐŻ8˝6/•¤*ąC:WSĂîŔŚ 03’ôl»9]ZÍ5aÍÇŽ™¶Pv/™‚Ť;g!fLX YđfďÓ¬ç‘Gs×t-:ÍĽ!ljnŃ ŘhšĽQk#^éɱ*pĐ›Ó7ÉŔ…6Î{Żř:‹)·ŃĄ •äµŢŰň©ÎÖ71•đb˝üśZ´ÝÜę¬cOŻy�“Ş+loŚË‚ߤžR»Z9łFx`ş Ő1™ľÉnĄ‚¬šĆGň«eç;Ř aAäŠ?öá\ŃEC‡EŕmY.\[iŁĂćÔ;MĹ›Ć,ÁÁę¬éˇ'O`¬pŮššeŔĺŃŞúy>\Â’ě*c^µbÎ…Çť łđ»^•ŰÍŻ"¦÷Řś†ŽĐ ç€ŮukŁĺż)xÓÁşZ Űżä4ąĐ!‚ľ”tüÎśU¨đě⌓&ÔáVeJvČş‘ şkŘqčÂ[lxAivŞNK¶ó ˘]Içćł*­R;ţw/O1Aˇn řwécôA!]]z¬“öś�%ďjÇRfÍK‚Ď Ás®Lëţ=5˙CžRŔ^óčř‡+ň–‰Ű4 ;”ü–˙Ně®‚Š˘“íÎ0śÖ|)ĹĘđ!Xe;ˇ±:‘˛÷÷ 30¸@(—Ns™˝ć;.ŰDľÄŚľPúťUÝR§śjüź8 ě2J †_R¸ăEx­GNR0’ž»ľÉ6ł˛ĘÓbŢw@2€A‹]yµ?3INDď9…ÁćČImĚZy±".ňR|@c×—"}cCÉ|ó$Pkh+ŮĐŇö•ŢoC§ #“űźoŃ,Ě&—XČ……LŔŔ±qUvŠ$ŐU+Ä !z�dĽţ€ÍÉŽ)2ż|gfYXđřŇľr÷ŞŐĐAUş¸CěËRČ÷A˝!)H ŁĎy±źÚĄxUAĄ…‰GuĄXÂŘ8o4łKĽˇţÝü©W„óŁŃ¤l!ě›Ňń¶˝üZÖCÔ4ľ9ţ]>łÂ§]ŹZ·}ě%ĺŮp?îRĽ‹aú@˛ÇµN­aď.3çU9¦D fůŇĎű5Ň&.°_w­:«śoTÚ?Ł3m˙ŇÄ»ú4jȆć7Ȣ :d®g–„† |Á­× c€u–ͮ׌Çâ})ôĄŠ8G9„Ë‚ZĽŠ&hÔ©ě72]+·aĎ˙ŚÁ ń\ÖZßą3Pv¶Ô3Őç(ř Ę {@ŤLŰ×m;»Ô.2&­&^ĹÔĂËkÉ«ţúŻ˝–¶ Wú4›eŠwŢ÷©Ş˘ůĚ“.P>đĽEşáĚ]Łß[í\ĐóŹ~ň–YŔnî Ąo­jăAë»V /“zŚWđ̱Â7ňÔvf†(:e§DŞ•ÂĐ ZŻőş&ěLnZ9:Ú¦ťŔç!:óY›:+)=ůÓžŢFá˛sŹĐe/Z2ď`˘é0wKˇ>ň%Ër]ßť¨©¤'šq„đ_¦7ÖsÁĺ%đé±iLĘjŁXAňWľŽ<˛ŃK±MÔ˙Ż<TŃčB •šŕĘĘzéëĺ4ĄU×íhźŠ řvmÖ „řŃ{XötálÇ‹E‡*žŞ>ůžE4ď) Ľ´x Crm;±¬¬nÓ^Oj¸7[Ęqx§>Ëçŕrą%„ľ’]uŻéďfŃNO1‰09r®oej'Ćä%%“ú@ S*ĄýĆÇ_č ů,¸·ÓťÝÍáëRěPâŤq[´pĆnuc¨Ýť!ł“¨ęÄ0Ć*M^†Ř䵫j{zB2ŻšTI»Zá¸sń‡–[w/Ĺ>±?"Č)ô™ŚÂ>ÂIĽ6a\Cďj|knůŢä˛0/Ó˙?Ů]Ăar‚zé<¬ś2°Ô“f¨ÖßäÚŞN|/×y1›öÝĄ8ߌ[˝.j:3®ôu¬ž`{ž«őü"̲óRĂÖđ,ćhµbFÍ,4y-zż&i®"Đ·âć˝1*ÄęWI×*×ař`ÍĆó+í\v}],Â-čHŐľŔ§ÍoAŤqŁŽéă{ŰÚxpa“ťŚî.Žŕ˙—çîÜfč] yÄ%kg‘ ÷ĂZŃž…2'¤4¨vĹ�.Ňaü÷űzQ)ŚŚAgÔ–÷í!@€PDZŁQŰóH;áňł ~JTo(bÍ(áĹÄ/®Uwž[2—†.8ˇĆđ/ç)îŐ) PďŐ28Ą“Ň[�ř”ËN×kŞŐďlâÔ�e:řů» *ě¤37É2>Ăľa‹-—« Ą#1:üĽ×˝`u‰eŃbëQúPňAcüë-hq°ęhZJ‡ńvŞtă;±Ě)Łš®•‹ęÇĄ¤B¸–=˘pü4¬Ür)„¤…¶§ˇ†ˇ|E 1“h[˝ěYmĆág@Üjzu^‚•#_hJÂSyćźG€j[üŁă<öwęçř;QékLFw8ĚJŁN?¶E śzď‚GV‘ZŁZŕÚ…Ž…żCIÁ÷ČYC‰$ŹÂ‹1ó^Ćy_×#öű7-UÓ´d.g”:˙»b[ćŠ<Amň$fš˘ř͸;.Q÷Y% ŹY6 Ú_MĺŁ-Ö]>ÎrI®Ë0ľm�TîëČŻ™ĄO׼ž3�Ş\¦ÜJ§üÜ8}iŤ@…†ho n˙¶ĹtÎŔ\!P˙Ł€Ţ˙{…KʧÄúEľH]T~…3]!ÁŐ.Š VtyÝîĚoáŮÔńíbçUÄ«”l:8kTK1˙ô˛"ŘBm'ĆÎ5q«±ÄáÂIě“·€/ůŘRIg Ď‹źÜÁݰ®RĘř“–űLŇ Í?ę® ŐĐh�0–˝>Mü^ĺt;Rn|Ţ(Ęmöť„%Ë]Ą^ÉöŰ„ŠnöěÂ%!¸’MA—0‚Â$ľ ç!BRécÚGµóÄ“řKěQµ:$ˇoSfč|­˙nW:٦:ť ”CňĐR¬~ÚBš:¨›\|äĆX(NŤ[’a 2 «şč.ĽmpáQÔđÚ’…”Oß$óŘmŰ�¨|I@„^‘nRŃúŽĹv,‘{ácp¬ł‹F7šs33Ôůóą^§)ăĽÖ¨ŕŔé@dĹ‚s5/.iÂCË(DHżŰ®2¸ âŠ3ﺉד %eąĚ+Šý|@źI^ËR™x8É!aĎKgibú0BŰ”[)˛Ú|á¨^Ž[€Ç‹p óuô.&Ĺ)]šČ덼ëóĆŞ8ţué•[˘Ńôîæĺ2ŹéPŕšłŐ—’+žŤŇîOě¤ô­Ą^Ĺ›ń$%RŻĄőĺ ńźš8şĆ˛iN)uťÉ­°Brü@>bßf§ţ뢻KMvĚ9°+¬’_!ä ¨ďI"J"ĄGIĚá“?,UׇşĹ*źÉQ_uäČ­ ccÝÖćîäYö™™J]5ş‡ $ „DË|CĹIŘk5qN«H#ÄęYż´j›Ő˙YŽľŠ©şäVÁŸĽđ’á¸ÁoëËĹňspÍő·Ů¶é…·śÝv—É72!îń†š¸Öąďăé .–g ŮĆăđ”ň7Ɔ[U ]4ľé�#Sú’0ŤJ•Ď ˘zşţ•«ô.·l2 >q>ȉ`e€®Á]ě™Á™źo Łd[ěuyăXÂdóŐŔ9âóţDfMi´šÇ^@6Żă/żŹtV•Ż`âI·Ü]o=l¦-ŹÎ�lď�ŻN}ëF¬PďSu?ÁóößÇ€ ŕÝKj_´/fö_±©Î5|'ň–Ra cÄ=© -†ł!÷Ě›xó߽ۻ%Wjńĺ‰q}|<-żÔX3]•ë›-‘t¨6…6¶˘žŮÚ§=._ô–éneďHx†^|ď+ĐŰ,OµcúS¤r•ÇH•OŤ•�…f-ď˙|ěŕČ=·ôÇc˙Ýš ĺ^^ 7?2Ú ô[˙Řű‘g7 C=™FÍ$3VŕlĆHs—ôůK:vűą¦śP>VŤŚ¶€ĐĹFJ/ô°Źń|űÁ?ŢśźÚFAXŰ�Ď])Ťéľ•H?řˇU‡râ¤yłŤ…ĎĺČ[ćÖérOÉuĂAę!żzsPů8\j\Ť›$>~ßg÷*{+ ¬J`]Ź ¬^ ´�W”–9»‹Fś°>%®ádě&öţ€»ěî ¨µDŢ U-‰bÂ./yđtő2śľŻ†QëtÉ{ňćΑ+oúŻđbźžM\-;šś–ĎĺM—µëśş”rŠt`CÍAvꢣZ‹µÍĚ´RŁ®ĚYŕűÖ|ŮTTô7»’O‡ĚŻ˘¨-(~ažŚäĄÍueIę1+óŤĂ%r›Y%—źç0ě ˛"K´ônÔסaźBO•CHoĐĆTs«-6ň‰ŕő±cÇ4 9á>ЎU6Đ:ň•±ˇŽ§+ą «€ćkÇo†xxFą-™·•¨ě-hŢŕd“¬sulě†f ­]„{—ŻÜ‡úq†-[BK Űł0ă íł•ę9¸5'’Ŕ݉@f“ú}Ą}(7µ«ÜQ6ŁŤNŁçăX> –¤sLKj&űJ„ž(JËGń1=äÖIdvmR™ÚŃ­ü—ʡoFMsýâÚWÍäÝ —ÖâwÍgEł´—¨Śţ—ˇŹ–Ŕ]Ćň"f<ÇYŢ˙: 2ŤćGÍ>U¶a9'j_u`eǵh}ÔôpŞŘ+8%±EçoEn’KPLť!ĂYÉ) 7ŻčÇ”ÉĆŮZlěvfî­7´0ß\ČňXÔ(ür÷'Ń «gčĎϧÎxúżźł—1íTó~‹©ű&ľúö­1µŁŮdŻřaR„Ű” €ˇđ”Î*Q'‰Ux”łH¡ŕ68•ו×>ArE|÷ĎQśW"ł4V"ć︗ĺ§F;wI—Ď™ÎňÜ'ŽŽŻŮŠA˘ëÖ˛µŰDŤÓy?çEřz‘XŹŚś,©ŕ­2…‡Ţ‚,˘P\ăëGH5 9qČą®Ď{3AĹw*—4Šx$€GŐ‚ÖŚ GŃŐ¶Yd +Ť-t2dj¨ž&Ś™YdżeÄbÍc`Ő^ŠQ§Ň–hşˇ ­;°µG¶Ű‘úÝsé^DX€ňĎ™§ÍŹĎ­n® eˉí¦ăk-ZŢE2ÂŞ ĘüŔ©ş wOŮ•0óěE Ô  óĄŁPôB“Ó›ęsʵnŞIl°<_ .zP,˛ů®Í÷Ę˙]SËÇ–Qëĺ7 0Ýßöô"HCCÜ,Íöçj|j’…'Ę'^’7_"~ô=‡ä&ߪ.yTŹ˘&† >Ů?CS¶ńlŃžCŁĹAîŹYKhL8‹ż�#8ô Ň%o‹~ąäý†fÓatŽębó!ű[vvŠĂóÇ‹‹µłrńd qÖˇ>ÎS€í܆}n ‹ CŤX¬•˙qwń7M[ˇŔ6(q_Ú*ĹmŞj ě?ÎŹS«nś`ÇčŽă(đD>>e˘…†{šWu˛YŢS’Ś”1Ł. kžO•B ‘ö¶ą°nâ˙ĆÎW:ôE«čÔ­›ŕç†"rgu@ˇŘ›HY ŐŻňy§v°gy»/@°P˘¸Ą[YÉ@Óľď?łÖůĺU¨~1F0;7‚žŃńTŘ=·—¤Yxň»§.ë1}Ż2řŚ@krţ2ˇAwÉmŚmňłÔdęîNAU¦v‡5Ó`…QűjŮúëqöŹpöésŃ?čáV4˙ĹÇ"b—3®·O_Ň=…×úóäaw¬˘.\,‹űŠ­Ďć¨%€Úüź®Y8 u4¦ŃíŇr¶2;ŻŁÝÚyĽÄ#¤dłČÖĎ‹‚×{ZˇŰ„` ě V\)Ş˘…Śy)Ŕ KúG é ”—m—¦$Ö;Tďp€ Gť¤Ű{™č{Re™Gľ…ŞŠôC:ËT4˝Ę7ŰÁöwd‡ ]wţQwôg´É/ýéůKĐuÎ<| g}ů%ÁUőđ5BČNdĂ�¬6"]¦¬BCR¬Îó3§­„~n…đ^I…!Qô6]cjb~ ] Tâ j-ÂüY Ô0Ć :~çěŢpJĆ“¬“”Ŕ8úĘëđČuťůĽŃ_KMY¤Ęˇ‘“Ś)â±ĺ: Ѣނy’łPBô8[gÝůŻIáKtî=ŐPrVrMýŁÚ‹[㯕 ‹Č˙”ě«eúýU6é [|đ˙ČÚ 5Ň·]¨ÎľĚĽŽ4Ý’,S§Ŕިŕ®É¤1„AĹ»˙jmőA…ÖňôG6GÇŘtI(µĽP#I8E]*ř^=!ĎN-±3tÎ~çőÇ ˛V¸^€7Zđkn}rĘhU‘ÇŹÖ;LfM5żšÇαĚö!6¸¶ňwŕW–Ń݆˙Ć’Ć+ŽşŘÇ#jnÄŃ"?DßůţůÚżĄ DÇ�§2˘űs&‚„YŽcîśĹ=őíQÝ÷( Ëu¸4>nyk©đgS•D{‘ŔăBšŻ¸Ź\SNçjÜÍ?ůTľ “Bض:SRüzŢhŠż8�fé…S,«Żýb÷N@çZ`ŤŻ]eź›˘4µţÖ¦‰¤°S߯ł!ĺšă3§w®ˇ¤37Sž‚íöw”ĺ~6ˇ°ĐixˇÚZ‡Đ1žÇç•FjţŽ˙ż@ bź\’Üćg•Łă,ń^cwŚŽi$âČ6˙ s×gŚ6ńs\žôŽÁ͉jj"íĹďZvE• DZ±ß_+1ţ]«˙_Ţ@ËË~lzsŮsEcKíłńĘ×dJí«÷v?K¶rTÂNë·ŞâĎSĚ‚ďŐŤMlÝŠ‚ÝB`�Ą˛ Ňúř-…ň ¤HR0jµ÷´$ŤKo¬·¶ë'•E [NÓ�ĂŤĚçÓŁC'łůńZ}BV¶“zç˘É6”‘{«LNÜ1 e’ě ł4)q§K«bDëM’ú_L f›zqÚ!Q?qÍČ˙ń`Ăc4çN]ef=DëşgâwăKCźč´1*Ť¬»Š°©ç‡'gř2¸=GťB ŞJ$đěI^ÝŻ†ď›"ľf1šŔĚť}çő÷ Ćă„–•ÉŤNŢŻ›‚p ¬,>ĐěĄf×öЄ�uDNóaôŠ<jŤ�ÎS˛Ĺ6Ô0†ČGą§J.˙ÇFzň*Fâ%ÎOß9͉łvąĂQ›]Đ)÷ąËÝp îďV4Řőy“@ABń>2ĘňžLh# đHвőI”*jŐÇ1´ŮdC*2ĹłPŃn ńT/9Ř3»iłď~ćŕĨ˘ý|&;‹8,ëóÔ Ź_¦Ú%Ěp\¶ţź†w‘BöŐ—`äMĆ‹«ŕç Q"†nUţ”ďĘĄ{0ąÂY� ÁŰÔČp k©Zž™äxjżF ,T¤|çĽ ü9Ľ˘édz÷ń©oXŤŚc[ 76Ĺ÷ŕ+cŇłšĂ˛scaĽd6‘˛— `;ď‡{)�Qz2ú É Ť©/®®f„©”ĆĄŔ(Z?M“ý Ťwiâ‹˙CŃ×űŁłp¬ÚŇ|Uőť_q ‰O†úş4ç®Ú Ú™Á(ę˝_śąÖÚŤ˛`l¤µ7 ôöÔo26-Ú§Ďwç˝ý·m ňr†±‰×NÂ:ńúR%Ňzř3X˘N^űfHG:ňK˙lCţMIśařî¤ńAőń/´¨GĎÄY`<#Ő‘˛ .éţ‰nׇ3{d!ơĎÖTęúśú‰wĂP/†eŚ[k5$ľ°Ł]eŤŘqj­ŢśEą F!üľ5Ńߡ8mIź-®§¸ÂşD\}ë v”‘lK×yĘŘ1€ď«ö‹­çć Ń•µ±¨4 Aâ‹aăâłghALmlŕ˛)Ú‹¤¸Ő­öUôF—vŠđJWWüÍÚ/Śy¬ŢL~ ?Ę|Ó\őáJ¸ô‚ošęş^B Ěý*$=ňtÇÚü'I>ş*Ĺeç7ô úA‹Şźz˛ˇ\ÍÂLí[`XP@=CĽĺŇř|fk‘˝9ś9„­3WłYć__¸GQůUáE~)÷řÎś‰Ü;üČ«WoąTL¸Sîb˘ě{hÓşĽ!*}— \ÖŘTH™(¸!sş$$Ł4J~Ż?ž wéŞ-)ŘD˙C0~Ą”đ‹·}ž'íˇ <í’Ë­*ÔU]ěM �§ĚhžşŃ¬”6*ŕ3ň.N_4r_î˛ô|}ű…úhŇë‰ýŃÓ‰ś%GhgÜBäľÚűm5¤1 zˇő‚´ÜôâŇŽÄ*€l7dŐ—|Đë\ů|š˘ťâ+‰~ĆtĄw«?Ń éňtç.H 0˘Ü^őÇDĚI­8FGß@ĽľŽ˙ĆŢŁűzQ¦ZÇ˙* µ˙ )ÄÓű>ŠOQ÷üľńţs˘âĘŰyČéOX×ŮdöĄo˝©Âó˘9Ątp÷L‘ę ŤT«rľú‰ ¨‹ß/sÍ»ĎOĽmk4ťO5"ýQ®2#Z¦€y&ĺ‡ĎŻîé€äüx˘üÍš}‹Íśżô.Ű8"g…ł—ŮCyJE릷Łᬠű żĆ˛UŤzájŕ‡ĆrKâťbq�qh2ÓÓĐëăSűĄą%cő•M~.ÔÄR•E“/ ›žçâĹÜ:µt&v‡|˙ě ęnf~ŢIöÖ<Ko–SĎęu‚¦®%Y—’ć’‘ĹĽ3L™sđ�Ś*¶×†oŇń˛ Jů]„ż×|Qj.hfîn*š÷:v¦_ăA] űgNźvŇR0ĺÁ-%ŃŹ8)z¨Źg”‹ ľÉ”`¸íÂiĐv6űyÖ–äţÔKĚ䯣ěĘĄBĆŻ”Doš!O˙ôTÖÚ‹|V›ţY-Űň°íú3«ř$ ”áVĺ)şuW«-{p˙|Úî¸Ű°5ćn´7ÉÓHűRÇi?OÇ­ŽîQŔ *€yGtfVtkŐYCŤ(+t0_Ś€eX´ř&řn�-¦Éh—�ŐYÇUŤˇě“a;Ě›­‘e Ś+ČA›ô_:ĽcĐMy)ý> z±f÷á„7„G˝ëâ+cŕ3‚÷E$znP÷‹őâëAć3ânŃWSăVH­Ibpń>ęč˙âF<ťl™\ü�ńíÇr*”~Ýi“ßť6¨l¨ŹpÄzE¶ó¨1Mer< oI3a<ţRĄ¤\÷ßóo9ůčeÇŰň\d,]ş‡y``Č‘d$¬óF) źĽČŇÔÜŻ¦żV«Ď.‹(/z›Cś• ŇrĽĹ­/™<“¦ŹŤ–Ö¶ś€„00`ŇÝć)đ#źj_¶^&[Ś»ÓVřÄťHGGéć$‰Ľęi}Íś‚űŹq»HH*Oă=7ň×Ő×wmě‚â¦Ď>=ŘDŞÇÂ:˝ ©$—Ľ—=Ůě,"@hi—_ÜňaCřIş•dQšr”ARvŽ=tßź,.rë˙Čş8„—Ń›Z bŐË °÷ÇŇŁ KľćSv iĄ§/ćż…çŔćŰĺ•^‹j^A[šMuîB*Şýör-çÓ¨v[±»ÇĄ{±˛ ojŽĄ‹P×yĆ‚oĄ]žpgĆ·Řţ¤’˝Őýâừđd7Xôś‡0(ň Ś“~Şö|ZHv™®eă˝M2µ×–­(‚v)*µ.âð€S‚pĐ ľţ?Rż ßűâ΢~Ţ=’=Űż�Uřf?xs 4$CŢ,€™y"&J˙@L?şE&öDN®“ÚEiě×,#˛–HŘ[ á@4ľöň9b'Ľ@ô,Ô¤ż®š`owXj¦4 :*}­p*;I&¶ɉŁ‹«ęű“Ě‚¬§&8â®ăč2\ĹŔsçaĺ»xe")B ‚<ÖC%ˇSbACÔ ćÜ)Že‘{Ý6p9ľ7 ŇhřŇźětfyŮ YŮkĎxU©ź|’V¨ď?®ČŢpŁö4ßÖ¸űÄ×�‘“ń ś ’H ŐÖß÷–Ý« <zţX5>4c—÷ĂăvĆô9Ë’ASśU!tÂčYő±ŃF›XEšŠRo‹K4w#5–p ç˝©Ş–Ś€ÂÍ–vÜű-3Ę3”w+Mo`ô9ĄDŽSp`ôµS•"ahv~®!—‰mK·ëűĎg„;„Ťë-,ťb˝ŹF÷ÍEĆł*0ą}íśż:Ti>ű!«Ě.#źŃő(ť,BnęL•Ž˘~ĚŘ!a’đőícKĎž®šÂvBü9x†Udž)Ču¶żG€ţČŇčrÚýp׳í>-É3Ô•ÂU ˛­tˇ˝u±zËe+>^©ŤŁńU•˙3o3Ěɶϧ»kUXd"iov„ŞţÇ3NźvIT!x®§xq‘aźç¤mp‰Vęń:a1•Ň’ů/!Ű<Žň(ŐŻ›¦ŁßJ8¸›đLĐzî×J Yř˝ź¨mm?°ö™0óaŻSŃHe’­‰ŞĐ#lí”IýßÉŢIĘ YBŐŐńÂLË5ĺUnoŞËMccš”„0$ü"¬ę (83 .8 Fqřt¤–+ä`ŠÝs›í›Ďr(˙= űžL «{ѤŹ“mDČăhö®· nfĎADˇÂ„gqž–‘łˇ-Ťę~ÄůĄĎ3†EÝ:ĽY ;-âŢ•|çjL{Ow7…ËH0'¸”Qˇ—=đçm?ž©.ŁŐę…3śŃcť±oF>¶¨Ç˙÷ۨß(ú~ýřVbÔ ¬Ő/öťŮٶVč^Ć\.�©ębřG öĽÖMz‰ó±K{´qŚ.Jź˝[¨‡:@,Ő„1ü™_cWCNěXmŮb‹°=5)ĺyńĐ=|řH~/ľčFgÄOYš<^NęĹŕşakKq.0�ź6°�ŹôBk.ăʮ•î Y„$ŤĽ6iľJűn<>1|aEş4T+’vC»ĆˇDô!4™žÇĆ�–t>Áź\UŘ0Á¸INo¬ôK8×óĎD·Y Żî=;r>Ő<F[âÍô~™Á‰rNš©Ë+Y$i‹„ű°÷­cl’1?š’›4 đË•ęm1ayş|EĐéę¨.N\˙aŻšż‰ť!Ł|bĎŽ5Śąňmr·śy(ćźlqJă±ry˝ÉůÇžE$<¸bľfąApO‡>śCHRŢşë%H´śżµNWÜő2pöć˝+Hp\>Ł×ľH‰/Źę`ĆI&ăFˇt9 źJ°Q€E}WńÝۇĹöĎÄN‡µ˝±(Ρ#IŔ*/Z•;ÂűČŰßtű‚§ś¤¸(EĎ�OĂ[§ČF(–­řř‡ü€Éů6ixˤşYp’5°°]´6{Z76ÜĂ—"3µÂĐşĹ,Ů,ŢÄËŮ4Ü×$ó4µ9?DęSKŔáÚý–Âëĺ=ŚÝą€«*aé>@'•ˉóFSôg¦P@®ŃB~}ÚÓĚÄU3Ń[`\]•±ĎÔ{«= \Y™Ë"oHťźőĽîyë˛H7č5ŘúXŤľšÓ‰†/ĺ>:°MĂęGvXíž7Q\kg4ç!Ż€3 ° [ţ©™ŕč'‰+Đ^SWŏ٢ďs Jŕľi˙¨ľ2lë( {ľ-ŘńKŮN{^<µrćVŢÝP?' Vżˇ€ViřJÄ37˝é ŻÚcšŞdöfIě悚VŮlŮq÷ň䑿9Ś2±ZT—Ť`[PŇ‘ŇËěYv7‚m[ ýM”‹ őT§č™ÂÍŐ×@ĽăXk®©MÇGÔôo3öű.TD†?ŰÄ«w•áĺ˘~˘pDGÜIW-źĚ*îVf”mw\ŮőFr˛czŤ3ˇŔžpßnLωçö+î«b‘­ŔďöŻĺ€PÄ费ɎŔ9Çd9¸A`+P®¨‘8¶IQÂC_ě7#ř†©qÂéD`@íFC5lµ�§6ﯸݒ§oŇ9ČzP}ku oŇ:ýŠ×ĆR“đÇoLŚĆúšŁ­ŐýYře5`ŇŠ­‘ćHm~ç!—ń‰Ěëę+Ř_WËFëSŠk˘rťĄ$t[Cý<m óQf8®gEڬŔ‘§v,cĚJ ÜÂ]‡;Y"÷żĐWŤ|q¬Ń3ľfÚxěa*á® ”j #ľ¶góŞŔ˛yZđkÍFńšÓ"f·iH— �ç€U§¦¨M‚Gţ*$ľ_ýî€_š1 Š_*·­*ř"(ŚŇŘů—ŢKŃjzٍ#– çläq[ĄjÍŰň±4š87ÔµrÜÔ~Iż@mˇş|x“˝{b„'ŐŐű}$¦ö:ěK×zŃŁśb±Ub7/˙Űĺ˝Dă2,fR·Z·rQ+—†da/űFJĂÓŐ‘y´ď)9źŕ?łŁ8ĄiT}J;)~žĄ3¶liVóý‰ű 4J ŠŁĘăŐÍb‹ 7ݢݱ´óÁ ]ě؇ëgÄ#XĘ’#Á8A¸k#ÁÍVůR2»8ąŕźÁYţO„°lŮTOcńĹÓ„y$€K°%Ďy´ŕ~ŕE7Ô®o;łKĘŇş6đ §°Ş›W±ł‘Ňaf~‚Š®žSsl˛˝ţ'ĐgdP-LqŐt<Ô…Řp‹+ńHÚČcňÍ'ŕl^ß,TA;żôŽi°™:Ä'˛Čaçšâ@»ŘÄŕ.đUx"ÍßJ±*UÎPÖß2÷ čgŘ•ŃÓC1oLŕ±^Ś%µ"¤xBĎođ uVѨÁYDž(˛mc´…ĂÎ ˇ*L>ÔĐ6[¸¶î/pő=5 HÔĽ@%ç<ďf´NéÂ]4sKŰ|D>Zd/ĂŹîˇ9b?_-!É˙<öÖh“=ĎmöˇgřÂt~ˇÎrL¨B•NŁ>oLŞňţ˙´†ń>µţʢ?l ÔqÚ˝•I™\}Wjö‡‰¬¦’śăâç3k„íčúYu˙Mofu0Ů{őqdIÄ®í ;×ĘeőÄYęđÔóä¤óă\�r]ĆyCvÁńYĺś* čĎšű,ěGţ’ôµű˘�ĺ´…Á7˘wá{Ńć8ďPŮĂţöílÚLôŇ…E*đ řg§×T’©áuFٱÉę«33(cËŐ]Ëgä|ĺ°M5ô9lŤú•S?s2‡ŻŤ’€IŤHtëŻŔÁ®& śšÝa7kł6'¤ąęŇz|ÖČBÔňTV˙wńÚ{KľĎĎg@WÚˇĺĘ.âY•ŠŞQÝ˝ŠJú÷TwŚlÉŐ¦.„uťŕńXk٬uŔ©¨5-62˙Ń@ ŞtCI…ćF¤_¦ şíB„!/›0is_ě!ôÍ~‹z™Ď´őUI2DQ›A+”pS¬ą&üżkŢ­ťľqݍ“ü •–€ dFHďÔâ ňĽ$©Ť/÷?ń©Ďü-”px¬íĂl­™Íá\UtžáÓ y§¤>juµĄ˘ň`ř°QÁóaI©šó˝QňŮß=w>‡1 ×�g¦9ěŻc%‡\µ Sfŕ=…řöËg2ecx=ňş6ąLjËlź]fŔ0g'=Ąş8Ȇ2]Ő�%đfck•‡b1‘u5-wmÁć9�QČ,&›ź‚?‹Tz‰ëw¬Ź?5Ú\çŃ%Ś[óÜ<€Ś˘›Ł‹¸B¸a[˝MŁĎ�ćâbŽ+ą�Ú±ÚÖ>·˙ęM1SďlšÖú•mb¸‚ď=ÉŇř8„ęKĽP˛˙LŔŮ*ŇĚ0HźGŔSňŽ�ŐjÔOăáV¨r[§y) s|tsĘ%P&űŰŢ0ODď—··ý–.ţąd[űjč[Aቚ<ú¬*I»�7áGŇ-XÚ:’ĺ-âr@Íúh©ş¦gÇŹálw8?ͰSĽ7Ç×QDpŹŹP~™"}ŢÝ;đIđmúŢĄůÔr›5jĺ5¶–ŤVş.JcF6¦GA–Ť{Jt·”Ľźů‘ŻW‘Ě›�5ęő—�X|ć řL|7Ó…ŇŰá±ÜÓ˝qAs„ŕÎnDşSĽŘ Ű'ŁŰEGÇß[™OÖH <%ÂHĚł«Ď9?W<°r÷Ňd6\ˇPL6ŢGĐ źÖ NwJĐ+lQ™ú6xŢÂç.ŞëÚĘŮ”˘‰\É='<xÂÄ}ž˛ăBč<·aÇV{†n2+ (ßĹéµ®‡Íť?Đ% ¬Ăô9Šôxő±·˘|Ć+´Ř”e·ęAvĘ,›2üž3©e[üUđ~ő@˘LYňŮ*/!e˙ő «6‰Vp1©Ś!˝iä B‰ą›"Tđ›‹/ftŁ’Vp@Âoš[˛±Ř[¦MHľ„.Ü˙ ŕŇ”xŐ+éöÍńΩ•wZŕ¦ĹLQű Ţ[%|r“˛wÓä57?5Ň*Tů9“Ť†tšO ™-ă–Giř Y‘ÔĚPćŚ&N‹bĐaĄ\Žďi%U-“ÓuVń—Ś=ńÇB7˙.XpTMĹĹzŠ3zg�(źwÜr‰Jc”Mˇ.FpUľcŇfÚ öŢ‹˘ľ/l’W ŐŠěÜ/J!íŮ—ř;03>‚äˇĹgťĎݡÉ0-NÜđ¬Y'x$ˇf, řBÓ¦W=4f†(¦y„ţ 5ĽĂ c5ŚűŹ<7MÝÎÁ;Ąç|'%ů]aŹpİp|č+I3z$q0e ©Ü^„S±ó4˘ŁG ŹE:ÔP±bÚ‡–GÓůý«L÷ĎŰäůĺŔ*v×Ű‹ˇ5Ó é Šě(›Ľ†Ţ™4áyj6U«_ÇdŰŰ6ŁÄʦńŔʏo°+ĘÜŁă>6?q ˛˘ě´ÂsjŽ|Úá$" ÚüďŠZŤČ–”ČG÷rđľé®+Q'łŹ»ÄËňăðx›/¤3s&BW%hňÂk·˝Č%˘É.'§Ř_Č,ťŃ Ťř懞�bĂx™ÉJL<´v|p^}Yô{<ÂZP3^¶Ôś¬Üźś÷6pôĹWtá÷LBĎ_YĽôIÉ)0xÄ”F“«ż!$ĕΰAôťÂW.Ʊ!ř;Ü˝3lňŐŰł_°Ąď\ŔŇ­ .“ůÚ’Gµ0„»Üˇ)˝Ůő0ĹŽÁ¸ćú>|¨Ś†\{1¨×Š—ÄáoB˘?ďMKŻ1—ĺ›lś`.dŃ#h9ÝĆĽĂäBgx€Ů”3½ Ď„Şíý<ń­Ű/<«z·{)nÎäı&r yFţµHńń»ş¬:Ç;f ăGeĺąŰ¦qŰáŮŇí}ÍÇ? ˙­ĆQÄý¬ v•ďđ—MÖ ×äOH-Á#ئíu¦3C"6ic[ąE¬|tCzçŃŃć hy¶;E\b?(Ó8AtˇYjZ >ŕ >E/«|Šß€™CŠälţÚańlšč¶–&Ż“>?âqő©˛“ĐůwłGĆą%~?ç�ÉĐúTžKçhJz|$×-·ó†�0\­4Wň©ŤŇŃ~ض€�Öś ŃŚÚÄ‘?PD PÄ©ŕ/K ŤÓ%žćsţÖ|9ěvó­ë!­äwŢ|k  .é9ţůBŤ_Â:T·YĚۢ™ÍbŢ^d˙ŠA‡‹¶Č’Î đ/ź¦ĄďĚ µ¶)féŤYă—ŮŕÝA´\Q Łg›'čOnĺkŻAUVöşNNőŠ^†Ť”?O¦ŐŤqŃ%vŃdĹ÷˝ď6O‰ đ…QĘ®eŠ|€żLHgSD‰T Ô7»îó+âÉ …LúMݰ!Ç̬3ЇW*ł¸ĆŽ+äu Ťíężóˇ e˘ÇŔš©I“ÁµąĹěŁlć:‚ÄÇdf(EzŚ<Ę}‹'Ć;d˘?}F%ä5N%:ÓňŠawň Ť¶hF6!Ý9÷ňŐqTQÄ„«Ç“§Ô_ő•‡Eő,´ä¤CkŇęc\9öN¶sX¸Mpum”TV,*Ny™˙ŚAD\˘ŮT $#ý¶…ĎąDM[Oôî\ť˙ Ž”ż˙ď-ľÎ†Sţj»Áö!4ŞIŮů'VĽĐÎʤă…Z¨Ł—&é* lĹwôśôę»rÖzެÓŮEJnČ„Y& &‰th˛Ű'Tö‡˛¬hŹn�,Á¤şŢ ĂŠX˝Nó6¶E6Z7Ő°číA—WYĘěúő:q©·–±c±¨Vúb5ŘL¤&ť‹ň··e&ł73)ZděYüëü­g•7c`‹)ŮuB Ú’ ̸* TCԛ҆xĐŚäDh˙ÝB®ë´:Äv=R{R®ŻÜŢ]ý"ĄŮî4>űŻSťó?´-P…IăűćŘľ1µśé†×KRŤ×_6ËřŽŔ8AŇřŻąŤ ŐöŚGÖ‡–Ž{ Âßç8Ç|'¸?Q€ORvuląßű¤ČÁß>Áš˘—­˝ÂmZK—S¸}ŰÎĄHCôKML‹~ĽĚ�~JÖWKś Đ/pÂ.¨;ţťSµě%· ż_ť‰‚,ű“•“đG ű‹YĚ—š‹ßiě8eŮŽşc�~zÝĄňŃŕK@Î*ŘGŇ!§eZÂ)ç†Óř‘Ăť§VFV†ď÷ŠíCˇ„Î'’ =zą•KH»ŞW †•xöVý$›đ‚Cr«%W4T›]Y´óĆŞhµĂŃŞ 0—‹őę|8&ĎÔ»a¸Ś+Ń‚ýMĘły N tňöĄđ.C•Iď2‰ş–ŮÜJűÁěuő–rU˙»MrkÚe™ł3˙‹t¶STj‚E’!i+ăťű‘Ö&ľż]ďČWϨ¤TňąKR:…Q /P » …Ş).ş— ö8ýî* Ęd”"«' »®©EČ”-Ŕ¨ňˇ_˝\SëşDw‹”Ő©Ę5ŰW c Gny¬ü›ńhŕë8O·Ó7ďŤV řŮŚĹ}őL�3îG#"ŤrÔľ“mĽ–Ś:ó‹äŐq}Mŕ©2i˘ÉĘSĄ§sđ{üŘ1ŢP|gŕűÖÄMLĄS»§2óŰ˝J0Úŕ,޸ź“™óôO�S4˝žMjؤ€Ó•ďKqŇńĆ\/™1Ő+AKťřăV©MZb˘,G*şç¶§7` ü”ŁU°)daŐ lJ2ôůć;ö〟}Řz¨˛:…<Ě‹Ł'Zu© ĹŘł«bí˛ő*ďĐP7·ÓN˝ži˛Ěź3qĂçĘÖíţýLOŁŰúŇýëy…l˘Ś¨â۵s·ü®ŚĂÓo›“Ľ[ ŹöŁ){äzV;ÜÚČÄ9%±` IJrČgű“ąŽvššý1N9Jő˝ČŃ4Ă‘ć×jޡŤš‡±}ÔV˛®‹ä¶-‚-ë_‰Cô›üŻąűŔůT ›/+óőŕxlÍ[¶L=µö4źľÇWt•âŹ6’¨Ç.ĚUmĎŕ–ál¦R˙}Vq\|ç˝ë.¬ĺĐ„pŚ&Ůąb]Â>hŇ”ő>ĎŚÚł5Őzn×Ě"™LK˘o‘˙ˇ’Lë= (‘'¨|<GĹ«ňŽđ ’ń–·OËá§¶Űň1xrÁ˘ ţÜ|čA2{`áR×…€EL˝€ŚÖ6 �ôÍ>%¶śź/«H°—ź”±piq9fcă�ť‚ †ŐK‰/¬ě§ÇÜAuC%ş–_'…˝om3&6Á˙˙˰jŚ×ç‘•U˙É'‹�9 fůĆ[¬Ë ô ă‹ňqy4ţŢw©R'\Ľ¨ěŕÁŰyI_A]żí!čĚ YűxEZÁć É —Ňl%?[¸lÓ0„˝îDÇ–¸ ŕËAµ4¸B†!٬Îě—šOg-¸ <€.Łą‚8¶Äţ‹đ'˝QS…I±Łéú#Ç>ÓžÇnŘĂî;ŞŚŐ‡{N%[ű+čő×fâĎů3ĹEş– O ĹĐ4ŤĂčÇNAł`îóíTWz~•;1Q>îPűŻ}»fĺsIvßłA›Ł5‹p Ţg żő%ű4@ÖąS®!Ó+Ş‹ŤŤť†+ŢŕQ\Ć„Öű/n<Ŕ(ó}‡×NůdŮR瓇†hĐîŕÄë ™ŰLĚ.},÷śhĄ¦y8d^˘ę?ˇ�fko ±yśÄűŤ^A?âąyűJű*F+Řʸc·RDZWł‘ĎkÍ Â„ú]Ż ćälŞ3ÚĚť¶Ë~Q$A#@TÖ˝K°±˛ă Ő/0/3«C§Űl p6}Â×l±d"SŰ>ě‰ß•^Ě&ó#sąôŐ\H žÎ^ZČ tX¤ĺ3vtmv AÜ@Żs‘MÄşDş=6”K‚=_ ˙°äjĆč{ě'4‚°[ŁČY<aN.śFó'–ë§H­O–Ă[˝ţ¬żuÜ.‡S©N")"xÇň2G»p•_\ČĽŕĚrËÚµ´Ő�Ľ‰ĺ3XĽs ą}ýŤŔĹťY‹jZ”‹6Ṏęű~DÄgŕý-�găŢ EŐ|8á?§´>Şőţ4HŤš1Ś^J,BW#�Ö†”x~u!iËöÄien˙5Ţ ˛NÉ•±=( ł€ől<:Ńw®@>şr#ČâźMvĐŇ ď9–Ě…ăaVˇŘé"S×$7)$5´šÜrńr Ŕ˝“”Űśíed’OĽzçČ[űúú=´·hĐô=qpu/VlľĎ‘@ Ž żŕęݧŻÄ”đre•’×Iyéoĺ*'Ţ‘†Î bV€tŽÜ'÷Öł1ĂÖ4M!»’ŕ>Ĺ^Łb®0#}› iúyCď¦UŻÔ–++‚ĄűĽľ#ô­OůŠdÚ—ęű\źé‡i*ôPs‰2"ÎÍ- ţůŐ±žq}é\u(łäĄ©P¸RMýŘ#"ë:[Š+\}ięB÷†ÄE@·Âę{aś§ 0o)Ž#eţŐAŰq IzojĄ˘ą ¤˘Żç¦ 'Ń ř;*¸YĄÝeú—ç–UtP‡DE%¦>+Äăě2ĄüŔ4N„ĐŞR<x)ZŞ‘ř ]ÉÉ˙ }rşŇßnNfpY†%ýżî YÝĎH[ÁË @hY"¦m˘‰Çd‡„'6ÜWËŘ™Młëq 9l©•źđ4Çަd·8#ŕs0ňy>@6•8G…ůé DKןŤÁ‚yŚ3sÔŃO€x¬Uň=1çů#v‹ďt(9?!ĂÂm•k9ÂŃl.múŤNŤ}ĐĆ’¤Á"<?f¤SÚÓ‘"…—ˇ|výĄ=©‡‡^|˛žü꬛3÷đ6W´âéĆŮ-/&!ŘO׹m#Ë–[É+j·ôIoŚ·m€o&/šeô -hzVäÁđ娣×\ÔjĺŇťsßÓţ’qQD'čĘU»>úP"ßg “wÍ™ŰĹgűóI92Żé$;RE+„§üťOCđĄ¶QucÝéŚČ»™âŽ`QC˘s©1–˝`édV@u€*”őÍ<`¸;ĹőÁ"ă’’±Ż/ăŐ¡4Mń8čVÜÄZj>¸äĆÄ…a$¨(`µ‹yö’^ýŹĂTÎâIěÉ®ÁBŘÇw’|C_•ߣne– 8ex¬˝ËĄy˛»oŇ ˝ŞĐ°ž¨|gŕ‘pÓśľ©đu ¬Ér čgÍĘpř÷<?{ŇËŤźŤÎ’X@ńăx'é\ŘuÄmϦm¨âÖ¨ p_Tb%5mĐÁś@đ ”۵D% D(Bś<Ť‡×B(pqejăh}€łµŐ’ąäű.P7#¶Ň&>a-|jsĚĂg ÄČÁŃ®·iyĂ+Řνµ12ké™ZăFÓ·AµÔ™ňi@aÓ±ç¸{QžEĎPT¨T|c‚2ÚZ;Ó`0~"'~™„ ©â۰ě~Ć•iűUsšĚD©Dm( Ikm…3ś üM˙ ¶ ?‚eÜ7׾·ŔĚĐÉĚĂ?ÁÍ/mÁ„Ă­šBË<ńžŤč”™Ä&Ř8ăČäşwÄYc°w"Âm<ÂÇPÔWĐÚüh¨rŠMôW'ŻDă}ť÷‚n|đ#L€¬ź\ÔxK6kPŮTß [2”zlhäj^ŔţV2„meV”snăŃc~:QA(`­mFŻË2 †ý)ŘŠ•źZƶd›ăł;ôá5^!+ćěj»#Ú·X»_u 1MăW˘!GÔő¸¶‰iŠŚ•Oó ­+ĆĚ/hˇI8÷řÇj¬zf lAWŚŹL]~öcŚ©wďßl"~Í Ęę® 93Ă š×Ý‘Ű\Ŕ`#E‹zÜŰ[]_´ĄĎĚyÇnÖ”MŐĺ5Ů\ęřËg”߆aáĐqŔÂűM’hb§ç±Czˇ/o/ö4˘]Ü߬aN_Uu—b᤭·K’ďí3Ő«Ý!;9łŮ°Ţ”‡q:ťF«$łď•{Cči-gŃ.ÂŞČ)żjoŠĂŢű–Ď*¨Čěĺ%8ˇ‘ÍŔ ’pDꟆ6Ä· tqľŇG÷98sˇ÷„8‘µśŻę”(k3çĽu/‘|3ţ'g«csˇK^PÄR�™VBo ŠţTýHQjöíÓĆď·ôX´qť…äë'|ąąp=’׌ľÂ;z-kÝŮj8HScźđ\GËŕS(&o/B0˛č+vaȆö”2OhS>Ŕl~VÜîăD_?Ď©¦V}ßáĂĺvĚ–ç÷eN™Đ¦ˇI—žéjđhČMÂkÉÚĆ]–ĎE×$xcŃNÎ’@›“?čFŔÓ§ďt€Őq˛ö?˘âvuF»;|g=Ú‘č<5“1ĺ/]é'ď›’}–ÎTŕGzfżŮŮUÓ*ť„3Ţ0şżT'ŕç+ojýŽfÝođş îń>GÓŽ¦L–%úÜźÂds•Î1‡—�&M~Ç÷!¬4-dęaîlo/Ç'RcEˇŽGssÁu3ëľ„pŢĐKŠço¸™q–1áa BĎ)©h‰…˛‰¤>•™ľ9Y„"'J6·+ăÓm»u«sW¤w4Tôp&FőľË™fX$ˇÍTŹS‘^+&¨·HÚůW&Ź ¶»ą `lëí}mĽ,h#SYyş3ŰDˇą[»ô*+ń€–ą¦b÷!ÁşśĎr•´2gsÝż,¨ô$˝·ób ň¤Ç±˝Ź[ ŠX3§ŘűoQ5…™¬•Ă�Q‡"ٳѧ;Vqá´ąĺäđ¤ĎW&ű¸ŚŽeHÂGlcPc¶¬`&+AëŕźUjúŕ†ŁsOđ9›¦|TĆR…¸…•©ď éÜ:úw%Q(kŞ~RĹ»‘ŕtŃ[óÍ<,gc÷ŃYŠ{č€O#™šľ±T ĐdäJŞM‹‰< +ožOăhF ü}Ô/ ćXl$8~\ťÖĐ"RđUěČâ4Ň c˙Ą$-Ť¨¶>] (�GHîó“YmÍŰ®ňÓš)Äű@&÷¸Ę‹đ:˙5� ę‘ÖWµĂ–Ф0J§U¨Ú+˛4˛Ş>±|´Ş�ĚÔ ÄJ.Ź#űt( ¨ôUČSyŻó…,Sjcőó· DrĄ×šxůÁď˘l='ć4éĚ”b°WN�“ęXpnŠUIL˝vĂW˝m¸›»ËFŤçć•kĐřDYëvÉ9?ü`V‹5<ţĹ}˘řµaý·îëňĂĆ!ÝęEYH'yřqţ>ŹNŚrÇm–ÜĚŇtQ'^Ţą'ę˛ lI9ŕkżş˘A-ýł(Ňe€ë墸ÔţÚĹşß±Ćěä4+o\p6‚Ң0¶D80¬8=i©eí“ :t€Çş7ßÜ­şy×ď~4đ Ź·˘g4řă™ŐütĆŽj:Ôě +[@ú˝Î‹Ěń˙M=:P&ÁÔ Ţ Ŕô$›-ó@$Ďrľ‡©lÇ… Z¶É ٤AgxŃRŚY 6ŹňňgŠfEăbě ¦ŕpëw˝#Ń©`#;č?ú•:é@iţ›adW‘RĎĘp8r›Rg,wÝ•G®‰°’ «ľfrµŠôę롨čgż´Vዚ·«~;čěgyHyÍŰ|b7U»a$$vŹ+–o[qnĐÜÎŚ‘É’l<ŤÓ•ŇńÎ’ńŮÍĺ!-ëţ«G˙% gŹ M2¬6Ô¦ŽŕStÝę;rŻrŇ+ĺďĺËR&WSÝ˙á—V moµ†Bzµ°ú‚¶őŃך§4ô3şloa%çżTE_~¦)�Ç~R’ž!őď[�®ÜÚČlË9J†a—ŁîÄlÚ‘ó0˛o JĂ ±@Ť¸p1`@ä@9aťHSüđ1TÝHľ8Nyí)ë´ĎÝ óÁ‘jO™©xźĎ,˝ÄŇýÎŚ,QŤÇ&+XÂJ«!˙ččY<‘ęיхô¤÷�„˝.-z˛žúD–Ślđëu&—Š·o_đń=yđďjá ҸL‡x`î,  ÉŚ…ôÄŤá[÷j¦d3GXűţR›Šq©.(Ę6¬eŞ dR°BeĚ—H’ …PÁ•ÎŃÄÜÄ&äĂ#kŘ€:pPC!"ý§dŞľ XîUţZÖᢠ×nʤR¦D[_¸«)ľĆÚ ěÚ3x´%YĆąRŻ”ů ŐŢHK‘ ŕęŇÉA |ř÷á0đ.őŁYC%o4‚VÇôúäT Źiäđń˝ÁA×2y žôżql“P­šu¬GżµJť—ŹŘ©¤ä2ň';–ž"ižň8U1cśmę˙j›žČśVł,oŢ‚&ö‚ĐŞ$hÓA’<oVŮGó‡Ë^,Ým&ÚÜ � żm?X|S*,¤T„H´ 0,çŐ/9őĎ´@ĺOÚ˝~ß$źŁ/·ęŘ­]ţ±˝îđ±%ĺyz®× ˛ďNyIÇăúbWÍBúĺˇi-MM®ťżĆ=™s=ó+Dŕ4 SĚ–Ý =Vĺ7gú%ŰIS»ë­%0”+<§RVŁUýÝ]ľŞT‚˘–†üÖ?*Ťă‹´ě –QeF2�YÂŢVdˇ¨Ľž˝®ľ»ąK€epˇĚÓ4*„®Ż\)CůÚň‚ě3Đ!čWÉ{wMáě3N\¦ăˇo©<¶ěĺ;±Ç‹IÚÜ̲®ÇŃ«´L»Śđ96Ú‘8›˘ˇ‰‚Ç€ÄO&ǵ&ZF°Zg8Ş•P  ËKˇ/[űČcîR÷ëě׊Rúň!ëvBn݆ʷŠús &V>‘ćŔ­¦C…~dí>ýCĎÉł$%OŚăo˘lđuę6Z“Ói' üŔ~.v4V©é>¨ńx6ýŁ×^ĂÎÁďşÍî.—Nęą–ß”A?¸Ď´Â72›ľĽç$łŁß¦+Bâő=óľłČm¸đ-k¸.Ťĺ/Nܰ'=› |@•ž•7Ć<â3eęw[H‚nůą%fţUő5TCđľÖ?…ÁĚ8Çţ-´hů,sÁ!"ţú´`W9+íI¬›éÄ ôsćH•˙ężä¬ń\@Żß;d\‡Aż1LJ $ɦŽ$Mąqč笹8mRÝážć®Ó·¬˝ ‰6%/qq`ÓPü‰wzdǸĂ*ý@ČümľjŇ6,Ö[Ü“Wş;ŚŹ×ŕ™1ńňHĄúµZěĺŠőă3đo˛ŕ*–óN/cÇLEäçv&ęÉ’ ůř AďéE^˝™ĺ©±‘[ĆőÔŮoYÚä| #ůe®ë‰µV˙(úżG„Á{'ŦĘĆe¸·/Ë~ŃůX ťwľż@ÚGR›:$^„Á č­h˝­Ăz8F9©±^E垣€’ČďŇŰs6µ¤Xß”Şü6E)ŔKB Ăł0`#.ÜxC%ńTÎ[u[ěn:śű}^ę6łźćO‹RVĎ`PŢ Ęů;W8[âJ’ąŰŹ b˛ €¨ôĽ„†w>=şąZçë RőÇÄť"hŠ‚ŮLŚĂH‡|Qş"Ŕ§’‰©ţ™řąVţú®˙QČižSy¤ ŃĽöĂGÜT63Š<Ä×î$ ÇĽ‘ěxŤÇSVá‹.żE‡ČŢŰŔŢ ±]>&•¨”lĄÖÄßlňm.|(üH%w°*$éďŰÇ~„Żx§–çśCxăŽřŁű3‚Źô>H`ĺfˆ …Äý·mĂü…lăůUÝŞ’ÇäăS& ?ŹkË– zŐSř}¸őWŐů63´_0Ç­‘~pĎ~Ňš¨gŢwŃŃ$Ůă- I ”qŮ>ć©őQ@\ě/é4ő^Ć. ‰łbŔ„4ăÁ&ÁŚşjzRł§¬Ĺ°@U­TĹĺRĹ> ?ÓţčD&ĹI”2{G<Ě’Á�÷%ó ;ľBFäs!»'ÚŐ´ĘćŢŹŃOMRŕ«8=jÔu€’[Ť×|ěWóŤťEOŽ2�‹5�äů+|6­vôw±j®]—˝ÉREŁŤc8e•:«aę•L¦´‹˝*Dý*čőH“y6ż–S4Š‚ˇHÎř­ô ĆÜGĹŢ´ň pĹ·(žIČ´c·:‘˛Š}4VźLmâ—Oş@¬V+>«ż‰Q½Ë‰/ůnŽ…•ćäé™ďs…VéwÁ_ fźŇÚ¬KCˇ÷ÍľDQ8yŐýaÄ6ŮůË»…ěĹäŞx”'kmü(ŚsŤťšü×!’Î`’łT»}Ë©‹]~ŕËď[baŔM*Ź—ţYA@yĘßěŕ=+ü~âfˇ Ćű¤p.IŁgŁ‘arËßfŇÁdhř©ÓŠ&}B«Á ‘>Č�EĐY{ m*Ů“¤?9xŚ›wC2őó×mÄoŰ<,Ěěw#ěâ…Öb® ˛ÇŁý0­hÔE_P‰ł¬Ž ť]˘*@ˇ:Jńţ<7ý?|Ř•â2»-‰[%'˛wĺéŚ_ż$€Hµ;ŚÂz ŞŐIM»—¸‘ ŕ`ˇ¶ČČ‚˘±Á‘JΚ~ĘÇ%ĆňR!#đŽ.}ĐN‚LŰĽyÓ 6TĂ7'TÇŰ %�ęv2;eN÷¤Mńibň]ˇaxČiFÚ¨D—âUÄX±ÔpţÍů1ť4Ł]ĂÔlĄgĆ÷á ČĺţTÝ‹ť.Ő΢^ś«Ę0čĚB2»ç9đĄuŁDt|]k–i‘F’ş×’. űĐŻąbKqźľęUú$‰ő^4e,žŘďşrŐűĎ+7kĄ}Ĺ dáZkâEÝóë4“Ür!ß:jG?5S[ľ·°�M~4ClAÖ2cđ±ÉŮ’őŽĄűh«%Nńęđ‹\ ňަfäŤyŰɇw:–Ô„°ż ¤röŤ¶ďĄ‘{®D ·ôz±ůéäm›Ţťđ§ ZAĂâ–ŰeEAĐŃ™ł2fµQMŤpR9OĄŐűę­>÷W$VĽB——/ĺ>‚®ÂĽ«‘ÄźI*PNqµB–eú”QŠq°­N»^A‡’Ąš\·`¶ ŕPU5IđÜť'mČŰhŤXDZó ‘łĺµEŤgűdf«|8G/ÇNFč×/FŮD :=°ň=iFÉk÷ űŮˬb X\,~Ć.redMhcŘ~Cú@Ňó`˙OpŃŃ™‚BµŤ1 l÷†Dą>q KčBŁ~_ţŘŰVP—ŰtC"<Éą b÷Ť¤Ł/ZxŠç âÓ!|ĚŽO5t:ňZÝ4·Eqům~„+ Ş‚–{ţóIęŘ–{"áÁIŞČĘŮőměĽfć§ü©ŁĹ ¤ĂHhÜÜ=ăČ;•ł:Ś_PlRFŞ®;…ÓÜEŮh*ąo4LóŻĄ7Ô"}Uşz”6^Ü6Ů «î쮑Ѣ)ľńŕÎ$Ą5UŤ}8¬÷ŞVÝúN ĺ ŘyB=Cćul0:°éŔ�Ć1}Öĺ*V6{“`ÎŹBI9VKfHÓ¨îůâxÎr$ěüSˇB%ÖşŢ5ÂęyęO]-%źŇ†ŢĘÎ'Lş@×9—ŘľbŤÔ靿ç�Ra·@Şč$ »ävřĂŢNŮ÷ȢŐs $ŃjBŇ›9Î2$׋tńG Ł×*Ę"ÔNA�Ó;^e0§a:'2?0xĽP†<Ëä%Ń>—ô¤mŇĆţB7vĚkf~ŹM«Cź°;č4ŠúfĎţe#ČŇöÂÎbmQďéĎş${š0EĄ;čÉw�•E:·Ö‡˙ŚŮ`&lĹfJýî”ěC!!Ť=­Ó|âFm•Ú»Ně—áuĘ˙§B_°Bżd;c8&bjĆk¦#ßôj,bś«ťŚ GQĘ04kŐŁ—Íźň- _SÔI�áü}¬°;<ýďz=„!3ɧZčí›ŰôhCę8'~/±W6@IęaćčsŐšŠîµHP"RË&ViÎö<‡[íÖśđîJÚÍÁµYWI˝ÄOA˝Nf'ůA–9•LĎ yČ\yz~mÝřvo Í�Ó%ÓR° '8ďG<yfµŤ�UÍî$ĐÖUjě"k=hDĐF…ĎÂo*Ą4´%iR@nűíáyŕhaâSýŚşďáÎYW»6ys7PĆW?§ř2ˇÓ_…|§üć"Ż>ŰĹZiÔ7Ć‘‰6—ÉyéţĹ·ĎDŕ˙Ţ V®{2ú•ĘJhrő›XXŚź%DI*nZ© uÚµŁs€—›Ąĺ¨?#k,DĂ;pÉ>Hł_Ťŕ©.2ş »ÓŤW­×Ó6´›W'Ô˛ě7KŹĘ74¶€ŞűutńěĽV)ăm7;[W‘űĐÝgĂe…´ŁJ„Uć‰_˛«g6Úńs,۴ąĺ÷+ĄţÖ^?hˉO(*~¶0fXö n‚řµĹůŕT(×ëŇv)‰W§%j,X´űg/ dÔ®§ŹŚá˙¨Łźţň®ţCr‘rŠ"×Vş7”›L Řpkľ,łí ?ë‡Ú!—ç ¦Ç- ú–çL'ŐWčŹŇöŢ!`SEŮůÂn7Ś„ŕ_ŚĐ'+Ť1;ś[„:‰(Y%śôĹÁKó”xAr§Ťúô*AS ‚ą1 Ő[zči[Ţ.ďĽÂ‰Üq ‡Vó"0E č˝ě(·2ý^č°@š¤Šu®¤"W‘滋K?}ĺşúąĽńálvFöęĆL‹řś[-C;ę>™clĂľ„ő™Á)ţ D.Éßŕű› äžÎú”Włł(ĄMż[‡çV=îZS”Ú}ý)…2Ń>;ó0ĽuVN™‡ů‹ĺŚĄÉyݏřľÔĎŚóĹP#1`€ëíÄ0*}ć™Ň1ŞÁőA+%{ńrµżě?ęŕ<íL˝+“.]YÓ˙¨zÜ´Zźm‰y\e`‹WďéÂzÄŽT${’§Ůż«$©1¦3řÁńůËßł‰ś7{„]UVpóş0łÂř=¸L袾Ԭ¦EV AB¦×·Jôţ�€ 5¶í/4‚˝¸ÂdA’5‚´ăSKBňa(c›4] LRm‚™x—#Ć3!ŹÇŽ�ç÷’&ăn”éť–Ě/ Kď4®î�Ň“Pý`ŮkvČĐ|Ţ˝TV=D`SÝňJgëPűóĘH_÷d„ŹHÍÇőuń÷îST'ç©_9J š] ´‚˘â‰áɦÎtěa¬Ë÷gáŮXÇŢ'𭱦ŮEj‡Şă~hÓ€űŻh¨q8lPü°Š˘¤ę´•°ó•n×Ěú¨»Ô'˙d“đI‹ |LÚ×w|N>ŽĘ#ł_ĽH¬ă}ŽKjyžŤ“WÎÔMűúŇ—7’™= ß7¤z;¸Ţc¶Ń0ąÚ® —áË•]K×…Đí±j8r%~wî\sĽ¬ ďÍŻpŢ>IĆ!6U;-†{Q!M˘ÖŽc·•獖仄Á‘ZűŽĆ˛‹µ/‡‡l?ďŢeů‰ťˇ!´ŁF]e×k»"üI¬çěltKýÓKjđs÷ÁÝ„4{üCýź^…WZmŤŁ¬jgŮËÍ骛(.»|Q‰‘>7ČŕĹĄgëv“ŻjÝÝ—hƧKtär¦ĺ#•–ö†•ł˛f 0‰ Ł|8v4ůůK¬˘{3ýň‰Ĺ˘PĐz=hĹ`ďĎhŠ_÷ýPĆ2ęŽ7lx“=µ†r‡‡ůŐ‹ż3ĚiÝĂ«ó“ďíJ2�3řç ÚŰ·[pqNÁކ¤ŢâÁeQYó[Éăv|łyB€ShÓléä/ę§?ŐMfy’s©(‹G­ÝűD•Đ‘Ĺ_a—$cX.”˙Đţű\+.懺éß—ĺüę"ÁOűÍLp=RVě¨` §ŤÇ]ş8ÁaÉhţś=·î÷źV'ŚV–Śq’ň8'ŐEń@‚m‡; ôČ»ßŔý)˘®ççcB†JgVaáě_-č•ÉüRŁáfç/Z~.5Ç~gŔ_ÂăŁdQă-×tâăł§üŕ@Ţ& űŮ8çuěeŢCÂ3ůĄhóoo_0(gÖÍáŘ,·ô©żłŹhŔzéM’VăˇUR*Đ.·Ę´šy[Ľň1@öu˝ývÄg§„ú Z^ĺf]JyÁŮâ]/[\ťÎŰŻJÔ0čZ«C÷ąC附f¬‹ŐÇü«MÍ[×AÚ0E#FĎ$٤ÝTz:°Î¸xÁ-Ô­}Gµ{3Ş Ä=ëŚ%ôjË4÷&>I0Ëo„2+6@ś‡€Bő%ÚAČoĺ"T¸¶ )ň6ÔX u&äűZ\WŁŚČ·3‡dB5«ÁʵíŰ×l;pú§Ć6„­UüşŢ˝§ąő0ł‘ę:‰Řl™áŚV8 ŤáŢgqR·Ĺ”©‘ëkÔlé^§‘IĺAářĆě˙\�÷BJT3Ą^ŻNÉ!ăk‡šňgȱ†WwţĽ8Ćčá×řŕ‚˙,ţ-ńFŤ îwt‰Ę. ;N ^ÄŃ P7—ţ2ĹPé|ĂÝ˙č ś¸sáë§ůó©*߆ĚĹž¬ú”o . ‹)2'ź2@Ľ%şś[ŐÇC—^đÝ´AożććFYäćĂERk“H»„ź*śŔ°ĄI/ňŰŤ$(ĺÎBŞwëű`V{—ź6$ü4ÜK;ď9DÍŻUÂ'%ŔRÜ‹đď­jŚ,7Oľ#míą¬ľ ˛n:ľ±Ťh@µëLU®ŽS%VeO÷Ň)Éo(úď…mç-Ř e U”lŤ"Íó†W˙ Ě»Ýh˛ˇ$k�ĆMI —‡¶<\& ß)ľżz†“ł·Ćť5˘dLôÉ6 @Łq”=ó%zňp˝’śÚ»#ŐŽÁöů˘¤ńڞëóxß«»­©|'¬kÇă‹1ČřĂD”‡Y¤j‰Čťý-Ĺő%î{ň+ÚBŞKg€#Ĺ4ŚćH/d.> n˛)Ű1Ći¬–Ä29hč|Ń­Đ#MăeE+MEîľ@oĽASđDqYůĎzh\7=gĽµw{”˙˝éĆZ>HaSö"xČ“LŮÔKĽúÓz`°ńÜć”ôXĄK„*$ůpˇßÓŢŁ˛>ßŃ˙:ą/Eĺ±Pžł“NI$V ¦ç•-ŰĽű2© ĽšK#ji´l$oÉ“zě8"ÇäpĚĐL¸Żő@Ąé[19Y§ööWY¬*g‡V)ô…˘If@˝ŰOësNŐĎj»Îäjg}¤c5öMa’§Ą8ss6űç.TĚw%>#]‹ŕŔ‡Ęďé5wőŘÎ Zý#°qü×Uť0žw€OÍÖ?(Q·lĺM`çS/¶FÉ'ti]â3LE#Zíć9OßWę5űhOapĹ1ئćKÄŘ'fßEţALŃě–łíRÖ'ëÂýu (fŁ:ŔŤŃüWůöżČYřdş…Â5SfĎŘ:ÚÂoĉŇĎY_Ąąn3Ę“'jů"çŚëZPd˛Ľ<83Ľeh(`óśíÜ!ň٬ŠKGfÇíçKúĆď=ÝČt‹é�8»ÂS•ŠÇ­rđ:Ç«Ň7«Ś4 Î+\Áć:îÂÎ9R8ęŻű�VęĂÇN?Ű—ŮÉ*#«~Ő${óŇ)7 Í˙9m¶Gb»‡˘v şÔ|Ť·ž©zn_¤I“–8 ˙/jśś ´ZUN0©ţP2běčmezĎ2f@• aóŮŇÁ“ĎĘç5ŽH›#˙eWßx µ(ŚŇŢd~á# ”ŕMĽ!›ÔH=N[ç—ş=|ş<ĐŞb”—¸kxso,Ô8%đďJĹÂĆŤţ2aĘ•l޵*Xqqi ¸Î˝HWź{ä{ń˙ ~ÉžąŃ`3Ő'óA1^śĂKž[ç3‘»ç‚:BýÜ&?\žýiIDy_ř‡®t~�ç\+«z/ĽöóëɧŰŔ Nוć…p\Ňë­4p=÷~»6\ť|ň/l•ň>–T)ż|Slç—¨-Šć1}”ëŘŕŔ¶Üaä+L05”É˙ř"~%ŚÇŞFEÓ7ŢG¦u}–m¸‘ŐßŢG"°“çC!.߉Ʈń]Š%8‘$Â˙.ó\á@›˘)â›­Ě8ÁE›Ú×nމ€ÁĄĆĂ\¤lÄÜŹŃ˙ŚÎVűúĂăGh!v–K,eĐ×ě;ŤhÜîŞô#[šS Ă.su)ť Ą)~Ĺl˙´Í>m(2kÍG™6ľ§çŐś×ŰX¬ŕŁż˙’™Ę®¸2ü|-Đvúv3öâ#†°‡dňJ’|j)O“uŐEűěDŚÄĚrL+Ę (ŤUâV#$î™)5ä‹Bš¶>ţ|úšî`˝\đ3.›zB€„i°wP+Ô…‚{ú“zUÖÚÍ ËţŇO¬ŕm­‰ăl˘É¤_ShŔŘ7WĘíqhWtłˇ 7¨B  ž.YžRo,-k! E$˛fťďĎäÜ$�ţuéůĘ:Üvđa<l d’ÇĂQŰ]ŁgÇIoQăvý‹E*Boť[˘ÉŘ};o«˛†C61‚8NԹ; ă˘<‡ˇĆhUpŢŘ€Š’łÇ&ţűůAQDŇOűăŐýŔXý­Üé*˝4MęßőŹ”sŤćYË1 âjJýM wáÉŁNŚC1îĘ}fGÓ©BŤV:ľRfđ®oŞ+˝"7“€H;°éĹálëȊᦞ'Öë*+ۉüĚ^Ö¨łGntůü–©Ž%:i:2I߆r Ě™`f•˛Ş˙/h÷hČ Üž»Zćh“^“6´^ I•0°g®šh!^ĚÜk]Ţr['ĎU¤v­RĎŹ¨.ÇĆ{Ľ Ît-°f1üú•zuśAéTúă˛/ĹJ§­`áT%gŃcßÖÖ™¶,ň2ͤŻ‚¶č•W+2‘nV#đž ä¬&5!É C„\ę˙ęŞx§yŠłV’ &Ły0ĘĎQ´Ž UËÇě+ľA7#âŐóąíČ„P!0<M1řyÁ¦÷ŕ:ś’U„áÝXÜżB@¦…č—ś&Uté;ZɶÜ˙ bÍŹ”|¶ if5ťńţRAĚ[ęŹ †¸ßćă†cq¶’ň ÷o`!ď…ńń mµttěwAµ˛€ć<Ŕ »ş¬+¸µäĎąÔ×ÉËVH€W˙ë×j™s6ŕżÎmxKçmQkřä(XŻMhuů*TyPži^aë đţäm<Xę[Ď~Ţ@pTŔŕĐK${ŕÚÓöű‚ÂZঠ6ă"ŃòΔşj×裋 ›źR¤%§1|®D’Ą BjZř¤˙ü·’”RL﹢r„Ŕ`P9®Ż$7+X 6ćę; DŠ;ő‹Ń~ޡўÍoßş|Ą{Üq-i®Í°éöĆܫ̭i^Ý×ďŚ(/ë‹y„’�ş˛Mnż&đÝ]ťrv9Aví‹:IÔŁNg„Ű<@ş‘;˙Ł …¬”§P¦‚%—ŇŤ»řsjWĎwwC#?tD»ăŕ¶Fđ°‚McWĘ·ĺ~.�‚‹Č7ő7ŹĂÇ޸X‚Š3¬fŁATâÓ<†[‰@ö–RűoAv­äc�ę± »Q”:zĺA˘ýIî5ŚíĆ.‘a ş ¸°?oŤµŻ¬c‚–Ó××ýŐâ!şš2ş’ľ§ĽőGƸ®ř®KP‘sˇb>FĄÚ »2׎80ę|ŘýůřBž7<c“wW»´ľř x¨Ś†‹"´Á-\…Ů©iVu(6óI'ŚgsÝđBL3ľ—Ľ[ŞßÄůˇ`úf+Ą±ťřÎFđý:“ Óżî Áđuě®,Äu™:˛ě»˘m)”tŮŐ8DŚŁT¤%r ™>ł„w۰ K5$*¶ű˘şµťßĽú\©Žúżăµ§"8vD–¤A“(tÔ‚(Z@‘$Ęu0ÁĐéO15?ŁĚşőüöJŁqž9Ćă˘9v(řµRžQ¬žżQíyÝD~ëäh» S¦źîĘík(‘eźîËâECYm!łBj§ĺţľŇç8™"˘xŰŔú×;'źq,…™YŐÚ4‹LÖJĆh^6´[c.„"<ä÷3n†´]mר*Ľ1fˇ<OÍĎiI$ć·őDßbD5ä~˘hµ*M¤Ły„ô«ÇFµĹŢô8š ÁŇe.˛KÁŽö‡ÄßnŹčňqjUaŰ]×öŤÉ8ä·ŢvËĎçŰsŮn!Ţoż.‘ţRekťşŞ•Ĺ Ŕ$6öÉ2Q‚jßFć±eß7›ÓÔť«đňť‡ÜЬý”ú vq5ůd}`ärů”Tąw_< Ú ®$± #ý=čŇ^?67€ĺ»ňĐřͰ}oäĽ7ů)i˛ŕ1 fzW~ŰÔŁ¦Úş"Äúć¨É_Ĺg5jň.W¨ôE ໓uíB›i(,…>pŰ}úô Ěn^ś‹cŹ]F¨¶{! GĚ ćNäŁ-˝şµŠ¸7´.Y őW9&&7–8_zÎ*ýÝ?ŚE~ÁȆ…Ä@ţ®ĎjMÖ%éÓOŚîbÇ"äeUkÄFł°ŘąĄÎ™´<xOĂ< –@Ţ5+…Űm‡ş&»§XŇő����ÎA �����˙˙˙}X�s=Ąëť”Jk­ś°„ÓDqi‹˝»ęthf`ZRU[1–}wšMŚQźj)Ěqü%+2/:ßf—ĎŁnćˇ÷öŻL'–śŁ¤ă~ ůHQCxhLIçm˛Üę28y‚Tv¨QÍ#7¤µfE“ş”¸ÚŚ‘ŢžH\őoe`«suóGpš%GçhƆ] §”ŤÜ™žü¸Gž$ýý’äÍ;借¶#<ŁDPD§l`/ Ôvç©vŹŤ‰ňśŕş}o HśăٱĐj»˝·?ˇdög®óľÄ9eé.c™p°0ˇŁcM,5Őĺl÷JÔ¸W0ž›9 /›2yˇ/1WďȧDˇÇń�¶vîJŐjt…×{çDZ.ˇo˘řh Π깏ÍţrW­,‚%{j ¤ÂŮşú˘űŐË8S±îdA†ĽË•;ši§÷ňv^ëŃ/¶r­őţ`uf•w|ń­źëڍGɰzÝBO?ĆČź©ů0ĺ$"şĚ‹µMďĘX>©)*ŐĄ™Á=EŢĎÇl„ŮŚżQž¬°ëPËä?»˝P ?g~ç×ó˝÷ď—Č·Ă ČUǶ• XR«7~,˛Üi˙V%!%¶ÖË3UAxŢG!Wľ�ńe]Bî’µřrž­Ăg*_o“€áŢušĂ­ŘÖě9ˇd8¦–Sç‘ɬ7/<fż…óŚĹĚŕdV/X= �‡6ÜÂF{٤ľŘĘ ü”ÔŐ˛Ä żŢ}iZąwĆ›ZťP‹Ř#nćY íŹű#5o·­`ěŹHş—ŢíSĐ—ľ]yÍźX©Ď É{ňţ“ó¦óÓvŽjŢŘ…ş R+qď{,ÓE([G–C»Ł–>BQ·´Ş™Âz #–1ŐćŢőFs‹Ň„#·ű™GvéŃfn¤qnqYŽĺb@ ĽŔ…„r@˝O«nĚâ‹é W*ď‚ć`7Gŕ&�]öř•Y†±řÇż9[í…UŇÚRpJă–ZÔ# ¸‹q®ŕRÄ?$’ŞíHĽăUݤ ńÝń˛t\^ŤvÇŐéńÇĎůĹŹňĐn„‡îyÓŔ—˘u[ĐÂ+&ňL•FćŞd+ĚĐÇ ĺŰ`*»ŘV-ɸŐ,Äť' Ä{)š9çŞîáů‹SÇ•ý ŕ^BWTRú“Ý$óĘŃ·1ę3/Šű[Bú@<Ţ+1ä·Ľ –™Xł*"Lň<f/š•˛pŞeU+číiy·T˝‚“cć$ĘT¶Tď &Ú–b\ë Ęšbç“rÔ}E¤1$E„_·sÉŠßlC`ć‚·«JÇdÄ}ţYÜąţň<GćB«x””B°Â&€@x`ľËe댱ěŽHz±ýńár Ňk.×ý}óżŘÉŤQ;şłCÝëŚ÷ú-¸ťĚůęÍË4 IŰ;„_€ĹB­Nű+:k 1zWŤßĽ€ĽmÁ–kA>EŢuS„¦ÂSąô6Ř?ĚÍs uŽ?ş´H% LKžî™w *örŹÚ` ĺ‰5&íĚŇČ[¶4$ˇk¦.Ů© �MRÎäBŔ_PI)/;żÎí ›Çݎ]9ă›ŐEüm®Ş™Z.j„·?č §=çŮďk¸t]ʶo? ;+7aCPSx§äÚ#s3L·)3öŘżrČf™;«ą+9V‹ĄäŐ-„Ř4ˇöÚ6Ʀ*ďá?ŰCĺÁm8—‘.ň»Ż®™¶Ç±@·e9˝X Iďď«Dh•ˇđ'o˛ýŲv·^d_ĎŐ Ý˝¬lŮŤ9ł#şěŞňřôDŚPeäŻ?)Ô3ĽŁúCĂzLL3QÚŐë«|NĐbÁd ‹wé*±eşŠ#Dnú_ 9ńďż @¶¤=BQą}†wDZ}NG™>ńËů^ĹŇî‡ţ]G:†ĹćŽ^ŢGŘx‘ lzĺ=ĆĎëŽRŽ<őěT‘čˇÇRhy˙î÷\äsݤYfIşÂ­ŢWżłîĺP”úRa�dvsć6+`úfŁWiA)"ş‹ŕ8ŚŐ4Ť7N9N58ŕgťŰňFŔŚ8ÁÚ5ŘnůĎŕ äźĎÚ+46»_±MŹíö.pX1ň{LHP,ĺxÁť˝r™ořŽË6ß)Íá‡Í+zEôŕýjWu6\…˙ĺ:7@úô>OwçM…ýoGQĆS’°îÇO}5…˘ŕ_‰Ű Ú”"+fH„×ČŢvďYÇ“ă—9çźCU°ţôg8+—'?¶»Ýí2TFŹÉč"†ŇV6MIăţčK“mŘĂńÇB‚úŢ÷ňl/d•y�¤="¦¬8źÎk‡,‰ZBü-hĂ‹§Śź·x §ÉgoÝ„ˇ’ڦŇĆĐé< ChJxž¬ßS©ÁăhôśpéČ8‚ĽĎđô]ú‰öÜórÂPHcËî+Ç9ß4–¨ř„´ćC­Ër·É-D–cz¬iß> éŁ^úý8w©˘{C°hüő÷ľń^O<´¬ dÓ)3ʢ$’ 2Ř(]Łäé뽿a B€Hk.,äc0˙†â&˛D „YřŁv"+Č× ¤6SZRř!(|ĄYńĄ˘Őkvţ±¬O±Ŕ&íş ţ6eÂĄŽm'nĘ©RÜz%­6ŕň2úi!@Ă F\»ă+Ŕś÷ÜĄ©;” Bl d™Ők< čđq‰LôUöuË{^aŰäěXă“Óz‘éţ>€ĽĘÂ×™¶˝ćâß wëb… ş…ÁŠüÇO¤ď_‰»˛‰Wi |ŤÎ†ßÜŰqëř° â8 ×ůŐÎLO†ß F­‰<vŠą<Ö€î™ĐRŇŚKĄ‚VřžĂÚEÉůi¬€„GMW4+†Cřţ× Śq*đ'±ýxEË”.ďK ¦őŮ–v#CßIţ3|ŻwuFť2™ÍÂëŚ"âNýzµO&d»ˇ=v�ü}v˛×nŤbD÷ŹŻ7ĺŢ·í»ué2}{ä%f8 BíâČö’^†8a'Ś}ÖŚYůx0ŽĐ$™=EŇęUÜ[#­+ˇąŠÁő =3'ťÁ‰uXW·µ"*s¤Ö4qŔćDkc]\B<’}=:âfîĘm}ŔD,RB‚ŇáFX]•ý¶ţµ‡ĄĹ�‰ŤňŚQVeipÉ뺍7śZLŤŻ}`čĄŮ{´=Ńäô”ĚŚ‚ fá—ý1­ó)XG“|p .4ěaGQ5ŻuÜŇžqEťľ/–řá1EÁd| Ş\!M$*Ú=ńż«ee/ H¤Ä*’=Ţ“ď˘\´˘ÓůY:¸\vâ˘a[1>ţ9«dX$ů@ťN!›Ü�ßL#ÓĚ?ľŻ+»TKöş!ÝióÄE†ű 6öap ,g­{¬Ň’sîĘq˙ă~@^đ¸QÇU™’gwexÁ> Řď:]S^<ѵ _m–‡\t¸–Ś °[Z˝Ĺzk2¶?e¬ëŞLżbęA®wˇo˘P»­ ű:şŔ ¬(6ŇăAÂ.Á)JŕŰŃjśĚjî•TZah\yŰΩćÝŢď1JW ÷´`¸W˙2ˇý(!‘m‰d»Ű:tŤTő°DÁ;ČY]š2ŃćŞiwff;ęi]ľ31ÇóŻĺ,_T˛‹Źý|”ňBĹpWýB§a×/ű–8Opëźđů­vwl‚ŁĂUÂ�ÁVŞ­#nŐdé–L3F7’6z‡ďŤÉksíSŰ€=”ő=ąÔočÝrŞëR]hŘęq+ľ[hd‚ëÂÇđA^Äă ¶A›ô·…˘ţ˛9v\_Á!Fąá–ÖŔŤ—ë~Éć2dÖwřŔ ô+{ÓÍ ?"a÷ŽĺďŘ7§WłÂxž[Đţ56FgUWJXŤ5śsW=Şv%Ĺß(΄+L;ˇ…°śń¦/*eO*ÚÚ˛ĎFmÖÇËv#lk`!ŃxŲdáö±4ćn�DšToä2†`Ą%§z„ÄĂĽń;·GóÜ*»µao&.ßľ|®Ş,…–hmăŁÝ­ �Jő!XWR_µ8'˙6…[µIY°·–m>Řqr‘Ľ@43-�źö5#˝Ě†'~ĆDŚ 4OmT*©WÍEŘ8U śKĚ&AĺŮ6Ůľ»‰¶6OA§÷ľ˘.k WŠ‚*®‹B˝UčßLł$8ńqKÚRË…Ô(iĽkxáöń9€Š˙ńOýS‘ě‘�ŕč|����APETAGEXĐ��K�������� ���������������Album�xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx�������Artist�xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx�������Title�xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxAPETAGEXĐ��K��������€��������TAGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx����������������������������������˙���������������������������������������������������������taglib-1.13.1/tests/data/mac-399.ape����������������������������������������������������������������0000664�0000000�0000000�00000246334�14447736377�0016725�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MAC –��4������Čq������ČÚ����������sMNrĽ‚9¸Y=Ěl°(A¸ �� �Ś#�������D¬��r��ĺŘ��@�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~ 0´���µ$��ćuŞ41ŘŤ0îÉÔ?YŚ/ű~'´´á­ ÂoHl‚łah>äő}!PÓsŻcjűâ~"™đŹžŃ-Í=+Ë~ľ`Cß1YdÄ‚yz1Q{çü^±Âbł«ęĽűÜ}ŽË­W¨Lc [WąŇz¸Ô¨M1Vív¤Vyçlu¦ňh2ůüg¶DPF ‘ €ö¬YŤŰ='C¬Šr×fĺY]Ué(¶ËĆ<żćhĐR Ń:Â˙ÝPřë9…­}§kév—»ř˘~”¸ńußű-/íĘ…NÝ乏«EŠŐżł¤D¦é+iř•ßņfG¶ŚŕpűÔŻL”MĽ…˙¦Í¨ąĹÔź… ›‰ÄčN˛#)Ć ’,Ě 9Ąë@4úe‚•mŢ3gśR€3é§Üő¸(~PÂ.ۉ“8ĘęŮ–S?©‰a´.Ď‹řňs*˛ůM—(:ű€±Î-Vń§®Nţ†Şçpłu*ŔCÜĺŽÂĹ%^Zś¬9G‚YÓü`ÂbY»9B‘ů\^" yŘ…3Ż%¨óĚ«¦Wţß–ç9[°=@¬ú°˛Âu®nJ°#e’ł°ŕüF+Ýô<×˙'ŔE’«Â×jWđfµšŠUW« KÖÍhîA Di  Á}î5Ş®AU*“Ť3âđ8Pŕb»÷§ [Ż…‰S ÇéSpŢňsŮ?ćS…’śVૌ’}ŮŃLV�0Š|xŻÉKé%®y©űA-�Ď+˘Ds•Ę«^ÔKôiNş×Ę©ţ­†ŞlĹdĹžŐ2ę“r L©xÁ ‚JĂ)Á(Q~3kW O Ý_č?+ VâĚ"Sk™xŮ$q[ţě+.ySwÄhĘ#*Đâöťźß®Č'(ů…Ő(‰Yśů[‰ó™ĺą¤fV>ÚˇŁÄĐl©čÎ؇iÓ:>%Č&@öČ8¨Âř "ýJČ“T6~2y°7©  Şç¦G«Ńt3QËĽbôP±Qsđ xŚ‘8¦ü'$Čľ\wÚŹhŽ˘ąH^z©Ŕ*َ<eČőn5ȵ– ě§Śq¨®PD&łÉꀉIóăyeÔż…6ϡ}ŘŤ±Ţ�·Ĺ‡Z…µ†KŹ Đ)1®3Dżýâ—FËSĹ*‹…=�E#őçÍ™Öę’CÇC@%ĂişŻěU"šĺËđ©§/eAŠJ3Ĺ|Íűç9xMÝŚýŐĚ!ÇŰ Íí tŰľ’Ěč mS[D5 ęŢüGÂśĂoV#xµ—LĽ>‚˝¦`*+C<2ÇUV˘K¬¨“q긨é»Ř?ÁWĽőc±M+waŁë¨óˇ,<Ę÷Č ˇyČz\öHR^*x 0żŞ])¶‚ŹŻÍQ'l˘¬=PŃâDŘG•(Ë7PĐżGš \6ö.ÔëČ~ĆęBđ“†Ćţň’)dDÓ•JŤ úĘ—$ܰ¦b1ŕ3O7łÂa@ŹŔVňÉÄ*äĹt=ţ?H čL.ź'AďzC7ôÇzL‘dą/Ř™cĎ=‰Vô˙RNçŔźú./5¨ /„<mżŤľ$‘óČÁţň‰[´;¬Ëj‡‡kb$bEJŢšĘgĂr‚ŃŮöŹâSť†¨Coź Ő?.ŹGcÍ'Ěrţ.$ł2 č5ěőµË9đt×<&ĆpĂËŚód¨!«ĘS#ÂKs/Ĺš«±Kľ”㡠öHĹ6ň^Xbôş?ánŃž†kŇŽ$7H‘Đ3ń"Ídb~„¶„š-(^ěY>öD˱\ŤßÚIĹöÍ%ŐŢ2ll«˛CçG`™8–&…bEç81ŤĐőšm‹Ž'Ů8»_(-ďąÄák?1öý@GDS1^Ň,#¦1¶NCL-C‡ 2cŽ&+îó'@Fś_«–l\zK=xvĽ™–ŃîÚŷۢ÷÷^YÔŔ&Qť}xao$ ©ľeúčˇĹĽcĺoy#O'IÂ^V!Öť&lÂLŠ€‰+?8Y«ÎQ5J äd4n˘# ”"ˇ|»R:ÁuŰ3BűÔ8/ů Öče¶\2€Š 2dQĄ 4ţ Z2ÄAu“ˇÉo%ăü‹Ä5g‘§ÍŃă%őko1©Źr n4†Š “˘)¨ŮOŻ2(‚É„�šSŐ G*”–öuď3hTy”á÷Ëz÷+ŚŠ…ŕu[}‡mÁů�  •ÄËŽé—í­yy|ŚŰJ€ů°ŔµťSó#5«-Ě.WůÔń…©b1·™íd Ń~>Ář~+öcH=É54‹=\ĎĚ—há±[YŚ…Ç‰xF6ö§źŇÁeyr;ŘŰz·†Üi „ÜV±Îű÷O%ŐŞÄąˇ«ĆHůkôM8g“7EާŘx_�®˝Ŕ9¶99’:ä·éQ yůfWÂÍĚs_›ń[KŞŰ šXI©şDTj\ ’ަEŽÓžW†„:k(OL_÷K›˙–xźöż&†×.ëŔ‡đÁH&é<şËLé›úxč;7w‘§öťlnu_ ë©!—^lŽ!ż3�Ĺ”1ÇäÚfLţtáůÜW#˙UÖáoĄ Nz8bˇĽ´¨S“ÄeŇ€A1]r–]ľ[ż¸�Ť¸äaŁ-Ďü3Î׋Ě'5" Vó™_=SčÄçŢŢšjo™”>ҢĂq°±×Ý–ŢŇ6!Ă©ą =éaäŘ~véźk›Ľ}bŘŹťJ~ = U;Yö€´dŔ´´ŠĎE‚±¸P®R€Í¦§�YÄű–ĺ1OvËo̶‚ Ő缾qĐ2öKĄ™Ŕň ݲ˘VĹH4Y˙ĂÔGŘ’ýnH#ŁîöěŞLMďCEÓŽ”·‡Ä!Ă oS˙çVŇ)8"zźË˙ÜíM4ůŃa«+tíĎš÷_2泪[H6X!vK 6"7Ö\iI3!pf%+W!JÚbŇ6Ő˝ % ô~Î{5!×gw“%:ß  "JĺU%Ń CM@h?ĘLzř8?VÂť˝ń©ähr{ąž…PńÇL©YtM–ĎA×GA#řęŻp-BkK\–…R6ŹąřG~*["0rŕ˙jsbĆ@ťľÚ5u2+dq\cq§(D<çҦĎ5ĽśM ÇŰ?P6T›}¨ĘGÂXĹţőŐŐ»ýDyzš¬¨eČ'A­=W´âş%ŁůĽÉřśʰ(ÖűćÓożţËŚ*ĽŁ1[ß×D,Őö»Óر—·&ņë5śA ”ř&“ˇ^Ć \¨ †KTc7­ůTÔ‘îˇßą^j†R¦ŘĂń48©ncÎö¨~Ůkô™ßůtŐĂ˝˛ĘÇ«ś-RąúĹ[şĚ´Řăř.‡,ýkÍ×’MÍ;·oÜÇŇ!^ů»¤Ü1bńŹ$—ö"Q*.G:8~µtÖ"l Ýf?ĂĎR–Ae@CŤ%üׂÇŮÜË1!9T™o±Ë«ü­ąDËâ(XĆĹËýÖ„tßÚúŘ„™…¸\$ŠB!" ý—>3,Ţf·űz Ž⇇¤µ Ř]™őP­3—͵ůěw8H§Îńp ź~č¬-~XĐ)Ń]]˘˘}ŘĘ0‹2(d8–$”Yyˇ“'Yü1î ąw˘Ű±1UőçęÚĺÉ&z­Np}Äş+’ ,t!9 ?¤K–ŰóÔݰů0CśxeüěCß űPŇöËĹyó &ľ$Ţ( ŘÉô\ăžű#Ýq‡<ěÍ‚kĎCż9k3¦ł‰ö>F+ –C-âKóĄJú!msćÍNÓ�\dÇË/z‹ö¤›éóě ’ą‚†D+Ą)ý’Ś.ěvÔ¶rón̛͌]ü€@˘Űu nTÜŢE}tťvŽöŕś­a´`M§i3\=ŚWl•a ¬ĄŻnŇn%Î ¤áNůôj,A憺W¸dÝč”IÄľô7KNä®ŮĘ*Ü~K<¦Č~ž¸%cf&Í ÚĂĚB— ĄáH3Ô$ÂÍíţíúOfGޤ˘˘JZmhť$©UumÄ ;yஏĚiDÁ$pµG\ÓW]–7Ćí**ޞ– šÖNHĆOM—†,`51է¢}öeă ]y˙ĺĚ-ÖÓ˝Ş·Ö)—Öç)2ŇŃ’!i]‰‹QăîTF©;äź",O]oŃ>´Ő´-ĽŠ·äűškë§ó4ĺČĂĽî5ý’[ŞlěQśĎŤŽ‚îőşŠžO¤ü«Âűă25ĄÁłýʇ1˝“ ›×O¤oň6*Áó˛¸Ď|ŽR;Jq8Śk€đŁęq"zŢÁĐCŢŇČÝáűÜ–$Xf’ňÜÇÔX,Ś7JÝĂ“?=¨!Ŕ¦Y ONą· kýwiÚÚ–“ďźJ˛N=‹… …î‹Îüy±áŔ{Šv¬9Ч=+c(FĎ�^ŮŃđ*­ŤFLľH Ĺk,Ä ľ¦·5•†‰ #|4[ŐËS÷Ő˝MAG˘e#LŠ˝j"OşxIµvجťďĚW9ęĺŚĘ•ľ˛ nźZ+ĎŚśńŇ&6řÜLíJŘjô¨_áŠĘh‹u?Ęť×ŕ°±!Ů ‚»vÉő12ŽGoni5ł/,ż<ś8đ2ALqÍ˝žJ¦řôĂĄIůFŻŁCw$‰+[~@„/r*ylĹ™¬”î™53Ň„! ¤tJA >ćc'§śs_Č©W¦6Ç0ÄŠÜš†éH„’dʦ�‡#—”O»>k÷ügŕń5ăń!í‘ű'„ßđúĎťµúNô‘3aş-”K±ţëZó~Ó˙ˇ†U:UU^ÔÜ€U[u’P oĚČÉ©lş°K=dŃŻ1-ľÁĆlQŽĐUĺĺV±´˘W8p8ÚČ~b aǵ˝ÍĄRőšĽd>qYo‹y×™÷8 ĐTVËš:٦ë[ĐqôĚsČ‹›]®G<–ě!D| ŁŤě•›.T#’!˘şţ¬ËÖ›<:<±GĹWnĂ)3ôH2śéŇs&×AÍH<W–Kű\]kq„Cé}Ő ŇŔTĽó‡®ęFP‰7aŹ.xĐŮpu!nC8oů|‘ëŤ.j Ňß”˝ÁůŤUz‡mĽü�Cž6vç§­ąçA‚ÇřóËGoáüŮ×Dëe˙ĘtîJ Ěż bąré©4vGy(ý.”:NúhŐ˛Úçßz3\Ůń©¤'c3‚ČÚ^Ç«đď‘5¸×ÂGSy:ŐXG9ÖĽS+ČÄ08 ÁÄ…;Fö%ű茉)mÓrË*‡s ÷ţµÄ =Ô~v"®=4]jź&|u‚V¶Kuôřt<÷ß=�gRöđž7nÝëŐ!šyż&mmďVqÍßÔPé3;ĘJ;ĘKŤJ¬ęeIŻ={_b q'-JÍÁ ÷ß]‚‘Á‚µž‹îF4,žżŁź††0–{BrWÇYh2§–Ű`k0Ą®ú㉳…ÜwÖ±,‘¤í÷Ď3Ä $/*EĘŐu˛ –żnęŮSÎhESéµlĽŕVsŻ|˛)Aq©ě•¶Ę‡!ÂáŘ*ˇ45agß?–‚Ŕyz)YŤýĂ0ÚŇ'ˇIě&mť…§&Ť•Ď‹Qň‰_Vt‚ÁŘ>8–¬‚ł.-…*ZĄçţ×ëȾ穤A:45ÍÓĚđÂŮĽ62Ú|»ŐqĆtVˇ×ý ÉŘ%….îTvÄۉwŤŇú1S}îĽf Ń<™ďĎ@ud'9ŐL¦ ş ˘d`ČGkB^űžŞĽ$…mĄI7Rë0p!€ţ9©Ú$ZaŁłiĂ›t,ß2r%#CĚ|E¶Ă1ąě˝ŞśŢÁsBĺUŐŚ|¶ĄUwjâë˝Oěž˝–bź @jFŁŁoŞÉ®ŻjËŔňćńđěpîň N;ťPµUö¨ >}cÝäŤ~iÖ°÷bţ<›ßV=ůŘ˝c˝@ŘđČ}r)‹ÚŠeźs4Ůóh-exšgüu™ô)3aał•ŢÍűh®řFAAŢÖńô÷D‰ď©6Żw]đŇ_KŇ3ÚÜŔ^ČfŽ jt Uwî)>gˇŢ´mŽ0iµL«ˇe ÇŇ’t|­aŚB/i<˙}.öŰ|ö‰9†±:“Ƹ’Ý]�•Íeµ„ŢEg@>°$¬ŰNBf”á„´wr Cĺ–Áă8čCJ!rLw™Ş¨ ľ&X$ëv4}źZV. ¤ËŹdlý‚Â4ÓyicŐ¶äőď©“T“�L†^wíoŠ4@(0qc�RkšĂÁö;ÚO•›°Ö\mÖe¦ů\}AŕLšćŕQ8>Ľ— ‚>_3¤ÎuLxÝ9ĆęĐúĐHELô‰ÉFM6!cÝĽ|HK»Ă$Çx%།ŤŘÝ^=śj=öjŁŘ=bĹŠˇHO¦Qň}(.ĂůŔ}"źx‰ ă#ŚŮPÖ‰iWÝCŢ›°-»˝qĎbńţűŃůż)Š+ÎiÇš-­‚@Ú˝±Ş­IŢ'†f[B űâť} 5ű<-×@7:.zXĺÚ¸Há|KÉ{ĽSt®I‡ŻriP^â"dî3ڍ,ÖŔř–K'CŇh: )ůĚÇđ;+íI»Ýźz©ď%}~hLFK<™ŢfĂĸFµ—iBĐęRfHý>űÝNÁu�UůôÝż˘z*¶¸‡ ¨NÍh·Ň˝NĄCź14\6ŞKyÖâÍFĽ 6Ł`H˘YuŘ-ř&č§ňëS De ál"«&E:=.¬/a‡ôöĚđY˛ţ-Ü®ŢL08ćň¦ăîŤÁżfłó‡_±®/V†)Wz&uĹěëWXüůwב);ÖY_yI%6éĄç“ŔŻQŹ^ Nw=vÄL.]ĄD/dśň™É_;†G˛ůîDL?¶@úMץPSuzĐgŻ YůVfą¬M ôÚ;ß:™ĄË”ÜÉnFĂdzÍ^ĐëÚqĎ=Ák˙¦ä˝ĂšeńömŃĽ¨t–Z‹śĐ̡đ�×V P‘´�qXôŮë’=桸˦tß¶ńVçm ĚĚů—sIrsŤR35×…Ôý`ŔG:$ýÜŢ<ů)ňuę±5&űŞţ›iEwC‰#ŚXg (ßW“óă•y›ž:ÔU4ŽźE>§´äľCâŐaNŤ‹×J@ D`Äů ŕ,CE[÷°9Č©»ŮĎ4i¨<ł2ňŔ6Ő ¨ ú®zďřJČ6őač€0>˛ÄĎź"ÚUKiWâp4ŚľčąLłôTŚşVZÓY"`{RB}Dsµ™y –©ą°‹/âŁĎH“ř`L†\V%ĺ?ĐRv8±/QL "Lżn¤äAŕ4ȶŚńĄ¨MKzů@ň?YăGzöĐŘ0•‘m‚;Ď062µý}÷ü„Py|jýÝŸŰî…!ć“{§é˘;xĹ’7öDL˘ČO;G1ťˇM@Š’Jp©J>gP Ń<<e@šD‰·ÍľçŃĐ­’_Čr¤âۡd3)Őý~ŻÁaž$ă›UfýÄë&{eĐoCů’Ąh±śĆö‘˝Ô‘EÍ,ű~(3ôx©'®Öć%Ĺ0ÍÜ«đ<'S lX=¦TĐ-qĂÁ…nŠťÖvľRÇƞٚYkKńDIYľ8ěô_ŕ˙óEÄş1°ÓRŢZü7…7¬é ĺ µd‘:-ńÁi1Ýx‡ťe ™ř§€R‘„…žsWvR`•Ntďô۰©–ߡ^Í&ƶ·˝xĚ«ĺnűcfQÝMöçlpě›ÓW]—Şţ(CHV˝‚GŁôăűĆb~@Ál{H‰Ń8ë^7;Ż5Ó^R!ç˙Ňčĺ*E«  â]ű–ŕI>  k©lvôÚ?ăËIOŐ$ÔsčIr đϗ·ʼ‹¦Ä깯B8¶UÉw żx2énľ† řćHN+ÜÔ>É|KL»LTĄ19`śGíjsa;¤ÇJĺ,ß.F¦.çB3Aű‹gň˙‚@ÁvŻ_íMoŽęI‚µăäČş5GdšPÖzR°¶iTrťXľ/`±ň.p˙)íLcB ÎłŁüíĽ+eN1ÄŽĆăZ™_šă«.WŕňxŰŚ}5»y!đrBŮP…ú§JpG'V—ĘѬȖŽŰ$îJ‚ŐmĆŤ~#řJÓ^އr„ýZj”çżťbá1čć4ŤsÁF Mm}ăÍ~Úż—[§¬7Ď4Ç âC|<…Ň’`ćĚĄwź¬zWű˘ÄB¬öËßYĎĘy@¬3–ÓWćĄôĎÓďĂş)âß¶Ö}…tńO.â»l±Bł´Ó9±bKZCĽÖľę@ś‡>Rq#J*'şt_ ‡éŮ‹­@Á űC›U­čV“ëI¶SxĽÇn!Ŕ)@ßąt'zaÔŔRm‚?żëç ÍlŽQN˝čpRyěÍPíOî^őű¬(5şo¨Ł0ęŇěř7­ë2Ë»%­°wî±űďç‘lYRţńöu}Y™ĺ=źSńĘ‚şžź@>V˝±ÓČÚţ‡Ż©ˇĚBĄË­—EÝq6î4sbeU’Ş~öś .Ě­vy˝»"EYoncŹ"»SĄâµ×ŰýKx<ŘuŹ÷WąŹi' ľď•Ç.§Vń/e+üî§Cr…¶s؉$>ČŘçgß2 6á롦Amݧ+«¸ěĂďż„FdšdYć.ů™Żë°  &&6ĚĆq-Š2E¬ m%H˙!€Űż–éa\/sQůó= sţĹĹ!ďĘ,ľt·€Űߏł8}˝×CŔ2šß%ʎÂdIŹ0Vśžś;Ń“=¨z®‚ ýh)m@ٞ @ŢăňŻ4b“ľş7"J¶ÝŁgăn,¤˙#Ź€"mC(Ć"~Ć` RłÇÍK°q>ö^´űF=K•5Ő¶]DqăőísËËÎ9z™5ŘI1ŚTś^ú™"u ;~¤KyŃD€nÁbčĽs/i~t°´7ś‘}ş]éČvŠ4Jšn¨˝ä^&ăŢ>ÂúĄ3O?ÓR?ŕ…ă^Ý­HÇ”îUĚíQňőçw^W~§ý‹]=ŹÇ‚/FZŔqT8ołžž•»hń˛†ÔŇě'żšLżŻ ˙ZŢ]ý­*ćâínbčŕÚMnWLcĎQGÍG(ĺŻf\—Úˇńh˛Zdľ Şá<ęŐ¬Ř<N™ůFGú)‚2ÍŞTě˘F¦Ó8¬†x|d(ňp5^ô…¦h´ő¨ ’ôPŞűˇľ~>W6éĄ2L۱˛ü–ĚţÜZ `ÇIůÔ'•˙",ąQÜ^ŹĽţ§”đ˛ŘAvO@ן_ŢÓ·Ł–Â`†`{"®ÔÚË“ů'-¬ŁË65€’o$wJ¬“µyÚĺă|é4{›é¦|úş�ÂĘ)Ļ̌Łňôi; r/Kđ%WV°zJ¬•“SLţâćüŃŚcíĐ&RĆx7pjEęĘzp`źńţ32÷î2-ŕyAňC %ÓŠŽIQčÝĆüF#† ˛źŇľ5î~ޢMjž…Ǚݴźó ţ/Ë»5Ň_ĐD8íRŻÎXŠ'a}YkYě†`&ßŇ„źD@ÁMßčţĆąôH  ;HQB\yv@Ĺ–@4aE€ZâŤ(7Ű—'�uĘhÚ»_čcˇ.a¤YîĐÖz)Heţ°¬‡¸śas*-|@­…ç˙ďQ†#ýŢ„}‰ă•=·ioŃßrŔ$î¶`rš#EĚ;ţ{ŞdüZ6Ă;‡˙ a.Ceö‰` Őx€©~ě–ĐRźŰ*×ŔÖ6Ąů÷k5Îe\(˛éěĚŢ»|­Ń” ýzĂ·V ďľ\?×µ.¶®_|ç`¤Š,V—gMĎ YŹBǧJí!đ/ç,Ŕí pnCĘŹÂwŚŤ˙˛lýŃŞ_š“­rž˝´NÔ‡Śp—"'Şh'ŽĎŘ.ħ>üIç“Ü.d ßű“˝Y…Ţ1} _ź˘Tşµb í˙5bŁjÖ¤Htń¬”C<G<ŕŔçĹqŕ’ Sv!ćţ23&ŚăĘ ôԷɦ˙¸vÉ0 ¦ë[n-}# ˇ€«<Ö~żŤ’JŽç1Ď›ů–lćd_ó¤żŕ1ó Aâ Î˛®ÎUOţř^Âk÷ăG±łć“ Ž<—aTá50"'RŚUÖ“÷é&ťŃ‘ ;JhĄI¸Á‡ôw•Z’Ťrř¸2ŁÖ˝ű}˘Ýň@žµËu&őS+±çS3ď­ŔämR¬„ś… Ţévöć6‰9ȧ”Ěľ˛~;˝–ýÓŻbxiB€/t¨l+%ělĹSÝÔ›úâŘĄ”B˛ôúÝvŃa't_m}ľĆNßŮČ´^żčETŇ.#ź1[âş9©ÉöÎ…/Á‹;L�đ4›eVźÔ˝?\óč±4ăT„ť»caŐ´á*ňlň۬ýrżłlĚÄLÚm$ŇyčöąŃúđÓŽđ ýîP™ŽźT¨°úłÉ"µ-§ě[”&—Š™jÚ!ćôöj|8îş”˛q‡L Ő]fJÂĐ í¶únsźÄ^xĄ„˝'cä[W[˛ÜéÄť‰„ĆÝ;"5nŰ;ăőOŤ‹‘TüBŮ~ŠÖćź Rö6†1ČádIuάűÓÔ$j€ě‹Wí4Jĺ‘1˘óá´2 ÚÉçáóĘ'Bôŕ}§ńĎÚ {ě‚A žż2=Ɖ¦hôťĘţŰ·˙Ţí%Ří6Lď‘ţźv#Ő7hCrEPďĂC„ť ÇŚ5ŽÔQĽR«ö /OÓ4Ţ1ä—bNÄѵ7…×ÇžZ'[K§˝—ň]-ÁdűoݸĐ1 ßš+řő[_\)Ď^´Ů-ŽMĚ۶’šßîĺ`ýϨ’šţâ>hŔAëEŻv˝ÍW4n¶pm=ćçż$ÍĆG#Z/% Ëßj’«jR=YżŠéý<†á*tě*ç=IlŢÜRŠŐß¶ňR𜞕Ө÷íVâ LżŻj¬ž˛®TĆHoe…EÚÜ·* ŇźáfŰ›_ąť�•‘ÁwhHÖî~–S„vő˙3Š)<ů?ÎÄ=¤ąß›¦äďTźťfyßź-ŰxőµI€Q!qµÚŞłĆĚľ ¤fգݸXSřşŰí*דę«ř™tě0Î%z<!;„Ůzř#=ńĄŕňm9z;&"Ü$ÔoýůëĄtx,nyöľS,ěÉđ,Ł/i$¦Ď~~ˇšD“5SľÉR ľťstUÝĎXŘ`O{~ÉÜ?Üí¸Đ¨/éÁ¸ëŠ ¬Ţ -ŠĐ즾Ü4ót¬E•Tu}ýő&”U”uҧż˘F’i9S椰©v8-1ô=zÓUĎţ7 9 ĄÂdAÜ©VÇ.~7ŔkÇ$Ł;ÍéŽöšVkŠěŁEÁŇ^ĚÔÝ ŮČíßlˇü=[eň 7@žm”kٔٶxčŞĽŢ“Ź‰9»±ŕ;0Ĺ�&vß'@ËÎ,şĘAâÍ«Š«w+™ çDŮ˙ĂÁBĆPd‡¦ü”˘{N“—r‚‰SĂۖł{âýĺřik,ÇE~ŁĽTŢż Ťä)÷Hż ¸‚ŰŚ§‹9\ 7!IeRÖŻy‡8ÉŘ ĆhnÚŘĹ×ĚVHdeŠoŇ6-,ź‚�$�¬ …•Á{z{÷‰iżqášlRä§ Ő™Ý74€źgtOŠGç'ý8™*Ş2 Z$©”X„آQöŤ˝íĎ™˙Ú6·!<Š)ť÷őnk̰čVůp–Ó °9ßđč%‡'ŁQI)˘WŽY“˘e‡ĆĎýŽ|lP6ŘÔÝČĎÇ˝ŮěWQ!1ń’­,zĄ¸Ë1(üYyE;ž=2˙7c—ësNě—3b{ĎfżČ aaÎĆbňţ–ôjšMÉŇŁŘnÉHó¤™îâÇF‹±R±˘2gólçz3IĎ Îď{ĐËŃjëFńŻÜBsaĂL Ë{Ą> ٦AŰüLĽ–?®uµă‘vű&[{,Äńöu¶gş eµ˝¸Ő÷[‡™/@†qmÇq™ÎÉ#?r6>×U«ivä˝ců;§žăBî«9_Ś;RÇăQ"ć“‚ýĚ«‰Ąţ»vGÔšä¨u« " Ňťążx=KM^1'YŹ*yĘgü‘Ć®Ă˙^¤.fŘfIqI&,ÁĽ^%ćĹ †Qó[]lËŐîîvv2]śĆq›ď˘YVC‡űŠwj{üď[eVZö�?Č˝T–ťžŔÄŰ0~*ßĆ;źÓČ(Ţ^«´AŮr7‡đĽUČŰ.íŁ 9u4®ë8cż×Ŕ *Ăv*ři=ˇđÜbł˛É„Tl&·Ô€ŰŢOŃDY[ScĂö––¸”ý÷iIź;żWđ©ÁčäŁ8S+?Ëa–Dža¬÷†éGlQÍ\*#¨bđϰ˛…ăĎu÷-D&˝Ĺ8ŰĹ©ĹäآՒjŹUĐh`Đţ\ŕěúÖůŐĐ*đčlb6Hąů%U{ń>±^±ř.Z�Ą‚y™ÉƬ.;žó/ghť‰1˙ďî•_‰J0“µ?/şěm=,ŽšcÄĆ—!+¶@ýńĂté5„†|K'„Pżä“@ )4?®âY# pYű*äŚiĽđPXĄg«^\†#Żĺ}t>Äm#Ŕ0űţ#Gýú±$ťsŕHA•x 0!ň\ Ç©fkĚU ä�LĂÚ~“=1áŘ~ ůn n™,nbłOć]d d~č3őłćw´ÍzÁůB&&/\ܵa¸ädvş›ý”aśÔ8FŐR˘JJ’ şŮĽs‘ş€HJŞë [<ś¬ßwąŤŁ]ŃŹeŐź˛WĐ<b·lsůôx\\™g&†ŞýMŤL˘±ôsIĺ:ŻĹÖ ,j\懽 ş˛ď˙ŠᎎXSŃ=ĎɇxX^T@ի髎ä:Ť¨‰ó¤4s*xţŹ1Ş4 ‡lĎҨh ĎŁľVµÖŤv•Vß*ś¨41.*’F˝A_ŇSąžçQĂţTcűrŕ)ŇŹ›#Üß.żęę3ĽEáP` ;„.·s˙…ďă~a[–ĂTJ%Ů qó¤’˛l%n)ćÔ±Ý+´u"ç*Αµ&ł˙—‹ćďč@·–  ˝rćŽ_˙ÄéëMđ2ßÉÖ)(+oŔ€ôCN>ĘB «í(]5śË»ĎTĺÉľ0Ĺ–LVd-u|._<~*C~Ä”< ]ŹÁ!ˇđÓ‚=iLřľfy#↿Ž>*äÎ5?"ěę–qľŘb‰‹¸l•ł}}·…¤Á kŹ!BĹök›5ŮAKßoĚ]PzdÖ¦ ŃVü„ÁEŕ<>š€_-¤Cîgě ö­µÖ¸a¤Č‹z}äýíŠm`ń §!€I�q^=$őHüÎWu±ô[K;‡“ nűş}Ődé‹)b‡ű…_á4wáąÔéfWBŘéÁě”äßs ˇdeß Ęë$ŘQ‹şŐ‰âCaťŚlńŁťKZzĚ�ĂCĚ"‡®Ó§6L],gy¦^g+-Â9h”~öŻG*”žMëc_tMŠňÚ“\ť#\žĎpŤ»˛Î°š<ŕ©řŚľNAÇwçŢńĹÓ‘ŹDG…ťű$R)ew§î0éŽâľËAk†÷Ň6l<něHG˛˙ąëhéźŘśeŻ@Îbť: R„¬^ôFÔ9ŹXĐd]¬3nJĆGbH÷;Ë)˝4ę_t`›âŞ<G}ÜWrfüT·ÔZĄŃj\6ę±Ý…‘JŕĐ€3·<ôŃĐÔ"“0 Ń^2éŔÄ« žŃřëľw»†sě‹'űČi ‰†Ü˙Ţ™>Ď_?ăźó‰Ţd('ŚýŇIŮíi{=µ®źĆÍÓHVĄĚz´6‚Ö—µ/ŞŞńÚˇÝ÷N_őěǨÁŇ,“pŰäŽE8n32*­Ľż6çÉřĽţFŹ(÷QBrČ‘ćúě˱ĹMÝŘC”JĄĹűq–ýŇ+Č<öŰie9A�F’_B—Â5#i¤> Ş4ŤŰÇfľ gZa4s‰>¶Ůsš÷Â=a*¸ŢŕĹ(LŁÇęÁu¸H’©J<űŘK·°KËĽ÷Ąó˙ęX(Ą Öü’>ů®˛1·EĆiĚ0ČOÁ´Ţ®0żşžŰÎćC:uëÁKˇý#}őz‘™ÎÎA˛~Í\żeüÂŔŐkŚŰM#0»RÁ ĘX›! ďgbË‚“Łţ)Xgj=ä#{Q˛ŢKm‹Űp6 Źháx–şm�ŘF±–§}1ľűK1ĺŮĹľaO\jŮý5ŘŻ3XöQäQéBÓčDݦš<0„Đ@ruƉن)iÇO[Ĺn¨€‚Ő>†#.pőčŇp‡Ůq©WAK}g… `Zč‰aA{CŹ#ëÉĹěţYĄˇÂ%p5ˇ\cŘďhŻbŘ•uW�ă6I;+2‰ykčďż˙°˙K?'jq!m  ńăHg“· %ÍR®'čHŇEaĺ™ůP2nŐ¨xŘŮL…›ÍuĘČpÓ+=ĚG‡«{.ăývB2,méď«~źž{ř’ÁWŽĹ+BLŘÚYZ@ß 6je× Řçlü–_ŹEĘW˙]»´!B__>0«DC6ŞŔy*é>&Á·‡’Ž7wě3ĂuHŢGěÍ)§˛�ËeŔĄ’«ÂÓÚJ!Č©9|’p8©›Ż›}C&µŢO¸ġ ‡î.ĐţĆm-¬9ž,Ţń µŁücËb9MtO¸·Äľ…»ÎwOĽNq–żć <Ż^[§I™Ź‡6ťî~±†ŕźĆVę "y9‘‘Áâ¤ĺá{Łć˘HAśĺ°V©[úDkąHxrŹ(Ôv&ű˛Ř2ĆÍ‚/¦wčŕŕo±Î¶KĐ/ˇ a”:EĎŻBÁĚăX» ß2ŮgoçKÓ1'ĄD Ëę® Ó‡űĽčĚŹ˝a{ŰkQĂŘz’•żË;Ć5łiä[Ěł ´ŞduŘĽ‹2Ă"ö;č"Ű:î(!šÚăn÷Ž“& ]ɤöŹçĚźŮĆ0H6dřKŢ„‹Y%ۨZÝ"ýą$˝ŰíI?+ů#Ľ!ܱúKjăčŔ?xŕ·»ełĄë =í˙Ć«ępË8 Ůš)¦‡ČŇw˛xĚp˘R|+O1ő÷ÉĂc.„íĹń&Ě)Ř.*4ńžŻ˛2^89ö Ö=Îţ2ĹŚž¤×sńâŕ`őŇë 6Ůă§ĹŃևڴ&ŔĆ~}ţů·tőp„ډ#`óEsOP®SŤ!ţL č8ÝVĎIĽM§}yţ$o…ÔďSľ ů Ř–ťv4ŮŢB5eć˝ ňś¬Ĺť‚Şlׯ}źF®¶ bb’7 H1_9j’łY-Qt]¦)+'ąçśŚŽĂÎrgwÇšI|éprö"Q©1v;HÚP¤]@ş –Gëžçbę×®ÔFŹtáđpă×yăŘ ›ÉÝĚ­\t ôA Wáň`6lµZ+lfÉáĆ’B<8µGŐZ…Ë=‹‰Wié|™ę-F˝iúđ“<–ÜÄ;K˝.äU]ąăÄő•É·v]ç©Y[í˛ÁD.ŽxKęµg;¸t©Ě÷U'ńͰăŻdANěĐH—­]6x˘Č”U~fć=>{W¨ď‰°‹˘Ž&eY‡ëBTéۡŇ�`äűK˘TKĐß)E–˘¶źĺ»‰ľ!Q_<I%ăüßą7÷ Ć•IMĹÔUČ-«Pp î'ŐSŢň˘ řş•_´EŠĘ!0šZ!ĘË^Ĺy4a˝ă×h“$ékşWa÷ŇäWĹR9lIşX·ZXZt‚NéMĺÍżzϰÜ2]±RB‰ôş7$هę+ż&Ş<Üiđ  tD¦0§čýěˇ�ŹŘUĂ1ŐŹžżď„哼îY (íŔËş´sî˙°~G’$/ŚíbŮh=|vb›fhQprłXl­´ltëŞë˘Đ[}‡ëR`ŤáÓbßoYţ«\”ägë@i+źŞ(ßS䤿ˇz Ücl)6đ»íɆ;šŻ ¶Zp6_S˛Ť,Š…ČqCĚŕ …\’2›%…ËŚ?°awĘ+\ü_Vüaăň¬ßŤ(Ş1dĄ·ao势2őŁ*0…¶ó~Ŕç&±”kgEůµ˝dsŔ#neŮđ§UĂZËŐTÉ„ŘĺZä5Y‹›' Íţd…ÓŇ“î#ÉÖ, ÷x1‚¤‰°jOťBG[]‘n܉]¦dF´÷)›Ĺş—Şaëę?}>.sCc©:Mxç@á‚{ °YÖMěýŃ'Ěß [gu5ňzmř RçkďPD"�Ë‚!TŃúlj\ľ„Ż\�9p¤!*ÓAyëšnŹĆđ•‰oMŤQÚf˰’Kť˙v’MŐ"Ć’=új˙˝�@šć'ô!.zü˙ůŕü-Ŕ]Ď]Ł ÓQŘS9ÍŠýębäV<ZAßj‡şŃ&LĂ­ţ˛‹ |±YƉ’!żú M‚‚­…p&/”ý‡Î  Xh˙¦§rőÄ |>HÇK)hIZ^űNökµ2ĚÂî¶?É%ą?ć˙şŚ„maíMťř݆ŇO9–܉!*XEĸĄ�§‰S”ö  DÄ"äVě·<›ł”™ěoAÉj«¤mę|YmŢóHˇű3Eę؇ք(«$|Qňş“îzĚ;îš­ěVŇy ^ '–çËś/ZRe«bß)ű9A"~Ţ[H<ŞAz?„™�–Aźę\TŹs.÷&Čđ/VçµUVö4aYn\úőÜ _řźTĚŻ B"RłąS°§űV%hŰîů@ŔO1ŔĹ®ë¬=Ö€ąşf±K4cȸ˘Bb±'i4ĂŠy¬%é&]Pl@†¶ýěś¶4Óî[u‘ˇői© äö¶/&X“đüÜÚř�Wxë5 Ł ËÉŁÉ: Q/ř…ő·É|Hń퉋‹~ceiCRN¶394D čÂs‡t sşĘZPőřĄ&]`ţ(ő"mšMą37 xa°iQ¬§ĄTGĆČD5·ˇŹ—Ô8÷@řű”áwÇńd—żs»č»Š�ĐŠë÷§{uŘ\b&ć¦-ĄB5Xšnˇ�YeŃZI5Ęč¶u=ŁfWDďi´}2ô[ÁšÚ„łB_XŇ:LjjňŽvo¶ÖP€hÎŃ—ĐZiö YČÁPůžWĐ tŢŽălˇŇH•:ş·‚?ďĚî¤;É’ŕ±Ú÷`[NaŹ3Ăý'ÂqĐx(h#& ¦8Š+<|'ÍČć_\ࣇ»˘x—Źuq9¶Üྥ“M&°Bb(ëńTŔiŢ0oç*î”ҵJý˝óUd–h „1ý(;Ltşs»k§ŚÔô}‘ę`żÚŰĂżíl ďˇáŐF_śuät ®<m͉9Ô´đ­F!+čç‚Í(“Ň  a±f\Ş e ĺ´úßýM·Zy)=ƸĐęř’ ¨~áhĺ«BÂNŹý­nZѨb–`»éĆ·Ä6 çL~)Đď˛?1—Ęđí¦Őбť»ú:•ZVg Ó\ľ=¦ľČ´�f\đarźQ!(‰íş©‘“wTŤJ§›A=❼IřÂM_ąłŕ)€08yn"¦Ű5ZĘßK8ŘŢÔŢ ˝Ý*ą!9X�Ą÷̱b2ڬN"şÔäwŽ#çśu¨%”U$—ÚŘa®‡¬3mpHzF]7‹Dářc˘Ő¦Ű™§Zá——ŤA˝„´’bŔN·ăŕ5-µ* =´fµ"ó8Ś Ě7Ž{—+hë(űJŃ—řv˘AĄź—f?™"áK7CĹkÓŻ9—Ő7xÖýJOÎP«áKĎXŰPy¶€ckJ˛[o]ďv‹ĺ[ęč<użň&âÓ®ś¤ó}&ůÜ5íąa+ń ;M(đ©¸Ë9”)úĘ9P‹‰ ´–ÔĆ:Ô<𽞥 ř1ăqâĺX*ąÂôöëG&-‡˘`ţSV>^t•tń)Öűß #ęCŮćĎ!â|®OYäČ`*G&vsŤ¦PqŻ!Çę7w°·Č=nrEŠăŞŮÍ`ńŻzy›L(\˛Ő{´/5§äN {ß«“5€őźç{Ć-ą®Ş!ÂÍ ÓőY`Â…ĽČă eéjÜ3”C=Ćš^€Ëڍp- »ů킡ϹXv^(ĄSpÜ´ýŹąL;Â%ż$¦ˇG¬®>•#Yk{Eá«&A?ž.MD™DZĎΖŃUG˙AŔÂŕÄ%¨‡)ćLÚf$$ŃÓąs?řÁ•zBcŇĽ–B1"‰Ĺ´@EOäů8›\Ýäa$•Ś“jx�bŮIüREEÖX?ĚBnńBSŻçCĐŞńĽŻ€ˇü7e ÍŤ€óęV|fެÝ&_ď)¨kÉě^~‡#ŽŔ›‰ËsgŞČ„ˇ,ű$,<›Ítă#][‰Nň PďB6Ň0ŔŻ ®±ń°_IčW~‡çšűBˇÇävĆ%¨#L S],Ů”V72M9›•›Î'˝áóhÂá o$‘´5ôc–ËĐ0·ú}ľëőŘCę‹Ă çYpxÝ‚2ě‚a ÇÁ-ng+Łľ çޱŃ */÷jčU¦ ăćéÝľĽłě€M$ŽĆ22ö/8ę.u•+ťrś‚,O%ËTfťĐP} ą•â(~«•YV*Íto.Fő·[ đŃsšö62aţ ť˛M“ą*ťúžG!OGĺ…çA|öĚ�9SíĘ;űMkwő4řf. ľSÔ!ţĐÝ?‡ÖTĐJŮČmA§ŮYv{K¸8úµŽ‚& e5(|™+C_·OÍVŤfîŤhŇBď5߇Ěm÷ľ¸™<ó3»¦Äw&oŠsŇú–Dú±–&tŞř+»•ye˘j«bůŤ™öto)Űů_©ż¬%ńň4žkU÷ŃJŮ!‰ĆŽ9Đŕ4ť%9Űkłą]Uç«]ęąIBîÇĚ4ɶ4$—€ĆQdYůoŐľÄŰ–¨™8ł{V#á<´ôC‹X3ŹÇĘÝDL’ąOAĎ\ ”­ßhü…DDňwžb°i…nĆ?H mňoDňĄ—@Ě·YšyĐ­°FËpe”Ďş<alKŮÔ¦Ž¦›ć‘Ýpłź`¦@6g•çŐz˙O†ë٤ĺ»ŐHńşÔÉĹâŕ7@±­ňdhě©˙x•×k‰ďÇ.3¶ŔÔ/zµÖŁ÷[‡ý+1Ţźň>Tjď¸Ë.é?é–TF\ą&Q÷MG¸2śřEH@Ž”őú,J“­P¦Ó˧l8‰?FFL¦ię?ĹK`ń‡ËĆÎüO!Ąc Ú»$Sý~ä tť ő;ý+ĹÝů-xK>7”Éî;C˘đ!ďâłě»·i®©č;Ńf]ĂÚj4ŁÜźYljÂQŘ'ň¸m)őŕrśW‘(Xw:R71g­ńhˇTS’9ĐÎṲĘ8–%çŽ)_‡nÜY2ř‰ĐČvzD6/Kěś9Úü×Fä=HÜ?ŇS“gő?)¸U­”W¨UÂ`b“Ptp!ś®>,SkMŹróło«S9ˇ ©“Ë,f9© y‰·‘É ŽŤ/ř$Q^Ú±†¬u$~EČËŰ”�q™˙L冴Â"‚Ź-GJnl8xg1L Řż ·ó? )CeFä5YG"ÎŐŔÇ÷Bß]§&<ąMÄHY@^R‡Ú“ŁúÔ™Y'BáŰ9˘/P×UG¤Daü)pb’xńÎ>âĆ”zl8%ă,ś;€Kčěöłrpk?‚ݧ+ˇ¸j(ÎŘUvR.SťGňTúŮň“Ś ]±Ž+ZöČ5żl‰ ´Ůxí?ŕ_ť§)=×?ż•TŐĎuXš3×éäŚ -%IpÎ%tĺ>{’ű�üŽl› Ú°MDYŕyě}|ž—N˘°XO¦ťéř@Ěép]jgEşjÉ4¶‚ÖŇK † Óe–ĺôM^}Ŕ%+A]ŻťÎÍr„Ĺöě<I­Şľ÷ޞřńŕaU°'¨łg>"Ľ Ęě!ˇ|‚®’<ż5" Q ?É•|Â.ţîyťšŕN±*!--Z·]rđŘ“$";ÝMŮóŐgíQţJެűî·ŔÂŮßČËTZĄ$ĎőLË`.k'gÚŽăé)¨G'éýFié/ô­IÇĎ–YeűO˘îˇĆĘłŮg6©‹ö Ö˝É€6 ť×šś¨”ÁÇ %qĄ6ľęÔăôIÍ‘Žqf•…Ĺ-QFŻ çý™BĽ™°ŮŽU«HšĹK{wë÷ážCl(_Ö)ËM0‚ýÁ?á—ÔÜ`t*]´/8ąŠ8¸ˇůĘ Äç”ŘQw†|5ÔĚë÷ŕ‰šyh­BAY�ßĎ*žyHp‚Q±Óõ×Ű@›ĄéZ’ë ¶:(nö PőDgV„r=1 ,¨ţú˛dÍúJJ?ă×]Š7k0_fnŃJŕ[‘8ŔÉńč#ý1ˇ˙”é•fXlk´ęŮOŔ»‰ľBYV:M-´HaxF^7„žăFßĹx5Á/Śŕ¶×'¬÷ô¦ŻŤ~ ďŐŰć Ă×Óu…śrĆíĹGGâ�ó’sĄŐ§řř6ľ#HßµŕŕY©™JK-‰b:ú&˘PúkB%ýÎŘ>܆•Ş•LH){¤ÇŠ2‡ÖµEíżúü’T2“‘Ś•U\úŚR&ólë—š?7ĎĆ@T×€?ŃŻ'*Q.‡ýę&:µłĂëľ;ĘA|)ĺýŚíES–1FJ>)r<Ęuë˘#MHQMŇ5Óěáęű"GĘBǵŰv™ĄD¬Ą¶Ž…ĘbĎîěۆÎl 0C‚ý‰l}b§§eOčč(Öš®˘¤ĽJ¨[. éŕ(Ů~3ü¤)FĎ:UŞá7©ŢńŁÜú䲕ŢÓŤ)x|3u® “Ó5nßďf+ĄĂI#‡ĹSwu4_v?\sĘL ?Rsča†ĚKÇŁˇ|«Q°·ęHĽ°Qž˛ ĚNőĹäŘĎ÷%uj˘)ęŔ[łp|dy¨,N­fر{Ş% r¤(đŢPµâi[Ȳ™‹_#ÚTŠłJë )­o¨˛Hçńţîö…>T±ű:V÷54ůít—:”uĂ‘âJʢ%ĂGŢ×Bm÷ő_7;Á<Ejśzł˛ót)í¶!ÉŻĎöipOŢr٧‰uD˘ßTß|ä}ó}ÁČ2/-ć|üŠmíBä;'v“ŢbQĆ‚‰eµUK„{3×mśő!ń¤DÖÍRóÄĐłŽŘ?˘Éí}—·Ü‰ł=˙9™ŔVzP+o1Ý@ńŃŃM»ďJŮ]čhđáĆ‹>K†)V”ŇƧI˙ńěČyzš­„÷ާŤo&Űwa+$Ć®;ü0/ȦÖHߊő\‰nî6$ŞűżŻĎ ňÓLüLˇL«r„Ňf„ćĂDJdn{Ď(Ąkcź¨ćCuÝť“%:sQ˙‘˙Öš޲JdZÜäIb5%Ě;ńĎ!CO'ŻľYŁ}í剚püM‡.żgŃŃĘŠŮ•ž3„őťčELRŻ'ŃŔ7ÚEîÂŮEŢČ»ČҶ•ŐE–'Rŕąm–Ţűuřu8>’j•jM¬u0ď°ÓNşÉQTZć`!š,ÇŘ<Pô9{^_irő”*óL­Ă.ö‹:Rm?ł¬­/�/Źßř jäWÍ´Ş(3řT8ëřRö Y68…m jŁÁËś ßŃíi‹ —qş;,ąKÜčAG§ŘL¦F”¨DŇR›}�‚CAU'ĂďęóYö¶knÖxü-ÜđŹŠ>ĽŕrńČĚ?©~±2‚¶§´WN´SĄj˘…Ŕ-y6ß6t!dţrYž)Ě|Äľµ~“żÔľł…ŹxěąZ!_ŮKđdEfŃG­F|Ő0¨ /벥„Ü\�ĚÁe\łL‡ČţśÁ/¬ŃŘ”ÓË…Äď%{ź®°íŁV×áÖŘöCcĽúë>¨…!E„ľgîs_÷|IšŽ»UNkˇÇ3Z`NŚţ=I,dďĎĐL2á†-z.<űíŻéôF‚BBmČ4oÖ–˝Vó)YŐ˝VPŹ‚XË ú:ŹKQ¤XŘâĄÍĘ=ŞŚ‡Ăź‡äž¦ň¨(RşĄď…„ŐP?fÍ^ĐŞ— 7Ü,ď¶>`˙ĚŕH*VÔVÝ÷áĚ ”ď\9Ć´˛ÚzŮ‹Ł Ýşî�ł·X·ü±;;üY°äýÔsUş†ů˘<Źć}Ţ-ę8<Şă’B߇E.76ěĂŹO¨#?@Ô=°N3Í|x2#ˇűňČ%ÚŇpĹP}öyzG2µ†°łĘ°Ć)°|ŃúV5€W&‡&Ő2?Ĺ*żĐ4s¨jŹD™˝šYG©cÉ^3¸ĺ([ŹŇ6?’ÜŘóŇR]T"?ő.bǦ"ü vATî…ł[qh6ŕ}q}ˇéae{Ü•‘Çę…żĎ:؆yş^PMPćQo&ěÄzIä~Ł[€RŇVo«ŃµµŞĚ5Úëo‚Ř:~?]FúńŐİť>óBnĘűĐ]!>réŘoY˝$nč¸Ëi L”m!q^$$“>)čĹD1qˇ9 ˛¸•‚{ü ŕ^j>ë¸Uś«‹ă`7ď%m~ 2 S¶FŃwłęŘr]D^ |ĚkĆopm~+—ŹJLLxxŞcq‚ëöÓţ]×w'pďěÔá…)ů+_ŐčXĚl‡Š^ylw4˛2Ç�±NßBBvKŇëţß(r°`&Î@FC? #!křÇÝ­Ńą—XŠ˘Á˝Ý•ź¦'k¬Vąő9őđ¶CMę$ű5*oŤÎ&Ó¨,Đ©íW±Ľ'­ôY¬x“Ă(Óď" ©YQć/aG@›(ÇĹaô®‘|éáô˘Ły0=‚<Ř.޵ĘU€ľŚuUlszv IüU,HÂŔ^·Lű�íčS}H‰}[Tť*ô—G×x"–‘9®f+v›^í¸Žtžá éąľ˛ĹśÔÎľf@&…u­ć‰vťß-†“)ąmÖr´) ˛Í<ía#!ÉL¨Hs#lŠ˝É›‚LźÁµEáŞ2?o Ą‘7„+ŻwQ>ď¤ó¬ýĽ–;w<řUÓ¦O&¦Đs+óW[Pyę• ZD’ţ_f!Fi„jćǚ׋1`äđrÓŐQ]tź[tŐ„Îp űżA_­†@ŻXśçCÍÝ#[Ů­ŇŢ/Ú€„Ö“]É„wŁń@}AŐU›Škmpß ůĚD1ä@śÝ ä¶3<}ÉŤŢs’ă,č˙ęJłk ˝.ł¶ąqKo~…;ţćŘďôć{Ö[ľ¸N 2„hűc«W{-RŢÜ!Sńľj''Z$ĂÍDb‚ÁĺĘűŔÍ{öQĎË?lăÚ‘"ľŐ•/Ű“Ŕ.Yw8Őöą˛ę‹ŕ]v#ŘÖŇűŕŮN›”Q�®|1"C`Ü …ţ0�ĚÇ·żýy+DęŘ&@3‚ęíÎm—ą<ŤCoZčě `ŤYë&%꧆ŢË�TŠ^–fŔLI©ű•vű±"¬ś"‹/‡ĆÉ&4‘Ž™Ś:)úƶőľ ŕ-Ń@»ËµLv‹ţąű<ŢęÓ’Ë ŘÉ~Ú8ç@F܆ËěÔxĐ<íwť‰{Q7‹k,öűCߥ˙mžŔtb¶IăTäŐU`L„…·sź QľąţŠâqÇ7ľ”¨ßč¤q^#x_�_x_ ­Š3W=*ix=:ťWź;Y´Ź řîjŤXI| »cüą| ˙ʤKqÉaŃ÷‚:«ÚŮąNž#5z-± ÷Áš,…+şf«Éä]Íu—�ŹóqEX#ćZUĘ8ßUëZYĄÇ%#yŚ¨ď¤«‹(PŰÇ/˙gpä­fk§ ýúař ćŤ|Ń´[)LOş[۲/Ć˝»çhbŤił¬çŕ>Îť[Łó‰kÇ ”Á©Iµ)ň@ ówé^˘t¦ŢóB°HX’¨ç››\ˇ¸kŰ&OEĺŁĂË�–XÂ:MęJ“߻Ђüo×k§ĘĹŁöܢ‘Âý¸#†Ű˘ŽrýP»Âő7Ý LúÔ@ŮYRL«úĽ¶,YŻÄ$‹¶¦˙DˇsµâÍgqśM=pwe®n>gKl˝ŤÇ“ŤyCZ‘\úŞDeUUPęSňśî¬ÜM—¤¨G&Ů3aäô­w ‘â�µšđ<ĐXr®¸«‚ô4@ ŔVašűćŐ A?Đäh©´…'¦¤ d—mÂđ)Ń6„@éîů— ťşńęˇ>ž ¸)\IÍĂQ_šMfń) Č5MZ rí} 5_aMĐĺb°3Cď?şĆç_˘w[ôfkTc´ĘÔŻÓ ±?fv˝Áq^Ď\Ż‹Ď! :pÚí)?âIĄě[,˝Ň.y[BęüCü+jEďo0Ň@˝! ­,ŰÓüq„Xţek‹OumŮŤ&źŁÜňIĆ�âŞ=uű:Ź®đr'źRŢySfgpĘż_UńC©ź˛ŃĂŽ»˙FPŇ|ÂťiLô»čKa…Ť6čłÇč"F%VCÁرÎSŤ;óG´•P˝ŃXP)¨'iĘ$™‹Ý…I-öŔIén»j;vÝ0[…<m-L) Xifíž=|H2ś%Ź`É–>Ę$“Cm,;TŢ­ţď›b,ďM;­•÷ى+9@,ŤLsMŃ}ËAĂ"c]�FA�Ó)Ýŕn§kËjaěŕ‰ šă> ľLpeE_B¦ÂWăŕŕ«G~Ť‹?gľ˛±g'Ţ?^© Btč…ŢÚÍóŕ¸ŔÜä�ôŔł‰•npýs}2Ú˙{;ű\÷…h{ŻI/k— ĚÝr$4·»° Ę,ŮÇsg+ě vŮ+?“q«ż�ďšÄ4˛4­“”*ęĚÓKľIŹm´|źG@ŃŇ,ÎÄ‘őÔ:=¦i^W�ęÖbâxxćßÁ1áŁÄÎ+–“í°bŮŻBŁř·Ţ Yô™~c¸â<RA &«¬k950ëĺ}6r|8úŐÜzŕlrĽEýˇ~ô<iĂőÎJO�łiżWŽ')E ŤŠĘ… Ŕ2„šSÜč÷ŚjRoc状JO ýÇĽ—IyxÎ×ëi¦ŰůX¬ůe8�ŠĹn7[€şWdĄĄ˛Mδb ßČ3.a-ąř{ň¤Äcăíp^ą·Ědâ‡8{<vr)ČP%Oú·aYj첇„čËWŠűŰŽ/<űň»śÜă‰Ë4BŐóuŠF>,lL!C5Kş;[Źó{vČ%îKTšµZˇĂivlÚ R€·H¨ÝÇ!tÁˇu–v˝­\Č@ ŚÍĚ?O•SM8sů2‡a¦Fb ntX²† şYŻĆY©Ŕ¨3 MEś„€bÁžd+1…!÷xÄaÎQŹc˛�϶$ŕ– %2;˙Ő‹Mž˙őép©;Ž:Ř{YŤĺBŻť÷Tȉ"·çŇ+„ţ…%±–˝{­/x'Ř(ˇë$/„žë#?ňŽAV.XX5fWŇ‹ë<*d%g«LÝAťŚ'u/%ŻCőůx#‡—iF˙(y#¶>{+/ł›­©öČôd' Ł®GŕĐăZĹłénŽŃ`HaEg»đůÇŕbY!» ÁtźÍw8~~ÂŁđ¸xýü{-úĹěxĐXŔ…+FÖ=v‘¤˝·nж0Ť‹=nJcH*%ZS•­ţöżęçĹ”ĹÔ¸&ÎťďQh-qJíÇ1ż°!ŽlDĚĆđz,!?@yYpÝJ‰Ńx “ŢţT'ŹÜziT'Ecđ›¦OÉ^3Ts¨W[~Ď0$±˛^$LidĹç(~¬zdĹľy0jŮU¸Ž=ń’ü›‰h˛łŠÂK‡ŚiŇgBÝëIęńÇÍ’(Ř-{ĎK\H%1U ăˇ\fs¸7  ř›fdë©®3a0Cçi–&mľĘ“”-zŢjn{ąţżÎwăîV$ÁYYşyIçŃë·‡€ů8µ{Š8A3mjť)Żď)Ńk Ćt`IJF4j–@ń‚(•ËôzOn÷¤ădýů­#áYşYG ptR�”@9¶Ž^ A˝ýµ|rĚëţÝ ?ÂľăÔ3pÜÎľ2d¸˝HŰ,?ąŔX™I›łĆoD"qţX^—ÓĽ·ůŤS’Í`&ŽďÔD’Óę“,‘2©ť™»T«ŕ}UĂv`KmĽüĎĹw&Š4žµ€ omBoę“ÍƤL(wó[Üά2Ű÷Ź Ł9a ş´câ7*ő±Ýz+ —ŹÓµ  Ľ7Ť ÇŔ ZIdyd¨Őă=4â=>-‘ß”ćKě„;⸻oWCŽá1Pɝ߯ä”Ů|ZňĄÖ!ˇ¬”¸‘RÔᙞHl-ă±ňČJ!ž úüór;EVx]„˛ČÂ(T«;¨Ŕ˘µ?+ČÂ”ŽľźJ ŮQ�ô0IľĄĽ–őJŘ„‰§$‘Zngm®q®3aČ÷Q‚CĄs­RÜóň…(tď$ulfÖΩé«[ÍÂI=‘O)D‘áÓ¨ŁÓ[-Q&KÇDőFŃO\mVd/ ˝ž�Ęg¦‰»Őâü,—¶ľ®ý|ĽIj ş}éÚ`Ď$äě3­ŰR@=jĹ~™ΰűł0ߎüE”NŘ;6ń…N­GB˙ű–·Ń.‡g…ő:ÖPúŚTxą]wďhú>đE'áTJ‘é4"bY˛čö3ű~Vh¤.!�rčŰňćÎJşhŞ ü……°âbv®ô¬XAtÉ÷†’Ň–!wĽÓŇU*wf|â‹sHĘt–­ řĄO%bÉRnŢ»űÜnĚ?´Ä!„8ř€b ®âˇé‰­ĺ»wŔ,Ťň{6Át>A^f�›ČßnŠżĽÂfkŞRŻ?ÔrYž”:=1i“v$AŻö×§`Ł â%^BDK«łÄ«Ůé” Ľ,áýe ż[9IčrAbǨEâÔťĚ*^Xîsü±›ú= Ý MHwŘH ŘřîrčE7ýj/÷r^¨”`úmşy¶my9eJ/śđŢ ÎpĽ¦ç ×#@ő$ żµĂ'Ęٰľ&‡&ó´ML€ŻĽkFž0˝}?Q\óÇ~K»–۰·Ó?— Ź3KDKauˇë»‡ţĚ&(ŁStq 0ńü÷š+8ÖĺŃüňđ€đyŠÖM#”\bŔúŢ*jka6ÍăŕöďĚŚ&˙©ą–Äś|W÷OľP$ąĂ9䍂@ŐdĎIěË’…•…Ŕ„Ę´„J®%–gąÖ€š?{†ş}ŠĽÚ۰‹ çóňi’đ$ĽËc° €ŐљߏŤćĹK2đÝńŢňÖ‰›.áM;"ý«K–Ú·ôO×WSwšęďÖüR:,Š…çnň—¬[]3lOľ×÷ĆđV1îâ{-ORÎ÷ś‹dÉŕ`N¶ü4© ("˘ÂQfS<¸XŇČŮ@H<ĺ`ޏ!Çďţ‚öb_e5 XhđĚ~\,íşQ&ů:łÖőQ<Úˇ?U‚='Ń>t"‹Ý“}k*d§XÚ„Ä_¨™ôĚÇMÁEgŕ€"Ýšţ„%* úQá»c/Žě™%HëÁO7Ľxşň§™¤[=óüoӫʤ çAţĎo­BwM<łřQZŃŰŃtÖ]šËo—`o!úž©B¤B㡾Ȓ¤µíîN_©č§’š7ô“Cö°”ć­,Š5§úιĖľ¤Ôm ÉvLBŢ©dŔU´Qť+Lş,ź'ćvĘŽb­®&!űŽi¶îXµđ{ź1RčVőĂyŰ8 ă[�ń®—Y)’SJÝmňˇ>ů8ä¶Řjţú“ŞĺŘ´",ÎKâŇ@ͧ<Ç–_üŞîŚĆč°±qÉĽ´5lůCw•1h«Ją˘—żW-’†\t×ŕ.'ĐN7/Í&Ť}»9„c\ÄŇX;@ĚFl&9ŽlŃUĽo âĐ x›f{¸oH×ń‡ ˇ-\+÷‚ŠŽ± ZVZ§éźĹŐ~‚A1V|j7ń¦=ď0ˇUˇýă5$[K̇w±? ˘á… űjÔć‚•äúÖËŰ&mŮŃS î'ąŕ9zJËĆ!iBnşě,ÝSXä¦1>Ď ˛Âô©hÁ&†€!óY]GÓB=AśvÉáÁ»Ó -+qŽXŹ |†š 9-Aűşjr¤Yqe2·?ĆźJý/wšż­T!‰~ěţľc[˘V „řk´Ď’ŤÎtÖĐ� ÷Ëw.žxKö]ŕ0>!CΓŔĺÉä7ě˛˙ĺ‹YŹ÷z…ŕ Ń88öv— Úf‚@%Ţő”ŽW±ÓŘÄĎĆŮŕ˛�©˛łŤuˇĂÁăimÂNŹ·ę̸X4QäÍśŤúÇ*TĐk2Ă >Sóß¶ůcȧ¶M’żĺŹ?-ť‡T#Ú´á7ȉƷjĚ”1ti¶‘™ç„Î]ĆM $Eyôúőš‘s»ŞŐ,b‚6‘főf`}©sçO]T§‰c ăŚzZ:5”j3Ą‚îvĐ™Z0ׄňÎ3^¦§lđ5+ŘAÝž"ůYŮc•Éę9ĎL“¸cÉęĄçY€`†4sËwúŕŕ ˇ“ćJ€9żÖ<@á ©˛ńćÂJ˛°ńŢ)đc9Ŕu5jg•_€B5ńş§}Sř¸ŮKđ- ęn©jÄF‚*7RŰđ¶y;JsŢÝĐt©úAĄŘ ×Ü×c-§|Z‡çÄěÇ*¶5Ř<ÜŢŇ™ô•äś6Ú˙µ%*]E—/RŇű¬ŕD˝tÜę{:žâE ľ´¸xţ˘ˇ=Ą ŕV ”öd\ ây…łJ­Ö—(HH†ů¬€QŇJÄk\¤hÓ$şĘG 3Ü˝Mö%çYŚCľłcĎ •lWPÂi/ -ŃöJϡÝ`°É,….q }V•@Y&Íąô|…r]a_˝Rý+9Ľ¨Řż+ĺmîŮe#H·ËG ÓwťĂl0Úâw±ť¸€3ŤşÎGa‡r%|)'“ŘX·z!ó×ÉŞ¸UŞGť8\×*ŕíD#măś“X"¦<\˝ŠĹ§gŃľů|ńG­ż—¨AĆď§c΀uU7ÇŁ|7 n©ál—ÄĄýQ˝‹+łújrG Ö·­×ě+hy¤ÁÍąS¸űF–”jžđT˛k/|6âÍdzž‡˘N)ú•Ë}ą¬n ^^JRŻĆľ^Ďx *Ň5ě/élUֱ⚡›YŻ·`îHW§(Îíx®L,Xws”v="Ë«—óݻӿg%\ľ đŃ[«`Ň5łÁé9?qäćl"žN<Čv_@řďDůŇ?`YďĘ$> éĎBŕ}oŤ ŞcݸKěPŞf©¤ďg°˛™ú3°ULóK'B¬’ “;ĺ{ şÚŮ™ŇTAâ‰ňŔ<Ŕî¶Śâxt­­ü¶!: %1ć›ČC×röľWE‰@7p5â›Ň˛XŽ˝h F_ă´^Ę)ÖÎY1…ť ĺö–€&t…Ű9E�/ÎóUmpŐ3N †šµCĎ™zuĽKë‚qěâÖg[r ¬śˇÉlWŚň,\ž¦JGĎtSŮfŐµó΢ť°¤břŃEę”m÷Í�09ĽĆĄL)Ž_ăměâTTł)¦9żc zž§‹H9Ť·˘gp÷Ŕ—Q4T]Űk©Eőľ,@Pí…Űâś�g¸D?5‚5_wWš¦Á'ę0%Ą®1ůĹĆńI­Ň#ľÜÚ”Ö´ĐŔ`" ˙Ărů)Ű_‚;™«ą/չ̡…ĆńF]dó6]Î9…±… šSŠ Ť˝^ťëQ{ŔŕE#Q;Ť/ś_/¤ś{PŮńAÚśÁÝo%JĄŢót·h4ąÄ· WµrĽĽamŻ©Őľ˘GZü»źÎŔ‡dĎńęI˘¬ľ€¦T.U˙RĆeí©Ě?Ýc±HţRŕŁ6UëF«#`LnŔA,–tÄCA4¨tł~żĂä[iŹń‰1™:„nóév­Ë„©Ä6^âIĺ+S0*ČAt†Ď#ä)­ă%stŘüµˇXD'@ޡ±QL«”WAďÔîNÝYbµ/đ·bĆśéÎJjKpySuő t>ń�rFH¤Ü†z,٬‘pK÷úŘÔŞy\>V«Ďă—pdţÜé@YfO T6Ţd˛3±ĎÔ-“LYĂiç CÖ"ů…ˇ71ź3Z¸ŘxđŚ r׺XwĚć l¨ŐŚćgÁžZCůpu&ôô‘†h$ä•éęŐ}x(›*‡<?ď…bĆT(A,+pŕ€ó?I‹Í÷`ş“‡ČJ|?şCëTül<¨ĽrY‰t5éőűUuţ 8ßeuZd h,TC„Â2X¶™‘é3ÚzÝZĘq=BđütßQëe˝Źí¸âY#”SEžmXĽG±ýwéľŃ6í äĂ)ÖŃ}ęĐoś»6CśÖ­ńźÄÝ­‡ŁµF#ľ†Ę‚ĄôüÜEÍŐîý)ȿؒq˝9G+KÍ‚ú·Ăb»#«›%dĺ%‚np×ß4#ýÇŃGćkČ’Ŕ9éě Ű ©€Mměb®fÂŢ hą¸ö×n‰UĄőEÄTŚ6 #GŔô&˝´W ‰çźCĽăŻń:ŇI¶ŃłgĘŕŘeEµÔĄ‹ĎL(ŞVőËVˇçĚf“ÇĄüĆ1ťĽŚ×ÁńĚŕŔŤ–*„}â0ľĄżSd2‹ŕújÓ\–L%I2Ę٬lŻ#éąVSüźm™Q†i|NŢbž őśÄţ§–ËŔš2ď’ŤKž_’5Š hdŢ2Šwq)dŹ>XËmóUaWł{,nŕvÂĽ˝ł·Â‡í[–Çî Ůsíă}Ł5blřĂ´n‡Ë†ň™–M¤—9MĘé)-ý RŢľęfŐ_±<? †ÓÂâK/ Âkt€2}z[y2* z3ďDHáCA:F“nĹ€EĹ\ś6ÄÖý+*€ŠD‰şɑբZ+ŞVkŘ:ž,PÓ-űkőÝZ~ó jn;M5™óĄ6ĎŕKfg…KGąëŮ÷źíCÚÍß˙]ťÓ ”ź˝¨Ü×ëô9txšXQřąË¨ڞíä°żĐÝáÍ"ksH艾.‚ĘÂ,tdY˘˛ł ˛§©AVH-zŘÔT@»sH¶áusÓŽśě{}é%ŐĽ˛˝w9Uř–v„=A+ ‡Ż#%‘ÓžáeŔ4™bJËżëć’d· ź&0�WôxĐËáÉ]«ţ3?ś„bšđmłŔrűp;ŤIáÄ…'˝7u?;4źr"W\Śj=ůörjĄ—X°}~3ę ž}čŞôÔO|`aíߏŻTůUžŠ%Bä%/‰±i‹Şť_ĺ5©l^Ąr $}(f%f´jWk\•ń<läęťNŐ¸—Ú‹ÚśŠŔ›OvŘ@DŁněK?Ä.uÂVyňŔLë’ř‚ˇ ĺ4ˇb7ź�ÂzBä¦ĎĘnţęÚj JJtőx˛‘çvĹâąÔľőî¶~kÚJ"¦I9ľÓ žĚÓę@ Í‚űyÍ®‹ą1ű}î JĆg´ÄhŇ7^ĆfoµËˇ>K»Ă#é ·gEr’ałGě¸8#@\cŰxî\Ü>jźôÚk¦X፳ĘRSG¤|§#h>U»~°űF $jâ=ŞŻéŹFŔi®ŚKŚ>¬’üi`‡y ‰}¶Öć änjŚu¬?…ȩݪŔ$Q„.h‘x®}ęcgÂóxË˙Â]j4ľŔŽ‚YqŽ€L+qtpǪ́hjZśţËé¬J5fI÷Ű=‚‹VsÁšdÓ»ĺ‡Űłuˇ‚~×ó ‚<ş*wÍ×Ň †Aöz…CÔIÂa Ď@In˙–ČŽůŻ`pÔňÄŘWtBX­Z8,Ý"Ţ2x-Sl %ß!ąĎ qËń»Đ4Fw1Şł‰8Đűݦhőö(Öˇ‘î÷ŐŘ8Yż‡�b‚Ś`·YÔÝlď\E»đ˘±h^ü“$É›¸Äß&Ą™Ţ[oFsż‘vŞÖŐ Ćҫϭ‘Đd‡öNúş|1ÔUů”*Ë”‚¨ş<čl¶-Ăv…¶Ëż9*:ÇŁ9l?¶ë(#ŇóŽ%Kgť$Š–öiĘP Ü‘SYNAßč·’X“p«“ásű=-¤ˇISQ-¦[°ćüćźAřQĆ0§ĎI¤h+d 2�0Ó+ş'«bŢÔŔ›?ű}+•(S‰q0›ČO˘ #šnµó9űx™5;ýtĘşň§üëŇSQNoÚ®G!—űÖ‘nĽV‡{,ř“i5Ś·Q=–;&čúŽšR‡äŕÁľęňż`˙Y¬lKăźaë–őĺ#9fšŽď'űů&1Şb\Ęś-A^§ÝΞ÷t‰mĐĆ 2Î^›f úz3ŤőҲŁ}$b=1Z{ťr-W�În”§9ă§Í·#–C8;/Ţđ«[Ě#nň±a¸ŢG­[¦şrÜč%Ç×{‡ôZ-BŇy˘ Ąů‡mjř čS^ăÎŰr¨}ŃřÖ˘ˇŐ–čŽ7Ďgšh䏷7´­›O\”ŽĄĺlž2šŐ*&á9ÔM¬_§Oďןś»ř(+3¤{Č™ÎÁ‰ţśÄ޲™§,dAPŔ—8¦Âů€‰Ą`ŮşáXWkQ¤Q¤Ľđ'ËľSţä°ëĘ2µ¶T¬Ď„P©ĘSG¬ŕ?<ČľÁ€ż`·s,ű2HwwÄŹ2nŮ[ľÁA¦�‡ôäĘ‘Ş ŮH O{PrúÍěd‹+íöňMu/QŐHŠ1>ąĺ-é^-;\ {®»űńâá88SD•ŮE†üş˘ŽTMŔ_^޵[¤<úzYż©L‹•1q®˘›ăoíĐŔ´W@eÇ I1 Ž‹qJ~nwIĆą4•&]“Ŕ×ę.ęÖ“ ĎĆjĚWu15˘`Ť»©w†vuďî>•iK­.ł~É ˛{­¦fS[óÎŔŰőTđL;ľĹił›Ô€‰'Ú"8´ kö p¦(BÄr&´Ż&ťĚů©gĂźlÚŠźÇĂTí˙z^…­<ICBń§đ<o›O‰Ąś 5Tąw•”ňŇÝÝźWiÔn� t7VjÚÉ�úě}Úä–«°sçÇ1ŕu¤ęwµćä‰!LziĐO8˝Q;ÇĎ&<ŁoR§°YŐ˝kž6Wаy=YÖ| GÔî;ĂčeĆô|d‡ŞY÷łÚ†š¦gáéaçă×Öž�‚ ‚˙ĘÎöĂă'˘n{fę2ăzXr$W>3Wkč8źü#ćüm,CřpęYµg‹jm*{  ő+E;wÖtÂÁ–*•íXY¬Šś-0]ČHŢ!ĄÁo†2§ŞëĺŁ@7Žź!…¶H ,K ¤ĘřĽ>·‹×Ä.hµëÎ[ ÷ĚŮ<#ÎOîý‚!ÎćôNŚ˘ÎJ´Ľ®Z§”p;Tšî›Ön‚Ö™ťbŮ޲Ăę0.hŮü¸AÉI+«öô_q�5•y˛…HÁM`IĄ¶›’˘ŹÄŤÓÔ˘+]W@©·FmąÔ×nţŠ6Ă´úţĽHňO»Ř€ż-#•Ă 'ďúşoŹH„¬©7ĂŞĎíŚî3¤#SÜs|Ëń¬ˇcw[q‹±ÖčąÂß´—#™Ýs?˝$ @Ł··ŕĹśü0&˘Ćę¬hŃ÷âšČz*ú¸áŢŢSâ3BÝ“ŽÝ.ľEe÷µ×ŇÁpW,*"§Y58`†ĽÍjłIbp–É*kA-š&Jů"±çö€WŐ)s´cĹ&­J)KlýĽT9˛Đ{řžq0:‡{ţ¶y{iŃô_˘§§ -đ@~Ëňë¨ýÇ[-TM®ű—ă[2&Č1_…Ĺľ„UIŮŽ•„4łMĺ>YÇÂ۶_S%ÜPˇ‰=y¤}úTŘyýqşľ`íÁvŃCĎÚ/Éo»Énwŕű±KP{ qAJV‚޶éx_TćpJUđfŽŹťÜľóÉ+Áu7žaÖ'm™íTWń3ŤÚzR€‚ßśĺ—˝Ő˛Upď˙‚O¦ę4”*u†ľ*;Ąä˝Şĺ:ĘÎ啡ŕ‡ěopd(EyWźÚ"Rş+eú#°Ăb‰ř dŻ+á#ôŕ¶IŚA3 •_7�§žúF[Śwľ2{d•~4źĎ ­Ű RiU<©şŹç~ߪhÓŇŔ a›ć™ÔČă—ä}ÄťŽ7¦µX(xQĚúż®¤QăŰř‡Őöeş,‡xÖŘ<uű¨~ýÇgVIôż˛\'vîŤoîŘ€îđZď5‹ďU7s묏Čv1[çkh' Cp[”ŃŘc—ęUĐČÎo�QĄëz>É ”re˘G#š\Jo&bÔjă��Âz±“ť����ř˙�öçâ„&Ž´VxŘY™4íż‰ÄŰ[úXxŞ{g »7›»|űëÓ„đžöşÝro`ڽX…·˛ĚK1C!QŕCtráy&W6hšrčâőwxŽN0ZĺüvLěžń„d雹“, ȵŹň8›Z—ČZ2a@ş&ÚďŃ$bR8"džëÜtŤ®KÍŚĚZľ~C™mF^<‹WmĎXďqóĐm„ŽŽ‚—ëî"5/ĎĆőĆzuŮ“ŇwG”1Új ÄÇ)&1e~{? ěJi-‰-mŕ <ęÍ }H  ňč.V8 "Ż›˘·‡÷ĂÉK1 ?ÖŹVZ˝‘YĂäu”¶{÷˙pÖ]ëŐŮćűňpOuĺŤônµR_w·Şd%’tĺâzľ-;­zÉZŞ,‘xá—‚˝™Q´+t#™}´‹#qćîŃEOˇý`8RĐ~ü‰Źüއ;W· *Řž¤…™m‚P#é=>G*¸%ćzGPÖŁ 5ĎRJOî—Ě^‹| Ľ)˙(©4m[{ő gĐð´™5-÷ Šŕť>E7Đfőm´Oš›řôhM`žů˛ˇÝuŻR}ŇYuV;‰ŹÔč˘n•íiËä[ŤŻžAL˘,ö%{…´›W}ü(ÓĘúAîz÷OúŽË*ÔŠ=?tMhU‹Ş~”ŻŇˇ@ő­ť軟5‚lBlnüě­Ňtt¶!N\\hśÖ©uČZ‰čfńÔ–ě|Ö·˘—•¶—Ť2žFÉ›Âdť}ÜHí?¦V†tăZĺ6m–6 ćy'6¦FآĆâ„ÎQĐ^·Ód>™ăG\Üň\ű¨^ç×! ¬Y‘RšüýŞ…sßĆPňţ˘ţF‡bOpĺćČ%ËÎY4đŐž7žhŚY¨(Bíó_9‘4O:zşŰ±şWdm´ O·šÚ2ř—ĚÔÄł+Tł>vß~3] Ü_S9ź{@�Ň*7ö“Óö­Ąz^¶U˙şŻ7&ĽijËlĐÔűźŰd´+˙ϡ€pSN`T0«ţŹŮWaŘV /ói^(QżP7:" ŠçńU= ö3aL5`D~äúŚ…>ąËŤĐžl5….»ĺÖ¨X?E˘˛Tç×ĹE»‰Ş¨+ž^)Řw}Şgx1Qż< Y ÁBČ7\ňˇľŐ,äoä.=Ż;ëđĽě=¸MA^�· Xťiß/– ô©tfMJť﹯Ű;ÖŚÔoÚc?›ĆßV…\—HŇF—{ř‰[’~ˇt°’šęŘ,€coX«Ë;ekdů8×;(_Z°šňaŃŐ1Dö7|w{sď+ń¦ÖG8Üěí…0ěÁ8 ‘6z9ôb2CVR«čń±ź|ÝőqUŐá‹“K[(ĂLP¸9°‰B›˝d.*BŞhŁJöĽ¬Pk0éDŇ—L7ŁQnţí}°E:Ô€tůłi­nH±fŤéTčýs­ÄÜűb™HGďă3K÷…6ŹaěY°€Ź˙SŠ ^ŕÜ˝ÔţŤă‘pZöéšź¸źŚ.Ź÷e’úô˘Č=ë¤č–Źŕ7Ú7†ţů^x99űÖŘ?őíę·„‰íţb6ÖęfꟉ÷­ęŐY‹}.nUĽ.8¶OÂ\‹µ&Ô Č6ńYŻđĹO,Ą ωúFďß÷$ÓďĽX#"ôë ˘Şť p¤ş~ۨäËšĄ2^Xěcĺ\^üFµ!ĚsqenCŰĎTčnőŽ÷CÉ61ŐŻ8˝6/•¤*ąC:WSĂîŔŚ 03’ôl»9]ZÍ5aÍÇŽ™¶Pv/™‚Ť;g!fLX YđfďÓ¬ç‘Gs×t-:ÍĽ!ljnŃ ŘhšĽQk#^éɱ*pĐ›Ó7ÉŔ…6Î{Żř:‹)·ŃĄ •äµŢŰň©ÎÖ71•đb˝üśZ´ÝÜę¬cOŻy�“Ş+loŚË‚ߤžR»Z9łFx`ş Ő1™ľÉnĄ‚¬šĆGň«eç;Ř aAäŠ?öá\ŃEC‡EŕmY.\[iŁĂćÔ;MĹ›Ć,ÁÁę¬éˇ'O`¬pŮššeŔĺŃŞúy>\Â’ě*c^µbÎ…Çť łđ»^•ŰÍŻ"¦÷Řś†ŽĐ ç€ŮukŁĺż)xÓÁşZ Űżä4ąĐ!‚ľ”tüÎśU¨đě⌓&ÔáVeJvČş‘ şkŘqčÂ[lxAivŞNK¶ó ˘]Içćł*­R;ţw/O1Aˇn řwécôA!]]z¬“öś�%ďjÇRfÍK‚Ď Ás®Lëţ=5˙CžRŔ^óčř‡+ň–‰Ű4 ;”ü–˙Ně®‚Š˘“íÎ0śÖ|)ĹĘđ!Xe;ˇ±:‘˛÷÷ 30¸@(—Ns™˝ć;.ŰDľÄŚľPúťUÝR§śjüź8 ě2J †_R¸ăEx­GNR0’ž»ľÉ6ł˛ĘÓbŢw@2€A‹]yµ?3INDď9…ÁćČImĚZy±".ňR|@c×—"}cCÉ|ó$Pkh+ŮĐŇö•ŢoC§ #“űźoŃ,Ě&—XČ……LŔŔ±qUvŠ$ŐU+Ä !z�dĽţ€ÍÉŽ)2ż|gfYXđřŇľr÷ŞŐĐAUş¸CěËRČ÷A˝!)H ŁĎy±źÚĄxUAĄ…‰GuĄXÂŘ8o4łKĽˇţÝü©W„óŁŃ¤l!ě›Ňń¶˝üZÖCÔ4ľ9ţ]>łÂ§]ŹZ·}ě%ĺŮp?îRĽ‹aú@˛ÇµN­aď.3çU9¦D fůŇĎű5Ň&.°_w­:«śoTÚ?Ł3m˙ŇÄ»ú4jȆć7Ȣ :d®g–„† |Á­× c€u–ͮ׌Çâ})ôĄŠ8G9„Ë‚ZĽŠ&hÔ©ě72]+·aĎ˙ŚÁ ń\ÖZßą3Pv¶Ô3Őç(ř Ę {@ŤLŰ×m;»Ô.2&­&^ĹÔĂËkÉ«ţúŻ˝–¶ Wú4›eŠwŢ÷©Ş˘ůĚ“.P>đĽEşáĚ]Łß[í\ĐóŹ~ň–YŔnî Ąo­jăAë»V /“zŚWđ̱Â7ňÔvf†(:e§DŞ•ÂĐ ZŻőş&ěLnZ9:Ú¦ťŔç!:óY›:+)=ůÓžŢFá˛sŹĐe/Z2ď`˘é0wKˇ>ň%Ër]ßť¨©¤'šq„đ_¦7ÖsÁĺ%đé±iLĘjŁXAňWľŽ<˛ŃK±MÔ˙Ż<TŃčB •šŕĘĘzéëĺ4ĄU×íhźŠ řvmÖ „řŃ{XötálÇ‹E‡*žŞ>ůžE4ď) Ľ´x Crm;±¬¬nÓ^Oj¸7[Ęqx§>Ëçŕrą%„ľ’]uŻéďfŃNO1‰09r®oej'Ćä%%“ú@ S*ĄýĆÇ_č ů,¸·ÓťÝÍáëRěPâŤq[´pĆnuc¨Ýť!ł“¨ęÄ0Ć*M^†Ř䵫j{zB2ŻšTI»Zá¸sń‡–[w/Ĺ>±?"Č)ô™ŚÂ>ÂIĽ6a\Cďj|knůŢä˛0/Ó˙?Ů]Ăar‚zé<¬ś2°Ô“f¨ÖßäÚŞN|/×y1›öÝĄ8ߌ[˝.j:3®ôu¬ž`{ž«őü"̲óRĂÖđ,ćhµbFÍ,4y-zż&i®"Đ·âć˝1*ÄęWI×*×ař`ÍĆó+í\v}],Â-čHŐľŔ§ÍoAŤqŁŽéă{ŰÚxpa“ťŚî.Žŕ˙—çîÜfč] yÄ%kg‘ ÷ĂZŃž…2'¤4¨vĹ�.Ňaü÷űzQ)ŚŚAgÔ–÷í!@€PDZŁQŰóH;áňł ~JTo(bÍ(áĹÄ/®Uwž[2—†.8ˇĆđ/ç)îŐ) PďŐ28Ą“Ň[�ř”ËN×kŞŐďlâÔ�e:řů» *ě¤37É2>Ăľa‹-—« Ą#1:üĽ×˝`u‰eŃbëQúPňAcüë-hq°ęhZJ‡ńvŞtă;±Ě)Łš®•‹ęÇĄ¤B¸–=˘pü4¬Ür)„¤…¶§ˇ†ˇ|E 1“h[˝ěYmĆág@Üjzu^‚•#_hJÂSyćźG€j[üŁă<öwęçř;QékLFw8ĚJŁN?¶E śzď‚GV‘ZŁZŕÚ…Ž…żCIÁ÷ČYC‰$ŹÂ‹1ó^Ćy_×#öű7-UÓ´d.g”:˙»b[ćŠ<Amň$fš˘ř͸;.Q÷Y% ŹY6 Ú_MĺŁ-Ö]>ÎrI®Ë0ľm�TîëČŻ™ĄO׼ž3�Ş\¦ÜJ§üÜ8}iŤ@…†ho n˙¶ĹtÎŔ\!P˙Ł€Ţ˙{…KʧÄúEľH]T~…3]!ÁŐ.Š VtyÝîĚoáŮÔńíbçUÄ«”l:8kTK1˙ô˛"ŘBm'ĆÎ5q«±ÄáÂIě“·€/ůŘRIg Ď‹źÜÁݰ®RĘř“–űLŇ Í?ę® ŐĐh�0–˝>Mü^ĺt;Rn|Ţ(Ęmöť„%Ë]Ą^ÉöŰ„ŠnöěÂ%!¸’MA—0‚Â$ľ ç!BRécÚGµóÄ“řKěQµ:$ˇoSfč|­˙nW:٦:ť ”CňĐR¬~ÚBš:¨›\|äĆX(NŤ[’a 2 «şč.ĽmpáQÔđÚ’…”Oß$óŘmŰ�¨|I@„^‘nRŃúŽĹv,‘{ácp¬ł‹F7šs33Ôůóą^§)ăĽÖ¨ŕŔé@dĹ‚s5/.iÂCË(DHżŰ®2¸ âŠ3ﺉד %eąĚ+Šý|@źI^ËR™x8É!aĎKgibú0BŰ”[)˛Ú|á¨^Ž[€Ç‹p óuô.&Ĺ)]šČ덼ëóĆŞ8ţué•[˘Ńôîæĺ2ŹéPŕšłŐ—’+žŤŇîOě¤ô­Ą^Ĺ›ń$%RŻĄőĺ ńźš8şĆ˛iN)uťÉ­°Brü@>bßf§ţ뢻KMvĚ9°+¬’_!ä ¨ďI"J"ĄGIĚá“?,UׇşĹ*źÉQ_uäČ­ ccÝÖćîäYö™™J]5ş‡ $ „DË|CĹIŘk5qN«H#ÄęYż´j›Ő˙YŽľŠ©şäVÁŸĽđ’á¸ÁoëËĹňspÍő·Ů¶é…·śÝv—É72!îń†š¸Öąďăé .–g ŮĆăđ”ň7Ɔ[U ]4ľé�#Sú’0ŤJ•Ď ˘zşţ•«ô.·l2 >q>ȉ`e€®Á]ě™Á™źo Łd[ěuyăXÂdóŐŔ9âóţDfMi´šÇ^@6Żă/żŹtV•Ż`âI·Ü]o=l¦-ŹÎ�lď�ŻN}ëF¬PďSu?ÁóößÇ€ ŕÝKj_´/fö_±©Î5|'ň–Ra cÄ=© -†ł!÷Ě›xó߽ۻ%Wjńĺ‰q}|<-żÔX3]•ë›-‘t¨6…6¶˘žŮÚ§=._ô–éneďHx†^|ď+ĐŰ,OµcúS¤r•ÇH•OŤ•�…f-ď˙|ěŕČ=·ôÇc˙Ýš ĺ^^ 7?2Ú ô[˙Řű‘g7 C=™FÍ$3VŕlĆHs—ôůK:vűą¦śP>VŤŚ¶€ĐĹFJ/ô°Źń|űÁ?ŢśźÚFAXŰ�Ď])Ťéľ•H?řˇU‡râ¤yłŤ…ĎĺČ[ćÖérOÉuĂAę!żzsPů8\j\Ť›$>~ßg÷*{+ ¬J`]Ź ¬^ ´�W”–9»‹Fś°>%®ádě&öţ€»ěî ¨µDŢ U-‰bÂ./yđtő2śľŻ†QëtÉ{ňćΑ+oúŻđbźžM\-;šś–ĎĺM—µëśş”rŠt`CÍAvꢣZ‹µÍĚ´RŁ®ĚYŕűÖ|ŮTTô7»’O‡ĚŻ˘¨-(~ažŚäĄÍueIę1+óŤĂ%r›Y%—źç0ě ˛"K´ônÔסaźBO•CHoĐĆTs«-6ň‰ŕő±cÇ4 9á>ЎU6Đ:ň•±ˇŽ§+ą «€ćkÇo†xxFą-™·•¨ě-hŢŕd“¬sulě†f ­]„{—ŻÜ‡úq†-[BK Űł0ă íł•ę9¸5'’Ŕ݉@f“ú}Ą}(7µ«ÜQ6ŁŤNŁçăX> –¤sLKj&űJ„ž(JËGń1=äÖIdvmR™ÚŃ­ü—ʡoFMsýâÚWÍäÝ —ÖâwÍgEł´—¨Śţ—ˇŹ–Ŕ]Ćň"f<ÇYŢ˙: 2ŤćGÍ>U¶a9'j_u`eǵh}ÔôpŞŘ+8%±EçoEn’KPLť!ĂYÉ) 7ŻčÇ”ÉĆŮZlěvfî­7´0ß\ČňXÔ(ür÷'Ń «gčĎϧÎxúżźł—1íTó~‹©ű&ľúö­1µŁŮdŻřaR„Ű” €ˇđ”Î*Q'‰Ux”łH¡ŕ68•ו×>ArE|÷ĎQśW"ł4V"ć︗ĺ§F;wI—Ď™ÎňÜ'ŽŽŻŮŠA˘ëÖ˛µŰDŤÓy?çEřz‘XŹŚś,©ŕ­2…‡Ţ‚,˘P\ăëGH5 9qČą®Ď{3AĹw*—4Šx$€GŐ‚ÖŚ GŃŐ¶Yd +Ť-t2dj¨ž&Ś™YdżeÄbÍc`Ő^ŠQ§Ň–hşˇ ­;°µG¶Ű‘úÝsé^DX€ňĎ™§ÍŹĎ­n® eˉí¦ăk-ZŢE2ÂŞ ĘüŔ©ş wOŮ•0óěE Ô  óĄŁPôB“Ó›ęsʵnŞIl°<_ .zP,˛ů®Í÷Ę˙]SËÇ–Qëĺ7 0Ýßöô"HCCÜ,Íöçj|j’…'Ę'^’7_"~ô=‡ä&ߪ.yTŹ˘&† >Ů?CS¶ńlŃžCŁĹAîŹYKhL8‹ż�#8ô Ň%o‹~ąäý†fÓatŽębó!ű[vvŠĂóÇ‹‹µłrńd qÖˇ>ÎS€í܆}n ‹ CŤX¬•˙qwń7M[ˇŔ6(q_Ú*ĹmŞj ě?ÎŹS«nś`ÇčŽă(đD>>e˘…†{šWu˛YŢS’Ś”1Ł. kžO•B ‘ö¶ą°nâ˙ĆÎW:ôE«čÔ­›ŕç†"rgu@ˇŘ›HY ŐŻňy§v°gy»/@°P˘¸Ą[YÉ@Óľď?łÖůĺU¨~1F0;7‚žŃńTŘ=·—¤Yxň»§.ë1}Ż2řŚ@krţ2ˇAwÉmŚmňłÔdęîNAU¦v‡5Ó`…QűjŮúëqöŹpöésŃ?čáV4˙ĹÇ"b—3®·O_Ň=…×úóäaw¬˘.\,‹űŠ­Ďć¨%€Úüź®Y8 u4¦ŃíŇr¶2;ŻŁÝÚyĽÄ#¤dłČÖĎ‹‚×{ZˇŰ„` ě V\)Ş˘…Śy)Ŕ KúG é ”—m—¦$Ö;Tďp€ Gť¤Ű{™č{Re™Gľ…ŞŠôC:ËT4˝Ę7ŰÁöwd‡ ]wţQwôg´É/ýéůKĐuÎ<| g}ů%ÁUőđ5BČNdĂ�¬6"]¦¬BCR¬Îó3§­„~n…đ^I…!Qô6]cjb~ ] Tâ j-ÂüY Ô0Ć :~çěŢpJĆ“¬“”Ŕ8úĘëđČuťůĽŃ_KMY¤Ęˇ‘“Ś)â±ĺ: Ѣނy’łPBô8[gÝůŻIáKtî=ŐPrVrMýŁÚ‹[㯕 ‹Č˙”ě«eúýU6é [|đ˙ČÚ 5Ň·]¨ÎľĚĽŽ4Ý’,S§Ŕިŕ®É¤1„AĹ»˙jmőA…ÖňôG6GÇŘtI(µĽP#I8E]*ř^=!ĎN-±3tÎ~çőÇ ˛V¸^€7Zđkn}rĘhU‘ÇŹÖ;LfM5żšÇαĚö!6¸¶ňwŕW–Ń݆˙Ć’Ć+ŽşŘÇ#jnÄŃ"?DßůţůÚżĄ DÇ�§2˘űs&‚„YŽcîśĹ=őíQÝ÷( Ëu¸4>nyk©đgS•D{‘ŔăBšŻ¸Ź\SNçjÜÍ?ůTľ “Bض:SRüzŢhŠż8�fé…S,«Żýb÷N@çZ`ŤŻ]eź›˘4µţÖ¦‰¤°S߯ł!ĺšă3§w®ˇ¤37Sž‚íöw”ĺ~6ˇ°ĐixˇÚZ‡Đ1žÇç•FjţŽ˙ż@ bź\’Üćg•Łă,ń^cwŚŽi$âČ6˙ s×gŚ6ńs\žôŽÁ͉jj"íĹďZvE• DZ±ß_+1ţ]«˙_Ţ@ËË~lzsŮsEcKíłńĘ×dJí«÷v?K¶rTÂNë·ŞâĎSĚ‚ďŐŤMlÝŠ‚ÝB`�Ą˛ Ňúř-…ň ¤HR0jµ÷´$ŤKo¬·¶ë'•E [NÓ�ĂŤĚçÓŁC'łůńZ}BV¶“zç˘É6”‘{«LNÜ1 e’ě ł4)q§K«bDëM’ú_L f›zqÚ!Q?qÍČ˙ń`Ăc4çN]ef=DëşgâwăKCźč´1*Ť¬»Š°©ç‡'gř2¸=GťB ŞJ$đěI^ÝŻ†ď›"ľf1šŔĚť}çő÷ Ćă„–•ÉŤNŢŻ›‚p ¬,>ĐěĄf×öЄ�uDNóaôŠ<jŤ�ÎS˛Ĺ6Ô0†ČGą§J.˙ÇFzň*Fâ%ÎOß9͉łvąĂQ›]Đ)÷ąËÝp îďV4Řőy“@ABń>2ĘňžLh# đHвőI”*jŐÇ1´ŮdC*2ĹłPŃn ńT/9Ř3»iłď~ćŕĨ˘ý|&;‹8,ëóÔ Ź_¦Ú%Ěp\¶ţź†w‘BöŐ—`äMĆ‹«ŕç Q"†nUţ”ďĘĄ{0ąÂY� ÁŰÔČp k©Zž™äxjżF ,T¤|çĽ ü9Ľ˘édz÷ń©oXŤŚc[ 76Ĺ÷ŕ+cŇłšĂ˛scaĽd6‘˛— `;ď‡{)�Qz2ú É Ť©/®®f„©”ĆĄŔ(Z?M“ý Ťwiâ‹˙CŃ×űŁłp¬ÚŇ|Uőť_q ‰O†úş4ç®Ú Ú™Á(ę˝_śąÖÚŤ˛`l¤µ7 ôöÔo26-Ú§Ďwç˝ý·m ňr†±‰×NÂ:ńúR%Ňzř3X˘N^űfHG:ňK˙lCţMIśařî¤ńAőń/´¨GĎÄY`<#Ő‘˛ .éţ‰nׇ3{d!ơĎÖTęúśú‰wĂP/†eŚ[k5$ľ°Ł]eŤŘqj­ŢśEą F!üľ5Ńߡ8mIź-®§¸ÂşD\}ë v”‘lK×yĘŘ1€ď«ö‹­çć Ń•µ±¨4 Aâ‹aăâłghALmlŕ˛)Ú‹¤¸Ő­öUôF—vŠđJWWüÍÚ/Śy¬ŢL~ ?Ę|Ó\őáJ¸ô‚ošęş^B Ěý*$=ňtÇÚü'I>ş*Ĺeç7ô úA‹Şźz˛ˇ\ÍÂLí[`XP@=CĽĺŇř|fk‘˝9ś9„­3WłYć__¸GQůUáE~)÷řÎś‰Ü;üČ«WoąTL¸Sîb˘ě{hÓşĽ!*}— \ÖŘTH™(¸!sş$$Ł4J~Ż?ž wéŞ-)ŘD˙C0~Ą”đ‹·}ž'íˇ <í’Ë­*ÔU]ěM �§ĚhžşŃ¬”6*ŕ3ň.N_4r_î˛ô|}ű…úhŇë‰ýŃÓ‰ś%GhgÜBäľÚűm5¤1 zˇő‚´ÜôâŇŽÄ*€l7dŐ—|Đë\ů|š˘ťâ+‰~ĆtĄw«?Ń éňtç.H 0˘Ü^őÇDĚI­8FGß@ĽľŽ˙ĆŢŁűzQ¦ZÇ˙* µ˙ )ÄÓű>ŠOQ÷üľńţs˘âĘŰyČéOX×ŮdöĄo˝©Âó˘9Ątp÷L‘ę ŤT«rľú‰ ¨‹ß/sÍ»ĎOĽmk4ťO5"ýQ®2#Z¦€y&ĺ‡ĎŻîé€äüx˘üÍš}‹Íśżô.Ű8"g…ł—ŮCyJE릷Łᬠű żĆ˛UŤzájŕ‡ĆrKâťbq�qh2ÓÓĐëăSűĄą%cő•M~.ÔÄR•E“/ ›žçâĹÜ:µt&v‡|˙ě ęnf~ŢIöÖ<Ko–SĎęu‚¦®%Y—’ć’‘ĹĽ3L™sđ�Ś*¶×†oŇń˛ Jů]„ż×|Qj.hfîn*š÷:v¦_ăA] űgNźvŇR0ĺÁ-%ŃŹ8)z¨Źg”‹ ľÉ”`¸íÂiĐv6űyÖ–äţÔKĚ䯣ěĘĄBĆŻ”Doš!O˙ôTÖÚ‹|V›ţY-Űň°íú3«ř$ ”áVĺ)şuW«-{p˙|Úî¸Ű°5ćn´7ÉÓHűRÇi?OÇ­ŽîQŔ *€yGtfVtkŐYCŤ(+t0_Ś€eX´ř&řn�-¦Éh—�ŐYÇUŤˇě“a;Ě›­‘e Ś+ČA›ô_:ĽcĐMy)ý> z±f÷á„7„G˝ëâ+cŕ3‚÷E$znP÷‹őâëAć3ânŃWSăVH­Ibpń>ęč˙âF<ťl™\ü�ńíÇr*”~Ýi“ßť6¨l¨ŹpÄzE¶ó¨1Mer< oI3a<ţRĄ¤\÷ßóo9ůčeÇŰň\d,]ş‡y``Č‘d$¬óF) źĽČŇÔÜŻ¦żV«Ď.‹(/z›Cś• ŇrĽĹ­/™<“¦ŹŤ–Ö¶ś€„00`ŇÝć)đ#źj_¶^&[Ś»ÓVřÄťHGGéć$‰Ľęi}Íś‚űŹq»HH*Oă=7ň×Ő×wmě‚â¦Ď>=ŘDŞÇÂ:˝ ©$—Ľ—=Ůě,"@hi—_ÜňaCřIş•dQšr”ARvŽ=tßź,.rë˙Čş8„—Ń›Z bŐË °÷ÇŇŁ KľćSv iĄ§/ćż…çŔćŰĺ•^‹j^A[šMuîB*Şýör-çÓ¨v[±»ÇĄ{±˛ ojŽĄ‹P×yĆ‚oĄ]žpgĆ·Řţ¤’˝Őýâừđd7Xôś‡0(ň Ś“~Şö|ZHv™®eă˝M2µ×–­(‚v)*µ.âð€S‚pĐ ľţ?Rż ßűâ΢~Ţ=’=Űż�Uřf?xs 4$CŢ,€™y"&J˙@L?şE&öDN®“ÚEiě×,#˛–HŘ[ á@4ľöň9b'Ľ@ô,Ô¤ż®š`owXj¦4 :*}­p*;I&¶ɉŁ‹«ęű“Ě‚¬§&8â®ăč2\ĹŔsçaĺ»xe")B ‚<ÖC%ˇSbACÔ ćÜ)Že‘{Ý6p9ľ7 ŇhřŇźětfyŮ YŮkĎxU©ź|’V¨ď?®ČŢpŁö4ßÖ¸űÄ×�‘“ń ś ’H ŐÖß÷–Ý« <zţX5>4c—÷ĂăvĆô9Ë’ASśU!tÂčYő±ŃF›XEšŠRo‹K4w#5–p ç˝©Ş–Ś€ÂÍ–vÜű-3Ę3”w+Mo`ô9ĄDŽSp`ôµS•"ahv~®!—‰mK·ëűĎg„;„Ťë-,ťb˝ŹF÷ÍEĆł*0ą}íśż:Ti>ű!«Ě.#źŃő(ť,BnęL•Ž˘~ĚŘ!a’đőícKĎž®šÂvBü9x†Udž)Ču¶żG€ţČŇčrÚýp׳í>-É3Ô•ÂU ˛­tˇ˝u±zËe+>^©ŤŁńU•˙3o3Ěɶϧ»kUXd"iov„ŞţÇ3NźvIT!x®§xq‘aźç¤mp‰Vęń:a1•Ň’ů/!Ű<Žň(ŐŻ›¦ŁßJ8¸›đLĐzî×J Yř˝ź¨mm?°ö™0óaŻSŃHe’­‰ŞĐ#lí”IýßÉŢIĘ YBŐŐńÂLË5ĺUnoŞËMccš”„0$ü"¬ę (83 .8 Fqřt¤–+ä`ŠÝs›í›Ďr(˙= űžL «{ѤŹ“mDČăhö®· nfĎADˇÂ„gqž–‘łˇ-Ťę~ÄůĄĎ3†EÝ:ĽY ;-âŢ•|çjL{Ow7…ËH0'¸”Qˇ—=đçm?ž©.ŁŐę…3śŃcť±oF>¶¨Ç˙÷ۨß(ú~ýřVbÔ ¬Ő/öťŮٶVč^Ć\.�©ębřG öĽÖMz‰ó±K{´qŚ.Jź˝[¨‡:@,Ő„1ü™_cWCNěXmŮb‹°=5)ĺyńĐ=|řH~/ľčFgÄOYš<^NęĹŕşakKq.0�ź6°�ŹôBk.ăʮ•î Y„$ŤĽ6iľJűn<>1|aEş4T+’vC»ĆˇDô!4™žÇĆ�–t>Áź\UŘ0Á¸INo¬ôK8×óĎD·Y Żî=;r>Ő<F[âÍô~™Á‰rNš©Ë+Y$i‹„ű°÷­cl’1?š’›4 đË•ęm1ayş|EĐéę¨.N\˙aŻšż‰ť!Ł|bĎŽ5Śąňmr·śy(ćźlqJă±ry˝ÉůÇžE$<¸bľfąApO‡>śCHRŢşë%H´śżµNWÜő2pöć˝+Hp\>Ł×ľH‰/Źę`ĆI&ăFˇt9 źJ°Q€E}WńÝۇĹöĎÄN‡µ˝±(Ρ#IŔ*/Z•;ÂűČŰßtű‚§ś¤¸(EĎ�OĂ[§ČF(–­řř‡ü€Éů6ixˤşYp’5°°]´6{Z76ÜĂ—"3µÂĐşĹ,Ů,ŢÄËŮ4Ü×$ó4µ9?DęSKŔáÚý–Âëĺ=ŚÝą€«*aé>@'•ˉóFSôg¦P@®ŃB~}ÚÓĚÄU3Ń[`\]•±ĎÔ{«= \Y™Ë"oHťźőĽîyë˛H7č5ŘúXŤľšÓ‰†/ĺ>:°MĂęGvXíž7Q\kg4ç!Ż€3 ° [ţ©™ŕč'‰+Đ^SWŏ٢ďs Jŕľi˙¨ľ2lë( {ľ-ŘńKŮN{^<µrćVŢÝP?' Vżˇ€ViřJÄ37˝é ŻÚcšŞdöfIě悚VŮlŮq÷ň䑿9Ś2±ZT—Ť`[PŇ‘ŇËěYv7‚m[ ýM”‹ őT§č™ÂÍŐ×@ĽăXk®©MÇGÔôo3öű.TD†?ŰÄ«w•áĺ˘~˘pDGÜIW-źĚ*îVf”mw\ŮőFr˛czŤ3ˇŔžpßnLωçö+î«b‘­ŔďöŻĺ€PÄ费ɎŔ9Çd9¸A`+P®¨‘8¶IQÂC_ě7#ř†©qÂéD`@íFC5lµ�§6ﯸݒ§oŇ9ČzP}ku oŇ:ýŠ×ĆR“đÇoLŚĆúšŁ­ŐýYře5`ŇŠ­‘ćHm~ç!—ń‰Ěëę+Ř_WËFëSŠk˘rťĄ$t[Cý<m óQf8®gEڬŔ‘§v,cĚJ ÜÂ]‡;Y"÷żĐWŤ|q¬Ń3ľfÚxěa*á® ”j #ľ¶góŞŔ˛yZđkÍFńšÓ"f·iH— �ç€U§¦¨M‚Gţ*$ľ_ýî€_š1 Š_*·­*ř"(ŚŇŘů—ŢKŃjzٍ#– çläq[ĄjÍŰň±4š87ÔµrÜÔ~Iż@mˇş|x“˝{b„'ŐŐű}$¦ö:ěK×zŃŁśb±Ub7/˙Űĺ˝Dă2,fR·Z·rQ+—†da/űFJĂÓŐ‘y´ď)9źŕ?łŁ8ĄiT}J;)~žĄ3¶liVóý‰ű 4J ŠŁĘăŐÍb‹ 7ݢݱ´óÁ ]ě؇ëgÄ#XĘ’#Á8A¸k#ÁÍVůR2»8ąŕźÁYţO„°lŮTOcńĹÓ„y$€K°%Ďy´ŕ~ŕE7Ô®o;łKĘŇş6đ §°Ş›W±ł‘Ňaf~‚Š®žSsl˛˝ţ'ĐgdP-LqŐt<Ô…Řp‹+ńHÚČcňÍ'ŕl^ß,TA;żôŽi°™:Ä'˛Čaçšâ@»ŘÄŕ.đUx"ÍßJ±*UÎPÖß2÷ čgŘ•ŃÓC1oLŕ±^Ś%µ"¤xBĎođ uVѨÁYDž(˛mc´…ĂÎ ˇ*L>ÔĐ6[¸¶î/pő=5 HÔĽ@%ç<ďf´NéÂ]4sKŰ|D>Zd/ĂŹîˇ9b?_-!É˙<öÖh“=ĎmöˇgřÂt~ˇÎrL¨B•NŁ>oLŞňţ˙´†ń>µţʢ?l ÔqÚ˝•I™\}Wjö‡‰¬¦’śăâç3k„íčúYu˙Mofu0Ů{őqdIÄ®í ;×ĘeőÄYęđÔóä¤óă\�r]ĆyCvÁńYĺś* čĎšű,ěGţ’ôµű˘�ĺ´…Á7˘wá{Ńć8ďPŮĂţöílÚLôŇ…E*đ řg§×T’©áuFٱÉę«33(cËŐ]Ëgä|ĺ°M5ô9lŤú•S?s2‡ŻŤ’€IŤHtëŻŔÁ®& śšÝa7kł6'¤ąęŇz|ÖČBÔňTV˙wńÚ{KľĎĎg@WÚˇĺĘ.âY•ŠŞQÝ˝ŠJú÷TwŚlÉŐ¦.„uťŕńXk٬uŔ©¨5-62˙Ń@ ŞtCI…ćF¤_¦ şíB„!/›0is_ě!ôÍ~‹z™Ď´őUI2DQ›A+”pS¬ą&üżkŢ­ťľqݍ“ü •–€ dFHďÔâ ňĽ$©Ť/÷?ń©Ďü-”px¬íĂl­™Íá\UtžáÓ y§¤>juµĄ˘ň`ř°QÁóaI©šó˝QňŮß=w>‡1 ×�g¦9ěŻc%‡\µ Sfŕ=…řöËg2ecx=ňş6ąLjËlź]fŔ0g'=Ąş8Ȇ2]Ő�%đfck•‡b1‘u5-wmÁć9�QČ,&›ź‚?‹Tz‰ëw¬Ź?5Ú\çŃ%Ś[óÜ<€Ś˘›Ł‹¸B¸a[˝MŁĎ�ćâbŽ+ą�Ú±ÚÖ>·˙ęM1SďlšÖú•mb¸‚ď=ÉŇř8„ęKĽP˛˙LŔŮ*ŇĚ0HźGŔSňŽ�ŐjÔOăáV¨r[§y) s|tsĘ%P&űŰŢ0ODď—··ý–.ţąd[űjč[Aቚ<ú¬*I»�7áGŇ-XÚ:’ĺ-âr@Íúh©ş¦gÇŹálw8?ͰSĽ7Ç×QDpŹŹP~™"}ŢÝ;đIđmúŢĄůÔr›5jĺ5¶–ŤVş.JcF6¦GA–Ť{Jt·”Ľźů‘ŻW‘Ě›�5ęő—�X|ć řL|7Ó…ŇŰá±ÜÓ˝qAs„ŕÎnDşSĽŘ Ű'ŁŰEGÇß[™OÖH <%ÂHĚł«Ď9?W<°r÷Ňd6\ˇPL6ŢGĐ źÖ NwJĐ+lQ™ú6xŢÂç.ŞëÚĘŮ”˘‰\É='<xÂÄ}ž˛ăBč<·aÇV{†n2+ (ßĹéµ®‡Íť?Đ% ¬Ăô9Šôxő±·˘|Ć+´Ř”e·ęAvĘ,›2üž3©e[üUđ~ő@˘LYňŮ*/!e˙ő «6‰Vp1©Ś!˝iä B‰ą›"Tđ›‹/ftŁ’Vp@Âoš[˛±Ř[¦MHľ„.Ü˙ ŕŇ”xŐ+éöÍńΩ•wZŕ¦ĹLQű Ţ[%|r“˛wÓä57?5Ň*Tů9“Ť†tšO ™-ă–Giř Y‘ÔĚPćŚ&N‹bĐaĄ\Žďi%U-“ÓuVń—Ś=ńÇB7˙.XpTMĹĹzŠ3zg�(źwÜr‰Jc”Mˇ.FpUľcŇfÚ öŢ‹˘ľ/l’W ŐŠěÜ/J!íŮ—ř;03>‚äˇĹgťĎݡÉ0-NÜđ¬Y'x$ˇf, řBÓ¦W=4f†(¦y„ţ 5ĽĂ c5ŚűŹ<7MÝÎÁ;Ąç|'%ů]aŹpİp|č+I3z$q0e ©Ü^„S±ó4˘ŁG ŹE:ÔP±bÚ‡–GÓůý«L÷ĎŰäůĺŔ*v×Ű‹ˇ5Ó é Šě(›Ľ†Ţ™4áyj6U«_ÇdŰŰ6ŁÄʦńŔʏo°+ĘÜŁă>6?q ˛˘ě´ÂsjŽ|Úá$" ÚüďŠZŤČ–”ČG÷rđľé®+Q'łŹ»ÄËňăðx›/¤3s&BW%hňÂk·˝Č%˘É.'§Ř_Č,ťŃ Ťř懞�bĂx™ÉJL<´v|p^}Yô{<ÂZP3^¶Ôś¬Üźś÷6pôĹWtá÷LBĎ_YĽôIÉ)0xÄ”F“«ż!$ĕΰAôťÂW.Ʊ!ř;Ü˝3lňŐŰł_°Ąď\ŔŇ­ .“ůÚ’Gµ0„»Üˇ)˝Ůő0ĹŽÁ¸ćú>|¨Ś†\{1¨×Š—ÄáoB˘?ďMKŻ1—ĺ›lś`.dŃ#h9ÝĆĽĂäBgx€Ů”3½ Ď„Şíý<ń­Ű/<«z·{)nÎäı&r yFţµHńń»ş¬:Ç;f ăGeĺąŰ¦qŰáŮŇí}ÍÇ? ˙­ĆQÄý¬ v•ďđ—MÖ ×äOH-Á#ئíu¦3C"6ic[ąE¬|tCzçŃŃć hy¶;E\b?(Ó8AtˇYjZ >ŕ >E/«|Šß€™CŠälţÚańlšč¶–&Ż“>?âqő©˛“ĐůwłGĆą%~?ç�ÉĐúTžKçhJz|$×-·ó†�0\­4Wň©ŤŇŃ~ض€�Öś ŃŚÚÄ‘?PD PÄ©ŕ/K ŤÓ%žćsţÖ|9ěvó­ë!­äwŢ|k  .é9ţůBŤ_Â:T·YĚۢ™ÍbŢ^d˙ŠA‡‹¶Č’Î đ/ź¦ĄďĚ µ¶)féŤYă—ŮŕÝA´\Q Łg›'čOnĺkŻAUVöşNNőŠ^†Ť”?O¦ŐŤqŃ%vŃdĹ÷˝ď6O‰ đ…QĘ®eŠ|€żLHgSD‰T Ô7»îó+âÉ …LúMݰ!Ç̬3ЇW*ł¸ĆŽ+äu Ťíężóˇ e˘ÇŔš©I“ÁµąĹěŁlć:‚ÄÇdf(EzŚ<Ę}‹'Ć;d˘?}F%ä5N%:ÓňŠawň Ť¶hF6!Ý9÷ňŐqTQÄ„«Ç“§Ô_ő•‡Eő,´ä¤CkŇęc\9öN¶sX¸Mpum”TV,*Ny™˙ŚAD\˘ŮT $#ý¶…ĎąDM[Oôî\ť˙ Ž”ż˙ď-ľÎ†Sţj»Áö!4ŞIŮů'VĽĐÎʤă…Z¨Ł—&é* lĹwôśôę»rÖzެÓŮEJnČ„Y& &‰th˛Ű'Tö‡˛¬hŹn�,Á¤şŢ ĂŠX˝Nó6¶E6Z7Ő°číA—WYĘěúő:q©·–±c±¨Vúb5ŘL¤&ť‹ň··e&ł73)ZděYüëü­g•7c`‹)ŮuB Ú’ ̸* TCԛ҆xĐŚäDh˙ÝB®ë´:Äv=R{R®ŻÜŢ]ý"ĄŮî4>űŻSťó?´-P…IăűćŘľ1µśé†×KRŤ×_6ËřŽŔ8AŇřŻąŤ ŐöŚGÖ‡–Ž{ Âßç8Ç|'¸?Q€ORvuląßű¤ČÁß>Áš˘—­˝ÂmZK—S¸}ŰÎĄHCôKML‹~ĽĚ�~JÖWKś Đ/pÂ.¨;ţťSµě%· ż_ť‰‚,ű“•“đG ű‹YĚ—š‹ßiě8eŮŽşc�~zÝĄňŃŕK@Î*ŘGŇ!§eZÂ)ç†Óř‘Ăť§VFV†ď÷ŠíCˇ„Î'’ =zą•KH»ŞW †•xöVý$›đ‚Cr«%W4T›]Y´óĆŞhµĂŃŞ 0—‹őę|8&ĎÔ»a¸Ś+Ń‚ýMĘły N tňöĄđ.C•Iď2‰ş–ŮÜJűÁěuő–rU˙»MrkÚe™ł3˙‹t¶STj‚E’!i+ăťű‘Ö&ľż]ďČWϨ¤TňąKR:…Q /P » …Ş).ş— ö8ýî* Ęd”"«' »®©EČ”-Ŕ¨ňˇ_˝\SëşDw‹”Ő©Ę5ŰW c Gny¬ü›ńhŕë8O·Ó7ďŤV řŮŚĹ}őL�3îG#"ŤrÔľ“mĽ–Ś:ó‹äŐq}Mŕ©2i˘ÉĘSĄ§sđ{üŘ1ŢP|gŕűÖÄMLĄS»§2óŰ˝J0Úŕ,޸ź“™óôO�S4˝žMjؤ€Ó•ďKqŇńĆ\/™1Ő+AKťřăV©MZb˘,G*şç¶§7` ü”ŁU°)daŐ lJ2ôůć;ö〟}Řz¨˛:…<Ě‹Ł'Zu© ĹŘł«bí˛ő*ďĐP7·ÓN˝ži˛Ěź3qĂçĘÖíţýLOŁŰúŇýëy…l˘Ś¨â۵s·ü®ŚĂÓo›“Ľ[ ŹöŁ){äzV;ÜÚČÄ9%±` IJrČgű“ąŽvššý1N9Jő˝ČŃ4Ă‘ć×jޡŤš‡±}ÔV˛®‹ä¶-‚-ë_‰Cô›üŻąűŔůT ›/+óőŕxlÍ[¶L=µö4źľÇWt•âŹ6’¨Ç.ĚUmĎŕ–ál¦R˙}Vq\|ç˝ë.¬ĺĐ„pŚ&Ůąb]Â>hŇ”ő>ĎŚÚł5Őzn×Ě"™LK˘o‘˙ˇ’Lë= (‘'¨|<GĹ«ňŽđ ’ń–·OËá§¶Űň1xrÁ˘ ţÜ|čA2{`áR×…€EL˝€ŚÖ6 �ôÍ>%¶śź/«H°—ź”±piq9fcă�ť‚ †ŐK‰/¬ě§ÇÜAuC%ş–_'…˝om3&6Á˙˙˰jŚ×ç‘•U˙É'‹�9 fůĆ[¬Ë ô ă‹ňqy4ţŢw©R'\Ľ¨ěŕÁŰyI_A]żí!čĚ YűxEZÁć É —Ňl%?[¸lÓ0„˝îDÇ–¸ ŕËAµ4¸B†!٬Îě—šOg-¸ <€.Łą‚8¶Äţ‹đ'˝QS…I±Łéú#Ç>ÓžÇnŘĂî;ŞŚŐ‡{N%[ű+čő×fâĎů3ĹEş– O ĹĐ4ŤĂčÇNAł`îóíTWz~•;1Q>îPűŻ}»fĺsIvßłA›Ł5‹p Ţg żő%ű4@ÖąS®!Ó+Ş‹ŤŤť†+ŢŕQ\Ć„Öű/n<Ŕ(ó}‡×NůdŮR瓇†hĐîŕÄë ™ŰLĚ.},÷śhĄ¦y8d^˘ę?ˇ�fko ±yśÄűŤ^A?âąyűJű*F+Řʸc·RDZWł‘ĎkÍ Â„ú]Ż ćälŞ3ÚĚť¶Ë~Q$A#@TÖ˝K°±˛ă Ő/0/3«C§Űl p6}Â×l±d"SŰ>ě‰ß•^Ě&ó#sąôŐ\H žÎ^ZČ tX¤ĺ3vtmv AÜ@Żs‘MÄşDş=6”K‚=_ ˙°äjĆč{ě'4‚°[ŁČY<aN.śFó'–ë§H­O–Ă[˝ţ¬żuÜ.‡S©N")"xÇň2G»p•_\ČĽŕĚrËÚµ´Ő�Ľ‰ĺ3XĽs ą}ýŤŔĹťY‹jZ”‹6Ṏęű~DÄgŕý-�găŢ EŐ|8á?§´>Şőţ4HŤš1Ś^J,BW#�Ö†”x~u!iËöÄien˙5Ţ ˛NÉ•±=( ł€ől<:Ńw®@>şr#ČâźMvĐŇ ď9–Ě…ăaVˇŘé"S×$7)$5´šÜrńr Ŕ˝“”Űśíed’OĽzçČ[űúú=´·hĐô=qpu/VlľĎ‘@ Ž żŕęݧŻÄ”đre•’×Iyéoĺ*'Ţ‘†Î bV€tŽÜ'÷Öł1ĂÖ4M!»’ŕ>Ĺ^Łb®0#}› iúyCď¦UŻÔ–++‚ĄűĽľ#ô­OůŠdÚ—ęű\źé‡i*ôPs‰2"ÎÍ- ţůŐ±žq}é\u(łäĄ©P¸RMýŘ#"ë:[Š+\}ięB÷†ÄE@·Âę{aś§ 0o)Ž#eţŐAŰq IzojĄ˘ą ¤˘Żç¦ 'Ń ř;*¸YĄÝeú—ç–UtP‡DE%¦>+Äăě2ĄüŔ4N„ĐŞR<x)ZŞ‘ř ]ÉÉ˙ }rşŇßnNfpY†%ýżî YÝĎH[ÁË @hY"¦m˘‰Çd‡„'6ÜWËŘ™Młëq 9l©•źđ4Çަd·8#ŕs0ňy>@6•8G…ůé DKןŤÁ‚yŚ3sÔŃO€x¬Uň=1çů#v‹ďt(9?!ĂÂm•k9ÂŃl.múŤNŤ}ĐĆ’¤Á"<?f¤SÚÓ‘"…—ˇ|výĄ=©‡‡^|˛žü꬛3÷đ6W´âéĆŮ-/&!ŘO׹m#Ë–[É+j·ôIoŚ·m€o&/šeô -hzVäÁđ娣×\ÔjĺŇťsßÓţ’qQD'čĘU»>úP"ßg “wÍ™ŰĹgűóI92Żé$;RE+„§üťOCđĄ¶QucÝéŚČ»™âŽ`QC˘s©1–˝`édV@u€*”őÍ<`¸;ĹőÁ"ă’’±Ż/ăŐ¡4Mń8čVÜÄZj>¸äĆÄ…a$¨(`µ‹yö’^ýŹĂTÎâIěÉ®ÁBŘÇw’|C_•ߣne– 8ex¬˝ËĄy˛»oŇ ˝ŞĐ°ž¨|gŕ‘pÓśľ©đu ¬Ér čgÍĘpř÷<?{ŇËŤźŤÎ’X@ńăx'é\ŘuÄmϦm¨âÖ¨ p_Tb%5mĐÁś@đ ”۵D% D(Bś<Ť‡×B(pqejăh}€łµŐ’ąäű.P7#¶Ň&>a-|jsĚĂg ÄČÁŃ®·iyĂ+Řνµ12ké™ZăFÓ·AµÔ™ňi@aÓ±ç¸{QžEĎPT¨T|c‚2ÚZ;Ó`0~"'~™„ ©â۰ě~Ć•iűUsšĚD©Dm( Ikm…3ś üM˙ ¶ ?‚eÜ7׾·ŔĚĐÉĚĂ?ÁÍ/mÁ„Ă­šBË<ńžŤč”™Ä&Ř8ăČäşwÄYc°w"Âm<ÂÇPÔWĐÚüh¨rŠMôW'ŻDă}ť÷‚n|đ#L€¬ź\ÔxK6kPŮTß [2”zlhäj^ŔţV2„meV”snăŃc~:QA(`­mFŻË2 †ý)ŘŠ•źZƶd›ăł;ôá5^!+ćěj»#Ú·X»_u 1MăW˘!GÔő¸¶‰iŠŚ•Oó ­+ĆĚ/hˇI8÷řÇj¬zf lAWŚŹL]~öcŚ©wďßl"~Í Ęę® 93Ă š×Ý‘Ű\Ŕ`#E‹zÜŰ[]_´ĄĎĚyÇnÖ”MŐĺ5Ů\ęřËg”߆aáĐqŔÂűM’hb§ç±Czˇ/o/ö4˘]Ü߬aN_Uu—b᤭·K’ďí3Ő«Ý!;9łŮ°Ţ”‡q:ťF«$łď•{Cči-gŃ.ÂŞČ)żjoŠĂŢű–Ď*¨Čěĺ%8ˇ‘ÍŔ ’pDꟆ6Ä· tqľŇG÷98sˇ÷„8‘µśŻę”(k3çĽu/‘|3ţ'g«csˇK^PÄR�™VBo ŠţTýHQjöíÓĆď·ôX´qť…äë'|ąąp=’׌ľÂ;z-kÝŮj8HScźđ\GËŕS(&o/B0˛č+vaȆö”2OhS>Ŕl~VÜîăD_?Ď©¦V}ßáĂĺvĚ–ç÷eN™Đ¦ˇI—žéjđhČMÂkÉÚĆ]–ĎE×$xcŃNÎ’@›“?čFŔÓ§ďt€Őq˛ö?˘âvuF»;|g=Ú‘č<5“1ĺ/]é'ď›’}–ÎTŕGzfżŮŮUÓ*ť„3Ţ0şżT'ŕç+ojýŽfÝođş îń>GÓŽ¦L–%úÜźÂds•Î1‡—�&M~Ç÷!¬4-dęaîlo/Ç'RcEˇŽGssÁu3ëľ„pŢĐKŠço¸™q–1áa BĎ)©h‰…˛‰¤>•™ľ9Y„"'J6·+ăÓm»u«sW¤w4Tôp&FőľË™fX$ˇÍTŹS‘^+&¨·HÚůW&Ź ¶»ą `lëí}mĽ,h#SYyş3ŰDˇą[»ô*+ń€–ą¦b÷!ÁşśĎr•´2gsÝż,¨ô$˝·ób ň¤Ç±˝Ź[ ŠX3§ŘűoQ5…™¬•Ă�Q‡"ٳѧ;Vqá´ąĺäđ¤ĎW&ű¸ŚŽeHÂGlcPc¶¬`&+AëŕźUjúŕ†ŁsOđ9›¦|TĆR…¸…•©ď éÜ:úw%Q(kŞ~RĹ»‘ŕtŃ[óÍ<,gc÷ŃYŠ{č€O#™šľ±T ĐdäJŞM‹‰< +ožOăhF ü}Ô/ ćXl$8~\ťÖĐ"RđUěČâ4Ň c˙Ą$-Ť¨¶>] (�GHîó“YmÍŰ®ňÓš)Äű@&÷¸Ę‹đ:˙5� ę‘ÖWµĂ–Ф0J§U¨Ú+˛4˛Ş>±|´Ş�ĚÔ ÄJ.Ź#űt( ¨ôUČSyŻó…,Sjcőó· DrĄ×šxůÁď˘l='ć4éĚ”b°WN�“ęXpnŠUIL˝vĂW˝m¸›»ËFŤçć•kĐřDYëvÉ9?ü`V‹5<ţĹ}˘řµaý·îëňĂĆ!ÝęEYH'yřqţ>ŹNŚrÇm–ÜĚŇtQ'^Ţą'ę˛ lI9ŕkżş˘A-ýł(Ňe€ë墸ÔţÚĹşß±Ćěä4+o\p6‚Ң0¶D80¬8=i©eí“ :t€Çş7ßÜ­şy×ď~4đ Ź·˘g4řă™ŐütĆŽj:Ôě +[@ú˝Î‹Ěń˙M=:P&ÁÔ Ţ Ŕô$›-ó@$Ďrľ‡©lÇ… Z¶É ٤AgxŃRŚY 6ŹňňgŠfEăbě ¦ŕpëw˝#Ń©`#;č?ú•:é@iţ›adW‘RĎĘp8r›Rg,wÝ•G®‰°’ «ľfrµŠôę롨čgż´Vዚ·«~;čěgyHyÍŰ|b7U»a$$vŹ+–o[qnĐÜÎŚ‘É’l<ŤÓ•ŇńÎ’ńŮÍĺ!-ëţ«G˙% gŹ M2¬6Ô¦ŽŕStÝę;rŻrŇ+ĺďĺËR&WSÝ˙á—V moµ†Bzµ°ú‚¶őŃך§4ô3şloa%çżTE_~¦)�Ç~R’ž!őď[�®ÜÚČlË9J†a—ŁîÄlÚ‘ó0˛o JĂ ±@Ť¸p1`@ä@9aťHSüđ1TÝHľ8Nyí)ë´ĎÝ óÁ‘jO™©xźĎ,˝ÄŇýÎŚ,QŤÇ&+XÂJ«!˙ččY<‘ęיхô¤÷�„˝.-z˛žúD–Ślđëu&—Š·o_đń=yđďjá ҸL‡x`î,  ÉŚ…ôÄŤá[÷j¦d3GXűţR›Šq©.(Ę6¬eŞ dR°BeĚ—H’ …PÁ•ÎŃÄÜÄ&äĂ#kŘ€:pPC!"ý§dŞľ XîUţZÖᢠ×nʤR¦D[_¸«)ľĆÚ ěÚ3x´%YĆąRŻ”ů ŐŢHK‘ ŕęŇÉA |ř÷á0đ.őŁYC%o4‚VÇôúäT Źiäđń˝ÁA×2y žôżql“P­šu¬GżµJť—ŹŘ©¤ä2ň';–ž"ižň8U1cśmę˙j›žČśVł,oŢ‚&ö‚ĐŞ$hÓA’<oVŮGó‡Ë^,Ým&ÚÜ � żm?X|S*,¤T„H´ 0,çŐ/9őĎ´@ĺOÚ˝~ß$źŁ/·ęŘ­]ţ±˝îđ±%ĺyz®× ˛ďNyIÇăúbWÍBúĺˇi-MM®ťżĆ=™s=ó+Dŕ4 SĚ–Ý =Vĺ7gú%ŰIS»ë­%0”+<§RVŁUýÝ]ľŞT‚˘–†üÖ?*Ťă‹´ě –QeF2�YÂŢVdˇ¨Ľž˝®ľ»ąK€epˇĚÓ4*„®Ż\)CůÚň‚ě3Đ!čWÉ{wMáě3N\¦ăˇo©<¶ěĺ;±Ç‹IÚÜ̲®ÇŃ«´L»Śđ96Ú‘8›˘ˇ‰‚Ç€ÄO&ǵ&ZF°Zg8Ş•P  ËKˇ/[űČcîR÷ëě׊Rúň!ëvBn݆ʷŠús &V>‘ćŔ­¦C…~dí>ýCĎÉł$%OŚăo˘lđuę6Z“Ói' üŔ~.v4V©é>¨ńx6ýŁ×^ĂÎÁďşÍî.—Nęą–ß”A?¸Ď´Â72›ľĽç$łŁß¦+Bâő=óľłČm¸đ-k¸.Ťĺ/Nܰ'=› |@•ž•7Ć<â3eęw[H‚nůą%fţUő5TCđľÖ?…ÁĚ8Çţ-´hů,sÁ!"ţú´`W9+íI¬›éÄ ôsćH•˙ężä¬ń\@Żß;d\‡Aż1LJ $ɦŽ$Mąqč笹8mRÝážć®Ó·¬˝ ‰6%/qq`ÓPü‰wzdǸĂ*ý@ČümľjŇ6,Ö[Ü“Wş;ŚŹ×ŕ™1ńňHĄúµZěĺŠőă3đo˛ŕ*–óN/cÇLEäçv&ęÉ’ ůř AďéE^˝™ĺ©±‘[ĆőÔŮoYÚä| #ůe®ë‰µV˙(úżG„Á{'ŦĘĆe¸·/Ë~ŃůX ťwľż@ÚGR›:$^„Á č­h˝­Ăz8F9©±^E垣€’ČďŇŰs6µ¤Xß”Şü6E)ŔKB Ăł0`#.ÜxC%ńTÎ[u[ěn:śű}^ę6łźćO‹RVĎ`PŢ Ęů;W8[âJ’ąŰŹ b˛ €¨ôĽ„†w>=şąZçë RőÇÄť"hŠ‚ŮLŚĂH‡|Qş"Ŕ§’‰©ţ™řąVţú®˙QČižSy¤ ŃĽöĂGÜT63Š<Ä×î$ ÇĽ‘ěxŤÇSVá‹.żE‡ČŢŰŔŢ ±]>&•¨”lĄÖÄßlňm.|(üH%w°*$éďŰÇ~„Żx§–çśCxăŽřŁű3‚Źô>H`ĺfˆ …Äý·mĂü…lăůUÝŞ’ÇäăS& ?ŹkË– zŐSř}¸őWŐů63´_0Ç­‘~pĎ~Ňš¨gŢwŃŃ$Ůă- I ”qŮ>ć©őQ@\ě/é4ő^Ć. ‰łbŔ„4ăÁ&ÁŚşjzRł§¬Ĺ°@U­TĹĺRĹ> ?ÓţčD&ĹI”2{G<Ě’Á�÷%ó ;ľBFäs!»'ÚŐ´ĘćŢŹŃOMRŕ«8=jÔu€’[Ť×|ěWóŤťEOŽ2�‹5�äů+|6­vôw±j®]—˝ÉREŁŤc8e•:«aę•L¦´‹˝*Dý*čőH“y6ż–S4Š‚ˇHÎř­ô ĆÜGĹŢ´ň pĹ·(žIČ´c·:‘˛Š}4VźLmâ—Oş@¬V+>«ż‰Q½Ë‰/ůnŽ…•ćäé™ďs…VéwÁ_ fźŇÚ¬KCˇ÷ÍľDQ8yŐýaÄ6ŮůË»…ěĹäŞx”'kmü(ŚsŤťšü×!’Î`’łT»}Ë©‹]~ŕËď[baŔM*Ź—ţYA@yĘßěŕ=+ü~âfˇ Ćű¤p.IŁgŁ‘arËßfŇÁdhř©ÓŠ&}B«Á ‘>Č�EĐY{ m*Ů“¤?9xŚ›wC2őó×mÄoŰ<,Ěěw#ěâ…Öb® ˛ÇŁý0­hÔE_P‰ł¬Ž ť]˘*@ˇ:Jńţ<7ý?|Ř•â2»-‰[%'˛wĺéŚ_ż$€Hµ;ŚÂz ŞŐIM»—¸‘ ŕ`ˇ¶ČČ‚˘±Á‘JΚ~ĘÇ%ĆňR!#đŽ.}ĐN‚LŰĽyÓ 6TĂ7'TÇŰ %�ęv2;eN÷¤Mńibň]ˇaxČiFÚ¨D—âUÄX±ÔpţÍů1ť4Ł]ĂÔlĄgĆ÷á ČĺţTÝ‹ť.Ő΢^ś«Ę0čĚB2»ç9đĄuŁDt|]k–i‘F’ş×’. űĐŻąbKqźľęUú$‰ő^4e,žŘďşrŐűĎ+7kĄ}Ĺ dáZkâEÝóë4“Ür!ß:jG?5S[ľ·°�M~4ClAÖ2cđ±ÉŮ’őŽĄűh«%Nńęđ‹\ ňަfäŤyŰɇw:–Ô„°ż ¤röŤ¶ďĄ‘{®D ·ôz±ůéäm›Ţťđ§ ZAĂâ–ŰeEAĐŃ™ł2fµQMŤpR9OĄŐűę­>÷W$VĽB——/ĺ>‚®ÂĽ«‘ÄźI*PNqµB–eú”QŠq°­N»^A‡’Ąš\·`¶ ŕPU5IđÜť'mČŰhŤXDZó ‘łĺµEŤgűdf«|8G/ÇNFč×/FŮD :=°ň=iFÉk÷ űŮˬb X\,~Ć.redMhcŘ~Cú@Ňó`˙OpŃŃ™‚BµŤ1 l÷†Dą>q KčBŁ~_ţŘŰVP—ŰtC"<Éą b÷Ť¤Ł/ZxŠç âÓ!|ĚŽO5t:ňZÝ4·Eqům~„+ Ş‚–{ţóIęŘ–{"áÁIŞČĘŮőměĽfć§ü©ŁĹ ¤ĂHhÜÜ=ăČ;•ł:Ś_PlRFŞ®;…ÓÜEŮh*ąo4LóŻĄ7Ô"}Uşz”6^Ü6Ů «î쮑Ѣ)ľńŕÎ$Ą5UŤ}8¬÷ŞVÝúN ĺ ŘyB=Cćul0:°éŔ�Ć1}Öĺ*V6{“`ÎŹBI9VKfHÓ¨îůâxÎr$ěüSˇB%ÖşŢ5ÂęyęO]-%źŇ†ŢĘÎ'Lş@×9—ŘľbŤÔ靿ç�Ra·@Şč$ »ävřĂŢNŮ÷ȢŐs $ŃjBŇ›9Î2$׋tńG Ł×*Ę"ÔNA�Ó;^e0§a:'2?0xĽP†<Ëä%Ń>—ô¤mŇĆţB7vĚkf~ŹM«Cź°;č4ŠúfĎţe#ČŇöÂÎbmQďéĎş${š0EĄ;čÉw�•E:·Ö‡˙ŚŮ`&lĹfJýî”ěC!!Ť=­Ó|âFm•Ú»Ně—áuĘ˙§B_°Bżd;c8&bjĆk¦#ßôj,bś«ťŚ GQĘ04kŐŁ—Íźň- _SÔI�áü}¬°;<ýďz=„!3ɧZčí›ŰôhCę8'~/±W6@IęaćčsŐšŠîµHP"RË&ViÎö<‡[íÖśđîJÚÍÁµYWI˝ÄOA˝Nf'ůA–9•LĎ yČ\yz~mÝřvo Í�Ó%ÓR° '8ďG<yfµŤ�UÍî$ĐÖUjě"k=hDĐF…ĎÂo*Ą4´%iR@nűíáyŕhaâSýŚşďáÎYW»6ys7PĆW?§ř2ˇÓ_…|§üć"Ż>ŰĹZiÔ7Ć‘‰6—ÉyéţĹ·ĎDŕ˙Ţ V®{2ú•ĘJhrő›XXŚź%DI*nZ© uÚµŁs€—›Ąĺ¨?#k,DĂ;pÉ>Hł_Ťŕ©.2ş »ÓŤW­×Ó6´›W'Ô˛ě7KŹĘ74¶€ŞűutńěĽV)ăm7;[W‘űĐÝgĂe…´ŁJ„Uć‰_˛«g6Úńs,۴ąĺ÷+ĄţÖ^?hˉO(*~¶0fXö n‚řµĹůŕT(×ëŇv)‰W§%j,X´űg/ dÔ®§ŹŚá˙¨Łźţň®ţCr‘rŠ"×Vş7”›L Řpkľ,łí ?ë‡Ú!—ç ¦Ç- ú–çL'ŐWčŹŇöŢ!`SEŮůÂn7Ś„ŕ_ŚĐ'+Ť1;ś[„:‰(Y%śôĹÁKó”xAr§Ťúô*AS ‚ą1 Ő[zči[Ţ.ďĽÂ‰Üq ‡Vó"0E č˝ě(·2ý^č°@š¤Šu®¤"W‘滋K?}ĺşúąĽńálvFöęĆL‹řś[-C;ę>™clĂľ„ő™Á)ţ D.Éßŕű› äžÎú”Włł(ĄMż[‡çV=îZS”Ú}ý)…2Ń>;ó0ĽuVN™‡ů‹ĺŚĄÉyݏřľÔĎŚóĹP#1`€ëíÄ0*}ć™Ň1ŞÁőA+%{ńrµżě?ęŕ<íL˝+“.]YÓ˙¨zÜ´Zźm‰y\e`‹WďéÂzÄŽT${’§Ůż«$©1¦3řÁńůËßł‰ś7{„]UVpóş0łÂř=¸L袾Ԭ¦EV AB¦×·Jôţ�€ 5¶í/4‚˝¸ÂdA’5‚´ăSKBňa(c›4] LRm‚™x—#Ć3!ŹÇŽ�ç÷’&ăn”éť–Ě/ Kď4®î�Ň“Pý`ŮkvČĐ|Ţ˝TV=D`SÝňJgëPűóĘH_÷d„ŹHÍÇőuń÷îST'ç©_9J š] ´‚˘â‰áɦÎtěa¬Ë÷gáŮXÇŢ'𭱦ŮEj‡Şă~hÓ€űŻh¨q8lPü°Š˘¤ę´•°ó•n×Ěú¨»Ô'˙d“đI‹ |LÚ×w|N>ŽĘ#ł_ĽH¬ă}ŽKjyžŤ“WÎÔMűúŇ—7’™= ß7¤z;¸Ţc¶Ń0ąÚ® —áË•]K×…Đí±j8r%~wî\sĽ¬ ďÍŻpŢ>IĆ!6U;-†{Q!M˘ÖŽc·•獖仄Á‘ZűŽĆ˛‹µ/‡‡l?ďŢeů‰ťˇ!´ŁF]e×k»"üI¬çěltKýÓKjđs÷ÁÝ„4{üCýź^…WZmŤŁ¬jgŮËÍ骛(.»|Q‰‘>7ČŕĹĄgëv“ŻjÝÝ—hƧKtär¦ĺ#•–ö†•ł˛f 0‰ Ł|8v4ůůK¬˘{3ýň‰Ĺ˘PĐz=hĹ`ďĎhŠ_÷ýPĆ2ęŽ7lx“=µ†r‡‡ůŐ‹ż3ĚiÝĂ«ó“ďíJ2�3řç ÚŰ·[pqNÁކ¤ŢâÁeQYó[Éăv|łyB€ShÓléä/ę§?ŐMfy’s©(‹G­ÝűD•Đ‘Ĺ_a—$cX.”˙Đţű\+.懺éß—ĺüę"ÁOűÍLp=RVě¨` §ŤÇ]ş8ÁaÉhţś=·î÷źV'ŚV–Śq’ň8'ŐEń@‚m‡; ôČ»ßŔý)˘®ççcB†JgVaáě_-č•ÉüRŁáfç/Z~.5Ç~gŔ_ÂăŁdQă-×tâăł§üŕ@Ţ& űŮ8çuěeŢCÂ3ůĄhóoo_0(gÖÍáŘ,·ô©żłŹhŔzéM’VăˇUR*Đ.·Ę´šy[Ľň1@öu˝ývÄg§„ú Z^ĺf]JyÁŮâ]/[\ťÎŰŻJÔ0čZ«C÷ąC附f¬‹ŐÇü«MÍ[×AÚ0E#FĎ$٤ÝTz:°Î¸xÁ-Ô­}Gµ{3Ş Ä=ëŚ%ôjË4÷&>I0Ëo„2+6@ś‡€Bő%ÚAČoĺ"T¸¶ )ň6ÔX u&äűZ\WŁŚČ·3‡dB5«ÁʵíŰ×l;pú§Ć6„­UüşŢ˝§ąő0ł‘ę:‰Řl™áŚV8 ŤáŢgqR·Ĺ”©‘ëkÔlé^§‘IĺAářĆě˙\�÷BJT3Ą^ŻNÉ!ăk‡šňgȱ†WwţĽ8Ćčá×řŕ‚˙,ţ-ńFŤ îwt‰Ę. ;N ^ÄŃ P7—ţ2ĹPé|ĂÝ˙č ś¸sáë§ůó©*߆ĚĹž¬ú”o . ‹)2'ź2@Ľ%şś[ŐÇC—^đÝ´AożććFYäćĂERk“H»„ź*śŔ°ĄI/ňŰŤ$(ĺÎBŞwëű`V{—ź6$ü4ÜK;ď9DÍŻUÂ'%ŔRÜ‹đď­jŚ,7Oľ#míą¬ľ ˛n:ľ±Ťh@µëLU®ŽS%VeO÷Ň)Éo(úď…mç-Ř e U”lŤ"Íó†W˙ Ě»Ýh˛ˇ$k�ĆMI —‡¶<\& ß)ľżz†“ł·Ćť5˘dLôÉ6 @Łq”=ó%zňp˝’śÚ»#ŐŽÁöů˘¤ńڞëóxß«»­©|'¬kÇă‹1ČřĂD”‡Y¤j‰Čťý-Ĺő%î{ň+ÚBŞKg€#Ĺ4ŚćH/d.> n˛)Ű1Ći¬–Ä29hč|Ń­Đ#MăeE+MEîľ@oĽASđDqYůĎzh\7=gĽµw{”˙˝éĆZ>HaSö"xČ“LŮÔKĽúÓz`°ńÜć”ôXĄK„*$ůpˇßÓŢŁ˛>ßŃ˙:ą/Eĺ±Pžł“NI$V ¦ç•-ŰĽű2© ĽšK#ji´l$oÉ“zě8"ÇäpĚĐL¸Żő@Ąé[19Y§ööWY¬*g‡V)ô…˘If@˝ŰOësNŐĎj»Îäjg}¤c5öMa’§Ą8ss6űç.TĚw%>#]‹ŕŔ‡Ęďé5wőŘÎ Zý#°qü×Uť0žw€OÍÖ?(Q·lĺM`çS/¶FÉ'ti]â3LE#Zíć9OßWę5űhOapĹ1ئćKÄŘ'fßEţALŃě–łíRÖ'ëÂýu (fŁ:ŔŤŃüWůöżČYřdş…Â5SfĎŘ:ÚÂoĉŇĎY_Ąąn3Ę“'jů"çŚëZPd˛Ľ<83Ľeh(`óśíÜ!ň٬ŠKGfÇíçKúĆď=ÝČt‹é�8»ÂS•ŠÇ­rđ:Ç«Ň7«Ś4 Î+\Áć:îÂÎ9R8ęŻű�VęĂÇN?Ű—ŮÉ*#«~Ő${óŇ)7 Í˙9m¶Gb»‡˘v şÔ|Ť·ž©zn_¤I“–8 ˙/jśś ´ZUN0©ţP2běčmezĎ2f@• aóŮŇÁ“ĎĘç5ŽH›#˙eWßx µ(ŚŇŢd~á# ”ŕMĽ!›ÔH=N[ç—ş=|ş<ĐŞb”—¸kxso,Ô8%đďJĹÂĆŤţ2aĘ•l޵*Xqqi ¸Î˝HWź{ä{ń˙ ~ÉžąŃ`3Ő'óA1^śĂKž[ç3‘»ç‚:BýÜ&?\žýiIDy_ř‡®t~�ç\+«z/ĽöóëɧŰŔ Nוć…p\Ňë­4p=÷~»6\ť|ň/l•ň>–T)ż|Slç—¨-Šć1}”ëŘŕŔ¶Üaä+L05”É˙ř"~%ŚÇŞFEÓ7ŢG¦u}–m¸‘ŐßŢG"°“çC!.߉Ʈń]Š%8‘$Â˙.ó\á@›˘)â›­Ě8ÁE›Ú×nމ€ÁĄĆĂ\¤lÄÜŹŃ˙ŚÎVűúĂăGh!v–K,eĐ×ě;ŤhÜîŞô#[šS Ă.su)ť Ą)~Ĺl˙´Í>m(2kÍG™6ľ§çŐś×ŰX¬ŕŁż˙’™Ę®¸2ü|-Đvúv3öâ#†°‡dňJ’|j)O“uŐEűěDŚÄĚrL+Ę (ŤUâV#$î™)5ä‹Bš¶>ţ|úšî`˝\đ3.›zB€„i°wP+Ô…‚{ú“zUÖÚÍ ËţŇO¬ŕm­‰ăl˘É¤_ShŔŘ7WĘíqhWtłˇ 7¨B  ž.YžRo,-k! E$˛fťďĎäÜ$�ţuéůĘ:Üvđa<l d’ÇĂQŰ]ŁgÇIoQăvý‹E*Boť[˘ÉŘ};o«˛†C61‚8NԹ; ă˘<‡ˇĆhUpŢŘ€Š’łÇ&ţűůAQDŇOűăŐýŔXý­Üé*˝4MęßőŹ”sŤćYË1 âjJýM wáÉŁNŚC1îĘ}fGÓ©BŤV:ľRfđ®oŞ+˝"7“€H;°éĹálëȊᦞ'Öë*+ۉüĚ^Ö¨łGntůü–©Ž%:i:2I߆r Ě™`f•˛Ş˙/h÷hČ Üž»Zćh“^“6´^ I•0°g®šh!^ĚÜk]Ţr['ĎU¤v­RĎŹ¨.ÇĆ{Ľ Ît-°f1üú•zuśAéTúă˛/ĹJ§­`áT%gŃcßÖÖ™¶,ň2ͤŻ‚¶č•W+2‘nV#đž ä¬&5!É C„\ę˙ęŞx§yŠłV’ &Ły0ĘĎQ´Ž UËÇě+ľA7#âŐóąíČ„P!0<M1řyÁ¦÷ŕ:ś’U„áÝXÜżB@¦…č—ś&Uté;ZɶÜ˙ bÍŹ”|¶ if5ťńţRAĚ[ęŹ †¸ßćă†cq¶’ň ÷o`!ď…ńń mµttěwAµ˛€ć<Ŕ »ş¬+¸µäĎąÔ×ÉËVH€W˙ë×j™s6ŕżÎmxKçmQkřä(XŻMhuů*TyPži^aë đţäm<Xę[Ď~Ţ@pTŔŕĐK${ŕÚÓöű‚ÂZঠ6ă"ŃòΔşj×裋 ›źR¤%§1|®D’Ą BjZř¤˙ü·’”RL﹢r„Ŕ`P9®Ż$7+X 6ćę; DŠ;ő‹Ń~ޡўÍoßş|Ą{Üq-i®Í°éöĆܫ̭i^Ý×ďŚ(/ë‹y„’�ş˛Mnż&đÝ]ťrv9Aví‹:IÔŁNg„Ű<@ş‘;˙Ł …¬”§P¦‚%—ŇŤ»řsjWĎwwC#?tD»ăŕ¶Fđ°‚McWĘ·ĺ~.�‚‹Č7ő7ŹĂÇ޸X‚Š3¬fŁATâÓ<†[‰@ö–RűoAv­äc�ę± »Q”:zĺA˘ýIî5ŚíĆ.‘a ş ¸°?oŤµŻ¬c‚–Ó××ýŐâ!şš2ş’ľ§ĽőGƸ®ř®KP‘sˇb>FĄÚ »2׎80ę|ŘýůřBž7<c“wW»´ľř x¨Ś†‹"´Á-\…Ů©iVu(6óI'ŚgsÝđBL3ľ—Ľ[ŞßÄůˇ`úf+Ą±ťřÎFđý:“ Óżî Áđuě®,Äu™:˛ě»˘m)”tŮŐ8DŚŁT¤%r ™>ł„w۰ K5$*¶ű˘şµťßĽú\©Žúżăµ§"8vD–¤A“(tÔ‚(Z@‘$Ęu0ÁĐéO15?ŁĚşőüöJŁqž9Ćă˘9v(řµRžQ¬žżQíyÝD~ëäh» S¦źîĘík(‘eźîËâECYm!łBj§ĺţľŇç8™"˘xŰŔú×;'źq,…™YŐÚ4‹LÖJĆh^6´[c.„"<ä÷3n†´]mר*Ľ1fˇ<OÍĎiI$ć·őDßbD5ä~˘hµ*M¤Ły„ô«ÇFµĹŢô8š ÁŇe.˛KÁŽö‡ÄßnŹčňqjUaŰ]×öŤÉ8ä·ŢvËĎçŰsŮn!Ţoż.‘ţRekťşŞ•Ĺ Ŕ$6öÉ2Q‚jßFć±eß7›ÓÔť«đňť‡ÜЬý”ú vq5ůd}`ärů”Tąw_< Ú ®$± #ý=čŇ^?67€ĺ»ňĐřͰ}oäĽ7ů)i˛ŕ1 fzW~ŰÔŁ¦Úş"Äúć¨É_Ĺg5jň.W¨ôE ໓uíB›i(,…>pŰ}úô Ěn^ś‹cŹ]F¨¶{! GĚ ćNäŁ-˝şµŠ¸7´.Y őW9&&7–8_zÎ*ýÝ?ŚE~ÁȆ…Ä@ţ®ĎjMÖ%éÓOŚîbÇ"äeUkÄFł°ŘąĄÎ™´<xOĂ< –@Ţ5+…Űm‡ş&»§XŇő����ÎA �����˙˙˙}X�s=Ąëť”Jk­ś°„ÓDqi‹˝»ęthf`ZRU[1–}wšMŚQźj)Ěqü%+2/:ßf—ĎŁnćˇ÷öŻL'–śŁ¤ă~ ůHQCxhLIçm˛Üę28y‚Tv¨QÍ#7¤µfE“ş”¸ÚŚ‘ŢžH\őoe`«suóGpš%GçhƆ] §”ŤÜ™žü¸Gž$ýý’äÍ;借¶#<ŁDPD§l`/ Ôvç©vŹŤ‰ňśŕş}o HśăٱĐj»˝·?ˇdög®óľÄ9eé.c™p°0ˇŁcM,5Őĺl÷JÔ¸W0ž›9 /›2yˇ/1WďȧDˇÇń�¶vîJŐjt…×{çDZ.ˇo˘řh Π깏ÍţrW­,‚%{j ¤ÂŮşú˘űŐË8S±îdA†ĽË•;ši§÷ňv^ëŃ/¶r­őţ`uf•w|ń­źëڍGɰzÝBO?ĆČź©ů0ĺ$"şĚ‹µMďĘX>©)*ŐĄ™Á=EŢĎÇl„ŮŚżQž¬°ëPËä?»˝P ?g~ç×ó˝÷ď—Č·Ă ČUǶ• XR«7~,˛Üi˙V%!%¶ÖË3UAxŢG!Wľ�ńe]Bî’µřrž­Ăg*_o“€áŢušĂ­ŘÖě9ˇd8¦–Sç‘ɬ7/<fż…óŚĹĚŕdV/X= �‡6ÜÂF{٤ľŘĘ ü”ÔŐ˛Ä żŢ}iZąwĆ›ZťP‹Ř#nćY íŹű#5o·­`ěŹHş—ŢíSĐ—ľ]yÍźX©Ď É{ňţ“ó¦óÓvŽjŢŘ…ş R+qď{,ÓE([G–C»Ł–>BQ·´Ş™Âz #–1ŐćŢőFs‹Ň„#·ű™GvéŃfn¤qnqYŽĺb@ ĽŔ…„r@˝O«nĚâ‹é W*ď‚ć`7Gŕ&�]öř•Y†±řÇż9[í…UŇÚRpJă–ZÔ# ¸‹q®ŕRÄ?$’ŞíHĽăUݤ ńÝń˛t\^ŤvÇŐéńÇĎůĹŹňĐn„‡îyÓŔ—˘u[ĐÂ+&ňL•FćŞd+ĚĐÇ ĺŰ`*»ŘV-ɸŐ,Äť' Ä{)š9çŞîáů‹SÇ•ý ŕ^BWTRú“Ý$óĘŃ·1ę3/Šű[Bú@<Ţ+1ä·Ľ –™Xł*"Lň<f/š•˛pŞeU+číiy·T˝‚“cć$ĘT¶Tď &Ú–b\ë Ęšbç“rÔ}E¤1$E„_·sÉŠßlC`ć‚·«JÇdÄ}ţYÜąţň<GćB«x””B°Â&€@x`ľËe댱ěŽHz±ýńár Ňk.×ý}óżŘÉŤQ;şłCÝëŚ÷ú-¸ťĚůęÍË4 IŰ;„_€ĹB­Nű+:k 1zWŤßĽ€ĽmÁ–kA>EŢuS„¦ÂSąô6Ř?ĚÍs uŽ?ş´H% LKžî™w *örŹÚ` ĺ‰5&íĚŇČ[¶4$ˇk¦.Ů© �MRÎäBŔ_PI)/;żÎí ›Çݎ]9ă›ŐEüm®Ş™Z.j„·?č §=çŮďk¸t]ʶo? ;+7aCPSx§äÚ#s3L·)3öŘżrČf™;«ą+9V‹ĄäŐ-„Ř4ˇöÚ6Ʀ*ďá?ŰCĺÁm8—‘.ň»Ż®™¶Ç±@·e9˝X Iďď«Dh•ˇđ'o˛ýŲv·^d_ĎŐ Ý˝¬lŮŤ9ł#şěŞňřôDŚPeäŻ?)Ô3ĽŁúCĂzLL3QÚŐë«|NĐbÁd ‹wé*±eşŠ#Dnú_ 9ńďż @¶¤=BQą}†wDZ}NG™>ńËů^ĹŇî‡ţ]G:†ĹćŽ^ŢGŘx‘ lzĺ=ĆĎëŽRŽ<őěT‘čˇÇRhy˙î÷\äsݤYfIşÂ­ŢWżłîĺP”úRa�dvsć6+`úfŁWiA)"ş‹ŕ8ŚŐ4Ť7N9N58ŕgťŰňFŔŚ8ÁÚ5ŘnůĎŕ äźĎÚ+46»_±MŹíö.pX1ň{LHP,ĺxÁť˝r™ořŽË6ß)Íá‡Í+zEôŕýjWu6\…˙ĺ:7@úô>OwçM…ýoGQĆS’°îÇO}5…˘ŕ_‰Ű Ú”"+fH„×ČŢvďYÇ“ă—9çźCU°ţôg8+—'?¶»Ýí2TFŹÉč"†ŇV6MIăţčK“mŘĂńÇB‚úŢ÷ňl/d•y�¤="¦¬8źÎk‡,‰ZBü-hĂ‹§Śź·x §ÉgoÝ„ˇ’ڦŇĆĐé< ChJxž¬ßS©ÁăhôśpéČ8‚ĽĎđô]ú‰öÜórÂPHcËî+Ç9ß4–¨ř„´ćC­Ër·É-D–cz¬iß> éŁ^úý8w©˘{C°hüő÷ľń^O<´¬ dÓ)3ʢ$’ 2Ř(]Łäé뽿a B€Hk.,äc0˙†â&˛D „YřŁv"+Č× ¤6SZRř!(|ĄYńĄ˘Őkvţ±¬O±Ŕ&íş ţ6eÂĄŽm'nĘ©RÜz%­6ŕň2úi!@Ă F\»ă+Ŕś÷ÜĄ©;” Bl d™Ők< čđq‰LôUöuË{^aŰäěXă“Óz‘éţ>€ĽĘÂ×™¶˝ćâß wëb… ş…ÁŠüÇO¤ď_‰»˛‰Wi |ŤÎ†ßÜŰqëř° â8 ×ůŐÎLO†ß F­‰<vŠą<Ö€î™ĐRŇŚKĄ‚VřžĂÚEÉůi¬€„GMW4+†Cřţ× Śq*đ'±ýxEË”.ďK ¦őŮ–v#CßIţ3|ŻwuFť2™ÍÂëŚ"âNýzµO&d»ˇ=v�ü}v˛×nŤbD÷ŹŻ7ĺŢ·í»ué2}{ä%f8 BíâČö’^†8a'Ś}ÖŚYůx0ŽĐ$™=EŇęUÜ[#­+ˇąŠÁő =3'ťÁ‰uXW·µ"*s¤Ö4qŔćDkc]\B<’}=:âfîĘm}ŔD,RB‚ŇáFX]•ý¶ţµ‡ĄĹ�‰ŤňŚQVeipÉ뺍7śZLŤŻ}`čĄŮ{´=Ńäô”ĚŚ‚ fá—ý1­ó)XG“|p .4ěaGQ5ŻuÜŇžqEťľ/–řá1EÁd| Ş\!M$*Ú=ńż«ee/ H¤Ä*’=Ţ“ď˘\´˘ÓůY:¸\vâ˘a[1>ţ9«dX$ů@ťN!›Ü�ßL#ÓĚ?ľŻ+»TKöş!ÝióÄE†ű 6öap ,g­{¬Ň’sîĘq˙ă~@^đ¸QÇU™’gwexÁ> Řď:]S^<ѵ _m–‡\t¸–Ś °[Z˝Ĺzk2¶?e¬ëŞLżbęA®wˇo˘P»­ ű:şŔ ¬(6ŇăAÂ.Á)JŕŰŃjśĚjî•TZah\yŰΩćÝŢď1JW ÷´`¸W˙2ˇý(!‘m‰d»Ű:tŤTő°DÁ;ČY]š2ŃćŞiwff;ęi]ľ31ÇóŻĺ,_T˛‹Źý|”ňBĹpWýB§a×/ű–8Opëźđů­vwl‚ŁĂUÂ�ÁVŞ­#nŐdé–L3F7’6z‡ďŤÉksíSŰ€=”ő=ąÔočÝrŞëR]hŘęq+ľ[hd‚ëÂÇđA^Äă ¶A›ô·…˘ţ˛9v\_Á!Fąá–ÖŔŤ—ë~Éć2dÖwřŔ ô+{ÓÍ ?"a÷ŽĺďŘ7§WłÂxž[Đţ56FgUWJXŤ5śsW=Şv%Ĺß(΄+L;ˇ…°śń¦/*eO*ÚÚ˛ĎFmÖÇËv#lk`!ŃxŲdáö±4ćn�DšToä2†`Ą%§z„ÄĂĽń;·GóÜ*»µao&.ßľ|®Ş,…–hmăŁÝ­ �Jő!XWR_µ8'˙6…[µIY°·–m>Řqr‘Ľ@43-�źö5#˝Ě†'~ĆDŚ 4OmT*©WÍEŘ8U śKĚ&AĺŮ6Ůľ»‰¶6OA§÷ľ˘.k WŠ‚*®‹B˝UčßLł$8ńqKÚRË…Ô(iĽkxáöń9€Š˙ńOýS‘ě‘�ŕč|��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/mpeg2.mp3������������������������������������������������������������������0000664�0000000�0000000�00000040000�14447736377�0016565�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙ó€Ä���������Xing����%‹�  #%'*,/2479<?ADGILNQSVY[^`cehjloqtvy{~€…‹Ť’•šťź˘Ą§Ş¬Ż˛´·ąĽżÁÄĆÉËÎŃÓÖŘŰŢŕăĺčëíđňő÷úý���:LAME3.96r;����.[��$B��‹ő j���������������������������������������˙óÄ�@Ô @��'˙(áŹÄCü˙ópÄ�&ŠŢD› �˙¢ 8k÷eü8äŽ˙/LĚś é™"N�@0e@9\˛EÂ� H71‰¤Ě ˇ�P`]X›  hMC˘PP j00Ч~Ę@®ŁCpĹ€`ô %B Í˙Ó@ő4ĎSą@,<5x·‡ĆüIË)˙0ceÓS &­ĆLR…’\J ¶Jć™˙˙˙ţL*lR*ŚF#„R�˙ó`Ä&±ö®_›ŘtŮ &çËŔÄs«f)wRT`¤ Jißé€-AY‰‹Arżů°7ś…Á­w˝25Š0ű7;őŰż>„ŘOŔ Ć<nmů†Ô‹~‘7“˙›鄇ZŤB­ďV?÷{źźţ˙Ţjl&ŁÓyDĄ?Ď˙˙˙ß˙˙˙üV‚"ţČsş.ĎărOüź×® X˙ópÄ&’:` ÚČt±UĂn—Ů'šˇ©0[¦Äž´€OV|(D冺ή9˛ąú‘ŕ-żTÔ/« i Ňä5vŢü¦K9K�Ś’( 0T,íÉ~eÝ3©:ŰN57k˛?N­ęéÝtˇ_ßűŇŮd -ŻŤ ŇńBZíź±Ź?˙˙Ľćłçý\»źó˙×{W¸ţóχ9ůo˛ŘĚş9Ź?ţśNźáĂę�ęČ'ŮôŞ‘8 áĄ˙ó`Ä%J^`Ô kjś!H@výâVvo>©8`ŮDÓ3´×˘&TqD)o,J\„÷)=ň5kö{;t HéO8Ó”°Cę\€A`¸…¤,ôxŐ™ »‰@Ś’¸UĚîFämŢ#•‹ąv–©…2‰|&ĘM4­ë?) ]u´ďűÖĽz@ĄM6ť Ǥ']@ÔU� + Đmd˙óPÄ i®„yǡ!¬zÇXÖ¶ĺ8d{\9ń«µ#ékëh€˛ c]:ęńöŘŔ«zâÎƧ:ĚLËňí ôU8BP˘b^ß_ŔěÖ®4ň.ŰÚŽAŇ�ŕYw˙ş5€Żă•[±‰›2YFŁ•ŢŇÔ®Ů'/�Ó!Ě!Ź$s�˙ó0Ä©bÍž0Ď §2¨Aöző´Ó™§ú9Wň5"§ĘXşű˙÷’1ĚÁȤE —ŢQĹĎ·ůQ0ŔńA 0µó0™áeŚĐ˙ó0Ä ©š´xE1�—h:O…+ć/Ţ^÷ŐďI-KËOSSCŰ–Ő2Rś V/˙üÂľ1ł)ŰR G‚i|Ă"ňŇ<o¬ôUc2i>~˙ó Ä Xž°f OtrşA™RÂčĐłí$gÁ’ÍĂK�›±łĹŤ#óôVAU™{Pî4˙ó0Ä Pö¨�ÂFXv%f]zţŮBÖ¦ÝÂÚĽůŮߨ4Ë üXěGb+ÇskL«¤ýdËäĹfU•Ě6DŁ2ËYĆz PĆ{˙ó Ä `ň¤�xĚpĎRĘŹB›ĘLQŐv×3rS‹2 ¬ŁLG’]�aŻ˙áĄÜ•®˙ó0Ä ą~¤�xÄ|ŽŇňÜËťhw«aô8–†~q­Ö"’ÚIEës§XŇ.uÜşm˘Żż˙˛©Á ń¬o˙µľúÎb¸ó^QŇqdcÚŢ˙ó0Ä á �xĚxOC"mç0Ž,1±Ď’řfśý´¶ÝTŽ/ęŮ*ˇ Zţ‘5îbwŢş®T¸^©ŰÜóô$(ę9 ’bĎ‚Á˙ó Ä H˘ �`L¨e€aŔé€ĂĹȡEˇ÷#ĆÔµ’—ŞŹâ:4Ń®µŐÎ0¸Ň+®śI˙ó0Ä ¸šś�yFdgt�€Ď¶ZYŰv56Ô84*0VhT:HDU¤H˝—=[( îčĄ9ÂÖ©†Ší<Ň Ř›°˘@3Ť›˝MŮ>ÝÖ˙ó Ä đÂŞzF$ç’÷®ŞzO7PB0‘4+ľř»©¤S’ĐŠ« R“BÍ#łpN¸˙ó0Ä–ŞÁ†(xżd…¬łš"ď!FÂo®qŞůx6@(8Ąš<Ą†l ys Łë¦¤jqJ¦7¬ÚGRnäŐ€Mp©˛í¸.m˙ó0Ä I†2J‘tŮM]¬:ë1˝ôyáĐĐ–”ś$;wiůÚ‡–‡KCyČGLĐĚÚg ¸(M8ĎçϬż]K>%E“†ě~**˙ó@ÄňF±ľ F —¶í÷�"®ŚV0d °ŔŘl6Űź"€ q·íĂW×Ţ[ąŁŘČÁ$+<±4)<Ď\ÎŇ)žŞŞÝF|ĺ3ő&°ď8dŞŞ&—ҫբuT˘4!çEóe¨#0Ď˙ó@Ä Á* ÖLs8L.Í~L} z|9Ň•°‹Ů¨;pXĐDdĺ§` tB2#âxÜÇÁ ±ŢŐ|ý: c‰ÎqÄEEŻă´hý)3WÄłL{ oţĐó,dřťďq»E˙ó@Ä‘ Y`�AŽXA$ˇ6X@a&(‰äáö–^úĹţzĄîÔZ–D& ‹-ŁZë'!Á�’ĺ“ňîfV°|ë'Ž®ŮZŐÝô4Wuâ.‘-˙˙űíŹ{*�  Ô˛őşą~€C I˙ó`Ä&ržéżŹ´Ý+ŃÖ ě*Ŕ—22Ű@ €ß ܆ďLM„°2¤äżÜÂłëJqor0DÁĚRf7†¤(66�X P2ćĘ>čŞhçŃLÜ7 �– VJZJLÉią…j2tEPčdqqXň`"c8#ŔőÉ6A‘Aµ©z˙ĂäţV‰ ÚI˙ó@Ä1ë żĆ-�G~nî’Î'b‚÷˰ñŢ$Ä;ä0˘™JĘÄ'f'˙{2˘1“oŇŚÂîCŐ÷µşµ\PpIÎU὚ Uň©3}e´�<é{ '–{f{Őr8xăó˙ó@ÄC^HÍnvLĘş]f*ŚkÓő śŤĹń}˙¦ôĺq˙h€ţ˙˙i«¸*ŐĹjč}¬iF$><Zaq$ŞIô»÷¦mÄÍdťŐ±¤“nűĄŘ<ęP<źW† ŮŮ–˙šűyE˙ó0Äű*^@‡oßüźô ήa şęv˘*ÚWuy˙ÍeB~Žľî˝I„Ń"Dľ°(_j\Î"B@Šbš˛p3 nŃ•€O†ďueĐ˙ó0ÄáŽŘ2{ ”XŤ|ś¸őm™Ďq7yĂńĐÂ,ËŠ]u7Ô™%»Ő–»ó•€Ô…ÖůHrÝ ˇ% 7U¨«Ă¸kEűÍ “˙ó0Ä ™–Ě y„”ú«ú%˝·µWď„’ţY P §g )úĆyP0Q%ľĄ˙˙ţ™Lsßň§g„Jǡp<&B…MĽ±ŢR»–p‡2HŤ˙ó Ä�޸�HF‘¤„aúáź'w,Ăí˛l.'+Of3*_=ŕĎxîŘ–u1nż^‡Ľ”C˙ó0Ä0î¸�HĚTËŠO3'¸Ç6Gş[Ňé•(g¤˘u=ťö¦ĘH5H2·,TJ%eŻ* ěô:öK&(ŘŮ’—F7É˙ó0Ä čęĽ� Ěů"Ý8á CL}ÂŽđ÷†¦@•0Š`«e\8t1é‹ÖĆ4ôÝ˙˙M*z.�ĂpV« ˇę8б$9ŕ˙ó0ÄňÄ�3Ě4ŤÂˇŮj)uÓŽaŕz˘%6´ %‘dçNęOG’H~˙ůmJ=ĽBź˝W’đ‡¨řpFU@ťqĹ”T”˙ó Ä ŕîÔ� Ň OW'I4×›ŕL:D…v#6nă%­a„Čćşź˙ńjůJ :t˙ó0Ä�ţĐ�N`‰ t �@dÚ3 ©·(¤ÄM�&Ž–Ö˛Uî–Çqtm3˙¶ĎýW@đůjFóŽ<§šEa #ă˙ó Ä ¨ţŘŞzJ¬ĹÔb}ŠŚJç‘ő9«$�)pŰS•”mý]lR ĐŻŢßôóEE­˙ó0Ä‘^`DZT‰Ém´�T"6ă©ät�Ś8T*RiL!U„ cÓîźÔ­(iÜ8®đ¸ĽúŰp>:Á;üˇŠUV—@ ćS˙óPÄ‚jŔVxŘ˝”o)·esÝ53FưÄ•Fű›ąOŮoD˛Ť¦n}Čěĺ,Ę>g!nŸ”&{óëŢŁ'Ö§!RőćąŘö· Üűiˇ<¸ŕ:3–’‰Ăf!PŐá0ó<ş¬‚®$pĺAaʵ”ŕŃ€(úf˛Źď˙ó@Ä"jĽđ0ŘŘT”Đ„Iž"…:úSCuÝH1qx.’"tśGvwC:Qn?F¨w'đˇ$sE2‡Ôţµ¨Ž¤N6a©Wźt>ШR•Á©÷–ă±ŮbĄuaíjŤçµU�¶ă1˙ó@ÄiŮĽL=  cá»H�…ĄŠÓFÍť׎zô€ÔآoJo¬óü*-p�Rsł˙j©UßűŁ[�BiĚ ĂŘCć„aĹĹŇĘö˶Ö[d´�r%ĘaqBÖHa1‚L©Eg"˙ó0ĉ^y†">ýéĄťŇ kş Öd{Ş2‚´Â׵Öď<‚S©˛@T ˘áTŐ@BđD­ G m},É&Źĺ˙Ç˙ó Ä�"Ń”@ĆIX>y:ef˛ďŮ9Ź<ef™ŃĚg}HŰćw±Ź]ݱţ»µ˙űít˙ó0Ä Á–Č�ALś§_¤·ö®ŐčÉc:LC kČô|çNŰ=oußtş¶}é%rŇ2 ńîć Ŕ]­úźJhę�8Đ� rŔ\‚˙ó@Ä âfŐ¶@Lń±qJŇfĄî6GǧÓ3Ü‹]Î7ç1ŮžÚ·|]iůA%i`É´śa·$–Ú‘ňL€AF’…x ~rčř‡5ËIxÄ‚BĆVąß”xĺ'Ě…±†“9˙ó0Ä é^ÔÂxFô=Ćčń�Ľ˙˙úp Ŕ)JE‘[‘ pě$©dď¦ Ä€˛ QťŁAUťü’ ôÄS6ô“µ‹’„˙%Lędd ˙ó Ä ©ŘŕxĚ‘�q9]bÚYh¶ňB2źä3g.¤‡60ó˛ă˙Ľ¸î-8â˙ó0Ä řúĐxŚĹsĐněýźž[‚2ő\¨ŞmÂ*›V›ç/í<$ŠÇŮőŰ~6 #5Ť´oűdť”µ (†§mq·o�*„U ¶5˙ó0Ä  ľ@F^ G1…¤–ÖgPř›DĚ䓜 kţ§ Ď—ú†W\ř�1yúĺř`pb¸Ý�z1VU˛H÷móCÎc e=Š˙ó@Ä’J¸yX}˝×ôU83‰I&q_„´Š—‘rŠâů™‰·LĎČĄrÉŘT®Ăň`. K‡ęlš61Üí;aqĘłž„·§ç än)YŤŮŘý»ÓHí°:*űmÝâI˙ó@Ä C"~‡Łnŕ�¨hďŁ.łę#|ő®gY¦7ĺÚ%Jo˙ÎĹĄg˙÷Ë h0Ń$B4§6°ř$Öo–PĹäb"¤ĺ•{–"îç�Ő–í·˙h¸�]ABR,:hy‡†˙ó Ä +^ÄžC9„„nP¨XîP©ĎđŚYnĹ…†7{8‚ÄP»zŞ2ée˙ó0Ä�>ęV{h¨äŤňÎ� łŽpřX�ďÝ`źźBxy1ˇwĚ,&‰ç,cçZ4{đŁB€ĎÚT±�V{#Ôń®ńĘŕ­ľdŁŰ˙ó0Ä HŇĽ(ĂĆ+>8_$Çů”‹-ëžâőaŹŹŢ}ąčD-Ĺl7÷ ÉÁ=˙Ƕ§'đ7©ąóU¸ŕżEůw‚Î=/YŔ˙ó0Ä 6¬ĂLϡ˛Ţä5®FÁŐZ‘ËÜŠ“r @ČĂ]żÍćuv8ĆĽ`4•űő*çnKn�1@¸ x[•”iµQké)nxţ˙ó0ıŞÍľ@G.%[Ďđ›^d"Ľ > hSؤ9:qŕ)ť¸ę0icň ¨Ĺ%ř26´6ÄĎĎÖđ“!î6ĄŁţçp›áăýMr7˙ó@Ä2”zL=Ň ¸a¤0"É“[ţś“¬ć)@ ý±�é÷˛äɤ@»HHC9ٱd׹_ĆlNÄG1,»&Oşl�"żĚ^˘đ_†ć%¶—/öîE96Ţ˙ó0ęް�b pżw˛Ăb�¸ZŤÝ}LĂkµ® ŐĄe6ť„“곎6XŚSKĄŹšQpÖv®UűěE>,ö–M<~i3u�'<@d˙ó0Ä ŽĘ8{ hŠ0áS( ôiöv {ŔCÚ3˛lLźŕC(T*•ď'|•Ţ“ßPu^‚ĹŠäUą5 iđ›RĂ6Ű8ř ę˙ó Ä ŔĘŔĂŇ&C }1çNúŰň�´JŇ‚{±#˝pÖ3 ‘5“WBĚ‹ î�˙ó0Ä1rČy„”qÜFLűÄđI‡™Ľ G†ŘÓíĺ–ĆąťÎŔ$Č"`déÂ0(ĘŮ}®Ó˝ż˙ĐAŠ,r! . °ź@Î˙ó0Ä ŮzŘ8`Ňľô'Bč U­S“Ě»ů·Ü‡Z!ˇő’RˇĚĘ,7ś~ ˝•Ĺ»ŹŠeĹOńjŕI^�y–Bď%,<dNZ˙ó Ä@öŘ>`Ä–őIŚ­*ąwżö¨aMW>ĺ,1[xˇäTxJĺ•2[„ˇ·t“˙eŁŚ˙ó0Ä�pÚ¸Á†bä�>ö,Ě÷&Ş bĆŃ &¬Ŕáívq™B‘Í™†Ř\¨\qT¨˙4%F,hYŢM€BŻwţBö*Ip+˙ó0Ä é¦ÄţDúଶŃc@Őśáý}h®qŮ„h*'í—"ÍN+„žYŻâkWďÎŮ]aćV§~(7ú ,u�ků9&ŕ›Č9N) ‰›˙ó0Ä€v˝žy†"“d×Y#OÉ$ł‡ťń(LéaŢž_UQěqŞ+۰}e4€ĘčynżµjŞI1WK XhnâĎt˙ó Ä ˘x�ĆŚ“,ĚĹVKm7Z ´Ăa« Z%a«›_ú:›7űŐB×€"‹“3B˙ó0Ä €J€4zĚA¤É"Hx¨ąpqhÚ™łhOŤâ0í¨§1źĎwňĆóL¸őţ}ňEŽľo˙ţ{qX&ȸÉY…ě¬m˙ó0Ä ĐÂp�ÂFHf¤r@ ¦ŃR±l\€ĹîĘcĐůÂ+ Ž0JxÚŻ‡ť{6ź�…;˙JU+#Óń "ć~ĄWĘě±či$Cý,ąZ˙ó ÄÂtzI&�&0 …Ź[c­Çłľ<·J~śwž#\Zb,€©ă˙ŠEŔ 6š„¬˙ó0Ä ‰‚t�I„”g 9â†×*eç]ĘŹ_ř„Ęr6€”‡4ĚĽ®îúŞt‚vć˙ňTˇ™`ÕԔU°+Ę‚˘ŰÎJ7ŕĹşÉOi˙ó0Äů–x¬a„¸R/obö«öőź1PUşfň·1»xßăVuaěk^˛oűÔv!Đ2—tŇIY?c\‚ű´jTĽ}g×B¸ r-’˙ó0ıšta†ś­·–†|͇¨™51~wFřF-Ď´J—ź›5†`s^=…˙ďáH$BQ&… ¸îýÖ®.•YÜ�y]riśŚ¤§‰˙ó0ĩƔö0Ä^ŕ˘MËąć_[Fb¦¦!i¶©×”€śŞpě uJŃ/˙Ô¤YÇGA a6+èk�U bR-é(~&b9\˙ó0Ä*€yYęţí¸Ś}2{Űd)ĘY>`źj{ž(¸^HDJ …‹±p?L&˙SůKBÇŇÜ·˙­Ýű h¤¬ŔeŽ›¦˝˙ó0Ä ę€-I�ĹÓĘŮÔ˛5ľ@ŮďšĆŞQĆń*jE$.ajHn@`S§”°)„ŚX¦ś“żr^ÚU�“@��Y±ŽRbŹ*“˙ó`Ä&ú^lŹŔ�Ω&͢­2©®ÓV§ŻW+4ÔX]ÎĹÝĺV9+o!zjŠ['‡%4RíA2ąD¶#Mc<ő5Ś›Ď%ó¬úYěő“ż,~źĘVň1~‚’üő?ţ{š­_–?‰V§Đ}6‹ĐŁË1MŮnő‡yĚuŻçďvyřóśĂźß ¸�fA‘“@”» A‘Â;˙˙Ň8˙ópÄ&bޱżŹ�°XF5†„€ŔÍ"i_őâ�Ĺ߇ý'ČŞnx¸DTŞŽĆ<Nő3 ·7‚Ň' ŐZěP@BäT;áˇ]­´’<g>i`¡ęĆŃZ%u­’«Nn&î€X°6WĂÝ ¨q­i)ŃŁÔĚťLši h±Ĺn$kÎ-hs†Bhíź˙ď˙ü@J Rŕvú1ĚĄ`?'•ôj˙ó0ÄfÔMĎ5±łĎźŚŢ{ů­,űÇ;+Z� Ĺîć3=T™mS‚(ö@EŐSÖäb\ÝŕŐÂď…ޱŢđ¬ęňú§µŔ˙óPÄň*Á”Ă d�łB)ÚZkńta‹Ń¦ŇŔSłOH'hE[ëëSj e˙ÝJÖ›Ť–»ÚÓRČ˙>L.@!�Oڏ±îĘeÔ»şöŻ^&/ę~ZĎMÖŔó÷/ Lý 4cěÎV3(8ă·ąŃěčî‹Ń(*Ą¨Đ‘ÚęxqŔ�˙ó@Ä‚>龊Ôá Ąe�)HyX÷¨M€Lű(9&ż,źĐSo♨ç—aË\(Áeř§ŻëťĎ'ţťšŻź…[ Ď’uć“wţD~Ëó\s�kŐ€4¨©öÔR†rOÁ€Ą˙ó0ÄR+^PEĎ0|"Űä"źĘżĘ‹oä#×ó…bô8Ď~AOôľ‡Â7„c˙ĐĚbz9„5EčăIĆü1Ű—o†�=÷#Ž ˙ó Ä;ĽQ”†×ôŔ±Ľń$Nôyţľ¨‰ý }Š—Öq^ľÖĎŇęÉvk±˙ó0Äq·"^(GjŔd‘[¶Ô�‡;q:Ś 7Ç#řŞüI_ßHX»fÉT˛3ŤćÝćŚÂ‡®˙•ÁYQq•95 !˙ó0Äb.ýž„|Îű!Á• ˙1z•_äéÖÝ„čöţÔö;9SA%Cچ5®˙Łý»ŻY wÉ6ĂPÍRń˛˙ó0Ä1ÎÔTj’ĎľpNßňHÉŹT! ŮüÄoÎé!8bW¨†ýźđ#żˇ˙ŇO wţtˇlŔ‘Ée”�jľxěAü=üřĐĎ3˙ó ÄyÓ^ Š&nďMş-Gü¨o »~oĘA˙ßčEsč9—ęv�:M*&3Qź˙ó0ÄAÜ<Ć,\řCđ|¸_Zţd–Íę ?řâKůQŽÄŠÎľY¬c.[yM7ěÁgŕŻ,{ţÂŞť= °‹.ŹÁđĹ,40_r‚Ó˙ó0Ä �ľ¨�ĂH ăë¶' Ţ­š†xtŢvŘTΨc|›�,$ĆŠüX˛ô`G˙˙ęOÖ;�@Č#:©RőOÚŚż˛ÜłtYÇ5Î~˙ó ĉ˛”Y�ůg›tT9%(Ą@!ĹĚvľU.B–tšöţ—A¬‰Ňß˙ÂŐ�ş '˙ópÄ&úŢą‰x�-sů˛ţ€9N•¬Ő\Ď‹j{HÖĄ>)©T°s´¦śŹ{š˙Šj;ÄłěçăwÜx,âÖÄČ"—Ź˝kzP<ýýň^ŐĆą ÍD˛Ö>ľ9o,d±“IŁť V7Ź ë‡©%Ća%˝ő{ÓZ˙絨ޡîd,/ì0XP+÷ăěą4!:r«/_˙˙˙˙˙¸˙˙˙˙ý>Ňé¶űD@`ĹoŃk ŇT˝�˙ó0Ä(î]ÁIö—˝§jA¦O˙˙˙ă¤űZoć˙đúR+�ţ‘Ó€f<Š}fy;zźśŐą[îşjc fĄŹŚî„äŃ™)˙ó@Äň^ÖRM"Vbő×r1ü<ŇdŻ­ßbv  Â>ßŰ ”!5'M¶ŹÜŽ–ŢľoÂeKfÜ®‘¸ WAi„Ţz“2yó©äjöIˇşŰ®¶Ä‰°!Ń>l6 Á¦˙ó0Ärc\y†R¬J‘ ˝ťąN.SţóΓ“:d»ĂŰ˙/»@¶«g±ýaź<81�yňń©7KîpŽ÷!J]ţvU&3ű…˝˙ó@Ä�ą3^‰„~R lÚTŠP¨Á8bĐ‚ŮÜŇdę3]wżú ĚřŹ˙Ô Ż DcŘĽ§ŇŤĚĘĹ<Mqč<-ŰZ"ěj…Fn{+& ˝&;›P€C®­ăˇň˙ŞH�ÍŻ(Ş˙ó Ä`Ęé´ Ň d,JÜ?ő5Ďýäá—ůaÁ %M‚ă7O’•ęĚ^{˙ţŠ˙ó0ÄQÇ^PGN0Üí%°�DőfČĘ/Ĺŕ|‘Ľŕ˘•ä"ˇĹ_ňŇGü/â}_ů-<őź-Fs)Ôßćjŕ� Ŕ„°�˙ó0ÄY˛ć^Yİ fzőFчĚLŹ”úŕQ˙/ű�Ńźň}J˙Óú“ÔˇY %nPŤ‚NPB˙ëĵ„�.OŔ˝@;}IŚ˙ó0Ä řţŢ4TĘLŕ`FďőőŤ?”@)¬ţ 7ÄÁÍŘďĺŹ`đ+‚µ»X|îS¨#Ň€ĽÁęáß�Xż8Ě۬`Ş=ő’ ýcĐ˙ó Ä9ŘĘ^€±(GÔnYüšiů4E2/˙ł‰ŚäC:Ágey`q¸h?°� h`˙ó0ÄY á”TĢÓbŕď*¨Á�@eżÎ7©")żć˙S7á„‹ĺMHŹP©ľ '1«ŕ¨óJŐF‚ “íd �šĄ;l˙ó0Ä ‚S~i”ÂŕÂ#­óÄFÇA¦˙ś0/ý ôuĐf{vsÂCýiţźęc}kţk˙;ţßäĆ!ĽŠË ů§QdĐ/”™Śöś˙ó ÄŠ^ýžiĘ×°_űŚ˙Ž}7ó¬<˙C˙Śľ|ĘLż÷ţă˙Ěßâ’±lĺ�2U˙ó0Ä�:2ÔT<Ä] R�##Wl. ôµµcš�|H©”Ćl)äľÚ†ş_ÖW˙'řq˙Űý?ČoóŁýĐżç/đIYýč ‘¶�˙ó0Ä âńĽ;DžÚ’Ď®şPéh¤ĹdŃ„?ű «ýG(Ę«ÖH&ßPă"˙"·áĂ;ű˘ôůWđf~§eÂÜUŐŔ“Źk¬”�˙ó0ÄZG^QGS ő¶# ßE€—čH5Qř]ŤźkcçgĐ@·ő o‘˘›óŚ)~ŠoFTţÎo˘’—ŢX]”q5ÍóŠ´0�˙ó0Ä€Žî:3Ň€+c( M8Řüs·ř§°”˝ßÜŃ“Wőhć” Öp#ő Bk†[§¤ôˇň‚oAŠF 2ÇqABęX8s˙ó0Ä 8ŽčR�4ĎnŔn…$@D.–Ź`µ(‘ÔĂČđ ž„@Ąßńo˙÷‘B¶o`ÁC@Ń?ÓËPěČŠśeýXozV’š‹`˙ó0ÄŽĐ�fHeůÂp ®X%„…]Á<‘«¬SĐF?섾ď+T ‘żë¡Ą»ô* ‘ą ; $˝KÖťp’ay†žÍv1˙ó Ä`Žŕţ0DŽ*e:ŇĐ�őI ‚+w‡¦‹c^)lń¤†\IúÔ9Î!ÖŞ�ârH�˙ó0Ä*Ŕ^`Ĩ:ň982Úőשּׂ’jŕj\2u3\mvj«¶ú÷˙˝b\;’-Cm}č¸QNB{Wôzjv#ˇ"8„é¬:G™˙ó0Ä 肬�ĂŇ(°ţ:@č˛ČDbL|ńEQJó€\]%PŕŹ&8`±Ŕře8–âřĹ .oƉ˙UÓČ�Ĺ©ĹÁ30GbÍ0˘·˙ó Ä Ń¸(zD8ĆĐtIăW8퓬y›f}oźË8@bÂśXyłµtµaďçÝ}%Ő˙ó0Ä řJČ^2R�Ń’l�-@ÁŕhdYk°ŠŮYT¬<s·—< ú=K@ÄŞů" ?$ł¤Ue¨ˇ5a“¶TD»ů�×ÖCG˙ó0Ä énÜV ŤÁXů¶Ś8ó†N…Ę~hFAĚÉáiNŇšţ‹ŔpZ+“‘!T(€€wÔâď.tĄoÓÎTĺ`p ˝„¸š˙óPÄ’bů`SFNI@Ţă˙ë9ű[˛äÁńK30U…mĐÁz®4Hvn$a|áđ1°±™AŔ&kű{vşWIĚś©0 “Mâ …#nusnč˘(ˇ$Ş9Ďď˙˙˙ąĎĂüş†X¬7PFŔ†ŮţGoŔ{·˙ó`Ä ŞožAžľ,2áVăi™ĄËĘŽÎie,µ’3I‚¤4VĚçIÝýđ‘Q–•˘–3¶,cŐ”şnnOV›z˝űÖ¨Żß´BpěĘ8- źmO=š 1«Ňę­°Ęy®ˇłÜÚqŚŕi“–rŘOÚ•*3±2´Ę<RÍ6i;p9*°VĐĄ™±şŠÜJ’ělĐ˙ó@ÄňjüţHĚĽŰ‚0CÁ%`ý`÷ł_é$KˇBwĄźŻf_ÚđzwżAč"ž‚"Q:,Ý�řěln†méňďX~µ™´«‹†*GfpôŁmHĽ’!ЇüšqĹ#˙ó0Äi+–Fĺ/s!áOçţ…=c…!ő÷¬’ČS`Îgru†ŕÚ©ŽżóÖŘWIĺ=’Ö¨ó´OË ~t´“Ďm/S–ŞŃ%-˙ó0Ä9Îč�Jx(n•ľ“2ĺM˙‹–ĺ“ÓTť˛®őF•žt>´ÎŁk‚ëaŮŤÖ �‚P\ žźTPF{?ŃÂ=˙</Ě˙ó ÄańŚFlŘ”0˛íŞŽg?˙E •sřÔqU—˘ő"H:ôÖ°«‘ZpÖ˙ó0ÄHĆőtCX¨/o©w;7ľzżGNďé=2Ąö’ÁÚ{>ßÔ$폠5Ď>,€‰ "ÉF—LŐź˝çB°ˇËµ¤Ů˙ó0Ä đĘô�KĆ€€?!€ťP ň‰ť‡‚43!ůa�‚Ô§lOârźĆýgţ �ařNAw;‹ó)S°¸ŤěůĆŞ´9z„˙ó Ä)�Ş ,ĆÓ¨€ţËGY4Í25Ďž˝ű§Cż©:‚’¸W[•B€Ł~ô˙ó0Ä ÁîýRHÄĚ,Ź Yoq0nŐSQ25ţSçĄGIîËô˙VTZŃZŰ{?˙˙˙LÉ+RTyTç”i&6xJŠD<ţĚ0&=Ýal˙ó0Ä8ľä Ö­Xq53*˘ćśqĆžak†P&]I··ë¬x€Ë…‹(TJ)_iJŃϦő$…$)µóąë0·|LçŹá‚l”¨˙ó Ä čO@�F¤•‰.Âj?ôţ`3X0ĎÔOhA®D }?˙î�Pˇx ÝË˙óPÄ Z.ŕŹX�á#jô&ä,~CÜ+ź…đü¬îł*^ŘKZmW„Á-qÔ;’PgŽÚcŃ>„Ăş~ă÷~ţ§ŢÉYół®á¨Ĺ¶ű}:Ž˙đĄÓöî(tS¨Ţ«…-ţ§Ô<ŕÜňź×ýjA$¨ ň­MŇŐ/\IŚ?ěf*#˙ó`Ä&úžŕx�JŠW’™G™/ÓÁ}—ŔđxuŇ:]ÉXS="›1cź¨K˘ÁWŽź%, “˛F_bxݦ\ŤvJ@ĘŹŞ_fu2 ¦•ŤD­gVEÝ5ž0§UÎŘőwT–Óřc}W5m,E1@¶Ż|őHą_mÔVĂšw‘ě¬mge­ń˙˙˙˙˙÷źŃŹĘP‘ib˙ó0ÄX¦ôÉ0�4sPd •q�č»ü@3QŽp,ŤEp#8ě ÍT[đŃa`íź×a1 iµ`ŬZuJˇ�&9e€9@…et˙ó0Ģ žE…QÖ’©áVf×HUXÄ?/a ÷^^Nŕá8Fš˙¸I—“UG'ňô ěץ™—ćÍ®9ňż*€ođŞŇĹ…cWç˙ó0Ä Áęř¶0EQ”¸Ćűď{ÍřßĘH™ň®1„'żF$âvi¦ąKç“–Tm2Bä¬u×»;÷ŚÝĎöĎV­q¨ÎC2Y‡˙ó Ä AÜ�b”Ą% ÉCöµrđVĂrĐÂÁXŞîÖ˙+"… Aź˙ţE ĚéŃęŰ{o˙ó0Ä� ą Ô�HG@¨bI€˙2»fGŠŽ#,K[R¸^ĺ!ęZčý&°  © ĘyFÍlUĺ í?ÉŮÔ(,ن;-˙˘)säĄęÍ&ë˙ó0Ä ř¦ě� ŮáȆĽŇ®Ţó÷ě°Ę,™ęEŁÔ*Ę|űü�iPc9‹şQŐÁ @É‘LśęyË>™h_ăy×˙•¶j˙ó Ä ňř�Ä<í1řőwO–˝tB·Ůţ¨R˙äüßECu3ő@č‹>:>HRy}˙ó0Ä®đ� X,ŹŤܲ2 ş'µĂŠ~őĚćr[_ĽMXňZxň…ž)Má˘eWó»šČ‰€ëC”ˇŐ1Ü*o=ĐĄÍb˙ó0Ä:đ :DtqÍß[gç=&«›Ż×éőôoý ˙”Sł*ŻE˘Ő=J®Šă;äufPB‘WŇj.â@GT8úF 1][™ga˙ó Ä(–đ  ~Ű8<LĂL}”Ľb~ĎÁSHBWJŤ‡C¦®ą`T!€ö$M~Ü�˙ó0Äfô †EUUZ`"]môŁ&L[u w1KĂ˙˙ż•˙c€ç{¨ŰţÝŔÎë5ľÉôďÉŰKĘ\uę›őhÍŞ˛›»ĺ@P;9<W˙ó0Ä �Ęä� 0k$äĺĂ´˛(ĎuËąíŃŠŘU¤Š7¸•µŁV“ś 4%|™ß>0‰/˙”­ůĹhˇĐ2…ÇäĄÄšđ!çĹ3ŢÁŘ„˙ó Ä ¦Ü�I„p8ŕ6Z ć7­«oşkyJi˙{3•W"˙§o˛’µv?ú·ahN˙ó0Ä 8ŢŘ H0� C†»‹cŠÄ3Wű™;¸ânég˛óYOeĄűś‡4d<·<RÚ5ní'ßÜŚ hĘH}±‹Ą˛UŽD˙ó`Ä&ú^Ŕ ™Č�Ł‹>Ü�ÖŔŔ™”9qVőgW–“–¦ůJi{zµçgwťČ´ĚZCHÎSęBÔ¤,šbzďer*öa§sw©ěMnĄKÖěc…şz[ěÝăoáçTäXÇ-Tüą˙+ćz¦šŠCyK)µI?źo×»Ě{†»žŞăŽ_Ý÷őžŤłµëˇ”3˘÷ˇ…ĎÝßő˙/@PŔ˙ópÄ'^Đx� I<źÓJÉpźĹSV˘­ 3Ť$Ôá%8ćV>Ë"­7tłG&§f‹#Ůl˘~ş”¦oŰĹbŚý€~Y»¤•ď⮞ˇoٵę1ňç éÉ:c3D}Z¸ŹĎ6•ӱы+qY2íĘ׋N ĆY=5ĐLÓ¬™E;Ç;R1^ ~®NµÎĘůň¶ŚŇĎhąRŔn´±Xd´˙Łú(HĄ�VÍ ÚšEc&h˙ó0ĢôßÉ�E o+Ë–s…jZÜí,řąžţyű”_©"ŞIŘsűΓĚľ˙˙˙±_‘&’T+YŤkţPÔžąé@4˙ó0Ä`˙ 60Ä_I7"ŢżÚŻRzmşUő6ëM`Ć`»´SČIćűż'ńvă§ľ˝˝óňÄy´fnkýř'×-Ą †�$Ó;Ĺ4ÂŁ˙ó0Ä ¨šńT LOň @,ńWz~g9W©ĂŰ:OĂ llF”ĽsĂ ÄŐ%ŢËCęJCč|š ZŞ pB×UDŕ‰„¶ RĂ˙ó ÄHšč L×[vH±ÔăC"ő^*‡!5µL(çJŁďćŃH2"›CZ:n†ÍŐ˙ó0Ä� Y Ô�I†\O$ r!T‹ił¸DÄkC–u<éŰţş7d—Nµš(R şEżĎőj1Ź˙¨‡yÜS>źmęąÔ=HΧ%ćľ ˙ó0Ä ©Ä�A…,QÁívBß.r!2‘pŁŹĄL‘�â&)ët `÷jÔGî˛DčJńK?˙m›·˘Čp uźí´”“ßu{Ý3˙ó Ä ÚÔ�{0B-ýĎŔŮ‹Ň ’Áw"@˙?˙vŹ˙űU{nA2…‘Ró˙ó0Ä áBč�CĚ,ݰlˇ‹4unŢ_ůćĂ'%˘ ŤŮď/¦ö>(„DhIŢÖŘW›Jě˙ţ”˙Ѷ… ×P‘ |K°¤‹4Ä˙ó Ä (ţěC ,9V÷˝ĺ(×ę÷q (ţmPxńÄ4ç ńaĆĘŁ˙ěręB˙ó0Ä� É.ä�Đ,Z4 E•Ň˝¬3ś‹JÚë <uFĺČş©ĚA!äĐč‚'JDZ«B˘Q#őeąV‚w‰˙˙ôŐlÔŹĹJW{ú€˙ó0Ä ů*č� Đ08 eů»2q"â †ś  4ŕ¸éßî˘%¦I^=!­j`ANŞvuVĐ$˙úĐ)6ă€+Ä?Ŕ]úťä˙ó Ä ég žEJ˘_?”v=v¨lµ ůŻ;~‚Ă2u÷ ußÄjjLţ˛Ç˛EÔˇA Á˙ó0Ä!jýž@EH@>i6Ŕ ×9VJ(ŕYLÝ”±d‹Ľ­ ¨źF›ţÖVúF5˙Ĥşđzčd7ëtŹ“»÷ 04ĄäŮů¶ä€¦Ů˙ó0Ä Bc ž@‡V=|±Ö“łÔ()Ű[Ě y¤}Ũ&5–F˙č;~Ą)Ez”ć)U?äýޤjvËďů»p‰«°'¨ –ç`IćC˙ó0Ä đŞŕĆP·F·"č.Ťm8o“”ÓÔ=^7˘˛‰™Ĺ hEv‡z‚‰đ;V>A�g ţg˙r–XUŻţ@�aą(lł¸�˙ó0Ä«6L® dš°�Ú~¬"lČ.díAŔ ‘(*’áĄĐą`d {9*PŹÔ ‚ W*ÇĹ!˛Ĺ–g'¬-jĂ„·Ńľ;Ö˙ó ÄŘ�zDČl2B ,6oW˝‡›l"S‚¸&¦BÓé!ç< >˝PüßëŔ ˙˙ó0Ä9"ńT@GŔš´n\pţŐt,đ±«r×P,Xéqř">©hu0¦‚… D č:Ą +žŢ´p›Bź˙Bź +VÉúM˙ó0Ä ů Ô `E$ĹÔç°x ÇŃńÚŢrmfÝĹLÚ mí�*ô–&é©{öű×ý+ ¤x4ť{7 ŻÇ°l÷s䨤ťJ˙ó0ÄŘKĚh­Ť“łżoŤö_ä‰ÇÓS41:…6CĚ>l;ë šEPBP@†&ţ’r5Ů[é¦í ’ CÄPŹš‚Z¦ű‡ł…»˙ó0Ä žA‡'ůŹ‹Ťq˘ZQYyF m[r›á{C/…M“ąč_3'a°©‘ź+ih6ĺˇB@ńʵ8/ÇÝ[&#ĽL¤˙ó0ÄY"ä"HLČ‹ ‡´űGLEóU„SióřF#bç0Ő#Iž¬é×79Ö—…8p  ŮŃbe$Ź?ű[AĄŹâę`qq=š0˙ó0Ä 8Ęä*@F¬tĽĂÜ”9­?®Ďé0†Ŕ. ,l°  BbŻ« ±ŰŚŻţ­ČşÔöŮĄK% ťĄ¬}T.˛L‡1}s˙ó Ä ÉnÜ�`F¬ŔőSPŠ"M]Ëş BHh¦É¤ócĐŽ˘a0¸§˙%Őöő*‚ą-˙ó0ÄgľFe7-� ÚHru«˝!Ŕ ČL#d±gÖ!răפN�ďr¤š•¨Ń}˘Sˇ—ÂÔ ‹ăęęDz\@|J†˙ó0Ä 8:ÜT2L�Ae&u$ă$H¸*¦™˘Qł…°ĐyŤ$`&¤4˛»)´$ki-GBŠ€wˇýI`˛ą*ŕ)CÁ€Ţ”ÄĄlľŐ ˙ó Ä ¸VĐňĆ�Ĺ0F×˝hm8ms°Á‘&«"®XÂ!eV Š[U«˝¤#ëRc˙ó0Ä©ĚČŔŚ<ţ†{‹m€EPíIhÎ çŞú7Łľwdńé„ÝzĹ. 3šPr�ż˙şŽÖbŚŹ’u �’]� ˙ó0Ä–ŕđXFX&Ţ…M€ĆxJ¤ĆŇO˙˙…&BŻ)yđ’tá9˘;»»ą˙ĺ÷DD-śY± ř|¸>SéűU Ĺj@* Íg^„‘ň˙ó0ÄiŞčČ3(N%”ŠĘĽđ_üN»şĽ§Ň„¦Z$ <3Ş #:Y Ös1ˇĄ8u`”¨őűtYüŞHBŕ\:!¤]Ţéx˙ó0Ä €îőX’°†Gţ§µ RU´¸šŐ0¨8ÇđŞ(ĹŔŘB"=ĂqpQy®í_ńpM ™éĽĽÁŁ„şěůŕ%1Á’Ľĺ‰­˙ó ÄŃ đôĐ`ڱ‹  Z÷qłj3隸Iµ4NĚ-RíŐ§ôwhţŞj`¨�˙ó0ÄŘúőľYPŚ+m�M>Úáŕç˛ @Óz€B†\Ŕ§Đh8ęř@śVąĆ”Ëófßôä¬NęÎżŇ ĺ[Z3Žű«ÝěĘ©5€�Ŕ˝íďBF˙ó0Ä !ĺTy†X_R˙AÂFˇůw˙gČĎÚZ%Ř aR«‘\ŐoĘ}$Ű8˘Ŕ›«J[KvÚ3˙ó™uř ÍHx~…‚ śú™„Ś×˙ó0Äi˛ÜzJśŽí·ľR´Y´Ň'Á2&Ő2XF|qdsÍń…Ă*žČ*šöÍS-Öß­µ(s›(’ňţ€ť:d˛�;�˙ó@ÄbjńľPGŚ%/�YsF`ž´�\:Ö0©ŠŇ$“?BéÝięqżEnĹG¤ĎŁ?�>K˙Íq´Â@‘ź˙^Ę"$2F�Ë’‹zŐ)†Ń_ CŠž:!ňpŤÂ±Űâ†q6:˙ó Ä Y Ü�xĚ(Š=Ľ‘˙]źş’%@ b3´},±±ÂŐj¬pÉF¬eż˙ó0Ä ©Ě�xĚt'(‚TfZ|śżKŘ7›–ą0ôSÖ*»7ÇtčŔDŇh/@Ż™<¸‹-áĄ(zz)€9,sĹ»’n·É:+)ˇ˙ó@ÄňĐ�xĚtt˙…^•SŃ,ŠGůíÔĄZjNřŮÚ^±ě…Ą qĘ÷v›^釻Îű%7&¬ze&Lťóő č¦ožÜĘ�6ĐŢ[ŃŇßQ&Źé±ýc#Źź˙ó@ÄbjŘ�yĽ×}ń[LńĎŁÂđąoçLŠŻFĹšŽj¸#¸W6rN‘<8(4`Żn3Śt;Ş÷Á€ZN…•DíY-…•RĽN…´ŞŐ§»K*ñá!Öş+f⇬ď9J©Ë¶Ú˙ó0Ä9ç2^G2F“pа™ßF~Ŕq#‰‰»«ż2ěX_°2)Ą˙Ň—˙çç8B_Ă J˛đÖä»(]c&ż •Ś%TŚěŃ€ LJ$˙ó0Ä >ţV �h§zCPő8@…Áö“?�n׍FŁŽ$H­¶3JŔ›ń( ŠD[BURý8‘‘‹TíXHŤIĆ˙ó0Ä€¶Ü�3Ň âD1µ•˙«ąĂ/˝q) iÁĄŕw$ŻąËFó·­UŃ·˛9‹HŐ,±ßö�^ x“÷Z-ʎ;Ü™ Ä„˙ó Ä8“ľ ĚÝOľTN,H!ßÉ­Âe qŤŔ ňЇ·ú°Ł¸�¤M·@˙ó0IJůE2ě$ J  «*©vŞ“©3ë,ŰL|L\>A‰ôA, ®1ć˝tpÁś•wůĄ†­j¦ŁQăsŮł©!;䨍 ˙ó0Ä!ľŔ OPn7 ™|‹za‚b(F<fLłt3üˤ÷žČj›ö[ŻĎe§űý*b–‘j@��…‰ÁĽŃ�)[†§4\`íř*˙ó`Ä'"ŢŃ�Â@b`–3‘C‘Ő8ĄšĆ^!w T “‘tĄ#cĄRŮÄćc ABX+%e2¸¸„Ś„ȲŤĎ¤‘‹™2 é‚´%�u�đ—ʤl`N¨ÁşU—‰·F_<şµ-R©Ů¦š“-‰Ń7/•ČňÁt[Ô{Ůh,ęF-˙üĎ˙ůĘÄ;˝(˛°Đ˙ó0Ä ^¸ Ř�D )sŔĎ©éç¤Qčő ›ÜłO#Ę҆ęQ/ĚwDô©QX«ĘT9Y­˙˘ őç«énž‡ˇĽhÖ‹a˙ó Ä Ŕľ´Ă4â𸾑­uĆ—.ŚĆüŠçxE2…-ćŚ4­R"éĎv¶0Nqč˙ó0Ä�¦´�Á„|Śod¦żmţĄąŞB÷ óżęĽŢwyhąy0ľpXA0Ĺę4ŇéCµc•T·F¦î˙·ű/E Tc"¸:śź˙úŞA o˙ó0Ä™ž´,aŠH�¨FPr=«płeLÉĽú˘ ’ÄtŤśył‡hއEĚŮśĆËnĎ{ţÍv[T&‚ß˙Ą>aŽRąę¦‚±˙ó0Ä Ψ {íÓőú¸‘‘´†ütŚ}ŻC TO!b.Y ŰEMS”{îJ<„8k±‰C˙âĘŞ©„ŤńÜ“Â`Y+N2BTÄ˙ó Ä ¨�{ h<Kk†§[Ď}ÚoąBĹ´–|×:,1Š]˙ĄU N4F˙ó0Ä6°9I�Ăa2Şčdl‚'°áČŽĚĂK±á·Ć°ůeŽá4SÖS/ř‘!ˇ˙ó@eŃ4ŐÝ-`H@ę¨Á &LJĹců{€˙ó`Ä &ęžýżŹx"Ę$*’6IÁĐs#V0\\©¤äĚîđáLÜś‹čö§vŰ‘>®˙őÜ×Ô9ŮlŰfLŇ.·+ýŞńH9/3†Q?1Ť|ę4h7}5ŢSWÄHää×2Ţ«Bć󝏾š%/K3ę°ă«ŐńĐő{žˇ‚ㄇ�‡‘jtaglib-1.13.1/tests/data/multiple-vc.flac�����������������������������������������������������������0000664�0000000�0000000�00000011222�14447736377�0020226�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������fLaC���"������ ÄBđ�zŔˇ±A÷f鄚ĂŰ0˘ <w������������ARTIST=Artist 1������������ARTIST=Artist 2�,������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙řY�k������Š˙řYl������‡˙˙řYe������ľe˙řYb������)˙řYw������ÍQ˙řYp������Z$˙řYy������cľ˙řY~������ôË˙řYS������+9˙řY T������ĽL˙řY ]������…Ö˙řY Z������Ł˙řY O������öâ˙řY H������a—˙řYA������X ˙řYF������Ďx˙řY������gě˙řY������đ™˙řY������É˙řY������^v˙řY������ş7˙řY�������-B˙řY ������Ř˙řY������­˙řY#������\_˙řY$������Ë*˙řY-������ň°˙řY*������eĹ˙řY?������„˙řY8������ń˙řY1������/k˙řY6������¸˙řY ‹������ţF˙řY!Ś������i3˙řY"…������P©˙řy#ż������XE������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/no-extension���������������������������������������������������������������0000664�0000000�0000000�00000000400�14447736377�0017503�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/no-tags.3g2����������������������������������������������������������������0000664�0000000�0000000�00000205357�14447736377�0017041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������ftypkddi����kddi3g2a���$uuidmvml¨ŚÔ—�'w����˙˙č�ż5ěľ���<uuidenci¨ŚÔ—�'w����KDDI-KC�W11K����KC-RT19�KC-RT31����,uuidcpgd¨ŚÔ—�'w���������������������� moov���lmvhd����ż5ěľż5ěľ�_�™p��������������������������������������������@��������������������������������Ütrak���\tkhd���ż5ěľż5ěľ��������™p���������������������������������������������@��������������$edts���elst��������™p���������Tmdia��� mdhd����ż5ěľż5ěľ��V"� ��������!hdlr��������soun��������������� minf���smhd�����������$dinf���dref���������� url �����Ďstbl���[stsd����������Kmp4a���������������������V"�����'esds�������@����}���}����stts���������C�����Hstsc���������������������������������������������� ��������� ��������� ���������������������������������������������������������������������������������"���������#���������&���������'���������*���������+���������.���������/���������5���������6���������7�������� stsz����������C�����Ű���Ű���Ć���Ű���Ő���Ů���Ď���×���Ó���Ä���Ę���Ň���Ę���Č���Č���Ó���Ă���Ň���Ć���˝���±���Ĺ���¸���ż���Ľ���ľ���Ŕ���˝���Ä���Ľ���®���°���­���µ���Ş���­���Ą���¤���Ą���ˇ���ˇ���ˇ���Ł���©���Ş���¶���·���±���˛���®���±���ł���Ż���Ş���¬���˛���ą���´���´���¬���ł���±���µ���±���®���ł���§���·���©���ˇ���ś���™���˘���š��� ���¦���Ż���©���®���˘���•���§���Ż���´���©���±���¸���¶���Ľ���˝���¶���°���»���´���Ŕ���Ľ���˝���Ë���Â���ľ���¶���˝���»���ż���´���ą���ş���»���ş���®���ł���­���¦���®���˝���ż���ż���Ě���Á���Ľ���Ľ���˝���Á���Ä���Ă���Ă���ż���Ě���ľ���Ę���É���Â���Ć���É���˝���Ŕ���Ŕ���Ĺ���Ć���Â���Ĺ���Ć���Í���Ć���Ľ���ş���Ä���Ć���Ć���ľ���Č���Ă���Â���ą���˝���Ľ���Ć���Ĺ���Ĺ���ż���Č���ą���˛���Ż���ż���¶���ł���·���·���·���¶���Á���¸���¶���ľ���»���Â���Ľ���˝���Ă���˝���·���±���Ŕ���Â���ą���´���Â���Â���»���Ě���˝���·���Ŕ���ą���µ���˝���·���ż���ż���ş���­���°���´���ş���·���µ���˛���®���¬���«���¦���¦���˛���·���ľ���ş���±���´���·���Ľ���´���µ���±���¸���¸���µ���Ż���Ľ���´���ş���·���¶���˝���ą���±���¸���°���ą���˝���¶���´���Ż���´���´���Á���ż���˝���Ľ���ş���¸���»���ş���Ŕ���˛���±���°���ş���ş���ż���ş���´���ł���»���Â���˝���Ă���Ľ���Ă���Ľ���Ŕ���¸���ľ���»���Ă���ş���®���ż���Â���É���»���Ä���°���ľ���°���´���µ���ş���·���»���Ľ���¶���ą���ş���ş���ą���É���»���Ľ���Á���˝���Â���Ŕ���Ľ���Ę���Ç���Ę���Ŕ���»���¶���ş���˝���ą���ş���˛���Ě���É���Ç���Ę���Á���Ĺ���É���ěstco�������7�� T��j�� ����ţ��"0��'��+w��,Ę��1¬��6„��;[��<��@t��D÷��IÉ��N×��T��Y$��]C��b��g×��jň��pE��uť��zí��|f��¨��†¤��‹Ä��Ž���“��S��ťm��žĘ��ٰ��¨��­z��®ę��łĺ��¸ę��˝ë��ľ¨��Ă˝��Čż��Íî��ÎŞ��ÓĆ��Řý��Ýţ��ă��č`��í™��îR��óĄ���8mvex���mehd�����rń��� trex����������������������ëmdat���free����mdat���wide����mdatŢ��libfaac 1.24��d®3,(Á@°PlT ˇ@Ś"g5/™×<3YťnŞ]J¶ňi#qz¨ßŐtý•őm‘ż¬6?—žžţ­xwůiéľ…ßĆ©×úć†ér ľQ<—™fďťGwút˝ű3sţŢĂýś«fvúźö5ţÝř‘·÷?řňú ŮéA1@‰ďztŔD!˙Z§z;3Ď=7!ćąŰ–Ţ—0©e<e=6Ä˙ü“íüŘL,Ş!Ľe§3ߨpő,Ü*|´/ä4şŢÚnÝ]Ă9Aßđůh úžĐž1µřČÚŰMAĽ í  R—]J�ßż}7·ď˝ű©KŢ÷ľűŇ÷ş—Ţľúo�8HźţŚFP\ˇ6)u/ŚÜëZżůŕ�s÷˝*ýů:ÚĎtࣔůŃÜ ˙LÉžŇű)qŠ3›¸7‰ń®Łß:¤>.óz"AX†*ĐĹ;Ť!Q1Ő…ćŠ(ž…Ý‘ÍĐŇ(˛÷Şxęu‹9C ŽAŽz«FOđ°µÔ6KĽF-TŔ©Ł¬Ď6†Qž|#g}§Vëöâëó/»99÷u}‡4‘—~AŹ 13ZzdmÓq×N+ay ˙mĚöÝ �poĎMčŔ�D���oŢ€�ˇľ€�pBźţŚ6HXąRdbňquÝű?ëzčAs}:roL'0FŔ~Ů8uË­FŢşfr âŤD˙˘_ţ&~ľ%ţ…~…ţťŕVJ¬°âÁ{z"O ňäŕ>),Ă5ôĐ3 0ö«Ä€¸‰ßŻĺźS·¸ĐgěÇźmÝ›RËÖ^ýţýUődy' HúۡäľË‹(ăKşëc-¸Ç”hě¸ÂYçµŢŰxÚÔ)+żJÄü~7Ëb{:·ŘY JYUDAXWM”�é{€N–�<U�Ä�°˝@�GF× ,8" †„€ H( DA` $c}ńş«—®xMĎUĚöÍë–ąŞÖµWűýőKă|ŃWŐ'Ö˝mňyíh§g±ýK/NŞO4ú/ßţ=żłě9PR\©¦ř˘9ywÚ÷ěđě]düóŽüx•J«^Űtk?w«ďůhšĄc"zśśw;ĽŚ{ěÝú×"űĚĽ~E»\Íu°™(( —í8‘Ý^ě.x‡$ëěľî"0x �&—H€Ŕ`�"��T*�B° Â@°TL ˇB°,8 „‚!0Š\îńZšîřç[ë×ďß;öĘ×uĆVőć•ţŢeµű’ďµ×Ç™~®Üâţ}t~ô~.;ß1,9ÇŁšŹłÓ«C°ůCoREÝÍ%űůţ«¨„Ň:ĽµÎ3¬ó7lĽ),“í6îçŃH <�^Ż NH n'h´bEXöó±đ®˘ĺË_×U·F{ć10¸Ę8ĐőV§WÎć Ńiň¤XĄŻ ~§ÔţŔ€ ćđŠ•�p(�@�ŕ�B( „0ŔX(& ‚aA0ŚÁ@T&IéUqç×Ě“~j±w9Őč˙ž%´p•cĎ_şż©á™˙ŹNIý(µŻ4ö‚{o˙čć:‹±äÝÜľ÷żyĹÄăđ$(OŁV«ń=›wÓđŇ–ć­UС?P`tMşúŇŐłTiö: \ sß±ůĘŹ*řGłšóú(K!ÁŰCů=?Śę»Kë´R…JYĂbçCﯻŐé€"@X¸&€@���€�pB(…0 X0 …‚`ŔP& BP n„Ä)k徲ľĽ§1Ďł^-\NośÎ§Y_íń\f‡˙¶]Öűý?ź7űôÍ7čµy{4dBs]Jxy7ZĂÄż $®]qőWüÔ±ĺ}žT>¸ü”Čx{zŤ�ÝǶÜáܰ.xQŠő{¤¨@sČۨ Ş}łŤľĽ(kTţé˙=.Í1•LZđďăQé-köWü®) uŻőšÇE$·°�@Ś„€�ša ��&��*�€DW,8 „‚p±* ‚‚P X(6…A0E/?išËqÝŻ÷řśxŠqĚÝgRőżóŐŮĄŹiyݍ˝…éż’×úó¦śňÇÇ×%–Ę GmĂ}¶˝îjŽWË4„t·ë+ő@ťţíĽç Óź–€Ă ň˝†"Ł đčĹÁÓ‡ľ@çß×z´ź\ ÓH Ö9P8q«uýB{úU‹ŐQľ‹U/d$!ĺ°©ź1’X .jgř|X8�L0D(g��¨�`���JźţLF0Y)21¬©3SŽżŢď„Vm­•ł°í;·ůźˇüi(«Á&›¦ŠDÚíM>ě.Ă1—úÇřő•˙`wĚCżÇÇřďţ7:"NçfŰ«Ž»;vy„=kč~O‡¶˝.rÜ5wĺßçńč+Űh Ä�K5áÚöSřqţľ˛rŰSľbçB�Ţ ”˘i„=u*Ď€]6Á[/R‘(\#6Hţ9ÜňçĘR”H4 ë`˙ŮÉQô8/ Ő‡dvX��-Í–��XB�Z � T�ŔLźţ‹Măi*Ţ×˙]k S˙okb1nşőîÔ)zÖß§Ó=XCŮŹ€ů­©~(űÄx˘ČnĘü¨4BŃ‹Ś=ôtr˙=ü<rßo›ŰV®€<sălÖźĽ·ŰüqźŤóJ”‡‡¶¬‡ÜCB[=s{,ŰAíöN—ÍARŰ"sÉČâëIŤ˙Ż«yřôś§ç)+Ł’5łĺŠNRĄ¦ĺśÜäÎ\řľßN/%Íä[ú%T Ë•q�.N�j…A�Ş�ŕ�¨Ő¨��¸pJ×L ‚‚` ŕH …p ”.#B#0ŠUÝíť]gYÔ÷ë­ó<÷KŤË˝'ßů–š¸6.Áw|xý|Äűµ~ŰvoÝÓúhĐ {¶óI «čÍ®>—Ť¶k­Ô,ć¨ßďęÉwÜčcÜ&˝řP^ďůÂO§Űľ÷Ŕ,ÎÎ|yÔ-^ĆŇqź—'#cBDXůÜ_G¬ÔR ><=ÜB ˝+‡�#ƻʀ˘ ŔM�.��$p���L HL' Á@°$ BAp°PP‚ˇ`¨L"#Ą˝ßŽŞ–©+Ş÷ö•ÍÝR®Żz˝+˙+š©©cjý'—ső˙÷»Ą^—Ťß±řď.«~×éĄĎKaĘü<ťŇĎ\'GWę-ţűV O>˘×ş›ˇťŘ;ę”Ö {ŹP)L¤í-Ăc=q¤@Ć„+Žď>'U¬Ť»ŕ“~®ŹĂ\Ť…×Ţ{Ťj©WzŐ4"~đŢp~ŕq�(„T��D��€�� �`H,Á€°P,$ˇp H(„‚`¨P0 Bˇ0ŠUśĐśSUÇ7ďđżWÇz«VdęęĎťSŤoC±-_$ů ß·˙ţx÷ŇóQĹ—“nć|·râ‘ËŕtŃço·ôŻhźgŤoןĆKËŐ˙–|˝Úźku"KCó•: ĺ‘>ˇaŹeâapĽB‡4ÖbhiCF�W¨ú÷úű˝°�‚fÍAŁiV÷ş’ĺÂ{ź„“�bE�@ „�� "���Hl( ˇ@°, …A@°\$ Â0°\$býő;Őgťç?|żWĆĘëu˝\“ýż[ÝÔšŹô}ăwóś:öý&ę.ĺ{Ö´ ÷Ě?™Ä˝]Ď•W§őÎk~/?g͵IŠEźjĘţÓ^éŇ˝¦¨ˇ<ĽŐ|ˇ–~KĎĆ'«ăöŢÍo7˙*f®Út! i\ÇÉŃIŹéZ=ĎÓq vĄŕŹS»áÖ <Ŕ& °�,�P�@��T��€HL Á@°T, ˇ@ČHL4…ˇ Š—Ý÷Rď^<ďÇťoÇĹW޵»©—WĆżźń2śoˇŘöŤĎŕ‚ńg/˙îËz7yx# Éh×ć«ďó›÷đI2ôŢ"ŹďfPl>[űłŕ˘cçáCjçĽ|‡ŕq©ć#~&„ܰ‡ŁXŚ2Ý—/i¶ądÉr7Ú 4ey?ź˙wü[¶P žyÇuŕrB°$Â9°Í /@ @&€p�@�€��8H$ ÂÁAT( ÂPŔT$ ‚AA(PJ ±çěçĎ<g]ů~šéëĚ®gwĚĽ¦®qř˙vJŤNßĚ–§­ţ>÷ÇÉÁîüw6S»ŕżü˙¨˝P=Ë\Őâ?ż”ż—C>• Ž3;šşŞ/ëę0˙ę2ŕőÂŐę@]°"ąD+üŢő«©­*kŻÉLĐäúĄw~Đ©ř˝ öoj7CřÁżUĺ5[Ý%=18� ŘŔ�a��� €�L�ŔH(% …‚` H, ÂÁ@°\, p°P& ˇD&Cëô­ë[×^­ëÎë/†o޶înµ8®<˙ŢšČĐäě¸'kÉĐ˙Ź©6.Ńĺě©!F1ő˙żiŃ܇ő€;Ň÷—gˇĎ›ĺ‘ö#‡+Âw ěht4R<-4\Đrr6ěţ-˙÷!-lłj÷ĽF¤t`BKg ?S°¨3-şŁţł©n;ŔµpÜ^2$ŁMO'¬ĺ Í曤z�P¨Ŕ�P��� €�(�€HWH&BA X0 `ˇ* „Xëí§|'·…w3[|o7Ĺä©ĘďRO?ű^Jă,r9p;»wô>9čü3iâ>‹_ý°*ϡ݉˙auPăłďţ|gč=ďd őűŻů~x3 Ţcż‡Ç‹lż¤!% ŠîĄŞ$küń|oŻÔ€B2®fłTvđŁźBű¨'ôî¦ŰĄüm]�hźH—ť.ę:)|âŚŮ@D@&� €�0�" €�Ŕ@źý”&H`ąB¤a”Ôćúź÷Őô…©/Syź†Ůuý7hX˝ŢüNŰ6収qŮ•7ˇu´"üŁ ö°U°Ţ† ŰP1"Ž%F~]?ËgĹSł/ÚŤ60^Ł©†É%yĺúŮţO˝é.ű ŤKÍÝz%±†z’§`¤·Ź©qRh,âÂr]`"ívz{áČÝ%c†ZşM>n=&ŮßéˇČŇI[:=/:ŕÉŇľN=ĎÔĄ‹`bĐ*`îŔ{<őC€�߼ Ň�îX­ €{€t��)Ľ�TpHźţ‹- ©41t’ůľŻ˙+ÖßZ`ÎŞčĺĐ1ÂĆşË&KřjëîŘ=¶kĹi˘·Kě©ď6ˇHÇł°[Sř¦ü˝©,ŇľŞd–ú6…µv9IÂoˇń=ń˝÷ÓŠT–/“ÁŇQ‘Ô§b’s€Y­F'Ŕ ‚ać3îqú˝Ó{ůÇWł†ňţĐÇw ·Řq—Üľ-t<}‡Ě*M§E‹í9NW0öE ”(¦ąk��/BRÖ� � Ś2��ń����8BźţŚĘP™„’VĽ˙ľµbcű·'©§™sť‘žő»Ä„6Ań1Ş ‚8)Ľ0§Ş_§?Úň×&Ńů}C¦˝7Ő/Ů˙đ˛|hőöxUl´­Fş$«ü~ŰUšEF\‚ąék!͉˛é±E©&@™ĹbkŮíąąĂ>(©Îzť±ĺŚĆťĽś’łĐ焼rĐmţ:@®tîÓ „.T™`�X�kŕ,�‘° &���ęJźţ‹,^+Ő*óRü˙¶µ şĽáĹôÔW!jp%K< ˝ë/2yφŃ©8ĐÁ{ čÉűqnr-M(T†IţuMçŰMş¨aźżë;ďą› Ś™×Qčýnyęü˝÷@�,Ôäa|N,y~fWĺ˝ÁPPľQµ{"˙§ńĽČ��¸>Î}ŽŽÜÜÁ@� @śPňá �T5\€��}P/P��­F���� U�Nźţ ,`łRhb÷uysĚ˙ťqˇ&…8ŻM=Ćűą—R˘Tc˛ĺŇţ;µÚŐ@ ŞoĽjń›V×Tö.ßš˛Ö<ĺý/9čőU×^αă_ŽP†Ag{š´ŤUŁĽ¬®{V&—n™uqŮźŠçpIŽżÔč=sç@_dôDŇŤ©őUţďFQńÓ«ÝÔ\Eç(íŁŢî~§,×ň#Vëę˝z>Í$¤R9FŚUŠ�ń�� 65‚ �� s)@��µ€��ŕF׌ A@°P, @P, ÂÁp¨X$ Zç¶évĽĚęë×Ňx‰•u.§çë÷»µÍĂĹÖÜöĎg·ZIóĘx˘ĐľsÂĺřőľ·ć¦ÔÄ?Yµăűű}ˇ„Ę«µŰĆ®HÉ}ôĺX¶łÎÝîĺ˛űM¬řŁş±źYśO~Ň-}óš®xş/f•ÚRŇąđĹ(ŞÄŚ "*�Ŕ&� �P� &���pL(8  ¨PJ   XH& …Á@¨P"×;ă×Sž¸÷ÓÖľ·ď×µ|®†˛®îíú˙Ą®­Ŕäî=-f GŞßÎ|›G')ţ4T{yUÝ\¤]zLµËíł±˘˙†¬~˘wPĂŔx>ůřŚxYz+ â8kű€ßďŁo–|]Ć˝yÄę#Fh$׌_Á· rş€MŤěâ—ú^i•’w„UA�,¸��,�&�@��(�\�¸�pJ$ …ÂÁB(,$ ¢A0Pl$ ˇ ‹UÍxţ~kKÍďZ®z®ľn¦ôU§ďăý:‰¬ŕryř.nËfZűőďOyyxJÂ<€ű`–ŕréđ«ű•Ňcč‚mŰű_jŮŚd×Č0Ó±üÝľđ:`ú‰!šűçlfÎ)Ť‚ś¶Ë(cŇ*‡%óřócpۆÖ`W;FŐđ® *~éÓî3�¨@P�°�`�@@��€€JH&…BP . ÂP X0†‚0Ś"ĄřxŐeę¦ůםó§^3Ď†Ś´ęŻ_ßĚ•kŽĎ#žŻ»ÓŽŻ÷üsß`çŢ@č,%čoÚÓýWÜ­Îçݍ¬ŘO@�µJĎęĘÔ’W"Żl˘"Őý…–: ăfÇuů>(v9ĂŔ…<§ĂMLT˙WV.Ň)x暣Ţ-ńĘmżÓAĄÁŚŔ��@���+P €�X�ŕH$‚‚PP* Dp\$‚á@¨P. BaE ńUľ7z™ľf§ŽŞe^52’ďŚăăý=·pŕrPďs˙/ávű~űoknZýÍě˘>);˝¤ür­/ÚȰAmţzaaGX‚µýX*)řWúëźśÚ­Ż´ł•ÎSxĺ†G«Ť®Ř gůüf©˝ µŹ~÷ŞmůKýľ1b|¤B‰Ó ÷@&���©�� @�� €�ŕH$BA@TH&‚á0 Ř. …ˇp \(kďüoo8q·‰ń_>Ű×2·.ZâĄţ?Ó…“C’‡c¨·ű[7śÜŽ<ľ´Ěü8ŤąčˇžĂĚýşŐČ.‘ňPk˙çéT^ŔŐQ7u­ňh7./˛gzŻ!ýť–„Ć7˘†]ď]äUh$×đöňb {kš§ßčş1‘§ďI`¦M6¨<™ ¶�\�,�¸`�����`ŔJ$ BPT$ ‚‚ °H&Á@¨P* …-}˙kőĆW|őŢëáëĎ=w^{­:ńu^fkďţÜ&[C‘·.ç—ű»ź. oůů|.ÂŰĎý˙ ÔöĹŢ_ŻÁçłűâÍ‹€Ř€âż˝; ]ý#Ě,K§ňTqůNĘ{>ť‹Jë2 @”w˙ č~»‚S—Ńĺ^p*ۢ§)ÚŘ– ú~ź/äó€Č�¨€j�"��H�@�Ŕ�pH$ ‚!(H(„‚áQT.ˇ  L.ŚÂ)yůžĽß«ăÇ\ăÎóŰ˝sľą57¬š·_ŻóˇÉ‡—Űč®Í˙ÖÇ9˙Ió]Ł~nŔ‹péqëlš<ľ Ë·ńt&Uź/äÚ;‡Ů:Ŕ›Ewę'l JYşŰ«Ú{Ř™Ŕ9΀·Ň˛Îîţn4Î1!—Ç|đ€U>¶š¨Đ`˙¨K΀7„�� �@�@ €�@ €8JW$ Á"(P,2 …‚BˇÔ( ZëÖS|oăÖąćřoĚŻ s8¦I5'׊¶śHť=üSA÷xqÁçÓéѲŻFÎëöm™UďD:Oôé… ć+ëuüµëŢU˙śűűnř‹CY=nwőĘyfLŃŐ?Ë îl¬-čěs`W›ŘZĽ4bě;“–…ˇ7ţ�©�&�*@�€&�*��L��D�€HźýĚnP±R$ČĹMeDë_ůN4n0äV˙űôö˝âLĘ‚TőŢ*é/ôó–đ×FŇż:eĽRRDX'}῍˛á+‰!î˘}öÍÜŰ6tęÉFĄx•·o‰uvzT 5¨q›x�¬|I‹ś8A-‘ňŞź· †|x^µNź?pŢ[%v?椑 k|píĘ•‚Ń��ZŔ�`�����X�Fźţ4*Xˇ’÷wŹ3˙i­k$IŢi_~#Ŕ�[â"kS%ś0°˛ŐĄÓORĎLÇ-“¤Ě·…é- 6Č“aM|ŕ',ż…Č˝‰ůČşŞśŮşő›ë~ë^ŠÎľuADň! Î("b/-‚sťĹđĐŮ“ŁÎß[µđ~ŻťOćgÄ•:Ĺţ#Ş˛jńp š™úšŹŚX4„@6l���6F ���ŠŔ€���°PBźýŚ&0Q1R„k578ëţ÷8 Üł¬ĺPĹôö+W•Č«z ŕď#Ľ‹€ _YJz�©9í!5—k‰ţőýűhńůđ…R[ f.{â?xÉÚÓ Ô‰SĐŃůi¨ş~Y˝—Č{B°ëohĹE™O•W•¶�ÔMU’Úť3Ë®N/˘ő<oś©tw‘^6rŠ©\'Ą|a€śP›\ŕ� @ý˘���Ĺ���Xi�@�€Dźý‹–0Q©Bdk2Ż«ń:ëüëZŔőEG%Ż�,;7Űź^7Şí»[‰ňŐţ[±9Ź”}ű)› 7la™/‰Z«eSýo“|ĂűWÂřM,F”{NGíRÚď'”×-UŞýQý_¨Ż»|/Ý{LĎ­y_ą÷şč±çw|8—[RëÎŻe täPđŃ##Ü�sŕL��©p× ���5‰€���R×j$ „†ˇ ¨P, …‚q TD „‚ˇ¨H*Â(?jńĹUuÍç7ĎžUĆř©Ł/Äâ¸_íÄ“M juÁĎĹsz*]Ýąăú?Iöwţ>Ă9Ŕź‹tvfkŐ…sżŻďŮ@Çg,÷OŠ^¨Ç^Ăż¨InŐ«WŐ˙µµ! Î×îá‹ $ť˝·k`Xx?ć`<p�ýđ €P�@��� €� �T�H$E †ˇA°H* ‰aL"…ÂA0‹__˘oUŽ»xóă­ůçn¦·\ń&ĄëýüÂŕrC&üNÓšIůG‰ďšwačú@lĄ~ß.«ťěôŔ˙Γýĺ^‘â>ő[Ďv?óH«zŚc&h!“őą#1řC~źęł O˘_;§¸%G:Đ €dÂP�€(�`P����€�ŕH$D B0 \$ ‚áA8H" BAEŻťďŰş˝ýţŮMýwÓßQŐoĎnuw5ÖĺĹ^j&¬ő꣆l2ň+ëE™9=-˙€Fä߀Goż­šö#Xů&­)ć‹sŁGÓb?nŚ3<Îl •©y÷ô~y‰Ň@~Ú¸LLó.T¦—�ĽB’ů @�€ €@���L�* �€FW$ ‚!ˇ ( DBPD$ „‚ˇ! Z{űËóŢł5­řé{â›ňŢą›á:®5ţňî¸AÉÖîĺOŐ¬ő!ęŰ÷וý(ř,2Ńű9§_N‘ŹcŔđŻO—IÍ­ĆŐľ·y±<:|"č:X`ţősĄĹ˘®«ăĺôňHć7WÉâGĺH�±đĐ@%9¦ ţ`�€ �� ��\��$*�Dťţ ,`˘T5|Ţü©íŻúÝŚ?ŤŠđćĘEg0u:mąk®KŤ[žŔ»ŁiĂX[Kx$-—^óO9ĺĂ{¨b5›tĽ)I‰wŢ‹vu?ťůQ«r°e‰ôĎ‚;ąäýxŠë•wË9ÜLR箕Şu.18â>ą·Â"±b™ÔZvp.ü´n…. :Á×S\ÂT/­0�(­Â`�AuŔ��<›ţ(ˇ"dR’µx×_÷° P ô0 J`ÎGÄřÇŘ…€ ŞNctl0×–f욊čýÓdŘ5—8±ˇe‹ # @±°áąz.Ž3„{Ç(îţŔ|ntOlď!·ëćQĚĚEHë€!/áëýó!HÂTô"$Č©°ú7ÓŰ(0ˇ—)LPÔ0ž„Ń6qŕ‚Č€˘ ,�pNźţK',Tˇ81lÖ·Âţ?ĺĹ‹YwO‡ńNÇé5ü° ďiý{,źŰűˇ8Z5“í“éű5÷šţÖ˙7O{Çďw‰Ţ'@Pď˘ç%uήýqľěáÜŽ«ôţDŮFˇčk‡oí·śTů˙˘DmXú·Käôž›» qŐv_U¤vŔąpqśŁŮD�E D�� €��‹D����°pPźţ '(Ô‘ąWu]kŰý®ô$´ąűó·çáÖ#@útq·O^«ç­s¦NZ5MĽ§źß3•ĂYV–÷·ćŻ5sjy«™Ěŕ_ĄĄ@zÍţR&Ü}ɡ7îۧżÉÉvNţ˱÷wŰ,nÓ¬j=Đ|`î”ůIÓ=ŰÔŠŽ°*HÁ_{ú‹šÁśĐL‰„™r �Bˇ��­@D�� ���@�Jźý”h”‰20…—ç_ďwˇËüć(]·{ú,–üyy_VŹżÚRż§ż]qYpŰş)¬—1Ţé‘řŻ‚j Ŕř_Á8Hď':·Ulľ…¶7°š¤lo�Đ/ Ał– ŽeÄçě„/ś?kGű÷íüÚŮ.!Ή›č5ÁÁ!‹*ŞĺŠ0‘<C Ş��1j€��Ô���D�€��DpN×(6‡AT& ‚ˇ@L"×…qÝydeTřő«ž%Ö\ĘšššśµÜ]đ;^Ëoݲo˘~{_j“ĺˇ"Ó—EŻ:ýŁżT.x%íÇţł;ĺö‚}¶·]†—ÇQÄň.Ăż˙ß.Tš´53ˇ¸Q9­|%ŐŃéä@'‘šľě¨9ÖďŃůu”ŞÜ¤”°–ÂÓ˙ ×�p0� €D�€�� �€JH ÂÁ@PL…APL, ‚b@°P$!iáÍďŰxĽ¦µą©ÝV·Ősš—­5Żôęĺy­G.R÷>4~gPě_/őč°4ôˇz_ĎëƧé)ĽRŹ‹ĄZWůÖń ›ť‚!SĎx骶ą77úaÉŻŇţoIÄ ˇtč˘ŘďÖŕ(s§vŢĘüI]%‘}9žlX‘@Łślg, €��‘��\��€��T��pN* ‚„  HL% ‚ˇ T( B  ( „XżYšk:÷ăš{eq•US8ÍŻW¦´˙OŠŹlčJíńâçĎő˙GÉń|<ş<?\ö+ůđ ă—Z͆§ió=őďé8Pđŕńíyłě©v®^Sf˛‡ĎZ—ÚŕŇkřfŃďý[>–2« �/é“.­e!M…HÉö;˘äZáN @ �X(Ŕ��±p��$��.ŔŔPJ ‚‚ ¨PBBPP, ‰ÁQ ťzžś^k»ÍńśsŐk¶ä_9®—§ů㊯ŞĐ…ÇV~]üÚ»lîNeyV‡’…Ąő»¶!–îµx:á>e» 7Ą=ůŞęę@Ctgż_iQQńéUŽ�Ćłâ}€3<ŽÄ’Ş*-{CÂ;úýSRŔś˘zŤkć©]°TŢĄB1 ŠQ ‹@�X�B€�p�.�� ��ŕFH BBPT,4 „‚aP ”$ …ĂP‹—óą»uśŢg{ÔľčKšÔ˙N®ď­ô9xoż§řă©űÜßŰÝŽ†6ř5ĺĐČą«x[Ź<.é¨/‰˙o/ßزţÇÁôBŔîďŁQX.Ęźł>wĆOT€¤Omͤ>kJ¦@¨őđvéőâ–w*Ń]&;Ŕ€ÝA%†ĐZ€��$�� @��Ë€ŔH$ a@Pn…Ba! X( BÂ@EÇo›^›qâ8çË*˛Ő}ĹÝęj˙źˇěĐä§ÂâeííŻä?˘ć™yÜ:iɶ<(ďŕÍ|yCŘĘ•ß=­Ú×ÜÝ÷Pźf¶nŻî€ŃŹ]By•ń‘O9驡ء÷¬çĚ™+ň^*ŐźĽľ"ćĹ9±˝÷!{>¶yî/fŔ€��@.��( ��Ŕ*� �ŕJWj*…ˇ@°P, †„P T,3 ZŞçž9Őł[ćMSĎuU x·Y©|_ďírq] duĂ’öŠćľ«·ů*)˙3EďÇçá1Ńi´ß‰Ó×é ‘ůŔő‹ŘÇô»ś:C-˝?Nw6o×eäoFB‰y.´Ď]B§TiR€gMNě㋚ťţđü´ç̬?‚{Řěä:˘”€ � p�Ŕđ� €P�X�Jźý›–pTš›U㎵˙:×ŰÇ´Ŕ' ńá>R5ŐĆ ÄĎ"đ©*ŇďşďBňßďR52ćÔŕnóty˛ď(-fÍe>zií§Ú«cYŕÔÔ •2@¶\č0‹Ľ&<.}’‚ţű(â‰Ă‰�řŢwzúĘ0\¬‹Ô:ł.ćfŃ ű ěÂĚHSŤű¨±C·‰H=ҧşiŔ"L$ “0�0��¸�H��XŔT×,#„0ˇ.…ˇ@T(Eµâ’ž\Ę㙓zâvş™y—§ÎŻ˙*—k±äż/şţÓřßţöQÄz¶öř ]©~kŇ%ú!oNĆ~Ö~š!ÇÔíýó7Áăöh…ţMą/č÷ĹŢ?>I"?©{ź±ÇŃţŁ˙ŔJ ?!ÓM~tł†„iŤréa")IAK‚:ŕĺŽ`0Đ�•Ŕ@� @�XŔ�H�� ŔR(‚‚  ČH" „†áP ”( BA<UsçsZńçzîuë®7ş[/“‰Ć—ůyUu˝ {wâ~ďů˝e°m}ýż’˝żź%1ńčţ{Žba÷Äšš3üV‹ńŐ4Cş­> DÍźă<rÁ˛ąńňFţ?ŻűzĂ­üGËńćÎAÄ–2?nź$Ŕđ(^áÁb$›*jÜ@Ŕ`�H�L �@\�J(% ‚  Č.…˘A0HH' \çŐÔçďăÎĚç§~ŢsŢşísµÝßSţ˝5—śNë™<˙oł|źaŮÜňľ®n˘Ő@ýL –ęž×GjŘLąůw]µS¤{LáčđőŐ;Ěâ"?d±ź÷´ÂtëŹwĽ\äű™ÔŃJ űßMFu˙-Šň¬Stô*]»@@�@�&�p0���T(�8J(F „P& „‚a@¸X(2 ‚P…®ňłëçŚřđëÓŚç®·ŰĎy/śâäŐń?ď«VłČäđ·n)˘S_ń·Î;AŁGwd[đĚťď[‚ĚOŘ·Ň;VšĹ >.Ëw7™¤pç9)�ś8$Ěg—ľË{Aú¸lŢ_ţÇ +}+ ×¸¸Éńvů~‘9üH—!Mŕ%M� �ŔŔ�L�"�ŕ��XP�8J(‚  H(Âa ¸T$$ ‰ˇ0¨X(„‚%0‰Ţ2oŽt©wĚ×;ă®vÓ-ŢuŞq:źűćĄ]p9;Qá˙ŤĹ4ŹďËýsé.üűĄóÓémëYÁĐýj]j!ăÜ"ň‹÷óŐRćlĽęĘenA|»ľv}§ű?Qٸ·ˇäsFŠÁyKŤT‹3ŇWÁI@ö°iZ‘6�V w@Ŕ`�¸���� &�€NW(% „P H( CPH, …ba(H"±ŻUž}yVK™Sľ¸žî1Şî¸şÔžĎßÚäë} %ÚĽůwaˇűóö=-ťľ¶ô –†Ľé°j?ROJĺ6ăqĄ2żÚ‡ĚXďź«yC#%}ľÜš/îó –ßd‚¶&÷’Jo˘=^|rŁĽň©–ĎeÖ„AÚu/J%Äq„A)`��L�`�€��L�"�ŕDźý˛,TŤ*ĄqßçýµĆ…ük…3•qçč:l âÇş«“šR¶Ąp#ý]úŁô^Ę>Mě^t[E©m¨·ah»aU%Wë;¦¸]ĹTk‹*¶ÄY%…·!!´÷*…Ąb75JřŔčRśµ;—^uäFvť0-QÚCHฅć LBPmď6ăkJii'hj“ĽpEä×â~ d@ Ŕ�Z \Ŕ�l�"@��€Lźţ DNP‘şEóŐűĄëB�` H6îüpŇ’ ÂŃY=›Ľ*´kWŰ–ĐĽyşżbßč9ËBĎއŘD¤ŞQ)SH’—âý[7“ÄúŻöń\`ąńŕNŻ)ýĎcŢuŻ>Ĺ÷&|žu{Ś««d˘i˝Ş„;™;¸U1ŚÚ„DbiŽ‘ T‰Á ‰‘Bŕ�6#3U@��lHB���l���€ Hźţ 4,PąBdkYZ®=qŻ?çŽ,˝¦ śĘlÔť-psľ…ş×·]ěu”†÷µ2ÓT´_M5mâ<WCqZ`ń7ć»řS�O—•sk'ˇč"ѡ,ŃżRšg÷ăzţ4×O4_g™ŘěÎ/´[ÂŮQîbîIçÚ,+‘ǸĐh9ŰϢůýŞëęWUłNh‰Ľü¦Ţzâˇ2ĹŘ"�(l`�\o���¸€��ˇŔHźţ (,ť!RdcYVf¸ăýć´·Ë@JP"—oů6Y$´ÖnlcžY5RÄđaÝ厫ęŽ+ę)WĎ}Ůí€Ŕ´JĚG2–Š”l ek^˘kĄ.o——Zîś»îvá‡Ţmgęé«Ű1yUĆsyv]dg´2\Đ<„¤zlH3©-i˛!0•U š0®śÔąŔc09'Ŕ°H”\ &�r ��÷(����8Pźţ g*M ]bň_ť׋ŕ%-%‡.CI”ƆĆÖ3ÔM|ÝaXť·¦ć¸-MÁ˝ůqʦ˙¦î6ń·ŤĽKŤąÎgŃ•C•Tp¦E©‘Ú9¶ÓďÓjŮŔ5LR˘Ń6ÎŁ/m»n¬îŐë§uë·qzĺqń8űWŞđôfsę# Ç$ČéŇ&´â§Üb˘+bxŘč÷jÓŁ0,X�& €-)‚B��5€ €���L�ŕR×H6 ‚P HH BQ H& BaP…ŹY÷űg ă+U&÷ćó+۵d{n]µőţ%ËĽŕMń«ľ“ňż ˙s©v_B|)ßř’t`ľćÍ»ÔÚiu.ăżň€¬ý]żjCťGáü8OJŠřÔqĐ­5—čN·Ýw}ź*Ü®˛Q~Ą•{M}7Ô•-{‚pĄj!çP`P´ €$���. €�I@0�8Pj  ¨P*"‚ˇ!0L$ …ÁQE®[çăÇ b]O_}×:6řĹń\{ťKËXěx‡ĄÔ˙•±żU«t8ďźů}óüWv›w‹çËç㊕wµ0ŇŞ/őžđÍÇÂbŃ©9nŰěŰ:çžN#ůˇžÍOMŃ$[»ÂB즂kpĎĘń"ëRĄĽ*T D€$�*��€&� �ŕ�"�pJ(% CP H( ÂA TH ÂÁA(D&c=L§UuUÄ­óćó›ú÷Şóă~˶ŻĎýSY­đ:ZŰ˝ÜiđoývçĹÇec—Ž”µ÷U¸giÝđ™ŐćY®¸řtr!—ź·ń^ߏd.›R·{<Őmń ‹‚ý˙ÄÖ!żť˙NJ]$:îdD©˘p#?&ś)$&‘QŻUŔ+H€°@ `€$��€p°�8DD‚ˇB(P$ ˇpH* ‚á0‹™ó×Ď[âqďz•ś{ýW·ń}lżĆ´»Ő˙˝ÜqZś_“ĺF˝”ţCŤRçär ‚GÇ>]ĹVB÷tµs/-gÇ—Ţɱźył+ź´űm”¬µŕţg‡ŕ«â{Ŕ—šűβ ó°śZ4Âß« 4Vˇ08� € � `���€�€H(% ÂA@¨H(" ‚ ¸P$ DaP H( „„a5űk»š“żnxć§Ź­ß‹ó\ŞłŤN'űÉÄÖyťż‚ňţ7ćľťWK}©eŹ.ŢłüîöËČűz žÂéĎ- '(qńTňF‡Ú'Ć»w…ű›gV—ěĽßË9é6‘Y–łöx÷Č5G\U>´¬á%ţŹęj”‚šî†0zŔK‚3� ��X�D��X��. �J$  ˘ ¨Pj ‚QHH „‚bP‹Sß]ŢőÄď\őÝq㧸ʪ˝őu%ůóűÝÉŞčv pÇ»ëšËGlťł©çé ă×z;,>ŔiϡÜö±ŁbÍ.<6·ůJçCÚŮŤĺĂçxo˝ńç‘M{űĚ­ îsˇ9%ňIJu_űŤ@Âůě»KűÍ·>1€L�� ��Č�� €��X €J(r ‰‚a \( …DB@D$!„Da/ŐdOn>Ůťn˝ľ|ÜńÄÜ®1i5®˝ľ.í©c“ĘîřźËt6ĹĆs{ÜoŇßü˙sŔÉף�Uwo_ÚtÔ#ž^űZţHżS?G˘[}űĹlř­Áć­ÂŘMa4/“¤;µŘr°ń·$¤Ćî–Ľ�$`�B@� ‚ ����Ŕ€H$ …B@°P&„‚á!¨Ś"…B#0‹^ßłz˝g_m$Ęçń­űë¦î˛Ľ˛Úü}üîô’Ç'7ęý/Bŕ}zy[kŕ…_Ęü‘ť6ň_ë]ŹÜ@›Š•ßŐě‚ü^ ź6“·Ă„SË„v.(úqÝ ¦2(¸ţf"š 3QfŔÄŠÜP��@&��°�€�L���D�ŕFWL …ˇA $# ‚!1L$_:ńkŐüőN·>xź<q9Ó+ŞIŻ?ľ´şąˇČę.]óă»fÍčq ŘzŔ‡0ÝŹŹŕłŰĂľ˙ĺ°—wŤ<„źăůĺ…<ť|4EéÝŞw‹¨<őWA–5¦)¸±Ňĺ(şRsX�$�.��$� �` � �8@ťýŚ.P©D¤I‘jUëŚu?ďv9 \Űö壶ĘęěžëW…(QA4• Ŕ§Jfo}t¶Ľşĺ÷Súö·ýËöť®]íyťë!űGÜ7ĆÉhOňjn~HŹŁŤö®P^DíĎíGąbΤ ®&é«‹ĹoĺÓ‡ŻĹäZZâ ľÓŽżšĺף ăž!DL‰H˘�� @`€8Jźţ‹E(”™ÖK»©ŻoöšĐ™)m6ďNH±)u’îĎR“kVżW5Âlďą­×~»ů·éyűn”¤©Ą¤oQěY\Pb ††÷ŰĺQSUm©tÝŻĂÔňDČÉŞjÓ˝ŹÖ¦hśŇ§K)H„¸đĆ?ŢF€čÜD �Ô7€� P���€…@���€�J×$ ˇ!(H ‚ˇ  L* B&0‹Ď·ç‡ăy©—]űw޶úÉrŞI>?Ďj´93n­óýqŐ˝ ĹńĹďú{ӻݜ(­É˘ľj™2¨8řöXŃMyú×8ň~±{byđĆ hźzčşęéś;8_´ ym6ĽâřHŐÇ4�"¸&�(ŔŔ��€���F`� �H(5 †ĂA(H. …‚PP" „BAE®ľÓrë‹çľ‰~˝·»^{wlÔŞŐűŽRÖ9;~ ‹˝ťkůë¨yËoWĆtŹŰŐËÄƤ;®u6ž}Pqµá‡VÇ*•ëĺiq¶Ç|ÎeEXÉo÷x—‘†ř•‹.†'ĎdŁ[Ş˛čmžËtâ��.Ŕ.���\��@�¸°�H$ ‚P H* ‚`X$ ‚‚P”$!„Xóös­s÷ߍŻ5}ý_ćő{ă"µ»§^_ưŤK3ă¸ôµ<Ž:ňČ“ąAźÁëůgęBç/€óúE?kü¨ť—V(Zřč.Ô:9Wq ÚrĺÍô‹Âń¨CƸďŕ)żv }łBz> †6®nř\ <€�¨¸� .€`��Ŕ��T�pH(3 ‚!(X¨ ‚ÁPPD `üN=ú”üsë™3®~ĽkĹë™uĆôĹńçďüĘC“ĘäśŰőĽ×Żłá{Ďj)UËcy‰9ßčúäQŹ˘}Üýză X$ŃôđÓnžź=Ű38jOƲ»˛űj¨»ť¸:‹ý9óŹŮ} áN)|TŐÖĂżšw¶•Ďí@?P"€ ��  �D�@���¨ŔJ$ APP,$á@¨P*ˇ!H"öľu—5YÇŽxĚă}qž¸śÜă*E_]}˙xşH9 î¶~|NÇĎ­ßÔéqWßĘź‚ëoŃ2ń¤éńÖŻ}‡žJśÓk.ĺă¶›–hפśÜgâAęXîa ŹŢ­!&‹˛}¶€Őuë>ZSµuŢEď^ŮĘÎňŤ[ňHJ � € �����.� �D�8LWF ˇ! ( B†!(H""˝3*˝¸ßuCŚëmnD]năZăŰý$•rÄ>śů†~Ź-˙»ô4˝óÚ9Çću•YxŞ~kĐĐĽ˝ŹZ÷|ë{ám9ŐĺyśM±±óPł ŤŐZřß…ĺnž&˝”-Lű)ŠĚCL4B e‹T. 6€ŕ��P�€�¨��°�� €�ŕJťţ$*P‘4-ĺSŹ?í,Ą'E$qˇ…3"ş°÷¬Z÷×r"„ťĂÝhř.đÜ·ÓPöVܬ™(9Ďpö†„°p€‘/źxµRäř/˘»5É)č9·ČSuţŞąLďn?Ë˙Ó�ń\S›¤�siG˙Jô{†&ŮD !J� p�� ��Bťţ$jM îekĎýu`Ż÷sTj %Šśk8k†– ˘"Dißł·h> 'ł–ŚÔäIšŠ8v#Řąa-ótŞn˘€$hˇ3;ľşM„ň5*Q‹[5xgCţ=Ż‚đa˛šíľßŔjćP˛“iŤąć«ş;;}“S.¬Ż¶[ßĹn.Úđ‡śs6ÍíŠŔ�=‹‰L�"s��Á08Jźţ )0TąR„ÔČĽąÇźňöĐYрĹŕnÖ˛5— ŠMV·Ý‚š5ý*Ć$ŹT~éóĎ:ý“†ya†ŤLc^ˇÉř[8ŔŁ®ŢqcążˇĎ¶ ÎiĐů˙9ůEz~ßŐvÁU’MŐş ÄĆ?_Ç]˙LuZ śÍLrxÜô8]‹$Ó †Ýąć¸<ç€Â\őAÚ �©„(��� ¸ ��T@¨���t� 8Pźýś(X©BhbUN9âq×Mp?RkúKęËú}ŃDť“ű|÷ď ŃMqľZC /§ş5ŽrŮ—=ZÚý5˛xˇ˝«[dˇ˙ËMRđ’©C:%ŁżĐB‚b/ŰŧNâĐťŞŃCźO(Â\ú{Vĺ3RŻ©7Ç”_Yż§WřÜ^4cˇuĚ5m=%í4~ŁŚ/%aOž;hµ„X¸uţ������Ŕ���€���ŔT×(F B‚0ˇ`(" A0¸P$ Â-f+ëóí·>vĄóŐćÝ^éu%Í]ý˙T•ć´;|~Ńľ•ŔţňNöµçŻűťy…C ˝4˙7Ă W5‹…ňrrcŰó€ßŘtÝ; ˙řŰ`wXe=5-KÓ|´ý K[MGüwó’{Ć×Ŕâ bď�ťM¦č¬ �Č�°�(�@�T�€��0 �8F( ‰‚aA(J q H* B ¨L"ǬËď‹*ddËáÝÖ•%q¬öëţ˛Ů,99Ůl}>—i‡ÓŢÝŻ-1—óřógĘőţËóJ*K˘~§îč|Ú5źŇMnɇ˝Çźf»ŃYڶX=<hÝz•YË›Óiá˝íďŤkNŁ©dnüM)…_ „YłI PN@ �@*¨�5€�"�� €× H( ÁAX(&‡Q H* Zçľ»UÜď„ďŽílNł/*ĺq/ŹoúĘĽ¶‡'|Og˙î“ňĘr%żŢű2vYWą)Ů őšÇˇCô˙|čŰ6ćŹřż’5ÇB>[ţx´îČ®ß*»W=ŁěLű›V5h|ýŃţŹ_µýĆ1‡:†‡ň.ö‡ÍďîLďüWť/…Ą ¦Ş€J`*�P�T����D�° €€FWh ‚P `( †Pˇ&„Â*g‰‰ZăçŞ×dÍUVµ¸«W8×ÇúM·iÔőü8}¤őĹÂřŃČG^ś9_Ď_xý–Źňn§ŐÝçę˙­­ „˝µ­””6âý~ĽJG|VzJé˙Ý&ř­©vy”‚‚¶ú8ÁľsUřÁ(•ł“O ßRŮĄąő;®Ů&ëA;ĎŇDĢ &�\��D�X���@.�X�Fźý•NY‘UŐjŻŹ?í©Đð÷Ű4žŁ•>ÝkĐ[şËÍo }ŢĘqŰmĐ0Dlą`°› čČÚ™Ú9Íd—Ő΋:ŽzRóŮ˙0żjsXAĆjĽŻQçľ z§čÇžuśÉ)˘äžŔôŚŤ ŠGčĎŃ#¦ŕÖ»S˝ú”Ř€Ę#D' „ihÁhf–Łd7ůy˙đć X|j6Š5e $~ä6�‚ X��^V�������¨pJźţ‹M‘21*’Ąń×űń|qzŽ�2Ŕ9˝bąŕßçcťőćüWtUoâá.đYSčq¤”¨ÔuFĐł®&„šÜ4D”lŠOGTßéńĂTq óżeeSYxZ –Ď߇¤˛K đČmŞX´is/}QW%wآWIÎO¶7ąg.XŁĐuř…MüĎP]áÁŕ¦ĺĄ®vŚ©á ť©ň8µ@ĹĽ*.�€CV ���jB����† �pJźţ D,QÖTĽ»óÇű^¸oZή[ö31­ÁngňôĂęŽĎ,§ŕÖţ§˛˝°ŃŹ |±đĄ{ý5ę»Mz­úď“v›gŐ˘K*±†ytiă+ą–űřżtđ<$ŕé5Ş«bf–_¸hĎ’ó>Óľr Ńů¨í‚ˇź,îů~ >›+ŤÄ ®x@b”3śT9ÔH$d“ŘwŁÉpĆqŕL�®R���k������ŔJ×( …†‚  (F `¨H* DA0‹—ó¬Ű­ůínţ¸_9Őĺâîuí÷ę­rÇ'N?ăźÍć=±Çôßfµń6tňnžĎšţ užüÚý˘oIüG´,]�™KôîJęWaŐEçôŕeđôa×ÍĚ»§bľS—ˇS›˘K듏ÖN q[=xVÉůQ<q Ú‘±!Ř� ��X��€`�H��&�ŕHWL aA0L BÁ@H0 ‚Ł@¨Fc9Ó8íYí<kO UÔ«É©Öúżów/'©ä{ďý*~WúţaĆă—Křý‹Z:ŻËî?ó}/—H5ýŹHQú˘_`ę7Ć8&˛ý€ťĐ ‰-ź_?f” ßęŐǢĐü t˙vű.©X Wo§Ç˘‡ ĎóŻĎŃ Xëţ­‰ć~Ű€¦”Áů���$��R�Ŕ��ŔDťţ‹-P™V¶µńÇýî ¦ĚÉ'ÖHX™Ă»°Ż”éţ÷h÷M®˝ëj,ý1X:µ*˛©%ˇ: ś»đ˝®�Ťś¶Q˘Ź\ŢY´ú7ÎťűÝVU{ÂłÚŃÍ% ď©gJeşS+»l˘Úˇ…¨5J¦<âckk–•ŚŃÓŞFWJ1Ĺí=7ޏŰţ[K†şë Ńw‹Ú|jąrë`�Díč���ýĘ���iŔJ×$ „ °PD ˇAXh …ˇ@T$cs_<3띤ńŻoQ{®ł5ľłw­I~޸f–6żs™ŰŮ/Ü˙—Gú&Ýjsá˙˝Ëŕ2ź‘…*~šwú·=˛ľÝ»­ČľÍ´ŕJ)?űĽ/!Rśió)ľ[ů˙íIĐr–źcŹ‚7P< [Riô§ŞĺäăňśćĹ%I%o\W˘©]&Á-…Él�–@@� ���$`��pJ(3 BÁ@°Ô( ÂÁA0T, Â-qďçžu^gŰëśçÎguš©­ŢF¤Őű§’KťŻµ~cę{FËŐvoţ_ ŽŢŰXöÝéÇřmsíĹš÷ě vÉďP oWľŤ3ŁîŇú.?H Kß`»íŞ;Ž©Łż/±'Ş0yýć>ßůIAÇ©ŕ·Ĺ»ô~î)`Z<¸®MDép´”i� €�, ‚`� ��� ‚Ŕ€LL„ˇ@°( …áP T, Á ¸TH ZóögGëů÷ß3ŽzÎ;ßďY3Ž$|žt99õîÓGߋݞNzZŰ>lĄ˘cżRßľW„pöQĹqđ†wđ(•M_˝÷÷xZ ş IŐ:g˙ęř:ź÷Ó ÎZL=_–. ępĆgÝ׎• }š8Ä 6:BŃĹq qsa " +€� @� ���(�J( ‚…a X0‚Á@¨X. ‚ÁP („Â*{~xďS8ß>ŰŢő׎łĎŽ;Ľân¦qsŠö˙›^&‡'uü,Çżâ|˙U}'B'=Tť}§23Ź" i˘ńą‰ç°_ń…=b–lĺű›wi›»ô«)łó(F˙Ýgţy7}ţ0Ă%Ná#żĺáű®´3<­EĆÎp"ŔntŢĚvî€rAM+÷ŞÁłő±­#‹Bŕ � € �€�€� ��¨€�ŕJ( „A@°L$ …BP \, …áa X$kŰöľ»ËóŢţ9śÉš+5’׺k‹OżřâĄG“X˙ô˙tý ÷ě›W7M‰%O×ý›‡ëáĹ3{$cíŰźSQ*řľÍ”jrj…=HK×GȧŹÖÇYÄBÓÓýŤed�; ˢŽZĄ–kN‡9Ĺ ßS€“12źŮ– ü7 Á´ą­ů ú¬&6€b���H�€� ���D��pJ( ˇ@°* ÁA°L B‚`E«ď^—™y|Ă[^J—*’jĺţ?ĹŞ]p9<ľ×ë›ú>˝dňĐ îúŻ(äť űVÎaŠniń-\ý=[éë>‰ş ţA2 7xëÍNýGŤâá–â]YS›Ůi ™îËNřľ:`ż™†”ďÎ=o¸ !ü!«Q�2w`w)˙UiѤćŃ?5Jă+@€����(��â �ŔJ( ` Ř$& ‚„`¨P,1Zöý<üůçVń«xŇŻTć.ď´MiŻo÷‹J±Éä˙‰ű™ÎÎ+äš›–îź˘Ż¸Î_Š>Ví»QĎčüw¨.ę ®€í›ęŞRćS=˛}zë‰ă|M�÷H¦±ÍĐźšŐ5ĺtů#ţW=„*Ď_5 Ń“ż ›Ţ;©®Ő]]EąĄŐ’Äe»ru—"CÜ%`@�p €��� @�`FW( ‚†`  , …Á@±Pl „Â-qůăÇ·|ULáÚĘŇű5Ç««»šťťd–črkńnvůŹÜ·Ý±w}ĎŞ ŮšŘp^eĐüiĺťńţ­F}yŇ?ˇ„,[ëÔUÔ›˝iŚÄý˙t ¦őűă×^ýç®îGţşî&ávʞŕ#űzżP@šçő4Sź'÷ŠO}—b*^R7ŁY¨W)\`‰h„ €…p�P� ��0€Dźţ(,Đ©E:޸ëü޸�4…Č×@‹źa‘i ˇ‡o.ţúűaÇägXťńđů]ěĐý*í}ô<¸ę.•Éĺ=ŐX}+öjÔşí…5ď—gë—ÖűÔ>ą5 ”ŔҡM¬FÇUę«X\‚Md— šÉt^öZu]7ľqšž_âi[»îŔ>؉y.e‚§™›[3>î E[»Ě��B 9d���őµ€��ąL¨���rLźţ (- k*µ—«ř˙{ľ�·Ł#ŕCąĄTĚÔ¸…ľĽü zëw{b‘×î—ź6’:íÍ8®Ý <PÖŢw=ĺ÷—Z9j˙ÝSČzĄŐ.žV˝{’ąâ‹ć˛ëĎj÷q˙fNş§a(Đ–Ř>ÔťűŞŞMHŐfb•)P2˙.á{ľ{¸á¤ÎH…âÓ™}Ň\‚ š(\Î,0e˛Ç¬@!Aa†H�F D…H�X�P�BŔ ���pP×( …„ ˇ( BQ .„‚ˇ ‹Uλ¸µî뛿/q&ĺÖŞí®ľľú‰ĄŚĽu¶<uôżóű®Ë·‘ýŞ{üs˝6vj ů®˘6I®t­Çóľßv%f~®Źµ×ażk­ÄL‚âńô™2©,âŔgi¨€Í×÷Î%ßŰgÉ×AÍ‹•ŇNÄČĆ:dĄ ‘×0Â]qć �Ö��`&��H�� € X�pJ(&‚` ś& ‚`¸T, „¡0‹]沟~rTťń\ýW9¬‘‰ĹjŻZü~ó8Íg“ň^fĽ}­ňMQéqóçŘoßS·ßBÇß§ű;ßöź_?n•ú…_źż™±řZúËA^$ęÖďĺ†&§+Pßvtpť<šŚ‡˙S–s0Éď©> ĽKŰA;č×vßzß"ńąţ« �Č" 0â@��� ��€ �8B,T B`¨Pj …B€¸P,' ˇ ¨D& „T÷˝Tˬ雵Eĺë#WÇďř&‡‰4r¬}—{é×üŽ·ř4Imü¸STÚ8é?’őů[˘‹»÷˘o…ÄáÂąĂ+ű©~*`šSďy˙ÉŘŚ€>L­źI“aÂ7Ĺ<F7Ű5J7ťŠ'ÎC[p‹U°< $nfşť>K=¨"X+5D€�,@ŕ���€�� �ŕPl ÂA0PL Ca ”$ „‚ˇ0L"´U.şszĘă•Íó8Ínj¤Uß_Żâŕh˙ ËAZź&3qŐ\óJż­t{ (ŻRňu˝ó۬đąôÁgˇc+˘=ž™„ö˛ü“âÝ]é[?ëĺ¨Ôźľ™D6ţ;i56głw×±i]ĽôÓŢ:Ů}7{ŐOŇ:9‰inÁ�`LDő� €�¸,� ��"� @� �D**‚`¸PL$ …A@°L" AžţÝĚă\Ý]ř“~Űr˝ssz‹_íţj ˇŔűŤíNoůř&Şľŕ|¶–ý{PĎăVlőpűéł5âšú;s]ÇâuŁ{;®"!­ţZ>l;ô+†–c6”ÔéŢ„ęĎüĎ3”ˇ×őB$!:ßňd;–٦ çĄ¨–Ľ‘Žšő_/¶b´š{µ~ŕ­@��@����€����Jh …ˇ` (( Ap°& …B._2©ç)ľ:ýµ®zÍs3S/|,Ö¸öýîR49=î(ÜţMĐ:FyţĎÎ(ś˙sřîôqptφ­%ťl3öća _»ŐmĚ,Ź´Ăő‘ďCűM»…kuî˛ç𰭞ȲoÝăbˇxLť®„•ú^Ů; h#57´@’`@@ €�"`������D(‚‚Q0`* !AT(& …Cłľ1Wń\îŰ»ď©<]VЏ’őçń嬖ĹÉ9đ."ń~®ůw$t9'ëBµ5.ż/Ć‚Űúś˙˘ů®iő9ó©ř±p=W˙pY˙©UđĽiź{ľ|)ś»µéS®é{mu®hD7NţşdňŞaQĹ6©č+l=–j\ČŐµaŞIŔŘ�Š��Ń�P\�� � €Ŕ�pF("BÁBČHn Â0¨P$ ÂA:üőµµ®ëÎůâzöŹoߦ¶˛¸ź_5 ,x´ćąăE=~BÔ›çCěźĂĂŮĘý1˛ďGm˝*żŇŤńDÇëŻĐÁ_Łó±YuëmÎřÜöśżGn§[íV,¶ăDÄü·ś>đˇA‰üü#ŮJ ¦!©jÉ-ňÚ$TMh�‚ŕ€�P����` � �FWL ÂBd(…BQ‘ "ă˝3ŚöĘËŞë~Ľę»»ßL+W>>>޸Cü˙ľĎ˘/ŁÄřŽ©đ=çřyÂ^a&±=Ě.úÜřr}K?—źčv]µĆő3!żŹăřsŃŰůËýâAżlä…« ™Ô¤J&|ŢÖý*TşjuîŮ·ŐuÜѢ·Şs.F·Ô� ‹&€�°& Ü�� �&�€8›ţ (,\«2¤Ró-ćśuţđdĹÔ"ť}ćŇb‰7.ľ*®3~¸^‹Ťţ»zéôSčOCűçôUóxů˙??~"ü]ř›¤.ú¦ŁŽÍš:›d»<tUˇ÷Ą ç‘> Ş<ѧD»"j·ě’đěŚ#+„_EnŻ-z4îěľ]nŠ™¸Ą¦,ÍGŃľČögfxh`»˘|JtŔ@�� w˘� ˘Í›�&� ůHŕDźţ“,©BhbEÔąí5 )óouĂ<”\„KŽ*&葪;ÜŚ.[~ŕŔq:$Qď?´ÝÁŐMÇyN˝­đGz4XĹßú7ߤč=ŃGË:— Fá”ö¶ Ĺ,�őú˙ÉşxsRę¶źçëŽÍ{ąăLY ŃS–˝µłĺżúQ†Kí+Góřů'Ő4 í»ŤnsM87 ôF3ź �&^€s¸� €�X€¸\ ��'1ŔB×(‚P X( Â@°`$ Á@”(jzż^^yČĄĺówă^k˝^úÂĄßéőଗˇíqňŐ?«”–ÄĐ;žŃŘý>‰ť˙ŇÜŘşľŤ'%¬UúvPpđşśsd©đ9Ę÷Q<>FuŐíy°|ćl]ËR™n UA&éńBúü-IęלZUs›GżzNĆ‹pŢl–¬kIł±ś¤w‹€ˇ �"@¸��X�X�LŔB$ …†‚P±P¬ ‚0 H Ba8ŢűâŻ\}«ŚÍ[zÝq<kYr©5<ýŠ©2hxżWř·|ľń¦?ş<ßE8lś;‰ě§Ť®¬ţĂň¦8Ě?dŃŕđň ÚµňýĹ^Ž·Šn®ÎÍź^hkuÔ˙ş�ĎRă.ŚžoPSó˝ôfý<iMg. >~#ü®˝u•f{ż µ=˝ńÖAđş ”@h�ŔL�°�`� €�*€�B( Âb T( Á@¨( ‚ ¨P*©X®;ľąÝď¬ÖUäÝëonĺĺ±ÖżÍ%]p<\ Ĺüď·•Úďý&›cço źÚ^§řEŁüÉ­=ĘôŢ{˝ˇ öţ°Őß™‰<~“¬ě:T‡?§é/“˘q«-Éx€5»źęÓ/§·ĐŔŢúŁp«Mv\9}˝|"Ą ŮĽťţT'˛’őqĹBÎł˙Ůć…óëŞ ç�8€\`�� €P b@��@W(&„‚a@$ ÂA0PĘ­~ćUÖ^őuYĆ*´Ë¸ŞÖNµíţY¸×âgßş?‚:öˇŐQľžv¦„‘SďŔf;a#ůő“aßĐŚ÷žÎć 6üíŰgDĐ}‡ăéŽnöÝŘő߉<Ařׂj·bëŕĘa<ýŔ§Ě‡šÓŮѨZ¬š‚F˘ĺÝ4ŽˉŢ|*ż>{Ó¨¬á:…ś€. Ŕ@��@�(��� �86ťýŚFJ™ÚUČ×·üŘgŢUăźŕô­UţőĐCÍS'p?0„5Z4©á,’4 Ś Żk­Í«ôt­TkŢtVíYď.Š3Ź<Ý�ů|UJčś«|›řSÉöŃěiLÔ;€HĹ )SŰN®"ZŚ˝}2ţÚďqîgS›jĄł^‰™ç7_cok§ç7‡^kŰČ’Yľ’ POđ¸šX•�jTlŠ`]pP$E°�ˇ1ŔJ×$$ †` T( …„a (2 „,pőă­ń­˛&î^őŢ·í‘S&µőţ”ą¬ŕvłçćÝźŢbóůo?ä˙E�úŤÓ‡=ËĚ|ť˙(ýwofa8{KHućűÍ´ôÎŤGăםá±w»ľű^M~ě˙í¸s€ő۫ߢ:K¶l&őÓ_7ń‡±/<Š$?Ů# ¤ě<łĘ(ëą Ę:3,¸•�+P��.��€ �@p�D�HF"‚áA°P,$ BB…nľßŹé«ź]÷{™2ćőU.éMfŽŻďúŮ58Ź=üö?Ż6¬uűßÉęô;ř?ä6-ËXĹ|h˙E×Í}­ůż<Ú>UűřÉń`ľŻegŐq9{ Đ˙Lśw7żÍʉt?^őŃyżăô»vj·)a«Éż<…2UTâŇzO(WÎÍĚ:š dęQ9­E„o@@  ‚Ŕ� @�� €�Z��ŕFW$ ˘  Š‚a˘L"Ăńóů×¶î»›©µĺIĆ^VŞç[óçü\ş·©ęîůîóÉőď{›ăCń6Čř|ł ?-Ť—§É®×.ĚćúÝ?č˙+[¦ĎÍ~Śô=Ô ŕykÎCŐŰ#óŻžĘŠňňZŘÝ«ňĽť? ŐkĘĂFÇĹŞńΨŐŘîręj$!7˘ë°—CůÎnČF¶§Ú?—ű–µ*„@6� �€�(,ŕ��¨*���ŕFźţŚFPQ ŞÎ5×üÜŕ"ĺŘ€rŘ8OLŇ,ń¨TŕďĄĚŔUpŁSh´ŕ€“mş{© ęD$0"ěEčpÖŘű=1Η62ŕäQ^4­-ş†t¶z퉂éä™A…'ü$žÁrk–¤ś~ Řő„.¤¨®ä,!Ë:Ö®›0ŹŢĎwpˇß?Al9‰C)Ô{ŚéŐ(u?™Ą~¦;¸Ŕ‹ď¸*@u7:€@�o.����°T+!ŔP×,8 ÂB°,$ ˇ0¨P, AE-÷yn·™Ć\ÉľńĆ·uWŢŞkNµţđľ+­páá6GK÷đă†ÁÜ>w_w«]ŇíţôćŃĺţĂ•i­<Żkđą©%_vľŕ ›_öxđT;tuĂ*1ľże{ńe]ĹŰ!ó˙wŢ«˙~Śě] EI!ŢŔ&žuČ–j,c!.gŔBÓÓ1ća�Ŕ €$�D�€� €��€ŔF( ` ŘjÂÁA0J$B0ŠŢ9×rZe:Ćęç]Ć\¬‹©ÄöżôŐăËÉĂÇ«w~u˘›Ž˝č|i˝óMGo+.§kőňyöÝĂä«t÷^jnż�ăáőůCńÔHa^Ô6ě#č»˙[Ďůn«b©ß.†9Ţ0¶OZaűÇśˇ‘ˇAÁg˘Ô;ÜźZŃΆ7“î/«ďw˘Ą@ćë©/9ŃC‘íŚ"t ˘ Ü"-0`�H�Ŕ �����€ŔNW,T‰‚á` ŘH …a ”,Xń5[t›ÄÖbĺoYÁŠi.y×ůą&ĄŽŔşGŰźá/Ë;WU}ÝőďŞŐ;xĎÖ´ý†»ÓBkö‡J ă]ŰFţťŔ©Ľľ˝dŮzHÔčwçT9µ[~S/üQ—mÁÚáĽÇÄ $ö]˘7ĎĐUŐ´ţŕÇ{÷ô69ĹWĎă­#‰9!Ť›×ŘX^íâô€ L�`@�°�¨� ŕ�pDźţŚ&0Xˇ‚Ą ‘Šşj÷|y˙kż ŁĐ0;—˛_Ř7ÔeU]L§Bću–’SV3ît—Ú4A5%VÇĐŕďżX­<?‹xQí·V_`öŐ•Gś©Đ„"đ@ˇ[=ł–:šéÖ‰SěóYËű‚Ľ4-<AĺEa$!XT¨®8Ň0ŽáĆř×lü/=żMÎ>®97y¤3Ëč txśŻK]‡ăëÝ쏾#ú“dy„śä� …f#9���6"���D,�đ�8N×,T‰‚`ŔT( ÁA°P$ Â*g=_…ÜwWÂł®úîZL×vşťkďţ&8,v%Ä˙żşŐăć—˙żŇľgĹü~'_&ńÓXď Łt/PS�>jÜŻ—ç9żrŢž� Ú6Ęć ‡tźž•ďÓüÜ.\HŃ8#Ö˙ßü&M–wţ`oe}Ö[\‡sWĐ}'==wĄzg8o–şfyD€Č„®X�X��B��\��� �D&" ‚ဠX$…Á ¸X. …Á@°TbÇ|ńÝ×·vÉZËçŰ×JŇ›»şľ'ÇóŞą%Źç9îŰÇ_»Ń.ąŃ:ë·L@ŃŞ<¤÷ŇŞ_? F_5�ú7kĚý~ŃÔüϽ̾=Ę Ĺ~e{uE÷ş9ŚôP/ń¸ÄDö€ő|CĂS‹şřHĎ~s1¤Ěđ×;MÎ-Y«ĎqFcg€ÉšZIŔIXĄť:„l�¸@��L��*��Ŕ€J& Â@¨P,$ Á€°PJ ŤÁPP"Ä÷ëĂ®eí\o.LáßUy}ĘŕŐńŻó-|8ź™ü–ÖKĹăźBÔ?&“>Ę,ę}÷ëŁëń»ţÓ˙3ĆB­ŘŤţÄ:b=ůňHéÔűţwÇV›SééđřĆ 9ťs*ý©żz‚ę˝Ă”"Ń\ őki”¶%ČĆíětsČt(}Şđűzî#ŢÚő ÝÍJ¤–‰Ăl.0¦ĄQK€�H*��‰��@ €� �RW(8 …Ä@±(„‚ ˇB#ˇ~şőíĎY˛MĄÖ˛dâ¨ĘÓ/Ž˝żÎIw:oˇ'Ş5żGő˘ď_rłťŰ«Ş˘Ű~…fúßó‹řŚľX(?ľőżµřµĽÁÉŕî}ß˙ăěi&ýÔ3‰8z*î꣺óKÍ âžË».›¶ňµŠ:ű®ßţÄ´K,^ÄżüŻĆxü´×AȆsËŐ UĘZ…×&—r¨€™ �Ĺ€� €(���ŕ€Hźţ &ĘLŚ*ĺ˛_·üÍt> ˧Ám"t°2Üňßhě5ŞGR>ŕ\‹˛Ý)äVę M Íć‰+Đ|€Ľ–ńěżGő)ŹĽ}Şg9ë$’mňí˘ŹĄĐl&A1~b^I’ňft˝$TRár`"SŢ$Ş˛‚pď˛J<JćőRL„ĹĘ5±ś,Xç-Ç’‰n¬¬ĽBéľ9ă<–Ƣ=—Qww—sl ú“ď ¶8Zä�p,ň�¬�|�@��@� ŚGL×,$Â` X‚‚` XH' #0Š.ó\ÜÎd¤›ťfJj’ŞZk^ŇZř«BôŐ.؇éűu¨,çřďľR˝“,ŢíäYn?Şhýž%ţ¦î.,ßö#ź¤0—‘r¨ţ°}UÔţŹ�ľˇ]ę §;:Jâ ©řvľîs6{l}oŁÚÜ3™ÁYĂ'Y‚¦óeîśNk.ÎÜň_=d§ blĚgÜ@[ëî��&�`�L€�����ŕL,d „ÂÁA8`H …ÁA0T. BÁ@EŻű|§¶fîęeĺ¦îEIT»»ă_ň¸ŇĆđŢ}YŐú壷–śľ!Üüôs˙?ČôÜLgâđřŢ{VŃđë<~eÓ/ůëGý”Ż-ĽÄ»�óőR ).ČŠ 88 8ť$ş?›šÚß Äa€ 7¸Yă-ÂI˝á;^ôbš8 í’Ó@Ŕ��(�����€�T�8HLT ဠn„á@¨X$$ „„,g©»©|{ýwYs5WąRę*k.kŹŹńeÝŽĂŽ_ĘźżŁÚŽâüWäNĂd7Öđ/öĂ>JĆ}‚»Öt�?̢őî/áÎ:Îv»Iif GaĄ- 97ű;gRľúŤŔ§âÎ<ü·đířĘ…šąź ˛•_e›Eć9ťZŘF­jŢUšýŚWŐ`îÔ���  �€Ŕ�*Tŕ�8DLT…„` ”,…ÁPP,„,~WLéńűu“š«ç[š©3®d˝qőüĄÖr>‹üŃîźvńÓČ?]WëÍv™ůçíËôr·ć?äąćŕ_®ý¦Î| ĺ6׿ďk2â˙‹­J.ł—W¤~wńÔWĎőĐ·}ÂD~\»Ń«·´/ă0ĂWÖťăĎěë¶l™Úoµ…-ÍT°&NŘëń1­*ÜX| A8��¨�¸@`�Ŕ €��J& á` X( ‚AA@X( ‚„! ﯤ׿µvšďŞśÝMfą•¨˝uŻórKhvž}őíŃwľoÁŽísŁďÖôţ.Ŕ×ń×oěźnřçđżÇ‡ů‹őé,˝2ýÄ·7^ôô «Ă/Ŕ“B˙ öIó®ÉRöřmYą?6=řA†*„Öí?Ćc}˝şVH]·ÎáşYö(ĆĹ%Ö–ľŞĽśwĚŚĆ~Ŕ €�¸���¸ �`���ŔJ* ‚` ś0 ` ŘH B‚0 H"ÇŤűzşâ›ó]Ĩëß®ř㛫Ékťy˙7U| ę^6őý;÷§áńëůýĎşż[Bʇą˙Žčf%Ö˙IWçˇĎ;˙ ýţzxÇv�§>˝˙őüç¬ö>rÚ庯ś4Tga%vHçŢŰIDMĆąh‹$űŻm8Öţ«ÎÉŤAc(;¦˝NĎ ëôÁ`Vvé�°\ŕ@��� €��\�ŔFL B  X0 ÁA°PL3…BAą÷ę·s®wÖ_ĽâŻžąV¤UówzÖ|¦‰©Ŕęxťşż)G3{Ý—ç ŹëĽtĎÉ:Hž=ý}˝TůŃ-ł$rŕíUźéZ,`ü.‰ă?KҾčŇ|cţ©�˙ŘúüXgqÜŻíërw:p]Šę€žŹ®äGÉ}s)«§zn@ÖвşĚűĐ´Tóî€p�¸\�`�T��\�@�@�ŕFJ…ˇ`¸XP$ BÂp°”(% ˇ@EŤ÷Kß2Ůąn<uŚ»¤Ę»śUűĽk8p;Mń-)¶8ű\×—>GúďYŘĐ>_%L†ŮbŞKĂąő„·‹ąs’Yvő#ľ;ýE¬×ş¤9ˇj˙©yúü ߣĚ7ęü.7ČçăŐáz ö‹±ł[ÂÔŠ%5Ž€ú·ěďvˇ?ͱ*—ŐtA ¦Đ0IÔ“>« [ĽMP�L�€�&�.����1�ŔH( …†P X0 …†‚a X0 † ‹ëůţ‹ó[›Ód˝ë+ŚŐRĄ]é~ßí­éÄŕrxGöüíMZ96č÷ëČýh `{–žů×P+ĂŐDÝĎşz•ţ7TŠě–ö‚NzSSŢ#wű˙yŠzŁł‰˰ͪBs#/˘-żq�ęĺA·šäcžŐ5÷N@Oçńš€BĽŹ vpmw"3N—ĐđŔŰI:™ő t�ę�X"ŔP� Ŕ�\� €�pJW(‚ˇAŔX("‚`Ŕ(6 ‚A@E‰öóŰŽ7śxŐeIŻULyŢ^8»_ź÷©'ˇÍó öOĎź˙|±Řq0Ä(ĎyŐ÷žľę&©¬îă>•ńŹd»ľG˙şuńp5 ĚLÔuK,·%Eýty:çăÚ3ĺß+é?źMłÁ÷  eňLę !8#*>ŢŢ;ź6Ă•Á_ááźX`]1|<PZvVP@CT€Ŕ&�P€� � � €�ŕLźţ lÔ™”C]qţ÷|8‚›NŘŃÓ f‡Ţĺžđěnuzűs–·ýěz-"i˘Cé\y%m]¨ ŔYŇB3C‘?Öo(˝u€»[Uş.2‘U•ööÖóŤ DÜZëúŐL~ůCBMÄRÝTuH Íe›&ŽÝúm3|ć´vr…÷Ă=Ůă®s”áµZD;‘Ó÷?~Głˇ3˙šâ˙'ń› ş�óá%¸ ��¸°ŽÍ€ �ŔŽ��ŕ�R×.„` H …BÂ@¸P*$*„Zg·…˘·×:¦í©2nî\Ôö˙lľ·Öp<‹ő°äź™­<#ŮĐ·źü>uŢg@˙˛BZű'Ňő©ŹŞ‹âOoŔ ľ=}}âOź0ýkÔŢ:*üsűür˝'ű])ńqĽ RŇ˝gĄ ă…ţP6ÁnľKśý—h)˘Řč·W™Ý¬d-pń�Č€ �¸�P%Ŕ$€�,�� ŔL,' Ä@¨X( ‚q0PN B-gľąóąmËnqßjŻ8ďSI®8˙¬J¶‡#óO î^ođŤąKłAţĎ®/}ż%_o˙¦ŞľkŰlcÄşžOŇ\-ŽŹăŕ{)ęôŤh0`®âIůYţ}S_Üęő·8ę ;őcµîB6˝^…3Q÷¦­«Ŕ폳®9]`Ľ¨‘Í !� Ě�Ŕ 0�&��¨�ŔJ, „…` . Á@ŔX( ‚` "×{‰jśđ›SŤ¨ŇůÖ/Rj{ż*49/çü¨Ľ~=iü.K~?ú-Ż ţC¤2íÝu‡qĐ~ĘŻ[…ţ‡m źůE$óaT—šľ?řÝ˙đ§:Ąý#ôkRžűuŁ]BemËĄ’;4(q Ř\#÷5űÍŻ¬­«ě?hŠ.ťäç˘ôĂőĄRšz‹MLŕu��€X�°��Ŕ����ŕH(…†…p°T, áa T,)Fa;ÝŇ굾«*µµŐeśnf—&Żëý4Öä±Éô‡đ·w*żTś9ŮĚřçŃ{?ŚzÁ9”=F‡DŠzqó?Ą|ŻëšY-Ů=ÝŐôc$%źśűóÔÎşŻâO¨ëďźą8úxE�^łÓĘ?Ĺň#NňŠ_ˇę8ňŤľđľöp#ŁÁ¬U2«OĆŕËŚ_/Â$ËK•7‰Á(Í�\�  `D�¨�Ŕ��@�8HL „`¨P* …„a(P, á@°”(1kľnšTß;—2ęŞZŐš©.úăţuQ%ŽGeĽ?;ôţgˇ?u˝>‡Ď~ýř·!=„×˙Ú¸8~ąGC:8ű=¸ˇďňÓâ>Eš>(bą’ąjeąŤŹđbüÓ^üew#AZýýrßQŞ©…ĐżîÎßĚîü®™‘Čs^9-„žŮ'˙s•¤´uVŃ"ľGčT‚¨!�Ľ@�(�*�&$���Ŕ��8JWJ1…€°P, ڎ` *­—Í_:•š›ÄŢ“)rd“Zëý®EËΧ>IďĽëYęźÎ~Φ‚ܨIő úĄ®G6|\÷}há4ŐFz÷Í>ł‹Ž©ý7řWŞIŃlú $“˝úÄIz"Üe_ 棇_Űó6ńˇJ×p«/ëíŘŮ:“6™XQnH«Š\rd±«jLâÍOÂШ+ŠéŠé�% @��€��.� �P�@źý”*0Yˇ20Ů"řó˙7|=™Wç¶['—É>ů}=zu©•’cµ¨JĆTBžÄxđf§ŮIłKK¸Äń“łŠ˝–ô SlQąöJÇaŽ/LŔyűCáăŤo«Í¶(›şĆąCŚ$Ő…WLCšk Ż–{0EzÂĹë19Ä@ŚXç[úÁ…c­Đ.ÍĽ˛Ĺŕöěz–íĆ…—qŠ. h‘ Dä#Ó" €� ĎX��� `Äk�€J×H ‚` * ‚b!Ř$ „VžoŚĘŐäîDÎ2IÍ­®˝żŘă#Čí8'_oŐ¸Ő˛Ça¬“wÜĚßô:…¨kôéÉĽŚy1IüŔí�ű—íţ=}žG˘™Mŕ€4gđ> ŻľŃŔ/8'qˇÍ?Ť_í7ţ_ŮíŰšÔs!ť »ü ů?ŢfÝ™45)}d żťÖ7\Ĺaâ�Na $ �¸@��ć��EP€D$ Be X( BÁ@¨P$©=ó©ĎßÇ|RýďŻ ”\2éu©Ç·ýÂÖ=®ĎÍkŻŤo®´Ô]¨gââŽ|»ňór—W’DײČňuK 0 ˛Őá1öüŘ�ůÓŤźĺŘľÖm­ŤěˇÁirär#€Ň;ěÔ%˙ÔĎ|n¸«űxŮ&đ˘ŇC ™ÁI‰ëŠiÇf52вd-$s´Y?‰öß…ý�ó�(¸€�P0� ��( €H(& )„€°”,$*… A§«•®u5ęë»TŃ»A‘rO>ŢT–Đäĺ;n_Lцĺ·őzW–ňľ¤ůFçüjÝ}Úx·ô±ęč%dŇđř‹ŁÎÔ» Î˙ůľOëĽăZÁF5\cŽ HfݡťąŰ$§w?wď'ŰňXWâ-sݰýű1ôŤđ»Ńe1]ß\M’ŻÂźËߢ Đŕ1¨B@�.�@�,��*��±�H$  ¨PŚD9… APT"§k÷ÔŐď[óâ¦Ő¨«ELF®kăüĺń]eŽĂŔ¸ýgżĘÝ$ęăo,ů¸ňý×9? ?r ÍžR—łW_ů"…ť<Űnö;J§ŇšhĐt¸÷6Kă–‡iŃŹůŻŤ0€X7ŤChßWfÇBř/h~·ďę7Şľ:iýěz{ LĆzó?lÄФMÝ×áÔŚD—Âr�)0` �ĹK���®@�ŔHW( ĂD0Đ,4 ÁEO?Ł÷őtu¤jŞ˘Ł‡_âµ8śTµjŢą÷Yg‡Ń÷Ť÷\mšgPrd[—>Ůuúp›ÉôűRŰü•ĐT»mď¶Öâ’I"IĹ“çÜjŽúíf9ČKŁ/Ç^ěGă7{\qqľmŹ Ľ­cĽĺ—0C´ăĄ¨9ěNô[„;ÉÍâXbźńł¦ü¦ń†Ĺˇ1Π��°¸�Ŕ(�`��� �ŕ@źţ+D&F&U’ďŰýŻ\­Ídťb†ĽË< x`.ń4$ˇ+E'nµ—(0Ü ’zpţF1`éŇ^L!ôĄFß=C©a:Č(í*JôŤÍCQs[‚ükĎ '—ĽÓĂÝM2Ë'~xăpĺQĄuŰQŹf˛—^�ËBĹjĺCµDZ´°š:ÄÝ`±^ď„üy«íćC×[×¶śYžc˰wĂeč.P~ü���m.���P(9€��ŕJ×( …ÂÁA¨H(&2` X( ÂEN>SŽő©ÍăĹŢX«Ë™¬ŇV§·_»SU4;\¸ô˙˛.ß®r_#˝ôŃY™ŰT±×żń‚Ůż�—=ôÝÄD¨Űů GÇĄ˘yKZ‹{7Ż [ź*/;p˙“ömň B*5đż'ˇęÝ!Jß땏ďaéűóÔZôskǨYó6/ű¶ę>Z¬đŚŢ2V_Č´˙˘´, ď\U¤“��.���€.����€€J$ ‚` Ř(&$Š` h ‚a5Ţ[Y^w»Ę“rŞKÝŇÉ~|˙7Rjô;‡łöš#öÜ[Ĺâ\±9o»0_ťŹYv`'.śĆ/SŻJó9Iż2S·Ăe¤v»Óŕ<[đ«ŁĂËpgóoo*č›ph¶˝đ”Ă4†QW M5ł‘k¸S“ťTľ×ŕŇ5^F�5×Ë<‹°Z»f~FˇLö~#�%T @ ��*��(`�� ×� €D*… ÂA0P0Á@°\(‚ „TŞîď[Í©šĆďŽnň"óSŰŹôYrÇw—3í·Ońąf˛Ţüž#} ÝŢĚ«ů÷ú j‡˝ý5J$ő¶© ? ÷SëHŻ|kF¤őt %rčöúÜ^Uj™MżK@î´ŃEWć!Ë~şĐIε̆ż’3ÔĽ VV®óߊ‘ěhÚîtÎk‘Š|ç©ęn IEG´�‚€� ��Ŕ*�� �"�FW$ ÁA°, ‚P°P BÁ@$ZwN%NzÎuΧ>qYĆ2¸ĹëĎ_é—uĹhv¸|<ű­ü;[o'đŹŔŚ«óçoűľ`˛íčřĎ3˙¬—O0%÷…č·Â˛ýpµŃ׌ôBú€k'äşŘIě“(j^ȉHĹt†zŹ ŽQ¨)"ńk:Dz^¦Ś¦b ÁµŇŰßJÚĹM!úźÝIĽ|ď®!úÄ�–€ÄŔP�Ap� �&@��8HźţŚ&¨ŚŚ.Ż^Ţď€ N’:Ň`,i«Su$ŞďĐ V—»(µW®Üš3©­Ë=A·dé LuňÁ0<S’ýEä§Qđ ‚€\słh롢űŐ+®·:Řôą7čd©ýĆŚCšT2™ Ă~y€–éH‚°¦€1`t@'Ąłńo‰^’\Ş€7=:ë:A[l¤ä|ěłčTř™Ű ', 7ײR�Eś��€aµ€��Ţ�”Ŕ��pDťţ‹MšŐKŢĄĎŻöXí„jÚ Â`ťZ˘r‰4ż–Ś.çeĐ×vG©X&5Ž €ďđbŽ+÷‡1d;ŽĆGĹŞ\%Ô*fqŃ>–˙Qlk9nbˇBŇ% rŕ‘˘S„Ëx¶„Ip#dů5śE®t`´­ą¶CŤEŘgűD/ş¦›†ľ±´i9fÉŮđpť€ ÄHÄ� �.�@ťţŚĘP™Ő\IWőţ.Á$‡ ~“Î$YX…ť‹ď\ÜŕKN0ăš–žţzŰjóŁ1±ŻúëŁëřŽĐ©ÔsqMV<ásŁ™G,šBLŐ‰Vµs:čPHDÉK×ŚŰ 3%ŞP/4�a8 íU›ęÄçÔ¶‰ÔiYöM|­Í›6FžĽçÄćĹ_PČ™ŕö§�O©Ŕ��4ó†Č€��!Šë"���Á €Nźţ- \É3\OŻózĐÚµřÉč뾦.fÝWéjËeOhG¨‘ahN…öV’é?,zÎ<‡rÖUąŃ­n"¸˝‚ł{˝€Ë5im\uMW€řPˇ=›ł¶Úç$ľ/�Ď­Ú_mč˘mČfDóÂĘ ęŃR7P3ĐRŔ·MX=ďřśH0§Â˘üj^›•ČnJÄŁň'6°MŘĺ�ä“!H×�j¨h€ DŔ��`��ŔR×( ˇ@°Č* !8T( ˇ@¨HbÖdĺ|UřâNzžüKîő9/5ZëŹöBÚű÷!©ţŔÓŻč}î8}~Ű«$§Çüźď‚ k ÷Ô/4<bźX¸nĺüd·_čë˛s˙“Ö©Z^j_ëĽ/ŞţĽÄÂS^µű‘śó‰Â#Ý‹‘3¤îü"ľ˛ÇĐďfűÉ=�Ŕ�¬@�X* �€�X��� €L( a¨XH& ‚ ¸L…c»çĎ4öÍsKÝë×µ9ŐÎőVá˝\óíüęĄ[C“q~o~„?,]]H\<“óô±ÇŕvŞşP;¬·kë¶&•ř Ý”šŰŰ»Ţđ µTů×W–ęDY[ˇŢ`t‚ţg•ŢąűVŹnżĐ•ŚÚýÍ÷›šF?iĹJ°·ŞŇŔé „§±1Á`ŕX � � €�\���..�L,' ÁQ X( ¡  TH ‚ EŽó\ÉĆ]řó™Zç©›»śńW–i~}żŇ%IĐämś´˝M~e-šßóżŔů”ĄÁ›ŻZg×Őüú:ÁÍŁ‰ôEzČ7-7Sw]éEňüSóü•îpżR;űJŠ{ÚťSéŮlÚR™ň© â>¬ĂŃÄÉĹX{HĂš :Ńü·l”wÁÚN{KsT@Ä�€T���.��@�X�JŔJŚ$BÁA1(& BBP H‚©~őś&¦ö•ZÎ*ŞM/ľ9ŃZ×·_ó•ZGü_ň:učáűŹź}Ă㱩+·ńßüg˙ĺçö.®©¶ę5z'–oľoŮôpú2[ç㬺ężN7gl”—1ţ6Óšą"łh÷v>/ źÇ5¨š0®ż(Ńx˛@ć <5 ÖńľěCĽ@L0@@�¸@�p�.�€€JN&‚‚`ŔX. ˇ@H( Ba=sq¬›­w5Z­×•óĆkv©:×ăü)\V‡#¦űÇmVż`ýGMqÝÄÔcĽ;ëťvŽşźÚîKjź[MwŞŘŔąvzxő‚-||GŮt%×đcâËwł:>v—­—Č]Ž=NŞ+<˙qľ…&“Ç:~ (Ojî´ {°FÍkËô¨b *�p�T�D���$�\�TWL$ Á@° , Âp H*BaEfőësąU.˝·ÜóS}w¬šĄëŻç«—.żůý÷·Ô¬ÓüÄoz8·ďČPš¬÷ě–÷,źĺ)żŐˇWŮôAű˝ďʶŞ(îBg6;r€ľłz8ÍĎΓ‡łé˙oĎ#Ć‚¨š«pŤě’Wîó×cű%†ďbă%e˘N"<€0�LP��D��$� �P�8Nźţ-šĽ\©<ń˙v´/]ÇŐEOMG‡J¸’”"ÉÖ7`©§ąPÝüvKűX÷űłňŮÝ73ŻŕŃ%^îúz,=ů},5ŹăŰ# !5čĘ$Ű-Hů>áßÄšxđg–ŠxŢÖ¨J¶~âc¤{ -ćÉnÚşh8?ëŞxěřú2éé…Ťp;&ŢZs˝1ç­VŔ˝^ĎăÇ/déAVˇ_} 0� Ü���ßp�P�pŕJ×L4Á@¨Xp ‚ĂQ T." Â#0Š\řăÄâMËńŐî§V›ă›˝M~?Y#NcĄéĎźTź™ń´ĐęÝ~ëŃ Flzęó§Ëő>N|äł÷Q|×ÓÜäÓCP€OÝzhŞ*)zń——Ő)<Z}ç8­"KâMNůě»ü§c“&^ âůˇAwň§˙ĹăDeĐ˝LKm¤l!ŹĹ@Ę€\Ŕ�@� �€€���¸ŔJL B0°\$ …‚p Ü,„ÂQTFaó7zÖęĄĎ;ę_*Ňň.®Ü?Çárµ]G{đţk©ô®łř˙˙‰9yš7Ł˙?Ĺq‡âöčŐ?aÓű[%Ř~=dŢű.Ed #Ýźň»ŰůĄßć…żżë~8zÝJŰąĽřwJĄł ě|—h×ko,aQ BŢĘhż[v°aŮČ *�î�,€"�Ŕ� �€�.�€P�ŕJH B‚`ŔPŚ ‚`¸P* ‚Á  HBĆó2¸™­®·s™ÖRN|˛kz©ÇéćťgC‘ŃÝdzÇęúłâŐ|™ý“¸·ËßőóßŮ~(µŠ¤Ž¶ýC…Hýb]>5š­]O™ż´lIćľßŔÜŢľo׊ăń/ŚŰm»46q"!GP\1¦1‡y_‚]™©č×j»€Ue Č­ĎË‚„h P�Ŕ���¨@��PW( …†` X.ĂAP$ „„,qó}ęřĚŢ­‹ĺ5‹ÄÖć”Őüuú´jŕűqĺü6Ď -«š7oŁîVčřś¸¤5Ľ:˛AŽFĺç¤Â®}šűRůµüHUŘ ‹˝:°JŚnn\Cű'ţvOú>ŹăĎďZ#çĄ?źęűúsÄŽ'AŻ:Nč­(»˛Q”čů¨Q2ŹĆ(n¬Tű‚‰/�Ľ�f�"�(€@�@�`��ŔBźţ+((T™¦K•Äű˙‰} SC˘¸®mýLtF¤‚ĺ×›Ó %ÓĽţR âA9úDŇ©ŔŤĹ&Eµ‘FôZ&ň)'Şa Ň.H"ŕ…DŚ=]ląµôŃÎOüHç[ń¨ăHÜóGj®a”čÄ„ú·‚j/Ô/VZŁFŇ­k§ďc@§F +żŁt#ŔâÓ4L#Iv0çŁz“LGtQâE° ü¦‚ŕ�´Áľŕ��N`^ŕ�� s�\�F×(&"ÂÇp Řh' ‚B@¨H"Ĺý«[óąĽř­ëÇéUy5Wľ2J»öüuí­­Ŕńq?nŁÔľjnC±ţmýţĆ×hą÷[@%Ný˙W'ÖrlĐď[ŻNGÎü:Z7öHäNËß(µ?ľř‡C}‹Wř ˛f·řm.°hUë2ČgŇl΢őYwűv§ŽŮ­zkÜŞ ú{•ńUn*DĘ‹ąH€ÚáŔn €��*�.��*�8J$ ÁAP,% ‚€°PL$…AB‹\~uŹnřďy{ąU«çÎé)'ľ˙í‰Včrx>‡Ő˙ŇÝ:·yý'?~ť)ÔćčäŰżCëkäń¬«ÜFŃ⟲ř0CUű}Tč0ЏsÂÜSQřÚÓÓ†ĺ1OEn2ËřÄ?łíşB77cŃDV^7‹j†ŕÎĹq6&Ežl¤ü,UÂ’M¦ �­€±0@Ŕ���� €��H( ‚  XP ‚a€°Ô, ÂaP¸HH±ÇćUŢ_oż7˝ë»tŠĽ«á8ú˙śJ·“ž‡ä~1´·˙(>ryôp4N·iđDíĺĹiü!of &ŮůúO,ĺşcĎŃţ«j!C|ň/ďá#™…Jčn"ďÇ‹oűţß qô˙ĎE`׌)ńh»;‘Ćiڬ ±7{î LţĚ{üđ-LQ±ĄŽŔ2€t�@�*��� ŕ��H,‚a@Pl …‚` *!AżŢç7ç3ž¸ď3®ë…k˝$Ü’¸Őqřú»N‰Ëý|ň˙Gě¨ŮüŁÜ>|ôΡś6ÄsL ňđDŁĂ;ŻEŞýÂ~Cŕhč;y˙vďýGËŐť®5_j ­XxžZ)Ăń«Ď�Ď™ůćâÉáí•ýşř,uţYťě-­,˙şÖ¶ĺbEŽń|‭fŔ��°�H�,T�� �€ €�ŕLLU„‚P  *‚  T(" „Zű˙YâŢÔďŰ2¸Íë(j®Ż.¦­××óR:­NKuŰŁżÓ~†ŐÖuč†÷˙¶5ź9ÔMĎýżłżöj‚xëzéy¦—řľŠ˛,—M~żÍŃr%ÉxŐů´x>żŰĎlňëŤě7Ź?@ľŮ*ŠËîÖăťU¸!şńüč<“¶@2VD—€Â °�˛Ŕ,���$ ���F@�!`ŔFWL4+†ˇB0,$! Aź:çUƫƵą­÷Ôĺľ"ÂUÜëýäš‘Ŕě:{OńůŐ>+´ö^[±ŃóÚţﵢŃÉRv»×¶^gŁjV ÷‹KřÝ~uN?Í|kíţ›ŘńOJ€˝°x+‹Ź¬ą}oʰ‚4ăü;âÝytŽ­ ŽcGúş$6D˙^WŁq¸ď‘Iř €!0¦�*�¨��Ŕ�€�\�*�p@źýŚ0™˘21ÍSYs^çWĐHŻIŹ"Ă;ő>ńŁ˝úÂó˙ /ŢýWŚačÜWŰ{»÷/]벉aŢzĂ@%qMxŐ†@śKúôč•XB(˝ÓdW$O^€“ş®¬=J[ ‭{Ä)[A­;Ů“Ş zŞ.R¸őŁ»řLľáÄQý58›ck@~RřÜ[áb&…V>hŘ7±s¨�HéxšŇ�h „¤� ��śä���"ä8R×,D ဠH& ‚a ”. …AP T"Ç=ęĄ×»âłŽů»˝š™WZ%ÎľżšÔ‘äk}ŻŮ»ővÝ?ĎjnM¨ů$w;ŁýŻWíÜ˙Ăě:ýýĎĎř“úď»CČśü¸ŠŤŞýŤí]í/Ős÷Ä!¤úěqńę.٦ł%ďĐ©ýľâPËĆţ¸TDTfésf+eC7 «ĄBˇ1¬yÁ˝†}XQ�&��.@� � H� ��ŕJ,c …p X* ‚Q ”$ „X÷ľ<Tq”şÖőĘ^ŐĹěZKž|˙™"jn˝¬?®úu\:?…Äř@xôR†/3tÜŔ9/î»ý7EÜöłŇď]ö éÔ4ŤĂ™ÖŚkĆ%â…ÖÝWS·íč_Ó<bb.¨~L0ocˇ+íľAş-ýjł/âäĺyjÚÜ#c˘ŮJ^’ÉQŤ¬-LŔ�P@�,���.�� €ŔJ&" „áC00D` …Ż9ƫϫKŮ7Ç2II©Ąů˙©ô:źâŮŁ‰ĎË„˙Ěźć]MWźđâź˙V’7Í9f›ű/@ىKĂv;ÜĘÖÚ(}Zăd´A.Z=ĎéŐ,ăáVŃ vďWĎ\ź˘ý¬- ŇŞe «‰”ęŻř z˝S)s|Dű]Ůé‰XĂ&۸7ŕ�¤.�(� €D� �Ŕ�"�p�pD("‚‚`¸P,p°P$ „‚‚` T"×>=»®)WΫŠÎx®<^řŠ’ł‹¸ű˙Š»–ĄµÇÂ6ŃďÝ>‘çmwżŮbîKÚCâßáńřŕEz¸"°/”ëy>M"ać|Űţ íżŁ{!#™î*˙ S÷ŢŮqJĚóĂęnź=fb ČŚWNĂGÁŮ9sŰűęÉ9rî”JCó‘iRu§ÎZzÖ`@� �T����ŔT�ŕHL ¡A¸PF$ áa X*ÂÁPŚ"§y®mWőëzßU=őĆo\ęď¶µWőţipr;7LřG-qůď†î·ß»KąČúŠňÓů)ű5’¬;ëü«6sĽţY©>ÎbNU’ËăęvĎ”>2›ŰyLŐW†— ă{a’Ć0n”¤Bp…ç‡OĘô}%°Qş/‹˙Îľ�×ţ]­ }ÓĚÔŮ@ Š�!0�¸�� �*��@@�pJW$ …„„`¸XH ¡A8P,$#ˇµďbî§Ž7»󕗾Ć÷'N?ćÜe¬rw˙‰đ.VěÝż'ă–vwů®·FřߎÓoĎ<o»źÉă}´}uýőŕÖz×5>nţŞŞUĂč¸J­ěŹuĚëđżô` f.›‹žk‚t7Ë?ű§q—Uő @ݧudÔšćßĂhYŽc P€ �€X�T��ÁP� BźýŚ60XÁrDČŔKÜřŢőcw‚ö†ěň÷?˘nëňojŇÔáąfś€ľ¬/˘0 RµŇĽ!„i1ŃŹ č׏Fź|Ýř}ŤíŰüÓ%n¨4•b»ËĹ\4KŻźcńJ¬Ŕ8™¨Ö„ĹKŐ…-ÁR%ô´<¬ŔŤľcÜFŠcžĄÔkŰéôí®‹Ňu¸dŮś­cO’AčmI˝ú *QŘĹčűݍ÷ZPP6D\şó�Ůf�¨�e˘�Ą��v����8D×( †P \0 A°,…ÁPEŽľÓ}Ruď­äąĎRw/}U]L—n?ßQr4=®Őćç îôkřoąé;Ž‘Ë>ŤŃ“¦_yw^Ý޶×rmż[Ëtň ů űî7•(-oFŐć[q>†>Í 0!üÄ˸ÝU%ĹVPçÝîv+/Ř ÜääNä'ţ3ÝVMt3Ę‘X¨­–Ő)âYSVŕ�.��"�@�€�T��H �BW( ‚aA¸`(‚áAŔPd B-kç®yóR·ÖoÍfu^~×*ć·DŐµíúÎ)'Ĺŕ˙÷ßęń§óżťôąÄwňN~B�÷ů÷őV|µ?ň/éO/ŚoŞÁ&†ŽŠďŃu!\k]}…qzu3٢š´¸sŻ5)ćcYÜËKxüţԟǖµęŁŰ2˘oő‚lŻâ€˝T#Mn@g � €�TP.�� ��P`�8@ťý”PXÁRdaWZo^Óţ·až¨ö?/ťťvaóŁĺúĺv–ě›ZüĂ–Î}ńĄó$ŃGE-)1YźG+ ܨĺE©_˘Ű®ŃËÝxüźdĽĄţĺMŁp™č(ÎlzGmBḬ?s4˛Úă¬ët€"}âVˇp?ŞtĘŻ€ˇW¤·ďĐš”ôŕ÷tžÉáŃ_>“Öc´ą¶Ű‰°aýíh'V*™×ýľÄ¤�" ŚC @˘ €��0€28T×(Aa!X( ‚‚`P$ ‚ˇEMnţxľ;ăǶo®xîő›Ô«3ŽÚŐËăţj#ߍsEü÷ţŮĺë ă`ë_wlOŹÜ3˙7ŻÖ˙¸ˇ/`ܬM<™n)¬”Ą@ĄĽĽMtt·JV¸řOŹk_”iޢńHÉsóý˙uŚŃľUÎ’»śů| -ÍĘçâ: †_:˘á�¬Ŕ�@��‘rá@`�TX�pJ(6 …Á@± . D‚P°H( ‚ˇEnľ×ďĹ\ăç«ŢuYÓu1Jššš×ýnŔäâ<uäëx?ŞóíŞëŰő)ŻâĵěLĽÉbBţbňđvކ’§{ąĽkďU‰çŮ+Śú芎!CŐbYŕÍ–ţăgú—‚Ő­÷ĎřîöCÎé'ş¨ďöŞ‚wVłAo©ŘŚd2Ák$I�”����(��T�@� �F(ˇpŔPJÁ@°P, „‚‚P L"×·ń׫®·őúyśŻ^şťÉMLL»ŇuÇüÁuĐńrÚřÇď¦^¦ú·ă7ó¸ć Éë ůΆżźĚ;˝·T_ËŇőüżÁń ĺôÝ_?}¦"Űhżˇším•áäsw _˝Ë˝wHĺ4¶ş-%`#ĎᏠě7Ő :Ľ$úŠşxáRÂśsˇ"ö‰˛Ŕŕ @� €�� �D�.€ŔJLD …‚pŔPl ÁA0P*) Xśću»“ľNnůśfqUj’îyăýć™VŹ«Ź-űřtŠ˙Y÷Üt\ĽîĐĐâŞe· 8^˙iwWî-°+ŐŞűŹ’řeźťNw“ţĹÚWé+»ľkŤł­‰(ttř­Ţ]˙ÇB„;ѻ֠§DîpDšËzśxÚ=¨BQČ .Ąä<`p�€�˛P��T�*�&�8J* ‚‚a `*ˇ` H(% ‚aEKńĎYRk×ĽŠ“$©*)¦®ýżç‰•;Ć_~ţ*ţÍ»SŔÖŹ×éź$ţ’Ł/HK×y çâ~:ţ-Ý*UĚŽăö±×~ďy+Í?+fú 2–ŹŻ¨rÉţăKD;­ĄÁ‡;ť»ô×DmčrVűß׿+˝!ŘÉÇ:^nç,JpůşkB ‹pŚĘ� �L�X(€�"�� �  €JL B‚0X0 ‚a X(& …A@‹ĺyÜĺ×v¨T˝Ę¶qA-Ĺüż[•; :GŞěŢ÷i„ţźM˝™Ż zâ ů+^áčüu­ĐÓż¦Ł?˘.´_ŐÁwďěčÍ[ť_Dßś‚z:ţ0/5×ĺŰ™źâ]gÜŘqĂ˙ aO\»-ĎÄ”3›Ś>,¶ž÷+fľ•Éë’[a"˘ ‰€¸ň� ��*� �� �\�8L()„‚a@°T0‚`¨XHB …ˇ@E«ů˝Ľď­ĺ±|Ý] ¨Ľjµw}Ö骮'q^ÝŮv[ľ—Ýú_ďř?gé„Ăe+RSÇň*woŰ™K—WcüźlđVWcÓ°Eĺ™vß'«G Řösú–±uiŹ›dÄ p„ĘN§´ĹĆřănťĄ˘˝˙TňT“z-®ŇĆŽÚĺ2FłsP ˘�,�p¨�\�Ľ@���€P�JL ‚ˇ` T(s ‚„ ¨P*\Ď|ęN5ófł'ÚŞíWą—×_őMǵ]Ľ m>§ĺ˛ßÉö>Łú”k›h®5µqľYţŽó÷ť˙ăý§–ëH:φ‡uëa;;Ń©·gZ^#u›ž' Y‹'đ~vxVťběџħB÷ßÖľЎř…ş"&ş ”Đ��Ŕ�*��ë��� €�ŕJLd…Á0±,)B5ó0ë*dĽSŤÔ«•j™.jkăý-$Xěyęőú­ßF’Ăv۵®Řý­ű�_ôů˘QĆ®˙ęĘg껳$Ołž”?%ő©ąű‰.9ž·č<ŁiIµP! \|giúŤ¦„ßáč±ŕ|W÷Ş!ő-JÉÄÚŕL°ŞckI8ęĹ @ʱQ(�°�`€@���H@ŕ€NW(&„ °`* Á@°PFIZöűnW[ëxëş ą’Rd’ř®?{“QŔô弋ÁzGÉôŰ>Wú:ŃĂ›A'ýȧŐ˙§HđĎ˙= ąílä?"ýŽ)ň‹56–1ŞąSâWú@źťů*Â{É˝‘«Ą˙WÁŃć©·ŃOóB®cšoŚľZüú¨#!ší·šh¬ @Ŕ � ��PĹ��¨��.Ŕ�pPźţ (,Ü©"5·5Ö˝— ·tăů|öúę•¸W~ŠQźżţÜĺăNrűz¸Ž…ĚłÉLA~ěƱ•@:€~ŠaEŹŇJ2o.sđ�ĘŤůň®#˝�3ĎVߍ6F™çJČ­X¸żKŔĹŐů°ľß›%čĆîn ÔmHqăoŁś×+×D˛‡8¤âŻ˘40Ŕ@ĚLË™ýđ0MÜ�—ř}���€ţ@���>’”€���O �8Lźţ‹(-‰21j^NµçüÝô Ľ‚tĽYśů('±Y?ń7ź‚éďŁí5<˘Ęvo<ŞŢ¦ą·7Mý˛4˘@ć'5u®đáLž NÉř•şŞ˛ëÎő< ­ęHŕ‹äľvë}Uä-O�öđ âR>2c`®!¤’ŰY cWsYüY­çůę+Ěfv<‡şŻç`„vNtlŐCÜŞ‚-łL€+Ş@"� Z ��� U����Ő����ŕJ×&‚‚0°P¦ …Áp ”, …!1 ^ąk4ÍwŐ$Ýk&q2U’´śq÷üFŞő‘ü&ňÇ—˙äŢŁ“ůýŹr˝d¤ěäíůď0ÓíG…°„}ků3¶y<¤‹·š‡ %Ęwp�l}rřN޶=ĹVW7¸¸ˇžć)§Ö4ăScż«őşâW3wŻĄK§rqPQ(Ü�(˛�� �¨� ��Ş� �€FLaA¨P* ÂP `* Ś‚á`…Ď–qÜ’eâę·Ö+‹ď­Âę]ߏń*UÍĂÁ^ţ‘á7Ë=ŃůŇ>‹¶Ţa^˙…uąo8çNźa=_ő˘şż2üX4Ż›Á·F>ގ%ŻŃlßđÚ˛<ÚűD!MZçLd«ňŹĂ2ŮěĹłŻKj^B‘u‚Ë€a��¸€���DŔ`€J* ÂA8P, B`\(^ďśťnN˝îŞęűň¬ÔÎ7y㎿ĽLóľ‡bń˙w'^ľŘx·'ĺŰTj0_˝ ßÔNśHţ?Ý v>ÂÎůü™Kć¸;6łM…7âvţÚanĘ hËlM×eg׉ů§Ú¶wžŁH˝¤÷•Fçú®ŻŽďu5»ůă&ţ'Ś?rC´@I€ �&0p�� €÷€8H**‚‚ ŔL(&…APT$1 „XńÉ5»ëŐÍŰ^şŞJ–f—Z­yü~%Ú¦‡bô—jo޶đí?ĐĽť›ăÝVôăá@oŐľMÝ+±ü oĚî ĽŹŐ©Ća&¤›¶ÍtýřµdGßÍEyrAšoř§Ëůą9Ya ×>çż(JÔ¬:Ň<ţĄ:E¤śń΂TËjJ€ ������H�Ŕ€ŔHL$ ˇB(PN ˇAT$3±â©!׿k9óMĹ…irçăÚęI49‡Ű'őUŁEĽ˙™ĽţO{Ki@˝*uĂ\ż‡Jmůëű5ű4Ažůěűç˙t"»Î9ToÉąré+Ť»bUÜó*x|ţaoVµSZ†ľ~Z±‘jˇlťBgqw鸡ÁóѬćŐzÝr_ …–Ť@@H�H�"��,��€X�`H,„ ÁA¸H* C@‘ "Öľskë)5ş—ĎÍÔ‚ćř«×ŻĹÉ8«ŤĎhŽŻF>ź§â} y‹oÓi¸+$~5ÇËą”Î/´łű.¶;ăĎŃîp˙DO§˛]Éíµ<í÷YÜ…e#üvKóćXĆ÷^Ü×r¸ ţ§ZŻ ÷z4´ÔVŃ0mJŔĐ�L�€� u@@� €H& Ä@°P,…ˇCEëńśůîďŹ9Ń–ĽDµAw=ľ˙çečr~ŇoŰó¨~:qÖÚwCí7X4ú'MoËtł†—§˘Ă—k1óď7oÓßČ܉óE˙a/†t7ĹŞ•řʬWUq~Bë:Lw’_¸&îÜÍ&Ć)›E«O"Íťđŕď%L[0€ę�H��ąU¨����@�\ €FW*2 Ăa Xh% …a@Ś(Â!0Š™ÜÓj—EîLą"‘šÔëůăK‘c¨|ďŘ›)îé>‹»Ičűőó JzqĐ\ęč]qžęú©^é®/{őÎ(ępűíPÔ÷ßŢ™™˙•ˇŤÝŚŽú ­\ÍW˘ëż Hc ·NňmžYB‹k Ś÷ćút19qĆ&Ü÷oki `` � €� �X��� ¨�JźţŚ&0Tą’¤I‘‹«ë_ó«ňŁ+o}BcŢŚ�ȰlŠ\0BeëÝ$íÜš(®xŃ:)IGO—†+šş'úFŠxꀦäÜŁ9Ę5{dhŐM´Ë“ô|kú…Ä ť üľă Ćď9\®ŃVV{•©ŇlŇéý§;¸Ü·ş]Ć7} Çk±Çßił_đńfŠ_ÄÜńFyh�ç,h˝Ŕ�ő÷˝Ŕ� á@�!Ľ" Jźţ‹D,šĽ™­Ýő×űËč&¬Ť­‚ça8şŇżżę};ę e­€Ą±®ů·˘ýŃr{ËßOžżDőĎyY/˛Żu^ꚪüóőU—§ ±I¶OGÁ~Ü ©ü‡qjzµe\h«Hďoú—«Ú×ŔË9@şJ%M˘ţ4ŔĚ'řÜ˙ţM«ß›ľęĎ\çźZĺôíײ¶”ŇZGŰAŃÍѲ „A F�‘Č��¶Ŕ$��`Ŕ��hŽJ×( ‚aA(P* A°\, ‚QP$kÄĚ˝s®=p¬ă9á}Ë©WMoWwŻâH¶‡'ÉGŰü×Ęř7ńĽ.Íéţ8śđpő}?•ńDýçKć ®‡Ĺ:ţOÎkăĆŘݱđţ‹7řÍů6Fä€ÍđÔŕ6_]K§–.ąTzat÷ÎŁ¨Ţť„豇&``˘ë@h¬k.…BŇ´Ŕ*�"�T� €�(�`@@�8JH& ‰A@°Pn†P°P,! Z­řÔfĄLVłzk˝U©%ĺµ8ý˙X’4984çô’×úďđiľ”ëž\Ѝ žÝűä\Şjażű5¤ü'(‡ËÎÝ�e§ř'ě;;çË7ěą‹±—tę9w>˘"'I»sÔF"ˇx—ҵ›t&/äŚč©K´s^éoí2+ţ@8BŔ˘@`��� ����@J* ÁA0PŚ…‚‚` ŘJ „„ ‹ßž~׬©9¸Ć’ĄIš’řý˙›ČŇĹÓ§|ôßę{ EwýÜ7‹{ÂnhVmŇnÁÜŽź‚·Gń#Ô"ßUšď``yń¦žî‹}ŕ$č¤{f‚8­ľ¦IлɼŠ-j ~żňuË ťű)Űa8ř¦Ş�“4ąS"ň4@(�€ �� �p €@H(& B` ( ˇ@ŔPl …ˇAE­ç|sÇÇĎ »ľîµ»«Éj»ëńţ$TXäňy—ĽżţŤúç{`Ö»V÷6✏_áß9 m}~gHćŠm%ţ‚˘÷Ě3ďôüű€/Ö<tú”śŻ ý}iëVéŮśőű ×9)ŠŞ¬GŠ~ÖĹ(n'M 8˙|Ő‹ą:βŤ•Űś Äµ�¸`�����€X��HWL Á@°P0 Á€ Ô( A3uN;âxÔTŞqµZ¸ĄY&Ľü~ş®7§°Űö—ĚýZ«Ú|oŢ2ýKěÜK€Đu wüŰ®-sÔPÔEÖýĽďľżˇ>®ŠĘ–˝;Ól~ô˙ ŃťüúŚ­ópĘkzĘŰľN*;~;6žÁpňÂÜm‘5-Ëźş«L—•–{,8.A»Q0" € �P ��*�HźţŚ&h”šĽ‡ ëŹ÷»č‘84} 4ľ gő-2Ů“ä>7ŻÍe]é Pn ůSiYHjd—™®oŠx××-ĺNăµpč~™^’§)Á[zŻúÉhLµăČŻĎ ő”ý‡ůşÜĽ˙o#rËkQ‹^ů¦·yă5\6žsŻo3–5Ň»—hÄľ§—ÁC&TîP©H´ ć� sj ��îŔ���;€��&�¸DŔL×( BA¨X0 ˇ@¸T( …B@D&kz÷yďŰ™’9­VŞ’śMËeŻ]>ËKhrxď¶WşŢCű/Î}zx‡,ÜjmNqňĽ;®Ö ¨7žÍ9ä÷·>~ ťôÜ>Ý{Řg—č~żčőź>ÓüŚ˝ĚIR˛†}+¶[S }é´)1ţßŢĆ|¶ú6¤•®˝{->/5ҢĄ.DbŕLp��€P��(���8NW, ˇa(XH2†  H&±•ÍĄ<î«"ňJK¨*k'nżÎ.\±üm˙ďĺJ{ŹoÓýŤrę'°7Čű˘÷üŹ,u?¨Źgł‘ď’z}qx¦°Yî}\.Ű,BĘO›ę!zžŃAę�Ć5}­¶Íę†ď›ˇŘq{¦šŚ~Sá-¦ŕ–Âz/DŹc´ó$S‹¤ŁúT…ÄN˘—ŕ�*�pŔ�@�€H���ŕNźţ -TšTľµôâĂ!ŽN*UUswXůµ<vŇS=sĚsß?Ë>ţĚ j…ő’*Ť’ŇĂ!ÝYO•ń‰{jň8Ű.ĺÔ˛ xřéüM Ôt2Ý|Ę `Á"ź.­Ô üôšR˘‰ + ±‡ťË #Ń™şî Żh»‡%MöF{űiÝűŽ^Qj@ĎňíYÝR$K盫t}  �<ü ���Ó÷Š ��đŚ����ł€€Lźţe$LŚE5’úăţ˛řß+“śôÄű&Ŕݔ⑹+”TrćFÄ$�z÷s–šúéńŕ·±ůłî®µ÷żźWĽůQÉËŕź xüR‰ĄÖׂ´â t^|Öí?еľ°.ˇ(¨®¨-şPg¬Â˝@r*ň%é¨yüú¦˝‘KgŞ%ÇG3— ĆČ@Ă7ÎńČľÚť*Ş•1śŁ „¦�™˛ Ö��6��� DN`���L×(*!‚ˇa T,$…ˇ ¨HBÇ5XYuZďL—9Ő-HĽ×ľżÄ«®7ärrzůˇzŁÍłV—ÓźIü–óÔężórOÉíźşĺU·~Nz+^%|î)ŐŔś}ş­#€ŹÓłĘż!{í^Ź=ľ™Sźă-čßő-<Ł}˝'}ţ˝­é‡"ł©îŻ^%l$¨Ü …”Ż60ĽS4¦g†Ó e„�@���¨���Ŕ€J( Á@X(6…ˇa TH2 „\Ţů’şîîŠdé›Ö˛ňRâ]ńőţ—Quc“†ř;WŤźűý/úß8ĺ?ÁÓ%é[R|lźAÜuÚ•ďźżöŃŽ}×÷kżëw×΄T|8<Ü|:hďôĚ1ôÚúęä­Tó|dť”¸8’éCąMSąëm´ěĄ)[–e’ ĽŔŔ �*���Ŕ��B �`J(BÁA0* A`ŔXH …ˇ@T$±ÍsÖ]÷÷ů‰~-.r’č‹Íj˝ľ?ŇZ’Ož«ý)ĎŕŻéú×D«Ńý«˛Ňýôůô_Ó}ÎÇzřÚńNĆ>'őËĚě´¶1nÝÝ‘óú˘ ÎYż¸ OrZ.ńß>”7{”]ŞEůŰ{®ÔĘgý‘śwżtĹ$߉•a��*�‘aP@��€€�@��8J$ Á@°Pl Áp Ü,"‰A7˝č˝ÝJ_ަő|Ý4•RUéńçýŇŞ49>˙¨?÷ëôĽ‹{čöęx¬NşO٧ź˙ořĽÇ ťž›AhžďÓř[.ת‹¨·ýńmëń”…|óřňú7߬›*ťtăŮá1˛ŮĽ]Đ0żĺ';˘ąţĽÝ»ćŢZ&Ř™©­)‚$&  P"�@�T�€�.�pH(' ÁP L* P X(B BAąćşĘŤwĹ2ˇçťÇ •š•w<ő˙7W–“ÄÓÚ˙öř—%ú›WćőęD ţjlőNţ<Ő=zWŃ Šţ7Ó›v3»ůOÎčŹćř—9Đ=+‘Ą/'<·÷ËѢŻĺţ26tËź‘ü˝Fż }j{’ľĽ¨Ţ6ř'Ď© ÖH´ţ‰Iâ.?0� P@��°�€��€€J(6 ‚‚b XH6 ‚  Hj „Tí—ľ˛Żz_ŤUIyšJşÍ$ąçăü­š®'ýüÁřîÝş57ĺßßí .:tŚś#îúź˙ŢďŘĽSő/˙ôççŰ‚(µôMŇo: ¤„+Áě•Çsôôu3ĺć Ý˝y{:=ˇę”_C§EÉe×ţEsAěÚ7ĺ;ĚEHµFi[{řáQĆŔňpp€� ��@���LŔJ, aC0P* „‰PŚ"§3żŤîë]ůŰwK«¤-YĹVµ^~˙ét”Đä}żT×éúݰżĎţ=Ó…ýŹuđŢ~¸îŻă‹řň_/çŘ|ńq¨µnkGÂć¨ő#e?;{}„UŢJ×%”›źW·—úxŮJgŐ!W®uPw;o°"·M«8j0jŐ=%üp b‰zǸ Q�¦`3€�T��P� � €��8J( …„a XH& „` X( ‚  H( X抺ÍsÔĆ%]Ő\ÝŢo\öëţi"ŕää«©ďűw{ďů‹y´Wň!ůפà Öa ×i|ËÓ×Öbż˘%—€÷“ŹĆÚB%˛Ş(űłsKË[Eíř§mw‰>P§¸Ötp Ă65ÎwŃń=Ś7ŁŮŤ.¦ăł”řJ»©D)3F#r€¨€�� €�ŕ�¸l�.�€LW(…Á@°L$…ˇ` Č( ‚ˇ ‹Ůw—Ż;]K¬ąQ•v»ťuţ’ŇÝ—0çUžIů}ÎËu_¦ŁĎë¶N°Ť¸őCW¶‰ýi>Á»„ő߆ýsÚ-»M˙ e‰ëߎ´őM¸u·Ě0Hfd޶qË ő@î=vEĐűźăâ?ě`‚Îóo˝2"Éu&j­]KA„‹ťÓ‘í?„ŤWŠ@Ŕ.���\��° €@h€€Lźţ‹Tf†.­ZÍ_·ű]đč“1‹ýfŢÚ]iOzky%]ľLo“ĽtIÝ}öŰ^|çöďŐé6ÓşZŻĚwŮ«ÄRę …W‰=ÖóafW7Ź“ĐC°©ŹŠë ˝Eé[äé�źÔě3ĺtţ÷ŤĹsŰ).|iŇ®„őÁ7ę;ző˙s‹¦i‰Š(Ëهˇ�Ë Ćđ��řF`\�� zŔ���ć��€H×$ †„` X0 a@T,A@…ʍ»˝Ô”Í]qÜTŠ•­ëOn?ÓŞ•©ˇŢ˙7¤ţ°ű6Ůţi¦ů÷O;ßíőÎî#~˙%Đ^Üxś‰Ķb?nȤŇüçđ9ßA�>ve„v?ďwŐIH˘˘˛Îx3Ľ~ÎWő÷µ˙>Žâ:KłŁ˝ů^Iřş°{ĺ\.be h,á� �€P@�D�@���°D�pP(& …‚0 ™ 9…C3u4Ď/ZÍsg«†IWĂĎ_ůeÔXµOęçĺxŰqúŹćżC˘·Ývú‹¤ÎÔ"Zű&›É"µ u1Ż?Ţbý`}˝ńJżoŘh÷'—gmř ˙ĆČwۇęo}eSçăúhüŰ ńőö¬#5G:VŁzę7őGM Ëó~ušŁ ň|@Ŕ�,�(�����uĹ€�ŕF( ÂÁ0°Pl( ÂA0Pd Â,zĘâVyď%ć$‘t¦“SŹo÷µîÖ9<oâ/ć}^fÓüţ˛ßżŰ÷)&€KlŢŚş«oqNľ‡«%ójá<îQQÉŢîUr.ŰvđĹéĐ,ľwÍĎÚ§zzńł_±ĺ'Ŕř·Hd;’yěiťhUK;Ť—ěŕ "c™đ»EŇ:pTOŰi—� �@Ŕ &€�@���8HL4 …Á@°T,„ †…`P*cÓ\×ăĺ7ÖLŞÖZśV]ĺUË·ßTIˇŘsíoҏמÍĆÝO;×+ç'ďś­ßUu=]¸Ó‰Ő´ípŐ×tg·Ç ‡TĹ:˝á|ĹϡĐđz`>? »ű…o—Ü;ĺĺ5•@MtÝY¸˙ÔTŕŮ~Ęă1ż*’Ę3y Ý_&ĄH…{€� @�X��H�€�ŔH\�ŕH(…‚P°Đ,T ÁET"¶űÎ2"Ż k›™Ş™ÖÔ’îqíţéĐäŮ—Ť˙/nuľ¦Ö_<ő$âŢňŹíŰCę”Ňçűđ^şVżZîßHůü‘–ţ€#ş$MôŞmoIőmşUýF:ľőž‡™Ro:aĐܵá72řë|ň‹7čU0#}¸»ńDĹ ĘK®@L™oSxËrĂ €�¨�" ��`�*�(�€JL( ÁA°T( B‚ ˇ(%µá[—Çs.¤ĄäÖTSŚ“Ťy˙<TҬv<š6ř|óËŰźH˙ó±~đż˛}ôËO/>@/Ű’đíIcoöKřß˙ô ˘©Żľň.¨¶]Ű;Cc:ůH!DSĐĹqń5sŰéQ˝"H/®ľŻ/W—gĂBîl8ÎÜbŞ*qk­ŞŚ›­utŐ P�¨� D�� �.�� �°ŔLL ĆB0PL! C7Y»¨•y&çśeJ’V8Í/ă_ónĺŽN°ňůíżç}ą5đĺÖmˇ=߲Ę?ů§ý—§Ĺżűx‚ZÉôĎý"/ÝG/áŇüĐĎŢІÝăôÜeˇ_†fí>ůN3mĚ“ÓÜ7<§dIx%ÔębN›c-éíú'_”®‹éÖkB%¦Ć‘R�&�,ŕ�@��€�\��8J, ‰Ă@°ĐLD…! Ś"‡|xÎ73Ű׼Ľ›â*ň/MO?Źđ…Ŕäćn5Ü÷Žę;űlíŤ]Źłý|çň�Ëű]JGŇ8 -m”o6 řGŰ~” Ç=ĽŹ¨_g‚ź2đľŘ&¤Żçu˛Ľ„/®zĎ|ÇŢ;3”Ą=™ř7.©"ZĎ{BZ࿊¤˛=]fO5’F(Y›W'Ȭ/\� ���,��€��� €�ŕXW,„ Á@°PJ1 ÁAEŽ>u7zČ˝µYŞ• µBő××᪗|Kěěč˙?m2öt˛®}ĺČßÉBßOőń±Őľ›ę“MKú]ďô>Čř5U¤-Ö©¶Ř;wŃśNŠ{ĆŞčß—µÝÝ}¬ůÁüʨ>‚ ȡ�GF‡%ňŤć0e˘-˙>íoç«ĹGhW‡ -Ď”"D­¬ �0  �.�L�*� �*�8Pźţ‹(M iQ’y×űk] ëęJłr-‹.A(WF÷Đ)µfíÓńď+/¶Š,ŔţŮ÷Žä­ĺÄzŠ€j”hEnDë@Ú7c)Ŕ;Ď‘§e˝Ľ«äw$!€…KđĺźÓĎ…Zg�ůč{đ›íŔW¤ .^„€3ĚG%rđÄCŮ „¨'Íp8pa¦óíŘ­F'«ź‰CV-D íD@��ßuá� �.5�¬.� H×LD„ÂÁB0T( ÂÁ@T0 ÂAA _;Öőš}˙m*ę¤Őw©yąSŽoZ_ëíĹÉwSůBđŰďűÎÚľ'ůaÚýOEÚ{Żâgŕá?ŹĐMfŤú;H©đzĘś\ŤwPŹ#útÚűč®v¨[9°‡ĄßĎßť˙ĽZ)ţ|qŚ` `ĎOy7żfĹO‚Ý”E›^¶Äh•ëšµÔŚ`× �l-�T � ��@��€J,$ Á@¸X( ‚áAŔX(% BâAH"Ĺ{ŢîµĎS2ĺU[ʦ%"^Ąý}~*ęóˇÉV˝Çńq»šľ~QŘ~Q÷ ĽĺcN˙«é@S;Ň8ůM꿀=5Ş”¶-ô{K2“żAŐüĆłBÂ~Đ„ŕľLŐś‹gřҲm'®Ů«ŠĹďŰZÍžkčÇřF±âëXĄ–é#ť#RŐAPH€@�@� ���T0�J&)…†` Ś( P ”(BEö™ęFֽ޶­R®Kť{}˙\.¸ź­ŢíÝŇľŞ:ńěíźÝŇ]CÎOľvř€ßˇőźďď ÷ux˘›aűźÂj”ŕÖśg_fCÝEf<>>żAD`‡dźőąĹ_#UBÍíK%júśX+ŞjźW­´GǶZ¤‰ÉEëĽöŢ5LóŐ2î©Fkh=Ŕ‘�…Č€�ŕ���€�€J(*‚a X(& ‚‚Q L. ‚-zśë/ M—•"Ą©/+U5}{§ RAɰ§uާíËźxţ¤?O™?_¶ŠÍÓŹŘt.Ý…w˙_fĎĄźpęÍČ#ţ;Źź›]&‡ćÜěűQÂĎŽţ’'=śD7ş›ő9wDWl¸¸Ź&óÎî¸ëĄęw4žá˙;%ŁĎ•L‹ŰbsI“5d4Ě,~  ��(p� ��€@pŔJWL3 Á@°P,3 ‚P ”("±ă.­Ěş’ůŚ»śÜLą’eÝű{‹F«CKčŽs×ůÓŹçeëđ—FŽ3|ă•k?2RçwÉć}ük÷1j”ôo#ľ_žć,ţ5$şo’PřĄaÝâ/\kÄgÚg(C­Î*żÖÜ­ETvHŃúłă÷«lÜ›ÍG:5÷čă± 4(Ţ–ąÇc¬çŇ(,<€� *�€�$�ŕ\�� �Jźţ(,”‘21j˛^˝żŰ‹Đz´Oé*Äó=K­]c˙°Jq·ă_©Ł˘zş[¤ˇHYŕR ¨zD9Z)§ő6°Ű{ gŐ«ß]B®şB˘Ş>ľÔަ�#�ŕHu¶PAQĘy]ă]P˘†%Ś;™Ŕ+*7ńţV­łŞÝ.d5ŽÝë–“ůpÓ¬C«;çÁF‡¬k@8ä ‹áŔ�+  ��‚+@��jP¨���€¸pT×,c‚á` T(& „ ©(# Xç<űľ»Î1¦k7¦ĽjKÉz—řűęřÍ\¤Ľş´KĂ?^ď·Ř˙IúĎžę~ýtš Sëôqó˙VŤGĂ/ęŮ3ř(ÝNO˙Íň×p4żWÚ˝ ]ŃŹn ŚĚeţěbfń÷B׏ŮUŔřxńqWEÖµőa[ŻÁ˝ŮżÖý˝IHם‚”SŠr(iY�Ü�e��¨&�ŕ.L�`�P�� �pH,$ Á@°n áP H* …¡A(L"©ă™I:ÜŁwl¸¤¤\áÇźöş´t:™{űź˙ţż y˙ î řý‚oîQ»Éáu´űߡŹq3ăs×ýzÇĐÔ©?·%ż—¦^Ü<mŻ˙dż¨8ţ˘uŽ*ČźÂÚůűWŠWw ˙ń kť\ŕv(şjĽŮÚjŤv¸é4ýÚ wJľşşLâ&€w� €�¨�@ �p�R`€J,D áP H, ˇ`TH ZůĄç ëÔ±UŐ_w‘&kŠëë÷꺜οÄz»‡ő^AĎc‚sODÔđBżݵ˙îî>#đÝĚĎkŹźç’?¬@źűďFľ~Z]7źU!ąBGű›‡Ćxź™~ÇV%ú¬c,˝­PZţVíČżÍíëé÷ä7lý‘-{w#`i�%0�* ���\€�âŕ�@€J,H „‚` T(7 ‚  X$ „ˇ˝Őľ<ď5ďç"ë|JĹŇJVó÷úö’®¸śÎĎo®Ś˙˝ ż†~ńŃ˙ÔKhž×éő8ń.üyăçáµAţE˙5Üč\aÓ€ßď’Ţ­^&Ş©çEĹ„*Żß¤éťą‡™„ítg“’‡Ź`™á[‚ZĎ«ČMnŐÜR‰8›ćP��H�@��(��.�*��8J,e ˘@°\(" …AB(L$1!„P÷©»«ÖTšĚ˝ÝY(’T:yü~şÉ.¬rsMľţĽĄöëktľzB8>îíb•1ňđă§•sßăężíť>“iđ)ü;޶Ů˙$můl őţÚ'xÂ-ÂÓxđ™nwď”QĚę\réQ‚&Íu'JfWÖ;’đš&žÔůeůLËP<@¨%��€@�BŔ��,�Ŕ�€L, Äp X(‚‚`P,…A@EŽęŞtńĆKÚJ]eČÍ&jŻŚöëţeC“ô?O7uškýE;¶Ű/=ŢÜb[óöJBţ[h—uSÔ@zKEÚťÇ ôaËöĐß§8Áúc‘E„<&ťÁz6=†ťÂXypŤá{^1ÎÄトђeŤjߡ‡ ˙·[É.mryińŁqPsD�€� €\��€��"@€H( Á@°,4 ‚‚` X(r„Vőťs^Üâę&^]^ŇT‹ËÍiçĎűˇp9?9~ÜuřšţëĆ=~N}ľŐžĎŮýA|-M–ű­Lýz¶/őOţâWE\ţśĆÚ ®ťAzůíţ®.źĄµp[Ŕ“?€¨9'yHúĄŕĚ'ĎŘ.ůŃŠ…ÉéĘşżžÁŚFnűŠ\¨ Vż0§P|€@��@�€*�p@0�ŕH,4 ĹA0Đ* ˇ` X*…A=LqT¬ó—ş™kÜĽŤTËĄßź?ďQc±ôUÉ7áúŤűţy˙ó ®Ć×·ď+Ó§˙ďÍ{şrŰ>”^Ťą ă†ůş;=ígĹOWnş÷$oł#Ř<�xÍ _2¨pę7ěʢ˛¨ ß©ąç˝ůŐq&Ôčô{ ĂŘ\Ů!*ßé@-ł˘ľĂóÉ- Ö!ó� ��P€ €���� 0�8J,d Â@±PŚ4 ˇA‹«Žnó|nkťRµR®˛ÚÝÔKťy˙ŞÎcą9uËÇČMÔ[t§°t®[}YŮ`Ý#lÎSěÜţV.‚Ą´č×ýŹűXĺ%Ü÷ţ˘GBC°Żě…ýäpăü¸Ź(Ôŕđwů–v¸­FţFsw:ß§•ä*Eţ-uw,Ăń·LŞľúµŮRxŐĂŻy7VŚĄ E‹Â` �� � €�`�Ľ���¨ŔJ,H Â@PL ÁA°Pâ×­ß~ÝüxŻ<ޢĹ$*&§źo÷´Î7ˇÔŻüĎáěńĐKďËdşßź_ŻsRˇü?˙ĺ¸˙Łé˙„ŃSMÚôQKő%Ń$»óŰÄ ö©+f[žü<ăˇČ ­ŕ «ÍŁĆogjîŐÜů.WŞY‰/nÎť:‘®í±ęlű»ďÉú6˘ó†”MÍ‹0L,w€�D�€î`�(�p�€J, ˇa!T,J…A H"ÇĎźZçŹng«˛ĄUÝ]d—»k+‡Ç·űŞ"Ç%ű+Úúź°ýŢşzá_Łnżží< čkŹűý·Ăî–Ý×â o79ýť/âëčřłz$·c»{˙°łń0nńbm! Ý‚ĺˇç)¸ŽÉĽÉľu-mÝ=5ëíg@Ńŧ|fZf`Q�H��€ €�@p�`�(�pLW, ĂPˇH6 ‚„QPBljťwzďŹLdW ™eäŤę_·źöDąˇĽYĹ÷këű'˘~4~˙ăiŐźÇ"§ÖŽ|÷Mń?Ďý7čz ’Ńu{ŞŁe’µ{˙ÁČřýŕěć/ěśZR0§Ť›rOťđO¶řß·XKÍçöŘçÜÚ=%FĽQß PknÖM• Ľ˝Ą‚=oŽҧx©ehÄ‹z�AP����@b@�T �€�ŕLźţŚ0XÁd‰HÄ”‘zö˙kľ�emŕIá÷ŰÄ-9§ ŠAjžÜĂŇ?ëW’|g¸ätbeWíeţëń=hŤáĆ+8­w‡™§x,3¸°¦ŤX{uyQčVâÔ˘Ěj©z˘š@ŽT±DgZşOv‘PPBႲf‚Ŕş­/=#׎§W<1`íúPaŞŐN;ŢŚ­× ËęŮumř€ XP-"’;d0�A9ýô���羀���ßz��D��^ă€R×,ÁA0P, AP°T(& … HBÇ»Žă­Îx“ ’üpST—š—í×úZM,~ŠÍߪ|ÚďŹuÖěÔż°˙eŰt†OŔA_Ăâס+3}{cĄţ«ŇzxĂ]Źń‘ťŠ÷É`ĎŔósą×öpáĐ|aÝáRLë‘ 7śEJ<~6+íöÎ+r1>ŚB)¸”ŻG0úI‘6  ����@��X�@�°�pH&Â@°l „` h …AEO˛űă5—Ďlj—*/d"VŞjřö˙h‰,}Cő…Ů'sţE˙ËBűŹÇ_ů([ń?°ßţĄˇ˙_kwŃ ?Ę̸Oμ➏Ú@A Ö ň;ť«k–Ü„A6O)7î~Šŕ|Đa˙q‡ŚO†'k®ô6yzđ‚€5˝nX!ę©IÍ(6ű^| ÎÂć�ŕ €���°�.�P �8D,G †b ŕ(& ÁQ L(±úV»Ňéľł[Ţ—SťTKĄj®çő¤8 ĘĄöŮčúĺŮ›Wç4ć ůĎmđě…}´±ş}v'eh¨ëßĂ~]ŚýĎ+dÓŰŻ}'ŕ%ŇĽkTf>`�ÎľŻ/µŕă ›gÖµó׍‹éž!ŠP>Wţýµ<šťYýŰ[R\k™tÔŠ×<ăXt©„ń€p0�`���L�D�pJ,D!@°P,D A` Ś(! Tő­|ő»çÚł&UĘş˝ńş¸•¬˝=ş˙©*H;ŃĚóěűWő˙çżúĎţ]ş"Ćo÷|ĘŰÇŹí˙î®Üsj˙C”zĎďň˙d .ĄźžÁĘ>]đ[</K•ţ3áÉ˝ĎgŞěĄýdü:";T(/řšŮvƵVŽż’¶‰^łÁ}ş·y!|ďi< °l-BëŐŤ@Đ� �D�����P�H€J,7 Â@°P, C0PD „X÷×3ÎÜőŢ“wО*.Rę[ŰŰţQVčrĂďÓ˛}m¸ţ×jř©}ţ§ţŤě»Vý%äĂ×Űű®§táŠO€ĺgŕÄöľ4iťő-폾Ő8t}ßôŐ~—ý ~:o|Č.–î%—Aäb Kď%DÎlĄ®UÔskaěˇîHn2xiĆ’Ą[˙k#j°ÁÂh^ŕü�¦��@��°���X��D�ŕH&„‚P°ĐŚ% ‚P°P¤ „X÷ăÔ뿏˝Rb­*)RMN<˙ŢnI,uĆ_ßü§ú†Ë{ŹrÇŐĆŢ‹S$ÝXâ:+őŢŠÓwŃź?,žvę9čjv=©]0ťýľ;ďôaż`xËpI÷O2ÔS‚ň«t};ţaJ+““#ďďřmź1şn]pÇž˘ÚpëĹë’–Ą'ąhSEďń…,(´@Ŕb@ŕ�€Ŕ�p ŔH&!…Ă@°p „„ ˇHBÇ«ńsXăÇ2®ňUÖ©‘5/ŹŹűŐ]Gaţ5ß÷tŹćţSÄiÓá[<´-ßr›uÁôźí˘űŽĆô:5Ź:°1đ¸vđĆÍ(%§«v‡qĹĽˇ}Ů~T˝pţ9Ż >ŁËĹľ9WÇéšą‰W|y­¬–VóźJfc˙7šS ›ˇhÂß1/Ü@"�€°�����P�@�ŕJ&*‚aa ب „` ś*±ăkNô©*šĘÖ$RUËqř˙®TZÇ'ë«ňý›ŚšnďoqŹÔwňűO:€ăŃżžůÇ ľůÇ•©~Ί7wOWěŮŰÄŠŹý-DqrĎŻŞ‘ĂÎo­A´ňiďGËý㤭ĚXč°{dH“ ˙ Ňĺv7¶RD6Ƶčé•čçĹ/¨›»Ůl¶śP-ů ô b`Ŕ � �X�H�\�J,( aP±P, B`Pl8„Â*{˛ć˛¦k]‹UI(ş’ů´É,r[Ňż$Ť ]ľFN<ţ'ÁF˙LEĄPűč±’íĂŐ‡sđQôD릀ńO·Ăcüă—~ßá}”ć!¬~{ĺc` éZ|Nę^CV”Ť!'}ž4ô|”Ł˝ntŹň^˘JÂY뤺ëXż+ü˝%µ Á„L*č��PZ`��@��€€J,( Á@° ( ‚` ŘH ‚aA&„PđçÎ\o|MÉW·yޱQÓŹ×ý.eK¸ÉŰGäíă7đ ž„>Öôh�¸›Oé'×C~É×I¦Ń§_ŮcěŰP7ů˙Řzš?·G~ď‰ńżóßş�­„3űň¦HÓ‹řđewÉůĎsÚe… -Â~nQçęĚ>_‡nĎÉtŮ|-űm2ÂUv \���b�€��� €`J& ‚`ŔP, …‚‚` X(5 ‚ˇ»żU8ŠßZŞqŰŤÍ*—Ť[Űńüë5—,rŠýLhéůsţüdŢ[?ńěôfqď°Ňš•ďŐô5˛¤p/®…ţwY˙Ó·â! Öcěľ° ÍWdLëOÖ>5µ*ômźČ%t¤ăDÇÚ— ~Ţú˙Ç) ŞiZďd‹N><mĘp’Ő>+—ś@˘���$` Ŕ�$�� � �pH&* †`ŁH(Ba>[ĄÝ×}R)tk3ЉY©/_÷•Xę<ÜĎüýôMÝ&Ż©~:Nxw{uTÜźA×Tú<] ü;úc†Ńűo]˛jă¤zNgÓěyNóż# óMl\9ÇÇ–€Lçđˇ˝ö+ŘF5ŠWŰT:řŢhŤf–÷ÇßWqRäCÔ¦ÉG.T¬¤ČZT™, †���€‚€�� …��@J&Á@°P,d Á@X(2 ‚a=Ůf^ý»‘‹ľf¶·Ľ˙ĺPŽőú”ňőţv ůŔëúušľĄ7ż·}“Eç°ď»hĹ[´ŚÁŁtşW´żkâ…jÚ#CW}ĎÉ˝[¨iHŤ9Đm�“kűw;Z—w¦šÚŢĐx>Ş‘yř4»ěöpr­ä_f«Ć{ŔqKÁý‰ PY~ĎW *7şT/Ŕ�v�.�0� ��$��°�pL,T ÂÁ€±Đ,% ‚P Ô$©á~:ĽßăqšÜş^$UďY5<üĽJµŽĂô1·>Ż%:«ůŹ×Wć*óći*ő\‹w‚ŃĹđˇ·ó¦J%ż„ÖŢ:{®f{JňĽ8ź©ĽeÂtďMw)zÜU‹¸ĎˇÉ̉IĎßŔ¨Ţ¬öw&jץH7ŰqťI–w¨ č“ÍŤÝ×ĚáWY-Qí}»Íňšúq…áĐHÄLÔ�\�ŕD� ��&�Ŕ�ŔF( Á@°P,% ÂQ0P,% !BaE/š¬â§×—SČ©"ĄJ˝=ş˙ĘŞV«CGÂgÖůńęă˙ëü‡‹iž\»čąŮç¦II<ü'âľ­joĘÔř8[ăĂ®˙�ٰč?XŮ™ŘÜľŃ(Ď6[ďô;]6™VĘr§ÜÓ_ŽŻîñ;#“ř4€Ú`¸ÜŽZ#/vf1Ř´°/»4Em+täU’M/ŢZöŹÎP«Ů©PJ3�`P\�€��P�‰€�ŕPLT …ĂP°Đ,AA0PD![śÍUMoŽmy2Z°šČB矯ůĄ’Ç#ú5>é>>‰¸KÜź˝t|÷ňý_Ň5˛é÷eŰQä¬ůypđˇă‡ xY ăŕżć_‘ĺ߯…Ő‰†—1˙d”ô“Őűţ‰ţÂ$>CsĄŤČŹyČ€HÜß )ŚŔ޵ŘŘŹĎúŹ<®†ÜmÄť#·ř™Xč¨n�@�L €�H��€€�,�L,TĂ€±,D Á@°Pd©ăŹ Î73¬™(µď4“’ďŻ?ó5I,rU{x]'g±˙ýý7rţCM‡Víýhď ű&ŇYÄzÂCĺÁt×Y6ŁżbĘ4]˙g‚„ÝŰé ,vB öÚžîQMf ·‰ń×ĺhî Çc–2=@Lay]´‘JárHúyÚ$l7EÇ%NđVG!ÉP¸Éí0ýă6-µAM�*�@ —Ŕ �� �Ŕ€�NP&އP˘B#ˇß).Qm¤®6ÖëU{ş'ľżÂ㉡±ňquvEÉăů›ŁźJŹ^ă×lÎüĆŞüÚ&K˙˘ó?;™}ćéöŮ9źŁ9•=cöÎ ]÷Cý^hefţäcBÇŇc�ř˝<L5u•ÜĘ\hţ_ě$ńĄĘź Ř-á:7ÍúGzBU„ž4§‡l]`ísż¤�€.�€*��P��D��pF&1…ĂA0P¬;A@L"ˇóńů<Ҳćď!-Yi%UÓ‡·ßőI8®‡'ń×ď囫·Ă»F]ü\‡ŤźFy |˙¦źř÷Űčí’¨č߬$Đż©«&ÖgŔÔ˘NcąF_IčĎ—řw)šńű}?i„>†”f”B){ôúŹpFÉ”˝-…]żÄ‘˙ÖwňĆ}e;—oÜH.T‘őŕ@°�� ��H�L�°�J,( BBa Ş1C@EŽgĽřńíĚÜ&ᥔ]KžŢß⥸ťŔ¶ö~Ý@I×ď+´ůľŢóëř[qtźá>;±e¬űřMčˇŐő会!«ôq{˝ĐčBôÇQÝz|[®!ëH{ˇiÓŰP·ĺEkPôćÖ†ú‘ţć(­ö­°Ň†Eä™ÁĂ“ î\ŐjNj[Ň)2÷LU� �Ŕ� ‚��P��&©€8T,t …Á@°Pl‚†!…Žr®´ÎĽ]ÎuS#YRŇŞH⽾?uÜę çCě»§ëçĺë׫×vôüw[řHözM(.ýłú_Ő9_ö@5ŇK©ú®§·9Ëżżńc¨Č7™î„ńôQIřmĂöµ R3…+2Łđ]‰«mťIó„®±t"¤Cĺ©ÚYoęčtäľú_˙â ʇ˘ @� �*ŕ�ŔBŔ°@€R,$ ÂP XJ ‚p¨Pj †! L"§ŚăqµjS[ł. —V]ű|6Öu–ÉóéáĄ7ű9yű1ýg�ôĘúRÝÝÁ˛ŢĚ>QĘâüďz—đŽý`—kc\ĹŃëĂ×mźyW6“!µv$ łán%fVěč…nš \o9ą˛`¸7íÇĚâhĆ<LŻ+'�Ą˘­€R �`0@$��&�¨ €0€L,8 ÂA°PJ ‚‚ ¨H(%„Ä)w[׫˝Ő^\ĄÎxdL¸şÔëŰţT—Z‚nMż~Fą:pŤi«ĂFc43nÄ_·—ţ?Ëë˙ »:ĺ$ ÷ľ®żp¸¦Ž;Ą)ôŢ0ŠăŢ€ ›šł·9šžŽńň®Ë:Ó «Ő/>Ç7Ą%.˙ĎM‡ęÂꀗM^uŰ‚Ż*¸Ŕ”�Ŕ �¸����€�€J,(  á@°‘J…AAEŹ~=}W®šőŞkq-’÷¬•S­ý{µÔĐä>ÍvÓĐ|<ßüĺ˙›Łó_Źwůi:Ďü•xnű[ůÍ ü^źčľŰV~'ěQţ_l[ŘÁj©łŇâ_c¬PĆPţ3”J ý[wÓjŹ_®S•~v«¬ăAäŞă|†ĽŰŻ×îľ@ăD‡Ë˙•,˛Á´�#P*�@P�L��$€J,( Áp°`, ‚` H2 „‚ L"§‡=w|Grs­ęµZÚLáątšľ?ć…¬v7ňŰóÓ“˘Żä¤ÓĄ5¦Ëń/Xŕ›]śbosÝád]ń˙Ă´y ő8Fó°X^gZĂó™ö °Öľ[ŕýłFţęąë—näz65§ú#Gţx·>ÝJ ?ë랼\ؤď4¦-sŤ¬ŤŢĺŐO9÷@ B�p� �Ŕ���L�@�J& ˇ@¨PL ÁDP$c×^üVqs{¶Ú¬˝e\Š]LľÍJšÍOđEöăÇŹµľ–řţuÝô.iů–¨~ŰnŽÝ=ÓWÓąf?ĘcÍâŽ?ó]LŻŁ©?QönľîĽű>Ĺ<ĽB¨59éň%Ěs¶Ń_Áˇťµeçz¦őiňň2¤ľż8Î1é* iiR’Ň%á«1L!ŞŕP¨ �p� �Áp��,�J,T!Ă@¨X& ‚„  H"ÇÇń—|ńSp—™w‘&TŐ5<ů˙®JłÉÝ©×!üčŮ˙+ńQ»ôYdű"ů»ç^šů Ń57ś^lř©·§Ő?ÍT;±Ě_čÖšjæěąUÝöô z:î»ÖŮmˇ·ń ´Ď`˘łęŕu3čR+;cÇŰ/2vQKO'ËÁNŮ9Ä w�,��!P€�"��� Ě�H,4 ˇb X(B ¨Qc|“.ď×Y(¨ş^KÜŤcWçŰüÔ‰,vÝíîţ'ÓŇ˙ńŁNz’\ëţË~·Ýô:?řhţőF?“„ď`~ŠĺßWj0¸éÓu›ţ9ú\ôâ¸1Ó{ »Ű„o) ´�7?°˙űęîßĘÁ]…«ŮÔ=„ŢÚvpm›µ6#»ą)[Ev“3ďž�“E€ €�ŕ� �PT�J&†0°,D Á@T$2„Ba<_©]Mꪵ»RFdEäŐńűýUÝË“řµéîęW Öu.›ýâá{ÝË˙ÚY9ĚVŢŻ«DĐ?M ‘˛ô>rvä> Ρ€#Oäuü«—Ëźq˘~^Ş7v—†˛őŘđůŢő=ž2Yë\»Ö őłtĄląŃHڞř©Üş©‘‰ĺzŰěĐ‘$/ED΀ ��äŔ�*�€���@� �ŔHW, ` Xh‚†  H(% Â!0ŠžÍgÇÚŮ×qzĘ„«ÍT«»öë÷«—zčwżĐÓń|ĽÝX÷H[>4üż­{Af.Ţ*_'Ń˙číÓDoĽëíoăč.n'”~p,íhďţ-JÚČî^źN?O `řő˙ŐŮfÇwx·´”ŕs•$őő„%áúą©~Ä~u1řcQP)@ �@`��(� ��L&�şŕHźţŚhŘ‘21\ ú˙I~D¤¦/Ë2>ŕ$Ĺ^ŽËx«Đ ±E…r5v`‰8±|2¦ź·Îşü?wj‘.ă$şĽÂľLčňźíO�îżŘžUüUöÖ*šôúĆx}«Ą7ýĂ?ś–đě“őż ëqfdPkU]0`dŚÄ"ŠH€lůŮňÓGÍO2fw ŁdÄif(˘��ÝüŔ�  ¸���7ď��o��Ţ8Lźţ (La"21%z×ÇóƸ‰ÚľRŮďYN¨ÉǶŕ†í»ť=ňoţ|µƱćy{_¦‰óţs\(¤¤#Ŕ[wôńµgß{|X"ÔšJ|ăkľxă|é§şę··CUŤ1V•RZ6şC¬3pS°©ËüNăW K¨, čć$î=ąJKżëÄ^ZĆ]»˙+RçearA®EçŰ—©h˝5uńPîÄÄćŚ\˘ ÇdH�`@��ČÄ�  €�pL×, ÁB0l ˇ` \* „,săŽxŞX›Ö\“™¬ŞĽă-.uńí÷ŤJĐěcôţŽĎ'¶ť)đßŇľťsŻĚčŢCUkßĺ ö~—čä�ľÔgí#_‡·ödĚŐ©Gˇßş7§Çú-W„˙CŹ1ă=4ŻşŇŰ,ŻĎ0ÝZh#ž™|¸ŕ˙Á!‘‘1´o —珜˘|€f ‚°�,��€P�€� €€J( Bc X(" ‰ˇp\*2 „Ha·ąßâW<_4Ö\n]ĺ$Ľ^š˙.®XäáSé75ü;çßäşčĺ鲴mN ÔőĎýq=˝ď?Â&ů“áV_Úü¶gřű6•yţd_ë<jËţŰú˙18ŔM}i«‡•ř ż›Śäţż$©D.ůNŰŁFbi¸Hűł,¶Ć;Uv%jţZśjÚ’cŇ&@ w� € �€��@.�@H.…Á@°ś(…Á€ * …BAP…ŹĽ˝ńšŰŤĺjŞćĺŢ]$VĄńřöűŐçň9sGł¶O›˙ŻĐ6§5çZÓřž;k}aÓw÷Mďߡ±˛{Żŕ 1öëź·§÷űذµĂK4?ŚÔ÷Ĺű*ô‰Ŕ™‡ńĺ¤Ćµ|ď.ă3śň†g-G>Ił†Ö&ťn˙†·ĚĹśŘuk;c:ĆáJ™ÂDŔ¤� �@���\�D�Ŕ°�ŕJ,D …ˇ  ŘČ( ˘@°T(1)„Nď}x’<űń˝sRWUŞ´/N>˙ĎĆĹÁŘ^˙M^îĘţŮ4gÍéű?ëŤ~[sŞ6Ý-ś-ÔůH~ýO–¶/oÎô€pő+!ŕšUŻń‡<·”éq?5t^_ĂJąWdČČ;Ő”<D^ë„EĽ^z ٶĎß ^ŻŐůWS®ÜwxđÇ˙Ërb{ĹÄĄp�H €„� �� ���J&‚‚a@X(6 B†0L"§­ńľ˛«[µřk~w2Iťe^Rő^ék’aúŚwz×MZSř_¸řŽľůYFőöŹ÷źŞŹ_3óú7÷ŠB;ĺ ßíZSĘüËýđ !6ĺĂ‹…•čF/é>˙e1y·ó©6*:CgbYaŇŇ}™Rnr[Ěň:ŔáĄmW4ďyŻţýJUX]=-3§Óô5eŞś:ÂĆ`€���0Ë� �,�L �€J&…„…c Řh ‚ ¸H&S×=râ·íÍUćFŠ‘y*ňeÜöř˙šHyź¬o×o/jfŕśy—Ă÷Ż©|t¸±m´ą_1Ëçš˙ŹĆr«ř‡UÝz!Wk…ő‚ éłmŚ–ńĚÎGň‘Yę(mÖl×bF®=5ßµďČłÍ6�môÉí´:±ŐÄŢËÇó:]Ć[./<âpUŘgţďĘŕ¸NŞŔ�2€"��P@��D�� ��QpHLT ĂA0PŞ ˇpT"ˇď[ÍM_˝Ú¨˝n•r%EF«ŰńţôYˇČůó——Ž˙d˙oŘ~wő(ŘQ–žçTţ—CęOÜK"őčÂŮ+Ţk­h÷:8^;u暨ľ"{úG-ÇĆŽ`Č_ŠóőŠŞĚ5ýňAČ0Ż-ÉóÔîjˇyŃŹlŢjXš[ŤŮy’BHl8čąöűâĹ•EÉKÁqÜ€�…Ŕ��@�@��� €°�8FW, a ŘH„`¨X(% BpT"ˇóąśoЬ˛V8Ş“%¦uČÓĎďúÜ©sŘň_ÇĂboć¦ă±?ÉůĎáâ|h2ç†ó÷ ­·łÝB~xŢŻ€«kRîIýĺi3ÇĆŻdI 9°#y—GôÖńThě0m»?tfŹĽ\΢RŮś€\öKüÉŁ©ď«”‹*‚°®QX)Ť@,Ăż5’cčöˇA-í€yş€�� €@�����" �LźţŚ&PZĽ‘jżŹů»čP)<ĺ Í‘ş4ĂÍCL‰óBśŰÁ}şŠNm €¨˝/Ĺ'Q·•|5˛uŐčíż…|*ôÉéľVüzâýWUé•z†ie݉‘pźŮ„úÂĎŻąÚ\ŹÁâ,‹ŘJqG™%wJĆcII«˙Î@±“ý¸ř „ÇKZ®Ć"ZP†CŻ4#°Ě ]X•;¦˝Ő´…q–€��ńü5€�� zĺ¬���5ë���"�׬€Nźţ-P™ŠąÎ§Ó‹ŕIßŢÖ–G{ĚëU‘ŰJşŐ$ÉIź‹ŁÂ[,§áîoµ®1˙.—§H)aJÔ+Ĺň ˛Ů˘ŕő«><ě 'łĂśÖk.r%Ŕí«fěv}Żęł­=±ß'Ż@3‘}¨�ű0zCúČb€}ĄÜDŕjÖ<Ň‹T8•Ď(0˘]đÖ˛j‰ZřSŁs?Ľ6 ¶đçhHĚ$ ‘ú@ć�oŢ���^ŕ�Ţ��ŔJ×& ÂB0Đl @¸X* ‚,zf]q›ëž1)y*«Ć´óíőćI/C¨ü˙ü÷M´°á¤ţgĎ+9ý{áÚäňóĺ˙ě1ęN ŢĎŨyęšcďę`]Żö\źň˛QŇĹ:8$ě)Ü‹ľűRĚľ1w>ѧşÝ«81Ŕźáý˛<¸SăC *‡Äř˛ć”oĐS}p%0� �€`���˘Ŕ�,�€HP*†aA0 (6 ‚áP¸$ Xďśë%]d—ĘV•VŠ•&\ÓĎÇ×Ý*8‡Š=?¤Ű xÇĺ»uYę{©÷Źţîwâţg¶™…ü V‡Mď€YˇYę÷"ţ±C48~ĄŢ)żő¸—h*1śJ=Zc qö@ađł˝™g–ĽdŻTRťÜf÷Sc™|~–‘Ű©VKk[§•›ëLż×Ďv@( ���¨�€��°�€�H�pJ,D# Â@¸T(& á ¸T$$ Xϻβ¦KS5u»’$ÔëăţrT™Đě9óďâ?ĎÁ~ýcUqóݲĎćúG_jmHę[uě?˝nőŃěÎĎťô]jţ4ôóţ{×řđďŁ8/„–¸>ô¨›öŚ}.,­ź[;~v˝±_…z®Gr;Ě'Źoeű?©źX˝‡ďő%IŔ.��"���@�`¸���ŕJ(*‚a ( Á@°PJ BC@‹îňW[ăšą‹çZ¬Öq‰šŞ—sŻŻöˇp9;źŚ¸řy_¬nŐţŃ٦ÇŮÇtńŻ/q‰ßgőŤwŹąAÁř¨ź*“„c÷µţ«† K×�qC§Ńz]‚i¶WýKrfŹ„€n·­PéĄV…=F•źT«{ľ®Ł7@?tNő‹[č>第׶ăl 0€@�ŕ €°�€��DP ‚Ŕ�8J,E ‚ÂA0P,…ˇ@°T( Fa@P"­Îm­ůçëó­9qĎ ËZĄ[$»ăý?z\CßvžĎW?ęň/¸ńă?×µŹľ«¸ĹqĄ~ţîi˙˙Ťőó~ÎŻx~ü'uśţÔŚáÁ {ĽŠj]©«Ń/ ťŁÝÉ8^Üť„{ąé¨Ď˙v†›PÔ±bÜĚíđf¬÷hˇÉŹ˘vBŐ$ ę íµ�*‚0��@@ ��€�ŔJ,$ ˇ@°Đ,8 …ˇp X(‚!…Ť÷růă[ĘšŰ%Ż%]Í—VÓŻß÷Đä]Ó{~UŞőě]/Üć¶ké^i^Š“žI4aŻKY«óŮH źMÜZů‚ň-×͇}¬Śy>żÖ.ćhSS1ŰâÝŰұ×)ä‚:”FJËŘ[d¨S3u‘úľ)ěűU§©’>Şăm¦Z¸[«kŇ\´�Vŕ�&��€�"�.���©0�8H& „…a \, b` X( „ˇ D&SĆ÷ç5ĎÇŤ1çĹÝď-fKĄęqřţjI.OĚë)yßdş¸Oˇý\˙łJđ:6šn#‘â˘~·|w˙€îĐxg˙-ľZ˙L„ć�‹ę”/$ĂŻ R]Ń çß1ŞÁ^8Ž €íX÷ Ć×Yć~SĐQFk2Řš Ż|ýV…:Ĺ(Ůă±@ś.�PP� 0� �R �@LW,T ÄA1L…DPL"¦ów×(ćkŽëTEBL—2^˝˝ż \š#ý{(Ăď/=Éń=+űĆůy'Óňnő_›+˘ţşk§ÂčZ9$$Fś~±ń¬Ń ”ęm“ÂŻăw"ŰĂ”ń~}<XKÚŐ·ľ%˛ĺ›,ĺçem•śŤztŐĚ]¬sÉH˛‚}‡\cÄŚnٸ"˝EH�.��$���€ ��€DźţD,`Ş˝ďËţĽkȲ(¨Öu�Ým RŃcşěYÁ�/jëlW šOYż¬ĘşĎ'»żEĹÝ–˙4ž»(§#aÄ ~‰ŕž(Ą¨DŰŚńq¬ëMoĽzI˙‡_¦7BÔ§ć!�DżÉâŁsö ÓÜM€.uÎ!«ć˛í=ÝçÍe†ţôýŕYXä­4_\şç-yÍc®Sö� úd3ÂGn—p^‰ą� p­P�� Ş���a��T ¨B�LźţŚhT±‚¨bĺÔW~gţ×® ć�şJ(ń51üxZua,Jş­»©Ň‘ĽŢđuZx_]ł[îÍőá¨öŮ-d¤“×iHđu –•ÖÓL“~ţÉżcůąţśµĺŢúg+Ťš†BQŢ –Ô•VĹ^ IÁX©YED·°¶ÁŃN¬XTŃĆ,×Qgnűq(gĽ®ňş´ž¨=Ňľ‚ţżśě3°č°Ś‡Ćdz >ť€&˝sî��÷€�9EŔ��äpL×( ‚` XH& ‚  H( AAŔś"Ą>f5çµî)u&.U”ÍŻŰÇ_Ďž·©ÇZźFß'ÍÇĂëÚ[Ź·=^Ďh“ę]¬ďź{ôßq֍ܢÍŰŁëúĺĚ7”+ĺ©|Î<Ôß [ŐŠšónËm؉łWŤ_°ŮâßS|Á&9n:…őł ĆŕW,ŕvߥŠMČę>,BŔNĄń.G"î˙·ËIcŠ›ő�ăpÜ���`T €�@�Ŕ�JH‚‚`¨H* ‚ P$ BCP \2…Ba˝żŻŢ“w˝_®&řoŤÝyĚŽyťqŢżöĽ¶uˇÉÍđ ąu¶ŚţN…Ř6ďΛ˙}vŹç$“cňďö:§äpŇsW.LGwŕË“oáŁŰeWFgő-Cˇ3ÓM�€Ę|ţtjZ'č|­´lë˛Ă*Ýďş::,ą]ĺ-R÷™ŠÁÜ`ýů…ŻźŽű×A1ž  €f�‚!@��T��(�€HL…Ba (& FÁ@‘”,%…D)kô™¤ă5ęL»ç†őĎĆ&çŠřăĆżÇůo«ç«ŽöáĂ|ßË7Ý·îü3ţ;GĺgčÄ,˙čÔvđ|Ú yBý_GFßđÁŮŰG±śX>ŹmQâd ŢŞ8ĹoŮ»oăúę)ň‰?ŢжŤµ˙źŁýčúb űŔšßE;ýMßĘ…5ĺR�Ď�X�@�PP��� €JW$ …Bb8X( ÁAPD Á…*ćęęµ7SÖ¤®·U^yę±ÎĽ>Ż»˙櫥jO Ôč›Ć—Ţłţ‡—´ČJâëťü·^=ŕO˘ŐćPú‹©Ć˝ÁvţŞ™D/řk_{Đąnm0Ąv´xńx+¸v|ó§<c0!‘Ű4M˝µ”ówú¸Ź Oŕ/WćŹ 4gz)`¤7KLuňcó~ŹĘčÖ~†ÂBŕ©P�b` €�����$�Fźý”hXÁB¤a˝fµă~öÖşĘTg;¦¸w|¬¬°®–®ő‰Oą3*x‚łcđ7âF!$ş˝ů7 J޵"ŐŞ4ă÷dEžš6Ővź$¤7‰®ő‘„é#Ükü�=ňx-¶xŔĄ]gÚ,cxđ:Š‹:ÂŁänYĹ3[;­)iű ¸«Î©b#«ŞkOiÉ%Í]^qÖ<um]vČn‚ňŐ#׹|˛­‡dŔ0€>¨€Â�UJ��� P¨"���ŐP���Ämoof���mfhd����������¬traf���tfhd������������ö���Ę���trun������������Ę���Ĺ���Â���Ě���Ę���Ä���É���Ă���˝���ż���Ă���˝���Ä���ą���Á���Â���Ŕ���»���ş���ş���ą���®������Ź���«���¤���˘���š���Ą��řmdat���free����mdatFźý”h\ÁT13U8ńżż÷ÖşÝ~%=“ĺ<ž\“óMiŁĄ!Ý|íÇşš¤Ó˛p:¨“HôČgç" ®C¶Y­_ľŻXŘ•YmQ ÁNĚ… ,$»Ą{ú§ŢĄeX˛Ë‹“zž'ŔśqҨŐîQĄđ <Ňßwl*÷m<E;Šéçhńď:”±ş¶ť_\ó¸%pŇ]ň”‹ŇĆ>¸ďÄ.aʤ|&G<†6P�׬7Ý ş‰Ťs€�X�€�5€��jLźţ‹$,Q:2¤cHkĆ|gýő­Č3Á9c§bFi¶]şY)ye€ě’čęěËU@TSÉ.Łôî��ę:gřôD"�4–Ѧxâ±zî~…dýĎŐuC|ó6¸;ęžď+ßÖÖ®·ŽjřĄö ˝<oЬ9]¦­Ď?‡9tôlž†|]]ŻGŮź_'¦ZŘ? Ń}OďdŻb-dT”Šáˇ×!¬Hň© `yÖ€�lŘ;6��X�lŘŘ��˛Ŕ����ŮaŔNźţ $j]R1Öqľ/×?ŻůkŤyŇîő<x’ÖÁdŞ·öş–`ŞąĘ—­«Ý7Dđ^ឪÔďňëĂłrnĎíÚ¤Vš ëő'ĎyĎ7%ľIž˘éW<ܧQĚjŁwXĽzäęř,xÝܵň©¸–_Yóq|c·÷đŇńĺČěĄď:ěŹO Ŕ—ľălE5É×îF<m.S=°:‹‘é«č‘7#Ďş�ŐŞ��5 U�� µ��P @�@�pNźţ $,P˛‚…HĆ«ŤŰśřŻü¸ľÓ#ë]Ž9[DQVxq€ĺ®eę_˝VOKŃ!yC'×7jIł«=Ł«ŹwţźŇtáémeu%StÎ9á7küÝź Ú˝üD Óĺj*ZłšÖoRaCŮáµCĚ{xď$ţ±‚žUËť!ÎfšĎ?ë5Đ“«[¨Č«ôF;ä»˝…u]ĘÂÔ˦|öŔ× ňĽ fG_�ó¨Ŕur=Q�7‘�D@D&o��Ŕ ��Ŕ�…GNźţ ,`´RdbT«ĂŮ˙[×\­"›šŠâ–]}‹ |›Ď zćç%Żßvgŕ@<FÖş­®›¤:l8ŮŁžŽq|ć•ŕ MáqđtĂĚ 7×*<bÂÚíę·m˛?ÁúÜn¬ë݉‡WGYu:4ŐKîś"î·¶K—:}äžćď…^ ˛€ę©�ü¨,Bř]4»ăĆ)Č«"“ňřR‹ŘźÂÜEÖĹú‚ŔŃ\¬+0�Ŕx��€@���Ů��Nźţ -™Öq“ćç5ä]űZ] ‰â‚l ÁJ\ü÷ŹŽó;RXaşµę—hĂ\;GM1k®[rJËqą¨^7ÉÍč“G{d÷HËYŁ Ţ»śO˝(aOJúĺ6čťE Ą¸® ¶Š€7řöLŰfTýwé.`-¬( µÍĺ×(ŹL”KˇĂN †&ÄÚ@*Ü|đ¶9ç3ކ ż®•˛=ŰN.Yçđn ąĽÔT ·ď�€�Ţ�`� ��"�R×H ÂA@¨P* A`P$ ÂRX0 „BbłhĽá[ë”óëZߏ=xoЬ­^©ń˙t¸Ő—Ńź»˙Öü´×soŕ衚—�¬=]`ϱaĘUöÉääođČn»OŘ5öŁ™nŻÇ<Ś@źńšňęľu`ÇíŞ1ĂŶ“Ŕ¶HQa†:ŕ,đťu{®%a†üV_髨Đxj9O/tO‹uîmeKňÄ�„Ŕ��€�Ŕ€�\ŔJL B! H …Ap H* „Âáa¸„&S~5Ž/^2ň¸uď<ĎyÖĹuë5|nţżëu˘ŕär-O_Át˙tęÚ?ßo+ĺhÔ¬üţäéÖm^®yyźmcßş1ő3¦ż¸ĹÝ窍Y_WühóPvĐżĐöT’NëÚ(• ä�$Őů6™Ä°ţ8=}±Ůö˝¬p›Ů%n…ő=ąRE7?ą*ĽX˘Ć1č��X�€X�P� ���°�pJ$ „AC@X* ‚ÁA8T.6 ġ2 ĘŻ&ľ?m+›ř÷µâ÷މÝk©“ď˙”Ë:ÁÉćĺÂé"ăµ?}ޔڻá:á~Žń ÚeŹVčňó:żÍăŮQŃ-𾯤*fÚh*]‘$­@ŽËŇdđf°řľýööő>o_)żF˝Ý¸Ő´7f]%ĺ“0őŕîеYŽöË×OÝV��@D�&��� X���€€HL$C@¸XJ DPTNBaD&C}Ć]Ţ·“9uÜá“^ç5®-źüĄYpv> ę\«Źôú~6ß՞ʳnâEçLn_l-wđ®H—ÜŻĘĄž“Ć,ÇĆXdďűĐdé‹ß­QV®±đóĂŢBüPV×đm¬É© qČěţXąÔÍ.ˇ/˙a.¨qĽ„şĎ§„]˙¤qů0�€ €Ŕ�€� € �`�€L,( „AA*…‚  X(' BP (±ăż:ůó7íĽ×s}s$ÝłĎzËŢq«>˙ů3Ś—cÉŤŁţčû峣ôđű˙ŹÎ żŘmÂűĽ>CŻIhÓĐôIŕFČQ‹A<ë,Оü>OHTa'«čŐojÁµ:ü~ đ{Ű‚Äňmvü»řȲÖKý=Fô yżzşĄ ďFfmákË­ rp�@��R€����Ŕ¸€Hn‚` H& „„ÁA(Đ. #0Š=DťsUĆ^Ünĺnéj_9ĹńUú˙Ţ÷Ş–ĎÜżŞ_qϧ ‹g˙x‰˝ľĂzଜ!ćśýŰI˝ăË ů«®Wű€¤i› ë®Ô/~Ž>ʱ _ޱ Đí'©Og©Z‚ţÂŃśoĐäQ:áĆćRĐtß.âĆ;Ąă`_biÔ·^s‰L>ŘEßőżU‡€�p�(�"�@�Ŕ.��$�pHLD ÂA(X(3 ‚ˇ@¨\*…‚ˇ0Ś"—˝UTűú×ws—Éסe_5ĂŰ›ű˙äXĐě<ŇŢî·=<ŕëÇ›žýXéŞf˙•ń:O_3ü˝˙Žú~Ť=÷P\˛>>5.`g¸ «ńůLĹĘĐú—ÚoÁTu˝‘Űú§ĂŐ†e Ę~_˙űĂZĹRÝqë‹ßUL]ě»>@ÂmÍŇ ĄÂ]ęҡ§ä€�¸ � �� �&��L� €JLD#B`¨PL Â@¸”Ž „Â!1 Yď.Ľ÷wÝőmlé˛&I’şă|y˙Ű%Ô°ätá˙[ß[hÝËŁmcËňşwČ˙ćW´yŰgWüGéţŁy—ęË­ Y©BˇŐHfi©đ?‚Aî™®ż®`Q<ćéŞďr‹3ÎŢ?ÂÓˇrŽ—aöüżëŮ[‰�đţĘNé±qËđq§`Ţh€�� (�¨��°`�&� �€H(‚Ł€¸H& ‚áP T, „‚p T& ŚPĎ{›ó}ĚkŻ™|ßźďŞŢł5ZâµúÄj¬rx썼Shظ‡ ŕ÷Y‡aAPu=ćO‹ţpŘ;ăý“Vxźn/‘#ĄÝ6‚ÎE,˙עěŕ Ţ=e^¬$5÷ŁŮd',ĽoŇÄ˱˝{Ő…ż˙ôG ó~rXHś¬ÚŮJţéAcŐ@Ŕ€ �� �H€ĺ€�@�J$ ‚  XD …ˇA¨, Âq(Ěb–xľŢYĆdă™™uç¸ëĹŻrĄęĽűż ®+C“Ďř_¤«Őđ˝QÎżţŠoűH/ĺŁvľú‰ť=ĺçřăBôđ}ç׹>뚇ú1ŤňľbĚÄťźĎGe8ůÝ=´|eĹ?/vl¤ŔC<±ôštőön »qĆŻüíĽjçî„D؉“3Ŕć‚ď3Ü‹‚j+°�`�� �\� P ���ŕH( ÂP Ô$ Ap°P$ ¡`T$F+_çŽ×{üxÎ;É{“Žjyńu{‰|'ëţő%Ic“Ł;xýuÇđµ—µŃöŢ[âŞ_ó‹ˇîožÇţ}ŃçDq.a_ZŻÇŞi©`ßţ/ŠiÁű=‚…{T“éwőQ4ĚáŮŹ¨şC<ĽrzÝ~Yô‘NĚ|Ę;ý§t]‚učĹŔČIç9…%je`)�@P�€ ��Ŕ�H�€JF9A`¸PL% ÂA@¸H. ‰˘2 •~}|s¸îřń«Ů~}^ţ˙jęť/ŻűË˝ÚÇ'7ńĽ-I¦˝u©Ľ˝Ý-ď vOüHóľLĂmĐÓ*>"~+,˝L-řs?Sý?«Éx™UÓ~>Ž�R‚ĘZ&Ő}„M(Ă©˙W)*8ůůw=}ă Žş¦M,w·Qűj‚Ď_���p�˘�p@��X�L$ „!H( „‚ˇ0”. …BAP¸¤& „Bˇ1 ~*ňůý~}·Îţ7şę·:殼řßťÎýŰzŠÉGńxMÓŚđęăRôż Á§măÁힼüÚ“g_­GÚ0ö¦F«©ŽĎůg=čOp‡ ÷ĹÍČIߤů~`\ÍĺÓ|ž§ˇűéj| ?ÓSnSµJG× �ááz¨ € �$�*€@*@��\�ŔJ( …CQX* D °\$ „‚ˇ¨d$ „BbPŠüę÷ç|˙ŹăŠž5®gĽú|ńZîşÉm~?ëĎąaÉá~qÇ´î|ţg_˘OŤ4r˙-#ä'ĄçG^Ňř›LUę#/'[ ËĄfŔ{űQ¸I[W!ńÇĹ -žś>”Ŕ-o“hŃ+ˇLÂţgQ�Ëwµ�s“ŔÄÎ|`��� ��¨��¨��…Ŕ��LWL ˇ@°d ‚á ¸T$…ÂÁPĚB†ľÚĽößŹŻ·›|Ý’µßÇĽ“Žs­ÜąçýďŞK±Řyöqâüş×¶kѢ穚˙G‘]ôemµłĆýÁŞé}IĆďŰĆÔŞ{}Ö{8´!Şş§ĐĹP ĂŻ[řvÍ•Î8ß“ÉŃ‹*˘í˙[ťßĘ@%ü/§ť’p ZźI/ąŔ��8�L ���°�T�€LźţŚ(Y)b¤ČÔ—YŻ?ďzŕ± ęÁá ,0CĚl“ŽdT‚ HFJtRŮ í+ř_Ĺ:_}3¬x˝'Ňőy ÔŠ˛ĘĄxˇŘî×RůžĹĆĘĚ˝şúţŚL j¬7»b'!ČoaËPVi\:Ş'Ő›tNk˛Uˇ$gnšŻŻVâ‡5ÎŹćŠ1g€ ‘$ ‘��M0\*���Z€��}Ŕ��pFťţ‹$ŠŤ \%Őß·üÍý.ü¨čHt¶!1›;Źč]rÚý©a×dăÄTµ—HČkÔ˙˙Ňďş;fŘËýÇőă:˛ oÓAs+ǨşmµŤ‰™kÔżŽß‡Ďş<;kzn®¨]°–Dv׊㍫)r—őńęiŰ»%‘UGąUJAŚ�L đ,¨� � j��8LťţŚI ŤjęĺÔëŻózŽ#‘WHú¦_OżzS‘“ '”㸧¬KCżaVęô%�ĺnÔj € §)ÓÔ{¦ŔćoďÜW^ď/YüFőqSő7Ž´&O“âő¨Î&|vóÚrYÇ|Z*çÇł»řČ‚Wa/Ţ$‘ cÚ��˛ĂÎ��€SP���!Nźţ ,`˛R„ČŃ3RM|˝Ţ‚ÚXuČĂ…5ż†ľ_?BöŰŻGY\5jäŮNµ†Ěłoź|{îߌĚaĎĘŠçZ9ńĄh/Íůřßă~Ľç™ËČmK"–•`X*"`M1·ežşIŮÓłŰ,éŕ®ëČí7SJ–Ü=Š`ßĐŃĂÁ^ĘĘXűŔŇH€�.RL.�ŕ,��¨.��€Jźţ ,ĐŞd`©wuŻŻó|XŇŕßšWý¬1öx_^rU'äłiŞWÇ׏^{—•ĺt¸­űŚq·Ź.6ń·ŤżK~!’ĹARŐô )ĚN¤FÔ* 9€u x%Ctô\đÎ%Ťś¦9.Kg¸ě·Q©’É‹*ÇčőaŚ;ŤščÇ,ČX <�ş€��* ��¨*����ŕL×(‚ÁAP$ AP°\* ŚBaEÎs#ĚëYĆëÇž7ă­n¸¦¦$ă_ďkş“C“ŠŹóőĎňďÜtmWđü´°®ˇţ}ť˙Ä0éWŐęm¶QVĺ^®§�Ę>I×ç~ŰŔ mĆ˝˛Ŕ9çÜř•Ž%§ÝŽ ŕŕÓśE‚“o5Ŕ�¨H �¸�&�"��Ŕ��@�ŕH(&!ˇ`ŔP$4 „„p*" „Da3ąĎ3ď—7ÇĎ™>Îíç$¤uŻńđJµŽOO/>ÎVńĐź>†÷—٤[…ěČŻö×eN(fb_Ĺßép€ňŐ~wdűr�qkŽ?`u®PqĹÚGÍs/qc«HĄ’¤Ü8† Ë�����p@�¸�H��€H$‚a!@h „‚‚q ”&% DaEmď\׸őÔ»Íóíyă]|őÖSYu/ďńřÍ%\ź#č[ôëűô»;GăĎ .»ýtů™‡‹ü˘µýĄLWsWZęđ|Đa\öń.^źęş^Jß*ŤÇb ˘ÎĆ"ť‹ŠŠN©ŻćĘW‚Ç»*žil  �L��@�$‚��� …Á@�ŕ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/no-tags.flac���������������������������������������������������������������0000664�0000000�0000000�00000011124�14447736377�0017336�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������fLaC���"������ ÄBđ�zŔˇ±A÷f鄚ĂŰ0˘ <w�,������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙řY�k������Š˙řYl������‡˙˙řYe������ľe˙řYb������)˙řYw������ÍQ˙řYp������Z$˙řYy������cľ˙řY~������ôË˙řYS������+9˙řY T������ĽL˙řY ]������…Ö˙řY Z������Ł˙řY O������öâ˙řY H������a—˙řYA������X ˙řYF������Ďx˙řY������gě˙řY������đ™˙řY������É˙řY������^v˙řY������ş7˙řY�������-B˙řY ������Ř˙řY������­˙řY#������\_˙řY$������Ë*˙řY-������ň°˙řY*������eĹ˙řY?������„˙řY8������ń˙řY1������/k˙řY6������¸˙řY ‹������ţF˙řY!Ś������i3˙řY"…������P©˙řy#ż������XE��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/no-tags.m4a����������������������������������������������������������������0000664�0000000�0000000�00000005522�14447736377�0017117�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������ftypmp42����mp42isom��ąmdatŢ��libfaac 1.24��B�“ 2�G!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€���mdat��moov���lmvhd����ŔôEŮŔôLż�_���������������������������������������������@���������������������������������iods����€€€�O˙˙˙˙��ttrak���\tkhd���ŔôEŮŔôEÚ�����������������������������������������������������@�������������mdia��� mdhd����ŔôEŮŔôEÚ��¬D�~Ŕ�������!hdlr��������soun���������������Çminf���smhd�����������$dinf���dref���������� url �����‹stbl���gstsd����������Wmp4a���������������������¬D�����3esds����€€€"���€€€@���� č�� b€€€€€€��� stts����������ź��������Ŕ��”stsz����������� ������ ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ���(stsc�������������,��������������� stco���������� ��˝��I��Ő��� ctts����������������ź�������udta���qfreehdlr��������mdirappl������������Lilst���!©too���data�������FAAC 1.24���#©ART���data�������Test Artist������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/no_length.wv���������������������������������������������������������������0000664�0000000�0000000�00000001024�14447736377�0017470�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������wvpkh�����˙˙˙˙����"V��!€ŻBwń!RIFF$ů �WAVEfmt �����D¬��±���data�ů ����������������e����Š��˙˙Xwvpk4�����@~�"V��"V��!€ŻBwń���������������Š��˙˙Xwvpk4�����@~�D¬��"V��!€ŻBwń���������������Š��˙˙Xwvpk4�����@~�f�"V��!€ŻBwń���������������Š��˙˙Xwvpk4�����@~�X�"V��!€ŻBwń���������������Š��˙˙Xwvpk4�����@~�Ş®�"V��!€ŻBwń���������������Š��˙˙Xwvpk4�����@~�Ě�ş<��!€ď܉���������������Š��˙tůwvpk4�����@~�†A�ş<��!€ď܉���������������Š��˙tů������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/noise.aif������������������������������������������������������������������0000664�0000000�0000000�00000010460�14447736377�0016737�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������FORM��'AIFFCOMM�������e�@¬D������FLLR��Â��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SSND��7��������ŠšĽĄ(Ą˙óxőcđýĄ-‡ZLá q—á–K<ů< ŐZA- –x�RZţ<�üđĽú˝iüÍ–ű„Ąů ĂXúkŇű‹‡ój–ăâKĺ=´ď\Ăě”áöĂ<ř5<-K�ÜxL  ˙�Ą[ZűđöŢ�üŮŇ÷…<Łá´7á x < jx Ko‡ Ł- ‡ďĂx şđ(Kű~üűĄ áPÉ�úkĂŐ-w‡’– ZúF´ůäĄú)Ň2Z :Ku<řŘŇţT<ó.ú¨ů”´úş-Ąńđşđö;x�ý$– -á –˙"ŇDZGK˙s-gáôiöćiúYĂ9I�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/noise_odd.aif��������������������������������������������������������������0000664�0000000�0000000�00000010457�14447736377�0017573�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������FORM��'AIFFCOMM�������e�@¬D������FLLR��Â��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SSND��7��������ŠšĽĄ(Ą˙óxőcđýĄ-‡ZLá q—á–K<ů< ŐZA- –x�RZţ<�üđĽú˝iüÍ–ű„Ąů ĂXúkŇű‹‡ój–ăâKĺ=´ď\Ăě”áöĂ<ř5<-K�ÜxL  ˙�Ą[ZűđöŢ�üŮŇ÷…<Łá´7á x < jx Ko‡ Ł- ‡ďĂx şđ(Kű~üűĄ áPÉ�úkĂŐ-w‡’– ZúF´ůäĄú)Ň2Z :Ku<řŘŇţT<ó.ú¨ů”´úş-Ąńđşđö;x�ý$– -á –˙"ŇDZGK˙s-gáôiöćiúYĂ9I�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/non-full-meta.m4a����������������������������������������������������������0000664�0000000�0000000�00000011764�14447736377�0020232�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000���������������������������������������������������������������������������������������������������������������������������������������������������������������������������ftypmp42����mp42isom��ąmdatŢ��libfaac 1.24��B�“ 2�G!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€!�I�#€��#moov���lmvhd����ŔôEŮÁLII�_���������������������������������������������@���������������������������������iods����€€€�O˙˙˙˙��ttrak���\tkhd���ŔôEŮÁLII�����������������������������������������������������@�������������mdia��� mdhd����ŔôEŮÁLII��¬D�~Ŕ�������!hdlr��������soun���������������Çminf���smhd�����������$dinf���dref���������� url �����‹stbl���gstsd����������Wmp4a���������������������¬D�����3esds����€€€"���€€€@���� č�� b€€€€€€��� stts����������ź��������Ŕ��”stsz����������� ������ ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ��� ���(stsc�������������,��������������� stco���������� ��˝��I��Ő��� ctts����������������ź������ #udta�� meta���!hdlr��������mdirappl�����������ilst���!©too���data�������FAAC 1.24���'©ART���data�������Test Artist!!!!���˘----���mean����com.apple.iTunes���name����iTunNORM���jdata������� 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000��–covr���_data�������‰PNG  ��� IHDR���������ýÔšs���IDATxśc|źĘŔŔŔŔÄŔŔŔŔŔ�� X«Űo����IEND®B`‚��/data��� ����˙Ř˙ŕ�JFIF��d�d��˙Ű�C�    "##! %*5-%'2( .?/279<<<$-BFA:F5;<9˙Ű�C  9& &99999999999999999999999999999999999999999999999999˙Ŕ���"�˙Ä�����������������˙Ä�����������������˙Ä���������������˙Ä�����������������˙Ú� ��?�Ť€¸˙Ů��jfree��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/non_standard_rate.wv�������������������������������������������������������0000664�0000000�0000000�00000000204�14447736377�0021177�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������wvpk|�����[������[��!€gÓíhwav�!RIFF9��WAVEfmt �����č�� ����datal9�����������������gč��e����*�Š��˙ź-˙/¬®{´��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/pcm_with_fact_chunk.wav����������������������������������������������������0000664�0000000�0000000�00000034644�14447736377�0021671�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFFś9��WAVEfmt �����č�� ����datal9��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������fact���FILT��������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/rare_frames.mp3������������������������������������������������������������0000664�0000000�0000000�00000020200�14447736377�0020041�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����eCOMM������XXX�A COMMENTTXXX���1���userTextDescription1�userTextData1�userTextData2TXXX���<���QuodLibet::userTextDescription2�userTextData1�userTextData2TCON������13WXXX������userUrl�http://a.user.urlWXXX���*����http://a.user.url/with/empty/descriptionUFID�����supermihi@web.de�12345678������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙űˇ��������������������������������VBRI� ±�d�bŰ‘��!:�„���@±˝¨»6şÎ»7şĎşg»7Ľ×»źşĎą,»5»8Ľ»źą•ľŕĽąúşc¸Z¶Oąűą“·óľ»4·ń¸Ä·‰şcşcąüĽm®őĄđ¦Y§*¤´°0´EşÎ»6ĽpĽĽ»7ľŕ ĆÂČ8Ĺ`ÇĐÇhĆ0ĹČÉÇhÇĐĆ0Č8Č8Ç�ĆÇĐČ8Č Ç�ÇĐÇĐÇhÇ�ÇhČ ÇĐŔčĽŘą”»źą–şĚ»ť»źĽpşËµ}¸X·đµą,·đşË»źşfşhą*şe¸\µ·ő ĂŔÄřÉpÇhÇĐÇĐÇĐĆÇĐÇĐÇĐĆÇhÇhÇ�ĆĆČ Ç�Č8ÇĐČ Č ÇhÇhÉpÉŘÄ(»7����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙úDÍ�����K€���� p����.��� ��%Ŕ��I�€ ‚B2|P��m€�šÁH€�ůđPĐ®˙  ˙˙ůŕú×§Nî•n¬``0Ť �7(}żŰ˙xâąť˙úD!����K€���� p����.��� ��%Ŕ��?ÝąÝVjĆ€@��1ż±«űVÝß-ö‘©–ďÜ€ 3�o˙ż˙˙ý˝,ÍÉż@‚(ŔżŻťč˙ČkvŤźë<Ţ] �/˙úDéB����K€���� p����.��� ��%Ŕ��Ą»?NŰnöcú‘­%�Ś��� �ěW˙˙˙ţy|J€�B� ű˙˙[čc˙ű»�P��@��ó@��@�˙úd§>c����K€�� ŕi c�Ě$€€� '€Łđ�×˙˙˙˙\ý‹µ=P�˙˙ő×˙÷ĄN8] Eµů#L‚çu žuľT;`ąźÓ;W@đŐÂĹRinĄcKŔDíľµ¶˙údn–t€�~�ƨ���`=��l€���:€dŕp�Űft7?AŰ‘¤ĹŐ§VŢ)G©HĄ4‘©´Í †ł-Ć †,ˇć‰–悦‡¦"‡&¦…&&Ć �ć&‹&°G˙údĘŁo��–HA`�€),�L/ˇ�� C€¤¤p�)FŔF#†‚�Ĺ!`ƢPĘaŘŔ ¬Ý ęŮÜë<Ă<čpÎ S$µ-ăÉ+­LâfŞ€@Ś`–ă;•2µH˙úd—!k��'�Ë @�€)�ŕ €� C�¤ �¸yÄĺ&4ô®[¶×čď>îümܤ« âA‚Ŕ�u‡ĺ{ä T î‚îűÜ" [˙˙úQb縓­›Űn'˙ú1dZAv��ń�ƨ��� (ĺ<��dű)ŽĺAĄ–%a­ˇpr˝2čc㞦‹ Š`k…Q#�Ą�@Ä�D"‰žM–$×BČBIĹ‚ÔÇHC�”A×a“)h–]‡)dN__.a7?yĂqîcŘKúd ‰ĄSŢď˝ĹČš˘dŕCźĺŕÂMďţ”čŔ±± ˙ú±d®M€ç?ÓKYclŽ mg o1J̰~z˘Şe†ć˘ˇG ’ L˛Ú éŹJxř˛¨Ç@i†É·i—@3ŃG »^á§BCL4…ŕŕL(b ŠŔQÄVhÍů2łQ± [:Ž}űł8¦%`TÜČş<ŽćcÜ\7TLr!{Äd§”2SSÍ›z  ýäŤe‹¦y=~řvÜwČWż3ó9uÚ=eŹľż.d9%»}¬�PPfZ)ÉźqČX°’´îA›ôśK�‹�• ËŮ)ڎÓg ixŻÖ––J�,z]íĽN ·XŞéřpíľŽ“ qń·+‰Ed ž˝i+÷H˙ÓÄëĹéĆÜ?ÁrÔUbFXŽ®F @!7Kę@tIŢá#$^s^­{źůuZfR@ßÔ�VéANPBňîˇ6(üÄ�Ȳc„‰be Ü2ćCŘ ž¦U%luµ�ďŞń–łFâĎ3Ţ›®kŃCŤŤúŠÎ:ϲO+lŁçˇo»—.Wţeövžř‹ű¶°”±IşĎ ľ ( (,…x…ëK/Ż)«-)FÝ!ŚtŇ®ŔĽäő†ĚżazÚL´PVĐů1t9Ŕ¨d{řO…ŞăöŞ‚µ]Ň(ąTłË‰UŘÝ”]AÔÍ^+d`+Ůh+·Ž‘E ”˛ Żł¦Łę¬Ă.łîÖ¤Ńe“ ÓgBőëÚ}2®`«i)őŁ…ČÝi·N"ź§G_‡®˛ĎŇPŘăÁ?VB]0Ş[űu!  ,ë4ظÄŢâ1ěÍd2ď/ł=ĚŤ/I]ă4(€IJK˙ú±dé €yFÓë,MކéÚyeÇ’­UL°Řńř$*©†v˝ű1"wL‘·ŮŁq¦fé&Ü‚÷Ź.IdMĐZŇzµ.ÁDŹDö§ n­™›0ö´Ç`řŰg`‹í7¤„fęBĺĆbräj¸F_‹ŘXşIĂ_,…<ŠEŇ2”}†9â0°üýTňŠ)&´îÎ}×˝>ĺÎ4”ľµźµá»ćú÷éÍřqžíŇ�,×rŚ&@€Ă'vekć�‹F‘˝2É…PÍß#˛„—qÚ3R-űvB^Q×2ôĆčvó·ó,';¸Ę —ź—[„¦Ś‹ęO ×ů÷!–iU„xĎÜŞ#Ú§mÝ.BNV@­|Ş=ˇ„Łâ`†IФ€@…~&{;ó3ňő/ŠíĎ)ű é’•m·H9ĂJaNÄQ¸#„HZžä:‡@…�@ ”ˇöV•9.»QVNŇâĹďO‚žilMÇBCS%A8N"Äq9/— JDxדˇ˘8†W$DnŔFý×uĘçͶY…b‰3…1‰ů¶ŔĐ7˛Ľě¶]Csmďm'ŤĚ×Ě™Č5ş"9®úýľµŚ oňň2 $ăi ŮB­Xi Z™ŁŞőô°o 8É Uý@JQ jxEěaĆ?ŇŰ41 „ňTJ‹‰ÎßŘ`\[a ™aVđŕ6,�Ł(ŰË1[^ ŤŇZĹŞVą.MYeĘ6Ş7ĺśšĂxLögw�Aɤ3¦Dfgw2Ş«8Í<YëB62Ň•­7I ĺĹáż:űÄ8»,LdU©^ÚĚš^¨VĄ¶˙ú±d©Î€#UVS,<ŹIzša»SÝ/S¬°Úę-޵‡ĄýŠ ŃŰc&IŔZpP‹ú•¶†aHŢŰľ ¬!ăVŠÓk—IúÓ)«AŇ‹‘E9phਛ?š¨Ý¨źHÖ˘BJ¸ Ę´kpů¶ôJĎä…]”2Ô<âÍLŰÎŃbOa‰Ć齋ÍúŤ…şem“Ł˙=žÝŁ’50Rv[Ë@¨×»¶úвM S9{řóHGB×Ůšąf—+ÓťX# �i±< @ĽL1šČ_ötä4\ĺqéf/•  Đ\hOćNꋇk–+gŠęáU™‡â^±ÂÚöK†|±Őţ]˘B˝"b*‰n~ߥŮ[/Ag•´źFTÝ«ĺŇ/§ątČYý>C8=9%P5Ý·Ú‡9şĄşĂ5V~R¨TI ‡1Ď”É(|·U'Wäl‡)Yüü8†Ł ©‰}Wfś5sJü< ^VĎ_Ćă d1(óş’S3QG‘ő[ŞŹW„§¬ň—Iđ „ŐM‰ű ĚZEZ˝TńMŚůrĹŻš¬ŹłVŮkeX‰Va·e쉲ËcĄEoĺÁy C*înQňĄ :Z]˛C�‚ě»˙őşţ_Ň8 đÁ¤2)¦˘ŃHN5$xiňşP2¬6 ¸iŽBŔzQ…“’ĄF©*°ľ›4ŰŮěć{ąŁ_.ŐŠö‰ţEšJÁS}pźWł^•uE>fSj+ÍEč® ·¤mt u `§OEŇ–Q+ˇńđŇ„ďçW3… »÷wmjť7m ő› ZĚTëěC-8˙ú±doŕ €űJÖSd<Ši =a†ą“@ńQ5ś�:;žiö°đŚ ©R'ńé#Ęȵ$„[#‡*44IŔľ±ŘŁŞ…dť ±řd¶@<âCěpGlz?4|2ŽÁD'쯙˛%-(tk!9áF_�ýa¦×:#ÇŽBŃôm2ăĺUŘq1ą”ngb¸ŕd¸$^ 2‘>^<ŇňŐŻě'G—ĵ·ă2‡“IęY.6MÉn¶H$®¨đA©•פQëü•4°(H^×ţ7]¬łd®‹­ČŮn’·Á•ŢÁfŔ±ř\Ş€ OV‡Ëě°đšmcÄë i3‹×•ű6¶Ń©(t/\ljĹągYôj*ń˛fâRŐµ5× ëŠŕk÷üő®/1‘1âÝ ßŻľ ßÚ‘qU—3 ăÄ·˘Öz˙”FĹ€äq…@ž®ĽeČ­.tfOrdLrwp€,ĺ2ĺŚŐŰgą”„%_ˇ%©łv¨†-5aT”ą`Úl˘ÄŞëíK·@ëηń™D +÷ö’5#µbY,ĄŃ×fE7łZx¦q^ĹŻÖťă©=YÖµ=5^Ď1ą-Ë–ÎSFđŻŘ˝O·˛”Ůń¨šőLbłšĎ˙ý™ °Č)'˙ëCFdŁB)L`PL& j.zŇ/ňL BÔéS¨J95H•.I›Ä±ş3Ą Ě[ZS¨7LKqŰ[L–N1(SĺőXň 6(úQ33˝ÄzR <Vx§şk/ Čç ˛°¬)™_9'±G´łt±ë˝ÓO¦ľ|8mxż­<c×5‘Ű–©µ“Ý˙S_Ś�€$LB5µÚ˙żŕ˙úŃdy�sOŃno@�Ɖú:Íč�–)3U]Ś�*r¤++±€PT0ˇŁó C`(¨XHŔAÄ% \É  ĐxTčŇřĺĂMtčë‘,‘ˇf $bCt¦0p´ó4€ Y±ŁÁĚ»™{„L0´éö=aUđĐ$ÎEąęMxaЇFAĽÎ"ĚxKMËźF'2á;ô˛ RĺlŠíRµw9ͤ×ař”ô^PěQ-ř e:.ú—ÔŤË×gى8ŤÍ‡ĘźH"v NvÝü}Ţ×7ź­*@ĺ«ŮÄSŤuÚµ »őíZíŮ=—Ú8ô4ÉĆňŽ–4§®AÓąK!Ř.ýĹÝ›*€€P‰m6ŰqŔš—ë– íTĚPQ–Ův‘8P¶FbJ0"bl©3ĐTÜzŇŕŐC$Űů>€G*@clŹë~°šeAáä î[ś‹Xľ÷`ýîIyžÎĹ"ŹýMŘŤĘkH«ÎR˛¤‹ĂSN{kgV÷.ßqŤżpôµů·MGlrĆíM(łÚů÷QŚąEI­ęeŰľôÔ„n{SnM ÚZß^Í›–laósv1­?s Ó-1K)†;$«KDJ Ű·m˝Űđﮆ °®=0ŕV<�0# Î!ŕFŘsc°éyÔž Ş ˇP€Á6éËĚŔiŕßF—b’|üQv8<aÓa*îv´Ě†mŰž†¬ĚĂRéËł2éů\nP»ĺv]ąl¶ˇ¤‡˙3_ěYúż©Ü%ŻIWZÔąfô+–ĚáM5ˇ»;g ˘]—Ý~Ą—!3SXs 3Ýź©”Çfĺó™Íaůĺ«wńµŇ­×„ß.ű˙‚ť‚ćŢ`ëˇŃż’˛—ŔÇb‹PÇŁNÓę0&¤˙ÝtÓłw…<-eýi3ŽE#¬Ü&h˘ďÔšb‹ěUýdW)ßéŰNóńO-Nëóµj »OŤ-ÜjöĹŰW~k 2ż1*©=fµślÝÝ.umĺ~j+Ç·)ęRáG†3}ü3Ď;ôß;űď˙q˙Ăńç?·Ě5+4CaŰ˙ÍşXn[˙޲¨"•mă k»$I§Ŕ)#»‚�Éáj:Ýç×ať5˙ú±déO�GŐS N:ŽiÚ˝a&Ç5!Q¬e‹ęji‡¦$[Ëő35říł·1śŔ-łF^Rö§Âa‡rއ€XnŔs4Z;Đ-GCR—đŕ¬8p˘±\î3äk–ěŽfÝ{mť®,ť^#şbiRÜć_j%‡I˛nVF^šÉ®D‚O~´¤ŰŽ ,«ÂX3ďfűnw�Ű×˙ýŇ?JK†úS,§Fpś%ŚÜŮŰZ‰FXÚďHś] ĽËŃaÉ`ŘRłjK®S:łR·q¶©(”LXÔŃ—/a´-ĐŮ…M> P&‡\~(Ť=ĺÉP:,’đZF‰’™4Ą:Xa-^C¨ÚŽž†©1~*’Ňć2q÷ĽY˙ubĐŔP� ní¶€łpŞś=7Ľff- !Ú ¸lć´!ć3z „·X8 { ae˱ŻB`Xëţ1÷RQµT•×Ôçg•ý—˘j­¸[@î’‹‚°b<–xôůÔKT›źĐ(´ ěÖńĽY8‚ăNëĎ⊤ňš§ĚÎ 1m„‡`z(ťU‹rŇç*ó(ë?kžßYÖ-ůô}O~‘ąŹ×ő[ŤÜŰ}hqÚC)iÎÓĄ“Đ pËT™â€ddOqÜęľWräˇmF?ą• ôD$ᮎŽIP sąöˇŃŚÉ[ް´«R3%óCË’ŇŘŃ!e‘hp•dUb 3%IQ—Q¤Ţi‚é©Â}Ô¦ôpQcoăč$&Yf†ÍIKGF\Ď•BIn¶ĚŮ0ˇ|@ q Z+a“2�ČZ&†˙ú±dĚ?€řMTÓ F¸h Ýa†ĹT…IY¬±:ŞPĄ«5†&Ě ŠP­"ŇQÉśŁ˘f´JčJ ťpHĐÍk0‰ ¶‘ ±G™ĚU.ąĎX™±d𣧞ś¬Ý$ŘZqR¤¤ĚĎ9\ń8É ţ0i ¨żK´lčHYTÂăʤ%­3•†k+3Ś ¦4hvŤµíÓ¶FŽFšBhÖłt˘·—xĹš­ĺďĹÁhŠ6 M˝ż÷ŕH}‘ň‰ 7ďâŠ=ŻŰöď„­©6‘đϢ§aĄÚIǨ˘[ŁX2ŤOÓcŢ<OŞîfŻý{' @ 4eů\°č`xŘć~Ň–äŇęwź*\s*)–ŠŽę;îČ.cPŔż­Ě?f•˙Źă?íőĹť4‚l DbóKć‚=}!FÂE9oß|$ô®â|6Îł ŞX:܉JĐ,8ËÇ’©•Ó,…™Y‰Io®ŕ(ĎÚŞľ­l!Ś‚N°ěrTŔbî“<™}'éÔ}ÂÂSrE6ÚpŽ ˛Z'bn$‚AÁđBĽđWS’ŐÉ)(ČkXh¬ źsŽK*’>š°NG$Á�j¤+2„j ’łŇč&‹„Ři»wîŮA±ŢŁK›…/]Ľě·Y,˝ý·ż2ˇÜ·oµuREäNņ˘ln«¨ą  €ŕâĐ2xüěÉ$¸S&ÂŽîÂ.Örţ´xq¤¸obŤ¸V1/Ă#U¬–J´@©€szđpQ]IëŁ$aĆJˇhéx)©•E‚HTŁâaw˘YeĄZ*‰3WK ŠJĹFߎ1 ÂY~¶úŽ˝óÝţý'� }÷“Y­E‰MöŢ=zŞD–˙úÁdAC�LUS/LZŽ‰Ę˝=†ť)!U¬=3j9Łjôöí[‡q·]…–0gAG@e®Ąřg„Š ‚µ`!ú„˘4¬4Őe#Íéud+'Ó§¨˘E0÷WÔ·CÍ.IŘŢšŞ(ÂÉËŁü„ř l lë•aPˇ4Č˙ľiČjBˇś˛Ś–r•#µěRW ţQW’ľĎd¨˘Č•ŤdH$¬ißç Ťý@ëŐŠ˘%ąľűĐřB×t‚†3©á $%zą|<Ǩ2ɨ’ô4\‚�ä"DI‹M™•ÎM—´-‰Ä…CáÇ”FT-Â-h/RHZҸ¬CQ&%Ź‘źĺÍľ­ńĹ»H"xš™^éUÖ Łq¤2CĚ–ůg¶·(üú‘<Űüi+5ݤ˛Š—ĎŮ˙콡 ş›H‚¤›őŕ(R˛¨„Zű®â - Pp¬´Ĺ>˘Oq©"¨\IšµKäÄś3€ęÂĆjĽ ňň4‚¶Ĺ9Ł•ůń*\Ş•†]‹5LČňś¨Ö DpŰą#©MYSĄř^¤Ü҇ëdubh ÍÜg#‚x;č*H# !F´]“"¸ OL˛Ń·IÖ—|Éěěłý|Ż+Çkř–:Đ%&˙ýä<!!ĘP«Ä\·—# }0…ÜÄh¦�Ľ%�¤<c§ă$XFéҧ!­$ĹF<U6  z… ňb±ay˝*K;ÖLž dĚŐlÄÝŚOjcÝ^±íĽqÓˇÇK1°±+ęëŐ†5Kl÷˛çruѸ†ZV*Ś«Â®ů*Vşę–" ©mÖŔ´Z�Bp YhDĂĽě%8Ě4(D€�đe+LhŐ˘«Đ$á©Cw§` ‡€AAf9¤\ž1Nßµ†“:˛”âzĘ ćÇ�N—Zqß‚6ĽĐ„çÉ …Š-ĘBŞł?\˙ú±d–[1�"MŐk,ČHŠ­eť}IW¬=5b(Ą«)†"­Ľí˛`îʢÁżĽýÉ)N@9ňş×ă#yBÂŢ—¨xčzŤ(Ł "iźť¨đ]čŰXąEýËÍĺô_O1Ţľů` ÚY„€IËl°¤ë­‡Č™3§q—ŤókT�ÁăD—ef5”ÔlĎj¬şů¬ĘˇBő.–XOY�ĂĘŕćJĺ±ÍYŘďͧW*-9gXmzŞ– ďÇ5úgmLß;Ť´Đůý‡$-ݏ›Ţ:÷ úJ$U×b­ôX΀˘ ‚–]u¶Ä±á”iOG]ÓoC ÔĘ@ŃđV% KÎtQ$]ËĽŁgBk)T™c,č-LFpíOžm. sólG‚‡:Nw§ç‚ůš$ąâŚk˘kěŽo•µ°Sî™3»(ಪS.t©zćOÚHĹ,Ś–Çę Ü]ÎH5 iE1t Bă‡tĽ8 –‰=Ü9v“Y,MŻ{ěĹ5­+(ő×Q ©l†RČŰXÓ†Z‰}`0m}Łó« ŰŽľHő l‘E0klÝ h4 ĚĄëŹ+TAG���������������������������������������������������������������������������������������������� 00000000 00000000 00000000 �� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/segfault.aif���������������������������������������������������������������0000664�0000000�0000000�00000000037�14447736377�0017433�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������FORMcČ.AIFFCOMM�����SSNDcČ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/segfault.mpc���������������������������������������������������������������0000664�0000000�0000000�00000000023�14447736377�0017446�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MPCKSH•úÁ����˙���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/segfault.oga���������������������������������������������������������������0000664�0000000�0000000�00000000170�14447736377�0017440�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������{Ç^d���y ¶ULAC��fLaC���"����� ¶¶¶¶¶¶¶¶¶¶¶Ä¶¶¶ �¶¶¶¶¶¶¶Éj¶¶¶���Ô¶¶Ąđw,üĎx@� €şŕyâ%@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/segfault.wav���������������������������������������������������������������0000664�0000000�0000000�00000000036�14447736377�0017470�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFF9��WAVEfmt ���˙˙data������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/segfault2.mpc��������������������������������������������������������������0000664�0000000�0000000�00000000006�14447736377�0017531�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MPCKSH��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/silence-1.wma��������������������������������������������������������������0000664�0000000�0000000�00000105130�14447736377�0017426�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������0&˛uŽfϦŮ�Ş�bÎlx���������3&˛uŽfϦŮ�Ş�bÎl4������� �����t�e�s�t�����������ˇÜ«ŚG©ĎŽä�Ŕ Seh�������Cö©é§O;J‚¬°)rJŐXŠ������9.—@ůĆ �������°Ď���� Đ<����«���������Ę ��Ę ��­ü��µż_.©ĎŽă�Ŕ SeÚ������ŇÓ«ş©ĎŽć�Ŕ Se�¬��©FC|ŕďüK˛)9>ŢA\….��������s�k��� e�n�-�u�s���]‹ń&„EěGź_eRÉ�������ęËřĹŻ[wH„gŞŚDúLĘz����������� �����I�s�V�B�R��������4������D�e�v�i�c�e�C�o�n�f�o�r�m�a�n�c�e�T�e�m�p�l�a�t�e���L�2���tÔßĘ E¤şš«Ë–Şčp����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ËĄćrĆ2C™©iR[ZX�����������������������ú��«������ú��«������« �������.˘��������� ŢŞŮ|śOĽ(…UÝâ˘"�����������������@¤ĐŇăŇ—đ� É^¨P¤���������W�M�F�S�D�K�V�e�r�s�i�o�n������1�0�.�0�0�.�0�0�.�3�6�4�6����W�M�F�S�D�K�N�e�e�d�e�d������0�.�0�.�0�.�0�0�0�0��� �I�s�V�B�R���������@Rц1Đ٤� ÉHö®�������ARц1Đ٤� ÉHö�����W�i�n�d�o�w�s� �M�e�d�i�a� �A�u�d�i�o� �9�.�1���$� �6�4� �k�b�p�s�,� �4�8� �k�H�z�,� �s�t�e�r�e�o� �2�-�p�a�s�s� �C�B�R����a‘Ü··©ĎŽć�Ŕ Ser�������@žiřM[Ϩý�€_\D+PÍĂżŹaĎ‹˛�Ş�´â ���������������Čöňa�€»��A��« � �����­*��« « ��Îuř{ŤFŃŤ‚�`—ɢ˛ ���������­ü��6&˛uŽfϦŮ�Ş�bÎlŕv������Cö©é§O;J‚¬°)rJŐ �������‚��]����U����« ��«�� ��÷% "" ďôű’wú=´ ‚ ‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]U��U����« ��Ő����AA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]Ş��U����« ��+��(��AA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]˙��U����« �� ��8��AA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]U��U����« ��Ö ��H��AA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]Ş��U����« ��+ ��X��AA" ďôű’wú=´ ‚ ‚������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]˙��U����« �� ��h��AA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]U ��U ����« ��Ö��x��AA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]Ş ��U ����« ��+����AA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]˙ ��U ����« ������AA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������‚��]U ��U ����« ��Ö��¨��AA" ďôű’wú=´ ‚ ‚����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/silence-44-s.flac����������������������������������������������������������0000664�0000000�0000000�00000143330�14447736377�0020102�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������fLaC���"���y�+ ÄBđ�zŔb‘ŰŘÜ·ÜH2äÄşJ��l�����������������������˘�������.L�������Ć�������8”������V�������aľ������ž�������vL�˙˙˙˙˙˙˙˙������������© ���reference libFLAC 1.1.0 20030126������album=Quod Libet Test Data ���artist=piman ���artist=jzig ���genre=Silence���tracknumber=02/10 ���date=2004 ���title=Silence�L1234567890123������������������������������������������������������������������������������������������������������������������������X€��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������123456789012�������������������������������¬D������������Ŕ������������������������������L��������X������������������������������������������zŔŞ�����������������������������Ç������ image/png���A pixel.����������������–‰PNG  ��� IHDR���������wSŢ��� pHYs�� �� �šś���tIMEÖ  6D=2���tEXtComment�Created with The GIMPďd%n��� IDAT×cř˙˙?�ţţÜĚYç����IEND®B`‚� ô������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙řY�k?źóţ˙˙ţ˙˙˙ůţO˙˙˙Ď˙?˙˙˙˙ţs˙˙˙˙˙??˙˙ů˙˙?ü˙˙˙??˙˙˙˙˙˙˙˙˙ů˙˙˙˙˙?˙źź˙˙˙˙ç˙˙óç˙˙ţ˙ó˙ţóóçĎ˙˙ů˙Ď˙˙˙˙˙çĎ˙Ď˙Ď?˙˙˙ź˙ü˙˙˙ź˙˙˙˙˙˙˙˙źň˙˙9>?˙˙˙ä˙ó˙˙üü˙˙Ěçţç˙Ď˙˙˙˙˙˙˙˙˙ç˙˙˙˙óü˙óç˙˙Ě˙ü˙˙˙˙ů˙˙˙˙ź˙˙ţ˙˙˙óü˙˙˙˙˙˙ů˙ç3˙Ě˙˙ů˙ţyóţ˙źüž˙˙ţ˙˙˙˙óů˙˙˙˙˙ó˙óź?˙Ěź˙˙˙ţóĎ˙źź˙ůü˙˙çů˙ů˙˙˙˙Ď˙˙ç˙ň˙˙˙>˙˙ç˙ž˙˙óó˙?ç˙ňO˙ç˙üó˙˙˙ü˙˙Ď˙˙˙ü˙˙˙˙˙˙ţĎ˙˙˙đ˙?˙˙˙˙Ď˙˙Ď˙üĎüů˙˙ü˙˙ç?˙ü˙ţ˙?˙˙˙?˙˙˙˙ź˙ç˙˙˙Ďü˙˙˙˙źů˙˙ţ˙˙˙ţ˙˙˙˙˙˙˙˙ź˙˙˙Ď˙˙ü˙ţ˙Ďźç˙çţy˙˙˙ů˙ůĎü˙źĎ˙˙Ď˙?˙˙˙˙ç˙˙ź˙çü˙ů˙˙ü˙ó˙˙˙ĎĚüüç˙˙˙?˙Ď˙˙Ďź˙˙˙ś˙˙ź˙˙óü˙ć˙Γüç˙˙˙˙?˙ó˙˙˙ź˙ó˙?ó'<Ď˙3˙˙˙?˙˙˙?˙ćů˙˙ů˙˙üóźü˙ź˙˙źůóü˙ü˙ţO˙>Iü˙˙˙˙˙Ď˙˙Ěç˙˙ç˙ź™˙˙˙˙ü˙˙˙˙?“Ďů˙˙?ç˙˙˙ü˙˙˙˙˙ź˙˙žNyó˙ç˙˙˙ç˙ţ|Ď˙˙ůó˙˙ů˙ůţ|˙˙ů˙?˙˙˙ç˙É˙ů˙˙çů˙ź˙˙˙˙˙˙˙˙˙˙˙˙?˙ţó˙źń�Có˙˙˙˙˙˙˙ó˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙˙˙Îţ˙óóç˙˙˙3ź˙óç˙ç˙˙ů˙˙˙˙ů'˙ś˙ç˙˙Ď˙?˙˙ĎĎ˙˙˙˙?˙?˙˙˙˙˙˙ź˙ü˙ć˙óü˙?˙ü˙ţů˙˙˙ź˙ů?˙˙˙Ď˙óĎĎç˙˙˙˙˙Ě˙?˙˙˙óź˙ů˙˙Ďçç˙ó˙˙çź˙ü˙˙˙˙˙??˙˙ü˙˙˙˙˙˙˙?˙źü™ţůĎü˙?˙˙É˙ó˙˙ţ˙ź?˙˙˙?˙˙?˙˙˙˙˙˙˙˙ü˙˙Ď˙ţg˙˙çç˙ů˙˙ž|˙˙˙˙ź˙?˙ů˙˙˙çä˙ó˙?˙˙ó˙“ó˙˙?ó˙˙˙˙˙˙źÎ?˙üţs˙˙˙ç˙ä˙?ó˙˙˙˙˙˙˙˙ţ|ç˙óóç˙˙óţg˙˙˙?˙žy˙˙˙źźÉ˙˙˙˙˙Ď˙˙˙˙˙óţg˙çü˙ź˙ţĎ?˙˙đĎüü˙˙˙ü˙ů˙˙óüóů˙ü˙˙ů?˙ü˙˙˙˙˙?˙˙Ď˙ňó˙˙Ď˙?ůůü˙ü˙˙˙çźç˙˙Ďç˙˙˙ó˙˙˙˙˙ň|ó˙™˙˙˙ź˙˙˙˙˙ţů˙˙Ďź˙ś˙˙?ź˙˙ó˙˙?˙˙˙ç˙˙óźó˙˙˙˙˙˙˙˙źó˙ů˙ź?źź'˙˙˙Ď˙˙˙çźóů˙˙?˙˙˙ü˙'ź˙˙ü˙˙˙˙˙źóź˙?źç˙ĎĎ˙źśó˙˙˙˙˙?˙˙“˙ó˙˙Ě˙˙˙˙ůó˙Ď˙ó˙˙˙üó?üĚ˙óź˙Ě˙ü˙?˙˙˙˙ů˙ó˙˙˙9ţ“˙˙?˙ů˙˙ü˙?˙??ź˙ÎsĎź˙˙˙˙˙ţ˙ţ˙ůźĎůç˙˙>˙ś˙çţĎů˙˙˙˙˙ć˙˙ó˙˙˙óÎ˙ó?Ď˙ţ˙'˙˙ţ˙˙˙ţOţy˙˙Ď˙ňůó˙óśźç˙˙çů?˙˙˙˙˙źđ4u˙řYl?˙˙ů˙ó?˙˙ź™˙˙˙Ď˙˙˙˙˙˙˙üźĎ9Ď˙˙Éüçňů˙˙˙˙˙˙ů˙˙˙ů3˙˙ů˙˙˙˙ó˙˙˙˙??˙>ó?˙˙çç˙˙˙˙˙˙˙˙˙˙ţž˙˙Ď˙üů˙Ď˙˙™˙Ďů˙˙˙˙ůţ˙˙˙ůźç˙˙çţś˙ü˙˙˙˙˙˙Ďź?ź˙ó˙˙˙˙ž˙ů˙˙˙˙ţy˙3˙ó˙?˙?üĎä˙˙˙˙ó˙ç?˙źü˙˙óţ˙˙ţOźů?ćy˙˙˙˙ź˙˙˙˙˙óţ˙˙˙Ď˙˙ç?˙É˙˙˙˙˙?˙˙˙äĎ˙?˙˙˙˙ü˙˙˙˙˙˙˙˙Ď˙˙ź˙˙ţç˙˙˙˙˙˙˙çźüź˙˙ů˙˙˙˙˙?ţ˙ó˙˙˙?˙9˙?˙ó˙˙9ź˙ů˙˙˙3˙˙ü˙˙ó˙˙˙˙˙˙˙˙ů?źĎ˙ů?™˙˙ţ˙ţ˙ó˙ü˙˙˙˙˙˙Ěü?˙ţ˙˙ź˙ü˙ó˙˙<Ěüçţ˙˙˙ü˙ç˙ç˙˙˙˙äţ˙ţ˙˙óü˙˙˙˙ü˙˙ç˙˙ü˙˙Ď˙˙˙˙˙˙Ď˙ççů˙˙˙<˙˙˙˙ů3äüś˙˙ó˙˙˙˙˙˙˙źů˙Ď˙˙üź˙ţO™˙Ď˙˙˙˙˙ç˙˙˙˙˙˙˙ůü˙˙ů?žóźůó˙˙˙ţ˙ţ˙˙˙Ďü˙Ďçç˙çĎ˙˙óÉü˙˙ó˙˙Ď˙˙˙ź˙ü˙˙˙ć˙˙Ď˙üüçó˙ó˙˙ó?˙˙Ď˙ů˙ó˙ü˙?˙˙˙<˙˙ź˙˙ü˙9˙ĎóĎ“ů?˙˙ůĎó˙˙˙˙˙˙ç˙?˙?˙ţóň9?ţ~Oů˙˙ůź??ä˙˙˙˙˙ç˙˙ç˙˙˙ź˙žg˙˙˙˙üüůů˙˙ç˙óó˙źţ˙Ď˙Ďç˙˙ţůĎ?˙óůóţ~?˙˙˙˙˙Ďž˙˙ź˙’˙˙™˙˙ţNů˙ţO'˙ń�CÉźůç˙˙˙ź˙˙Ď“ţsü˙˙ç˙˙Ďź˙˙˙Ď˙˙ź˙˙źů˙˙9Ď˙˙ůţ˙™˙˙ü˙˙Éů˙üź˙˙ţ˙˙ç?ţgç'?˙˙?ź˙˙˙˙ţ|˙˙˙ó˙Ď˙˙?˙Ď˙Ď™˙?˙˙˙˙˙˙˙˙ź˙ç'?3ó˙˙ůç˙˙˙“˙˙˙˙źůüţ|˙˙˙˙ůüçĎ˙˙˙˙˙˙?˙˙ç˙˙˙'˙˙˙˙˙?ó?˙˙˙˙˙źůç˙ů˙˙˙˙Ěů˙ç˙˙˙˙ů˙˙˙?˙˙˙?˙˙˙ź˙?˙˙˙˙<˙˙?˙˙üů˙˙˙?˙˙ů?ç?˙˙˙˙˙˙˙ü˙ü˙ůţd˙˙˙ň˙˙ćäĎ˙ů˙˙˙?˙˙˙˙˙˙ó˙?˙˙˙˙ä˙˙˙˙ůç˙˙˙˙Ď˙?˙˙˙ç˙ź˙˙Î˙˙˙ůçźĎ˙˙˙ó˙˙ç˙˙˙˙˙žź?˙É˙˙ţg˙˙ţ˙˙˙˙˙˙˙ůś˙˙ü˙ž?˙˙˙˙˙Ď?˙?˙˙üóĎźçţ?ź˙ţóçţ˙üç˙˙źů˙˙ů?˙˙˙ç˙˙˙ü˙˙˙źů˙ů˙˙ź˙˙?ţ˙ç˙˙˙>y˙˙˙˙˙ţ˙Ďź˙çĎ˙ó˙ů˙ů˙˙˙ţÎ˙˙˙ź˙˙˙˙?ů˙˙˙˙˙˙ůóó˙ó˙ňg˙óó?˙˙9˙˙˙ů˙ţ˙óçç˙?źĎ˙˙˙˙˙źó˙˙üçç˙˙<˙˙??˙˙ů˙˙˙Ďţ~ţ˙˙˙?˙˙˙˙ž˙˙˙˙ç9ů˙˙˙?ç˙ü˙Ďůžóç˙˙˙ü˙ţI˙˙˙üĎ˙Ďů˙ó?˙?˙ü˙ó˙˙˙ţü˙˙ů˙˙?˙˙óůü˙˙˙Ďź˙˙˙?ň|ţ˙˙ů˙˙˙˙˙˙ó˙˙˙˙˙˙˙˙˙˙˙˙ü˙Ď˙çůţ˙˙ó˙˙źźç˙˙Ď˙ç˙˙ç˙?˙˙˙˙˙?Ě˙˙˙ç˙˙đ‹±˙řYe?˙3ź˙ü˙ç˙˙˙˙˙˙?óź˙?˙˙˙˙˙ů˙˙˙ç˙˙ĎĎů˙óç˙˙ů˙˙ů˙˙“>|˙Ď˙˙çç˙ţĎçç˙?ź˙˙˙ů˙ţţgóü˙ů˙˙˙ţgź?˙˙Ď˙˙˙ç?˙ç˙>˙źţţ˙˙Ď˙˙ů˙ů˙ůó˙ź˙ţ˙ţ˙˙Ď˙ž|˙˙çţ~s˙˙ç˙˙˙ó<˙óůůź˙Ď˙?˙3˙óÎsţ˙ç˙˙˙ţ˙˙˙Ď˙˙üůň˙?˙?˙Îç˙ü˙Ď?˙˙Ď˙ů˙˙˙'˙ţţź˙˙˙üů˙˙ó˙ůĎ˙˙'ţň˙ţ<“óţó˙˙˙ó˙ó˙˙˙˙ů˙ţ~ü˙˙˙?Ď˙ü˙˙ó˙˙˙Î˙˙˙˙ů˙ç˙˙˙ţ˙Ě˙üüü˙˙˙ź?Ď?˙˙˙˙ů˙˙˙˙˙˙˙Ď˙˙ćO<Ď˙˙˙üů˙˙çź˙˙ó?ç˙˙ů˙˙˙˙˙˙˙đź˙˙˙ç˙ó?ź˙üź˙˙’~O˙˙˙˙˙Ď˙˙˙˙˙˙˙˙˙ç˙źţ˙˙ţgţ˙˙˙˙Ďů˙˙˙?˙˙˙˙˙˙Ď˙˙˙ś˙?˙ó˙˙źźź˙˙ů˙˙źźśç˙˙˙˙˙ó˙ź˙˙˙ü˙ç??óó˙˙˙˙ź˙˙ç˙˙ţ~y˙˙˙˙˙ţy?˙?˙˙˙˙˙ź˙??˙˙˙ź˙Ď?˙ů˙˙ź˙çĎţgü˙??˙ů˙žO˙˙˙ů˙üů˙ü˙˙ůů˙˙˙˙˙?˙ü˙ź˙9˙ţóĎ˙˙˙˙ůć˙?˙Ď?ţg˙˙˙çź˙˙ź˙˙˙˙˙üÎ˙™üţ˙˙ó˙?˙˙˙ç˙˙Ď˙Éů˙˙˙˙üó˙˙˙˙˙ţçĎ™źţ?çź˙˙˙žţy˙?˙˙ç˙˙ç?˙ů˙?˙Ďů>y˙ţ?ç˙ç˙ů˙˙Ď˙˙˙˙˙˙˙˙˙üţ|˙ţů˙˙ţ˙˙?˙˙ůóó˙ń�C˙˙˙˙źü˙ţsó˙˙źó˙˙˙ü˙˙˙˙ó˙˙˙˙çĎţ˙˙˙óó˙˙˙’ţů˙˙˙˙˙˙ü˙ó˙˙˙ó˙˙˙˙˙ó˙˙˙ţ|ä˙?ź˙ź˙óüţ˙˙˙˙˙˙˙ţĎ˙óü˙˙˙˙ţ?źů˙˙˙˙˙˙˙˙˙ó˙˙˙˙˙ů˙˙óçţN˙ůĎĎ˙ó˙çň˙üĚź˙ó˙˙˙˙Ď˙˙˙?˙˙˙ç˙˙óü˙źźů˙˙˙˙ü˙3˙ćgó˙ź˙üź˙˙ç˙ţ“˙ň˙˙?˙˙ç˙˙žĎ˙˙˙˙ä˙Ďóç˙˙˙˙ç˙?˙˙˙çó˙˙˙˙˙˙˙Ď˙˙˙˙˙ü˙ţ˙˙óç?ó>sĎçţg˙˙˙˙˙˙˙˙˙˙˙É?óź˙˙˙ţLó˙ç?˙źü˙˙˙ź˙Ě˙˙˙˙˙çç˙˙˙?Ď3ó˙˙˙ź˙Ďü˙ů˙˙ź˙ź˙ňO˙˙˙˙˙ů˙˙ů˙?ůĎ˙ó˙˙˙˙ç3˙ţyç˙˙˙˙˙ç˙˙˙źů˙˙˙˙˙óó˙ţ˙˙ü˙Ď˙˙˙źü™ţ˙˙çů˙˙˙˙˙˙˙™˙˙?ó˙ó˙˙ó˙˙˙˙˙Ď˙˙™ź?˙˙Ď˙˙˙˙?˙>˙˙˙˙˙çź˙˙˙Ď˙˙˙˙˙ç˙˙źüź˙˙ç˙˙˙ü˙˙˙˙ů3Ďţ˙çó˙˙ź˙˙˙˙˙˙ů˙Ďź˙ţ˙˙˙źó˙˙É˙˙˙ó˙˙˙˙˙˙˙?˙˙˙'˙ţ3˙˙ź˙˙źçź3ü˙ůó™ţç˙˙üÎ˙ź˙?˙˙˙˙ţ~|˙˙˙˙ć|˙˙óů˙ç˙ó˙ţg˙˙?˙˙˙˙˙ç?˙Ď?É˙˙˙˙ů˙ü˙ţO˙źĚóţü™Ď˙˙˙?˙Ď˙˙ţ|˙ţgź˙˙çĎ˙ź˙“˙˙ü˙˙˙ůů˙Ď˙˙˙˙˙ü˙˙˙<˙?˙óů˙˙˙ň˙˙˙˙Ěüç?˙˙“˙˙źç˙ü 6˙řYb?˙çź˙üç?˙˙óó˙ź˙˙˙˙˙˙ćů?˙˙óźţs˙ůóçç˙˙˙Ďć~˙źäţy˙˙˙<˙˙˙Ď˙Ď˙ž˙˙ç˙˙źó˙ůü˙ţ˙çç˙ź?Ďţ˙˙˙ç˙˙?˙ţO?˙˙ç˙Ďź˙˙˙Ď˙˙˙˙˙śţ˙˙ź˙óü˙˙˙˙ů˙˙˙˙ů˙˙źĎ˙çó˙Ď˙Ď˙˙˙˙˙ó˙ç˙˙ţ?ţóĎĎ˙˙ó˙˙˙Ďź˙˙˙óĎ˙óů˙ź˙˙˙ůů˙˙ç˙˙?˙˙˙˙ó˙˙˙˙˙˙˙˙˙çţg˙˙˙?˙˙É˙˙˙óü˙˙˙˙˙˙˙Ďçź˙?˙˙˙çů˙˙Ď??˙˙˙˙˙?˙˙źó˙ů˙˙˙ç˙Ďź˙˙˙˙˙˙˙Ď˙˙˙˙źź˙˙˙Ďç˙˙˙ź˙˙źü˙˙˙˙˙˙˙˙˙óçţ˙˙˙ů˙˙˙˙˙˙Ď˙˙˙˙˙ţç˙˙˙˙˙ţ ˙˙óţź˙˙ó˙ĎĎ˙˙ü˙˙˙˙˙˙˙˙˙˙˙ü˙ç˙˙Ď˙ţů˙?˙çţ˙ç˙˙“˙˙žs˙ţ?˙˙˙˙˙ó˙ç˙Ďţs?˙ţ?˙ĎüźĎţç˙ţ˙<˙˙˙Ďü˙˙ó˙˙™?˙ó˙ţg˙˙˙ţóüţç˙˙˙˙?˙˙ü˙˙˙˙ü˙˙?˙˙ü˙˙˙˙˙˙˙?˙ü˙˙ç˙óůź˙˙Ě˙ţ|˙˙óź˙˙Ď˙˙Ď˙˙˙ţ˙˙˙ňgóž˙źů˙$ź˙óź˙3?çü˙ü˙Ď˙˙ź˙˙˙Ď˙˙˙˙Ďů˙˙˙ç˙˙˙˙˙˙˙ţ˙˙ůüü˙˙˙˙˙ü˙óţţfóź˙˙Ď˙ţ˙˙˙˙ü˙ů˙óüĎ˙ü˙Ď˙˙˙ü˙˙˙˙˙žĎü˙˙˙˙˙˙˙óĎ˙˙˙˙˙?˙źü˙˙ó˙˙˙˙˙ü˙çśźü˙?˙çź˙˙˙˙˙˙˙˙üĎ˙ń�C˙Ď˙˙˙˙˙ü˙˙˙ůçů˙˙˙ç˙˙ů˙˙˙˙ĎĎ˙˙ó˙źůţyź˙˙ź˙˙˙˙˙ţ~I˙˙ů˙˙ó˙Ďź˙˙˙˙˙ü˙Ď˙˙?ů˙˙˙Ď'Ďóüóü˙źź˙˙˙˙?˙ó˙˙ü˙˙˙'ţOů˙˙˙˙˙˙˙ü˙çü˙˙˙˙˙˙˙ç˙˙˙˙ü˙ů˙˙ź˙˙˙˙˙˙˙˙ů˙ó˙˙˙ó<˙ó˙ç“˙ź˙˙çĎ˙<˙˙˙˙˙ç˙˙˙˙˙?'˙ç&?ź˙˙˙˙ţĎů˙ţO3˙˙>˙Ď˙˙˙˙˙ç˙˙˙˙çůţgů˙ź˙Ďţůźůç˙˙˙˙˙˙ţ~g˙É˙˙˙˙üçÉţ˙ü˙˙˙˙çü˙˙˙źţg˙ţó˙˙˙˙ç˙ź˙ů˙ź˙˙˙˙˙˙ç˙˙˙?ů˙Ď˙üůó˙Ďź˙˙ź˙˙˙?ü˙Ď˙˙˙˙˙É˙ź˙üÎ˙ů˙ç˙ţg˙˙˙˙˙˙˙˙ţüó>˙ç˙˙óů˙ź˙ź˙˙˙ů˙ů˙˙ůź˙˙˙ţs˙óä˙ó˙üţůç˙˙˙˙˙˙˙ĎÎĎó˙üüĎ˙˙ü˙˙˙˙ź˙ů˙çů˙˙˙˙˙üó˙˙óĎ“9˙Ď˙?˙Ďţ˙ü˙ÎL˙˙˙˙ţ˙˙Ď˙ţţ˙˙˙>ůó˙˙ů˙Ď<ć?ů˙çůůţ?Ď˙ź˙˙˙˙˙˙˙˙˙˙˙˙˙ţg˙˙˙˙˙?˙˙ů˙˙˙˙ś˙˙˙˙˙?ç˙ś˙˙<˙˙˙ó˙ů˙˙ţ~ź?Ď˙˙˙˙˙˙˙˙˙˙˙çţ<ó˙óóü˙˙˙˙˙źţçç˙˙˙ó˙˙˙˙ü˙˙˙ó˙˙“˙ź˙˙˙?ç˙ź'˙˙çů3˙ó˙˙˙˙˙ů˙˙?˙˙˙˙ççź˙Î˙˙ůÉ˙˙ü˙Ď˙ü˙˙üççç˙˙˙óóÉůó˙˙˙ç?˙˙ç˙˙ţgź?˙ţ˙˙˙Ď˙˙˙˙ĚďX˙řYw?ç™?ţg˙ů˙üóü˙ó˙ůäç˙˙˙˙˙çó˙źĎźź˙?˙˙˙ĎůĎç˙˙˙˙˙˙óůĎçüó˙˙˙˙˙ţ|˙çĎ˙˙ů˙˙˙˙ţ˙ź˙˙˙˙˙˙˙˙˙ç˙˙ź˙˙ůüó?ţü˙˙˙ç˙™˙ź˙˙˙ţs˙˙˙Ď˙ü˙?˙˙˙˙ů˙çç?ů˙˙ü˙˙˙˙Ďü˙˙˙źĚ˙ţy˙˙˙ó˙çóź?ů˙ó˙˙˙˙óççź˙˙˙˙ź˙?˙2gţźů˙˙˙˙óçÉ˙˙<üü˙ó˙źů˙˙˙˙äů˙˙˙˙˙˙˙˙ó˙˙ç˙˙˙˙˙˙ç˙ü˙˙˙˙˙˙˙ůţsü˙źçç˙çĎ?˙˙˙˙˙ůţ?ź˙˙˙˙˙Ď˙ó˙Ďţ|˙˙˙˙˙™>gź˙Ďóó˙?Ď?˙ź˙˙çç˙˙ů˙˙˙˙˙˙ź˙˙ó˙˙?˙˙˙˙ň˙Ď˙˙˙˙˙ź˙źç˙źóó˙˙˙ç˙˙ů˙ç˙˙˙˙“ů˙ś˙˙ů˙Ďü˙źţü˙˙˙ó˙™?˙˙“˙˙ü˙˙śóó˙˙?ü˙˙ůźÉ??ţ˙˙Éź˙˙ůů˙˙˙óů˙˙ź˙˙?ž˙ç˙˙˙ů˙˙˙˙äüů˙ć?Ě˙˙˙˙˙˙˙˙˙ň˙˙ź˙˙˙˙˙˙˙˙˙ů˙˙˙˙˙˙Î˙ţ˙ţs˙<ü˙çç˙“˙˙óśźţg˙˙˙˙ňĎ?˙˙ç˙ç˙˙<˙˙˙˙ü˙˙˙Ď˙˙˙˙˙˙ůĎ˙ü˙˙Ď˙˙ţ˙Ď˙ü˙žó˙˙˙˙ů˙ü˙˙źů˙˙ü˙˙ź˙˙˙˙˙˙ź˙˙˙ź˙ü˙˙ç˙ü˙˙˙˙Ď˙˙˙˙˙Ď˙Ď'˙˙˙ź˙ź˙üĎĎ˙˙Ď˙˙˙üĎ˙˙˙˙˙˙ůç?˙çü˙˙Éüćó˙˙˙˙˙˙˙˙óţs™ţ|çć˙˙˙˙˙˙˙˙Ď˙ó˙˙˙˙ó˙ţy˙Ď>óź˙˙ů>|üůů˙˙<˙?˙ţ˙?˙˙äç˙3˙źź˙˙ůůç˙˙ü˙ó˙É˙˙˙ůçó˙˙ů˙˙˙˙˙ţg˙˙˙˙˙ó˙˙˙˙˙źů?Ď?˙˙óü˙˙˙˙źź˙™˙ó˙˙ç˙˙˙˙ů˙˙˙˙˙ţy˙˙Ďó˙˙ź˙˙ůźćg˙Ď˙ţç˙˙ü˙˙˙ţyţ˙˙˙ç˙ó˙ź˙˙˙˙ţ˙˙˙Ďţsů˙˙üźź˙ů?˙ţs˙˙Ď˙˙˙źó˙ć~~?ź˙˙˙˙ç˙Ď˙˙˙˙çó˙Ď˙“ţ˙˙ó˙˙˙˙źĎ˙óź˙Ď?˙üó˙˙ů˙˙˙˙Ďç˙?˙?˙˙ů˙Ď˙ů˙˙˙˙˙ů˙˙˙˙˙ů˙ů˙˙˙˙˙ó˙˙˙˙˙˙śÉ˙śç˙?˙˙˙üĎ˙˙˙˙˙˙˙ĎĎůĎ˙˙“˙ź˙˙ó$óůţüü˙ţs˙˙˙ź˙˙˙˙˙˙˙˙˙ţ˙˙˙??Ďů?ňyţ˙ä˙Ăü“˙˙çç˙˙ś˙źü˙˙ź˙˙ź˙óůüç˙˙ţ˙˙˙ů˙ůů˙˙˙óź˙˙˙˙˙Ď˙˙ó?˙˙üţg˙óç“˙<ů˙˙?ç˙óţ˙ó˙˙?˙˙˙˙˙˙?ů˙˙˙˙ţ˙çó˙ţ˙ó˙˙ňO˙˙˙˙˙˙˙˙3˙?˙źţy˙˙˙˙˙ü˙˙˙ü˙˙˙˙˙˙˙˙Ď?˙˙˙ů˙˙źç˙˙?ś˙˙ůóÉó˙˙˙ţ3˙'“˙˙˙?˙ţ˙˙˙˙ç˙˙?ó˙˙˙ů˙˙Ďź˙˙˙˙˙ţţç˙ó˙˙˙ç˙˙ź˙9ó˙äç˙˙ü˙˙˙Ď?ź˙˙˙ç˙˙˙˙˙˙ů˙˙ů˙˙˙˙˙ó˙˙ü˙?˙˙Ď˙˙˙˙˙˙˙˙˙˙Ě˙˙Ď?˙˙ç˙˙˙ůüź˙˙ü˙˙˙˙ź˙˙ü˙˙˙Éţž?çüźü˙˙˙?˙˙ůç˙˙˙óüü˙ů˙Ď9˙źźů˙˙˙?ĎO4˙řYp9˙˙ü˙˙˙˙ů˙?˙˙˙˙˙ç˙ü˙?ůĎů˙Ď˙˙ó˙˙ů˙?˙˙3Î˙˙˙ü˙˙˙ţs<˙˙˙˙˙ţ˙ů˙˙˙˙źçĎ˙˙˙ó˙˙˙˙ü˙˙˙˙'˙˙˙˙˙˙˙ü™ź˙?źź˙˙ź˙˙˙˙óü˙?˙ü˙˙óĎ˙˙˙ç˙çü˙˙Ďů˙ü˙˙?˙ç?˙óůäĎóó˙˙˙çů˙˙˙?ç˙Ď˙˙˙üĎ˙˙ţ˙üÉţ~˙˙˙<üźź˙˙˙ţź˙˙˙˙˙˙Ď˙ó˙ůü˙˙˙˙˙˙˙ů˙˙ó˙˙'ü˙ó˙ź˙źž˙Ď˙˙óźü˙ů˙˙˙ó˙˙˙óţ˙˙ţóţ˙źţü˙˙ů˙˙˙˙˙˙ů˙˙˙ů˙˙˙˙üź˙˙˙˙ů˙˙ů˙˙˙ç?˙˙˙ó˙ů˙ź˙˙ź˙˙˙˙˙ó˙˙˙˙˙˙ůţy˙˙ţç˙ůó˙ĎĎţy˙ůţĎ˙˙ů˙˙˙˙Ď˙˙˙?ţ˙˙?˙?˙˙ó˙˙˙ţü˙˙˙˙˙˙˙Éü˙ü˙˙˙˙ó˙çü˙ó?Ě˙˙ü˙˙˙žg?žů˙˙˙?˙˙˙óů˙˙ů˙Ďź˙ç˙˙??˙˙˙ó˙˙çóůó˙?˙˙˙˙˙˙˙?˙˙ź˙˙˙˙˙˙˙ţ˙ů˙ó˙˙˙ó˙˙ó˙üź˙9˙Ď˙˙˙˙Ď˙ź˙ü˙˙˙ó˙ó˙˙˙˙˙˙˙˙˙ţ˙˙ü˙˙˙˙˙óç˙˙˙?ţO˙ç˙˙˙˙˙˙˙ü˙ś™˙˙˙˙?˙˙˙˙Éź?ç?˙ů˙ü˙ź˙˙˙˙ź˙óţç˙ů˙˙˙˙˙ů˙˙ü˙˙>˙˙˙˙˙ţ˙?˙˙Ď˙9ó˙˙Ď˙ţ˙“˙ů˙śź˙˙˙˙˙˙˙Ď??˙˙˙˙˙˙?Ď˙˙˙˙źó3çź˙Ď˙?Ěü˙źţ˙˙?˙źó˙ü˙˙ů˙˙˙˙˙˙˙˙ó˙˙˙çüÄ ˙?˙˙˙˙óůžs˙˙˙ü˙˙óüů˙ĎóňĎ˙˙˙˙˙˙Î|Ď˙˙˙ůó˙üůó˙óĎ˙˙˙˙äü˙˙˙Ě˙˙ů˙üţü˙Îó˙ůó?˙˙˙óźç˙ó?˙źç˙ç˙˙?çü˙ź˙˙˙˙˙˙9ü˙3˙˙˙˙˙˙?˙ü˙ůó˙ţç˙˙˙˙çüţ˙?˙˙ó˙˙˙ůţ˙˙˙˙˙˙˙˙˙çů™˙ůś˙óçó?É˙ů˙˙˙˙˙˙Ď˙˙ü˙?ź˙?ţ˙˙˙?ó˙ç˙ţ˙ü˙Ď˙?˙˙˙ź<˙ü˙˙˙˙Ď˙˙ü˙˙˙˙˙ůţ˙˙çś˙˙ś˙˙ó˙˙“˙üçů˙ç˙˙˙˙ç˙˙˙˙˙ů˙üů˙ź˙ţO?˙ç˙˙˙ůüĎ˙˙ź˙üžfs˙˙Ď˙ţ˙˙˙˙˙˙ţs?˙ź˙ź˙˙˙˙˙˙ü˙˙ů˙˙˙˙˙ó˙ź˙˙˙™ü˙˙üĎ˙˙˙˙?˙˙˙üü˙>Ď˙˙ůó˙ć˙˙˙ç?ţ˙ç˙ţĎĎ˙žňó˙ţ~ţ˙˙ţţg˙˙˙ó˙ůţ˙˙˙˙üç˙˙ç˙˙˙źü˙ţ˙?˙˙ź˙˙˙ź˙˙óţů?˙˙˙óç˙'˙˙˙˙ţ˙ţg˙˙˙ź˙˙çţ˙?™?˙źź˙ů˙ţ?ůĎ˙˙ţ~g˙óů˙˙˙˙ž˙óç˙?ä˙ţ?óź˙ó˙?˙ç3ţgĎĎ˙˙˙Ě˙üó˙˙óţů˙˙˙ů˙ů˙ä˙˙ç˙Ď˙Ď˙Ď˙˙˙źź˙?˙3˙˙˙ź˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ç˙˙˙˙˙??˙˙źĎ˙ü˙˙˙˙˙Ď˙“˙ţ˙˙˙ţ˙˙ů˙ó˙˙üó˙Ď˙˙ů˙˙˙˙˙˙üóź˙˙Ďźó˙?Ďů˙˙?óţ˙˙çç˙˙˙˙ţţç˙ţsĎ˙˙˙˙Ď˙˙˙ź˙˙Ď˙˙üĂ ˙řYy?˙˙˙˙?˙Î˙ţţ˙ü˙˙˙˙ç˙˙˙óź˙˙?˙˙ţs˙Ď˙?˙˙˙˙˙˙üů˙ů9ç˙˙ů˙ů˙˙ó˙™˙ź˙źĎź˙ü˙ó˙˙˙üňů˙Ďź˙ů9˙˙ţçĎ˙<üţţůů˙ů˙?˙˙˙˙˙ç˙˙˙˙ţ|˙?˙?˙˙?9?˙˙ç?˙ůç˙˙˙ůĚĎ˙˙˙ů˙˙˙˙˙ć˙˙ü˙˙˙˙˙ţ˙˙ç˙ţ˙ć|Ď˙ó>~˙˙˙˙™źü˙˙Î˙˙˙˙Ě˙Ď˙˙˙ś˙źçĎśů˙˙ůĚ˙˙üů˙Ď˙˙˙źç˙˙üçü˙˙Ď?˙˙çç˙˙Ď˙ňyĎ˙˙˙˙ů˙ó˙ţg˙˙˙Ď˙ź“?˙3ůĎ˙˙ůţ˙˙?˙çó˙ůçů?˙˙?ţf˙3˙ž˙ů˙ź>źź˙˙˙??Ď˙˙ůóĎ˙˙˙˙çä˙ü˙˙˙˙ź˙˙'ţ˙˙˙˙˙'˙˙Ďů˙˙ó˙Ď˙ů˙˙ó˙˙ţź˙Ď˙˙˙çç˙?˙˙??˙ţ|ä˙˙?ůĎ˙˙'˙?ó˙ź?˙˙˙óç˙˙˙?ů˙˙˙Ď˙˙?üź˙˙˙ź˙źó˙ü˙˙˙˙˙˙˙˙˙˙˙$ţó˙˙˙˙ů˙˙ź˙˙ä˙ůů?ź˙˙˙˙çţ˙ç˙˙˙Ď˙üçţ˙ü˙Ďţ˙ü˙˙˙˙˙ů˙˙ć?ć˙Ď˙˙'ü˙˙ů˙˙˙˙˙˙ü˙üźü˙˙ç˙ç˙˙óç˙˙ü˙ó˙ź˙ůó>Ď˙˙óů˙˙óü˙ůó˙ó˙˙ĎĎóů˙ü˙˙˙˙ć˙ů'˙˙˙˙˙˙?źçů'9˙ç˙?˙˙˙˙˙ź˙˙˙óĎ˙ů˙˙˙˙˙?˙Ě˙˙ç9˙?ţ˙˙˙˙9˙çÎ|˙ţyţĎ˙˙˙˙çĎ˙˙'óĎ˙˙˙ź˙Î|˙˙˙˙˙ůó˙˙˙üź˙˙˙˙ó˙ü˙?˙˙?˙˙˙ţä˙˙˙˙ć|@óĎ˙˙˙˙˙˙ü˙˙˙˙źüĎ˙ç˙óó˙Ď˙˙˙˙Ď˙ź˙˙˙ó˙ţóç˙˙˙ó˙üü˙ü˙˙óçźţOţ˙˙ü˙ü˙ź˙źĎ˙˙˙ó˙?˙˙˙˙ü˙˙ź˙Ď˙<˙˙ü˙˙Ďçů˙˙˙ç˙˙˙˙Ď˙ź˙ů˙˙˙˙˙ü˙ü˙˙˙˙˙˙˙˙˙˙˙˙ź˙ź˙Î|˙˙ćççĎ˙˙˙˙˙˙˙˙˙˙˙ó˙?ç˙˙ç˙˙˙˙˙˙˙?>źĎ˙ç3˙ü˙ź˙˙˙ţs?˙˙˙˙ů˙˙˙˙˙ů˙?˙Ď˙ů˙˙ůó&~˙˙˙3ç˙Ď?˙˙˙óü˙˙˙˙ó˙ů˙ó˙˙˙ç˙ü˙ç˙˙˙ž˙˙˙˙˙˙?˙˙˙ç˙üó˙˙˙źź?˙˙˙˙˙?˙˙˙Ďů˙?˙˙˙˙˙˙˙˙˙˙üţ˙˙ţ˙˙˙˙˙ź˙?˙Ďóź˙?Ď˙ó˙˙źůç˙˙˙óů˙˙˙˙˙üů<Ď˙ç˙˙˙ţ~r˙˙˙˙ů˙üä˙˙˙˙ü˙˙˙ü˙ź˙˙˙Ď˙ůź˙˙˙ź'˙?ó˙˙“˙?˙˙˙źňs˙˙ó˙ĎĎ˙óź˙˙ź˙˙Ď˙˙ź˙˙ůźů˙˙ůţ~˙źů˙˙˙ź˙?˙źĎţ˙ó˙˙ţ˙˙˙˙ţĎ˙??ź'ůţ“˙˙˙ü˙ů?ţ˙˙üĎ˙˙ů˙˙˙˙˙˙˙ůü˙źţ˙?˙˙˙˙?˙˙üůźĎĎüţ˙˙ź˙Ď˙˙ţsůů˙ó˙ç˙˙ůĎ˙˙˙ü˙óź˙˙˙ç˙3˙˙ç˙˙˙˙˙Ď˙˙ü˙ü˙˙˙Ďź˙çĎ?˙?Ď™˙ü˙˙çź˙˙˙˙˙ü˙?˙˙˙ç9˙˙ç˙˙˙˙˙?˙ü˙ü˙óůţ˙˙ţ|˙'˙˙Ď˙ó˙˙Éç˙˙źüźó˙˙ó˙ü˙ź˙˙˙˙?˙˙ó˙˙˙çç˙ţţNśüźçü˙<ţ??ó˙˙“˙řY~?˙ů˙˙˙ź˙˙˙˙˙??˙˙˙˙˙˙˙Ďü˙Ě˙ţOü˙ů˙ü˙üüó˙˙˙?ů˙˙?ç˙˙˙'<˙ţţů˙??źů˙˙˙ň˙˙˙?śç˙çü˙ź˙˙˙ź˙˙˙ţ“˙˙˙ó˙Ď˙˙˙˙˙ś˙˙˙˙˙ĎĎ˙˙ţ˙Ď˙?˙˙ĎĎ˙˙˙˙˙˙˙˙˙ţ˙˙˙˙Ď˙çç˙˙˙˙ů˙˙üů˙˙˙ź˙ü˙˙źüüůó˙˙ţó˙˙˙˙˙ůó˙ó˙óĎ˙˙˙ç˙˙?˙˙ç˙˙˙˙˙˙˙˙çüź˙˙ÎOźĎ˙˙˙ů?ü˙˙˙??˙ó9˙źů˙ó˙˙˙˙˙˙˙˙˙ů˙˙˙˙ü˙?üů˙˙ó?˙?˙˙˙ţ˙˙˙ç˙˙˙ź˙˙˙ü˙?˙˙˙˙˙ţůĚ˙ó?˙ţ˙ž|˙ź˙ç˙'ź˙˙˙ź˙˙˙˙üţ˙˙˙˙ü˙üçĎ˙ó'˙˙˙˙źüó˙~˙çó˙˙źç˙ç˙˙˙˙?˙˙ź˙É˙˙˙üů˙˙˙źţy˙˙˙ĎĎü˙ź˙É?˙ź˙óĎ˙˙˙ó˙˙?˙˙˙ó˙˙˙˙˙˙ů˙?˙˙˙˙Ď˙˙˙˙ó˙˙ó˙˙3˙>˙˙?˙ůĎ˙˙?˙ź˙Ď˙˙˙Ď˙˙˙˙ç˙ů˙˙˙ó˙?˙˙˙çţ˙˙ź˙˙˙˙ź˙˙˙˙˙˙˙˙ç˙˙˙ó˙˙˙?˙ź˙óçů˙ů˙ž˙˙ţţs˙?çó˙˙ó˙Ď˙˙˙˙ů˙˙ç˙ů˙?ţ˙˙?ü˙˙˙óó??9˙˙˙Ď˙ó˙˙óç˙˙˙ç?˙ç˙˙ü˙?ůź˙óźä˙9˙˙˙˙Ď˙ü˙˙˙ç˙ü˙ĎüÉĎ3˙Ě˙˙˙Ď˙˙˙Ď˙ůźţ˙ţ˙˙<ç˙?ç˙˙çţ|˙?˙?˙“˙Ď’?˙˙˙˙ó˙˙ó9˙˙ů˙çć˙˙˙˙?˙˙˙Ďäóţ˙Ďů˙˙˙ü@ůůĎçĎ?˙˙˙??ů˙˙˙˙ţ˙˙˙˙˙˙˙˙˙ů˙ó“ç˙ç?˙ü˙˙˙˙˙ź˙˙˙ź˙ů˙çç˙˙™ç˙?3˙˙˙˙˙˙˙˙˙˙üţOü˙˙˙˙˙˙˙ü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙óź˙ź˙üüů˙˙˙Ěç˙üů˙ů˙˙ţ˙˙˙ţI˙ç?ů˙˙ó˙Ď˙˙óó˙˙˙˙Ď˙Ď˙˙˙˙˙˙ç˙˙?ůź˙ü˙?Ď˙˙?˙źţ˙˙ç˙ţO˙˙˙ó˙üóóů˙˙˙˙˙ó?Ď˙˙˙üç˙ţ˙óůů˙ü˙˙ůç˙˙?˙˙˙˙ĎĎ˙˙˙?˙˙˙˙˙˙Ď˙ç˙&źţs˙?Ď˙˙ňü˙˙˙ź˙çĎ˙˙˙Ď˙˙Ď˙˙˙˙˙˙˙˙˙?˙ó˙˙™˙˙ůů˙ţ˙çź?˙˙˙ç˙Ď˙ţ˙˙ůů?ü˙Ď˙˙ü˙äü˙˙Ďü˙˙˙˙˙˙çóźĎ˙óůĎ˙˙˙ź˙“ü˙Ď˙˙˙˙˙˙˙˙ůóź˙ĎĎź˙˙Ďůź˙˙ü˙ţyç˙˙ţ~'˙˙˙˙˙?˙˙˙˙˙Ďůź˙źóţ˙ů˙<˙˙˙ó˙??˙˙˙?ţ˙ü˙<ţ˙?˙ţO˙˙?˙˙˙˙Ď˙˙ó˙üźü˙˙ó˙Ďţ~?˙?˙˙ůçů˙˙óů˙˙˙ü˙˙˙˙˙üź<˙ć˙˙ç˙˙˙˙˙˙źţ˙óç˙ç?˙Ďç˙˙ü˙˙Ď˙˙˙ů˙˙üçü˙˙˙˙˙˙˙˙çü˙ţçĎççÉ˙˙˙ó˙˙˙ůçüţ˙Ď˙˙˙˙?Éç˙˙˙?˙˙˙˙çüç˙Ďçů˙óó˙çç<˙˙˙˙˙Ď˙˙ä˙ü˙˙ó?˙˙˙ţ|˙ó˙ü˙˙˙˙<Ď˙3?üç˙ó?˙?Ď˙˙˙˙ţü˙˙˙Îźä˙˙Ď˙ţ˙˙?Ď˙ĎĎç˙óśóç˙˙˙˙˙˙ź˙˙ź˙ţgóđ†ď˙řYS3˙˙˙˙ţ˙ţy9çĎ˙ź˙˙˙ź˙ůó?˙˙çĎ˙˙ç˙çůó˙˙çü˙˙˙˙ź˙'˙ç˙˙źçţ˙˙˙˙˙˙˙˙˙˙˙ü˙˙ů˙Ďţ˙˙˙ů˙ó?˙˙ź™˙˙˙Ď˙˙˙˙˙˙˙üźĎ9Ď˙˙Éüçňů˙˙˙˙˙˙ů˙˙˙ů3˙˙ů˙˙˙˙ó˙˙˙˙??˙>ó?˙˙çç˙˙˙˙˙˙˙˙˙˙ţž˙˙Ď˙üů˙Ď˙˙™˙Ďů˙˙˙˙ůţ˙˙˙ůźç˙˙çţś˙ü˙˙˙˙˙˙Ďź?ź˙ó˙˙˙˙ž˙ů˙˙˙˙ţy˙3˙ó˙?˙?üĎä˙˙˙˙ó˙ç?˙źü˙˙óţ˙˙ţOźů?ćy˙˙˙˙ź˙˙˙˙˙óţ˙˙˙Ď˙˙ç?˙É˙˙˙˙˙?˙˙˙äĎ˙?˙˙˙˙ü˙˙˙˙˙˙˙˙Ď˙˙ź˙˙ţç˙˙˙˙˙˙˙çźüź˙˙ź˙˙˙˙ó˙ç˙˙?˙˙ó˙óźó˙˙?˙ó™˙˙ź˙˙ó?˙˙Ď˙˙?˙˙˙˙˙˙˙˙“ůü˙˙“ůź˙˙ç˙˙ç˙˙?˙Ď˙˙˙˙˙üĎ˙˙ţ˙˙ź˙ü˙ó˙˙<Ěüçţ˙˙˙ü˙ç˙ç˙˙˙˙äţ˙ţ˙˙óü˙˙˙˙ü˙˙ç˙˙ü˙˙Ď˙˙˙˙˙˙Ď˙ççů˙˙˙<˙˙˙˙ů3äüś˙˙ó˙˙˙˙˙˙˙źů˙Ď˙˙üź˙ţO™˙Ď˙˙˙˙˙ç˙˙˙˙˙˙˙ůü˙˙ů?žóźůó˙˙˙ţ˙ţ˙˙˙Ďü˙Ďçç˙çĎ˙˙óÉü˙˙ó˙˙Ď˙˙˙ź˙ü˙˙˙ć˙˙Ď˙üüçó˙ó˙˙ó?˙˙Ď˙ů˙ó˙ü˙?˙˙˙<˙˙ź˙˙ü˙9˙ĎóĎ“ů?˙˙ůĎó˙˙˙˙˙˙ç˙?˙?˙ţóň9?ţ~Oů˙˙ůź??ä˙˙˙˙˙ç˙ń�Cž˙óç˙ůĎţçü˙ź˙˙˙˙ţg˙˙˙?˙˙˙<ç˙˙3ü˙˙ç˙ň˙˙ç˙˙˙˙ä˙çź˙ü˙˙'˙ź?˙9Éţ˙ţ“˙˙˙˙˙ů˙ňgţy˙˙˙ç˙˙óä˙ś˙?˙ů˙˙óç˙˙˙ó˙˙ç˙˙çţ˙Îs˙˙ţź˙ć˙˙?˙ň~˙'˙˙˙ź˙˙ůĎ˙™ůÉĎ˙˙Ďç˙˙˙˙˙ź?˙˙ü˙ó˙˙Ď˙ó˙óćĎ˙˙˙˙˙˙˙˙ç˙ůÉĎĚü˙˙ţy˙˙˙ä˙˙˙˙çţ?ź?˙˙˙ţ9ó˙˙˙˙˙˙Ď˙˙ů˙˙˙É˙˙˙˙˙ĎüĎ˙˙˙˙˙çţy˙ţ˙˙˙ó>ů˙˙˙˙ţ˙˙Ď˙˙˙Ď˙˙˙ç˙Ď˙˙˙˙Ď?˙Ď˙˙˙>˙˙Ď˙˙ţOůĎ˙˙˙˙˙˙˙˙?˙?ţ™?˙˙üź˙˙ůźů3˙ţ˙˙Ď˙˙˙˙˙˙ü˙ĎĂ˙˙˙˙“˙˙˙˙çź˙˙˙˙?ü˙˙˙˙źţ˙˙9˙˙˙˙çž?˙˙˙Ď˙˙ź˙˙˙˙ţyţ|˙˙'˙˙ůź˙˙ů˙˙˙˙˙˙˙˙ćs˙ź˙˙?çźĎ˙˙˙˙˙óĎ˙Ď˙˙˙<óçů˙źĎç˙˙źüů˙ź˙˙9˙˙çţ˙ţO˙˙˙ů˙˙˙˙?˙˙çţţ˙ç˙˙Ď˙ź˙ů˙˙˙Ďž˙˙˙˙˙ź˙óç˙ůó˙ü˙ţţ˙˙˙źóź˙˙˙ç˙˙˙˙Ďţ˙˙˙˙˙ţ|ü˙ü˙ü™˙üüĎ˙˙Î˙˙ţ˙ź˙üůů˙Ďçó˙˙˙˙˙çü˙˙˙9ů˙˙Ď?˙ĎĎ˙˙ţ˙˙ó˙źź˙ź˙˙˙Ď˙˙˙˙çź˙˙˙˙ůÎ~˙˙Ďů˙˙?óţgźüů˙˙˙˙?˙’˙˙˙3˙óţüĎ˙Ď˙˙?ü˙˙˙˙ź˙?˙ţ˙Ď˙˙üţ?˙˙óä§z˙řY T?ź˙˙ţţyź˙˙˙˙óóçç˙˙ź˙ĎĎţů˙˙?˙?ź˙˙ů˙ç<˙˙ĎçĎůůü˙˙˙˙˙˙>y˙˙ţţI˙˙ţg˙˙ů9˙ç˙ů<ź˙˙˙3ź˙ü˙ç˙˙˙˙˙˙?óź˙?˙˙˙˙˙ů˙˙˙ç˙˙ĎĎů˙óç˙˙ů˙˙ů˙˙“>|˙Ď˙˙çç˙ţĎçç˙?ź˙˙˙ů˙ţţgóü˙ů˙˙˙ţgź?˙˙Ď˙˙˙ç?˙ç˙>˙źţţ˙˙Ď˙˙ů˙ů˙ůó˙ź˙ţ˙ţ˙˙Ď˙ž|˙˙çţ~s˙˙ç˙˙˙ó<˙óůůź˙Ď˙?˙3˙óÎsţ˙ç˙˙˙ţ˙˙˙Ď˙˙üůň˙?˙?˙Îç˙ü˙Ď?˙˙Ď˙ů˙˙˙'˙ţţź˙˙˙üů˙˙ó˙ůĎ˙˙'ţň˙ţ<“óţó˙˙˙ó˙ó˙˙˙˙ů˙ţ~ü˙˙˙?Ď˙ü˙˙ó˙˙üç˙˙˙˙˙źţ˙˙˙ç˙üĎ˙ĎĎĎ˙˙ůóüó˙˙˙˙˙ź˙˙˙˙˙˙ü˙˙ţdóĚ˙˙˙˙Ďź˙ţy˙˙˙3ţ˙˙ź˙˙˙˙˙˙˙ź˙˙˙ç˙ó?ź˙üź˙˙’~O˙˙˙˙˙Ď˙˙˙˙˙˙˙˙˙ç˙źţ˙˙ţgţ˙˙˙˙Ďů˙˙˙?˙˙˙˙˙˙Ď˙˙˙ś˙?˙ó˙˙źźź˙˙ů˙˙źźśç˙˙˙˙˙ó˙ź˙˙˙ü˙ç??óó˙˙˙˙ź˙˙ç˙˙ţ~y˙˙˙˙˙ţy?˙?˙˙˙˙˙ź˙??˙˙˙ź˙Ď?˙ů˙˙ź˙çĎţgü˙??˙ů˙žO˙˙˙ů˙üů˙ü˙˙ůů˙˙˙˙˙?˙ü˙ź˙9˙ţóĎ˙˙˙˙ůć˙?˙Ď?ţg˙˙˙çź˙˙ź˙˙˙˙˙üÎ˙™üţ˙˙ó˙?˙˙˙ç˙˙Ď˙Éů˙˙˙˙üó˙˙˙˙˙ţçĎ?˙˙ü˙Éóů˙˙˙ç˙˙˙˙˙˙Ď˙˙˙˙˙˙˙˙˙˙˙˙ó˙?˙źçů˙˙˙Ď˙ţ~ź˙˙?˙ź˙˙źü˙˙˙˙˙ü˙3˙˙˙ź˙˙˙˙˙˙ů˙Ď˙ç??˙ů˙?˙˙˙Ď˙˙˙˙?˙˙˙ţ|˙ç˙˙˙˙??˙˙ů'˙ç˙ź˙˙˙˙˙˙Ď˙?˙˙˙?˙˙˙˙˙?˙˙˙çÎOóů˙ů˙˙?Ďç˙˙˙˙˙˙˙˙çü˙˙?Ď˙˙˙˙çóů˙ź˙˙˙˙˙˙˙˙˙?˙˙˙˙˙ź˙˙>äç˙˙śü˙˙?ţ'˙˙ĚÉ˙˙?˙˙˙ü˙˙˙ó˙˙˙ţ˙˙?Ďůů˙ź˙˙˙˙Ďó?ţf?ů˙˙É˙˙ţ˙çů?˙'˙˙ó˙˙ţ˙ůçü˙˙˙˙ţOü˙>˙˙˙ţó˙˙˙ţ?˙˙˙˙˙˙ü˙˙˙˙˙˙Ď˙ç˙˙˙>s˙3ç<ţć˙˙˙Ă˙˙˙˙˙˙˙É?óź˙˙˙ţLó˙ç?˙źü˙˙˙ź˙Ě˙˙˙˙˙çç˙˙˙?Ď3ó˙˙˙ź˙Ďü˙ů˙˙ź˙ź˙ňO˙˙˙˙˙ů˙˙ů˙?ůĎ?˙?˙˙˙ţs?˙çž˙˙˙˙ţ˙˙ů˙ź˙˙˙˙˙??˙ç˙˙˙Ďü˙˙˙ů˙Éźç˙˙ţź˙˙˙˙˙˙ůź˙ó˙?˙?˙˙?˙˙˙˙ü˙˙ů™ó˙˙ü˙˙˙˙ó˙óç˙˙˙˙˙ţy˙˙˙ü˙˙˙˙˙ţ˙ů˙É˙˙ţ˙˙˙Ď˙˙˙˙“<˙ç˙ţ?˙ů˙˙˙˙˙˙˙źüů˙˙ç˙˙˙ů˙?˙üź˙˙˙?˙˙˙˙˙˙ó˙˙˙ň˙çó?˙ů˙˙ůţyó?Ď˙ź9źçţ˙˙Ěç˙ů˙ó˙˙˙˙˙ççĎ˙˙˙ţgĎ˙˙?źţ˙?˙ć˙ó˙˙˙˙˙ţs˙üóüź˙˙˙˙ź˙Ď˙ä˙ůüĎ<=˙řY ]&g˙źĎůç˙˙˙çź˙žĎ˙˙ů˙˙ůĎ˙ţĎ˙óţOž˙źĎů˙ů˙ţ˙ó˙˙˙˙˙˙˙˙˙˙?ź?˙źţ˙˙ź˙˙Ď˙˙ţ|ü˙˙˙ţy˙˙Îs˙˙˙??ů˙˙˙˙˙˙ţg˙“˙˙˙9˙ç?˙ź>~˙˙üţgç˙ůţOçź˙˙óĎ˙˙ü˙ü˙ůç˙˙ţ˙ů˙?˙źĎ˙ç˙ţ~ůóü˙ç˙˙˙ţ˙ó˙˙äó˙˙ţüů˙˙˙ü˙˙˙˙˙ůĎç˙˙ů˙˙?Ď˙˙˙˙ź˙˙˙˙ź˙ůü˙ţ?ü˙ü˙˙˙˙˙˙?ţ˙˙çó˙ç˙<ü˙˙˙?˙˙üů˙˙˙˙<˙˙?źů˙˙˙˙źź˙ţ˙ó˙˙˙˙˙?˙˙˙˙˙˙˙˙ţć˙˙ó˙˙üź˙˙˙?Ď˙˙˙˙˙˙üţy˙ó˙˙˙ţź˙üóó˙˙˙˙˙ó˙˙ů˙?˙ź˙˙ţĎź˙˙˙˙˙˙˙Ď˙˙˙˙źź˙˙˙Ďç˙˙˙ź˙˙źü˙˙˙˙˙˙˙˙˙óçţ˙˙˙ů˙˙˙˙˙˙Ď˙˙˙˙˙ţç˙˙˙˙˙ţĎ˙˙?çů˙˙˙?üü˙˙˙Ď˙˙˙˙˙˙˙˙˙˙˙Ďţ˙ü˙˙ç˙źó˙ţç˙ţ˙ů?˙ůç?˙çó˙˙˙˙˙˙?ţü˙ç3˙˙çó˙ü˙Éü˙çţ˙ç˙óĎ˙˙ü˙Ď˙˙?˙ů“˙˙?˙ć˙˙˙ç˙?Ďçţ˙˙˙ó˙˙˙Ď˙˙˙˙Ď˙ó˙˙˙Ď˙˙˙˙˙˙ó˙˙Ď˙ţ˙?™˙˙üĎ˙çĎ˙˙9˙˙ü˙˙ü˙˙˙˙ç˙˙˙˙&9ç˙ů˙źňI˙˙9˙ó3ţĎ˙Ďü˙˙ů˙˙˙ü˙˙˙˙ü˙ź˙˙ţ˙˙˙˙˙˙˙ç˙˙˙źĎĎ˙˙˙˙˙Ď˙?ç˙ćg˙9˙˙ü˙˙ç˙˙˙˙˙Ď>ü™Ď˙˙˙?˙Ď˙˙ţ|˙ţgź˙˙çĎ˙ź˙“˙˙ü˙˙˙ůů˙Ď˙˙˙˙˙ü˙˙˙<˙?˙óů˙˙˙ň˙˙˙˙Ěüç?˙˙“˙˙źç˙˙˙Ď˙˙˙˙˙ü˙˙˙ůçů˙˙˙ç˙˙ů˙˙˙˙ĎĎ˙˙ó˙źůţyź˙˙ź˙˙˙˙˙ţ~I˙˙ů˙˙ó˙Ďź˙˙˙˙˙ü˙Ď˙˙?ů˙˙˙Ď'Ďóüóü˙źź˙˙˙˙?˙ó˙˙ü˙˙˙'ţOů˙˙˙˙˙˙˙ü˙çü˙˙˙˙˙˙˙ç˙˙˙˙ü˙ů˙˙ź˙˙˙˙˙˙˙˙ů˙ó˙˙˙ó<˙ó˙ç“˙ź˙˙çĎ˙<˙˙˙˙˙ç˙˙˙˙˙?'˙ç&?ź˙˙˙˙ţĎů˙ţO3˙˙>˙Ď˙˙˙˙˙ç˙˙˙˙çůţgů˙ź˙Ďţůźůç˙˙˙˙˙˙ţ~g˙É˙˙˙˙üçÉţ˙ü˙˙˙˙çü˙˙˙źţgü?ç˙?˙˙˙ţů˙˙źů˙˙˙˙˙˙ţ˙˙ó˙źü˙˙Ďź?üů˙˙ů˙˙˙ó˙Ďü˙˙˙˙˙üźů˙˙Ěç˙˙źţ˙ć˙˙˙˙˙˙˙˙ţüó>˙ç˙˙óů˙ź˙ź˙˙˙ů˙ů˙˙ůź˙˙˙ţs˙óä˙ó˙üţůç˙˙˙˙˙˙˙ĎÎĎó˙üüĎ˙˙ü˙˙˙˙ź˙ů˙çů˙˙˙˙˙üó˙˙óĎ“9˙Ď˙?˙Ďţ˙ü˙ÎL˙˙˙˙ţ˙˙Ď˙ţţ˙˙˙>ůó˙˙ů˙Ď<ć?ů˙çůůţ?Ď˙ź˙˙˙˙˙˙˙˙˙˙˙˙˙ţg˙˙˙˙˙?˙˙ů˙˙˙˙ś˙˙˙˙˙?ç˙ś˙˙<˙˙˙ó˙ů˙˙ţ~ź?Ď˙˙˙˙˙˙˙˙˙˙˙çţ<ó˙óóü˙˙˙˙˙źţçç˙˙˙ó˙˙˙˙ü˙˙˙ó˙˙“˙ź˙˙˙?ç˙ź'˙˙çđ&Š˙řY Z?ç˙Ďó?˙ó˙?˙˙˙ó˙˙˙˙ţy˙?ó˙˙˙˙˙˙˙Ď?˙˙˙˙ü˙ţó˙˙Ď˙˙˙˙˙ó˙žróü˙˙ž˙˙˙˙˙˙˙˙ó?˙˙ç™?ţg˙ů˙üóü˙ó˙ůäç˙˙˙˙˙çó˙źĎźź˙?˙˙˙ĎůĎç˙˙˙˙˙˙óůĎçüó˙˙˙˙˙ţ|˙çĎ˙˙ů˙˙˙˙ţ˙ź˙˙˙˙˙˙˙˙˙ç˙˙ź˙˙ůüó?ţü˙˙˙ç˙™˙ź˙˙˙ţs˙˙˙Ď˙ü˙?˙˙˙˙ů˙çç?ů˙˙ü˙˙˙˙Ďü˙˙˙źĚ˙ţy˙˙˙ó˙çóź?ů˙ó˙˙˙˙óççź˙˙˙˙ź˙?˙2gţźů˙˙˙˙óçÉ˙˙<üü˙ó˙źů˙˙˙˙äů˙˙˙˙˙˙˙˙ó˙˙ç˙˙˙˙˙˙ç˙ü˙˙˙˙˙˙˙ůţsü˙źçç˙çĎ?˙˙˙˙˙ůţ?ź˙˙˙˙˙Ě?˙?ü˙çĎ˙˙˙˙ů“ćy˙ü˙??óüó˙ů˙˙ţ~˙˙ź˙˙˙˙˙ů˙˙˙?˙ó˙˙˙˙˙'˙ü˙˙˙˙˙ů˙ůţů˙??˙˙ţ˙óů˙ç˙˙˙˙“ů˙ś˙˙ů˙Ďü˙źţü˙˙˙ó˙™?˙˙“˙˙ü˙˙śóó˙˙?ü˙˙ůźÉ??ţ˙˙Éź˙˙ůů˙˙˙óů˙˙ź˙˙?ž˙ç˙˙˙ů˙˙˙˙äüů˙ć?Ě˙˙˙˙˙˙˙˙˙ň˙˙ź˙˙˙˙˙˙˙˙˙ů˙˙˙˙˙˙Î˙ţ˙ţs˙<ü˙çç˙“˙˙óśźţg˙˙˙˙ňĎ?˙˙ç˙ç˙˙<˙˙˙˙ü˙˙˙Ď˙˙˙˙˙˙ůĎ˙ü˙˙Ď˙˙ţ˙Ď˙ü˙žó˙˙˙˙ů˙ü˙˙źů˙˙ü˙˙ź˙˙˙˙˙˙ź˙˙˙ź˙ü˙˙ç˙ü˙˙˙˙Ď˙˙˙˙˙Ď˙Ď'˙˙˙ź˙ź˙üĎ$Ď˙Ď˙˙˙˙˙ç˙ü˙˙˙˙˙źž˙9˙˙˙ç'˙˙ó˙?˙ó˙˙óźźź˙˙˙ĎĎ'çĎ˙˙˙ś˙˙˙ź˙˙ůž|˙˙ů˙˙˙˙?˙˙˙˙?ź?>~˙Ď?Ď˙˙ź˙Ď˙˙ů9˙Ě˙çç˙˙ţ~y˙˙˙?ü˙ň˙˙ţyü˙˙ţ˙˙˙˙˙™˙˙˙˙˙ü˙˙˙˙˙çţOóĎ˙˙ü˙?˙˙˙çç˙ćü˙˙ů˙˙˙˙ţ˙˙˙˙˙ž˙óü˙˙ç˙˙ţgů™˙ó˙˙źů˙˙˙?˙˙˙žź˙˙˙ů˙ü˙ç˙˙˙˙˙ź˙˙˙ó˙śţ˙˙'ç˙ţO˙˙ś˙˙ó˙˙˙çü˙ůźźźĎç˙˙˙˙ů˙ó˙˙˙˙ůü˙ó˙ä˙ź˙˙ü˙˙˙˙çó˙üç˙óĎ˙˙<˙˙ţ˙˙˙óů˙Ď˙Ď˙˙ţó˙ţ˙˙˙˙ţ˙˙˙˙ţţ˙˙˙˙ü˙˙˙Ă˙˙ţs'ţsźü˙˙˙˙ó?˙˙˙˙˙˙˙??ç?˙ţOţ˙˙Ě“Ďçů˙óó˙ůĎ˙˙ţ˙˙˙˙˙˙˙˙˙ů˙˙˙üü˙?ä˙Éçů˙˙“˙˙$˙˙ůů˙˙ç?ç˙?˙ç˙˙ç˙üţ9˙˙˙ź˙˙˙ţţ~˙˙üç˙˙˙˙˙ó˙˙üĎ˙˙˙?™˙üůä˙Ď>˙Ďů˙ü˙ź˙ü˙˙Ď˙˙˙˙˙˙Ďţ˙˙˙˙ź˙ůü˙˙ź˙ü˙˙ü“˙˙˙˙˙˙˙˙Ě˙Ď˙ç˙ž˙˙˙˙˙?˙˙˙?˙˙˙˙˙˙˙óĎ˙˙˙ţ˙çů˙˙Ďç?˙ţ|ň|˙˙˙˙źĚ˙Éä˙˙˙Ď˙˙ź˙˙˙˙ů˙˙Ďü˙˙˙ţ˙óç˙˙˙˙˙˙ź˙źů˙ü˙˙˙ů˙˙ç˙Î|˙ů9˙˙˙?˙˙óĎç˙˙˙ů˙˙˙˙˙˙ţ˙ţ˙˙˙˙ü˙˙˙?Ď˙˙ó˙˙˙Ŕą=˙řY O3˙˙ó˙˙˙˙3˙˙˙˙˙˙ţyĎ˙ů˙?˙ň9źü˙˙˙˙˙˙˙˙ü˙śćź9ůź˙˙˙˙˙˙˙˙ó˙ü˙˙˙˙ü˙˙žóĎźüç˙˙ţy˙˙ü˙˙˙˙ů˙?˙˙˙˙˙ç˙ü˙?ůĎů˙Ď˙˙ó˙˙ů˙?˙˙3Î˙˙˙ü˙˙˙ţs<˙˙˙˙˙ţ˙ů˙˙˙˙źçĎ˙˙˙ó˙˙˙˙ü˙˙˙˙'˙˙˙˙˙˙˙ü™ź˙?źź˙˙ź˙˙˙˙óü˙?˙ü˙˙óĎ˙˙˙ç˙çü˙˙Ďů˙ü˙˙?˙ç?˙óůäĎóó˙˙˙çů˙˙˙?ç˙Ď˙˙˙üĎ˙˙ţ˙üÉţ~˙˙˙<üźź˙˙˙ţź˙˙˙˙˙˙Ď˙ó˙ůü˙˙˙˙˙˙˙ů˙˙ó˙˙'ü˙ó˙ź˙źž˙Ď˙˙óźü˙ů˙˙˙ó˙˙˙óţ˙˙ţóţ˙źţü˙˙ů˙˙˙˙˙˙ůĂ˙˙˙ź˙˙˙˙É˙˙˙˙˙ź˙˙ź˙˙ţs˙˙˙˙?˙źů˙˙ů˙˙˙˙˙˙?˙˙˙˙˙˙źçź˙˙çţ˙ź?üü˙çź˙źçü˙˙˙ź˙˙˙˙Ď˙˙˙?ţ˙˙?˙?˙˙ó˙˙˙ţü˙˙˙˙˙˙˙Éü˙ü˙˙˙˙ó˙çü˙ó?Ě˙˙ü˙˙˙žg?žů˙˙˙?˙˙˙óů˙˙ů˙Ďź˙ç˙˙??˙˙˙ó˙˙çóůó˙?˙˙˙˙˙˙˙?˙˙ź˙˙˙˙˙˙˙ţ˙ů˙ó˙˙˙ó˙˙ó˙üź˙9˙Ď˙˙˙˙Ď˙ź˙ü˙˙˙ó˙ó˙˙˙˙˙˙˙˙˙ţ˙˙ü˙˙˙˙˙óç˙˙˙?ţO˙ç˙˙˙˙˙˙˙ü˙ś™˙˙˙˙?˙˙˙˙Éź?ç?˙ů˙ü˙ź˙˙˙˙ź˙óţç˙ů˙˙˙˙˙ů˙˙ü˙˙>˙˙˙˙˙ţ˙?˙˙Ď˙9ó˙˙Ď?˙˙˙˙˙˙ó?˙óĎ˙˙ů˙˙˙ţ'˙˙˙?˙˙˙ç˙˙˙?˙˙ňźçźĎů˙'˙?˙˙Ď˙˙ţy˙˙˙ü˙??ţóÎççţ˙˙Ďóçü˙˙˙˙˙ĎćyĎ˙˙˙ó˙˙Ďóç˙?ĎÉ˙?˙˙˙˙˙˙9ó?˙˙˙çĎ˙óçĎ˙Ď?˙˙˙˙“ó˙˙˙3˙˙ç˙óů˙ó˙9˙Ď˙çĚ˙˙˙˙Îź˙Ě˙ţź˙ź˙ü˙źóţ˙˙˙˙˙üçóüĎ˙˙˙˙˙ü˙˙ó˙çĎ˙ů˙ź˙˙˙˙źóů˙ü˙˙˙Ď˙˙˙çů˙˙˙˙˙˙˙˙˙˙źćg˙ćs˙ĎźĚ˙'˙ç˙˙˙˙˙˙?˙˙óüţü˙ů˙˙˙ü˙Ď˙ź˙ů˙˙ó˙?ü˙˙˙ţ|ó˙ó˙˙˙˙?˙˙ó˙˙˙˙˙çů˙˙˙žs˙ţs˙˙Ď˙ţO˙óźç˙ź˙˙˙˙ź˙˙˙˙˙ç˙óçţ˙ů<˙ů˙˙˙ţ3˙˙ç˙˙'™ś˙˙ó˙˙ź˙˙˙˙˙˙˙śĎ˙ç˙ç˙˙˙˙˙˙˙?˙ţ˙˙˙˙ü˙ç˙˙˙ć?˙˙3˙˙˙˙Ď˙˙˙çóóüů˙?˙˙çĎ˙™˙˙˙˙ś˙ů˙˙ź˙ů˙??ţy˙É˙Ď˙ůů˙ů˙˙˙ů˙ůź˙˙˙Ď˙çů˙˙˙˙˙óź˙˙ź˙˙ţó˙ů˙ü˙˙ţ˙˙ţ˙˙Ďů˙ä˙˙˙˙Ďźüź˙˙˙˙ů˙˙ůź˙˙ţ˙˙źů˙üţd˙ţ~˙ç˙ůü˙ç?˙˙ůůź˙Ďç˙˙˙ţy˙˙Ďźü˙“˙ůü˙Î˙Ďü˙˙śĎůź??˙˙˙3˙óĎ˙˙Ďů˙ç˙˙˙ç˙ç˙“˙˙ź˙?˙?˙?˙˙ţ~ü˙üĎ˙˙ţ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ź˙˙˙˙üü˙˙ţ?˙ó˙˙˙˙˙?ţO˙ů˙˙˙˙@1˙řY H?˙ź˙ä˙ţç'˙˙˙˙˙˙˙óĎĎ˙˙˙˙˙˙Ďó˙˙˙˙çüĚůç˙ó˙Ďó??ç˙ź˙˙Ď˙çü˙˙?˙ţ˙˙˙˙˙˙˙ü˙˙˙ů˙?˙˙˙˙Ď˙óź˙˙ź˙ź˙˙?˙˙˙ů˙˙˙üç˙˙Ď˙˙˙ś˙ó˙Ď˙˙˙˙˙˙˙>ţNy˙˙ţţ˙ü˙ćç˙çóç˙˙?ü˙˙˙˙<źţóç˙ţN˙˙źůó˙Ď??ź˙źţ~ţĎ˙˙˙˙˙ů˙˙˙˙˙ź?Ď˙Ď˙˙ĎÎO˙˙ůĎ˙ţy˙˙˙ţs3˙˙˙ţ˙˙˙˙ůź˙˙˙?˙˙˙˙˙ź˙˙ů˙˙ź˙ůź3˙üĎźź˙˙˙˙ćg˙?˙óź˙˙˙˙ó?ó˙˙˙ç?çůóç>˙ţs?˙˙>ó˙˙˙çů˙˙˙9˙?˙óĎ˙˙ůů˙˙ó˙üžs˙˙˙˙ţü˙˙™˙˙˙ó˙çäĎ˙Ěţs˙˙çů˙˙ü˙˙źĎ˙çźä˙˙ü˙ů™˙üĎţy˙˙çţ|ůţ~˙˙üü˙?˙˙çĎ?˙˙˙˙ź“˙ó˙˙˙ţ˙üźů˙˙˙˙˙üź˙˙?ç˙üü˙ó˙ţ˙ü˙˙˙źç˙ó˙˙˙ůů˙Ď˙˙ĎĎ˙˙ź9?˙Ďţs˙˙É˙Ďü˙çĎ˙˙˙üů˙˙˙Ďţ˙˙ó˙˙Ď˙'˙˙˙ç˙çü˙˙?˙˙˙˙˙˙˙˙˙˙É?źü˙˙˙˙ţ˙ç˙˙ů?ţ~Oç˙˙˙˙ů˙ź˙ů˙˙˙ó˙˙9˙ź˙˙?ó˙ź˙˙?˙˙˙˙ţ˙ůźĎůź˙ó˙˙É˙?˙ţ˙˙˙˙˙˙?˙'˙?˙ů˙ů˙˙üů˙˙˙?ü˙ç˙ţ|Ďźó˙˙üţ˙ü˙?ţ|˙ü˙˙óóüţ˙?˙˙˙ůź˙ţI˙˙˙˙˙˙ĎçůţIÎů˙Ď˙˙˙˙˙ç˙˙˙üó˙ţ˙˙˙˙Ď˙ó?˙ůÎDź˙˙ţü˙˙˙<˙ó˙˙ţ˙˙˙˙˙˙<ç˙˙óçü˙Ďóţ˙Ďü˙ź˙˙ůů˙˙˙˙˙ź˙źů˙˙śó˙˙˙˙ó˙˙˙ç˙˙ó˙˙˙óĎ˙˙˙˙˙˙ü˙˙˙˙źüĎ˙ç˙óó˙Ď˙˙˙˙Ď˙ź˙˙˙ó˙ţóç˙˙˙ó˙üü˙ü˙˙óçźţOţ˙˙ü˙ü˙ź˙źĎ˙˙˙ó˙?˙˙˙˙ü˙˙ź˙Ď˙<˙˙ü˙˙Ďçů˙˙˙ç˙˙˙˙Ď˙ź˙ů˙˙˙˙˙ü˙ü˙˙˙˙˙˙˙˙˙˙˙˙ź˙ź˙Î|˙˙ćççĎ˙˙˙˙˙˙˙˙˙˙˙ó˙?ç˙˙ç˙˙˙˙˙˙˙?>źĎ˙ç3˙ü˙ź˙˙˙ţs?˙˙˙˙ů˙˙˙˙˙ů˙?˙Ď˙ů˙˙ůó&~˙˙˙3ç˙Ď?˙˙˙óü˙˙˙˙ó˙ů˙ó˙˙˙ç˙ü˙ç˙˙˙ž˙˙˙˙˙˙?˙đ˙ţ˙Ď?˙˙ůůó˙˙˙˙˙ó˙˙˙ü˙źó˙˙˙˙˙˙˙˙˙˙˙Ďç˙˙˙ç˙˙˙˙˙ů˙ó˙ü˙9˙óü˙˙?˙ů˙ž˙˙˙?ź˙˙˙˙˙üů<Ď˙ç˙˙˙ţ~r˙˙˙˙ů˙üä˙˙˙˙ü˙˙˙ü˙ź˙˙˙Ď˙ůź˙˙˙ź'˙?ó˙˙“˙?˙˙˙źňs˙˙ó˙ĎĎ˙óź˙˙ź˙˙Ď˙˙ź˙˙ůźů˙˙ůţ~˙źů˙˙˙ź˙?˙źĎţ˙ó˙˙ţ˙˙˙˙ţĎ˙??ź'ůţ“˙˙˙ü˙ů?ţ˙˙üĎ˙˙ů˙˙˙˙˙˙˙ůü˙źţ˙?˙˙˙˙?˙˙üůźĎĎüţ˙˙ź˙Ď˙˙ţsůů˙ó˙ç˙˙ůĎ˙˙˙ü˙óź˙˙˙ç˙3˙˙ç˙˙˙˙˙Ď˙˙ü˙ü˙˙˙Ďź˙çĎ?˙?Ď™˙ü˙˙çź˙˙˙˙˙ü˙?˙˙˙ç9˙˙ç˙đ*ĺ˙řYA?Ď˙ź˙˙˙˙Îůóź?˙žźó˙˙˙˙ůó˙˙Éüó˙˙˙ç˙óź?˙˙˙˙ţ|˙˙˙˙'˙˙˙˙ü˙˙?Ď˙˙Ď˙˙˙˙źů?˙˙˙ůź˙˙ç˙˙ţ˙˙˙˙üü˙˙˙˙˙˙˙˙?ó˙3˙ů?ó˙ç˙ó˙óóĎ˙˙ü˙ç˙ü˙ź˙˙üśó˙ů˙ů˙çüüţç˙˙˙É˙˙˙üţsź˙źóţ˙˙ţ˙˙˙ůţO˙˙˙Ď˙?˙˙˙˙ţs˙˙˙˙˙??˙˙ů˙˙?ü˙˙˙??˙˙˙˙˙˙˙˙˙ů˙˙˙˙˙?˙źź˙˙˙˙ç˙˙óç˙˙ţ˙ó˙ţóóçĎ˙˙ů˙Ď˙˙˙˙˙çĎ˙Ď˙Ď?˙˙˙ź˙ü˙˙˙ź˙˙˙˙˙˙˙˙źň˙˙9>?˙˙˙ä˙ó˙˙üü˙˙Ěçţç˙Ď˙˙˙˙˙˙˙˙˙ç˙˙˙˙óü˙óç˙˙Ě˙ü˙˙˙đ˙ź˙˙˙ů˙˙˙ç˙˙˙˙?Ď˙˙˙˙˙˙źţs?üĎ˙˙ź˙çź?ç˙ů˙Éç˙˙˙ç˙˙˙˙˙?ź˙˙˙˙˙?˙9ó˙üÉ˙˙˙˙ç˙<˙ůů˙˙źĎ˙ţź˙ź˙˙˙ü˙˙ţ˙'˙˙˙óç˙˙ţůç˙˙˙??óţ˙$˙ţ˙Ď?˙˙˙Ď˙ü˙˙˙˙Ď˙˙˙˙˙˙çü˙˙˙˙˙?˙˙˙˙Ď˙˙Ď˙üĎüů˙˙ü˙˙ç?˙ü˙ţ˙?˙˙˙?˙˙˙˙ź˙ç˙˙˙Ďü˙˙˙˙źů˙˙ţ˙˙˙ţ˙˙˙˙˙˙˙˙ź˙˙˙Ď˙˙ü˙ţ˙Ďźç˙çţy˙˙˙ů˙ůĎü˙źĎ˙˙Ď˙?˙˙˙˙ç˙˙ź˙çü˙ů˙˙ü˙ó˙˙˙ĎĚüüç˙˙˙?˙Ď˙˙Ďź˙˙˙ś˙˙ź˙˙óü˙ć˙Γüç˙˙˙˙?˙ó˙˙˙ź˙ó˙?ó'<Ď˙3ü@˙˙˙ó˙˙Ď˙Ď˙?źç˙˙˙çĎň˙ü˙˙?˙üž˙ů˙É˙?˙˙?˙Ďů˙˙˙˙ó˙˙˙?˙˙ţ~˙ç˙äçůĎÉţĎóĎçóó˙?˙˙źśţ|ó˙˙˙óó˙ź˙˙˙˙ç˙˙˙˙˙˙˙˙˙˙ź˙9>ţs˙˙Ď˙˙˙˙ů˙˙˙ů˙˙źţ~˙ůžóó?˙˙˙˙˙˙˙˙˙˙Ďä˙Ď˙˙˙˙˙˙˙Ď˙˙Ď˙˙˙˙˙˙˙˙˙˙˙˙˙˙9˙ů˙˙ĎĎź˙˙üÎ˙Ďź˙ź˙˙ç˙˙˙˙äźţs˙ź˙˙?ü˙˙˙??˙˙˙ü˙ü˙˙˙˙˙˙ţ˙ó˙™˙˙Ďóü˙˙ó˙ů˙ç˙˙ţ˙ä˙˙˙˙?˙Ď??ź˙˙˙˙˙3ü˙˙˙˙Î˙ç˙˙?źź˙Ď˙˙ž˙ó˙˙˙˙üü˙˙˙ó˙˙˙˙˙˙ü˙ţňgů˙ç?óü˙˙˙'˙Ď˙˙ů˙đçĎ˙˙˙Ď˙˙Ď˙˙˙˙˙˙˙˙˙?˙ó˙˙™˙˙ůů˙ţ˙çź?˙˙˙ç˙Ď˙ţ˙˙ůů?ü˙Ď˙˙ü˙äü˙˙Ďü˙˙˙˙˙˙çóźĎ˙˙?ś˙˙˙ů˙ů?Ďü˙˙˙˙˙˙˙˙˙ź9˙üüů˙˙ü˙™˙˙˙Ď˙çž˙˙ççň˙˙˙˙ó˙˙˙˙˙ü˙™˙ů˙?ç˙˙źóĎ˙˙˙?óó˙˙˙ó˙ç˙˙ĎóĎç˙ó˙˙ä˙˙ó˙˙˙˙ü˙˙˙?˙É˙Ď˙˙?ü˙ççó˙ó˙˙˙žź˙˙?ź˙˙˙Ď˙˙˙˙˙ÉóĎţg˙˙ţ˙˙˙˙˙ů˙ç˙˙>ţs˙üţ˙˙Ď˙ü˙˙˙˙ź˙˙ÎĎ˙˙˙˙˙˙˙ţĎ˙çţ|ţ~|ź˙˙˙?˙˙˙žĎç˙ü˙˙˙˙óüž˙˙ó˙˙˙˙ţÎüţź˙??ţ~sĎ˙˙˙˙ü˙˙ţO˙Ď˙˙3kÖ˙řYF?˙ó˙˙˙ó˙ţg˙ź˙˙ź˙˙Ď9˙Ďů˙˙ů˙ź?Ď˙Ď˙ä˙óäźĎ˙˙˙˙ü˙˙üÎ˙ţůůź˙˙˙˙Ď˙˙˙óů<˙ź˙óţ˙˙˙Ď˙˙˙˙ů˙˙ůäçź?ţ˙˙ţ˙çĚ˙˙˙ź?˙˙ź˙źçĎ˙˙źó˙˙˙ţüź˙ź˙ţźů˙˙˙˙˙˙˙˙˙˙˙˙ó˙˙ç˙?ů˙˙˙˙ç˙Ě˙˙ţ~g˙˙˙?˙˙˙˙˙˙˙ň<ç?˙˙'óźÉ˙ç˙˙˙˙˙˙ç˙˙˙äĎ˙˙ç˙˙˙˙Ď˙˙˙üü˙üů˙Ě˙˙˙źź˙˙˙˙˙˙˙˙˙˙ůţy˙˙˙?˙óç˙?˙ţg˙?ç˙˙˙˙çů˙˙˙˙ćź˙˙źůţs˙ó˙˙˙˙˙˙>|ţ˙Ď˙˙˙ţy˙˙ç˙˙˙˙ůçüĎ˙Ďü˙ü˙ó?“˙˙˙˙Ď˙ś˙ţó˙˙Ďů˙˙˙ů>ä˙™ç˙Ă˙˙ç˙˙˙˙˙ü˙ź˙˙˙ó˙˙ůĎ˙ň˙˙˙˙Ď˙˙˙ů3˙Ď˙˙˙˙˙?˙˙˙˙˙˙˙ó˙˙ç˙˙˙źů˙˙˙˙˙˙˙ůç˙'˙˙ţ˙˙˙˙Ď˙ź˙ü˙˙˙Ď˙ÎĎ˙ü˙˙Îg˙ţ˙˙Ě˙˙˙?˙ü˙˙˙˙˙˙˙˙ţOçó˙ţOć˙˙ź˙˙ź˙ü˙˙?˙˙˙˙˙ó?˙˙ů˙˙ţ˙ó˙Ď˙üó3óźů˙˙˙˙ó˙ź˙ź˙˙˙˙“ů˙˙ů˙˙˙Ďó˙˙˙˙ó˙˙ź˙˙ó˙˙?˙˙˙˙˙˙?˙źźç˙˙üó˙˙˙˙äĎ“ňs˙˙Ď˙˙˙˙˙˙ţç˙?˙˙ň˙ů>g˙?˙˙˙˙˙ź˙˙˙˙˙˙˙çó˙˙äţy˙ÎçĎ˙˙˙ů˙˙ů˙˙˙˙?ó˙?źź˙ź?˙˙Ď'ó˙˙Ď˙˙?˙˙ţ˙ó˙˙˙™˙˙˙?˙óóźĎ˙Ď˙Ä˙˙˙ţ|˙ó˙ü˙˙˙˙<Ď˙3?üç˙ó?˙?Ď˙˙˙˙ţü˙˙˙Îźä˙˙Ď˙ţ˙˙?Ď˙ĎĎç˙óśóç˙˙˙˙˙˙ź˙˙ź˙ţgóţy˙˙Ďź˙ç?ů˙źóţ˙˙˙˙ůź˙˙ü˙˙˙üóź˙üĎó˙˙ź˙É˙˙˙ź˙˙˙˙“˙ž˙ó˙üźţ|˙üç'ů˙˙ůţO˙˙˙˙˙ç˙Éźůç˙˙˙ź˙˙Ď“ţsü˙˙ç˙˙Ďź˙˙˙Ď˙˙ź˙˙źů˙˙9Ď˙˙ůţ˙™˙˙ü˙˙Éů˙üź˙˙ţ˙˙ç?ţgç'?˙˙?ź˙˙˙˙ţ|˙˙˙ó˙Ď˙˙?˙Ď˙Ď™˙?˙˙˙˙˙˙˙˙ź˙ç'?3ó˙˙ůç˙˙˙“˙˙˙˙źůüţ|˙˙˙˙ůüçĎ˙˙˙˙˙˙?˙˙ç˙˙˙'˙˙˙˙˙?ó?˙˙˙˙˙źůç˙ů˙˙˙˙Ěů˙ç˙˙˙˙ů˙˙˙?đ˙˙ó˙˙˙ů˙ó˙˙˙˙óĎ˙ó˙˙˙Ďź˙˙ó˙˙˙“ţs˙˙˙˙˙˙˙˙Ď˙Ď˙źćO˙˙˙'˙˙ţgţL˙˙ź˙˙ó˙˙˙˙˙˙˙?ó˙˙˙˙ţO˙˙˙˙ž˙˙˙ü˙ó˙˙˙ţů˙˙üç˙˙˙˙žyü˙˙˙˙?˙ţ˙˙˙˙ůçůó˙üź˙˙ć˙˙ç˙˙˙˙˙˙˙˙™Ďţ˙ü˙ž?˙˙˙˙˙Ď?˙?˙˙üóĎźçţ?ź˙ţóçţ˙üç˙˙źů˙˙ů?˙˙˙ç˙˙˙ü˙˙˙źů˙ů˙˙ź˙˙?ţ˙ç˙˙˙>y˙˙˙˙˙ţ˙Ďź˙çĎ˙ó˙ů˙ů˙˙˙ţÎ˙˙˙ź˙˙˙˙?ů˙˙˙˙˙˙ůóó˙ó˙ňg˙óó?˙˙9˙˙˙ů˙ţ˙óçç˙?źĎ˙˙˙˙˙źó˙˙üçç˙˙<˙˙??˙˙ů˙˙˙Ďţ~ţ˙˙˙Ë›˙řY?Ě˙˙˙?˙ç˙Ď˙óü˙˙˙üó˙ţ˙˙óüç˙?Ď>Oä˙˙˙ç?Ď˙˙˙˙˙˙źü˙ü˙˙ů˙ĎÉüä˙ůů?ç˙˙ć|ü˙“˙˙˙˙˙ź˙˙ź˙˙ţţyź˙˙˙˙óóçç˙˙ź˙ĎĎţů˙˙?˙?ź˙˙ů˙ç<˙˙ĎçĎůůü˙˙˙˙˙˙>y˙˙ţţI˙˙ţg˙˙ů9˙ç˙ů<ź˙˙˙3ź˙ü˙ç˙˙˙˙˙˙?óź˙?˙˙˙˙˙ů˙˙˙ç˙˙ĎĎů˙óç˙˙ů˙˙ů˙˙“>|˙Ď˙˙çç˙ţĎçç˙?ź˙˙˙ů˙ţţgóü˙ů˙˙˙ţgź?˙˙Ď˙˙˙ç?˙ç˙>˙źţţ˙˙Ď˙˙ů˙ů˙ůó˙ź˙ţ˙ţ˙˙Ď˙ž|˙˙çţ~s˙˙ç˙˙˙ó<˙óůůź˙Ď˙?˙3˙óÎsţ˙ç˙˙˙ţ˙˙˙Ď˙˙üůň˙?˙?˙Îç˙đĎüó˙˙ü˙˙ź˙˙ň˙ç˙çů˙˙˙˙Ďź˙˙?˙ś˙˙ňç˙'˙˙çóÉ??ç˙?˙˙˙?˙?˙˙˙˙ź˙çç˙Ď˙˙óü˙˙Ď˙˙?˙˙üç˙˙˙˙˙źţ˙˙˙ç˙üĎ˙ĎĎĎ˙˙ůóüó˙˙˙˙˙ź˙˙˙˙˙˙ü˙˙ţdóĚ˙˙˙˙Ďź˙ţy˙˙˙3ţ˙˙ź˙˙˙˙˙˙˙ź˙˙˙ç˙ó?ź˙üź˙˙’~O˙˙˙˙˙Ď˙˙˙˙˙˙˙˙˙ç˙źţ˙˙ţgţ˙˙˙˙Ďů˙˙˙?˙˙˙˙˙˙Ď˙˙˙ś˙?˙ó˙˙źźź˙˙ů˙˙źźśç˙˙˙˙˙ó˙ź˙˙˙ü˙ç??óó˙˙˙˙ź˙˙ç˙˙ţ~y˙˙˙˙˙ţy?˙?˙˙˙˙˙ź˙??˙˙˙ź˙Ď?˙ů˙˙ź˙çĎţgü˙??˙ů˙žO˙˙˙ů˙üů˙ü˙˙ůů˙˙˙˙˙?˙ü˙˙˙˙˙çź˙˙˙˙ůÎ~˙˙Ďů˙˙?óţgźüů˙˙˙˙?˙’˙˙˙3˙óţüĎ˙Ď˙˙?ü˙˙˙˙ź˙?˙ţ˙Ď˙˙üţ?˙˙óç˙˙˙Ďüź?ź˙˙ţ˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙?ó˙ůţź˙˙ü˙˙ççů˙˙ó˙ů˙˙ů˙Ď˙˙˙˙˙Ďó?˙˙ů˙˙˙˙˙˙˙źü˙ţsó˙˙źó˙˙˙ü˙˙˙˙ó˙˙˙˙çĎţ˙˙˙óó˙˙˙’ţů˙˙˙˙˙˙ü˙ó˙˙˙ó˙˙˙˙˙ó˙˙˙ţ|ä˙?ź˙ź˙óüţ˙˙˙˙˙˙˙ţĎ˙óü˙˙˙˙ţ?źů˙˙˙˙˙˙˙˙˙ó˙˙˙˙˙ů˙˙óçţN˙ůĎĎ˙ó˙çň˙üĚź˙ó˙˙˙˙Ď˙˙˙?˙˙˙ç˙˙óü˙źźů˙˙˙˙ü˙3˙ćgó˙ź˙üź˙˙Â˙çů?˙'˙˙ó˙˙ţ˙ůçü˙˙˙˙ţOü˙>˙˙˙ţó˙˙˙ţ?˙˙˙˙˙˙ü˙˙˙˙˙˙Ď˙ç˙˙˙>s˙3ç<ţć˙˙˙˙˙˙˙˙˙˙ü“˙9˙˙˙˙äĎ?ţs˙ů˙Ď˙˙ů˙üĎ˙˙˙˙ţ~˙˙óüó??˙˙ů˙ü˙Ď˙ź˙ů˙ů˙˙$˙˙˙˙˙˙ź˙˙źó˙śó˙ó˙˙˙˙ç3˙ţyç˙˙˙˙˙ç˙˙˙źů˙˙˙˙˙óó˙ţ˙˙ü˙Ď˙˙˙źü™ţ˙˙çů˙˙˙˙˙˙˙™˙˙?ó˙ó˙˙ó˙˙˙˙˙Ď˙˙™ź?˙˙Ď˙˙˙˙?˙>˙˙˙˙˙çź˙˙˙Ď˙˙˙˙˙ç˙˙źüź˙˙ç˙˙˙ü˙˙˙˙ů3Ďţ˙çó˙˙ź˙˙˙˙˙˙ů˙Ďź˙ţ˙˙˙źó˙˙É˙˙˙ó˙˙˙˙˙˙˙?˙˙˙'˙ţ3˙˙źŔçú˙řY'˙Î˙źüó˙˙˙˙ţyź˙Ď˙óĎ˙™˙˙˙ůç˙˙ç˙˙˙˙˙˙3ź˙ć?ź˙˙ü˙Ď˙˙˙ů˙˙ó˙ň~˙˙˙˙<˙˙˙˙˙˙źůóćg˙źĎůç˙˙˙çź˙žĎ˙˙ů˙˙ůĎ˙ţĎ˙óţOž˙źĎů˙ů˙ţ˙ó˙˙˙˙˙˙˙˙˙˙?ź?˙źţ˙˙ź˙˙Ď˙˙ţ|ü˙˙˙ţy˙˙Îs˙˙˙??ů˙˙˙˙˙˙ţg˙“˙˙˙9˙ç?˙ź>~˙˙üţgç˙ůţOçź˙˙óĎ˙˙ü˙ü˙ůç˙˙ţ˙ů˙?˙źĎ˙ç˙ţ~ůóü˙ç˙˙˙ţ˙ó˙˙äó˙˙ţüů˙˙˙ü˙˙˙˙˙ůĎç˙˙ů˙˙?Ď˙˙˙˙ź˙˙˙˙ź˙ůü˙ţ?ü˙ü˙˙˙˙˙˙?ţ˙˙çó˙ç˙<ü˙˙˙?˙˙üů˙˙˙˙<˙˙?źů˙˙˙˙źź˙ţ˙?˙˙˙˙ó˙˙˙˙˙˙˙˙˙çţg˙˙˙?˙˙É˙˙˙óü˙˙˙˙˙˙˙Ďçź˙?˙˙˙çů˙˙Ď??˙˙˙˙˙?˙˙źó˙ů˙˙˙ç˙Ďź˙˙˙˙˙˙˙Ď˙˙˙˙źź˙˙˙Ďç˙˙˙ź˙˙źü˙˙˙˙˙˙˙˙˙óçţ˙˙˙ů˙˙˙˙˙˙Ď˙˙˙˙˙ţç˙˙˙˙˙ţĎ˙˙?çů˙˙˙?üü˙˙˙Ď˙˙˙˙˙˙˙˙˙˙˙Ďţ˙ü˙˙ç˙źó˙ţç˙ţ˙ů?˙ůç?˙çó˙˙˙˙˙˙?ţü˙ç3˙˙çó˙ü˙Éü˙çţ˙ç˙óĎ˙˙ü˙Ď˙˙?˙ů“˙˙?˙ć˙˙˙ç˙?Ďçţ˙˙˙ó˙˙˙Ď˙˙˙˙Ď˙ó˙˙˙Ď˙˙˙˙˙˙ó˙˙Ď˙ţ˙?™˙˙üĎ˙çĎ˙˙9˙˙ü˙˙ü˙˙˙˙ç˙˙˙˙&9ç˙ů˙ś@˙ţž|Ďó˙çÎgů˙ź˙˙ó9˙ţü˙˙˙˙˙ůůó˙˙˙˙™ó˙˙Ďç˙ź˙Ď˙ůź˙ü˙˙˙˙˙˙ś˙˙<˙'˙˙˙˙ç˙ó˙ů?ţ3Ďů˙ňg?˙˙ü˙˙?˙˙ůó˙ůž˙˙ź?ţţO˙˙ó˙˙˙çç˙?˙˙˙˙˙ó˙˙üóü˙˙Ďç˙˙˙É˙˙˙˙˙3óś˙˙ţO˙ţź˙˙˙?˙˙˙˙˙ó˙˙˙çźç˙˙˙ź˙˙ç˙˙˙˙??˙˙Ďţçůć˙ţ˙˙˙˙˙ůů'˙˙ç˙˙Ď˙>˙˙˙˙˙ó˙?˙ü˙ç˙˙˙<ź?ĎóĎóţ~˙˙˙ü˙˙Ď˙˙ó˙˙üźů?ç˙˙˙˙˙˙˙ó˙źó˙˙˙˙˙˙˙ź˙˙˙˙ó˙ç˙ţ˙˙˙˙˙˙˙˙ç˙Ď˙˙˙Ěó˙Ď˙žOţ˙˙ź?üó˙˙˙˙˙ź˙˙˙˙üüź˙ś™üţ˙˙˙ü?źóţ˙“Ě˙˙Ďź˙ó˙˙˙˙˙ů˙˙˙˙ůţ™ţç˙ó˙źţgţy˙˙˙˙˙˙˙ź™˙ň˙˙˙˙9ňź˙˙?˙˙˙ů˙?˙˙ç˙™˙˙źü˙˙˙˙ů˙ç˙ţç˙˙˙˙˙˙ů˙˙˙Ďţó˙˙>|˙óç˙˙ç˙˙˙Ď˙?ó˙˙˙˙˙ňç˙˙3ź˙ţů˙˙™˙˙˙˙˙˙˙˙˙ů˙óĚů˙˙ź˙˙Ďçţţ˙˙˙ç˙ç˙˙ć˙˙˙ůĎ˙Ď“˙Ď˙óů˙çź˙˙˙˙˙˙˙?9˙?Ď˙óó?˙˙ó˙˙˙ţ˙ç˙źç˙˙˙˙˙óĎ˙˙Ď>Lç˙?ü˙˙?ů˙˙ó˙93˙˙˙˙ů˙˙˙?˙ů˙ů˙˙˙üů˙çĎ˙˙ç˙<ó™ü˙ç˙źççůü˙?ţ˙˙˙˙˙˙˙˙˙˙˙˙˙ůź˙˙˙˙ü˙˙˙ç˙˙˙ţs˙˙˙˙ü˙źţs˙üó˙đĂ˙řY?$ź˙óź˙3?çü˙ü˙Ď˙˙ź˙˙˙Ď˙˙˙˙Ďů˙˙˙ç˙˙˙˙˙˙˙ţ˙˙ůüü˙˙˙˙˙ü˙óţţfóź˙˙Ď˙ţ˙˙˙˙ü˙ů˙óüĎ˙ü˙Ď˙˙˙ü˙˙˙˙˙žĎü˙˙˙˙˙˙˙óĎ˙˙˙˙˙?˙źü˙˙ó˙˙˙˙˙ü˙çśźü˙?˙çź˙˙˙˙˙˙˙˙üĎ˙˙ůćO˙™˙ţ˙<˙?ü˙ţy9˙˙˙˙˙ůü˙çóçç˙Ď˙˙˙óţsů˙˙˙˙˙˙üţsů˙<˙˙˙˙˙˙ź?ůó˙˙ţ˙˙˙˙ź˙ç˙˙˙˙˙˙˙˙˙ů˙˙ç˙˙ţ<Ď˙ź˙?˙˙ů˙ćç˙˙˙˙ś˙˙˙ó˙˙?Ď˙˙˙˙ţůůĎţ˙˙?˙˙˙ó˙?˙˙çó?˙ž˙˙ü˙ůüçĎţü˙˙˙˙üůůç˙˙˙˙ç˙Ď˙Ě™˙źçţ˙˙˙üůň|?üóóó˙Ďţç˙˙˙˙“ç˙˙˙˙˙˙˙˙Ď˙˙ź˙˙˙˙˙˙ź˙ó˙˙˙˙˙˙˙çůĎóţźź˙ź<˙˙˙˙˙˙çůüţ˙˙˙˙˙?˙Ď˙?ůó˙˙˙˙ţdůž˙?ĎĎü˙<˙ţ˙˙źź˙˙ç˙˙˙˙˙ţ˙˙Ď˙ü˙˙˙˙˙É˙˙?˙˙˙˙ţţźţĎĎ˙˙˙ź˙üţů˙˙˙˙äţç?˙ţó˙?ç˙ź˙?˙˙ü˙ćO˙˙ä˙˙˙?˙ç<ü˙˙Ď˙?˙ţgňOĎ˙ź˙˙ňg˙˙ţ~˙˙üţ˙ç˙˙Ďçź˙ů˙˙˙ţ˙˙˙ů?>ůźĎó?˙˙˙˙˙˙˙˙üź˙˙ç˙˙˙˙˙˙˙˙˙ţ˙˙˙˙˙óź˙˙ź˙˙ś˙Ď??ůů˙ä˙˙üç'˙™˙˙˙˙üźóĎ˙˙ů˙ů˙˙Ď?˙˙˙˙?˙˙ó˙˙˙˙˙˙ţs˙˙?˙ń�C˙ó˙ů˙˙ţ~ź?Ď˙˙˙˙˙˙˙˙˙˙˙çţ<ó˙óóü˙˙˙˙˙źţçç˙˙˙ó˙˙˙˙ü˙˙˙ó˙˙“˙ź˙˙˙?ç˙ź'˙˙çů3˙ó˙˙˙˙˙ů˙˙?˙˙˙˙ççź˙Î˙˙ůÉ˙˙ü˙Ď˙ü˙˙üççç˙˙˙óóÉůó˙˙˙ç?˙˙ç˙˙ţgź?˙ţ˙˙˙Ď˙˙˙˙ĎçĎĎźź˙óĎó˙˙ç˙ó˙˙ţNó?ůů˙˙˙źž˙˙Ď˙?üź˙˙˙ž?˙˙ź˙˙˙˙˙ć˙˙˙˙˙?˙˙˙˙ů˙“üó˙˙˙?Ď˙˙˙ůů˙ůź˙?˙ţ˙˙˙˙ź˙˙˙˙˙çź˙ü˙?˙ů˙˙˙™ţfü˙˙çţ˙˙Ď˙˙˙çźç˙˙˙ţ˙?ů˙˙˙˙˙ç˙˙˙ü˙ç?ź˙˙Éů˙˙“˙˙ç?˙ü˙˙˙ů˙?ţgççóů˙˙˙˙ţü˙˙ü?˙çó˙Ď˙“ţ˙˙ó˙˙˙˙źĎ˙óź˙Ď?˙üó˙˙ů˙˙˙˙Ďç˙?˙?˙˙ů˙Ď˙ů˙˙˙˙˙ů˙˙˙˙˙ů˙ů˙˙˙˙˙ó˙˙˙˙˙˙śÉ˙śç˙?˙˙˙üĎ˙˙˙˙˙˙˙ĎĎůĎ˙˙“˙ź˙˙ó$óůţüü˙ţs˙˙˙ź˙˙˙˙˙˙˙˙˙ţ˙˙˙??Ďů?ňyţ˙ä˙˙É?˙ţ~˙ůĎů˙Ď˙ů˙˙ů˙˙?źÎ˙˙ç˙˙˙˙ź˙źź˙˙˙9˙˙˙˙˙ü˙˙˙3˙˙˙Ďć˙>y?óĎź˙óţ˙?ç˙˙?˙ó˙˙˙˙˙˙ó˙ź˙˙˙˙ç˙ţ?˙ç˙˙?˙˙$˙˙˙˙˙˙˙˙ó?ó˙ů˙çź˙˙˙˙˙Ď˙˙˙Ď˙˙˙˙˙˙˙üó˙˙˙˙ź˙ůţ˙óůĎ˙˙ź<ź?˙˙˙çó?ňy?˙˙ó˙˙ç˙˙˙˙ţ˙ó˙?˙˙—Ő˙řY˙˙ţ˙Ď˙ü˙žó˙˙˙˙ů˙ü˙˙źů˙˙ü˙˙ź˙˙˙˙˙˙ź˙˙˙ź˙ü˙˙ç˙ü˙˙˙˙Ď˙˙˙˙˙Ď˙Ď'˙˙˙ź˙ź˙üĎĎ˙˙Ď˙˙˙üĎ˙˙˙˙˙˙ůç?˙çü˙˙Éüćó˙˙˙˙˙˙˙˙óţs™ţ|çć˙˙˙˙˙˙˙˙Ď˙ó˙˙˙˙ó˙ţy˙Ď>óź˙˙ůç˙˙ó˙˙˙˙çü˙˙˙˙˙˙ź˙óü˙ç?ç˙?˙˙Ď˙˙çü˙˙üĎ9˙˙˙˙ó˙˙˙ůĚó˙˙˙˙˙ů˙˙ç˙˙˙ţź?˙˙˙Ď˙˙˙˙ó˙˙˙üź˙˙˙˙˙˙˙ňfüţ~˙ţ˙˙˙˙Ďóü˙˙ó˙˙Ď?˙˙˙ź˙źó˙˙?ç˙ó˙ü˙˙ś˙˙Ďç“?ĎĎ˙˙˙źç˙˙ü˙ź˙?˙˙˙ó?˙˙ů˙˙ó'ůů˙˙˙üóň~˙˙˙ůţ˙˙˙˙đ˙ó˙ü˙ţ?˙˙˙˙˙˙ţ˙ü˙˙É˙?ü˙ç˙ççź˙ó˙˙üç˙?ţ˙˙ü˙˙˙ü˙ź˙˙˙źü˙ź˙ç˙ź˙?˙ţ˙˙˙˙˙ţ˙˙ţ˙˙˙˙'˙˙˙˙ţ˙ţ˙˙ůĎ˙˙˙ü˙ţç˙˙ç˙˙˙˙˙ü˙˙˙˙˙˙ţž˙˙źů˙ţ|˙óó˙žţźó˙˙ţ˙˙˙˙?˙˙ü˙ů˙˙ü˙ü˙˙˙Ď˙˙˙ů˙ó˙˙˙˙˙˙˙'ó˙ó˙˙˙˙Ď˙źó˙Ě˙3˙˙ó˙˙ţyśţy˙ç˙˙ü˙˙˙˙Ďç˙˙ç˙>˙ź˙üü˙˙˙˙Ď˙˙źĎçĎü˙˙˙˙˙˙˙ü˙˙ţ˙˙˙˙˙˙˙ů˙˙ç˙Ď˙˙˙Ď˙˙Ď˙ňüç˙?˙˙˙˙?ţ˙ó˙˙˙Ď˙Ď˙˙˙˙˙˙˙˙˙ů˙˙˙ó˙˙˙˙˙Ďź˙˙ü˙ů?˙ź˙˙?ç˙˙>˙˙˙˙˙ů˙ů˙ź˙Ď˙˙˙ź˙ţüçĎ˙“ź˙˙ó˙˙˙<ţ˙˙˙ź˙˙˙˙˙˙ç˙˙ç˙˙˙˙˙Ď˙˙óü˙˙˙?˙˙˙˙˙˙˙˙˙˙3˙˙<˙˙˙ź˙˙˙çň˙˙ó˙˙˙ţ˙˙ó˙˙˙'ůţyü˙źňó˙˙ü˙˙˙çź˙˙˙Ďóó˙ç˙<çţ~ç˙˙ü˙>Ď˙˙˙˙üţgś˙˙˙˙?˙ü˙>óüüźó˙˙˙˙˙˙óź3˙˙˙ţ|˙˙>|˙üó˙˙˙˙ů??˙˙ó?˙ţ˙?ź˙?óźü˙ţ|Ď˙˙˙üçů˙üĎ˙çů˙ů˙˙Ďů˙?ç˙˙˙˙˙˙Î?Ě˙˙˙˙˙˙Ď˙˙?ţ|˙˙źů˙˙˙˙ů˙?ź˙Ď˙˙ü˙˙˙ţź˙˙˙˙˙˙˙˙˙ůţfţg?üůüĎňţ˙˙˙˙˙ó˙˙˙?Ďç˙Ď˙ź˙˙˙ĎüĂ˙ź˙ů˙˙ó˙?ü˙˙˙ţ|ó˙ó˙˙˙˙?˙˙ó˙˙˙˙˙çů˙˙˙žs˙ţs˙˙Ď˙ţO˙óźç˙ź˙˙˙˙ź˙˙˙˙˙ç˙óçţ˙ů<˙˙ź˙˙˙çó?˙ţ˙ňy™Ď˙˙?˙ů˙˙˙˙˙˙˙ůĚ˙ţţ˙˙˙˙˙˙ó˙˙ç˙˙˙˙˙Ďţ˙˙ţgó˙˙ó?˙˙˙ü˙˙˙ţ??Ďźó˙˙ţ|˙ůź˙˙˙ůĎ˙ź˙ů˙˙źóó˙çźüźü˙˙źź˙ź˙˙˙ź˙™˙˙˙ü˙ţź˙˙˙˙˙9˙˙ů˙˙˙ç˙?˙ź˙Ď˙˙ç˙˙˙ç˙˙ü˙źţO˙˙˙üů˙É˙˙˙˙˙ź˙˙™˙˙˙ç˙˙ů˙ź˙ĎćO˙çç˙ţ˙źĎţs˙˙˙ź™˙üţ˙˙˙çź˙üů˙Ďů?˙źĎüç˙ü˙Ď˙ůĚ˙™óó˙˙˙ó?˙<˙˙ü˙źţ˙˙ţţů?Ŕ˙řY?˙˙˙˙ü˙ś™˙˙˙˙?˙˙˙˙Éź?ç?˙ů˙ü˙ź˙˙˙˙ź˙óţç˙ů˙˙˙˙˙ů˙˙ü˙˙>˙˙˙˙˙ţ˙?˙˙Ď˙9ó˙˙Ď˙ţ˙“˙ů˙śź˙˙˙˙˙˙˙Ď??˙˙˙˙˙˙?Ď˙˙˙˙źó3çź˙Ď˙?Ěü˙źţ˙˙?˙źó˙ü˙˙ů˙˙˙˙˙˙˙˙ó˙˙˙çü˙˙˙˙˙?˙Î˙ţţ˙ü˙˙˙˙ç˙˙˙óź˙˙?˙˙ţs˙Ď˙?˙˙˙˙˙˙üů˙ů9ç˙˙ů˙ů˙˙ó˙™˙ź˙źĎź˙ü˙ó˙˙˙üňů˙Ďź˙ů9˙˙ţçĎ˙<üţţůů˙ů˙?˙˙˙˙˙ç˙˙˙˙ţ|˙?˙?˙˙?9?˙˙ç?˙ůç˙˙˙ůĚĎ˙˙˙ů˙˙˙˙˙ć˙˙ü˙˙˙˙˙ţ˙˙ç˙ţ˙ć|Ď˙ó>~˙˙˙˙™źü˙˙Îü?˙˙üĎü˙˙˙ůĎůţ|ůĎź˙˙śĎ˙˙Ďźü˙˙˙ůţ˙˙ÎĎ˙üó˙˙ţ~˙ü˙˙'ś˙˙˙˙˙ź˙?˙ć˙˙ü˙ůů3˙ó?ś˙˙˙źç˙˙ó˙ţ?˙ž“˙˙ó˙ćg˙ó?ůç˙˙źůóçůů˙˙˙óóü˙˙˙ź<˙˙˙˙ţ~O˙Ď˙˙˙ů˙˙ňç˙˙˙˙˙ň˙ü˙ź˙óó˙Ď˙ů˙˙ó˙˙ţź˙Ď˙˙˙çç˙?˙˙??˙ţ|ä˙˙?ůĎ˙˙'˙?ó˙ź?˙˙˙óç˙˙˙?ů˙˙˙Ď˙˙?üź˙˙˙ź˙źó˙ü˙˙˙˙˙˙˙˙˙˙˙$ţó˙˙˙˙ů˙˙ź˙˙ä˙ůů?ź˙˙˙˙çţ˙ç˙˙˙Ď˙üçţ˙ü˙Ďţ˙ü˙˙˙˙˙ů˙˙ć?ć˙Ď˙˙'ü˙˙ů˙˙˙˙˙˙ü˙üźü˙˙ç˙ç˙˙óç˙˙ü˙ó˙ź˙ůó?ů˙ó˙ó˙ó˙˙˙çç˙Ď˙Ě˙˙˙ç˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙?˙ů˙˙˙˙˙ĎĎ˙˙çó˙˙?˙˙˙˙ó˙ä˙˙ź˙˙˙˙ź˙˙ţü˙˙˙<˙ó˙˙ţ˙˙˙˙˙˙<ç˙˙óçü˙Ďóţ˙Ďü˙ź˙˙ůů˙˙˙˙˙ź˙źů˙˙śó˙˙˙˙ó˙˙˙ç˙˙ó˙˙˙óĎ˙˙˙˙˙˙ü˙˙˙˙źüĎ˙ç˙óó˙Ď˙˙˙˙Ď˙ź˙˙˙ó˙ţóç˙˙˙ó˙üü˙ü˙˙óçźţOţ˙˙ü˙ü˙ź˙źĎ˙˙˙ó˙?˙˙˙˙ü˙˙ź˙Ď˙<˙˙ü˙˙Ďçů˙˙˙ç˙˙˙˙Ď˙ź˙ů˙˙˙˙˙ü˙ü˙˙˙˙˙˙˙˙˙˙˙˙ź˙ź˙Î|˙˙ćççĎ˙˙˙˙˙˙˙˙˙˙˙ó˙?ç˙˙ç˙˙˙˙˙˙˙?>źĎ˙ç3˙ü˙ź˙˙˙ç3˙˙˙˙˙ź˙˙˙˙˙źó˙ü˙˙ź˙˙ź2gç˙˙˙ó>üó˙˙˙˙?Ď˙˙˙˙?˙ź˙?˙˙ţ˙Ďţ˙˙ůç˙˙˙˙˙˙ó˙˙˙ţ˙Ď?˙˙ůůó˙˙˙˙˙ó˙˙˙ü˙źó˙˙˙˙˙˙˙˙˙˙˙Ďç˙˙˙ç˙˙˙˙˙ů˙ó˙ü˙9˙óü˙˙?˙ů˙ž˙˙˙?ź˙˙˙˙˙üů<Ď˙ç˙˙˙ţ~r˙˙˙˙ů˙üä˙˙˙˙ü˙˙˙ü˙ź˙˙˙Ď˙ůź˙˙˙ź'˙?ó˙˙“˙?˙˙˙źňs˙˙ó˙ĎĎ˙óź˙˙ź˙˙Ď˙˙ź˙˙ůźů˙˙ůţ~˙źů˙˙˙ź˙?˙źĎţ˙ó˙˙ţ˙˙˙˙ţĎ˙??ź'ůţ“˙˙˙ü˙ů?ţ˙˙üĎ˙˙ů˙˙˙˙˙˙˙ůü˙źţ˙?˙˙˙˙?˙˙üůźĎĎüţ˙˙ź˙Ď˙˙ţsůŔůú˙řY�źó˙˙üţ˙ü˙?ţ|˙ü˙˙óóüţ˙?˙˙˙ůź˙ţI˙˙˙˙˙˙ĎçůţIÎů˙Ď˙˙˙˙˙ç˙˙˙üó˙ţ˙˙˙˙Ď˙ó?˙ůÎĎ˙ź˙˙˙˙Îůóź?˙žźó˙˙˙˙ůó˙˙Éüó˙˙˙ç˙óź?˙˙˙˙ţ|˙˙˙˙'˙˙˙˙ü˙˙?Ď˙˙Ď˙˙˙˙źů?˙˙˙ůź˙˙ç˙˙ţ˙˙˙˙üü˙˙˙˙˙˙˙˙?ó˙3˙ů?ó˙ç˙ó˙óóĎ˙˙ü˙ç˙ü˙ź˙˙üśó˙ů˙ů˙çüüţç˙˙˙É˙˙˙üţsź˙źóţ˙˙ţ˙˙˙ůţO˙˙˙Ď˙?˙˙˙˙ţs˙˙˙˙˙??˙˙ů˙˙?ü˙˙˙??˙˙˙˙˙˙˙˙˙ů˙˙˙˙˙?˙źź˙˙˙˙ç˙˙óç˙˙ţ˙ó˙ţóóçĎ˙˙ů˙Ď˙˙˙˙˙çĎ˙Ď˙Ď?˙˙ů˙˙Ď˙˙ů˙˙˙˙˙˙˙˙ů˙'˙˙ó“çó˙˙˙ţO˙?˙˙ĎĎ˙üÎçţü˙˙˙˙˙˙˙˙˙ţ˙˙˙˙?Ď˙>˙üĎ˙Ď˙˙˙˙ź˙˙˙ů˙˙˙ç˙˙˙˙?Ď˙˙˙˙˙˙źţs?üĎ˙˙ź˙çź?ç˙ů˙Éç˙˙˙ç˙˙˙˙˙?ź˙˙˙˙˙?˙9ó˙üÉ˙˙˙˙ç˙<˙ůů˙˙źĎ˙ţź˙ź˙˙˙ü˙˙ţ˙'˙˙˙óç˙˙ţůç˙˙˙??óţ˙$˙ţ˙Ď?˙˙˙Ď˙ü˙˙˙˙Ď˙˙˙˙˙˙çü˙˙˙˙˙?˙˙˙˙Ď˙˙Ď˙üĎüů˙˙ü˙˙ç?˙ü˙ţ˙?˙˙˙?˙˙˙˙ź˙ç˙˙˙Ďü˙˙˙˙źů˙˙ţ˙˙˙ţ˙˙˙˙˙˙˙˙ź˙˙˙Ď˙˙ü˙ţ˙Ďźç˙çţy˙˙˙ů˙ůĎü˙źĎ˙˙Ď˙?˙˙˙9˙ó˙ç˙˙ůĎ˙˙˙ü˙óź˙˙˙ç˙3˙˙ç˙˙˙˙˙Ď˙˙ü˙ü˙˙˙Ďź˙çĎ?˙?Ď™˙ü˙˙çź˙˙˙˙˙ü˙?˙˙˙ç9˙˙ç˙˙˙˙˙?˙ü˙ü˙óůţ˙˙ţ|˙'˙˙Ď˙ó˙˙Éç˙˙źüźó˙˙ó˙ü˙ź˙˙˙˙?˙˙ó˙˙˙çç˙ţţNśüźçü˙<ţ??ó˙˙ůůĎçĎ?˙˙˙??ů˙˙˙˙ţ˙˙˙˙˙˙˙˙˙ů˙ó“ç˙ç?˙ü˙˙˙˙˙ź˙˙˙ź˙ů˙çç˙˙™ç˙?3˙˙˙˙˙˙˙˙˙˙üţOü˙˙˙˙˙˙˙ü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙óź˙ź˙üüů˙˙˙Ěç˙üů˙ů˙˙ţ˙˙˙ţI˙ç?ů˙˙ó˙Ď˙˙óó˙˙˙˙Ď˙Ď˙˙˙˙˙˙ç˙˙?ůź˙ü˙?Ď˙˙?˙źţ˙˙ç˙ţO˙˙˙Ă?˙Ď??ź˙˙˙˙˙3ü˙˙˙˙Î˙ç˙˙?źź˙Ď˙˙ž˙ó˙˙˙˙üü˙˙˙ó˙˙˙˙˙˙ü˙ţňgů˙ç?óü˙˙˙'˙Ď˙˙ů˙ţ|˙˙˙ü˙˙ü˙˙˙˙˙˙˙˙˙ó˙˙?˙ůź˙˙źź˙ç˙ţyó˙˙˙ţü˙˙ç˙˙˙ź“˙Ďü˙˙˙ĎţOĎ˙ü˙Ď˙˙˙˙˙ţ9ü˙˙óůĎ˙˙˙ź˙“ü˙Ď˙˙˙˙˙˙˙˙ůóź˙ĎĎź˙˙Ďůź˙˙ü˙ţyç˙˙ţ~'˙˙˙˙˙?˙˙˙˙˙Ďůź˙źóţ˙ů˙<˙˙˙ó˙??˙˙˙?ţ˙ü˙<ţ˙?˙ţO˙˙?˙˙˙˙Ď˙˙ó˙üźü˙˙ó˙Ďţ~?˙?˙˙ůçů˙˙óů˙˙˙ü˙˙˙˙˙üź<˙ć˙˙ç˙˙˙˙˙˙źţ˙óç˙ç?˙Ďç˙˙ü˙˙Ď˙˙˙ů˙˙üçü˙˙VH˙řY ?ů˙˙ç˙ů˙?ţ˙˙?ü˙˙˙óó??9˙˙˙Ď˙ó˙˙óç˙˙˙ç?˙ç˙˙ü˙?ůź˙óźä˙9˙˙˙˙Ď˙ü˙˙˙ç˙ü˙ĎüÉĎ3˙Ě˙˙˙Ď˙˙˙Ď˙ůźţ˙ţ˙˙<ç˙?ç˙˙çţ|˙?˙?˙“˙Ď’?˙˙˙˙ó˙˙ó9˙˙ů˙çć˙˙˙˙?˙˙˙Ďäóţ˙Ďů˙˙˙˙?˙˙˙˙ç˙˙瓞|˙ů˙˙˙ů˙˙ź3˙˙ţ|˙˙ţţź?˙ţĎ˙˙˙ů˙ňţ˙ůţç˙˙˙˙˙˙˙˙˙˙˙˙Ď˙˙źü˙ç˙˙˙˙ź˙3˙˙ůůź˙˙ü˙˙˙˙˙˙˙˙Éüóś˙˙üźÎ'˙ź˙˙˙˙˙˙ź˙˙˙“?˙˙ź˙˙˙˙?˙˙˙óó˙óç˙3˙˙ţ~˙˙˙˙˙˙˙˙˙˙çůç˙˙ü˙˙Ďźü˙˙ůźü˙ź˙˙˙˙źç˙˙˙đůźç˙˙çţś˙ü˙˙˙˙˙˙Ďź?ź˙ó˙˙˙˙ž˙ů˙˙˙˙ţy˙3˙ó˙?˙?üĎä˙˙˙˙ó˙ç?˙źü˙˙óţ˙˙ţOźů?ćy˙˙˙˙ź˙˙˙˙˙óţ˙˙˙Ď˙˙ç?˙É˙˙˙˙˙?˙˙˙äĎ˙?˙˙˙˙ü˙˙˙˙˙˙˙˙Ď˙˙ź˙˙ţç˙˙˙˙˙˙˙çźüź˙˙ů˙˙˙˙˙?ţ˙ó˙˙˙?˙9˙?˙ó˙˙9ź˙ů˙˙˙3˙˙ü˙˙ó˙˙˙˙˙˙˙˙ů?źĎ˙ů?™˙˙ţ˙ţ˙ó˙ü˙˙˙˙˙˙Ě˙˙˙ç˙˙ů˙˙Ď˙?˙óĚĎÎç˙˙˙˙Ďţţ˙˙˙ţOç˙˙ç˙˙˙?Ď˙˙˙˙Ď˙ţ˙˙Ď˙ü˙˙˙˙˙˙ü˙ţ~ź˙˙óĎ˙˙˙˙“>OÉĎ˙˙?˙˙˙˙˙˙ů˙źü˙˙˙É˙˙äůźü˙˙˙˙˙ţD˙˙˙˙˙ţĎ˙çţ|ţ~|ź˙˙˙?˙˙˙žĎç˙ü˙˙˙˙óüž˙˙ó˙˙˙˙ţÎüţź˙??ţ~sĎ˙˙˙˙ü˙˙ţO˙Ď˙˙3˙˙˙˙çĎ˙?˙Ď˙˙˙óĚ˙ó3˙Î˙3˙óü˙˙˙˙˙ç˙Ď˙˙üçůţO˙ü˙˙ç˙˙óü˙üüţ˙9Ď>˙˙˙˙˙ů˙˙ů˙˙ć?çź˙üů˙ţs˙źů˙?ç˙˙˙˙˙™˙˙˙Ď˙˙˙Ď9˙˙Ě˙?˙ů˙üź˙˙ů˙˙˙˙ů?ůç˙˙?˙É˙çĎ˙Îrź˙˙źä˙˙˙˙˙ţü™˙ž˙˙ů˙˙üů?ç?Ď˙ţ˙üů˙˙˙ü˙˙ů˙˙ů˙ź˙óś˙˙˙źç˙ůź˙˙Ď˙üźź˙É˙˙˙ç˙˙ţs˙ć~rs˙˙óů˙˙˙˙˙çĎ˙˙˙?ü˙˙ó˙ü˙üůźó˙˙˙˙˙˙˙˙ů˙ţrsó??˙˙ś'˙˙˙“˙˙˙˙źůüţ|˙˙˙˙ůüçĎ˙˙˙˙˙˙?˙˙ç˙˙˙'˙˙˙˙˙?ó?˙˙˙˙˙źůç˙ů˙˙˙˙Ěů˙ç˙˙˙˙ů˙˙˙?˙˙˙?˙˙˙ź˙?˙˙˙˙<˙˙?˙˙üů˙˙˙?˙˙ů?ç?˙˙˙˙˙˙˙ü˙ü˙ůţd˙˙˙ň˙˙ćäĎ˙ů˙˙˙?˙˙˙˙˙˙ó˙?˙˙˙˙ä˙˙˙˙ůç˙˙˙˙Ď˙?˙˙˙ç˙ź˙˙Î˙˙˙ůçźĎ˙˙˙ó˙˙ç˙˙˙˙˙žź?˙É˙˙ţg˙˙ţ˙˙˙˙˙˙˙ůś˙ç˙˙Ďůçó˙˙˙˙˙üó˙ó˙˙˙Ď<ůţçóů˙˙ç˙>ç˙˙Î˙ů˙ź˙˙“˙˙˙ţ˙˙˙Ď˙˙ů˙ź˙ź˙ů˙˙ó˙ç˙ţ˙˙óçź˙˙˙˙˙ç˙üů˙ţ|˙˙?˙ź˙ź˙˙˙çüç˙˙˙ů˙˙˙đę˙řY?˙˙˙˙˙˙˙źĎ˙˙“ůç˙9˙ź?˙˙˙ç˙˙ç˙˙˙ü˙Ďüţ~ţ|˙˙˙<źĎ˙˙?˙ü˙˙˙ů˙˙Ď˙˙ţg˙˙ü˙˙ĎÎ?˙?˙˙3˙˙ü˙˙ź˙?˙Ďó˙˙˙óĎ˙ů˙˙˙Ďóźü˙<ů?“˙˙˙ś˙?˙˙˙˙˙ţó˙ó˙˙ç˙?'ó“˙çä˙ź˙˙™óóţO˙˙˙˙ţ˙ţ˙˙ů˙ůć˙˙˙˙ĎĎźź˙ţ˙??ů˙ç˙ü˙üţ˙˙ç˙śó˙˙?ź?ççó˙˙˙˙˙üůç˙˙ů˙ů'˙˙ůź˙˙äç˙ź˙äň˙˙üÎ˙ó˙ź˙˙˙˙˙ü˙Îü˙˙˙˙˙˙ç˙˙˙ź˙˙??ç˙Ďź˙˙ç˙˙ç˙ţLůó˙?˙˙źź˙ů˙?źźüţ˙˙˙ç˙ů˙ůźĎó˙ç˙˙˙ůž|˙˙˙?˙˙˙ś˙˙źüů˙ţů˙ů˙˙˙?˙˙ç˙ä?ţ|˙ç˙˙ź˙˙ź˙˙ó˙çź?˙ů˙źś˙˙ů˙˙˙üĎ?üţ~g˙ó˙Ď˙Ě˙üóś˙ź˙ů˙˙˙˙ź˙˙˙ó˙˙˙>|ź˙Ď˙Ď˙óźů˙˙?óĎ˙˙ó˙ţ˙˙É˙˙ź˙źç˙˙˙˙>˙ü˙ţs˙˙É˙źüź˙˙źĎ$ü˙źü˙˙˙ü˙ü˙˙˙˙ţ˙źź˙?˙˙Ďó˙˙?˙ü˙˙˙óź˙˙˙˙ţů˙˙˙˙ź˙ó?˙???˙˙çĎóĎ˙˙˙˙ţ˙˙˙˙˙˙ó˙˙ů“Ď3˙˙˙˙>˙ůç˙˙üĎů˙˙ţ˙˙˙˙˙˙ţ˙˙˙ź˙Ěţ˙ň˙ţIů?˙˙˙˙˙?˙˙˙˙˙˙˙˙˙źţů˙˙˙ůźů˙˙˙˙˙?ç˙˙ü˙˙˙˙˙˙˙?˙˙ţsü˙˙Ď˙ţ~~˙˙ç˙ţ~~sź˙˙˙˙˙Ďţ˙˙˙ó˙śü˙ĎĎ˙˙˙ţ˙˙?Ďţ˙˙˙˙˙ţ|ü˙ü˙ü™˙üüĎ˙˙Î˙˙ţ˙ź˙üůů˙Ďçó˙˙˙˙˙çü˙˙˙9ů˙˙Ď?˙ĎĎ˙˙ţ˙˙ó˙źź˙ź˙˙˙Ď˙˙˙˙çź˙˙˙˙ůÎ~˙˙Ďů˙˙?óţgźüů˙˙˙˙?˙’˙˙˙3˙óţüĎ˙Ď˙˙?ü˙˙˙˙ź˙?˙ţ˙Ď˙˙üţ?˙˙óç˙˙˙Ďüź?ź˙˙ţ˙˙˙˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙?ó˙ůţź˙˙ü˙˙ççů˙˙ó˙ů˙˙ů˙Ď˙˙˙˙˙Ďó?˙˙ů˙˙˙˙˙˙˙źü˙ţsó˙˙źó˙˙˙ü˙˙˙˙ó˙˙˙˙çĎţ˙˙˙óó˙˙˙’ţů˙˙˙˙˙˙ü˙ó˙˙˙ó˙˙˙˙˙ó˙˙˙ţ|ä˙?ź˙ź˙óüţ˙˙˙˙˙˙˙ţĎ˙óü˙˙˙˙ţ?źů˙˙˙˙˙˙˙˙˙?˙˙˙˙˙ź˙˙>äç˙˙śü˙˙?ţ'˙˙ĚÉ˙˙?˙˙˙ü˙˙˙ó˙˙˙ţ˙˙?Ďůů˙ź˙˙˙˙Ďó?ţf?ů˙˙É˙˙ţ˙çů?˙'˙˙ó˙˙ţ˙ůçü˙˙˙˙ţOü˙>˙˙˙ţó˙˙˙ţ?˙˙˙˙˙˙ü˙˙˙˙˙˙Ď˙ç˙˙˙>s˙3ç<ţć˙˙˙˙˙˙˙˙˙˙ü“˙9˙˙˙˙äĎ?ţs˙ů˙Ď˙˙ů˙üĎ˙˙˙˙ţ~˙˙óüó??˙˙ů˙ü˙Ď˙ź˙ů˙ů˙˙$˙˙˙˙˙˙ź˙˙źó˙śó˙ó˙˙˙˙ç3˙ţyç˙˙˙˙˙ç˙˙˙źů˙˙˙˙˙óó˙ţ˙˙ü˙Ď˙˙˙źü™ţ˙˙çů˙˙˙˙˙˙˙™˙˙?ó˙ó˙˙ó˙˙˙˙˙Ď˙˙™ź?˙˙Ď˙˙˙˙?˙>˙˙˙˙˙çź˙˙˙Ď˙˙˙˙˙çi ˙řY#'˙˙ţ~y˙˙˙˙˙ţy?˙?˙˙˙˙˙ź˙??˙˙˙ź˙Ď?˙ů˙˙ź˙çĎţgü˙??˙ů˙žO˙˙˙ů˙üů˙ü˙˙ůů˙˙˙˙˙?˙ü˙ź˙9˙ţóĎ˙˙˙˙ůć˙?˙Ď?ţg˙˙˙çź˙˙ź˙˙˙˙˙üÎ˙™üţ˙˙ó˙?˙˙˙ç˙˙Ď˙Éů˙˙˙˙üó˙˙˙˙˙ţçĎ™źţ?çź˙˙˙žţy˙?˙˙ç˙˙ç?˙ů˙?˙Ďů>y˙ţ?ç˙ç˙ů˙˙Ď˙˙˙˙˙˙˙˙˙üţ|˙ţů˙˙ţ˙˙?˙˙ůóó˙˙˙ůç˙˙9Ď˙˙üü˙ç˙˙˙˙˙˙ůźţO˙˙üç˙ś˙ţ|ůů˙˙˙óůźź˙çů?ž˙˙Ď?˙˙ó˙ó˙çź˙˙ů˙˙çü˙ţ?˙ź˙ůů˙çĎó˙ź˙˙˙ů˙˙Ď˙˙“Ď˙˙ů˙óç˙˙˙ó˙˙˙˙˙ç?źĂ˙ţ˙Ďó˙˙˙˙ç˙˙˙˙ç˙ţ?˙źĎ˙?˙?˙˙˙˙˙Ď˙ź˙˙ůü˙ů˙Ď??˙˙Ď˙˙˙>˙˙˙Ď?˙Ďçţ˙˙˙çç˙˙ź˙ü˙˙˙˙˙Ď˙˙˙˙˙˙˙˙˙źůź˙˙ü˙˙˙'˙˙˙Ďó˙˙˙˙˙˙˙?žü˙˙˙˙źç˙˙<ü˙˙˙˙˙ü˙˙ţĎ˙ç˙˙˙ź˙>˙˙˙˙˙˙˙?˙˙˙ţ~˙˙˙?ź˙˙ţ˙ţó˙˙˙˙˙˙˙˙˙Ďźů˙˙˙˙ç˙˙˙˙˙˙?˙˙˙˙˙ů˙ź˙˙˙˙˙ů˙?˙ü˙źç˙˙ü˙óó˙˙˙?˙˙˙˙˙˙˙˙˙˙˙?ů˙˙ó˙˙źţĎ˙ů˙ź˙ů˙˙ä˙˙çś˙˙źĎ˙˙˙˙˙ü˙ů˙ó˙śĎ˙˙źĎ˙ó˙'ó˙źů˙˙ź˙Ď?˙˙ó˙?˙ü˙˙ćO˙ü˙˙™˙˙˙˙źüü@˙˙źüź˙˙ç˙˙˙ü˙˙˙˙ů3Ďţ˙çó˙˙ź˙˙˙˙˙˙ů˙Ďź˙ţ˙˙˙źó˙˙É˙˙˙ó˙˙˙˙˙˙˙?˙˙˙'˙ţ3˙˙ź˙˙źçź3ü˙ůó™ţç˙˙üÎ˙ź˙?˙˙˙˙ţ~|˙˙˙˙ć|˙˙óů˙ç˙ó˙ţg˙˙?˙˙˙˙˙ç?˙Ď?É˙˙˙˙ů˙ü˙ţO˙źĚóţü™Ď˙˙˙?˙Ď˙˙ţ|˙ţgź˙˙çĎ˙ź˙“˙˙ü˙˙˙ůů˙Ď˙˙˙˙˙ü˙˙˙<˙?˙óů˙˙˙ň˙˙˙˙Ěüç?˙˙“˙˙źç˙˙˙Ď˙˙˙˙˙ü˙˙˙ůçů˙˙˙ç˙˙ů˙˙˙˙ĎĎ˙˙ó˙źůţyź˙˙ź˙˙˙˙˙ţ~I˙˙ů˙˙ó˙Ďź˙˙˙˙˙ü˙Ď˙˙?ů˙˙˙Ď'Ďóüóü˙źź˙˙˙˙?˙ó˙˙ü˙˙˙'ţOů˙˙˙˙˙˙˙ü˙ä?Ď˙˙˙˙˙˙ţ˙˙˙˙Ď˙ź˙ů˙˙˙˙˙˙˙˙˙ź˙?˙˙˙3Ď˙?ţy?ů˙˙ţ|˙óĎ˙˙˙˙ţ˙˙˙˙óňţrgóů˙˙˙˙˙çü˙ź˙äó?˙óç˙ü˙˙˙˙˙ţ˙˙˙ţźćźů˙ü˙ç˙™˙ž˙˙˙˙˙˙çćüź˙˙˙˙Î|źç˙˙Ď˙˙˙ţĎ˙˙ů˙ć˙ç˙?˙˙˙ţů˙˙źů˙˙˙˙˙˙ţ˙˙ó˙źü˙˙Ďź?üů˙˙ů˙˙˙ó˙Ďü˙˙˙˙˙üźů˙˙Ěç˙˙źţ˙ć˙˙˙˙˙˙˙˙ţüó>˙ç˙˙óů˙ź˙ź˙˙˙ů˙ů˙˙ůź˙˙˙ţs˙óä˙ó˙üţůç˙˙˙˙˙˙˙ĎÎĎó˙üüĎ˙˙ü˙˙˙˙ź˙ů˙çů˙˙˙˙˙üó˙˙óĎ“9˙Ď˙?˙Ďţ˙ü˙ÎL˙˙˙˙ţ˙˙Ď˙ţ|—ě˙řY$3ů˙ź˙˙˙ü˙˙˙ó˙˙˙˙ó˙ü˙˙˙ó˙˙˙˙˙˙ü˙˙ó˙˙ź˙Ďć˙˙3˙ůó˙˙Î˙˙?˙˙?˙˙˙ů˙˙˙˙ÉźÎy˙ţçü’˙ÎüĚ˙źó˙ó˙?˙ţ˙˙˙?˙˙˙˙?ç˙˙˙ź˙˙˙˙˙˙˙ů˙˙˙çóó˙˙˙˙˙ó˙Ďů˙ů™˙Î˙˙?˙ů˙˙˙˙˙ó˙ç˙Ďó?˙ó˙?˙˙˙ó˙˙˙˙ţy˙?ó˙˙˙˙˙˙˙Ď?˙˙˙˙ü˙ţó˙˙Ď˙˙˙˙˙ó˙žróü˙˙ž˙˙˙˙˙˙˙˙ó?˙˙ç™?ţg˙ů˙üóü˙ó˙ůäç˙˙˙˙˙çó˙źĎźź˙?˙˙˙ĎůĎç˙˙˙˙˙˙óůĎçüó˙˙˙˙˙ţ|˙çĎ˙˙ů˙˙˙˙ţ˙ź˙˙˙˙˙˙˙˙˙ç˙˙ź˙˙ůüó?ţü˙˙˙ç˙™˙ź˙˙˙ţs˙˙đü˙˙Ďó˙˙˙˙˙źţ~s˙ź˙˙Ď˙˙˙ü˙Ď˙˙ůüĎ˙çź˙˙˙?ţ9ó˙ź˙?˙˙˙˙>~y˙˙˙˙ů˙ó˙ó&çů˙ź˙˙˙˙>|ź˙óĎĎĎ˙?ů˙ź˙˙˙ţOź˙˙˙˙˙˙˙˙?˙ţ˙˙˙˙˙ţ˙Ď˙˙˙˙˙˙˙źç?Ďůţ~ţ|ó˙˙˙˙˙˙źçóů˙˙˙˙˙ü˙˙?ü˙çĎ˙˙˙˙ů“ćy˙ü˙??óüó˙ů˙˙ţ~˙˙ź˙˙˙˙˙ů˙˙˙?˙ó˙˙˙˙˙'˙ü˙˙˙˙˙ů˙ůţů˙??˙˙ţ˙óů˙ç˙˙˙˙“ů˙ś˙˙ů˙Ďü˙źţü˙˙˙ó˙™?˙˙“˙˙ü˙˙śóó˙˙?ü˙˙ůźÉ??ţ˙˙Éź˙˙ůů˙˙˙óů˙˙ź˙˙?ž˙ç˙˙˙ů˙˙˙˙äüů˙ć?Ě˙˙˙˙˙˙˙˙˙ň˙˙ź˙˙˙˙Äů˙˙˙üů˙çĎ˙˙ç˙<ó™ü˙ç˙źççůü˙?ţ˙˙˙˙˙˙˙˙˙˙˙˙˙ůź˙˙˙˙ü˙˙˙ç˙˙˙ţs˙˙˙˙ü˙źţs˙üó˙˙˙Ď˙ç˙˙ůůţ|˙?˙˙˙˙˙˙˙˙˙˙˙źůüóĎ˙ĎĎó˙˙˙˙ţů˙źź˙˙˙Ď˙˙˙˙ó˙˙˙Ď˙ţOţ˙˙ü˙źţ|ź˙˙źäĎ˙Ď˙˙˙˙˙ç˙ü˙˙˙˙˙źž˙9˙˙˙ç'˙˙ó˙?˙ó˙˙óźźź˙˙˙ĎĎ'çĎ˙˙˙ś˙˙˙ź˙˙ůž|˙˙ů˙˙˙˙?˙˙˙˙?ź?>~˙Ď?Ď˙˙ź˙Ď˙˙ů9˙Ě˙çç˙˙ţ~y˙˙˙?ü˙ň˙˙ţyü˙˙ţ˙˙˙˙˙™˙˙˙˙˙ü˙˙˙˙˙çţOóĎ˙˙ü˙?˙˙˙çç˙ćü˙˙ů˙˙˙˙ţ˙˙˙˙˙ž˙óü˙˙ç˙˙ţgů™Ă˙?˙ů˙ź˙˙ó˙˙˙ůçů˙˙˙˙ź˙Ďţ˙˙˙˙ů˙˙˙˙?ůĎç˙˙ň~˙ä˙˙ůĎ˙˙?˙˙ţĎ˙™ůůüţ˙˙˙˙ź˙?˙˙˙˙źĎ˙?ţOů˙˙˙Ď˙˙˙ţ?˙Î˙<˙˙óĎ˙˙ç˙˙˙˙?źü˙ü˙˙˙ç˙?˙ç˙˙˙˙˙ç˙˙˙˙˙ç˙ç˙˙˙˙˙Ď˙˙˙˙˙ţs'ţsźü˙˙˙˙ó?˙˙˙˙˙˙˙??ç?˙ţOţ˙˙Ě“Ďçů˙óó˙ůĎ˙˙ţ˙˙˙˙˙˙˙˙˙ů˙˙˙üü˙?ä˙Éçů˙˙“˙˙$˙˙ůů˙˙ç?ç˙?˙ç˙˙ç˙üţ9˙˙˙ź˙˙˙ţţ~˙˙üç˙˙˙˙˙ó˙˙üĎ˙˙˙?™˙üůä˙Ď>˙Ďů˙ü˙ź˙ü˙˙Ď˙˙˙˙˙˙Ďţ˙˙˙˙ź˙ůü˙˙ź˙ü˙˙ü“˙˙˙˙˙˙˙˙ĚN˙řY-?˙˙˙˙ů˙˙˙˙˙˙Î˙ţ˙ţs˙<ü˙çç˙“˙˙óśźţg˙˙˙˙ňĎ?˙˙ç˙ç˙˙<˙˙˙˙ü˙˙˙Ď˙˙˙˙˙˙ůĎ˙ü˙˙Ď˙˙ţ˙Ď˙ü˙žó˙˙˙˙ů˙ü˙˙źů˙˙ü˙˙ź˙˙˙˙˙˙ź˙˙˙ź˙ü˙˙ç˙ü˙˙˙˙Ď˙˙˙˙˙Ď˙Ď'˙˙˙ź˙ź˙üĎĎ˙˙Ď˙˙˙üĎ˙˙˙˙˙˙ůç?˙çü˙˙Éüćó˙˙˙˙˙˙˙˙óţs™ţ|çć˙˙˙˙˙˙˙˙Ď˙ó˙˙˙˙ó˙ţy˙Ď>óź˙˙ůç˙˙ó˙˙˙˙çü˙˙˙˙˙˙ź˙óü˙ç?ç˙?˙˙Ď˙˙çü˙˙üĎ9˙˙˙˙ó˙˙˙ůĚó˙˙˙˙˙ů˙˙ç˙˙˙ţź?˙˙˙Ď˙˙˙˙ó˙˙˙üź˙˙˙˙˙˙˙ňfüţ~˙ţ˙˙˙˙Ďóü˙˙ó˙üó˙˙˙ů˙ů˙?˙óţ˙?˙Ď˙ůĎ˙üţy3üü˙˙˙ůţ˙˙Ďů˙ó˙˙˙˙3˙˙˙ź˙˙2źź˙˙˙Ď?'ç˙˙˙˙źç˙˙˙˙˙˙ó˙ü˙ţ?˙˙˙˙˙˙ţ˙ü˙˙É˙?ü˙ç˙ççź˙ó˙˙üç˙?ţ˙˙ü˙˙˙ü˙ź˙˙˙źü˙ź˙ç˙ź˙?˙ţ˙˙˙˙˙ţ˙˙ţ˙˙˙˙'˙˙˙˙ţ˙ţ˙˙ůĎ˙˙˙ü˙ţç˙˙ç˙˙˙˙˙ü˙˙˙˙˙˙ţž˙˙źů˙ţ|˙óó˙žţźó˙˙ţ˙˙˙˙?˙˙ü˙ů˙˙ü˙ü˙˙˙Ď˙˙˙ů˙ó˙˙˙˙˙˙˙'ó˙ó˙˙˙˙Ď˙źó˙Ě˙3˙˙ó˙˙ţyśţy˙ç˙˙ü˙˙˙˙Ďç˙˙ç˙>˙ź˙üü˙˙˙˙Ď˙˙źĎçĎü˙˙˙˙˙˙˙ü˙˙ţ˙˙˙Ä˙?˙źţy˙˙˙˙˙ü˙˙˙ü˙˙˙˙˙˙˙˙Ď?˙˙˙ů˙˙źç˙˙?ś˙˙ůóÉó˙˙˙ţ3˙'“˙˙˙?˙ţ˙˙˙˙ç˙˙?ó˙˙˙ů˙˙Ďź˙˙˙˙˙ţţç˙ó˙˙˙ç˙˙ź˙9ó˙äç˙˙ü˙˙˙Ď?ź˙˙˙ç˙˙˙˙˙˙ů˙˙ů˙˙˙˙˙ó˙˙ü˙?˙˙Ď˙˙˙˙˙˙˙˙˙˙Ě˙˙Ď?˙˙ç˙˙˙ůüź˙˙ü˙˙˙˙ź˙˙ü˙˙˙Éţž?çüźü˙˙˙?˙˙ůç˙˙˙óüü˙ů˙Ď9˙źźů˙˙˙?Ďźó˙˙˙˙˙?™ç?˙˙˙Ď˙˙?Ďźü˙?'ü˙˙˙˙˙˙üçĚ˙˙˙˙ź?˙Ďź?˙<˙˙˙˙ţOĎ˙˙üĎ˙˙ź˙Ďç˙Ďüç˙?˙ź3˙˙˙˙9ţ˙3˙ůţţ˙óţĎů˙˙˙˙˙˙óźĎó?˙˙˙˙˙ó˙ü˙ůó˙ţç˙˙˙˙çüţ˙?˙˙ó˙˙˙ůţ˙˙˙˙˙˙˙˙˙çů™˙ůś˙óçó?É˙ů˙˙˙˙˙˙Ď˙˙ü˙?ź˙?ţ˙˙˙?ó˙ç˙ţ˙ü˙Ď˙?˙˙˙ź<˙ü˙˙˙˙Ď˙˙ü˙˙˙˙˙ůţ˙˙çś˙˙ś˙˙ó˙˙“˙üçů˙ç˙˙˙˙ç˙˙˙˙˙ů˙üů˙ź˙ţO?˙ç˙˙˙ůüĎ˙˙ź˙üžfs˙˙Ď˙ţ˙˙˙˙˙˙ţs?˙ź˙ź˙˙˙˙˙˙ü˙˙ů˙˙˙˙˙ó˙ź˙˙˙™ü˙˙üĎ˙˙˙˙?˙˙˙źĎĎóçü˙˙˙ź?ţg˙˙˙ţs˙ç˙ţ˙çüü˙ůç˙'˙?˙çç˙ç˙˙˙ç˙ć˙˙˙?˙źç˙˙˙˙˙Î˙ţ˙˙ů˙Ď˙ç˙ó˙˙ů˙˙˙ů˙˙˙?ç˙“˙˙˙˙>ň˙˙˙˙ç˙˙ć˙˙ů˙˙ţpŚĐ˙řY*?˙˙˙ů˙˙ç˙Ď˙˙˙Ď˙˙Ď˙ňüç˙?˙˙˙˙?ţ˙ó˙˙˙Ď˙Ď˙˙˙˙˙˙˙˙˙ů˙˙˙ó˙˙˙˙˙Ďź˙˙ü˙ů?˙ź˙˙˙˙˙˙˙óţrg˙˙˙ü˙˙˙˙˙&|˙ś˙˙ç˙óţ˙˙˙ţ˙Ďů˙ź˙ç˙˙˙˙˙ç˙˙ó˙üů˙˙˙˙˙˙ů˙ü˙˙˙?üçĎ˙˙?˙ů˙ţO˙çţr˙˙˙˙˙˙˙<ü˙˙˙˙˙˙ü˙?˙˙˙ţĚĎž˙?ü˙3óţů˙˙ü˙ţĎ˙ó˙˙ç˙˙˙˙˙˙˙˙Ď˙˙˙źó˙˙˙˙ü˙˙9˙˙ů˙ů˙˙ó˙˙˙˙ź˙˙˙Î˙ü˙˙˙ůĎ˙?ü˙˙˙˙˙˙˙óç˙äçź˙˙ç˙ç˙˙Ďţgţţ>˙ó˙Ď˙˙˙óÉ˙ç˙>˙äç˙˙ů˙ź?üóóů˙ů˙çç˙çü˙˙˙˙˙˙ź˙˙Ă˙˙ź?Ď˙Ď˙˙ĎÎO˙˙ůĎ˙ţy˙˙˙ţs3˙˙˙ţ˙˙˙˙ůź˙˙˙?˙˙˙˙˙ź˙˙ů˙˙ź˙ůź3˙üĎźź˙˙˙˙ćg˙?˙óź˙˙˙˙ó?ó˙˙˙ç?çůóç>˙ţs?˙˙>ó˙˙˙çů˙˙˙9˙?˙óĎ˙˙ůů˙˙ó˙üžs˙˙˙˙ţü˙˙™˙˙˙ó˙çäĎ˙Ěţs˙˙ţź˙˙Ď˙ůü˙ţyţO˙˙Ď˙™ź˙Ě˙çź˙ţçĎźçç˙˙˙ĎĎó˙˙ţ|ó˙˙˙˙ůů?˙?˙˙˙ç˙˙É˙ź˙˙˙˙˙É˙˙óţ˙ĎĎ˙?˙ç˙˙Ď˙˙ůţ˙?˙˙˙źźü˙˙üü˙˙ůó“˙ü˙ç?˙üźü˙Ďţ|˙˙˙˙Ďź˙˙ü˙ç˙˙˙?˙ü˙ň˙˙ţţĎ˙ó˙˙˙˙˙˙˙˙˙˙ü“ů˙Ď˙˙˙˙ç˙ţ˙˙“˙çäţ˙˙˙˙źÄç˙óů“˙ůů˙˙ź˙çó˙ś˙˙˙çć˙?ź˙˙˙ůç˙˙>óţO˙çó˙9˙˙?ó˙ţs?ć|ü˙˙˙üĎ˙Ď?˙˙?ç˙ź˙˙˙ź˙źţO˙ţü˙ü˙ü˙˙˙ůů˙ó˙ó?˙˙ů˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙Ď˙ţ˙˙˙˙óó˙˙ůü˙˙Ď˙˙˙˙ü˙ů?˙ç˙˙˙˙ç˙˙˙ź˙?˙˙Ď?ü˙˙˙ź˙˙˙˙˙˙Ď9˙˙üů˙?óü˙ź˙ó˙?ç˙˙ţ~˙˙˙˙ç˙çţ˙ç<˙˙˙˙ü˙˙˙ů˙˙ü˙˙˙üó˙˙˙˙˙˙˙?˙˙˙ç˙3˙ů˙üü˙ó˙˙˙˙ó˙ç˙˙˙ü˙˙źüů˙˙˙ü˙˙??˙?˙üůç˙“˙ź˙˙˙?˙?ç˙çó˙˙˙ü˙Ď˙˙˙˙˙?˙ç˙ó˙Ď?˙˙?˙óůţ˙˙ů˙˙˙˙ó˙ç˙ţü?˙˙˙ó˙ó˙˙˙˙˙˙˙˙˙˙˙ţţ˙9ó˙˙™˙źź?˙˙˙˙˙˙˙˙˙˙˙Ďü˙ź˙˙ź˙˙˙˙˙˙üüůţ?˙śĎ˙óţ˙˙˙ůĚ˙˙˙˙˙ç˙˙˙˙˙çü˙˙?˙ç˙˙çĚ™ů˙˙˙üĎź˙<˙˙˙˙Ďó˙˙˙˙Ď˙ç˙Ď˙˙˙ź˙ó˙ź˙˙ţy˙˙˙˙˙˙ü˙˙˙˙ź˙óĎ˙˙ţ~|˙˙˙˙˙ü˙˙˙˙?çü˙˙˙˙˙˙˙˙˙˙˙óů˙˙˙ů˙˙˙˙˙ţü˙˙?Îü˙?˙Ď˙ţçź˙˙˙Ďç˙˙˙˙˙˙>O3˙ů˙˙˙˙źśź˙˙˙˙ţ˙9?˙˙˙˙?˙˙˙?ç˙˙˙ó˙ţg˙˙˙çÉ˙Ďü˙˙ä˙Ď˙˙˙çüś˙˙ü˙óó˙üç˙˙ç˙˙ó˙˙ç˙˙ţgţ˙ţźź˙çţ˙˙ç˙Ď˙çó˙ź˙ü˙˙˙3ő˙řY?9˙˙ź˙˙˙?˙óźů˙˙ó˙?ů˙˙ó˙˙˙˙˙ç˙˙™ü˙™˙˙?˙üźó˙˙ç˙˙˙˙˙˙ó˙ňó˙˙ź˙ź˙˙Ďź˙˙ó˙Ďţ˙çĚů˙?˙˙Ďç˙˙Ďó˙çĎ˙Ď˙˙??Ďç˙ó˙˙˙˙™˙˙äź˙˙˙˙˙üţźäśç˙źü˙˙˙˙˙ţ˙˙˙Ď?˙ç˙˙˙˙ü˙˙3˙˙śçü˙ů˙˙˙˙üç˙ź9ó˙ůçů˙?˙˙˙˙ź?˙üźĎ?˙˙ţ˙9ó˙˙˙˙˙çĎ˙˙˙ň˙˙˙˙Ď˙óü˙˙ü˙˙˙˙ů˙“˙˙˙˙™˙˙ţ˙˙ç˙˙˙˙˙ĎĎ˙˙˙˙˙˙˙ó˙?ó?˙“˙?ţ˙?˙?<˙˙˙Ďţ˙Ďů˙˙˙ÉĎ?˙ź˙źţĎĎçţ˙˙üź˙˙˙Ďç9˙ů˙?ç˙˙˙ç˙˙˙˙źä˙˙˙ü˙ó˙˙˙˙˙ç?˙˙˙˙óó˙˙ů˙˙?ü˙˙˙??˙˙˙˙˙˙˙˙˙ů˙˙˙˙˙?˙źź˙˙˙˙ç˙˙óç˙˙ţ˙ó˙ţóóçĎ˙˙ů˙Ď˙˙˙˙˙çĎ˙Ď˙Ď?˙˙˙ź˙ü˙˙˙ź˙˙˙˙˙˙˙˙źň˙˙9>?˙˙˙ä˙ó˙˙üü˙˙Ěçţç˙Ď˙˙˙˙˙˙˙˙˙ç˙˙˙˙óü˙óç˙˙Ě˙ü˙˙˙˙ů˙˙˙˙ź˙˙ţ˙˙˙óü˙˙˙˙˙˙ů˙ç3˙Ě˙˙ů˙ţyóţ˙źüž˙˙ţ˙˙˙˙óů˙˙˙˙˙ó˙óź?˙Ěź˙˙˙ţóĎ˙źź˙ůü˙˙çů˙ů˙˙˙˙Ď˙˙ç˙ň˙˙˙>˙˙ç˙ž˙˙óó˙?ç˙ňO˙ç˙üó˙˙˙ü˙˙Ď˙˙˙ü˙˙˙˙˙˙ţĎ˙˙˙˙ó˙˙˙˙ü˙˙ü˙˙Ě˙Ďź˙˙Ď˙ţs˙˙Ď˙ç˙ó˙˙˙ó˙˙˙?˙˙˙˙ţĎ˙??ź'ůţ“˙˙˙ü˙ů?ţ˙˙üĎ˙˙ů˙˙˙˙˙˙˙ůü˙źţ˙?˙˙˙˙?˙˙üůźĎĎüţ˙˙ź˙Ď˙˙ţsůů˙ó˙ç˙˙ůĎ˙˙˙ü˙óź˙˙˙ç˙3˙˙ç˙˙˙˙˙Ď˙˙ü˙ü˙˙˙Ďź˙çĎ?˙?Ď™˙ü˙˙çź˙˙˙˙˙ü˙?˙˙˙ç9˙˙ç˙˙˙˙˙?˙ü˙ü˙óůţ˙˙ţ|˙'˙˙Ď˙ó˙˙Éç˙˙źüźó˙˙ó˙ü˙ź˙˙˙˙?˙˙ó˙˙˙çç˙ţţNśüźçü˙<ţ??ó˙˙ůůĎçĎ?˙˙˙??ů˙˙˙˙ţ˙˙˙˙˙˙˙˙˙ů˙ó“ç˙ç?˙ü˙˙˙˙˙ź˙˙˙ź˙ů˙çç˙˙™ç˙?3˙˙˙˙˙˙˙˙˙˙üţOü˙˙˙˙˙˙˙ü˙˙ü˙˙˙˙˙˙˙˙˙˙˙˙˙˙óź˙ź˙üüůĂ˙˙üÎ˙Ďź˙ź˙˙ç˙˙˙˙äźţs˙ź˙˙?ü˙˙˙??˙˙˙ü˙ü˙˙˙˙˙˙ţ˙ó˙™˙˙Ďóü˙˙ó˙ů˙ç˙˙ţ˙ä˙˙˙˙?˙Ď??ź˙˙˙˙˙3ü˙˙˙˙Î˙ç˙˙?źź˙Ď˙˙ž˙ó˙˙˙˙üü˙˙˙ó˙˙˙˙˙˙ü˙ţňgů˙ç?óü˙˙˙'˙Ď˙˙ů˙ţ|˙˙˙ü˙˙ü˙˙˙˙˙˙˙˙˙ó˙˙?˙ůź˙˙źź˙ç˙ţyó˙˙˙ţü˙˙ç˙˙˙ź“˙Ďü˙˙˙ĎţOĎ˙ü˙Ď˙˙˙˙˙ţ9ü˙˙óůĎ˙˙˙ź˙“ü˙Ď˙˙˙˙˙˙˙˙ůóź˙ĎĎź˙˙Ďůź˙˙ü˙ţyç˙˙ţ~'˙˙˙˙˙?˙˙˙˙˙Ďůź˙źóţ˙ů˙<˙˙˙ó˙??˙˙˙?ţ˙ü˙<ţ˙?˙ţO˙˙?˙˙˙˙Ď˙˙ó˙üźüü:x˙řY8?ţ˙ź˙˙˙?ó˙˙˙ţç˙˙ů˙˙˙˙ů˙˙˙˙˙˙˙˙ţ˙˙˙?˙˙ó˙ů˙˙>ź˙źůç˙˙˙ç˙ç?óţ?˙˙?ü˙˙˙˙˙ź˙ţ˙źó˙ç˙˙ó˙Ď˙˙˙?3óóź˙˙ü˙˙?˙˙>˙˙ţs˙ţ˙˙Ďó˙™˙˙9ţOóź˙˙˙ü˙˙Ď˙˙ţ˙Ďü˙Ěśó?üĎ˙˙ü˙˙˙ü˙˙™˙ç˙˙ç˙˙óÎóţ˙ţçĎó˙ó˙ů?üů'ó˙˙˙˙˙?˙˙3ź˙˙źţ~g˙˙˙˙ó˙˙˙üţO?ç˙ü˙ź˙˙˙ó˙˙˙˙ţ˙ţy9çĎ˙ź˙˙˙ź˙ůó?˙˙çĎ˙˙ç˙çůó˙˙çü˙˙˙˙ź˙'˙ç˙˙źçţ˙˙˙˙˙˙˙˙˙˙˙ü˙˙ů˙Ďţ˙˙˙ů˙ó?˙˙ź™˙˙˙Ď˙˙˙˙˙˙˙üźĎ9Ď˙˙Éüçňů˙˙Ă˙˙˙˙ź˙˙˙“?˙˙ź˙˙˙˙?˙˙˙óó˙óç˙3˙˙ţ~˙˙˙˙˙˙˙˙˙˙çůç˙˙ü˙˙Ďźü˙˙ůźü˙ź˙˙˙˙źç˙˙˙˙™ţ˙ţçůĎ˙Ď˙˙˙˙˙üůóů˙˙?˙˙˙ůç˙˙ź˙˙˙˙çźó?˙?ó˙ó˙ĚţO˙˙˙˙?ţs˙ů˙Ď˙˙?ç˙˙˙äů˙“ţgź˙˙˙ů˙˙˙˙˙˙?ç˙˙˙ü˙˙ţs˙üź˙˙˙˙ó˙˙˙ţL˙ó˙˙˙˙˙Ď˙˙˙˙˙˙˙ü˙˙ů˙˙˙çţ˙˙˙˙˙˙ţy˙É˙˙˙ź˙˙˙˙ó˙ç˙˙?˙˙ó˙óźó˙˙?˙ó™˙˙ź˙˙ó?˙˙Ď˙˙?˙˙˙˙˙˙˙˙“ůü˙˙“ůź˙˙ç˙˙ç˙˙?˙Ď˙˙˙˙˙üĎ˙˙ţ˙˙ź˙ü˙ó˙˙<Ěüçţ˙˙˙ü˙ç˙ç˙˙˙˙äţ˙ţ|@˙ü˙ó˙źźĎ˙Ď˙˙ţyţ˙üţ˙˙˙?˙˙˙˙˙'Ď?ůź˙˙ů˙˙˙˙˙˙ç˙ź˙üů˙ůĎ˙óů˙˙˙?˙ó˙˙˙ţ˙˙9˙?˙˙˙˙˙˙˙ů˙?˙źůóůůň˙˙ü˙˙˙ţy˙?ź˙ó˙˙˙˙Ďňy˙˙˙Ď˙˙˙˙ů˙9˙óůţüü˙ůůĎ?˙˙˙˙ó˙˙ů?˙?˙üĎ˙˙˙˙ź?ü˙˙?˙˙˙Ď3˙ĚĎ˙9˙üĎ˙Ďó˙˙˙˙˙ź˙?˙˙óźçů?˙ó˙˙ź˙˙Ďó˙óóů˙üç<ů˙˙˙˙˙˙ç˙˙ç˙˙™ü˙ž˙óç˙ůĎţçü˙ź˙˙˙˙ţg˙˙˙?˙˙˙<ç˙˙3ü˙˙ç˙ň˙˙ç˙˙˙˙ä˙çź˙ü˙˙'˙ź?˙9Éţ˙ţ“˙˙˙˙˙ů˙ňgţy˙˙˙ç˙˙óä˙ś˙?˙ů˙˙óç˙˙˙ó˙˙ç˙˙çţ˙Îsđ˙˙çů˙ţg˙˙ó˙˙'ç˙ň˙˙ů˙˙˙ś˙ůźśś˙˙üţ˙˙˙˙ůó˙˙˙Ď˙?˙ü˙˙?˙>gü˙˙˙˙˙˙˙˙ţ˙śśüĎĎ˙˙çź˙˙ţO˙˙˙ţçóůó˙˙˙˙çóź?˙˙˙˙˙ü˙˙˙ź˙˙üź˙˙˙˙ü˙Ě˙˙˙˙˙ţçź˙ç˙˙˙˙3ç˙ź˙˙˙˙ç˙˙ü˙˙˙ü˙˙˙ţü˙˙˙˙üó˙ü˙˙˙óç˙˙ü˙˙˙ä˙ś˙˙˙˙˙˙˙˙ó˙ó˙çů“˙˙˙É˙˙˙™˙“?˙ç˙˙ü˙˙˙˙˙˙˙Ďü˙˙˙˙˙“˙˙˙˙çź˙˙˙˙?ü˙˙˙˙źţ˙˙9˙˙˙˙çž?˙˙˙Ď˙˙ź˙˙˙˙ţyţ|˙˙'˙˙ůź˙˙ů˙˙˙˙˙˙˙˙ćs˙ź˙˙?çźĎ˙˙˙˙˙óĎ˙Ď˙˙˙<óçů˙źĎç˙˙źüů˙ź˙˙9ŔSŔ˙řY1?˙˙?Ď˙˙˙˙Ď˙ţ˙˙Ď˙ü˙˙˙˙˙˙ü˙ţ~ź˙˙óĎ˙˙˙˙“>OÉĎ˙˙?˙˙˙˙˙˙ů˙źü˙˙˙É˙˙äůźü˙˙˙˙˙ţ˙˙˙˙˙˙˙źĎ˙˙“ůç˙9˙ź?˙˙˙ç˙˙ç˙˙˙ü˙Ďüţ~ţ|˙˙˙<źĎ˙˙?˙ü˙˙˙ů˙˙Ď˙˙ţg˙˙ü˙˙ĎÎ?˙?˙˙3˙˙ü˙˙ź˙?˙Ďó˙˙˙óĎ˙ů˙˙˙Ďóźü˙<ů?“˙˙˙ś˙?˙˙˙˙˙ţó˙ó˙˙ç˙?'ó“˙çä˙ź˙˙™óóţO˙˙˙˙ţ˙ţ˙˙ů˙ůć˙˙˙˙ĎĎźź˙ţ˙??ů˙ç˙ü˙üţ˙˙ç˙śó˙˙?ź?ççó˙˙˙˙˙üůç˙˙ů˙ů'˙˙ůź˙˙äç˙ź˙äň˙˙üÎ˙ó˙ź˙˙˙˙˙ü˙Îü˙˙˙˙˙˙ç˙˙˙ź˙˙??ç˙Ě9˙˙ţ˙ţ˙äĎź?ó˙˙ůů˙˙źóůů˙Ďç˙˙˙ţ˙ź˙™ü˙?ţ˙˙˙™çĎ˙˙ó˙˙˙ůĎ˙ů˙Ďź˙ç˙ź˙ź˙˙ó˙˙ţţţ|˙ç˙˙ź˙˙ź˙˙ó˙çź?˙ů˙źś˙˙ů˙˙˙üĎ?üţ~g˙ó˙Ď˙Ě˙üóś˙ź˙ů˙˙˙˙ź˙˙˙ó˙˙˙>|ź˙Ď˙Ď˙óźů˙˙?óĎ˙˙ó˙ţ˙˙É˙˙ź˙źç˙˙˙˙>˙ü˙ţs˙˙É˙źüź˙˙źĎ$ü˙źü˙˙˙ü˙ü˙˙˙˙ţ˙źź˙?˙˙Ďó˙˙?˙ü˙˙˙óź˙˙˙˙ţů˙˙˙˙ź˙ó?˙???˙˙çĎóĎ˙˙˙˙ţ˙˙˙˙˙˙ó˙˙ů“Ď3˙˙˙˙>˙ůç˙˙üĎů˙˙ţ˙˙˙˙˙˙ţ˙˙˙ź˙Ěţ˙ň˙ţIů?˙˙˙˙˙?˙˙˙˙˙˙˙˙˙źţń�C˙ţç˙˙ä˙˙˙˙ź˙˙˙ó˙˙ţç˙ç˙ţ˙ü˙ů˙˙ź˙˙üůç˙˙˙˙˙ů˙˙>˙ź?˙Ď˙ç˙ç˙˙˙ů˙9˙˙˙ţ˙˙˙ü˙ç˙˙˙˙˙˙çĎĎ˙Ď˙Éź˙ĎĚ˙˙üç˙˙˙ç˙ů˙˙Ďźźüţ?˙˙˙˙ţĎ˙˙óźź˙üó˙üü˙˙˙ç˙˙˙?ůů˙ů˙˙˙ü˙˙˙˙ţy˙˙˙˙˙śçç˙˙ü˙ź˙ó˙?ćy˙Ďź˙˙˙ó˙ů'˙˙˙ó?˙?ç˙Ě˙ü˙˙ó˙Ď˙˙˙ů˙ó˙˙ç˙ü˙˙˙Ďçó˙˙˙>˙˙ü˙Éóů˙˙˙ç˙˙˙˙˙˙Ď˙˙˙˙˙˙˙˙˙˙˙˙ó˙?˙źçů˙˙˙Ď˙ţ~ź˙˙?˙ź˙˙źü˙˙˙˙˙ü˙3˙˙˙ź˙˙˙˙˙˙ů˙Ď˙ç??˙ů˙?˙˙˙Ď˙˙˙˙?˙˙˙ţ|˙ç˙˙˙˙0ó˙˙˙’ţů˙˙˙˙˙˙ü˙ó˙˙˙ó˙˙˙˙˙ó˙˙˙ţ|ä˙?ź˙ź˙óüţ˙˙˙˙˙˙˙ţĎ˙óü˙˙˙˙ţ?źů˙˙˙˙˙˙˙˙˙ó˙˙˙˙˙ů˙˙óçţN˙ůĎĎ˙ó˙çň˙üĚź˙ó˙˙˙˙Ď˙˙˙?˙˙˙ç˙˙óü˙źźů˙˙˙˙ü˙3˙ćgó˙ź˙üź˙˙ç˙ţ“˙ň˙˙?˙˙ç˙˙žĎ˙˙˙˙ä˙Ďóç˙˙˙˙ç˙?˙˙˙çó˙˙˙˙˙˙˙Ď˙˙˙˙˙ü˙ţ˙˙óç?ó>sĎçţg˙˙˙˙˙˙˙˙˙˙˙É?óź˙˙˙ţLó˙ç?˙źü˙˙˙ź˙Ě˙˙˙˙˙çç˙˙˙?Ď3ó˙˙˙ź˙Ďü˙ů˙˙ź˙ź˙ňO˙˙˙˙˙ů˙˙ů˙?ůĎ?˙?˙˙˙ţs?˙çž˙˙˙˙ţ˙˙ů˙ź˙˙˙˙˙??˙ç˙˙đ‘Ë˙řY6'˙˙˙ćç˙˙˙˙ü˙ź˙˙ó˙˙˙˙˙˙ü˙˙˙ůĎó˙˙?˙ůůů˙˙˙ź˙ůůůÎ˙˙˙˙˙?ů˙˙˙˙Ďţsó˙??˙˙˙ů˙˙ţ˙˙ççź˙˙˙˙˙ç“˙ó˙˙˙˙˙ů˙óó˙˙˙ů˙üó˙˙ź˙ů˙ţ|˙ćĎóó˙˙źůä˙˙˙˙ź˙Ďź˙Ď˙˙źź˙˙˙˙ó˙˙Ďů˙óź˙ç˙<˙˙˙˙˙žg˙ó˙üó˙ć˙˙ţy˙˙ů˙˙˙˙˙˙Ěç˙ůźĎç˙˙˙?ó˙˙˙ţ˙ü˙üźź˙˙˙˙Ď?˙˙˙˙˙çţ|ů™˙çóţy˙˙˙ůç˙çźó˙˙ţ˙ţs˙˙źó˙ü˙“çź˙çóţţ˙ź˙ü˙˙˙˙˙˙˙˙˙˙ĎçĎ˙ç˙ź˙˙ç˙˙ó˙˙˙ź??˙˙˙ž˙óś˙˙˙ĎĎţ˙˙˙˙˙˙™˙ä˙˙˙ÎůĎ˙çĎźź˙˙óůźź˙çů?ž˙˙Ď?˙˙ó˙ó˙çź˙˙ů˙˙çü˙ţ?˙ź˙ůů˙çĎó˙ź˙˙˙ů˙˙Ď˙˙“Ď˙˙ů˙óç˙˙˙ó˙˙˙˙˙ç?ź˙˙ç˙ü˙?˙˙˙ţ˙˙˙ţ˙çó˙ůü˙ó˙ó˙˙˙˙˙ü˙ů˙˙˙źĎ˙źüóó˙˙ü˙˙˙óç˙˙˙üó˙üţç˙˙˙ţ~˙ů˙˙Ď˙˙˙˙ü˙˙˙˙˙˙˙˙˙ů˙™˙˙˙Ď˙˙ň˙˙ü˙?˙˙˙˙˙˙óůç˙Ď˙˙˙ůţ˙óĎĎ˙˙˙˙˙Ď˙˙çü˙ţ˙˙ů˙óç˙˙˙˙˙˙˙ó˙˙˙˙çç˙˙˙óů˙˙˙ç˙˙ç˙?˙˙˙˙˙˙˙˙üů˙ź˙˙˙ţ˙˙˙˙˙ó˙˙˙˙˙˙źů˙˙˙˙˙˙źó˙˙Ďůţ˙˙Ď˙??˙˙ó˙˙˙˙˙˙˙˙˙˙˙ó˙ź˙˙?˙ůÄĎü˙˙˙ů˙Éźç˙˙ţź˙˙˙˙˙˙ůź˙ó˙?˙?˙˙?˙˙˙˙ü˙˙ů™ó˙˙ü˙˙˙˙ó˙óç˙˙˙˙˙ţy˙˙˙ü˙˙˙˙˙ţ˙ů˙É˙˙ţ˙˙˙Ď˙˙˙˙“<˙ç˙ţ?˙ů˙˙˙˙˙˙˙źüů˙˙ç˙˙˙ů˙?˙üź˙˙˙?˙˙˙˙˙˙ó˙˙˙ň˙çó?˙ů˙˙ůţyó?Ď˙ź9źçţ˙˙Ěç˙ů˙ó˙˙˙˙˙ççĎ˙˙˙ţgĎ˙˙?źţ˙?˙ć˙ó˙˙˙˙˙ţs˙üóüź˙˙˙˙ź˙Ď˙ä˙ůüĎ?ç˙Éś˙˙˙ó˙ü˙˙˙çĎ˙ćy˙˙ţ|˙ů˙ů?˙˙Ď˙˙˙źźü˙˙˙˙˙˙Ď˙˙óĎó˙˙?ź˙˙˙'˙˙˙˙üĎÎs˙˙ů?˙ůţ˙˙ü˙˙˙˙˙˙Ď˙˙˙žź˙˙ţ˙˙ź˙˙˙üü˙˙˙?ů˙źç™˙˙ź˙˙˙˙˙ţ~I˙˙ů˙˙ó˙Ďź˙˙˙˙˙ü˙Ď˙˙?ů˙˙˙Ď'Ďóüóü˙źź˙˙˙˙?˙ó˙˙ü˙˙˙'ţOů˙˙˙˙˙˙˙ü˙çü˙˙˙˙˙˙˙ç˙˙˙˙ü˙ů˙˙ź˙˙˙˙˙˙˙˙ů˙ó˙˙˙ó<˙ó˙ç“˙ź˙˙çĎ˙<˙˙˙˙˙ç˙˙˙˙˙?'˙ç&?ź˙˙˙˙ţĎů˙ţO3˙˙>˙Ď˙˙˙˙˙ç˙˙˙˙çůţgů˙ź˙Ďţůźůç˙˙˙˙˙˙ţ~g˙É˙˙˙˙üçÉţ˙ü˙˙˙˙çü˙˙˙źţg˙ţó˙˙˙˙ç˙ź˙ů˙ź˙˙˙˙˙˙ç˙˙˙?ů˙Ď˙üůó˙Ďź˙˙ź˙˙˙?ü˙Ď˙˙˙˙˙É˙ź˙üÎ˙ů˙ç˙ţg˙˙˙˙˙˙˙˙˙ç˙Ď3ç˙ţ˙˙?źů˙ů˙˙˙˙ź˙ź˙˙™˙˙˙˙ç?˙>Oü°˙řY ‹?çü˙˙źů˙˙ź˙ţO˙ţyĎ˙ůü˙˙˙˙˙˙Ď˙ź˙?ůĚ˙˙ůü˙˙?ň?ů˙ź˙ů˙üó˙˙˙?ó˙˙Ď˙ţd˙˙Ď˙ůź˙˙˙ů˙Ďóů˙ź˙˙˙ü˙˙˙ó˙˙˙˙ó˙ü˙˙˙ó˙˙˙˙˙˙ü˙˙ó˙˙ź˙Ďć˙˙3˙ůó˙˙Î˙˙?˙˙?˙˙˙ů˙˙˙˙ÉźÎy˙ţçü’˙ÎüĚ˙źó˙ó˙?˙ţ˙˙˙?˙˙˙˙?ç˙˙˙ź˙˙˙˙˙˙˙ů˙˙˙çóó˙˙˙˙˙ó˙Ďů˙ů™˙Î˙˙?˙ů˙˙˙˙˙ó˙ç˙Ďó?˙ó˙?˙˙˙ó˙˙˙˙ţy˙?ó˙˙˙˙˙˙˙Ď?˙˙˙˙ü˙ţó˙˙Ď˙˙˙˙˙ó˙žróü˙˙ž˙˙˙˙˙˙˙˙ó?˙˙ç™?ţg˙ů˙üóü˙ó˙ůäç˙˙˙˙˙çó˙źĎźź˙?˙˙˙ĎůĎä?˙˙˙˙˙˙?śţĎ?˙˙˙˙˙çĎţ|˙˙˙ź˙˙˙˙ç˙ů˙˙˙˙˙˙˙˙˙ţ˙ů˙˙˙źĎ3˙ç˙Ď˙˙ţůźů˙˙˙˙ç?˙˙ü˙˙Ďó˙˙˙˙˙źţ~s˙ź˙˙Ď˙˙˙ü˙Ď˙˙ůüĎ˙çź˙˙˙?ţ9ó˙ź˙?˙˙˙˙>~y˙˙˙˙ů˙ó˙ó&çů˙ź˙˙˙˙>|ź˙óĎĎĎ˙?ů˙ź˙˙˙ţOź˙˙˙˙˙˙˙˙?˙ţ˙˙˙˙˙ţ˙Ď˙˙˙˙˙˙˙źç?Ďůţ~ţ|ó˙˙˙˙˙˙źçóů˙˙˙˙˙ü˙˙?ü˙çĎ˙˙˙˙ů“ćy˙ü˙??óüó˙ů˙˙ţ~˙˙ź˙˙˙˙˙ů˙˙˙?˙ó˙˙˙˙˙'˙ü˙˙˙˙˙ů˙ůţů˙??˙˙ţ˙óů˙ç˙˙˙˙“ů˙ś˙˙ů˙Ďü˙źţü˙˙˙ó˙™?˙˙“˙˙ü˙ü@Ď˙óů˙çź˙˙˙˙˙˙˙?9˙?Ď˙óó?˙˙ó˙˙˙ţ˙ç˙źç˙˙˙˙˙óĎ˙˙Ď>Lç˙?ü˙˙?ů˙˙ó˙93˙˙˙˙ů˙˙˙?˙ů˙ů˙˙˙üů˙çĎ˙˙ç˙<ó™ü˙ç˙źççůü˙?ţ˙˙˙˙˙˙˙˙˙˙˙˙˙ůź˙˙˙˙ü˙˙˙ç˙˙˙ţs˙˙˙˙ü˙źţs˙üó˙˙˙Ď˙ç˙˙ůůţ|˙?˙˙˙˙˙˙˙˙˙˙˙źůüóĎ˙ĎĎó˙˙˙˙ţů˙źź˙˙˙Ď˙˙˙˙ó˙˙˙Ď˙ţOţ˙˙ü˙źţ|ź˙˙źäĎ˙Ď˙˙˙˙˙ç˙ü˙˙˙˙˙źž˙9˙˙˙ç'˙˙ó˙?˙ó˙˙óźźź˙˙˙ĎĎ'çĎ˙˙˙ś˙˙˙ź˙˙ůž|˙˙ů˙˙˙˙?˙˙˙˙?ź?>~˙Ď?Ď˙˙ź˙Ď˙˙ů9˙Ě˙çç˙˙ţ~y˙˙˙?ü˙ň˙đ˙çźĎ˙˙ç˙˙˙˙˙ůź˙˙˙˙˙Ď˙˙˙˙ţä˙<˙˙˙Ďó˙˙˙ţ~ţg˙Ď˙˙ź˙˙˙˙ç˙˙˙˙˙ůç˙˙?Ď˙ţ˙˙晟˙?˙ů˙ź˙˙ó˙˙˙ůçů˙˙˙˙ź˙Ďţ˙˙˙˙ů˙˙˙˙?ůĎç˙˙ň~˙ä˙˙ůĎ˙˙?˙˙ţĎ˙™ůůüţ˙˙˙˙ź˙?˙˙˙˙źĎ˙?ţOů˙˙˙Ď˙˙˙ţ?˙Î˙<˙˙óĎ˙˙ç˙˙˙˙?źü˙ü˙˙˙ç˙?˙ç˙˙˙˙˙ç˙˙˙˙˙ç˙ç˙˙˙˙˙Ď˙˙˙˙˙ţs'ţsźü˙˙˙˙ó?˙˙˙˙˙˙˙??ç?˙ţOţ˙˙Ě“Ďçů˙óó˙ůĎ˙˙ţ˙˙˙˙˙˙˙˙˙ů˙˙˙üü˙?ä˙Éçů˙˙“˙˙$˙˙ůů˙˙ç?ç˙?˙ç˙˙ç˙üţ9˙˙˙ź˙˙˙ţţ~˙üTć˙řY!Ś9Ď??˙ó˙Ď˙˙™ü“ó˙ç˙˙ü™˙˙˙źź˙˙˙?ź˙ů˙˙óůç˙ţ˙˙˙ź˙˙˙ţOĎźţgóüĎ˙˙˙˙˙˙˙˙˙'˙˙ů˙˙˙˙˙˙˙˙˙˙ź˙˙˙˙˙üç˙˙ç˙˙ç?óĎĎţ~ů?˙˙9É˙ć˙˙˙˙'üó˙˙ţţ˙óĎ˙˙˙˙Ď˙˙ü˙˙˙˙˙˙˙ś˙˙Ď˙ü˙˙˙ç˙ü˙˙Ďůç˙?˙˙˙˙ź˙Ď˙ů˙ź˙˙Ď˙ů˙˙˙˙˙˙ů˙˙˙ů˙˙Ď˙ţ˙Ď˙˙˙ü˙˙˙˙˙ü˙üň˙˙ů˙ů˙˙Ěü˙˙ü˙˙˙˙Ě˙˙˙˙˙˙˙žs˙ţĎ˙üźÎg˙?˙˙˙˙˙˙˙˙?ç9źçÎ~g˙˙˙˙˙˙˙˙ü˙˙?˙˙˙˙?˙çźüóç˙9˙˙˙ž˙˙?˙˙˙ţĎ˙˙˙˙˙ů˙˙?Ďţsţó˙˙ü˙˙ţĎ˙˙ Ď9˙˙˙˙ó˙˙˙ůĚó˙˙˙˙˙ů˙˙ç˙˙˙ţź?˙˙˙Ď˙˙˙˙ó˙˙˙üź˙˙˙˙˙˙˙ňfüţ~˙ţ˙˙˙˙Ďóü˙˙ó˙˙Ď?˙˙˙ź˙źó˙˙?ç˙ó˙ü˙˙ś˙˙Ďç“?ĎĎ˙˙˙źç˙˙ü˙ź˙?˙˙˙ó?˙˙ů˙˙ó'ůů˙˙˙üóň~˙˙˙ůţ˙˙˙˙˙˙?˙Ď˙çó˙˙˙˙˙˙˙ç˙˙Ď˙üźó˙Ďţţ~y˙˙?˙˙Îó˙ç˙˙˙Ď˙˙˙Ďů˙˙˙ů˙Ďů˙ţů˙ó˙˙ç˙˙˙˙˙˙ç˙˙˙ç˙˙˙˙ň˙˙˙˙ç˙˙ç˙˙˙ś˙˙˙˙Ď˙çţ˙ţ˙˙˙˙˙Ď˙˙˙˙˙˙çůç˙˙ů˙ź˙çĎ˙??ůç˙çů˙?˙˙ç˙˙˙˙ó˙˙˙Ď˙ź˙˙Ď˙Ď˙˙ü˙˙˙˙ź˙?˙˙˙˙˙˙ň?ń�Cüç˙˙˙˙˙ó˙˙üĎ˙˙˙?™˙üůä˙Ď>˙Ďů˙ü˙ź˙ü˙˙Ď˙˙˙˙˙˙Ďţ˙˙˙˙ź˙ůü˙˙ź˙ü˙˙ü“˙˙˙˙˙˙˙˙Ě˙Ď˙ç˙ž˙˙˙˙˙?˙˙˙?˙˙˙˙˙˙˙óĎ˙˙˙ţ˙çů˙˙Ďç?˙ţ|ň|˙˙˙˙źĚ˙Éä˙˙˙Ď˙˙ź˙˙˙˙ů˙˙Ďü˙˙˙ţ˙óç˙˙˙˙˙˙ź˙źů˙ü˙˙˙ů˙˙ç˙Î|˙ů9˙˙˙?˙˙óĎç˙˙˙ů˙˙˙˙˙˙ţ˙ţ˙˙˙˙ü˙˙˙?Ď˙˙ó˙˙˙˙˙˙˙˙˙˙ó?˙óĎ˙˙ů˙˙˙ţ'˙˙˙?˙˙˙ç˙˙˙?˙˙ňźçźĎů˙'˙?˙˙Ď˙˙ţy˙˙˙ü˙??ţóÎççţ˙˙Ďóçü˙˙˙˙˙ĎćyĎ˙˙˙ó˙˙Ďóç˙?ĎÉ˙?˙˙˙˙˙˙9ó?˙˙Ăţ|˙˙>|˙üó˙˙˙˙ů??˙˙ó?˙ţ˙?ź˙?óźü˙ţ|Ď˙˙˙üçů˙üĎ˙çů˙ů˙˙Ďů˙?ç˙˙˙˙˙˙Î?Ě˙˙˙˙˙˙Ď˙˙?ţ|˙˙źů˙˙˙˙ů˙?ź˙Ď˙˙ü˙˙˙ţź˙˙˙˙˙˙˙˙˙ůţfţg?üůüĎňţ˙˙˙˙˙ó˙˙˙?Ďç˙Ď˙ź˙˙˙Ďü˙ů˙˙ź˙˙?ó˙Ď˙˙˙çĎ?˙?˙˙˙ó˙˙˙?˙˙˙˙ţź˙˙ůç?˙ç?˙ü˙˙ä˙˙9ţů˙˙˙˙ů˙˙˙˙˙ţ˙>ç˙˙“Ď˙ů˙˙˙ţ3˙˙ç˙˙'™ś˙˙ó˙˙ź˙˙˙˙˙˙˙śĎ˙ç˙ç˙˙˙˙˙˙˙?˙ţ˙˙˙˙ü˙ç˙˙˙ć?˙˙3˙˙˙˙Ď˙˙˙çóóüů˙?˙˙çĎ˙™˙˙˙˙ś˙ů˙˙ź˙ů˙??ţy˙É˙Ď˙ůů˙đŻÉ˙řY"…<˙˙˙˙ó˙çü˙ó?Ě˙˙ü˙˙˙žg?žů˙˙˙?˙˙˙óů˙˙ů˙Ďź˙ç˙˙??˙˙˙ó˙˙çóůó˙?˙˙˙˙˙˙˙?˙˙ź˙˙˙˙˙˙˙ţ˙ů˙ó˙˙˙ó˙˙ó˙üź˙9˙Ď˙˙˙˙Ď˙ź˙ü˙˙˙ó˙ó˙˙˙˙˙˙˙˙˙ţ˙˙ü˙˙˙˙˙óç˙˙˙?ţO˙ç˙˙˙˙˙˙˙ü˙ś™˙˙˙˙?˙˙˙˙Éź?ç?˙ů˙ü˙ź˙˙˙˙ź˙óţç˙ů˙˙˙˙˙ů˙˙ü˙˙>˙˙˙˙˙ţ˙?˙˙Ď˙9ó˙˙Ď˙ţ˙“˙ů˙śź˙˙˙˙˙˙˙Ď??˙˙˙˙˙˙?Ď˙˙˙˙źó3çź˙Ď˙?Ěü˙źţ˙˙?˙źó˙ü˙˙ů˙˙˙˙˙˙˙˙ó˙˙˙çü˙˙˙˙˙?˙Î˙ţţ˙ü˙˙˙˙ç˙˙˙óź˙˙?˙˙ţs˙Ďđó˙˙˙˙˙˙˙Ďź˙“ž˙˙ź˙ź˙˙?ůźů˙ůüů˙˙Ď˙?˙˙˙Ď'˙źüů˙˙“ź˙˙çţ|˙óĎĎç˙ç˙źź˙źó˙˙˙˙˙ţ˙˙˙˙çĎó˙ó˙˙óó“˙˙ţs˙˙ž˙˙˙śĚ˙˙˙˙ź˙˙˙˙ţg˙˙˙Ď˙˙˙˙˙ç˙˙ţ˙ç˙ţgĚ˙˙3çç˙˙˙˙ů™˙Ď˙üç˙˙˙˙üĎü˙˙˙ůĎůţ|ůĎź˙˙śĎ˙˙Ďźü˙˙˙ůţ˙˙ÎĎ˙üó˙˙ţ~˙ü˙˙'ś˙˙˙˙˙ź˙?˙ć˙˙ü˙ůů3˙ó?ś˙˙˙źç˙˙ó˙ţ?˙ž“˙˙ó˙ćg˙ó?ůç˙˙źůóçůů˙˙˙óóü˙˙˙ź<˙˙˙˙ţ~O˙Ď˙˙˙ů˙˙ňç˙˙˙˙˙ň˙ü˙ź˙óó˙Ď˙ů˙˙ó˙˙ţź˙Ď˙˙˙çç˙?˙˙??˙ţ|ä˙˙?ůĎ˙ń�B˙˙ţţg˙˙˙ó˙ůţ˙˙˙˙üç˙˙ç˙˙˙źü˙ţ˙?˙˙ź˙˙˙ź˙˙óţů?˙˙˙óç˙'˙˙˙˙ţ˙ţg˙˙˙ź˙˙çţ˙?™?˙źź˙ů˙ţ?ůĎ˙˙ţ~g˙óů˙˙˙˙ž˙óç˙?ä˙ţ?óź˙ó˙?˙ç3ţgĎĎ˙˙˙Ě˙üó˙˙óţů˙˙˙ů˙ů˙ä˙˙ç˙Ď˙Ď˙Ď˙˙˙źź˙?˙3˙˙˙ź˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ü˙˙ç˙˙˙˙˙??˙˙źĎ˙ü˙˙˙˙˙Ď˙“˙ţ˙˙˙ţ˙˙ů˙ó˙˙üó˙Ď˙˙ů˙˙˙˙˙˙üóź˙˙Ďźó˙?Ďů˙˙?óţ˙˙çç˙˙˙˙ţţç˙ţsĎ˙˙˙˙Ď˙˙˙ź˙˙Ď˙˙˙Ď?˙˙˙˙˙˙ó˙˙˙ţó?˙ź˙ĎĎ˙?˙˙˙˙?ţ˙˙˙Ď˙źüů˙˙˙ü˙˙??˙?˙üůç˙“˙ź˙˙˙?˙?ç˙çó˙˙˙ü˙Ď˙˙˙˙˙?˙ç˙ó˙Ď?˙˙?˙óůţ˙˙ů˙˙˙˙ó˙ç˙ţ˙˙˙˙˙?˙?˙˙˙˙˙˙˙˙˙˙˙ç˙ç˙óź?˙ůźůůó˙˙˙˙˙˙˙˙˙˙˙ü˙Ďů˙˙ů˙˙˙˙˙˙˙ĎĎźçó˙ůĚ˙˙?ç˙˙˙˙śĎ˙˙˙˙ţ˙˙˙˙ţĎ˙ó˙ţ˙ţ|Éźź˙˙˙Ěů˙óĎ˙˙˙ü˙?˙˙˙ü˙ţü˙˙˙ů˙˙?ů˙˙˙çź˙˙˙˙˙˙Ď˙˙˙ů˙˙<˙˙˙ççĎ˙˙˙˙˙Ď˙˙˙óţĎ˙˙˙˙˙˙˙˙˙˙˙?ź˙˙˙ź˙˙˙˙˙ç˙Ď˙óüç˙Ďó˙ü˙˙çţy˙˙˙üţ˙˙˙˙˙óäó?˙ź˙˙˙ůůÉ˙˙˙˙˙ç˙ó“˙˙˙˙ó˙˙˙óţđ˙řy¨#ż��jŞŞŞŞŞŞŞŞĄUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞŞ•UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUP€T•UU*ş©UUUtŞŞŞŞŞŞ«ŞőTŞşŞ«ŞŞ©UWŇŞ®ŞŞŞŞĄUU]UU×URUUU]UU]Rꪪ•uŇŞŞŞ©WUUUUU]UUUUWUUUUUUwUUt’ŞĄUUjŞş«ŞŞŞ«ŞŞŞŞŞŞ©UUŐUUt•UUrŞŇŞĄuUUUUŐUUURŞş•UUUTŞŞŞŞŞŞę•]UU\©uUĘľŞ®Ş­UWĘŞŞ•UUUUrŞŞŻŞŞŞęŞŞŞŞUU]ŐU)URŞ®RŞŞŞŞUUUUU%UTŞŞ«Ş®•UŐUUŐUUWUUUUU*ŞŞ©.ŞŞUUUUVŞî޵UŐU]Uj©UUUU]U*Şş•UU*ŞŞşéU©W*ŞĄuUU]URŞĄUW]UTŞŞUUUJąUU]jŞŞŞŞĄU*®•U.ꪪUU]UUUUP¶��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/sinewave.flac��������������������������������������������������������������0000664�0000000�0000000�00000176067�14447736377�0017631�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������fLaC���"���°� ÄBđ�cŚĎăŮںޫ,ż,˘5'Kv„��( ���reference libFLAC 1.3.1 20141125����˙řÉ�#��¬ Qě�C ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂ`���k˙řɨŠĽéŔŮĹ Ét�W#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev ÂzŃ×LC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev ÂzŃ×LC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á����!˙řɨĄďĄŤĄ…ĄŮ�O/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&bĽ Á !„Ô´µ$`†0‘‘5„dŚ'Jµ‘ŇŘ›dÓHbuädÓ‰ë“V™LF„!„eI„0ĽM$`Ť)dÄaś#-dâ19215ę19”1}uČÄe°†Ë—Â2©e‘„ËRĄ•Ę\!„b2­\FF`Ä2ů<CTČÉ‘¬A‘ ˛!ÁL&ÁÄɉ•a.I„hŚ`†&'+TÄbG.b55×iÄÓ]LC$ĺÉ‰á “‹•*H™Db´˛b12â18šÓÄbŚšďbüŤ!„2éańLµeËDâɉĄDaydÂ’ńšŐtCÄ1;&ĹŚa/µë˛C0CJ0C&ĹËDdC “ʡXCKL!•“Ä쌣Á“®¦´ÓĐ‚A„b2Śʱ9-KJÄbFEâiYYF&˝LOIâ4Ň2t†-«ČáK0›hŚąL©^•Â\Ą“ŃxCÂ4¶&­1=!Š1 NŹÉÂ<¶L†2­2™\‘„ĺ)‚I4#‚ 0Ł 1'`†Y8ŚNM\ŚF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘi4ËŚ_rvFC ŃF“S)Ń<#Q 0Ś'%b0Ś\–“-R0G„1¶Q‚˛zÓ«¦®äeäňjĺËLM&Y1C LZ–\#%ĹËÂrÉÄ⦆'–dŽ!‰äjń/bk\ąkI•“ÁË0F&V#+.#‰¦aYЎ‚1Ź/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&bĽ Á !„Ô´µ$`†0‘‘5„dŚ'Jµ‘ŇŘ›dÓHbuädÓ‰ë“V™LF„!„eI„0ĽM$`Ť)dÄaś#-dâ19215ę19”1}uČÄe°†Ë—Â2©e‘„ËRĄ•Ę\!„b2­\FF`Ä2ů<CTČÉ‘¬A‘ ˛!ÁL&ÁÄɉ•a.I„hŚ`†&'+TÄbG.b55×iÄÓ]LC$ĺÉ‰á “‹•*H™Db´˛b12â18šÓÄbŚšďbüŤ!„2éańLµeËDâɉĄDaydÂ’ńšŐtCÄ1;&ĹŚa/µë˛C0CJ0C&ĹËDdC “ʡXCKL!•“Ä쌣Á“®¦´ÓĐ‚A„b2Śʱ9-KJÄbFEâiYYF&˝LOIâ4Ň2t†-«ČáK0›hŚąL©^•Â\Ą“ŃxCÂ4¶&­1=!Š1 NŹÉÂ<¶L†2­2™\‘„ĺ)‚I4#‚ 0Ł 1'`†Y8ŚNM\ŚF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘh���`˙řɨ„HĘ-ĹąÁ€˝…ąÍµ}B„#h€ ’Ś•›'$™$ä! $!$!$$’Ba ’I$žI?›Ýšýfłrl’Iá ČI$„’„’HNžI?śß5ßY«°Ůů>I&HI$’BHL’BHL’’I˙ťrkVVWRi2ä™ !BII $$™É2tžł^ł_˙>dś’äá „„’Ba $É!$äň¤ćő’ŠMę’¤ňrII$„™! !$„’B„ś‡™˛MMfëúÉY7?$á ’B$„$’’I $™&C““ď’ł^żY5ňvHiNIC„’I$! $’d’l’|ý^ż«›äłd’L’HI$„’aII! ’L’y&ěÉŻ¬ŐĘľňy9p’Bd„’B!$!ÂI “$ňnMgÓŞů«&ţO$ä„ä!$’’II$’IrY$ź'o×®ľ¬ź“É'’I2HB$„!8@™!NL„;'ł^˛U˙YfĎ&I’I’BI$„ÉBd!2I&I9 Y?źłS®_6O““&HI ÉI$’™$„É&BY'ÜšÉ_Ę;%YłžI3HI$’I$ N’É$!2dśźü•šôg¬ýg>L“$“„!$’’HBp’™ ÂO“šMfőÎŻ˙dů9&I! $’I $!&I $’NCdɬŐňUzďë’lžHNB’BB™BI2śś›?šĘ×_ŐĎü‡„É$™ $!9BBI!ČL„ҤŇnýe~ůë$äç&Bd! $!2’I$’’NLźÎ˙ÖkŻćÍ’Iää&I! !! „„’L!2ź'%gÖł_ÝIňi$’HNś’B!$$„2ČBOÉůłk˝u%+6NI2IČBHBHBHI$„Â$’I<’7»5úÍfäŮ$“Â’I! $! $ś!<’9ľkľłWałň|’L’I$„™$„$™$'$“˙:äÖ¬¬®ţ¤Ňd!É!2B„$’’HI3’dé=f˝fżţ|É9$!ÉÂ! ! $„ÂI’BIÉä%IÍë%š?Ő%Iää’’I 2BBI !$„9 93dššÍ×ő’˛n~IÂ$„&II$!$’I2L‡''ß%f˝~˛käěŇś’‡! $$’HBI$É$Ů$ůú˝W7ÉfÉ$™$’I! $Â$’’B$™$ňMŮ“_Y«•}äňrá$„É $„&BHC„$’&IäܚϧUóVMüžIÉ ČBI$!$’’I$’ä˛I>N߯]}Y?'’O$’d$„&IBp2Bś™vOf˝d«ţ˛ÍžL“$“$„’I ’„ČBd’L’r˛?f§\ľlź'&L’’’I$!2I ’L„˛Oą5’ż”vJłg<’f’I$’H@ś!$!’HBdÉ9?ů+5čĎYúÎ|™&I'BI$!$„á$!2„ź'4šÍëť_ţÉňrL’BI$’HBL’I$ś†É“Y«äŞőß×$Ů<ś„'$„$„!2„’d!9!965•®ż«źů ’I!2HBr„$„$’C™ ¤1I¤Ŕ���*Ź˙řÉ?NĎ 7’�çű;ő”ď÷ękµnŃWS„"ť~ůÎÝ‚7˙ďÝýVĎŃJŇŞ’D’D$D")„‰‘„˘IH‰J×+ýU{|¶˙ëî·n’—)H´HA$QDHDB!Q"*J¤’Tô«öţźşwżŇë_iJI(„D‘DB"DDB"HJH„D—$•Şş_˙_ż}Mßýô¬ąhŞD% ‘ „DDD$‘"DIR"*ţRőßk{çý7űĺ[’R´I$D‘„I„I„DHBRD""ĺ%*´©ďą=ş›n»:ď]r¤˘$’DD"$’„""!$„$R"I)ID©żUşsvćîżµÉ.QZ$I!„˘! ˘$!E"K”S˝/ďÚž}Ďźuý)DĄDD˘"˘(‰"E""D‘)ń$§ďĄ›©›uŮż—«ş©V‰"Q„D‘ DJH„˘ITJ®ťs˙ďßÓÜżĺT–¤IQHDDH’H’,”‰Kć’[uýűÖ÷«lęUľJ´%Z"„‰! !$„ItDUJ]ÓŢ«Űű›ú®Ý$ĄJI E¤D ‰$DDDD‘+‰ţŇJßďúŰëĎ»zë•RJŃ"*$BD"HDB$‰$I$—h©úş©™ţ«ÍŇ›˙•\”‘ VB"$H„B!ID"‰Q*¤•ďŐĎ®üţŰ}Sí]ET‘%$…•! ‰$!$„!(„®‘uĄő[?×oŢ˝ÚJ•$’‘I„"B$D‰"TEZRë«·|űm÷ľsĺ]+¤¤˘$IH„A$$DBH‘ "‰HD—ÜJnKnµ{7őł®őwĘEËBHIII"‘„E$DIH¤Rµ%Ţľ¦ŰSŰ«÷˝uő’˘ID"%‰!„’ ‰"‰)KV—uţmę¶Űţď+䥪´DI""""‘$"!$HJ$ŠŇDŻ˘ÜűŻ?ď}ëćŢ’ľW DJ‰I„IBB$‘„¤DIW*\»î|íý^Ďëîµ*ä¤RI "D%"!" !"H‘$E$•ÉTŻţż˙~ďę¶~ŠV•T’$’!"!H„$HDD%JDJVą_ę«Űĺ·˙_u»t”ąJDE˘B """DB"’‰RU$’§Ą_·ôýÓ˝ţ—ZűJRID"$’"""‰BRD"$ą$­UŇ˙úýűęn˙ďĄeËETB!(H„H„D"""!$‰"J‘Wň—®ű[ß?éżß*Ü’•¤BI"$„"HD"H„""B’!))UĄO}ÉíÔŰuŮ×zë”E%$’"!$„! $!"‘IJJ%Mú«ýÓ›·7uý®Ir’Ń"ID%H„DE!’(‰\˘ťé~Ôóî|űŻéKř’%*"%…DHA)Š$‰H݉%?},ÝLŰ®Íü˝]ŐH’´H‰„"$H’"RD%J˘Utëź˙~ţžĺ˙*¤µ"J”BB$DB"DDDD’DD‘d¤J_4’ŰŻďŢ·˝[gR­ňUˇ*Ń”$D„DH‘H‰‘$"K˘"ŞRëţžő^ßÜßŐvé%*RHR(DE"!I""""$‰\H—ö’V˙Öß^}Ű×\Ş’V‰Q"B!B"$DH‰"H©$»EOŐŐLĎő^n”ßüŞä¤J˛"D$D„B’HB!J‘U$Ż~®}wçöŰęźję*¤‰)$(„©AI! $!©DD%t‹­/«úŮţ»~őëţŇT©$”¤DBH„ ‘‘"$I’˘*Ň—]]»çŰo˝óź*é]%%"JD" !""’DDDIJB$ľâSr[u«Ůż­ťw«ľR.ZBH˘HBH!”„")""JE"•©.őő6ÚžÝ_˝ëݍ¤•J!(„ID$‘DH‘DH���c(˙řɨ–BM»J¬µ?ć�–iCÉ™$É$0’a… 0Ă“&g9™O)ôĺ4–rť%9É8a$É“ ’I!’a’dĂ2g™§/ĺýÍ<ˇÎe$“ ’I!†I0†I‡&dćJiˇRÓ§ĺĎ'9™É0É’I$ÂHd&I!’†f|?ĘrĘyr’śó33$É2L2L‡ 0’I áÉś”—/Ň”–yO<ó33$ɇ É0ČdĂ$’JI32™rů˛éú\ĺ<™™2rLÉ$ÂL$0… „Ă™9ś”ň…)úR˙)ü¤ˇ™2PÉ0™!$’C$’C&2LćSžR—/ćśçĄ'“&$Ă&C„Ă&I†I†fL™śćRR”čRž—ϙ̡„Čd2aL’a’I†I“'ÉB™f”é§ĘYg3™Ă& & $’Ha„’d2IÉ™)ÂÉM>ËŇ“¦“śáć’L8C!„’d’I„’aĚĘP‰)ýý:)fxs% É’L$I&a†L’LĂ(rPĄ)ç>R…•<§)<™rdˇ!&C$“ I&d“™ˇJ|ĄÓĘ)LÓ3&dĚĚ’d2C!’I$’’‡3ś”ţĺ˙Ý<ҙɓ†aC&$„ÂI0Ě$ÆaCB™IN™KÓ|§(S)9Éa2L$„’I$É $“L™’‡2˙ĺ—,ů™śÎfa3 2I&&C ’a… ™>gÓrź–v‡9)™É8dĂ$ d“&I†P䡔ĎÎRť>žź9”9’’fC a$’BI$ĂC Ě”úźK*J}™L’“&N 8a$†$“ ‡!I‡3“ĺźJ_ôÓK)ĘLÉ™2 2I„Ă0Âd3 ’sžSňź4ĘRË,҇“2I’Ha$Ă a†3&LÎs2žSéĘi,ĺ:Js’pÂI“&$’C$0Ă$ɆdĎ3N_ËűšyCśĘ2I&$’C $’a… “LÉĚ”ÓBĄ§OËžNs3’a“$0’I„ČL’C$3 Ěř”ĺ”ňĺ%9ćffI’dd™a$’!Ă“9)._Ą),ňžyćffI“!’aɆI$”’fe2ĺóeÓôąĘy32dä™!’I„Ha  ‡2s9)ĺ SôĄţSůIC2dˇ’a2BI$†I$†L&d™Ě§<Ą._Í9ĎJO&L8I†L‡ †L$“ “ Ě™39̤Ą)ĐĄ=/ź3™C Čd0Ă0™$Ă$“ “&O’…2Í)ÓO”˛Îg3†L2L&I$Ă $Čd““2S…’š}—Ą'M'9ĂĚ3!$p†C $É$“ $Ă™”ˇSűút"RĚđćJ“$I0’L$Ă ™$™†PäˇJSÎ|Ą *yNRy30äÉBBL†I&!0’LÉ'3B”ůK§”ţR™¦fLÉ™™$Čd†C$’I$3%g9)ýË˙şyĄ3“' †L2I „’aI‡ †…2’ť2—¦ůNP¦Rs“0ÂdI $’I!’I&™3%e˙Ë.Yó39śĚÂfd’L2L$†$Ă 2|Ϧĺ?,írS3’pɆI„20É&L“ 0ˇÉC)źś ���n‘˙řɨźVŚX Y.Yů�I„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ €���KŽ˙řɨ&u+0f5�X#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev ÂzŃ×LC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev ÂzŃ×LC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×����óč˙řÉLÝâaçĚíOňĺř‡ţ2µ &D°ŠrčŮ8Z!Js-úÄşDŻÖ&C˛L’d$…!P’! Č–H„¦H†KJx—^Eęa}Âś$ 9„„Ě!HL„!aŔČP’‡Źą«sŁIQ‰’çÂCČ!!$„„$„„„&CLŕDČt¤ďn·¶DŚĘ¦rCł@ä 2BB™!$$”’8RR“-W6*ćÜń¤ĘI$¦“$@É! !$0$2`dĂ܄і<Ş:VZĎžBK0$$™!$ $†„$$“&ÉćĘGk:2‘Ň霦C$ž†B@ÉBII$$…$žĽšľĄÄ«šŞeXM’CĚ!RBBHB0™ a s!´™Vž1ínâXRˇĚ>”$!†@$’HÉ!IJrJpŞ”‘¸ŇÔ‰R˛–f[ “ ! HI$Hd  &I śĚôő)¬JŮE§ŤfI)É$$!ś„ I!$“ 䓞36.j÷ÇĄ”Ó8P™„„“0„$$!! BHI $É“ °ĺ—¶­iEů÷$™†L2B!@„ ! $’BL„™%¤îÔ¦6‹úYML“>L’BHHI!0!$’0„›2ZOŘ´Ú¶ż×'ů &Ŕ’I!BĂHI e™ëŠ3,UĄ9iü’LÉ! ’ `a !’„&dĺňí-µµs˘¦hSL) 2@’HI!$ HL“'É6‡T÷¨ćUwlÂŮĂBBI„„ ’„$BBa$ĚÉžđôŚ}c9ZI fL2B`a $ ! dŔ„!’BL’…9n'Ö:R±Re2P’†Ca $$ &!‡ ĚYł‘ŻkU€T\’ď ˛Ě!Bf’„0„’B™$†JP“ô)ľ˝\‰dbfĺá“0’d 2$ČBBHd$%0„ćśË~±.‘+ő‰ě“$™ !HB”$C2†@„%’!)’!’Ňž%בG:_p§ Na!3B$!Bd02$‡áăîjÜčŇTbd$ąđňHHI!! !!$! Ŕ“82);Ű­í‘#2©śěŔ$9 BL„&HI$ %$„Δ¤ËUÍŠą·<i2’I$)„$É2HBH`I $ 0÷!4eŹ*އ–łç’Ě &HI !! $$$ɇ2y‡˛‘ÚÎŚ¤tşg)É'!2B’BI !@É'†/&Ż©q*檙Vd„óB„„„’„ &BHBśČm&U§Ś{[¸–¨s„$% a„$ $’„$2HRBś’ś*Ą$n4µ"T¬Ą™–ÂBdÂHHI@ÂI’BBg3==Jk¶QiăCŮ’Jd$2I g!HI0„$ÂBy$çŚÍ‹š˝ńée4Î&a!$Ě! HH†C $2dĂl9eÄ­«ZQ~}É&a“ „ Hf!HBBI$“!&Ii;µ)Ť˘ţ–SS$Ď„“$’HL$ HI$$„†L!&Ě–“ö-6­ŻőÉţBI„0$’HB„0ÂBC„‡™f_úâŚËiNZ$“2HBd„ÂBBBCd¤! ™9|»Kmm\詚ć C $’HBÉ0$ÉňMˇŐ=ę9•]Ű0¶d0Đ’a!d$$! &I32gĽ=#GŘÇNV’B™“ „BC ���Ş€˙řɨ ˛ŞŞ¬ąŻ±Ď�B ®âľS)–©‚ &L“BLF„eDaŁ ŃjČÉx†Q„4ž!“]Ča FŻHbé•ɉá b[pšVHÂ輱/DeidbššĽŤ&ĹŤ^»_Şa)Ä0C0#Â2ËYT¨ş0ŚSQ&¦Ë^NFÔÄu1 ™ !–ÄőČÂ0áa &ĄĄ©#0A„ډ¨Ś#$a:U¬ŚF–ÄŘC&šCŻ#&śO\š´Ęb4 Á #*L!…âi#iK&#Äák'‰É‘ÉŻQ‰Ěˇ‹ë®F#-„4F\¸¶•K,Ś&Z•,¬FRá #•jâ20ž!—Éâ¦FLŤb eÁ0ša6Ö&LL«ŃrL#D`119Z¦#Â9s©®»L†&šęb'.LOdŚ\©RFĘ#Ą“‰—‰ÄÖŽ#Äd×xäi !—LC0GĘe«.Z'LM*# Ë&ČŚ—ÄÖ«˘¶!‰Ů6,`1}Ż]ÂA‚Q‚0†.Z#$ÂLFUʸšZa ¬ž'de† tťu5¦†„  #”`†U‰ÉjZV#2/JĘČÂ14ĹębzO¦‘“¤1m^G2Y„ŘCDeĘeHÂô¬FÂĺ,F‹Â¦¤Ĺ±5i‰é QbtÄx†L†ĺ˛d0A•i”ĘäŚ')LĘIˇŚ`A…Q‰8C2ÉÄbrjäb521i0AŇ2jeë\ąk# É#JÄŃNÄš#Ë(Âq8šâFą9lG&»FZC“LĽŚµË•“DŇbĺ+*U´MD0 Ĺ2F#hA‹­22őň1 FŻb a;Ń<FS+/„đA†Qr’1I–^WY]0ž´b5ÓËeN‘–ŚFak–!‹U„ŇbFQ˛0¶‰Ą15‘ÄěšdÓ#/Ë2C“«F&ś!˘xŤÂ8˛1j˘b0¶$ŇLL˛e“QŚMdey8†HbhÄć!”eä1:´aĺ¦!‚ŚZbčĽS$Â2ĄĹ­Á”ÄÖNSI¦\bű“˛2LÁâ4š™LF‰á`A„a9+„bä´™j‘‚<!ŲŚ0ť“Öť]5w#/'“W.Zbi2ÉÂZbÔ˛á..X†–N'Ĺ4Ä1<ł$q O#W1|CZĺËZL¬ĽF0FXA‚12±ąYqśM0âĚPĹ 0AÄy| ®âľS)–©‚ &L“BLF„eDaŁ ŃjČÉx†Q„4ž!“]Ča FŻHbé•ɉá b[pšVHÂ輱/DeidbššĽŤ&ĹŤ^»_Şa)Ä0C0#Â2ËYT¨ş0ŚSQ&¦Ë^NFÔÄu1 ™ !–ÄőČÂ0áa &ĄĄ©#0A„ډ¨Ś#$a:U¬ŚF–ÄŘC&šCŻ#&śO\š´Ęb4 Á #*L!…âi#iK&#Äák'‰É‘ÉŻQ‰Ěˇ‹ë®F#-„4F\¸¶•K,Ś&Z•,¬FRá #•jâ20ž!—Éâ¦FLŤb eÁ0ša6Ö&LL«ŃrL#D`119Z¦#Â9s©®»L†&šęb'.LOdŚ\©RFĘ#Ą“‰—‰ÄÖŽ#Äd×xäi !—LC0GĘe«.Z'LM*# Ë&ČŚ—ÄÖ«˘¶!‰Ů6,`1}Ż]ÂA‚Q‚0†.Z#$ÂLFUʸšZa ¬ž'de† tťu5¦†„  #”`†U‰ÉjZV#2/JĘČÂ14ĹębzO¦‘“¤1m^G2Y„ŘCDeĘeHÂô¬FÂĺ,F‹Â¦¤Ĺ±5i‰é QbtÄx†L†ĺ˛d0A•i”ĘäŚ')LĘIˇŚ`A…Q‰8C2ÉÄbrjäb521i0AŇ2jeë\ąk# É#JÄŃNÄš#Ë(Âq8šâFą9lG&»FZC“LĽŚµË•“DŇbĺ+*U´MD0 Ĺ2F#hA‹­22őň1 FŻb a;Ń<FS+/„đA†Qr’1I–^WY]0ž´b5ÓËeN‘–ŚFak–!‹U„ŇbFQ˛0¶‰Ą15‘ÄěšdÓ#/Ë2C“«F&ś!˘xŤÂ8˛1j˘b0¶$ŇLL˛e“QŚMdey8†HbhÄć!”eä1:´aĺ¦!‚ŚZbčĽS$Â2ĄĹ­Á”ÄÖNSI¦\���¸‡˙řɨ »°\­Ň«›©ą�nNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev ÂzŃ×LC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\M`��� =˙řɨ ĽLękäôßÚ]ŐHĐ^ËŁµPŻúß’á&ß‚"DD‰"$•R¤ąNľţ˙űÝ˙}ÔąT¤¤J$‘$DDDH„I"$D˘ZV•Uý:nűöé÷őőr¤VJI"H‰"""""""D¤¤’Şş®żľ÷˙ăÖë××U$RREDD„‰„$DI’"RII**Ş»˙˙˙·NţőňéR’I"D’DHI‘$JIIURŻ˙Ż˙ű˙îţşş©$’I"$‰""DH€$’ČrsďÖµUVŠ®í/ÎLÉ$„!HHB„ B†’C &šk+VŤŠ˘î:éË&BI!$!$!!B„!HHBHI!’Lý鋊ŐŐUJš=ÔŞT’I„I‰‘$B$’%ĄU]]}˙˝ßÍßßWT©(’D˘DD‘!""$D‰I%RŞ]_OçĎżß÷÷W.ŠÉQD’$D"DHDD‰’$D‰A$“˛÷UkU±Ĺoľrs$$’„„! B„ B’BHL„ÂsUŤV´Fş«ä’L†HH!BB BBBI$†I“úâăEµ¤]ţr*I$H‘$DB""HIH’R”Ş®«Ż÷[÷˙ßwŞJÉH’I"DDDDDBD‰I%J•U]Ý÷÷˙żŻď—*Ş’H¤‘"$DDH„HH’*$˘µ- »mj˘Ĺ«]wćL’HI$!$!!!!$„d™ýĆÇUUZµŮňpBI„„!B!!@„„ !HI$„ÉÎzŃŐTUU‹­Sť3&BI DDDBDD„$DH‰”’•*—Żżż·Űżľť^®KI(’"HI $‰"DŠ’’ŞŐ}ý÷˙˙÷˙UR©)‘"HI„‰!D‘J’T®®®ń˙ß˙˙˙UőUJI(‰D‰H‘""D’$’’’Z§]üű˙˙ß}ŐĄQ)"I‘ "DHBDD„H‘$D’ŞT—)×ßß˙{żďş—*””‰D’"D‘„‘’"DH‰D´­*«útÝ÷íÓďëęĺH¬”’D‘DDD""$DD""DD‰II%Uu]}ď˙úÝzúꤊJH˘H‘"„‰"DJI)%EUW˙˙ö.ťýëĺŇĄ$’D‰$‰‘’""$"H”’’ŞĄ_˙_˙÷˙ÝýuuRI$’DIDD‘!IH©*U]U÷ß˙ýżúëµŐJ’”’H‘"""""D@BI $ri¬­Z4Z*‹¸ë§,™ $„„„„ HB„ !! !$†I3÷¦.+WUU*kyç$’Bd$„!!BBH@„’Ba9ýîµTQ««Q«ŞT”I"Q""DH‰‰‘"D‰$’©U.ݧóçßďűű«—Ed¨Š"I""$D""DD„I"D©$•ręë˙ľ˙ąÓűŞę•%JH’H‘""$DDDB"$‘$J@ ÍýV5ZŃę­˙’I2BB! @„! HBI $’&O닍VÖ"‘wůÉ’I BB!„$„!BI &f~űŞŽŠŠ«[j§&9)I"""$HH‘""I"D©RŞ«»ľţ˙÷őýňĺURI’"$D‰‰ ED”VĄĄuÝßľ}ýőőŐJJI$I$D‘!!""D‰ "J)%*†®ťÎżÝß˙}rŞJ‰DI)"""""""D$‰$‘)*TŞűu˙ď˙ůő÷ę•jRR$‘$DDDBDD„$DH‰”’•*—Żżż·Űżľť^®KI(’"����U„˙řÉ 2Ş-Ţ(ä#Ŕ�D0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„���~N˙řɨ ®YšX WMU˘�aXCKL!•“Ä쌣Á“®¦´ÓĐ‚A„b2Śʱ9-KJÄbFEâiYYF&˝LOIâ4Ň2t†-«ČáK0›hŚąL©^•Â\Ą“ŃxCÂ4¶&­1=!Š1 NŹÉÂ<¶L†2­2™\‘„ĺ)‚I4#‚ 0Ł 1'`†Y8ŚNM\ŚF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘi4ËŚ_rvFC ŃF“S)Ń<#Q 0Ś'%b0Ś\–“-R0G„1¶Q‚˛zÓ«¦®äeäňjĺËLM&Y1C LZ–\#%ĹËÂrÉÄ⦆'–dŽ!‰äjń/bk\ąkI•“ÁË0F&V#+.#‰¦aYЎ‚1Ź/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&bĽ Á !„Ô´µ$`†0‘‘5„dŚ'Jµ‘ŇŘ›dÓHbuädÓ‰ë“V™LF„!„eI„0ĽM$`Ť)dÄaś#-dâ19215ę19”1}uČÄe°†Ë—Â2©e‘„ËRĄ•Ę\!„b2­\FF`Ä2ů<CTČÉ‘¬A‘ ˛!ÁL&ÁÄɉ•a.I„hŚ`†&'+TÄbG.b55×iÄÓ]LC$ĺÉ‰á “‹•*H™Db´˛b12â18šÓÄbŚšďbüŤ!„2éańLµeËDâɉĄDaydÂ’ńšŐtCÄ1;&ĹŚa/µë˛C0CJ0C&ĹËDdC “ʡXCKL!•“Ä쌣Á“®¦´ÓĐ‚A„b2Śʱ9-KJÄbFEâiYYF&˝LOIâ4Ň2t†-«ČáK0›hŚąL©^•Â\Ą“ŃxCÂ4¶&­1=!Š1 NŹÉÂ<¶L†2­2™\‘„ĺ)‚I4#‚ 0Ł 1'`†Y8ŚNM\ŚF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘi4ËŚ_rvFC ŃF“S)Ń<#Q 0Ś'%b0Ś\–“-R0G„1¶Q‚˛zÓ«¦®äeäňjĺËLM&Y1C LZ–\#%ĹËÂrÉÄ⦆'–dŽ!‰äjń/bk\ąkI•“ÁË0F&V#+.#‰¦aYЎ‚1Ź/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&bĽ Á !„Ô´µ$`†0‘‘5„dŚ'Jµ‘ŇŘ›dÓHbuädÓ‰ë“V™LF„!„eI„0ĽM$`Ť)dÄaś#-dâ19215ę19”1}uČÄe°†Ë—Â2©e‘„ËRĄ•Ę\!„b2­\FF`Ä2ů<CTČÉ‘¬A‘ ˛!ÁL&Á���9Í˙řɨ§E ILOO5�I‰•a.I„hŚ`†&'+TÄbG.b55×iÄÓ]LC$ĺÉ‰á “‹•*H™Db´˛b12â18šÓÄbŚšďbüŤ!„2éańLµeËDâɉĄDaydÂ’ńšŐtCÄ1;&ĹŚa/µë˛C0CJ0C&ĹËDdC “ʡXCKL!•“Ä쌣Á“®¦´ÓĐ‚A„b2Śʱ9-KJÄbFEâiYYF&˝LOIâ4Ň2t†-«ČáK0›hŚąL©^•Â\Ą“ŃxCÂ4¶&­1=!Š1 NŹÉÂ<¶L†2­2™\‘„ĺ)‚I4#‚ 0Ł 1'`†Y8ŚNM\ŚF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘi4ËŚ_rvFC ŃF“S)Ń<#Q 0Ś'%b0Ś\–“-R0G„1¶Q‚˛zÓ«¦®äeäňjĺËLM&Y1C LZ–\#%ĹËÂrÉÄ⦆'–dŽ!‰äjń/bk\ąkI•“ÁË0F&V#+.#‰¦aYЎ‚1Ź/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&bĽ Á !„Ô´µ$`†0‘‘5„dŚ'Jµ‘ŇŘ›dÓHbuädÓ‰ë“V™LF„!„eI„0ĽM$`Ť)dÄaś#-dâ19215ę19”1}uČÄe°†Ë—Â2©e‘„ËRĄ•Ę\!„b2­\FF`Ä2ů<CTČÉ‘¬A‘ ˛!ÁL&ÁÄɉ•a.I„hŚ`†&'+TÄbG.b55×iÄÓ]LC$ĺÉ‰á “‹•*H™Db´˛b12â18šÓÄbŚšďbüŤ!„2éańLµeËDâɉĄDaydÂ’ńšŐtCÄ1;&ĹŚa/µë˛C0CJ0C&ĹËDdC “ʡXCKL!•“Ä쌣Á“®¦´ÓĐ‚A„b2Śʱ9-KJÄbFEâiYYF&˝LOIâ4Ň2t†-«ČáK0›hŚąL©^•Â\Ą“ŃxCÂ4¶&­1=!Š1 NŹÉÂ<¶L†2­2™\‘„ĺ)‚I4#‚ 0Ł 1'`†Y8ŚNM\ŚF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘi4ËŚ_rvFC ŃF“S)Ń<#Q 0Ś'%b0Ś\–“-R0G„1¶Q‚˛zÓ«¦®äeäňjĺËLM&Y1C LZ–\#%ĹËÂrÉÄ⦆'–dŽ!‰äjń/bk\ąkI•“ÁË0F&V#+.#‰¦aYЎ‚1Ź/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&���µŻ˙řɨ Ţ †%µ�p0†RŇÔ‘‚ ÂFDÔF’0ť*ÖF#Kbl!“M!‰×‘“N'®MZe1`†•&Âń4‘‚4Ą“„bpڵ“ÄäČÄdרÄćPĹő×#–Â#.\[ĘĄ–F-J–V#)p†ʵqA‚ OËäń S#&F±D2Č`‡M0›k&&U„hą&˘0A‚ś­SaąÔ×]¦CMu1 “—&'„2LF.T©# eŠŇÉÄËÄâkLGb2kĽA‹ň4†˦!„#Äe2Ő—-‹&&•…ĺ“dFKÄbkUŃ [Äě›0A„ľ×®Ča Á (Á C-’a &L#*„ea \M-0†VO˛2ŚC:NşšÓLCBaĘ0C*Ääµ-+‰‰Ąedašbő1='ÓHÉҶŻ#„,Âl!˘2ĺ2¤azV#ar–L#Eá SŇbŘš´Äô†(Ä1:b<C&CňŮ2 Ę´ĘerF”¦e$ĐŚF0 ÂŚ(Äś!‚dâ195r1™4Ä Äi52ő®\µ‘„䌥bhŚ' bM„e”a8śMq #\ś¶#“]Ł- !ɦ^FZĺĘɢi1r••*‹Z&˘b™#„4 ĹÖ™zů†#WÄ1 0ťhž#)•—‰Âx ÄC ‰¨ąI¤Ë/+‰¬Ś®ÄOZ1ée˛Ť'HËF#0ڵËĹŞÂi1L#(ŚY[ ÄŇšČÄbvM2i‘—ĺ™!ÉŐŁNŃ<F‰áYµQ1[i&&Y2ɨŚF&˛2ĽśC$14bsĘ2ňťZ0ŤrÓÁ F-1t^)’aRÄbÖ`ŤJbk')¤Ó.1}ÉŮ &`DqML¦#DđŤD0 Â0ś•Â1rZLLµHÁÄbŮFNÉëN®š»‘—“É«—-14™dÄa -1jYpŚ—,C Ë'bšbžY’8†'‘«Äľ!‰­rĺ­&VL^##, Á™XŚ\¬¸ŚN&A„qf(b† Äb<ľaWq _)”ËTÁ&Iˇ &L#B2˘0ŚQ…茵ddŚĽC(ÂOÉ®ä0†#W¤1tĘäÄđ†D1-‚8M+$atL^XŤ˘2´Ś˛1 MM^F“bĚFŻ]ŻŐ0Äb!„áe¬ŞT] F)‰¨ŤSeŻ'#jb:†L†Ëbzäa AŠđ0†RŇÔ‘‚ ÂFDÔF’0ť*ÖF#Kbl!“M!‰×‘“N'®MZe1`†•&Âń4‘‚4Ą“„bpڵ“ÄäČÄdרÄćPĹő×#–Â#.\[ĘĄ–F-J–V#)p†ʵqA‚ OËäń S#&F±D2Č`‡M0›k&&U„hą&˘0A‚ś­SaąÔ×]¦CMu1 “—&'„2LF.T©# eŠŇÉÄËÄâkLGb2kĽA‹ň4†˦!„#Äe2Ő—-‹&&•…ĺ“dFKÄbkUŃ [Äě›0A„ľ×®Ča Á (Á C-’a &L#*„ea \M-0†VO˛2ŚC:NşšÓLCBaĘ0C*Ääµ-+‰‰Ąedašbő1='ÓHÉҶŻ#„,Âl!˘2ĺ2¤azV#ar–L#Eá SŇbŘš´Äô†(Ä1:b<C&CňŮ2 Ę´ĘerF”¦e$ĐŚF0 ÂŚ(Äś!‚dâ195r1™4Ä Äi52ő®\µ‘„䌥bhŚ' bM„e”a8śMq #\ś¶#“]Ł- !ɦ^FZĺĘɢi1r••*‹Z&˘b™#„4 ĹÖ™zů†#WÄ1 0ťhž#)•—‰Âx ÄC ‰¨ąI¤Ë/+‰¬Ś®ÄOZ1ée˛Ť'HËF#0ڵËĹŞÂi1L#(ŚY[ ÄŇšČÄbvM2i‘—ĺ™!ÉŐŁNŃ<F‰áYµQ1[i&&Y2ɨŚF&˛2ĽśC$14bsĘ2ňťZ0ŤrÓÁ F-1t^)’aRÄbÖ`ŤJbk')¤Ó.1}ÉŮ &`DqML¦#DđŤD0 Â0ś•Â1rZLLµHÁÄbŮFNÉëN®š»‘—“É«—-14™dÄa -1jYpŚ—,C Ë'bšbžY’8†'‘«Äľ!‰­rĺ­&VL^##, Á™XŚ\¬¸ŚN&A„qf(b† Äb<ľa@���±q˙řÉSLż‘Ă­ČĚ—Ń[ÖOŰl´§G¨\aoťďč#‹d´.(… b(„ J B(!a$‘ ¨'˘©Yy92z5 Ł·||ęŽO-p¨™0„b (‚Đ)R$PBh^+«+úÓ5™!Č9ť=MŻ$e1P”’YČH‘‰I ¤D¸V%‹“Kč×§m:::sČäÖ‹‹ÂF˘$„’"’A, bŠAyI*Ňr4‘Ń´ň|vŐą5˘«-„’""%,‚ÄBD"IK%’Ę˯ɺ#eö×-i“,BČ™ ""D"""HHBȤ„©-/+§.|k5š†ŁSďÓafIŚDÂLDÄ  ’!$!A˛!bHH¨’Dâšą'&í©Ďľíß^µ&$Ô…J$„DAHQBH‰$’%–“¦®˙«s2Ěł'Ł®ľ‰˘b˛‘¤± D!DPDAHR “–JR­pźµAČţÝî˝}i4#¸T%AHHEHE„H(ŠE‰Q&TM'eöň6OY÷ßk1lSR‘q2!d(„$„PаE„,…˘RDZZňŮ#˙Óhň3-”2Ć$2Ń “ Š$…Á(""BH""DP„Â,)•‹DŇą8†ÄôďôjŽ!Ëi4L¬¸*"Č- ,„D‚HBJp¡QyYjv×§oŢ›GŻí®âĺŇQ)… ™,B‚$ LP% DRˇ2Zî/ą¨čtuÍÓSęuĄŞD´Q"‚P˘ "‘$EL…‰0¸©Š1zżw¦ăďtz}yF)‰“ŠADLB`„Ŕ‹I!$%’‘p–—•ɲmnź·M3#ešOSU%E%!$$)  ˘ ˘dA2&E‘qu+__ÍŮĐń'ýŢ«Q„F$b&Ś…BBDDPEI $JE"Ş/)¨Ę13,ëišfŽ´őÜ´şE"I"„)X‚Đ(‚B)!!H.‘qZO/Ş|z~ůţ‡d†(ÉbňŃ2#L‚d(„I ‰ !$E""-ČšKÄi2̧OíówÜÚq54˛˛JJD’ˇ „ˇb(‘$.RÉ2Ě^·§Ů‰š|te™f//T–JH’ D…” I"$$…˘Ä˘râňyŘCÓö·Ł»2ś×‹d´.(… b(„ J B(!a$‘ ¨'˘©Yy92z5 Ł·||ęŽO-p¨™0„b (‚Đ)R$PBh^+«+úÓ5™!Č9ť=MŻ$e1P”’YČH‘‰I ¤D¸V%‹“Kč×§m:::sČäÖ‹‹ÂF˘$„’"’A, bŠAyI*Ňr4‘Ń´ň|vŐą5˘«-„’""%,‚ÄBD"IK%’Ę˯ɺ#eö×-i“,BČ™ ""D"""HHBȤ„©-/+§.|k5š†ŁSďÓafIŚDÂLDÄ  ’!$!A˛!bHH¨’Dâšą'&í©Ďľíß^µ&$Ô…J$„DAHQBH‰$’%–“¦®˙«s2Ěł'Ł®ľ‰˘b˛‘¤± D!DPDAHR “–JR­pźµAČţÝî˝}i4#¸T%AHHEHE„H(ŠE‰Q&TM'eöň6OY÷ßk1lSR‘q2!d(„$„PаE„,…˘RDZZňŮ#˙Óhň3-”2Ć$2Ń “ Š$…Á(""BH""DP„Â,)•‹DŇą8†ÄôďôjŽ!Ëi4L¬¸*"Č- ,„D‚HBJp¡QyYjv×§oŢ›GŻí®âĺŇQ)… ™,B‚$ LP% DRˇ2Zî/ą¨čtuÍÓSęuĄŞD´Q"‚P˘ "‘$EL…‰0¸©Š1zżw¦ăďtz}yF)‰“ŠADLB`„Ŕ‹I!$%’‘p–—•ɲmnź·M3#ešOSU%E%!$$)  ˘ ˘dA2&E‘qu+__ÍŮĐń'ýŢ«Q„F$b&Ś…BBDDPEI $JE"Ş/)¨Ę13,ëišfŽ´őÜ´şE"I"„)X‚Đ(‚B)!!H.‘qZO/Ş|z`���ę˙řɨúĄ˘Ą~Ąµ¦F�HČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev ÂzŃ×LC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev���Oé˙řɨóJÇÂѾºő·m´.µ¤XüS$‘Ě ‚É$Ţ99ÉžI’O$ó™3śÉ9ĚśÉ3<“ĚÎLśä“3ÉšL–R“™ňaÉÉ™$™’Iś™2dÉć&|ć|ź<ĚÉ2sžI3ÎrdÉÉ’g䓟™“!ĘKÉśÉIĂ$É3™’g$ź™2rL9“$“ÉÉňIśÉĚňI䛓™4’dćLĚ’O&2Np™¤Ěś¤ÉNOĚ“ňI™ä”É2|’Nä’s$Î9$ÉĚ“d’rdäÎdç4äÉĚ“90Ó$äÎ$™2důź$ÎrNs%%&C–sśäź!$ç$šIä“6d2s'$ÎL™će'9’y90äů “&I9Éś’fCó&s'Éś™ćyÉćIÉIÉňIä™9ćB|’äů>I>g'Ěç9“ňLÉ$ÉĚů$žIś™9¤’gĚ™2vdůćy’IŇI4ä$ů2I<“É“'2L“92Y“!’ÎyćNs™äź'&vI šI?2O'2|™Ě™É&~<äĎ$ź“™2g’y$äÉ™?3™2IňIňrIĽ’lÉI“’d™d’I“†IćIÎfdĺ“9$ůů™%çÉ™&LćNÉ93“™9’ś™Ů$ćNy2dÉ’ç2O <$“4’O&rg&K) ‡3’O'4’IÉ™2dÎI3''áÎIó',á’Rs&rdäĎ'ĚđÎL4rdĎ“śÉ3“$śů$ždç8s†Lçi$śČs$’rI&L™>fNdś“ädů3ä“’Lź!“&rL™2I>I<ś™ç%&JL™Ěś¤¤ůś™'’I'9 “ś™2I7„ÎNrg’d“É<ćLç2Ns'2LĎ$ó3“'9$Ěňf“%”‡äć|rrfI&d’g&L™2y„Éź9ź'Ď32Lśç’Lóś™2rd™ů$çćdČr’ňg2RpÉ2Lćd™É'ćLś“dÉ$ňr|’g2s<’y&äćM$™9“3$“Ʉ̓ś&i3')2S“ó$ü’fy%2Lź$“ą$śÉ3‡I2s$Ů$ś™93™9Í92s$ÎL4É93‡É&L™>gÉ3ś“śÉIIĺśç9'ČI9É&’y$Í™ śÉÉ3“&y™IÎdžNL9>BdÉ’Nrg$™üÉśÉňg&yžry’rRd2|’y&Nd9ź$†y>O’O™Éó9Îdü“2I2s>I'’g&Ni$™ó&Lť™>yžd’t’M9 >L’O$ňdÉĚ“$ÎL–dČdłžy“śćy'ÉÉť’Bf’OĚ“ÉĚź&s&rIź„Ď93É'äćL™äžI92fOĚćL’|’|ś’o$›2Rdä™&Y$’dá’y’s™™9dÎI>~fIyňfI“9“‡2NLäćNd§&vI9“žL™2d¤9Ě“ÂO $Í$“Éś™É’ĘC!Ěä“ÉÍ$’rfL™3’LÉÉřs’|ÉË8d”śÉś™93Éó<3“ &���ÄŇ˙řɨô�_µý �\F'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePŚ���*^˙řÉOK®HlDŕA�F.&–C+'‰ŮF!‚']Mi¦!ˇ0Äe!•brZ–•ÄŚ‹ÄҲ˛0ŚM1zž“Äi¤dé [W‘ –a6Ńr™R0˝+„0ąK&˘đ†)„i1lMZbzCbť1!“!„yl™ eZe2ą# ĘS2’hF#aFbNÁ ˛qśšąŤLŚA‚b b4Śš™z×.ZČÂrFұ4F…±&Â2Ę0śN&¸†®N[ɮі†ÄdÓ/#-rĺdŃ4ąJĘ•E­Q 1L‘ÂbëLŚ˝|ŚC«â†NÄ4O”ĘËÄá<b!„ÄÔ\¤ŚRe—•ÄÖFWb '­ŤtÄ2ŮF“¤eŁ„FZĺbŐDa4¦”F,Ś-„âiLMdb1;&™4ČËňĚÄdęщ§hž#DđŽ,ŚZ¨Ś-‰4“,™dÔF#Y^N!’š19ey N­Fąi`†#ş/É0Ś©b1kD0FĄ15“”Ňi—ľä쌆0A˘8Ť&¦S˘xF˘aNJÄaą-&&Z¤`Źb1lŁ 'dő§WM]ČËÉäŐË–šL˛b0†µ,¸FK‹–!„哉Ä1M1 O,ÉCČŐâ _ÄÖąrÖ“+&/‚ –`ŚL¬F.V\F'L Â8ł1C b1_0+¸†/”ĘeŞ` “$І&ˇQF(ÂôFZ˛2F^!”a 'd×rC«ŇşerbxC"–Á&•’0ş&/,F‹ŃZFY†&¦Ż#I±f#W®×ÄjAŠb1  đڞÖU*.‚ #ÄÔF‰©„2ד‘„51LC&Ce±=r0†L ĹxA‚C ©ijHÁ a#"j#ÉN•k#Ą±6ɦÄëČɧ×&­2Ť0CĘ“axšHÁRÉÂ18FZÉÄbrdb2kÔbs(búë‘Ëa —.-„eRË# –ĄK+”¸CÄeZ¸ŚŚ Á'eňx†©‘“#X"d0C‚ &M‚5‰“*Â4\“Ń Á LNV©Ä0Ž\Äjk®Ó!‰¦ş†IË“Â&#*T‘…2ĹidÄbeÄbq5¦#Ä15Ţ ĹůCeÓ â2™jË–‰Ĺ“JÂňÉ„2#%â15Şč†-bvM‹  _k×d0†`†”`†L!‹–É0†&•B2°†.&–C+'‰ŮF!‚']Mi¦!ˇ0Äe!•brZ–•ÄŚ‹ÄҲ˛0ŚM1zž“Äi¤dé [W‘ –a6Ńr™R0˝+„0ąK&˘đ†)„i1lMZbzCbť1!“!„yl™ eZe2ą# ĘS2’hF#aFbNÁ ˛qśšąŤLŚA‚b b4Śš™z×.ZČÂrFұ4F…±&Â2Ę0śN&¸†®N[ɮі†ÄdÓ/#-rĺdŃ4ąJĘ•E­Q 1L‘ÂbëLŚ˝|ŚC«â†NÄ4O”ĘËÄá<b!„ÄÔ\¤ŚRe—•ÄÖFWb '­ŤtÄ2ŮF“¤eŁ„FZĺbŐDa4¦”F,Ś-„âiLMdb1;&™4ČËňĚÄdęщ§hž#DđŽ,ŚZ¨Ś-‰4“,™dÔF#Y^N!’š19ey N­Fąi`†#ş/É0Ś©b1kD0FĄ15“”Ňi—ľä쌆0A˘8Ť&¦S˘xF˘aNJÄaą-&&Z¤`Źb1lŁ 'dő§WM]ČËÉäŐË–šL˛b0†µ,¸FK‹–!„哉Ä1M1 O,ÉCČŐâ _ÄÖąrÖ“+&/‚ –`ŚL¬F.V\F'L Â8ł1C b1_0+¸†/”ĘeŞ` “$І&ˇQF(ÂôFZ˛2F^!”a 'd×rC«ŇşerbxC"–Á&•’0ş&/,F‹ŃZFY†&¦Ż#I±f#W®×ÄjAŠb1  đڞÖU*.‚ #ÄÔF‰©„2ד‘„51LC&Ce±=r0†L ĹxA‚C ©ijHÁ a#"j#ÉN•k#Ą±6ɦÄëČɧ×&­2Ť0CĘ“axšHÁRÉÂ18FZÉÄbrdb2kÔbs(búë‘Ëa —.-„eRË# –ĄK+”¸CÄeZ¸ŚŚ Á'eňx†©‘“#X"d0C‚ &M‚5‰“���ůD˙řɨćW™XÚYÂZP�pŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`��� Ť˙řɨď)ě.Ý3 8.�BjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!€���Ö˙řɨčŕ®ćëŚń�TĘeŞ` “$І&ˇQF(ÂôFZ˛2F^!”a 'd×rC«ŇşerbxC"–Á&•’0ş&/,F‹ŃZFY†&¦Ż#I±f#W®×ÄjAŠb1  đڞÖU*.‚ #ÄÔF‰©„2ד‘„51LC&Ce±=r0†L ĹxA‚C ©ijHÁ a#"j#ÉN•k#Ą±6ɦÄëČɧ×&­2Ť0CĘ“axšHÁRÉÂ18FZÉÄbrdb2kÔbs(búë‘Ëa —.-„eRË# –ĄK+”¸CÄeZ¸ŚŚ Á'eňx†©‘“#X"d0C‚ &M‚5‰“*Â4\“Ń Á LNV©Ä0Ž\Äjk®Ó!‰¦ş†IË“Â&#*T‘…2ĹidÄbeÄbq5¦#Ä15Ţ ĹůCeÓ â2™jË–‰Ĺ“JÂňÉ„2#%â15Şč†-bvM‹  _k×d0†`†”`†L!‹–É0†&•B2°†.&–C+'‰ŮF!‚']Mi¦!ˇ0Äe!•brZ–•ÄŚ‹ÄҲ˛0ŚM1zž“Äi¤dé [W‘ –a6Ńr™R0˝+„0ąK&˘đ†)„i1lMZbzCbť1!“!„yl™ eZe2ą# ĘS2’hF#aFbNÁ ˛qśšąŤLŚA‚b b4Śš™z×.ZČÂrFұ4F…±&Â2Ę0śN&¸†®N[ɮі†ÄdÓ/#-rĺdŃ4ąJĘ•E­Q 1L‘ÂbëLŚ˝|ŚC«â†NÄ4O”ĘËÄá<b!„ÄÔ\¤ŚRe—•ÄÖFWb '­ŤtÄ2ŮF“¤eŁ„FZĺbŐDa4¦”F,Ś-„âiLMdb1;&™4ČËňĚÄdęщ§hž#DđŽ,ŚZ¨Ś-‰4“,™dÔF#Y^N!’š19ey N­Fąi`†#ş/É0Ś©b1kD0FĄ15“”Ňi—ľä쌆0A˘8Ť&¦S˘xF˘aNJÄaą-&&Z¤`Źb1lŁ 'dő§WM]ČËÉäŐË–šL˛b0†µ,¸FK‹–!„哉Ä1M1 O,ÉCČŐâ _ÄÖąrÖ“+&/‚ –`ŚL¬F.V\F'L Â8ł1C b1_0+¸†/”ĘeŞ` “$І&ˇQF(ÂôFZ˛2F^!”a 'd×rC«ŇşerbxC"–Á&•’0ş&/,F‹ŃZFY†&¦Ż#I±f#W®×ÄjAŠb1  đڞÖU*.‚ #ÄÔF‰©„2ד‘„51LC&Ce±=r0†L ĹxA‚C ©ijHÁ a#"j#ÉN•k#Ą±6ɦÄëČɧ×&­2Ť0CĘ“axšHÁRÉÂ18FZÉÄbrdb2kÔbs(búë‘Ëa —.-„eRË# –ĄK+”¸CÄeZ¸ŚŚ Á'eňx†©‘“#X"d0C‚ &M‚5‰“*Â4\“Ń Á LNV©Ä0Ž\Äjk®Ó!‰¦ş†IË“Â&#*T‘…2ĹidÄbeÄbq5¦#Ä15Ţ ĹůCeÓ â2™jË–‰Ĺ“JÂňÉ„2#%â15Şč†-bvM‹  _k×d0†`†”`†L!‹–É0†&•B2°†.&–C+'‰ŮF!‚']Mi¦!ˇ0Äe!•brZ–•ÄŚ‹ÄҲ˛0ŚM1zž“Äi¤dé [W‘ –a6Ńr™R0˝+„0ąK&˘đ†)„i1lMZbzCbť1!“!„yl™ eZe2ą# ĘS2’hF#aFbNÁ ˛qśšąŤLŚA‚b b4Śš™z×.ZČÂrFұ4F…±&Â2Ę0śN&¸†®N[ɮі†ÄdÓ/#-rĺdŃ4ąJĘ•E­Q 1L‘ÂbëLŚ˝|ŚC«â†NÄ4O”ĘËÄá<b!„ÄÔ\¤ŚRe—•ÄÖFWb '­ŤtÄ2ŮF“¤eŁ„FZĺbŐDa4¦”F,Ś-„âiLMdb1;&™4ČËňĚÄdęщ§hž#DđŽ,ŚZ¨Ś-‰4“,™dÔF#Y^N!’š19ey N­Fąi`†#ş/É0Ś©b1kD0FĄ15“”Ňi—ľä쌀���"á˙řÉkL¬®P°ëłÔ· ş‹ľPµ°(ńŔšÝÜu #ÎľŇJ’E"HHHD"!D"!DI$I*UVżů˙íżoýżżÝ%t•"D’""DB"!„HB‰"$IH‰*ĺ×ým·nĎŢ˙÷ý;ĄT’DI$D$! „DDDDDI*’Uw×7noŢöýýľęůR˘I(DDHDB„$B!DDJI%UW^ďŰß·¶Ýţţ»ę’´‘"(‰‚"!‚"B"H„‘)ZU>^ţź›ß7ďľ»ĺĄ*D‰DDB!B"" H‰")).•÷×˙űo›mĎ˙˙WŇ•"‰$$DHDBB"„D""I"$ŞUŐϛ۶Í˙{o˙ĺ˙$’˘D‘ "!„B’"""I*ĄW¶˙öýó{?뿪\¤IH„HD!B„"$B’H’®®©=˙·ďß·żßÝ´ąr’‘„HDD!„"! DD•"©Jßý{7ţŰ{˙ß}«íRH‰„!H„B!DD•RJ©Uţďm˙6÷ď˙˙«ŞRH•"! „HB„B‰ŠEĄUTÝ÷ďŰ›÷ű˙˙»ą(´D‰"„DD"„DD"$‰$”•]WŰ˙›÷·Ű˙ßŰ®Z—"H‘‰„BD!! ""H‘TI^©]ź·ďoßľéó•*T˘DI""$D!DD" "H‘)RŞżÖöűŰ{íí˙}:»I*D’!D""D‰˘(’”Şż•oţöŢćß˙˙ő%R’H‘"DB"ŠJEJ•W÷{÷ß¶Ý↑䪑$H‰B„DD!DD"""H„’HĄRşé÷{oý·űţ}uËJD‰DB„„"!„"""(’DµRşű~ý˙ěŰtýÓď®­%$D’"$D""!B"!H„‘$I)%*ţďżýű{}ţ˙ęW)(„‰„B"!!‚‘"DDI)"WtýŰöŢíűŰ÷UITI"DDDB„HA‰"""H‰%%uJď˙ýżŰ{ß>|ëí$©$R$„„„B!„B!„D’D’ĄUk˙źţŰö˙ŰűýŇWIR$I""$D""D„!‘"D”’®]ÖŰvěýď˙ÓşUI$D’H„BB‘DDDDDD’©%W}svćýďoßŰ*$’‰„DD„D BD"„DH„¤’UUuîý˝ű{mßďëľ©+I"‘ "!""! „"$I•ĄSĺďéů˝ó~÷űëľZR¤H‘DH„D"„"""„’"’’é_}˙¶ů¶Ü˙˙ő})R(’BDD„D!„"! DB"$’"JĄ]\ů˝»lß÷¶˙ţ_ňI*$I‘""D!‰"!""$’ŞWő{o˙oß7łţ»úĄĘD”‰D„B„!B"D!)$‰*ęę“ßű~ýű{ýýŰK—)) HD„DBB"‘$DIR*”­˙׳í·żý÷ÚľŃ%$‘BDH„"$DIU$Ş•_îößóo~˙˙úşĄ$‰R"‘D„!H„!‘¤Q*UUMß~ýążż˙ű»’‹DH’!DDB!DDB"H’IIUŐ}żůż{}żýýşĺ©q"$‰‘D!„B‚"$‰D•ę•Ů÷ű~öýűîź9RĄJ$D’!"DB„H„B!‘$‰•*«ýoo˝·ľŢß÷Ó«´’¤H‰!„B"!DHŠ"‰)J«ůV÷˙ďmîm˙˙˙RU)$‰‚!„D"!ˇ$¤T©Uwż}űmŢ÷űú®J©D‘$!DDB„H„B""$I$ŠU+®źw¶˙Űżç÷×\´¤H”D! HB"B"""‰$KU+Ż·ď����|,˙řɨ®¬FŞI¨˘�WLC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev ÂzŃ×LC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'���zÜ˙řɨËć®áIÜÖá�SW#©‘0CLA‚ F‘“S/ZĺËYNHÁV&Âp¶$ŃFYF‰Ä×Â5ÉËb95Ú2ĐÂŚšeäe®\¬š&“)YR¨µ˘j!)’1CB ]i‘—Ż‘b5|CÁ ؆‰â2™Yxś'‚ D0š‹”‘ŠL˛ň¸šČĘěA„őŁ®†[(ŇtŚ´b0Ë\± Z¨Ś&“Â2Ĺ‘…°śM)‰¬ŚF'dÓ&™~Y’ŚťZ14á ÄhžĹ‘‹U…±&’be“,šÄbk#+ÉÄ2CF'1 Ł/!‰ŐŁ×-1 ÄbÓEâ™&•,F-h†Ô¦&˛ršM2ăÜť‘Âf4G¤ÔĘb4OÔC # ÉXŚ#%¤ÄËTŚá F-”`„ěž´ę髹y<šąrÓI–LFÂÓĄ—ÉqrÄ0ś˛q8†)¦!‰ĺ™#byĽA‹âš×.ZŇedĹâ0A‚2 ‰•ĹĘËÄâi„Gb†(`‚ F#ËćewĹň™LµLa2dšÂdÂ4#*#Ĺ^ËVFHËÄ2Ś!¤ń šîCb5zCL®LOdCŘ#„ҲFDĹĺŃz#+HË#ÄÔŐäi6,ÄjőÚřŤS1LF!‚A–ZĘĄEĐ@ŔA„bšŃ50†Zňr0†¦#©dČa ¶'®FÉ„Ż0Ca5--I!‚ $dMDa# Ň­db4¶&Â4Ňťy4âzäŐ¦SˇaRa /I#JY1F'ËY8ŚNLŚFMzŚNe _]r1l!˘2ĺĹ°ŚŞYda2Ô©eb2—aŚ«W‘„ Äń ľOŐ22dkdC,†pA„Ó °F±2beXF‹’a#!‰‰ĘŐ1†ËŤMuÚd14×SÉ9rbxC$ÄbĺJ’0¦Q­,ŚL¸ŚN&´Äq†#&»Äż#Ha şbA‚<FS-YrŃ8˛biQ^Y0†DdĽF&µ]ű NɱcA‹íz솠ҌɄ1rŃ&ÂdÂ2¨FVĹÄŇÓedń;#(Ä0@`C¤ë©­4Ä4 `†aŚŁ2¬NKRұ‘‘xšVVF‰¦/SŇxŤ4Śť!‹jň8A’Ě&Â#.S*FĄb0†)dÂ4^Ĺ0Ť&-‰«LOHbŚC¦#Ä2d0Ź-“!‚ «L¦W$a9J`†RMÄ` (ÂŚIÂ!–N#“W#©‘0CLA‚ F‘“S/ZĺËYNHÁV&Âp¶$ŃFYF‰Ä×Â5ÉËb95Ú2ĐÂŚšeäe®\¬š&“)YR¨µ˘j!)’1CB ]i‘—Ż‘b5|CÁ ؆‰â2™Yxś'‚ D0š‹”‘ŠL˛ň¸šČĘěA„őŁ®†[(ŇtŚ´b0Ë\± Z¨Ś&“Â2Ĺ‘…°śM)‰¬ŚF'dÓ&™~Y’ŚťZ14á ÄhžĹ‘‹U…±&’be“,šÄbk#+ÉÄ2CF'1 Ł/!‰ŐŁ×-1 ÄbÓEâ™&•,F-h†Ô¦&˛ršM2ăÜť‘Âf4G¤ÔĘb4OÔC # ÉXŚ#%¤ÄËTŚá F-”`„ěž´ę髹y<šąrÓI–LFÂÓĄ—ÉqrÄ0ś˛q8†)¦!‰ĺ™#byĽA‹âš×.ZŇedĹâ0A‚2 ‰•ĹĘËÄâi„Gb†(`‚ F#ËćewĹň™LµLa2dšÂdÂ4#*#Ĺ^ËVFHËÄ2Ś!¤ń šîCb5zCL®LOdCŘ#„ҲFDĹĺŃz#+HË#ÄÔŐäi6,ÄjőÚřŤS1LF!‚A–ZĘĄEĐ@ŔA„bšŃ50†Zňr0†¦#©dČa ¶'®FÉ„Ż0Ca5--I!‚ $dMDa# Ň­db4¶&Â4Ňťy4âzäŐ¦SˇaRa /I#JY1F'ËY8ŚNLŚFMzŚNe _]r1l!˘2ĺĹ°ŚŞYda2Ô©eb2—aŚ«W‘„ Äń ľOŐ22dkdC,†pA„Ó °F±2beXF‹’a#!‰‰ĘŐ1†ËŤMuÚd14×SÉ9rbxC$ÄbĺJ’0¦Q­,ŚL¸ŚN&´Äq†#&»Äż#Ha şbA‚<FS-YrŃ8˛biQ^Y0†DdĽF&µ]ű NɱcA‹íz솠ҌɄ1rŃ&ÂdÂ2¨FVĹ€���ć˙řɨĚB/j*~µ?ć�”9’’fC a$’BI$ĂC Ě”úźK*J}™L’“&N 8a$†BI0rs9>YôĄ˙M4˛ś¤Ě™“!Ă$L3 &C0ˇÉ'9ĺ?)óLĄ,˛Í(y3$™$†L0ˇ&aĂ2dĚç3)ĺ>ś¦’ÎS¤§9' $™2a2I$2C 2LfLó4ĺüżą§”9̡Ă$’a’I$0ÂI&PÉ0äĚśÉM4*Ztüąäç39&2C $I „É$2C0ĚχůNYO.RSžffd™&I†Iá†I!’93’’ĺúR’Ď)çžffd™0á’& d’II&fS._6]?Kś§“3&NI’$I„†ˇ0s'3’žPĄ?J_ĺ?””3&J&$$’Hd’HdÂfIśĘsĘRĺüÓśô¤ňdĂ„dČpdÂI0É0ĚÉ“3śĘJRť SŇůó9”0™ †C 3 ’L2I0É2dů(S,Ňť4ůK,ćs8dĂ!„Âa$’I 0’L†I93%8Y)§ŮzRtŇsś<Ă2I‡d0’L’I0’L9™J%?ż§B%,Ďdˇ™2I„“ $ÂL0É’IeJĄ<çĘP˛§”ĺ'“3L”$$Čd’a’ $Ě’s4)O”şyOĺ)šfdĚ™™’L†Hd2I$’C2Pćs’źÜżű§šS92pĚ(dĂ$I&„pĚ(hS))Ó)zo”ĺ e'93 &I„’I$’!$’aÉ“2Pć_ü˛ĺź33™ĚĚ&a†I$Ă$ÂHB$Ă 2|Ϧĺ?,írS3’pɆI„20É&L“ 0ˇÉC)źśĄ:}=>s(s%$̆$ÂI$„’I‡†™)ô˙>–T”ű2™%&Lś&pÂI „’a0ä)0ćr|łéKţšie9I™3&C!†I0fL†aC’NsĘ~Sć™JYešPňfI2I $aBL0ÆdÉ™ÎfSĘ}9M%ś§INrNI2dÂd’Hd†d™0Ě™ćiËůsO(s™C†I$Ă$’Ha„’L0ˇ’aÉ™9’šhT´éůsÉÎfrL2d†I0’ ’Hd†a™źňś˛ž\¤§<ĚĚÉ2L“ “!Ă $’C$8rg%%ËôĄ%žSĎ<ĚĚÉ2aĂ$2L20É$’’L̦\ľlş~—9O&fLś“$2I0“ !Ba0ćNg%<ˇJ~”żĘ)(fL”2L&HI$É$Ʉ̓9”甥Ëů§9éIäɇ 0Éá0É„’a’a™“&g9””Ą:§Ąóćs(a2 †f$d’a’dÉňP¦YĄ:iň–YĚćpɆC „ÂI$’a$™ ’rfJp˛SO˛ô¤é¤ç8y†d$“Ča$™$’a$s2”"JN„JYžÉC2d“ &I„a“$“0Ę”)JyĎ”ˇeO)ĘO&f™(HIÉ$Ă$&I™$ćhRź)tňźĘS4ĚÉ™33$™ Čd’I$†dˇĚç%?ą÷O4¦rdáPɆI!0’L3 0áPЦRS¦RôŔ���Eq˙řÉwXůWÂV3TM�Ra#!‰‰ĘŐ1†ËŤMuÚd14×SÉ9rbxC$ÄbĺJ’0¦Q­,ŚL¸ŚN&´Äq†#&»Äż#Ha şbA‚<FS-YrŃ8˛biQ^Y0†DdĽF&µ]ű NɱcA‹íz솠ҌɄ1rŃ&ÂdÂ2¨FVĹÄŇÓedń;#(Ä0@`C¤ë©­4Ä4 `†aŚŁ2¬NKRұ‘‘xšVVF‰¦/SŇxŤ4Śť!‹jň8A’Ě&Â#.S*FĄb0†)dÂ4^Ĺ0Ť&-‰«LOHbŚC¦#Ä2d0Ź-“!‚ «L¦W$a9J`†RMÄ` (ÂŚIÂ!–N#“W#©‘0CLA‚ F‘“S/ZĺËYNHÁV&Âp¶$ŃFYF‰Ä×Â5ÉËb95Ú2ĐÂŚšeäe®\¬š&“)YR¨µ˘j!)’1CB ]i‘—Ż‘b5|CÁ ؆‰â2™Yxś'‚ D0š‹”‘ŠL˛ň¸šČĘěA„őŁ®†[(ŇtŚ´b0Ë\± Z¨Ś&“Â2Ĺ‘…°śM)‰¬ŚF'dÓ&™~Y’ŚťZ14á ÄhžĹ‘‹U…±&’be“,šÄbk#+ÉÄ2CF'1 Ł/!‰ŐŁ×-1 ÄbÓEâ™&•,F-h†Ô¦&˛ršM2ăÜť‘Âf4G¤ÔĘb4OÔC # ÉXŚ#%¤ÄËTŚá F-”`„ěž´ę髹y<šąrÓI–LFÂÓĄ—ÉqrÄ0ś˛q8†)¦!‰ĺ™#byĽA‹âš×.ZŇedĹâ0A‚2 ‰•ĹĘËÄâi„Gb†(`‚ F#ËćewĹň™LµLa2dšÂdÂ4#*#Ĺ^ËVFHËÄ2Ś!¤ń šîCb5zCL®LOdCŘ#„ҲFDĹĺŃz#+HË#ÄÔŐäi6,ÄjőÚřŤS1LF!‚A–ZĘĄEĐ@ŔA„bšŃ50†Zňr0†¦#©dČa ¶'®FÉ„Ż0Ca5--I!‚ $dMDa# Ň­db4¶&Â4Ňťy4âzäŐ¦SˇaRa /I#JY1F'ËY8ŚNLŚFMzŚNe _]r1l!˘2ĺĹ°ŚŞYda2Ô©eb2—aŚ«W‘„ Äń ľOŐ22dkdC,†pA„Ó °F±2beXF‹’a#!‰‰ĘŐ1†ËŤMuÚd14×SÉ9rbxC$ÄbĺJ’0¦Q­,ŚL¸ŚN&´Äq†#&»Äż#Ha şbA‚<FS-YrŃ8˛biQ^Y0†DdĽF&µ]ű NɱcA‹íz솠ҌɄ1rŃ&ÂdÂ2¨FVĹÄŇÓedń;#(Ä0@`C¤ë©­4Ä4 `†aŚŁ2¬NKRұ‘‘xšVVF‰¦/SŇxŤ4Śť!‹jň8A’Ě&Â#.S*FĄb0†)dÂ4^Ĺ0Ť&-‰«LOHbŚC¦#Ä2d0Ź-“!‚ «L¦W$a9J`†RMÄ` (ÂŚIÂ!–N#“W#©‘0CLA‚ F‘“S/ZĺËYNHÁV&Âp¶$ŃFYF‰Ä×Â5ÉËb95Ú2ĐÂŚšeäe®\¬š&“)YR¨µ˘j!)’1CB ]i‘—Ż‘b5|CÁ ؆‰â2™Yxś'‚ D0š‹”‘ŠL˛ň¸šČĘěA„őŁ®†[(ŇtŚ´b0Ë\± Z¨Ś&“Â2Ĺ‘…°śM)‰¬ŚF'dÓ&™~Y’ŚťZ14á ÄhžĹ‘‹U…±&’be“,šÄbk#+ÉÄ2CF'1 Ł/!‰ŐŁ×-1 ÄbÓEâ™&•,F-h†Ô¦&˛ršM2ăÜť‘Âf4G¤ÔĘb4OÔC # ÉXŚ#%¤ÄËTŚá F-”`„ěž´ę髹y<šąrÓI–LFÂÓĄ—ÉqrÄ0ś˛q8†)¦!‰ĺ™#byĽA‹âš×.ZŇedĹâ0A‚2 ‰•ĹĘËÄâi„Gb†(`‚ F#ËćewĹň™LµLa2dšÂdÂ4#*#Ĺ^ËVFHËÄ2Ś!¤ń šîCb5zCL®LOdCŘ#„ҲFDĹĺŃz#+HË#ÄÔŐäi6,ÄjőÚřŤS1LF!‚A–ZĘĄEĐ@ŔA„bšŃ50†Zňr0†¦#©dČa ¶'®FÉ„Ż0Ca4���”¸˙řɨŢHKSNRQ�V¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev ÂzŃ×LC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL¦Z¦0™2Ma2a•„bŚ/De«#$eâFŇx†Mw!„1˝!‹¦W&'„2!‰lÂiY# ˘bňÄh˝•¤e‘bjjň4›b5zí|F©„¦#Á ŔŹË-eR˘č ` Â1LMDhšC-y9CSÔÄ2d0†[×#d W„!„0š––¤ŚÁ2&˘0Ś‘„éV˛1[a ši NĽŚšq=rjÓ)Đ0Ś©0†‰¤ŚĄ,Ś#„e¬śF'&F#&˝F'2†/®ąڶŃrâŘFU,˛0™jT˛±K„0ŚFU«Č bx†_'j™252!–C8 Âi„Ř#X™12¬#EÉ0Ť‚ ÄÄĺjŚCĺĚF¦şí2šk©dśą1<!’b1rĄIS(ŚV–LF&\F'Zb8ŚC“]â _‘¤0†]1 Á#)–¬ąhśY14¨Ś/,C"2^#Z®b؆'dر‚ Ĺö˝vCaiFdÂąhŚ“a2aT#+bâii„2˛xť‘”b 0!ŇuÔÖšb0C0ŚFQ‚V'%©iXŚHČĽM++#ÄÓ©‰é<FšFNŵy Éfa —)•# ұC ”˛a/bF“ÄŐ¦'¤1F!‰Óâ2G–ÉÁU¦S+’0śĄ0C)&„b0AaF$á Ë'‰É«‘ÔČÄ!¦ Á#HÉ©—­r嬌'$`Ť+Da8[hŚ#,Ł Äâkaä屚íha FM2ň2×.VMI‹”¬©TZŃ5ŔÉŚ!ˇ.´ČË×ČÄ1ľ!`„ěCDńL¬ĽNÁ"LMEĘHĹ&Yy\Mdev ÂzŃ×LC-”i:FZ1A„e®X†-TFIŠaDbČÂŘN&”ÄÖF#˛i“LŚż,É FN­šp†‰â4OâČĹŞ‰ÂŘ“I12É–MDb15‘•äâ!‰Ł†Q—ÄęŃ„k–†b1i‹˘ńL“Ę–#´CjSY9M&™q‹îNČČa3#Ňje1'„j!„ä¬F‹’ŇbeŞFđ†#Ę0@ÂvOZutŐÜŚĽžM\ąi‰¤Ë&#ai‹RË„d¸ąbNY8śCÓÄňĚ‘Ä1<Ť^ Ĺń Mk—-i2˛bń ÁaÄĘÄbĺeÄbq4 #‹1C0@Á#ĺó2»bůL���š,˙řɨ×Bş ]µ?Ţ�‚(‘B‰ŠŠRŐ®ąĎźn˙ů÷mrŐ+)I$Š$H‘ ‘!B‘JT•.®ëÝşÜ˙ďíwUR¤¤Q$D‰"BB„…D”’ĄUצąóż·|ďë®Ő-$”H‘D‘‘!BB‰$’UKZő÷óź;ßßÝőÖĄ*)$”H‘$DDHDDBDHI $’(¤ĄRŐýÜçn˙vç}ÝŐRŇR)DDD„„‰‰D’IJ-JŞŻ»űsś˙űîi­Z’¤˘I$HDH$„D„„HH˘(’’RĄjëç|Óžď˙çs®­R”’H‘D‰B"""B$$‰’JJ—.×_÷=űť»ą×k]$”R$‰!!""$$(D„H‘"D˘R”ŞĄ×s_>Üďţýu®­-QH‘"$$$$"D(DP‘$‰%ĄŞ˝~ďű˙wý:»–˛Ň¤’IH’ !BDD’I%IK—×>ç;ź|ëëRĺ%"‘$D„’!! ‘!$DQIEŞ®×Óź;÷Îűťzĺ­R‰D’(‰"BBDDBD$DID’E•Rµ¦štůöç{·;ď­j”˘É(ˇ"HH‘"""""""E$Y))RŐÉ÷Î÷ĎÝ»ľwZ¤´Ą$‘I $H‘ "D‘$RU%UWWßÇ>|çm]®¤©EDI "$"B$$BDH‰‰eE­W_Éýîźîţú´ęĄ©ID¤$„„‰ "BD’H¤’ĺ®×s§}ľwóť]Ý)I)‰"DD$D"B$"BHE’E$’”´ą_w÷÷ąÎţúď\µ-%‰"BDDDBB"$DHP‘"‰))*ZŞ»»çÎţţúş\’¤”H˘(I’‘B(‰"…J’–şűî˙říÎuó]ZU%$‘$DI !""""""D‘$Š(¤—Uuß}ű…ß»wĎ«]iQ(˘H’"BDD„‰"H‘IK-VµßsżßąŰą§|ąrË)D¤DP’""BDDH„‰(‘H¨Ą-Zëśůöď˙źv×-R˛”’H˘D‰‘ !$)DĄIRęî˝Ű­Ďţţ×uU*JEDH‘!!"$$(HQII*U]zkź;űwÎţşíRŇID‰H‰ ‰ $(’I%TµŻ_9ó˝ýýß]jR˘’ID‰DDD„DD$D„ˇ"I"ŠJU-_ÝÎvď÷nwÝÝU-%"‘$DDHHH‰‘I$”˘ÔŞŞűż·9Ď˙ľćšŐ©*J$‘"D„D‚HDHHD„Š"‰)%*V®ľwÍ9î˙ţw:ęŐ)I$‰H‘!$"""$"BH‘I$¤©ríu˙s߹ۻťvµŇIE"H’""BB„HH„‰"$J%)JŞ]w5óíÎ˙ď×ZęŇŃe‰""BBBB$B„E "H’QJZ«×î˙ż÷Ó«ąk-*I$‘$‰ ‘!"$DH‰$’T”ą}wóîsą÷Îľµ.RR)DHI "‰ "DE$”QjŞí}9óż|ďą×®ZŐ(”I"‘$$$DD$BDD‘DI$YU+Zi§Oźnw»sľúÖ©J,’Š$„‰"""""""$QE’’•-\ź|ď|ýŰ»çuŞKJRI˘D‰‘"$IE%RUUu}üsçÎv×őÚęJ”Q$Dˇ""B$"BD$D‘(–TZŐuüźŢéţďď«NŞZ””HŠBHHH‘$$I$ŠI.Zíw:wŰç9ŐÝŇ”’‘H‘"$DBDB$"B$$„P‰$RI)KK•÷{śďď®őËRŇQH’$$DDD$""DD… (’’’ĄŞ«»ľwüďď﫥É*IDŠ"„���F|˙řɨĐÂXĆžËĎŇ�M&¦S˘xF˘aNJÄaą-&&Z¤`Źb1lŁ 'dő§WM]ČËÉäŐË–šL˛b0†µ,¸FK‹–!„哉Ä1M1 O,ÉCČŐâ _ÄÖąrÖ“+&/‚ –`ŚL¬F.V\F'L Â8ł1C b1_0+¸†/”ĘeŞ` “$І&ˇQF(ÂôFZ˛2F^!”a 'd×rC«ŇşerbxC"–Á&•’0ş&/,F‹ŃZFY†&¦Ż#I±f#W®×ÄjAŠb1  đڞÖU*.‚ #ÄÔF‰©„2ד‘„51LC&Ce±=r0†L ĹxA‚C ©ijHÁ a#"j#ÉN•k#Ą±6ɦÄëČɧ×&­2Ť0CĘ“axšHÁRÉÂ18FZÉÄbrdb2kÔbs(búë‘Ëa —.-„eRË# –ĄK+”¸CÄeZ¸ŚŚ Á'eňx†©‘“#X"d0C‚ &M‚5‰“*Â4\“Ń Á LNV©Ä0Ž\Äjk®Ó!‰¦ş†IË“Â&#*T‘…2ĹidÄbeÄbq5¦#Ä15Ţ ĹůCeÓ â2™jË–‰Ĺ“JÂňÉ„2#%â15Şč†-bvM‹  _k×d0†`†”`†L!‹–É0†&•B2°†.&–C+'‰ŮF!‚']Mi¦!ˇ0Äe!•brZ–•ÄŚ‹ÄҲ˛0ŚM1zž“Äi¤dé [W‘ –a6Ńr™R0˝+„0ąK&˘đ†)„i1lMZbzCbť1!“!„yl™ eZe2ą# ĘS2’hF#aFbNÁ ˛qśšąŤLŚA‚b b4Śš™z×.ZČÂrFұ4F…±&Â2Ę0śN&¸†®N[ɮі†ÄdÓ/#-rĺdŃ4ąJĘ•E­Q 1L‘ÂbëLŚ˝|ŚC«â†NÄ4O”ĘËÄá<b!„ÄÔ\¤ŚRe—•ÄÖFWb '­ŤtÄ2ŮF“¤eŁ„FZĺbŐDa4¦”F,Ś-„âiLMdb1;&™4ČËňĚÄdęщ§hž#DđŽ,ŚZ¨Ś-‰4“,™dÔF#Y^N!’š19ey N­Fąi`†#ş/É0Ś©b1kD0FĄ15“”Ňi—ľä쌆0A˘8Ť&¦S˘xF˘aNJÄaą-&&Z¤`Źb1lŁ 'dő§WM]ČËÉäŐË–šL˛b0†µ,¸FK‹–!„哉Ä1M1 O,ÉCČŐâ _ÄÖąrÖ“+&/‚ –`ŚL¬F.V\F'L Â8ł1C b1_0+¸†/”ĘeŞ` “$І&ˇQF(ÂôFZ˛2F^!”a 'd×rC«ŇşerbxC"–Á&•’0ş&/,F‹ŃZFY†&¦Ż#I±f#W®×ÄjAŠb1  đڞÖU*.‚ #ÄÔF‰©„2ד‘„51LC&Ce±=r0†L ĹxA‚C ©ijHÁ a#"j#ÉN•k#Ą±6ɦÄëČɧ×&­2Ť0CĘ“axšHÁRÉÂ18FZÉÄbrdb2kÔbs(búë‘Ëa —.-„eRË# –ĄK+”¸CÄeZ¸ŚŚ Á'eňx†©‘“#X"d0C‚ &M‚5‰“*Â4\“Ń Á LNV©Ä0Ž\Äjk®Ó!‰¦ş†IË“Â&#*T‘…2ĹidÄbeÄbq5¦#Ä15Ţ ĹůCeÓ â2™jË–‰Ĺ“JÂňÉ„2#%â15Şč†-bvM‹  _k×d0†`†”`†L!‹–É0†&•B2°†.&–C+'‰ŮF!‚']Mi¦!ˇ0Äe!•brZ–•ÄŚ‹ÄҲ˛0ŚM1zž“Äi¤dé [W‘ –a6Ńr™R0˝+„0ąK&˘đ†)„i1lMZbzCbť1!“!„yl™ eZe2ą# ĘS2’hF#aFbNÁ ˛qśšąŤLŚA‚b b4Śš™z×.ZČÂrFұ4F…±&Â2Ę0śN&¸†®N[ɮі†ÄdÓ/#-rĺdŃ4ąJĘ•E­Q 1L‘ÂbëLŚ˝|ŚC«â†NÄ4O”ĘËÄá<b!„ÄÔ\¤ŚRe—•ÄÖFWb '­Ťp���NU˙řÉ ĂĄ€Ą™¦¦Ý�KeN‘–ŚFak–!‹U„ŇbFQ˛0¶‰Ą15‘ÄěšdÓ#/Ë2C“«F&ś!˘xŤÂ8˛1j˘b0¶$ŇLL˛e“QŚMdey8†HbhÄć!”eä1:´aĺ¦!‚ŚZbčĽS$Â2ĄĹ­Á”ÄÖNSI¦\bű“˛2LÁâ4š™LF‰á`A„a9+„bä´™j‘‚<!ŲŚ0ť“Öť]5w#/'“W.Zbi2ÉÂZbÔ˛á..X†–N'Ĺ4Ä1<ł$q O#W1|CZĺËZL¬ĽF0FXA‚12±ąYqśM0âĚPĹ 0AÄy| ®âľS)–©‚ &L“BLF„eDaŁ ŃjČÉx†Q„4ž!“]Ča FŻHbé•ɉá b[pšVHÂ輱/DeidbššĽŤ&ĹŤ^»_Şa)Ä0C0#Â2ËYT¨ş0ŚSQ&¦Ë^NFÔÄu1 ™ !–ÄőČÂ0áa &ĄĄ©#0A„ډ¨Ś#$a:U¬ŚF–ÄŘC&šCŻ#&śO\š´Ęb4 Á #*L!…âi#iK&#Äák'‰É‘ÉŻQ‰Ěˇ‹ë®F#-„4F\¸¶•K,Ś&Z•,¬FRá #•jâ20ž!—Éâ¦FLŤb eÁ0ša6Ö&LL«ŃrL#D`119Z¦#Â9s©®»L†&šęb'.LOdŚ\©RFĘ#Ą“‰—‰ÄÖŽ#Äd×xäi !—LC0GĘe«.Z'LM*# Ë&ČŚ—ÄÖ«˘¶!‰Ů6,`1}Ż]ÂA‚Q‚0†.Z#$ÂLFUʸšZa ¬ž'de† tťu5¦†„  #”`†U‰ÉjZV#2/JĘČÂ14ĹębzO¦‘“¤1m^G2Y„ŘCDeĘeHÂô¬FÂĺ,F‹Â¦¤Ĺ±5i‰é QbtÄx†L†ĺ˛d0A•i”ĘäŚ')LĘIˇŚ`A…Q‰8C2ÉÄbrjäb521i0AŇ2jeë\ąk# É#JÄŃNÄš#Ë(Âq8šâFą9lG&»FZC“LĽŚµË•“DŇbĺ+*U´MD0 Ĺ2F#hA‹­22őň1 FŻb a;Ń<FS+/„đA†Qr’1I–^WY]0ž´b5ÓËeN‘–ŚFak–!‹U„ŇbFQ˛0¶‰Ą15‘ÄěšdÓ#/Ë2C“«F&ś!˘xŤÂ8˛1j˘b0¶$ŇLL˛e“QŚMdey8†HbhÄć!”eä1:´aĺ¦!‚ŚZbčĽS$Â2ĄĹ­Á”ÄÖNSI¦\bű“˛2LÁâ4š™LF‰á`A„a9+„bä´™j‘‚<!ŲŚ0ť“Öť]5w#/'“W.Zbi2ÉÂZbÔ˛á..X†–N'Ĺ4Ä1<ł$q O#W1|CZĺËZL¬ĽF0FXA‚12±ąYqśM0âĚPĹ 0AÄy| ®âľS)–©‚ &L“BLF„eDaŁ ŃjČÉx†Q„4ž!“]Ča FŻHbé•ɉá b[pšVHÂ輱/DeidbššĽŤ&ĹŤ^»_Şa)Ä0C0#Â2ËYT¨ş0ŚSQ&¦Ë^NFÔÄu1 ™ !–ÄőČÂ0áa &ĄĄ©#0A„ډ¨Ś#$a:U¬ŚF–ÄŘC&šCŻ#&śO\š´Ęb4 Á #*L!…âi#iK&#Äák'‰É‘ÉŻQ‰Ěˇ‹ë®F#-„4F\¸¶•K,Ś&Z•,¬FRá #•jâ20ž!—Éâ¦FLŤb eÁ0ša6Ö&LL«ŃrL#D`119Z¦#Â9s©®»L†&šęb'.LOdŚ\©RFĘ#Ą“‰—‰ÄÖŽ#Äd×xäi !—LC0GĘe«.Z'LM*# Ë&ČŚ—ÄÖ«˘¶!‰Ů6,`1}Ż]ÂA‚Q‚0†.Z#$ÂLFUʸšZa ¬ž'de† tťu5¦†„  #”`†U‰ÉjZV#2/JĘČÂ14ĹębzO¦‘“¤1m^G2Y„ŘCDeĘeHÂô¬FÂĺ,F‹Â¦¤Ĺ±5i‰é QbtÄx†L†ĺ˛d0A•i”ĘäŚ')LĘIˇŚ`A…Q‰8C2ÉÄbrh���ňs˙řɨ!jÄ)ŔĽ#¸…�LF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘi4ËŚ_rvFC ŃF“S)Ń<#Q 0Ś'%b0Ś\–“-R0G„1¶Q‚˛zÓ«¦®äeäňjĺËLM&Y1C LZ–\#%ĹËÂrÉÄ⦆'–dŽ!‰äjń/bk\ąkI•“ÁË0F&V#+.#‰¦aYЎ‚1Ź/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&bĽ Á !„Ô´µ$`†0‘‘5„dŚ'Jµ‘ŇŘ›dÓHbuädÓ‰ë“V™LF„!„eI„0ĽM$`Ť)dÄaś#-dâ19215ę19”1}uČÄe°†Ë—Â2©e‘„ËRĄ•Ę\!„b2­\FF`Ä2ů<CTČÉ‘¬A‘ ˛!ÁL&ÁÄɉ•a.I„hŚ`†&'+TÄbG.b55×iÄÓ]LC$ĺÉ‰á “‹•*H™Db´˛b12â18šÓÄbŚšďbüŤ!„2éańLµeËDâɉĄDaydÂ’ńšŐtCÄ1;&ĹŚa/µë˛C0CJ0C&ĹËDdC “ʡXCKL!•“Ä쌣Á“®¦´ÓĐ‚A„b2Śʱ9-KJÄbFEâiYYF&˝LOIâ4Ň2t†-«ČáK0›hŚąL©^•Â\Ą“ŃxCÂ4¶&­1=!Š1 NŹÉÂ<¶L†2­2™\‘„ĺ)‚I4#‚ 0Ł 1'`†Y8ŚNM\ŚF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘi4ËŚ_rvFC ŃF“S)Ń<#Q 0Ś'%b0Ś\–“-R0G„1¶Q‚˛zÓ«¦®äeäňjĺËLM&Y1C LZ–\#%ĹËÂrÉÄ⦆'–dŽ!‰äjń/bk\ąkI•“ÁË0F&V#+.#‰¦aYЎ‚1Ź/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&bĽ Á !„Ô´µ$`†0‘‘5„dŚ'Jµ‘ŇŘ›dÓHbuädÓ‰ë“V™LF„!„eI„0ĽM$`Ť)dÄaś#-dâ19215ę19”1}uČÄe°†Ë—Â2©e‘„ËRĄ•Ę\!„b2­\FF`Ä2ů<CTČÉ‘¬A‘ ˛!ÁL&ÁÄɉ•a.I„hŚ`†&'+TÄbG.b55×iÄÓ]LC$ĺÉ‰á “‹•*H™Db´˛b12â18šÓÄbŚšďbüŤ!„2éańLµeËDâɉĄDaydÂ’ńšŐtCÄ1;&ĹŚa/µë˛C0CJ0C&ĹËDdC “ʡXCK@���]ž˙řɨ"c *ţ×ů,�lž'de† tťu5¦†„  #”`†U‰ÉjZV#2/JĘČÂ14ĹębzO¦‘“¤1m^G2Y„ŘCDeĘeHÂô¬FÂĺ,F‹Â¦¤Ĺ±5i‰é QbtÄx†L†ĺ˛d0A•i”ĘäŚ')LĘIˇŚ`A…Q‰8C2ÉÄbrjäb521i0AŇ2jeë\ąk# É#JÄŃNÄš#Ë(Âq8šâFą9lG&»FZC“LĽŚµË•“DŇbĺ+*U´MD0 Ĺ2F#hA‹­22őň1 FŻb a;Ń<FS+/„đA†Qr’1I–^WY]0ž´b5ÓËeN‘–ŚFak–!‹U„ŇbFQ˛0¶‰Ą15‘ÄěšdÓ#/Ë2C“«F&ś!˘xŤÂ8˛1j˘b0¶$ŇLL˛e“QŚMdey8†HbhÄć!”eä1:´aĺ¦!‚ŚZbčĽS$Â2ĄĹ­Á”ÄÖNSI¦\bű“˛2LÁâ4š™LF‰á`A„a9+„bä´™j‘‚<!ŲŚ0ť“Öť]5w#/'“W.Zbi2ÉÂZbÔ˛á..X†–N'Ĺ4Ä1<ł$q O#W1|CZĺËZL¬ĽF0FXA‚12±ąYqśM0âĚPĹ 0AÄy| ®âľS)–©‚ &L“BLF„eDaŁ ŃjČÉx†Q„4ž!“]Ča FŻHbé•ɉá b[pšVHÂ輱/DeidbššĽŤ&ĹŤ^»_Şa)Ä0C0#Â2ËYT¨ş0ŚSQ&¦Ë^NFÔÄu1 ™ !–ÄőČÂ0áa &ĄĄ©#0A„ډ¨Ś#$a:U¬ŚF–ÄŘC&šCŻ#&śO\š´Ęb4 Á #*L!…âi#iK&#Äák'‰É‘ÉŻQ‰Ěˇ‹ë®F#-„4F\¸¶•K,Ś&Z•,¬FRá #•jâ20ž!—Éâ¦FLŤb eÁ0ša6Ö&LL«ŃrL#D`119Z¦#Â9s©®»L†&šęb'.LOdŚ\©RFĘ#Ą“‰—‰ÄÖŽ#Äd×xäi !—LC0GĘe«.Z'LM*# Ë&ČŚ—ÄÖ«˘¶!‰Ů6,`1}Ż]ÂA‚Q‚0†.Z#$ÂLFUʸšZa ¬ž'de† tťu5¦†„  #”`†U‰ÉjZV#2/JĘČÂ14ĹębzO¦‘“¤1m^G2Y„ŘCDeĘeHÂô¬FÂĺ,F‹Â¦¤Ĺ±5i‰é QbtÄx†L†ĺ˛d0A•i”ĘäŚ')LĘIˇŚ`A…Q‰8C2ÉÄbrjäb521i0AŇ2jeë\ąk# É#JÄŃNÄš#Ë(Âq8šâFą9lG&»FZC“LĽŚµË•“DŇbĺ+*U´MD0 Ĺ2F#hA‹­22őň1 FŻb a;Ń<FS+/„đA†Qr’1I–^WY]0ž´b5ÓËeN‘–ŚFak–!‹U„ŇbFQ˛0¶‰Ą15‘ÄěšdÓ#/Ë2C“«F&ś!˘xŤÂ8˛1j˘b0¶$ŇLL˛e“QŚMdey8†HbhÄć!”eä1:´aĺ¦!‚ŚZbčĽS$Â2ĄĹ­Á”ÄÖNSI¦\bű“˛2LÁâ4š™LF‰á`A„a9+„bä´™j‘‚<!ŲŚ0ť“Öť]5w#/'“W.Zbi2ÉÂZbÔ˛á..X†–N'Ĺ4Ä1<ł$q O#W1|CZĺËZL¬ĽF0FXA‚12±ąYqśM0âĚPĹ 0AÄy| ®âľS)–©‚ &L“BLF„eDaŁ ŃjČÉx†Q„4ž!“]Ča FŻHbé•ɉá b[pšVHÂ輱/DeidbššĽŤ&ĹŤ^»_Şa)Ä0C0#Â2ËYT¨ş0ŚSQ&¦Ë^NFÔÄu1 ™ !–ÄőČÂ0áa &ĄĄ©#0A„ډ¨Ś#$a:U¬ŚF–ÄŘC&šCŻ#&śO\š´Ęb4 Á #*L!…âi#iK&#Äák'‰É‘ÉŻQ‰Ěˇ‹ë®F#-„4F\¸¶•K,Ś&Z•,¬FRá #•jâ20ž!—Éâ¦FLŤb eÁ0ša6Ö&LL«ŃrL���‰˙řɨ#dI}F BN>Q�L`†&'+TÄbG.b55×iÄÓ]LC$ĺÉ‰á “‹•*H™Db´˛b12â18šÓÄbŚšďbüŤ!„2éańLµeËDâɉĄDaydÂ’ńšŐtCÄ1;&ĹŚa/µë˛C0CJ0C&ĹËDdC “ʡXCKL!•“Ä쌣Á“®¦´ÓĐ‚A„b2Śʱ9-KJÄbFEâiYYF&˝LOIâ4Ň2t†-«ČáK0›hŚąL©^•Â\Ą“ŃxCÂ4¶&­1=!Š1 NŹÉÂ<¶L†2­2™\‘„ĺ)‚I4#‚ 0Ł 1'`†Y8ŚNM\ŚF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘi4ËŚ_rvFC ŃF“S)Ń<#Q 0Ś'%b0Ś\–“-R0G„1¶Q‚˛zÓ«¦®äeäňjĺËLM&Y1C LZ–\#%ĹËÂrÉÄ⦆'–dŽ!‰äjń/bk\ąkI•“ÁË0F&V#+.#‰¦aYЎ‚1Ź/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&bĽ Á !„Ô´µ$`†0‘‘5„dŚ'Jµ‘ŇŘ›dÓHbuädÓ‰ë“V™LF„!„eI„0ĽM$`Ť)dÄaś#-dâ19215ę19”1}uČÄe°†Ë—Â2©e‘„ËRĄ•Ę\!„b2­\FF`Ä2ů<CTČÉ‘¬A‘ ˛!ÁL&ÁÄɉ•a.I„hŚ`†&'+TÄbG.b55×iÄÓ]LC$ĺÉ‰á “‹•*H™Db´˛b12â18šÓÄbŚšďbüŤ!„2éańLµeËDâɉĄDaydÂ’ńšŐtCÄ1;&ĹŚa/µë˛C0CJ0C&ĹËDdC “ʡXCKL!•“Ä쌣Á“®¦´ÓĐ‚A„b2Śʱ9-KJÄbFEâiYYF&˝LOIâ4Ň2t†-«ČáK0›hŚąL©^•Â\Ą“ŃxCÂ4¶&­1=!Š1 NŹÉÂ<¶L†2­2™\‘„ĺ)‚I4#‚ 0Ł 1'`†Y8ŚNM\ŚF¦F Á 11FML˝k—-da9#iXš# ÂŘ“DaeN'\C×'-ä×hËCb2i—‘–ąr˛hšL\ĄeJ˘Ö‰¨†¦HÄa 1u¦F^ľF!Őń C 'b'Ęeeâpž1Âbj.RF)2ËĘâk#+±ÖŚFşblŁIŇ2Ń #-rÄ1j˘0šLSĘ#FÂq4¦&˛1ť“LšdeůfHb2uhÄÓ„4O˘xGF-TLFÄšI‰–L˛j#‰¬ŚŻ'É MśÄ2ŚĽ†'VŚ#\´Ä0C‹L]ŠdFT±µ˘#RšÉĘi4ËŚ_rvFC ŃF“S)Ń<#Q 0Ś'%b0Ś\–“-R0G„1¶Q‚˛zÓ«¦®äeäňjĺËLM&Y1C LZ–\#%ĹËÂrÉÄ⦆'–dŽ!‰äjń/bk\ąkI•“ÁË0F&V#+.#‰¦aYЎ‚1Ź/A•ÜCĘe2Ő0A„É’hC “ĐŚ¨Ś#az#-Y#/Ę0†“Ä2ką !Őé ]2ą1<!‘ K`ŽJÉ]–#E茭#,ŚCSW‘¤Řł«×kâ5L Ĺ1†axFYk*•AŠbj#DÔÂkÉČÂަ!“!„2ŘžąC&bĽ Á !„Ô´´���†Ô˙řÉ$ßJX~Y‚Z-Z|ZqZ µ§úIYťô6üýóm¶ďßÝŐ.*ID‘„"!‚""„"$D‰$IU+ľůöö˙m˙ďß÷ô•T’D‘!!BD!"""‘"*RŞď˙˙m˙ěöűý÷Ő.’I"$DDB!D!„HB"!"$BH¨”ŞŻ»|ŢŢößďoż»ú˘RR""DDD"""„B!„D‘")$’UwßoŰ÷¶˙ö˙żë®©%$DB$BB„D!DBDDI$I*Şú˝í˙ć÷çďß˙×z’IH’"$D"„D"!HB""$I"J©_ó˙žŢŰ~÷ű˙űŞV’E"(’„BD!!D"$B"$ŠIJę«·ďĎ›Űßí»÷Ü­ZI%"$$B$"BH„„H‰"$I$JWU{˙~řýíďß÷×ÔV¤I$‘"‘"! DB!‰"$ŠDĄ\®ţţ{~ć~výßJ­I$I""„BDDB„DDH‘$”Urëţnog˙·ľo}Őő$¤Q"HB"DBDD""DD‘$T¤Şî˝ż˙ŢŰźż÷×\’I(‰"""DB„‘%EKI×˙˙ďŢĎ˙ý˙ßT©))"!„D!B!""$’JĄU\ű{ý˝˝˝˝÷ßő*’H’"D$„HBD""BD$!$Q $¤ŞŻűvýż{ßď{ľ´´˘Q‰D""!„B""!$‘"JII}óŰŰ{{~ýţ˙•ŐRH’$DDD"‚"‘D$D¤TRWWn˙÷·ţŰ~ů÷ő®¤´’I"$B„!„B""$’It«»ß÷ć÷ď{ţű®¤©(IB$DB"BB"’JIUUÔçűöŰ÷··÷ßuj‰D‘""„H„B!‰‰D‰RŞë§oßďong˙˙őޤ’‘DH‰„DB"!"’ŃhľűíűŰý¶ů»~ëçJ¤1%"D$B"DBDB‘"DŠJ•U_Ű~ćý¶Ýż~ďľ©J’$‰‘D!„""!„H„‰$I%*ŻďíůűćŰmßż»Ş\T’$‰""DB!DD!DH‰H’ŞW}óííţŰ˙ßżďé*©$‰"$B$"B„"BD$DE"DTĄUß˙ţŰ˙Ůí÷űďŞ]$’DH‰„BB„D$BDH„‘Q)U_vů˝˝íżŢßwőD¤¤DDDDD!„B!‰"DRI$Şďľß·ďm˙í˙×]RJH„H„„$"!B„’H’UUő{Ű˙ÍďĎßż˙®ő$’‘$$DHD!DB!„D$DH’D•Rżç˙=˝¶ýď÷˙÷T­$ŠDQ$!„!BBDH„DI’•ŐWoßź7·żŰwďąZ´’JDHH„HD„"‘ " ‘"DH’H”®Ş÷ţýńűŰ߿ﯨ­H’I"D"!"DB„BDI‰Ją]ýüöýĚüíűľţ•Z’H’$DD„!„!‘"I(Şĺ×üÜŢĎ˙o|Ţű«ęIH˘$D‘„D"„!DD‰"H©IUÝ{˙˝·?~˙﮹$’Q$DDD"!„$!! "$J$Š–“Ż˙˙ß˝ź˙ű˙ľ©RRR""$DBB"„B"""DDI$•JŞąö÷ű{{{{ďżęU$‘$DI„!DD!„HBH˘IIU_öíű~÷żŢţ÷}iiD˘)!DDB„DDB"$I"D”’’űć˙·¶ööýűý˙+ޤ‘$HD!D$!""H‰H¨¤®®Ý˙ďoý¶ýóďë]Ii$’DH„""!B!„"""$DDI$’éWwżďÍďŢö˙ý÷]IRP’"„H„D$!„„D!$”’Ş«©Ď÷í·ďooďľęŐ‰""$DD"‘„B$!!$€���±Ň˙řɨ%v-P2!6Á;)�BdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#I©”Ähž¨†F’±F.KI‰–©#ÂŚ[(Á Ů=iŐÓWr2ňy5rĺ¦&“,Ś!…¦-K.’âĺa9dâq SLCË2GÄň5xÄ15®\µ¤ĘÉ‹Ä`e„#+‹•—‰ÄÓ0Ž,Ĺ PÁŚG—Ě Ęî!‹ĺ2™j ÂdÉ4!„É„hFTFŠ0˝–¬Ś‘—eCIâ5܆Äjô†.™\žȆ%°G ĄdŚ.‰‹Ë˘ôFV‘–F!‰©«ČŇlYŐëµń¦bŚC0<#,µ•J‹ €Ĺ15˘ja µääa LGSÉÂlO\Ś!“1^`†ÂjZZ’0CHČšÂ2FĄZČÄilM„2i¤1:ň2iÄőÉ«L¦#B Â2¤Â^&’0F”˛b0ŚN–˛qś™ŚšőśĘľşäb2ŘCDeË‹aT˛ČÂe©RĘÄe.Â1V®##0A‰â|ž!ŞddČÖ Č†Y ŕ ¦`ŤbdÄʰŤ$Â4F0C•Şb1 #—1šë´Čbi®¦!’räÄđ†IĹĘ•$aL˘1ZY1™qśMiâ1 FMw1~FÂtÄ0xڦZ˛ĺ˘qdÄҢ0Ľ˛a ÉxŚMjş!‹bť“bĆ0ÚőŮ !„!Ą!“bĺ˘2L!„É„ePڬ!‹‰Ą¦ĘÉâvFQ`€Ŕ‡I×SZih@Á Â1FeXś–ĄĄb1#"ń4¬¬Ś#L^¦'¤ńi:CŐäp%M„4F\¦TŚ/JÄa .RÉ„hĽ!ŠaL[VžĹ†'LGdČa[&CV™L®HÂr”Á ¤šÁQ…“„0C,śF'&®F#S#`†Ť#&¦^µË–˛0ś‘‚4¬M„álI˘0ڞŚ'‰®!„k“–Ärk´eˇ„14ËČË\ąY4M&.R˛ĄQkDÔC S$b0†„şÓ#/_#Äjř†!‚± Äe2˛ń8Oa15)#™eĺq5‘•Ř ëF#]1 ¶Q¤éhÄa–ąbµQM&)„e‹# a8šSYŚNɦM22üł$1:´biÂ'Ń<#‹#Ş&# bM$ÄË&Y5ÄÖFW“d†&ŚNbF^C«F®Zb!Ŧ.‹Ĺ2L#*XŚZŃ ©LMdĺ4šeĆ/ą;#!„ĚhŽ#H���[˙řy¨&‹'äVéĘďUôđ�’v\ž‘tG¤Ry´¬¤Vłk·n—I”ËHě­zE1ÉĺOuŢIdúYfTµ=OĄšÍwo·Jť”ŽK»]5KSX–jÎO5OÄvźvvő*¦XŽŢ˘ék­íőÖk5×n’§kYLS*RĘÝ%ek4©b+xźr‹«Ghć9ŠĘËRŮČT–XŽÖÍ:N—IĚRtéľg'NEĚ©")˘’ÜŠ—JŠ™RÖtŠGŰÖtúË3‘Ůt·gk'IfíéŰ^eŤö•2’Čť­JË’ÜŠ’ě©QYŘ����� �3§EOş*+;ywEH¬¬şLâ–±DvsyŞr:1D),ÓXĘĘEek[ÍČé.˛n‹‘u›ÍggLé•>şÎGH¤\…¨‹‘S}é4’'Č©»}YYS[‘S˛ĄÝ-O®éŃSł˛íôR~Ţ·íy Ň)<Ý•˝1Ě»KÚé*Y¤©>KÚÔěQIľ’Nß|Ž“;KSîGŤěe‘ź"¤şÄVúĄć+]uŐśŽEIČRG7ä]•§ŇI*+^ĘË‘tĘGe#Ą×O“Ô–k4íâ}S€��� o�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/stripped.xm����������������������������������������������������������������0000664�0000000�0000000�00000001132�14447736377�0017335�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������title of song������������������������������������������}�� ����@��€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/sv4_header.mpc�������������������������������������������������������������0000664�0000000�0000000�00000000200�14447736377�0017655�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Á' �§�ňť.'÷ĎĂRë˙K©Ą”ß·S1fYLËb–eY–e1ÄB ą±Ä,hn Ş^Ů•š¬h3éš©–*ŚşŚ¶˛ęŻ\«ďËłKă|Ó9ÍvÍŰőÂqťĎÖZrý‚+®µdÇՏ؉�Z¨öG,Ü‹Lví˘kJĂś������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/sv5_header.mpc�������������������������������������������������������������0000664�0000000�0000000�00000000200�14447736377�0017656�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Á/ �ň��v§�čư˙@–RJ)mj)Ąfůű¶cł,1ËBł,‹FÖcŰ.ĺ/őČÖĎy<a6W­zDáuu6W[ţ_ŮwźľyřwŮŢg§óšŻrĺJűW®\ąČĘ+?=÷¨ţ˘”k¤ Ä^éś]qńmH7íI„żÉ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/sv8_header.mpc�������������������������������������������������������������0000664�0000000�0000000�00000000162�14447736377�0017670�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MPCKSHď*)„^�RG E}ZĚE}ZĚEIQ�SOD����APAPAPAPAPAPAPAPAPAPAPAPAPAPAPSTŔSE��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/tagged.tta�����������������������������������������������������������������0000664�0000000�0000000�00000237633�14447736377�0017123�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����_TALB�����˙ţT�e�s�t�A�l�b�u�m�TPE1�����˙ţT�e�s�t�A�r�t�i�s�t�TIT2�����˙ţT�e�s�t�T�i�t�l�e���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������TTA1���D¬��Ŕz�)“RLZ��RZ��Z��Ň'��` „_��������������� �������������������������������������@� ��������������������������������������������������������������@����������������� ��� �€�������P���������������@�����€�€����@���(@�� � ���€���� ��������P@�� �����@€� €�����€€���������� €€���€€� ��(����������(���  �P�� ��������P(���A�� @!������ ���€�Š ��� (�€ HB%�%„B ��D���@��A����������PPP€�`�(`“�����P@€I� €P�P� �����“������P(� @�������ĚT�C�� @�Ŕ„!PX @a� �����@AÂ���  �&����€ d(0�0 ��L ������������� ��@ˇ&€" �E� (EaPtP`L��€�L T�€ ���E�� P[������€2`���”�0�������`�“�����e����e��Ŕ$@Y ™��Ë€ą ���d���0ąlr1“Ë���€I�€Ú&a€2����Ę`�����Ę�*��€ € e������e��T€I��LR6 �e�0��������&P �µ �€ �e�”Q[����0ą `�*�Ę��Ę�����&������`��”eT�`Ę”e���0  €¬ �����”Á�`®— ��€��e�2�*��“0 ������P6 ���0 ������e�“”•��”�e�@���Ŕ¤ €ÉeP6������”LB5€2���������P�L��  `RŔ\Ť!�  ��&�@�`Â�Ę��`��Ŕ��(›„���  �&�P�€2����ćjL`�ĘŔ�e�e�”Ŕ  &�����”AŔpŮ�0 ��”P �����”�0������� Pe��”•��L��  ���€ �����Ŕ$�e�0 Ő��€ 0WRíI��(›«1aĘ�(���€I  �dP6L�€ �C��  ��€ÉeSŤ  �����€I������€I¨L �0 Pm�€2 l¦j T€����Ŕ@6�L��”A�   ��@5��€ 0 ���”@1���&(���€I��&P0PF5&¤6¨Ć$ĂŐ �””��µ(ŁT������0�Ę�`�0ę�“!L`�€ @Y5�������Ę€2�„j��ŔdŞ0Ŕ$����P)«��ee•!L2¤Śj�`®V �@0PŔ$0É�L��L�e�3( lŞ@�T���&e�� ¶L��Ę€2�`(cB�Ő���(ŁePą �����L� L2 ���&@5 ���PV@5�«ÁŐ���@P��(Ł �€2Ŕpµ'á!µM¤ `�����Ŕ�Ô ���€Ę��€I`’  ʨ��ćjEŕ e“ „�( �Ěä $����P�€! a�` �P6\6„'`¤ ���*� �e@Ů���eTŁC����@�T€ � ��Ŕ€��Pˇ�@”AÂ�0�Ę���`€k*a Śj�P6 C�€2����  (����`–Á„!@ ”�0Ń CĘH`@Ő(�����Ę�  �&0Y���� ‘�� 2�PÂ���L`€)�����ćj¨Â@Ym #CŞ1“��( Ú$ �������(Ę������  ��Ę�€ �<ˇ¶„�Ę��&ˇ (S`rŮĚÉ00 ��`�00 f �e���PF›2€jµ%L5&����PŐ2�Ŕ“�a�¨„™Ă$@x’!RŔ„2T P������`” Ś« © Ŕ������„'©Ť���0 Ô������¨�&af�0�L„A�PV6 C`�̆d���€2�eĚŐf&Ŕ$SŤ!L�„! L†˛2 l&™I������ŔÂT d& É0™Ŕ$µ������¨Ť�0�����”A��Ę a3 C���(« aCĘ ��“ É(Ę€0����”A��€ a bʨĆ`Č@�„! �������� ��(��”A€˛J������Ĺ ���Ŕ†ËÔ��*V-� �����Ę ��������x&a`ĂŐ†0@��€0�����T Â�€0�“0„  .� ����“�a( O’Qca��„! ”A`’ˇÚL��`¦j ���� �@\mć«Í$Ł�&a��”A���(������0„!yõ‘2Č@¤¶9a’Tl���\¦��0! Pa&a�LÂ�������� ¬@6Sa��€IĘ”ÁŐ†0e€�€I€0Ŕ$ a�€˛ÉeÉCLj#aÂ0 �  ®6\m&eCçjL2d�”Ae����Pa(”=śĚś¬ ����¨-Ő y���( @5ž“™„�€Š‘0��Ŕ �”a ���ŔdĚ�Ŕ$ a   ”A€23��PČ�Ŕ$PxĘ™�€2&™'‡I��  R6ąÚL2Î@äáä! ��0W›Ix�P)†0�P)†0�ĚŐdžL�.›d€!L„��†0$3�”AxćÔ6u{�€0��Pa����`¦  Pa��������` CĘHÄ$Č ĚCr˝†đ$Le»pć9 Ęćdd—M€��€2Ş dć0��ŔpŮf�”A L`j“Ô6'S[€ÉÚ  &ŁĆ$3Â����x8<$O5&gž”AIÂ�PF5žDÉ0�€2¸Ú<'3   ’µ�����@6!L������eh 0d˘í g&a0 C�”A2C0��€Iş1W›IfH€0&a�„©Ű¬$2Hf��0ea”A2CÂć2HfB$3\MĆ©·@sj.rćçŔ“3”a’'djĚ�*aNžáĚ<C��”�PÉLĘ ™ j«ĂŔ† ÉC  ’yS·™ä! @fN2“3Ď(Y �®mÎI"0„ @$3d™\$Âp2(0jF ÂL��&0„ą rm“d†Ŕ&��@$󄵑@Ů“ä!Ŕ���Ę ™ �Ŕf0 ‡ ��µ%0aŔ$ aÎL„áĚ&a83�&a83d†ó†3��  0u›If’!yęŰ<3'‹Ňpm&C9 É s5“!L2Ę Č —A��P69<óa&gV d&��Ŕä˛Éá!PŰpx8 ��€ �Ŕ�(0S­ž†0IÎL�ʆ“ç9gŚ����L€IÎL� Ś9™IFŤ9™I@Ő"0��(0“˛Ix8L&’™Ăµ@f������”A LÂ$L����Ę&©7N† ”A'0„a83$ g&€ «Íä<O���`t>‡@ŮäđpfRa2Ăá98Ěä$ŠÂä$��Ŕ\mćd&“Ł ’!0 “3CÂä<Pm$Ěä$Â$ çśD���€2H†LÂäĚ�&arF r˝QÇ&™‡Ë&~Ö–Ěś@´XôÁ��”A2\™‘M ‡!g&���0 “3�����&r˝Í!eś™ &©ŤC�&arf“093PÉTdµ‘Ě„ ���0 “3€Iś™�LÂđa&g&LÂähdŔ$393��d&g&PÉ€IśQÔF&ař+oóő·ó)�„ÉWËb P Ă™ ”A2 j2uŚśy��LĘÔ 2ÉL`’™|m“ d!L�d&g& ���„0˛Éá'źççÁ$Hfr2™É™ �Pa¸ Â@„!”A�0 “3��€2 3˛/ź<ŐĘ®ĆfÝ2d&Ěĺ’™s�䩏;ú9AJ4‰��ÔF2„É$óĚĐMŁKŚśy `reËG'�&™É™ąŘ†��Ăáá“§„!L2“3“2(ĚŐfÎ9G������`’™úlOÂĘ —MN˝q!Ŕ$'&��Roó9Ďm9J�ááŁ��L.{ň©5±Ą…GT€Đ$ťDd&'�������Ŕ$393�����€2ćäyΙ ”™!aś™�“ŚZ†k›kC”!”ÉÂTPcŞAjfÚ®†�Ŕ$393���€I’‡3��������DśÉĚ$ÚňŐ†d����0ÉLÎčXťLµ'ÉC€ąŚjCx†IjcÎś#Ŕ„!�fřĚCŽŢ¤<M"cEC�����`ÂLÎL  ‚ Â����(0\—˝ě0\a�Ŕdx>çőv &Pae†�sŮĎó3€2O2Ď9§¶ � ă3ó`393��€ 3932C���(0¤ Â(ŁsŮ!L€2C��`ÂLÎL�L_íz83„ �”1W{ćë– ‚��0™sfÂĂG�  Â����ˆsž'”A��������PA„!��2��0“30sÝfC(0�&ĂÂdRŰä3?*V'3.0�`ÂLÎL�”‘0�`ÂLÎL�������€˛"!�Fí@†PFÂ�j †3Ďa&g&eÂLÎL��0“0LÂ0×mć0��@V µM 3 Ă$ڶ„arf�����”‘đ�d@ ?ÉLÎL������0“3sŮśëmňÉ‘‚hEĚ$ “j$<����&ĚäĚ��Ęçrf�e$<„ą˛ńůĚ2sÎL"�€2�����Ěe3çĎ?G- �B¨Š��*VçŚl8<ĘHxfrFF2”Í9ü€ś™�PFÂC�€ 393`Â<ç<ĎL"��0jgČC  >ő[Ť�T0Ă_łˇŞ#„P ” Ěää ¨éOćŐ"á@�&Ěä›Ďś?şĆˇĄ���$#‚E@593` źy'�&ĚäĚĘHxČ„™„arf@Ĺ8g�@ ŹZAÂC��ˆs~†0“3`.{ôčnY¨±±oM‚jÄbĺO­1ިI˛–łh€`1HxĘHřIćyG‚Ę”Soäđ �ôö) ¨*P[ć$Rf����0ažĎyžQAŽÖ–»ŚI�����” 5“ĂC€É0ęŤ3ŐČá'0ąŚ9y2s dądp ��eEĎś3“ 3ůjŃŕ@����`ÂLÎL��€ąlęŰy8Áyô+ Ľ2Ś,1ť9����&ĚókŤ˘Lqđ@�Ś�*–sž‡€Ims>ń±¬A0wŽ˘ X€ą˛Őźçş)€yžŁ&�Ŕ9<�Ěe3ę1VE�BóÔőʂǾŤµâ€��0f’R·TńQE���“Úć|ćHF$ĎpÎ W6ţ¬ă��!DTE`6s„áyjŚšD��LÝ2GW›AŽ”Ľ¶`p 3g€ 3çĚ�€ 3çk›38���PFľěa°Ś,�€2rxŞ‘ĂC�`ÂĚ91“ŹĘĆG@�*¨:“L9“�PV9aʨogY&y �`ÂĚ9Âň9ç@��€  -'óĚ93���(#gžĎ¸VU„�� ÂĂa’''�(#‡‡0ać„™9““Úćó«}Th ����@9<€É0„Ś 3“���đÔŤ9çő9 †“G“�sŮp>Ç!-šaŽ@mYTa 1hc‰Ť€@fÎ�“‹MÂŹ*"�`ÂĚ9óH9zpH1VŤ±*"�0 VŽ{¤sÎOŤ±*B��cĐÁA3g#É3śjäč ™0s&���€ 3çĚ��ć˛áϸŠHŰ|Ö8 �ˇjTj�PF’g8g&��fľ|açޱu#€HFĎ|±ŔŁŽ1¨âŕ��¨`ćś§�����@śü¬řŔ«F�@2b° 3gN0)¶ó?xŚUŠiŐ1¨0 �¨ jÔ��������LxřĘ®ń8µÍ˘ 2BÍ™�L9ç…Č̉����(#‡‡�fÎy&����@9<dÂčv&y�F·ó ®X5B�@…™3(bćD@„™3'`ÂĚ™��@9< ŚL9ç©�&Ě|Ý«ř`@€dppĹŞ˘¬–!ÓUG�QŰ,fŕ<óKČĚÉbĐŘ 38"kyţ5;´0 ����*¨Šc TŤ� Ś�0až?qŤU#�@5çu)¬2ü( j„Śa=ڶ'€Cc$ů Fx™��fÎy*�ĘČ™t;“<P9<�P±|ľî’–CĚś°†śzĂ �P9<��������ćĚčv&üDĺI3���`2Ú·*.#‡‡ÉRágl;ŚŇ€` *,�d�PŁÔŤ*(«ś0C¨Ť|mO>8����33çü@­KÇX5B�B¨©& Ş-Ť@�Ë'óĚś3HfN��0až?:ŇNŤĹůŮŽŮZ5† ���$#‹ 23çś���&ő6źÇ8P6‹uŤC€"ŞF0†8< ¬’3Ď™9€můcÔŃT8�������(#‡‡�µ‘3 sÎS”‘ĂC¨ŤŔś™9áaÎś�����&Ě|µź1ęŞ5B����H|ꪣ1h`A:8ęŠU#„‚¶‰Ö7ĚŘ7Ta@�,CŽ}C��€ÚČá!���0gfň×ÝĐUʍ¨ ¬" ���fÎy*���¨X>çYÔF�Ł7ť=h”��¤Ž,H9<33çkGĄcÔ!����������Ŕś™9ç)‚™sN�PęŠU#ĐZô/wš˝äi@��€dđ¨+VŤBD ©ĺçGcPa@0V"3u“�����@9<€ÚČá!���ÔV9a†�Ŕś™9ç™0ać̉ŚáşaŽp9ŻYĚŘióĚ9$/wđ`Ä ™91�0F¤ŢňóvvTé¨!��€PDĚś��ň<ă�@ęFÄ:ąŁÝáXëe *ŚŘ˛ĐKPÄŞ˛ *¤¬©„����ÔF?ÁĚg¬ ‚™OŤ€ąZđ=˘Âę0§RŔ9üČfq]Ç�bŐ�BŐQ#Đ9ó‡±j޲ľô !bŐ0młLErV‹2 "’óÓžŤ×5�cPa@�BšU—qs �TPulł¨Â€` é%WI��f>ç �&ZÎç9$����$#O Vc…PSvôŹcaÄŞ)��aĹŞ�� 9őc°¬íł@3Ta@��€ kűTPFľ¶G·l´ťe5HŚAŇçŕ©Ô¤É"T{$X 3¨¦,ýäí Â@c¨Â€�Śsx�����0á™ĎX��Pá™ĎX!��TđĚg¬�*xćS€3��¨íâ$™0`Â3çó\X5B���őŹ:P���*XŰç Š��€ Ď|Ć  _łŞ�TđĚgŚ���$㢌|ň?±V`;Ă–ˇęˇ:ĆU#c¨m–IˇŠP'Ďś�8ÁĚjźyâ@�"\í™�Í<35|jLÝD ¨Í膧p¨Íâç:A±j„����¬:j„�����@OcU������Ś|ř§•˛Xk·Ýˇ[vV·ěĚ �°L…°nha 1Ta@��������Ś1j€ � cĐ,çđŔ„g>ă‚F,EDž×YTĺ@��������@��žůŚU«ŽJM38™äŚéĐ0üS?ĆŇQ·ł¨Š��„0bŐĆP…e·ü\Ç!0†*Y]u����’ŹzĹŰ:kWX5˘1”t ¬Ł!I�€ Ď|j„"śüę†V��PĆ9ó@@Ď|j„�����”qÎ,ËůęŢ­5×zŚË‚ŚÁŞ0˘0bŐ���É8Y\ë8$����HĆ,‚duŚő¸ę1®!Ŕ2Ta@����RÇiF ÚnIa.´0 Ô«FQNž9‘1ĚŕjšĄoX…)ÓŚ}Ă*�����@ę8ͨ×ÂŞBTÎů©ŹxŮgúeÇ!Ł e#VŤhĚ\ÉâX+}v­1"���Ć0.�����@ę‹��� Ć˘bU:ĆŕJĆë߆~áÓŮ’Ú,V!eXÂC%E€eĐŰ왾ę#¶ U8„1.=ĆeF)[Ś…0bmg± Âk}<ÖŠŁ*`vÓ°ĚÜb@€e¨BĘTŇ1°ę�F¬!„rh›óŕ”­—=fע ,H�B±jCŔFa@€˘c u©pÔ:€«F° µĹL+†1Ôä@����¨Ťsć!ćää™p¨pÔ:€«F@1ƥǸjDcć–������� ‚Uă¸.Ű„…µŽ«F����¨`Őq:‹Uq@0±şę8ÔjËfµb@@#VŤ�Ŕ2IŁ7Uĺ�����ŚsćŐĹ9ü �HVí„y@çĚȨ̌F�PĆI~VŤ����Lxć3.Đv×Â*E@#VŤ€Ož9��PĆůŞ»*«FĹš~–±e*ęD���eś3?��*¸âŕÚv‰-!łn3Ĺ€B´«>�TđĚ_ÝW|ÄU)SU����€dŚÁE@‹ŁF¨`ĹRĐM˙ÜŮKcŔ������*XuŚUA2ƨ �ÉŁ. hÝqaŚ( ¬:B����@‹cĽ€ć°4PÁW}Ś«Ž��0†Zq@€e:±¨×x4‡’ŽUčĐ¡ë8ěęb­1i���„0â¶ÎôŞă����ŚÓ,˘p�bE­ăŔÍżôÇxY �����ÉG]1âqŐ3wiÄćBWL™tŤ‡1Ő+Ž-‹U:VŤQ±j„B±j„���Śaq@�HĆ8â!Ť¨u¨ŠÇXŻx€��@c|sř…‰±°µp”r¨Ň1°jDS¶.<°‚\¬ÇZA����@2ĆQŠXc]z ¬!��€dŚ#s¨�€Ôqšˇ.�¤Žń”Ťşâ!ŚX5B�`ęCŻń«F���° ă������uę*~čjĹEŃ Ż×ń��–ˇV�����RÇ8ę" uŚ#ŽX1bŐ1ŠÎôZŹXcTŚXu#VŁ0b)FÄŞ#�Ä�„0Ć«>ĆUG�������€dŚŁ.��T°ę/ÄŠUhÄŞ#���@2ĆQ���¨`Ő1® �¨`ŐQG–is´ŢAëx”ue¸˝ăÂĆP+���� ˘Çř"ÖvŻzŚŞ�„0bŐ1 #–FD¬:B!ŚXuŚÂW}ÄeÄjŤÄ˘ľę™bŘş…B±4"čęâZŹCڎV€bÄŞ#��ŚĄcąşěŮXWćP+4†Zq@EĘÖ…‘jĹ�`™6ëu<$��ÂÂŞ#c¨�����(âZÇŹx@��¨`qÔ������’1Žş*jqÔ€ ŽšfU 놮8bËF}Ő‡YýUʤZpuµłQ‹8 ¬h€ «*VŻz"„b`ŐĂÝż^ÇDH(вA0†Z11ŐŠ�� îĆ·ż ?šLĐŞ•É1¬`ňŠ ���1��PQ‹Gˇh٨/ý)F\uDcĐvWQ8ĚĹ[wĐË>Č������@ęF)T#„P->đ€���HVÇăřXżÂ‚1ÔŠ‰©VQ1°ę�€ÝŘă·w?ÂE†�P,‘���ŠUGĹŔŞ#C­8 PD¨ #‡ľuS¶p@��„0°ę�’1Ž8Ě™[ő¸€!C-:Ăşál}ŐAÄ›ŘfîRša­8 ���ËPĄÇĐ[÷Xë8V �,C­´[Q8 ��€´Ă×ëc ĆKăe‰µâ�EĹŔUG������ ˘Źq„�$cq@@ęG€Š¸Ćú#ëzşę Bäj]ŹŔUǨ±9]ĂjĹ��X†Zq@��€Ô1Žş ���$böńÇQuŚő����@ŤZ¸ę������ uiv j¤ŽqÔ€Ô1Žş @ęOŮłkǵ����������RÇ8ę5¸´p¬u„���€´c„���¨QW¸jˇPŚxŐG\#pŐB(.ŤAŮő˛Ů¬®Q/:@����@(­:µŽ€ĐĐƤÂĆP+���©cqÓ-;Ö_ńHĹ—=hŮ ‡ÁZč × ÎęeŮYX�@(V!���ëFaÔöýîÁÄÖk;ή— I���Š«rX+��€ŠjÝă…1 ��������€dG]PQ—¦nˇp@0†Łôşę��TÔÂUG4†µâ€���ÔÔ­őŐ~ŻĹŔUG�� „…«Ž€0âUńŞ#d™ ˇ!�ưVŚa­8 ��R7 ˇ1B�PÁĹŁŽ�c…ÇĐUG(×v׊�c¸9Ś• � ă© ,����©ă8ę"����ęÔ­ńO0Ckq@���¨W!�° Ç«Ž���5jáŞ#�€µpŐ�¤ŽcĹ��TTë/Ś��������¨Đ?> @PŚ¸ÖŹÇ¶Q†I)”ŔaX+�„pŕŞ#c¨+~ŕUG���ˇPW!���PÁĹŁŽ������Čd����É8žşë¸â€����@2ŽŁ.‚ŠşâUŕ±Ö�‹«Žăí:ł«<&Y,‘���@€Žăşă­ Ál"H W!�€1¬�����É8Žş����RtŹ^Z)ĂUʱě¬^§gňş†©Â‚˝ęÇP:.]Wú�¨LkEĆP¬˘���� uG���� uO»«^ăŻ:B��DĹŔUG° kĹ–a­2­ Z6Ö—~D–aÝf±ąńşÇUa`+NŮ×!k × *R0Ş ��cX+´ uĄźĹżÖǰ””I ��€P \u„�����$ă8ę2g]-z6~{wÄŞGȲA�����@ę8Ž8 ��€´ŠŃvµ=õĆŔµ=/cmg´*e×/űA+f&$$W!����€ŠZ¸ę�€d<ÍB•ž˝˝ čşę���PcE”6ö±~Ńź• „���X†µč®Eϰ´p�×ö,®Ťµh€����€¨8Tz  ŹxŐMl˝ę1ąZ‹�����ş4;¤őŔ«Ž��@ęęQÇq­#Ŕ2­‡9­�6«R¨Ć¸eăön=HT#dÖŠ�Ŕ2¬EĎčZq@�������@ęâiF=ę ßşQW��–µnb@éoď Z¦µâ€��–a­8 ���©ă8â€,ĂZq@–a­Ź‡ľŇłşÖ8D�¨bŕŞŔŔĄ8W$����Š«¦YÝ X8Śi­8в֭B �WcĹŔUÇX1pŐ������€ jÔĹc\Ń2¬EĎp­8 ����@ę8FĽ]u*®:B���QqŕŞi¦«ŽăZÓ¬VŃP¬ ˇ!�°,®:Žk!��ŠG-LÝá€��ˇ8pŐ8âZÄÚ8¸d!v]r<`±D������(QuŚ®:B�����uń¨# ¸ę ‡µĆÄŢ^ĆTŠ�ŚŮ±¶Č´p�an]×ô™®‡r¶V!šXýŇăŞA ÖŠ Ť!„^xÄŠ—b \u„�����HÇá—~ÄK#Ćq˝bĂÖŕ0¬‡rX+�,ĂZcÄŔUGr��������:ŽŁ.‚Ôqq@�H»QŤ�ęÔ­őK?˘��QqŕŞS&��`ÖŠ`Ž�����:ŽCď8Ţf?Ö_r"�`1´&aŔR† ��€ =Žë&���JŠW!DĹĮƀ€P¸4ĆWý — �� ®šfZ+4†µâ€Bń¨ÇZGˇŘő˛łq[D >ŕ˛A�Ă­  ®:Ča­8 ���HaăýqĽÚ@ pŕ­6T;‚‚Ťa­8 �–Ĺ«ŽăZ BqŕŞ# 8pŐ�€��@E]<ęĹ«Ž���¨Đ]üńz<$��Śa-z†Ą…‚1¬���¤č>^ô™.J ��0ĆĐÂ!®:B���€dG]ćl· 1�č1®Żx@€eX+���öřÚ>Ëî®<ZQN.v ����–+EAe„���©‹cĹ!*µp¬u„�������¨QŹq„�€ŚÔĹqFDŕŞ#dÖŠEgúőz|�����������PŁ.ă ©ăXq@���:ŽŁ.���5ęâQÇXqÄK?âeưV`,^ő8®u„âŔUG�€ťµŻ_éÖĹč*:¸$ŤŔU‰e[I/ü6K$�€ pŕ*ÇXqŔe@t†_Ë0‰�����€ 0`)9¬‡9¬«µâ@cX‹ž±kŤĂî ����PS·ÖŻögŮkŃAE\í íĘ€�@(\u„� Ţşc»2,�ĂZcDŕŞ#ŔÖŠ��şú¨Çq­iVkʼn ���°Lë6;ÖŘőUŹC,ÓZq@���¶ÓŹöťĆ?`łD‹©^é,–H������jq¬8 ¨8đÖMzâ\u*\u„€¨äÖu?ŠTRšŐZq 1¬G¬8pŐA����€ŠşâKCFÚ]Ôá®:B@®íYĽ ��� „WŃÖŠŚa­8 �@´ě¸~éPX,‘cX+�BqŕŞ#dY-®ăˇ«Ž��!¸ę ‡µâ€€P¸4ĆŔU9¬d kĹ0±ëKÇcčŞ#��� ®zŔÎđ×v4'$aŔŇ%nYĘá ›%����������‘1 e!���íNł}„���¨QŰłp­8 ����@ę8Ž8 XDZâ€��RÇqÄaή]ŐőńC^–H�ĂZ1ezŐc¬$�Š){˝ ��,ĂZqĂ*<˝jšŐm@T¸ę�l¦+í;›] 1bĹĂŤ­¶čhXÔ/ůA��������@ę?ťýhoň@€P€­dąŇ z†-… µ+0]żĘ!‰��„m6Ö_rB”BARk¦4 ��€ĹÔZ,ĂZq@�� u<-Šk!d™í®ěµbĘŞ^ăĽl������:ťq@��RÇń4;Ö+����©ă|zëŽ��°LkĹ�Ô¨ Ż:B�Bíłńץ0�� ���lş•Ă ���Q- - �DÇŠ�RDZâQ8𪲪:Žzj„����HÇŠ)«µĆWİV�Ŕ2Ű]…��TÄW¬+â:Nîő‚1 ¶hT ���^u„��QqŕUG âŔ«Ž��������5ęâc!��5꫎@ĹWˇ¨8đŞ#�@(|ëŽzĹ���–áXq@���@E]|Ô�� Y}Ó݅Š×z|čUťŃUh( Şh€���`ÖŠ��� F]|Ô�„겻Bá€� aŹ_őńX8đ˛DËŐ (Ćz=rY"���ŠŻ:˘1¬5ˇ8đŞ#�@ =;ţúŻô�� bĄ!©¤ P<đ5ţh7šŔaPşX* %�0†Öâ€�����:Ž#�*ęŠ/ýľ”ŇŔË�������"ăxę «%`á�*Ľę‘�ËŘZń€,ĂZń€`ÖŠZ†µĆaw c`¬Ň:Ně×5†Yă Š {˝`Yđ˛#*‚Ěh6®żäSfW=ĆU � ¸ě ���� ľuG˝â!‡Ý*F |ëŽzŃĹWťfőÖܸ±.:¨hŔe �������HĆă����€d<ŽzAuáUŹ�õâ�Ş Żz^ŰłđZĹĆşč�������€Šşř¨G�€P˝ęŠÇu=Bc¸V<@�ŠŻz„� ^Űłx-z€�Ƭµ+|¤­ $�0†Ą…�€1,-ś˛µZGĆp­x@���@E˝ęŠÇu=B��c¸V|H^ĺ”Őµč����¨¨W]ń¸®9,Ó Í@¨˛ăúKČ�KCsÚVh�������@dLCŮ €Ęb˝%Z7Ö+P@ŹÇo{Cx“Ot±���†ĄŃ\şąôr™&�@‚I+4€�,¦Ą… ¶2‘”R(Kšfµ^ăŘl …ˇmá[5' Zd±iĐ Jf0%Yl  6H��`LË&Ó˛„CÁ^ĺŹa»„ €„,6� °´iť—Ę�€�MŁ˝K@���Ŕ–%LPPČŘv±±Ô¶p‚ĄM,6� 1x[ž¦­¤`± ¶ RRš´Srk �ˇ‹„đ˛���ˇ8đŞG�����’Ĺă±�RŹk<�ĹW=BĆt]ă������(QŹÇaŇV¦ÔhN޶Ă$�$hL^¶Ă$���� 6Ą4ŕ’ÚK@������ “–0-m ��@PÂ/=„› $��0†eI�0†­ťR+'+AŠËŃ®FĐÔ¶´0€���� fв¤ ‚Ĺt]éÄ꺢gňjá�����BcD•t„�����PQă��������HĆńqýKĺʵ¤ Ä–%M …Żň ư,éP0`ł��@PQ…zŞ’Ž��ˇ1˘ u<ąŻ—OŘ×Q–p¬‡Ň`­8@��€±řć¦ŮŻ%�(„ŠĂŢ-1\×1â¨+«������:>í(®…1�ŤUŇ ĹW=B���� ŹÇř(<ęŠÇµĹ—QtŔŞÇĂV=>ĘBCąFsö˛&…Aka� ˇÉVÜĐĘ@���0†eRHXÚa’Ĺ Ç íE=W˝®Ô�€aÖZ@� ( ¸Ř °Ů@ łµĹ ŘÖÂAEąŘŘrQą´´iŘĘ@���ńKNt±DaĐZŔaĐZ¨Đ�‹¤¸ě ���€=Óż.‡I�€`± [›e CëĆhia��������ŚiIiÂĄLA0¶v¶2Ă µ0�HdV:B���Ćp˝ÍŽkK`±€ xŕK ail��ˇ1P%= 'öUŹ�����@E˝đUŹä����€d<>ĺŰr¶2���…—r06,opĆ•ÖŘÖ–p˘›=Đņ 2¤í&�����„ —2‘ò Qh%©i�ĄŞjgńşŽ}g �Ćp-i‚€ 8đUAˇ8đZ“,edł!%Ř$…€—$�������¨¨ _:ĆŔW™R‰Ăľ3(ôP–% ��ˇ8đZ\ä.–qÖZ@��������P'M¦ËKŔaĐZJ`łiŇZ@���Ć´,iB++–ľ.Ód�`LË’RŤĄ·oĂ`łŚłÖÂ�����ư,i‚` Ë.7,[ČdHŰ-L ����@ÍéËĺ09 �����@PpŃ.e ‚„K™‚��°XiÖNżVçÂÚf„ ,a����€ đŔĄL©„ľŞ1ZZ0Ű®ěXW ��������*ę…/cŕ«Läжá.6�( »-&·rŠ$Ř$…�› $���� ( ¸ŞMI¦Ë-L ��@Pp)SĹJCPßvG]q€��€�Ç×K@€$ ęZB“I‚Í@ĚÚ6<ŔĹ������ ˛0-ŃŔn·p’eäĘĘP´� .eµíRN'»XĆYka�����… —2Á–%M‰i·–°„ �¦ér �(¦eI�cZ–!‹Ąĺ <P� #v»âlá.6���…»m�����DĆ´¤ ���D¦)M���� ˛lîPư¤‡iyii2`łDqV Eśµ&ĚÖŠ��` ×5����JÔ‹e"‡eI�ĆĐ–đa¸ÜÂ Ł­†+oh2ŮŤ¦Ćäm;L&�����Ć´,i���‚„Kw [Ă!Éf ���AaÂĄLA�����‘…i†lݎ… `1\Ú)ÚxłäÁVFĂŢ­É4㤵0€‹Y`‘ÖŢäĂp) Ń�› $����ĂĄť†­ $ �ŰnvL��TLË����ˇ„ —2…*VÝm逢ĆZĄđŔ—M™ĽěxX3I$���QńŔW=B���@HÇ×K�,Lp±T ËĄI»¤ąTs´µ0€�€â¤µ0€��€Ĺ´,i‚����@Iĺ…K™‚� ¨}6|ű6|€d4Ŕf ���°\iÜJmAŚ•†ÔŐ†¶…ĂuĄ‡ÂĘÂĐőlł���,†eIShá/KĂ`› $@Fl6�X »…Kxp{-1Ď.p [ŤÉŰvL��­…„„Řl`łi°ęh4€�YŕbC(4Ŕf �Âm7:…­ $ U ŔĘ@���…  iŔ]m˛Kz›M ‹z_Ú�Hh€Ír´������”ІPJé�@2ŽŹăŹiyii�����cX–4A��cX–4A�� ¨l¸”0b· Śr �Ŕp(_ĘŮŘV¤A[ĺ†vIrł��0¦e‰Žąe1 ��ư,i‚���‚hNßîÎMŰ�������”P¶đ˘§đb �� (ŚŘíC‚ŠaYÂ�������(ˇ¬ěáUlčÖ€%LˇĄJ+:B0†ë@áŁ|ĄÔhXÚD 4Ŕf �„ .6âlia�����cŘ–4A�‚č\ůbi‰T¬,´;Üކ‡v57m7p" ��Ŕ@{˘‹MÁ`P{…Ť��(±íÍ �����cŘ–4AA´µŮ9ű˛ť&����TÓÜ/˙‚Î ’6ˇŤe$�� 0¨š0€�(aËůÜŠŚłĄ…@h˛- m™&ŰŞ9ÚZ@���@aŘ–0€(†m � (LŘÚá`›M$���0†mI�Đaş˝„( [ ������ ŞĄ ©« mK… —2˵ÁZ"`bŻŻĽl!Q„]î¸dŤ2Ń–; ć8YZ@'K uܰ|…=´KÜXúňKz°l˘8ÄÁlia�ĹÉŇÂ�@X1I$*†m f»^€šÉmGÇl[ĺ†e ��� ˛ŮD��‹a[Ň+[ ŔbŘ–4�@(áˇ/ iŔĹ&����X Ű’&���������J*[8•CP(ńŔW9…j•Ž� ¤ŹÓw˙˛đŞžŃŐ“Űrô\ůÖ¦d��޸a÷ E Ł6I!ˇ=›H�������€’ʆK9!(Lv­ … € đŔ­ n6! ¶���`1máay9nĺw»@Š0[ZL¸ŘD�€0…aŰĺ†e “É�wŢĐŤU_Ű(LéR�\l"!ˇ.6‘�������� á2ÝŢŇ�������J(nĺděpůr8íděË76bF€â¬ °D 4ŔĹ&ˇ.6‘�������€ʆ[90†mI����Q-MH­ ©č0Ý^Ň�������(ˇl¸•C&ÜĘ���������€Ę%ť†éŇ$��ĂŐZÂ&�` Ű’&((L¸iHşfP(ĂĘÖŘśl- �@ n6‘��0F{KtL—’p€‹MHĄ±9ŮZ@�H`†Ý6äf ����€1lKš ��������B8öá–NC�c¸Z¶0QˇÚ3(4€�����c–4A�Śaká0•›M$��‚„Wnh’:/µ- ��������@Ő¶í>P�`1lKš�… —věb ������ nĺ�€1,—áĽŘD��,V¤R† ‹ukh·p˘�[9L¶•ĂTíŔa°´0€Ă`i)Q‚‹M$@BÚ3(4€��€Ĺ°-i‚�X Ű’&��„&\–ÓdwŢж0€Đ�›Č ¶ĽČ4%ąÉÝl"�����€Ĺ°-i -Lpł‰Ë*7,[a� 8l- ���Jp+‡ ����� ŞEs[APex]ă������P¦îőÓ÷pXh’a¸Ľ¤€â`ia� 'ध«×(�Y7' „ĘKm ��€Ĺ°-a��A:L·—4ĂlYŤĺš+ ���°¶% &ąI .6‘���@(iZ4 wµˇm)âÂňž Ń�›H�€Ś¸Ts°µ0€��������������@T ‡©M� Ş•S{ne"Řîµ€8–�°®Ö,rěRŁ[9 —îl-Llí0ŮĹ&�P€-/v¤„DĄŇL @F\l"�ŔbÚ–4��€Ĺ´-Ńą¶A°6������@T ‡e [9���‹i[ŇB ÝĘ�������@IĺĘ!µpŔÍ&����ŔbŘ–t€���Ő8,é�@(á [wNí-F0Leˇ5“€Ş\h`Zh[@������€’t ąú±ą_^ĆĆ©‹&K„"XL"��€Ś&¸ŘD˘b˛ĐÉľ¤˛˛X-K@�����ö„Ó`›H������‹iۆ‘ÜöĹN � �%ŚŘË †����� Şq؆  lű˘Ă(gß¶‡É�Čč`[4·˝ŃCş• i˛,i�°0…r ���������@Iĺb÷ –0‘ĺʂԺąpYŇ@…&ąH .6ŠŮ˛¤Ai°+@@Ĺ .6‘����Bˇcúe; Lp± ¶˝ŮC»m0$Pś,K@����� ”pŔM‡ ���� ¤pŔM‡ �@NÓËK:€�(¶%š“«dˇ€ŚjŻQ§Ą¶Es˛-i���@(ရŤb¶,C˘„®Us´-i�������„BÇôŰr8$»ŮDBUlX~{Z®x����@¦CyiĂ�ŽeI#L�� ěňĹN Mô"ŕĹ2��������°°p[¦—2‘���@(á€[9������Ő8lá`ĆŢíXH �€Ĺ°mĂY Ű6 öĄ���„BÇôŰö0IAsňËŐcÓĄ±���������,†muĎ Q†Ů˛¤�������Č��€¨Ćá°LP(á ‚�‹aۆ©9¸ą9©Â†í |ĘML$ 8X–4€��Mp“‰`Ű›ť2:Ř% —2! –% �@FÜd"�@(á�/2‘�ŔbáÖ†[™H�����`1lŰ0%đ"2l{łÓ` 8X–4€����şÜtů-<A�ĹAۆ'y‘ i°,)ĂlYŇ 4X–4�Mpsstitě& �����ŔbÚ®ć†mK“©9ůe{ Ś&¸ÉD�Š“eIŇditě& �������‹iۆ B Ľč@�������°Ó§rv¬ÜvcöĄ@q®·¤�@(မH�öĄ���J8ŕE‡ �����(©\đ˘Y®l[�ŚęšA �J8čÖ;\~aŁ7w›JD�PÝŐä0eôsÜ®sTU2�����J8čť6µ- "dt°Ë0\şcpitě&Ń79Lp“‰�'Ë’2šŕ& �š“ßí=Ŕ"DË’�������()đ˘C���PR8ŕE‡ ��B {­`Ô=2šŕććತAËÍÁ­= Am)ăZ¨yöR������%ô˘Ž…BÜ …nÂd—a¸”‰�@q˛ěƆmKÂ��ŔbÚ¶4€ŃAn2!M–% ��%p+‡Ýd"��€Ĺ´miŘĺÍ=6Hˇ n2‘��� ”p€ĹlYŇ ���%ô"‡Ph’›L$@Uł—ĺ4™(v˝—ôˇĽ ĂĹFą˛Ń{ĹKe ę.ľ,‡d��Hś,KĘ0[–4€��¨5H+-­ö’ěröĄÉ`‚›L$�������%đ˘C¨bÚ–4Mp“‰„Ś&x%sË79‚ٰ]Nłk‚ˇ7™H�ČB˘ćjN[Ф$����B Ľč@��,¦mˎ鶤AŔhr÷LZD��BIYląÝŇ�2šä& ����`ą˛ŘŘîšI�‹Ůޕئ§ôE>Ů-›»˝˘ eI‰ąÉDPŲµßÔ0��(N¶eH”a/ ‰ Mr)‡Ýd …&ąÉD�@F“ĽČDŽ“mI“ŘazyÉŽÉeI“In2MC{+)0‰+Gî|LlaÇÁ¶ 8Ŕ¶/ö0����:&żuŁĚ����`iĄ•)”6Ą›M$���XL—mJ”a/L „Ś&xÇ%+Ҷņ¤4Ř–a���°îÖ’[#ąJcŰÂÎ —ßŘP���������@(á 7ť ś†Ű—Ă'ىŚ������ŠtŔWXTmá0Ř‹L$���*Vím&)9L–eŞÜ°ýŐŘcË-!�����*¦mÉćä˛ �…IÝWH¶0�(N—F‡AŢÜŹM˙vq0Ű™!ܦC´0!ś)Š ŔE$"���������„’xÓaŐŢf’€… nĺ4@“‰@qş,Ă��%äĄö" €âdŰÍŤ]mI8 ö" ��Uąlí/e„"îv٧ôb&"��� 8ŮZ8 ö"± űËE2CF�������� Ó˘JN˝HF�$ś˘—]4� &xq·ą°Qd 8XÔć%/ŞAä@"!‚,qodI���`—/2ŠL�@qŇU©9ą,Ă���ŠÓ]/ą-f_ĘĂ`Ž“m�����ŔbşlÓěň‡d/2‘�����„’x“‰BIx‘‰���ŔŔ}­$Ą‚Ĺtąš¶Ë0ŕE&� K‰š4b¶-Ă ��@(é 7ćhya€µ·ň0(N®zI¶0ăŕVž†›H���@qrY†����`1]¶Ń1Ý–a������AxŢކ#L€,Ęe [n6‘€âd[†€NĂËËp*0Ó^d"!Łą·żI`“ĽH,Ě®Zrk$[D�������,¦Ë6MŞbş,Ă `a’™ćÖ6“”@����@Í˝˝ ����Řĺfcĺ·n”™���(Ŕş E&���� (ŇAo’‘ăd[†������B7vxő[Bĺ0ĽŘDŠs˝ a§%¤¸kßÁÉ68ФA"��°.Ë0( nĺix‘’ĽČD��������� Ş…Ó6:§Ű2 `�������˘Z8mÓ„ŔbşlÓJ:Č‹Lˇ…QěŰ2 ›$2��PślË0€YÜ5‘ĆŽą˝Í$%jěśüvűđ¤6"!…I^d"����@(ĂZY` C(é$/2‘X8Č‹L$��ŠÓe0���ÓÝnÎľ“ ŚVXT{)\aią ������ÓĺęذmtJP¬A -Lň"�€îöEia’™ČČÂ$/2…ĺ2 7Ĺl[†Za/’Âd[†Aa˛-Ů1ą-Ă��������@(餗v:U× ZÜ1»Š…/ŰŃ9»•€Y8Č‹L$���������€’Ú ßÂgÜ— LI���%śô&Â`[†������ ˘öđ §i/ô v’XQa  ��Y8É‹L$��Ŕb¶·-áCx±‰€, P¬Á�všŢކ�����€Ĺp٦AĂöę؇ŰßŘ(� ŁIkYfWh��Ń@V’‘� d%‰âT]gŠ“Ĺ";° ÉHa����������€"^»`’•¶‰4ÁdvšŢvA$€…Šlá÷ĺ¦$��������Ŕre æ)�����€¨Ćé0M�X —m:48É‹LFy‘‰�����,†ËŐ±ér¦y‘‰Dq°-Ă �@F§r›†›M$�Š­EÇ&{‘‰������`1\¶i’��@(é¤78Ŕ»}“‡ÁDqrŐK¶…A„Ň­ E �Y8Č‹L$����������� ��ját& �,¦Ë6MŞbŐe­\ě4�������já´M“ ���€’ŇIov]ŰLR±WďY¨…ĽŔD†0��������D5NŰ4©��������(©ÝđCřľŔD$ršŢ. ,A Ű2 b�dá /0‘������� ˘öđMO‘…ĽŔD�dá /0‘��X —«ca‘´H"�����€’ŇIo8Y —%Ëm^iÓ˛…Ăd/b"��� y‰'Ű2 Đ©\Í 7›H�����ˇ¤“Ľă¦Ý’l “��� ”a‹5H��€Ĺtą:6lďÎ}¸ýŤŤ$›hŠ �dá /2‘�����Óe›&����ŔbşlÓA������%đvřň%›p7Í:W]lJâ8Ř–ěśÝÂÓvc“"([ŃÜö‹8#�����Y8Č‹:¦®m&)‰���•t’H�‡Ë2 ĐÂA^`"��%ťä&�����������˘ZtěTą)„Ţp Ăe��� ”tÄľ\`J"Šm77\.ĂาPZd ���J:é &�*é$/0‘��� o»Ď ˙Ą:Ë:D6ÍÝ€3Ä‚¬ #���ĹÁ˘—-¶ň˘Ë"uLnE`•;Ü~ @��ŠmĄ������€ĹpÚ¦I,†Ë6:/Űł‹U“��������°´f)-}ëF™����€…é˛MňŽ›–—Á]€Ś ����„mnd™���ÉIv‘�ŔÂt©Ňi*/0‘����� ”tŞ^“–a�%ťô ¨nË0âä˛ ��,¦Ű2 b���€ĺÚ†M� ”tŇW±Đ$-2„îžHK“����‹éňrř$ż„Ođdd�����*L·%;&·Ý±ár&‘§ŕĄ%+é)}ą ILĂ—í)ą™D ����� *w¸ý����@q˛¨RĂdSE“���¨nKvLnË0��P—;Ü~>@Aö˘ŽŃ­ĘMöU\–a��� ŃÓôe— Ä��'‹*M »x ĚHÄ$Ä�Y0dd����`aŘTQ&������€’ÚIo8„.†Ű2Lb�ŠŰ2Lb�����������(©ÝĘNGěËFcr[†ŚłË2LPäaúňS y/  ŕŢ]Ěĺ0]\"†”Á.7ôD-Ó`…Ś �����ŔbxµLK{Jo6‘����€PŇ©Ľ©cp[†I ���,†Ű6Lb�dá`/0!Ś^Ęł±·ČB±¶PZdao›ťž´÷„iŇda°ÝźĚFe™Z€„�������AI'ř"? nvIćѢî*%Ń@U‰0€,ě&2��ĹÁ]ä6|¤}Y@–����Xn»ąa{9|˛ ‘€âdQE9Í���������@V¤vÓA����@�@Tăá0Írˆ h8´Ű!»Vä2|˛/`"� {‰ �@qpY†IÄŇ�Ĺ d�����@(éTľŠ¶»ąár& {‰ �ČÂÁ^`"��%ťě7í® #Î.Ë0Âě˛ “�����%=¸×`"�Ăm& '{‰*.Ë0‰âಠ“H•›]űKť2…ĹěŇŘcÓŰ/Á)hoäŘdÂV›$3f¬6IdÁŔRB��� `ďŰ[öb “ ‡"s‰����ŠS{[‘”Ä��`1ܶaS\–a˛0ĂľÚła(p˛—e88ŮLd��ŠË2LĐÂÉľâ¦í2 śěŤ pš^nɤŔAÝŁÍ*‰„F•CŃ n$€ŃŘŰ_Ŕ(Efb�� 8ąTĂ$bi€bĹFϵż•i ꦗ[„@qrY†ÉarY†ÉarY†I ���€,śě &Ş8¸,Ů1íe& '{‰ �����‹á¶ ´pdŻÝ.p4W^–) cň_ÔQR8Gb�������X ·mÄ���Jz(_(ĄÉ^ěôPŢ(ĄÉŢ`"����+ ĄE2��BIöF)Mö…“˝ÁD@Nö���„’ě &2��*áÁŢŕ p˛7ČČ�����, ·íh˛Ż¸i» 4zh·Ăôí {Ś€GU$BĂ™FX“€“˝Řé n !Âčd_áX’E&“˝AFŠEŤ0»,Ă$—eÄ�����€ĹÂŰň)˝µÓ}#GÖ6a –�����T„žł©23�f :›n������A Đ”Ť2��Ŕb¸m‡ :îű¶ť†‹ d�dt˛7ČČ��G›îěŕâ"9 .6I$ ��������� (’ŠĄťÂ‹Md���ĂĺvřT| iĐ-'ĹH(¶šČşd„Ůe&1����€ĹpۆILqôŇ>Ą7›ČČÂC»†3�˛pŞ^[Ň$���������€¨¶é „’ĘČ������ ŞńaůlěË LI @qrY† Z8ŮĄ0ŮL$Nö� �¨Š^ţ@������‚ş/˘}ŰEŁŔ ��G«ć$ą°ŚLq˛¨˘LD`–스(ÓCy1§şD 1:ŮČČ������şÜéĺ/Ů"ŰA,ĚU4‰ŃÉv‘Ml!m×Ůä@­@B ŃÄv0Ř22������€…aÓ 212šŘ22��@P¶ i°¨bÓŠ;·Ý$‹ŠzĚţĄE%X¶¸KF@�Ć™WĹ(1����ŠE•eRâ`Q 4go“˝Ři¤6 !������%<”/0‘�������€’ĘŰňv6÷¶‚,Q\şA“˝AF�2:Ňľ, KD��Čhb;ČH�Čhb;ČH���X6‹Ać4XtY&*Ě6J› $������B ĺ $�Jx(_`"�„ěĹĺ & Ł“˝ÁŚłË6M"��dt˛7����� (áˇ| €Šá¶M“�@(áÁľŔipŮfs"dt˛77wńK°3µa‰���d4± 5 öšÄ X₎‚jěd@ 8XtY&BF“Ň{`U29ĂnżČA`����€ŚŤ+íCE[R.i Ł“}QçlAÉ!%h˛Đ@��dáÁľŔ�a���� ”tŔ˘-L`±đ¶ü4ü(.h`ČÄ\€�ĹɢËLě$��� 8YtY&ŽE—e"�PaşmÓ$Š“Ë6M"��� ”đPľÁ����Ŕb¸mĂéĐ˝Vq´}IÁ·MY0«m%3f9<xŻS°$P•;Ľü-���˛ŕˇ¶šÖüÂś”™���@…%ťD$dÁI~ NaWHp€m®ÄA`�ˇ‰öĹU2BF���d4± ădŃe™���Č,»Ů N“E—e"@F»€‰âdŃËËD�€Ja“Ő›Á(�����������AŚŠ[2 V]–‰€â`Ńe™8ŽVÍ©¸›DL�ѨYM˘ťČ�����06ěęś i 0`"ŁějEB������@†ćŮ»ę(qĂä‹âÉAwQ IĚŠ$’™I�Ähb$#�������� ��@‘«â&�������Őxxś7”‘�(6U2Aě H�€Ś&Ą÷ŔŞÔśĽ«ËĘeD@qčŢ6MN»mšś&·mšś&·.› Đ‘ö]ź°bH"���dt˛/0 ������€ „§ĺËCô&�����������P¤r—ľÝ[m’Y i_¶¸¬YD“��������B ĺ”aŻ~M‚ŇŘđ¶| µŻ–ò|bo @y!/ąüŤ€@˘‰®I!��ŃÉŢd2*.H×t$Úł§–u…D‰���������J ĺś@�‹áĺ2Ť0»mÓ$�������,†§Ëá .†—«cŁ×Y&Ž[—e"����dáPě°};üH{Q$ P �(Nn]6‰€âäÖe“�P;˝ý%:ĘŠ€��@q˛é˛AąBgÚ:`Š ���@,»ÚM F$ `ÁÄ.Ŕ€������‚"x(ľÁ€@qXuY&�����¦Őb‰¨0˝tŮ$ 8yU—•»Cěi“�'·mšD���� ”ôPľÁ��ˇ 3¶|÷Ţ,÷Ňá" ��€âärwîÇŠ_áňŞ*IB�����:ť¶_ŞQ$“ěbEB�����'›.ËD�������@Đ{řňfp�(N6]–‰������������€PYđ4äXńrÉ&1��� ��€’ÚSů'@(éÉľ ›.—iĹÁm›&���˛4I±…2ô\ů/ŐIb@·v›–$â8ŘtY&���@Ez*_č@ ��X /Ű4‰���@(á©} ����������˘ZôŘ©i$�%<­ľ¶ “(^¶i��˵[‚v or-<”/p Qܶi°đPľŔ����¨¤§ň…†p(_h‡ňnş-) �����€Ĺěv­H6¦˝mÓ$BĘ—0„CůR8Ş}A Ô ����������`1Ľl‡�@ €ĹŘËv8x(_č@���������%µ·ö Nä8z«=M{GF…@Á ¸�dÁ¨¸ Q0P ’`˛é˛D�������€ ¤§ö $����XL/ŰđpjľŔ���@…éĄË2 RxěËoČI¨ tbv ���'›.ËD���������@‹]ĽË> î6Q$��Łâ @����@AŘĄ JqÉj‘e"�Š“M•eb@ŚŠ/4PlŞA€&Ĺq“,q+��PślŞ,���˛`T|ˇ ��v<°2�����dÁ¨µ¬Š2�ĹÉb3ô°ć›b–(�� FĹ®4opqŤ„İH(S�€Łâ‚ ¨ ¦Ľ‹Ęd3·ňŔ¦I!��@<”/”#mó†<B7ć,şÚD‘�������ĹÁ¦Ę2�24���2;™Ěš €���ŤŠ €�(6U–‰Ń¨¸˘`R\Đ���p«;8 ����†U•eJSlŞ,���tcO_Ţ N„ŤŠ 2��T ›Ý˝8ě´<°iĹ›*”WęPłK&ÂŁ‘•;a7äHíHŠfş"'[s!]UŔ„E[IIPÜ–éPŕÁ~a„3 €�€âĐ˝etL{[¦I�€ŚÎ´_şY˛€ łŽ˘P.4€��������()<•ßÂĘ7( VUĂlUĹŽi/›ěÄíH����������,ĚÖ-Ĺň´]•e"�@L–ö(öĺ ‰XUŮ  Yףr™~ro$3` öpQW%I����(NÝ۬~hnH„ŚFĹš»"I„�������� (á©}Ł����]îéw/Ad"@"ŮÝĄiAGńš…°�·şŁ@ �������� (‚§â·ŕAqC9ÎVU– ��P¬Ş,��0„íîŕ *€ Ö|SĚŹhm¬ŮK›ČwÍ�������������������������������������`@€�������� ����������������@�����@����������������������€ �����������������€ŔD�€@����������€�@„�€�R����€� ��� ������� ����€��(@���H � ���€ ��P€��P@�P@����P@� �P @€€��P @€��P @@��@A@����@A@@�����€ � ������ ��‚���� �(‚@���(‚��€"��� @ �P2@( ” ����”�"@����€� �‘� P������@EP����•<É$��� ��``�€É(€�€������@ ���&� (Ŕ�����€Ić( �L��`.P&É`P@� ( @�L0�TL��Ŕ$� `&�� �)Ŕ&��((��L�€‚ L�����L���Ŕ\¨�Ŕä‚��& �€BÁ$���Ŕ$P¬HQ�ŠI@(�B€ąT� (@Q���€I����D���Š2„™��€˘�Ŕ$��0ą„I�¨��”��“����������Ŕ$ĂeŔ �P�L���€I������Ę��`������(�&ˇ��Ŕ$Tc��&�Ŕ$��Ŕ$�����e��@��L��“@Y��PĆ$ )*€!@µ LÂ0�Ę€2�€ÉePm����€I`���Ę���€I„��&ĘT�€2ęP&€2�Ę`0���€I��€2`Ő�€2���¨�ee�C��(Ę���€2����������&P `B€�����0I�”@YCj��e���Č�`B��”•�”A�������†0 �0 @@Y��P&�0 ���Ŕ$L‚Ú\Ťá �P����”�L�����\a&—A��€2��(+›��&)›�Ę��������€2��(&��@�@��Ŕ`������Ŕ$Pm����(c�Ę��(c�€ ”e@��”e�����e�����L€ąÚ� Ę��Ę����������P�  ���”•Q����e��P��€2Ů$�����������Ŕ�����eLÂ�ĚŐŕjő– ���PĆ$ �0 0)j��e�LP�������P��P����PV���0�`� Śj�0(¨�Ŕ¨Ć��@@�Ŕä2¸Ú0������€!����µćjS7 e�ĚŐ�†��e�e�����@Ŕ�����s5&00É@¨�Ę�†Ë† ��`�`C@5ć &�€2¨*”Q 0ąl@��LBŔ¨Ć��&Ę�(C���Ŕ$���02€���€2�&�«áI�d��“����@P�LR”���Ŕ$e��”AŮpŐĘ�( �e�Ŕ$e�PP�eL‚�”��e�������L�`��€I����“� ����@m�0�0 L2���L®Ť„���`’2����&`� Śj���Ŕ$@���(�ĘÎLe\F2„ ”A�0L„ @µ!�Ŕ$Ú�L`e“ ”Ę.Â0 C��€IÂ�����Ŕ$ a������ ŚIfH٦sµájC��¨Ť@5&@���������P��2�€2€2��„!CŔe��������€ ��&a3 CĘ�Ŕ�tl’™dć˛��€I€0@�“ˆ0�” ���PĆ$LS L�”Á <!�0��L„a¨Ć��  ��&Â�����””Aĺ!<†02Ę���PF†0����e��e“đ†0@����@ŐR[€jL��„ @Ę�Ę@e�e@������PF3 LŕIfrŮ$ L`O�”•A1¤Ţ ��P�������”����L&�0�”P 沙Dˇl€˛  @sµ™dć2€!LžPF�¸l�`ĂáI2ŁC�(+�    &�Â& ËÚ& Ŕ$@P�€2��P �& ÉL†0„Ę ÂŞ����P�L`Č!™É†0x&aĘĘ���������&a&™j0 3É@���€I.@Ĺ epe&�0! �Ô”�������e�e���ee��@0Ŕ�( @����&aČÚB�`�&a0 C��(Ę@L¨ą6„�  Â���“ ÉčVĘŠ `Ô�„©Ć“Ě2€���€2€„! 0 ”‘‹I������“0„2�Pa¤Ś&a���0 C �„'g&a��Ę @m\mH¦2dHć9™:mË��€I:6 ���eTcLÂL2Ŕe<9ó$ ����eĘd&a(«-aŞ1AĆ„ą ČTáIÂ0 C��Ę �”Ax3É0„!��&áąnóÔ2@PÂ@ĘF2Ô†0„���(0�C2Â��PaŞA��ʨĆ�(+3aC�ĘŕĘ<'LÂ���ef������`®Ć$Ła†IŮp�   ����Pa(0Ož\ ž„!Ě$ áI�†0�Č€Ixrx������  Â��2�„!C2„! ���”A����&a� aµq5Ą1á!ČruăI   ����&aćLµ˛„'0�0„!< Ŕ†!3„'™'gž„ˇdŞÍä̤Ő2�C�tÚp€j†! a��ĘęČeCjfĘ ĚŔ$e$Sa�¨Ť«Í$��“ĚĘ Ě������C’�€If������ef`Č a�ÂÚ¨1aćşÍäĚP› pe#—=H†2LÂtŚ„&aČÔ'[0d†0@„��†«=ő-?ś™\l <$˛@��d��L†ąÚLÎ C2&gÔ™jsÝxrć����j#@0 “Ě���” 'ĎśĚ@„y†0��“ W{ęoü$L†0��L„! Pa†�'a®ŰÚČ �0„! �”AµÚ8 É„2HŮpťm’™0epŮŮf��(ÂPm8<&@d�µ@f�0ąl83đäđ$L„&a�����L  ÂL  ’™�C9 Ěś „ L  „!<ŞA53�(0��(d&���Tb óp9™ ���LÂ&������@Y�Ę ™ �”A2  ®öpx8L��������€2H2™Ă��¨-Â��`ÂĚ&xrxB†!L„¦ŚS a’™“™���L‚ěĚ&Ŕŕ2 3—A2��(dd\mćśg<9óH‹A®mrM‹do’0Ŕ&��µ… —­v0ˇbäĘ C��ŔÔ �`Bm�������@$C€ Ńv 3ˇ Č „ �Ŕ†0—A�Ŕ\6“ŻíIÂ�`COÎ<ÉLj#0a”AB„!�P[&�L`ČL€2 „ɆË&a@eĘ Ő2���€23���ËfľnĎs0Ő Ě�€ L  2Ŕ™��0!3�&aČL�(0��&©ŤĂ �������€Ée“ĂC€Ićá3'Ë —A0 “Ě„2ćä™d&��L�†3��€Ifrf����� “���”ÁŐ†Ă���€2CdžśgN†3�Ę&‡§>-śh�ÂđŐ~83óI0a“3�Ę ���€2C����¨lIfNm“ĚpmĎÇZ4řYѓʖ;}É ���Ę ���€2¸lćd&™ �L`rfe†Ë Č 沙śç ”ÁµQm8üpFŤ9Yo3HÇś@fÂĚśD�(0\Ćśkű™'Ť5@H�Ŕ™����”Ajeś˛©o<ś&����Pa&��@m LjÔ6É�ĂeĎ _Ű$SŮ8źsÄ„0a†0��€ ™ �@Ő†\ouc& ��€É�\í™óő6�  RŰ$µM áË&— ‡™���L83$<93WŚd–A ����ee!ĚäĚ� lÎL€2Ła&�µ…0áů˛©ö™É„I„™�@¤¶•0������ Śj<ÉĚuc3€˛˛0„©[2s„™�Pa&��PÉLĘ Ě¤l83ĎźzC’‚ ç É0ś™���L`8ÚRŤ!ŁÉĚeE3`Ă™çŔpć90ś™��€ ����d0a†3s¤¶I �€ �  Č 93&g&��fr´MÂĂŃadI0(›„‡3�`ÂČd&�LÂä<„‡Ďóä‹Ez€ÚHÉI����d&gžd&g&���Ŕ$393$39Ł™ˇ¶:e�C�(«ä2Hf”…So$ŚZ‘ŔĚ›sć'g&Pa&“Âä<GJ$ ““���Pá!óś3O20†Ú8ĚĚĹ Ś„™�”AśY ������€2HfB$3¨- �ËfÎyž�0a&gm�Ę ”A �����”A®ľÚ3ç<G�Pá!LÎL��†0ś<S��ś™0A‡f†'çyr�&™ÉŃÉp$C&<$źD ŤS6uĂ3s˘I€2Ş1É`ÂLΨA��›sć'źÂ̵…6L2s13Ę&áá3&Ěä$39‰�€ ��&ĚäĚ0“3��`R6ůđC�  rm“de†���•-çz›“�Pa&L`rf��PÉT+K`ÂđÉ323�€Š‘ŻmŮW› ›|ž#��€ÚB0�(0& É3g&������ś™� ٬H`rfRa&Ŕ¤¶É‡���������frfef��Pa&���LÉ™ç0Ď9çhÁ$C l>3™0““�LjxŔe“đ LÂ09‰l»¤É9g&�LÉÉ$šŞmňÉ���LÉ5Hžj–Ax¸ R3É ¨ť!���ć˛á|ý<Gx2HôŐH € 3930sÝF7&y €2Č LÎL€2� l>ÚBxY��  .{8<*Ć9ó(đ�€ÚHfÝÎĎÉ39‰PĆžh���  Â3™Ŕ\7Í <ÉLÎ a&' ˛přGŔR[.#á™™śD���€ óśĚĂ٧Y<s0““LÉW‹„�€ 393—‘đ(#á!�ĚeĂ9˙DE4ÉbHx€ 393©- ĎM"�0a&gÔ <&Ě$ “3j$<¤Ś„‡�ă„rf��LÉy¸¶9źú!ÂLľĐ¤O>™I�������(#á!���ÔvµóL���0“Żm���”‘đĘ <�Ę <ŐŞZć3?s&(#amśđŁ'Ŕmů A�€2žj„ó 9Úr5&y`ÂLÎL�¨Ť“Y·ŻŁ’ÁňŘ[2ř,<ó9������PŮŞc\C�*¨ŠC[’z"áÉ ÔΩXÎÉ�0— źóI.)(;d™ä��ĘHx&”‘đL��ʸZM6“˛"ˇfrX[řđ<g��� LíđL�€2ňe‡g��@Éy†şÍ�(#‡g�“™É™ 0\Űä?ú�Č�� ĹrÎ<��Ô‡§ 6rx&�Ô‡ź€ĘmČđ|¨`��PFkKÎ0LÎČČá™�PVśŔL�€!|x>ŐşśĚ#(ž��`ÂLÎL�0“3CÉ™ ������Ŕ„™ś™��frf393™0“3�0sÝž ��ĘČá!���LÉ™ ��P6çĚ«}†<0Ăgč« Ž9hđ@��$#‡§���&ĚäĚ€ Łv†< bśóüDfÎI„Ú€™?9I��0sÎĚĹČáA0aćL"�0\Ű“˙č�–I DM&<yô‰K66°0 �Ć ���HF PažĎXkEŤŠ�����”‘/{ŇŤI�fΙՀ2rxH9<„2rx¸ŚśaP;<ń”8łŢVaHʼn2@&̜ə ¸¶á3× 3ůhEh��€ 3×íáđ&ŚÚëv08Lɡ-׆,w0x2H4‰�����PF����(#‡‡LÉ™ @9<�&Ěä<CÉ×Űś;x0 �����¨`ćś§�&<ś<|V4†8<€ 3眀 3çk38`VÉa=# Ś�ĘČa˝ťd83ˇŚ��Lx8ůáX!�$#?3gŞI��`ÂĂÉǢŚ<Á™D`.6ü©c` *›E �����”‘ĂC€ Łö¨6óá!†ĚĎi‡Çk=ŽU��Ć ˛Y¬-;ę€Ä Â€@2b°ŠŞ!L&Ź„č-|pŚU‚1ŕÁ1Öv)bĹ@UÇ$ť`&1s&�(#‡‡PF?ažyΧ.BDM"DHôś×–<8�Ęĺ~p@��HF 1AoçcłŁÖ¨! díü\ăQ…¨:�Ęj!Â$ťŘ6‘ $#dćD��fÎy&����PF(#‡ÂĚ9OE9<�����0“ĎłcŤ˛,žźq@�B–ĹsŤ���*¨Áyô/����¨`1âŠc„��@µŽqŚU#�€1X�’Őkŕz¨jYlBë†���YAˇŚÖ–śză<��@Ĺ“'!3����&3sÎ3�������€2ř𳎑fRa@ÉĂ`23gN”‘ĂŹ™9��“a’9O™�ŔddÎ,;gR·çµĚŕ`1hpĚ!�eóeőϵ�BQšŤ(933ś<z"����ʸn59Ě &!3™0sÎL���(#‡źäáäÉ'A9“3Hôä=ńGĄ‹Î°®q@Ć Â! 47´"��HFŚŞaň‰Ş"B;řŮéÖ59�”I…PaćĚ9dćD0fA3gp28uĂŹÍF­8jŤ��@ó¬:ĆŞ2'd” 3'��0©m>Î�*ŮL>ńGĄˇŰlTa@�����€dÄŕŠ9ç© lÎɧÖĹ ÁD"3�(#_öäĂdćD�fŽ}’IŔd„<ČÚÎś����0sÎł���PFľěç|ęŞ5B��¨`ćĚÇ\ŕŞÓ¬T6 -ÇUDZ,BC����TŤä#":Ł@™ �“a®mÎ$ŔşÍ‰�ĘČá!0aćśEÉç| g¨Ł%Č̉�����€ 3'3Ě9Ď3Ý&Ň1‡�fňyŽXë«R&������*yćä'ţŤA#Ô¨Aqđ@�@2rxş¸ÚäO<$�0F .l٨_ř !˘*eRa@���$#‡‡ Ś|ŮŚâč���*RWÇÇx����TŤ¨˘Ć! ÂĚ™�µ%QnśżľMÝBH^ŰÁ��¨`ćśg"óşeĹd;z0 �����PÁĚÉ sÎŁ >ĽbŐĆĐ‹µĆŁQŠĚś���0sÝΑrô�€ ŞFŤ5 çzX� yâ?8 „4«)bćD VŔ‡bŐ����$#§žísÄ+®¸u ‚1¨0 € ŞŽJpŞu<bUʤ€��� ‚™Ď!‘ĂPŚëƀ̣p@�ĚÁB�ÉQÚŕ?ő�ˇ Ůş±…#VŤ��!Pw\���’‡‡���(#‡‡����PVí†P~~â±â"ŞFČš¤`č& ŞI�ĘČá!Č����&Ěśó¨‘ĂC�Ęŕ“®zá€`,VĹcëB5âŇC–Ĺő���`4° ��¨QUăt%U#��Ô¨ŞŁF���:bÔ ş}*ň @móŃ)÷śg=’‹%:şWijThł‚EáôŹŽÇZ#„¨¨!���j›Źň©5B0°yj�X��Ě™™sžXÍÜ#$Čś#!0s¦nx„‡JŠ�€ĘĚś9��0äyâ?8�EDŐÁrxĚÁźxÄÚfQ…° *�ÔF��`ÎĚśóT� ×ŰZżđ# ˇ¨!��€Ô IÝT¨*;ÉÔ-řŕ@(#‡§ě$3ź|Pu"��PFĎś™9sČ!ÉĎÁS#„(É3'Śam8ţPw ś.ŁÖČfq˝ĆC�cPa@ˇ¨: ŞA­CFB”dćśI2s"�¨é|F­2†ĺ�“��0s2óµťüG¬:Ś{]c�ÂŞŤˇ ����T•Cf�”‘?W<V ��@2Ć`�$c �Tx朢uçSPP?ńŞÓY­Aµ±±j„@ ��cÄHwV%D@�Ś,� Roóç§łG- �����Uë1ŽqŐ�€ęŽ #ĐŞ0 �����T n|˛•fQC#**ÄL(ă~TŞCk #ŞN ÂÉLÝ4��PĆ9<0©ßx¬#V Á2Iż˛Çzá߲a—a��aŚ«ă˛A»‚l€‰éŞă����’1‹¨`ŐXé ×5���Š©îÖż¶? ĹÂäe�` U`bzŐă±Vš© # X:pŤk›ŤU!��` U!c+€ VŤ5¬C���É@kŤĆP #����@ę"˘Ş XPać3Ň·’“#�;˙Ő±aŮóĆJ ®®:5†*Ś1TaŚ[6ôÍ=âò±~ÁňŔ R¦*Ś,C-Ś5’C–ˇŐôÚA¨ĺçźô™Ö– ]!��˘bÄŞ1�° U¸šfđ Öpź�žů(Fä™s���µq?��������Ô¨UÇXC!¬X5†BA4PŽ�ŔçµýS#'ĎëlÜV땞ÁuĹ!�-íť ©„F,Ĺ´«�����PÁŞc¬ *xč[…ô�¨ŕ©ŁF@8yćĂ<8 �� uńŇ+>®u:»ăT…‡4bŐ�1c¨[včÂCqë–¦™Ý]1jĐU#ÂU#�����(b]ă�����PÁŞc\)»ęí:[Á"`™¤@E@±j„«F����� ‚UÇX@2ĆÁ�� u1b8óDžźzá�����*XuŚU¬:j„���������TpqpŤc„�€dśÎPC€dŚ ±b)FĐ®Bš2Ő˛3¬…ÂU#�0¦ŮagX ÂUjŮÖÂ!¤l­G\5B����É.�������)"{<¸–HĆiF ±0hW!���HĆ8¸ cÄ5°j �*jĹÍj4¸p@�������jęVü¨ŹQ��ËP  Q×q`Ő����PÁŞcŚ!�@2âQݏj �`™#†,kN80˘®ă@]Ça» é@c¨…ŤˇVDD¬CaĐ® ��fŚ:Ć�¨Q«Ću¸u(„«ĆhbőŇxDĽę1–E�����¤Žqŕ#VŤŃę–şpb�ËP ��¨Q+VŤ!����@˛”A-¦ŽqpA������jęÖôł:¤ˇ8ę…X†Zq@@T¸đŃŢŐ!h;C)š \q@��X†Z8 �TÄ:ę…S¦şÍB¨��HăŔC±#bŐ��¨10°cŰ \AłĐW}ŚŠŠ«Ć€¨ńlgc-������������€Ô1.�RWÇXݵĆh`ŰU ´ µp@�,ĂÖ!TÇŔÚÎĆ«Ćcm3Ş‚C`D]c@Y„�0°zŐq` ŚjL’Q1bŐ�X†Zq@��Hă°g*…*†�����:Ć±ŞŞ>5†��¤ŤóÁ1bŐ������¨3Oc #VŤ!���€dŚ � uŚ‹�¨Q+Öv–vKˇqTŐ%Ĺm]J ¸â€��€ ���*ŇnýńíłŹ×-:Ű’(¨X��B±j Y†Ą#~é]Ć2©E���0†1t ¬C����$cµ‘ŤŹ: �1�¨ uÇ…1 ���� 㨋€6>4N3Ľ^ÇC¡eĎô Sj%0 µâ� \z@�������PÁŇŮ âRFÚŤˇĐi6ÖŠ#F,ĹX•fއ9lN¨4bŐ�� RżĹ?ŻăŁ4bŐHĹęUŹ�”­ Ć€`jĹ���PÁŞŁĆ���PÁŞc¬!�(â:Ö` µč ·.˘t@@T ę®4şč kĹ�€¨±*ÍTkDD˝˝ÎĆZq@�����¨HwőăUÇP´lč7÷oÜ����CŻ54†Zqb�«W‡cĽęc\6H������@˛zŚë±®#��Š«Ž����€dŚŁ^­{ş�ÉG]eGe¨…��5tÇÇëx`Ńľ®Ć†Ň(�������˘ă‡4h· M™jĹ�������©cu5jaŐ,C­xČf±¶łX+ŤŤz­‡• PjĹĹUG4±zŐăBqhá¨ë ‡Zq@�B±ę�B±ę0WŹu!����$cq�Š«*VŻz` µâ€���PS·ę«~Ś`tĹGĽę ‡Z1eއ9ÔŠP ¬í,VéqhŐ����RÇxĘŽşâˇv†Ż×8,F¬:H�X†ZqC•‡®:B����� uŚŁ.ÔW!������� ăöLë–uĹ–Y· 1 �@Tڏę–ˇV���j°xÔ����¬zŚm¦Zq�Âa»Bá€� „…ăíŮcýŞ>K›Ąˇ¬A 0zóm匄B\vĘ® "”V4@����„0â­;tĹ…phᨷł¸JŹ!Ë0âŞhÄU �c¨ŠW! dgńŰ»G, ĆP+�����¨¨UŹ:B���¬z¬#� ‚Eg+*F„íV(„k;‹kĹÁjŃłxŐńŘş!‹RV&Hť®ő"�����T°âÚÎĆ«Ƹjڎ…G]�ڎnŮQW1�€1ŚŠkäP+�Šu=şę��c¨šŘzµgVڏÖ��ˇ¸Ö4S­8 ���*Xx¬c®u„Š Wë:’1Üv1.ü!<lĄ™đ ;äE'Yaią �€Â ´ĹÔV �°¬JaÝhw;ꊇ4pŐ�����*jń¨#ĂZq�Š«ŽP(ŢÖ™~Éř ‘¨+žvEA°l�˘F„6ÖX-Ä€���€ŠZ<ę� ÇAĎp­8�ŰÝBá€� 4(ÓëÂG«Ž��� ucXÖŢIŠH–ĆSĹÂqĽÖ¸Ô3ű†)D¸ę hYŞ_k��ĂZce× cÄÂuY6˘`Ŕ˛A�!¸ęưV<PDZľĐ3XE‡Č€Ş1B^‡Č€Őftë 8 Ö˘šŘú˛c���!:Ă×ëq���X¬¨Ć±Ł®#��ŚáXce× c@ˇ8đćÖH]]ĂÖŠ�Ŕžş NqcG­öٸ~ŮG0�������€µxÔ#ę8ęŻđ-–Ha�����@Iaŕ­;´ô´”#�€eV«ĂÖŠزQs?ä˘���X†µč® *†í–9Ĺ–a•ŻŰź=^nĂÓŇFąeŁ)´Ŭ:– �������PŁ®:ČY­B  b`]UŇ–a­8 �Šu=şę–aÝfÇvQő˛l�€Ř˛T]ăBŮú‚G¬$���ưJŹCWŃČ~ýE‡ ������"cHx ZĘ  ă¸ľÂ€ qmcv}Ů1D�ĆâÚžŤŻm8j–HHqm@��€‰­Żň$�ĆĐÍaiá€��–á¶ Z _mTeX+����¤Žă l}i<BW!���€1âŞ#„¨qŐ1���HŘÓgk�‚eX·ŮQW<„W!�Q#˘JJłZ+��DĹ—čęŐ«k=É2Üv…-‹«ŽÇU��° kĹ���¤Žă g¸V����*âş®ŻxbBTZ1JÇZG–a­8 ¤ă¸ľâC`bW¤¦łë_6% Ł�‹E™m)OX8 �����¤Žă-ĂZq�Wä¬[…���¨ŰÝő���$ěřˇă4ÓŻmšD��ŔŔÚĄL���„–rŚ–a­8 ����€:íÖö; ÄăZÇ,3÷Ň­©ŘúÍ=¨ěA`%Ś!��,ĂZq‹«ŽÇUq®:B��������¤ŽăĐ;+�����©‹ă¨‹�RÇqÄEĹŔUDZ"Íľ®qE�Ŕ2¬„¨v·PöĚvW!F,:ĂׯÇŮ,2JĐ,…���� jDTIcQqŕŞc âŔUG�,ĂZq@��Ŕ:žn~ëĆ(4GěKÇŘ\čŠ����RÇń4;ÖŇG JÇŠ«Ž!�0°őUŹ+\u„DĹ«Ž(:¤hTĄĚŞhPQâ® F( VŃPkŃ3\‹������5ęÂq=mwE@Űn,®×ô™¬˘QqŕŞ�������¨QWýЧŮ׆!A���AqŕŞÖŠ����€vüĐńHřŇ)],”‚J!�Ĺ«Ž1��@˛t6V<ƵŽ#TŇő8®/:@�����©ăXq@° őmöcýKÁ� ”đpÁ—‚�®:BĹ«Ž1Ű­ťa˝Ćř˛D ��������…¸®Ç ‡ˇZ+(P¦aąŃ ¨¨a–»,������€¨6*Ć ����HĆqÔE�$ă8ę%¸ę(\u„����Śăiv¬+Ň«ŽeX+�BńĐʵŽ` «č١W!�����HÇ�PŁ.ĽęÁŔÖW}’e¸­ŔÂ…ôë ÔQqŕUG�����������¤Žă¨‹�HÇZfkW«ŽC�����(:ŽŁ.��PŁ.>¶gtwb@0°ŰW `ÄŠŻ:BÄ�������©ă8ę"�������jÔU?ęÇřŞ#„Çő·ŘPJ  8h+®:B������HŘńŁ> QqŕUG@(Ľę€1¬Ű٨ Ő����Ô¨‹Ź:B–aŹuĹăÖ [p ąl��� *ĽęÁ2¬G¬xč–=V ��� ľuÇvX8 ��€¨Q%Ť�€Ôq<ÍŽúíěGý%'äA)”@�*ĽęA���X†µâ���©ă8â����€Šx]Ź_áGÁ€­;&ÍĹd‘Đ2¬EźÉ ů‚‘™łśÝlJ"���€P€­›ŁµĹ $�*Ľę–a­8bĹW=B��„âŔ«!���������€déě1Ů®jáUŹh kĹ�� ˘¶ěő…1 cX·Ů±^ńP¬B5B���ĹW=B@^ő�`,^·Ď>ţµN­1 –“K™ J°X"��C[ĺ†v•ʂƠ´qŁ~ɉ �ŔÚ&r�����@Tă8ęQDZčYĽ®ĂC»Ń �������Q/u,,—é ���j -ĄpUtI'Ř,‘����[nĺ0I���% ŘĘ�°ZácĐV† ����€uŮÝBá€��5âŔ«Ž,ĂşâÁ2¬+�Ŕ2¬+��€´Ąˇ!�PŁ.|sC5Tc¬8ěnˇđ€���:ĆÇřé6H����X ­Ń–Unh �ŇZ Tâ×W$Żm–’H����€ĐÍĆúKNd���`1´…ć°,a‚��€ĹКò„ � tąÔţŇ °UcÔZD°Ř@ŽŇh���¤ÇqÝč��C[ÂAe4·˝łS�‚Ĺ Ł‹ $���ŔbhK ����� ¤˛p(S¨2¬+`Ö���������¨QăČbݞ1,K8±ZW<Čä‘– :fMR±‰6Č·[śÚ2Qĵ MQoĹ•@�����0†UKjÇc[&���� ¶n.,Kx@��ŔZ‹„âŔk=Č…WÍ-Ś+EHę�™˛×%ăC­2”¶„°´iĄ $������Aá×úǰ]čŕ°Tnň@¦0(Ť ˇ[H��cXµ¶p†]6 ���` m•Ę%=ŔV�CkaĆ�������Y eá0LA����Č��Śa(·îXUŚCN»k\ńle �Ĺ×z�€1´€Ć-Ő���€Šşř©{Ô·Ůc˝h�P8đ* �Aqŕµ$��‚pŕ[mŞö «µč„i­x€���� ÄEďÚŔÖŠ xµ)T kĹ‚1¬ eÓîŻ-"�8®–qR¦>K×MBD›ťh)i Ë…`CZ.4) Jˇ��Ŕ¤Ţĺžh“ˇ´!H°”���łŢR�` m ČÖŠ„PLěŰwÂ$ ŘÚ„Ú"le �ڎ-a -|ó[hI°X˘”® DŘčÔ^h‡A)0%Y,Q4¶|±Ă�…,6��( ÚB€R Ą eźÉË2‚,6€ iąĐ 0(ŤĄA[hPÚB��@(aŔV¦PeX=cŰB@ 6H����X ë ŹX1áÝWÓhΖeôŻv:”&’H������,†¶„ ��(Q^5ĆŔu}L˛I^v���€Íjih!�@TxiŚW=BŠŻz„€PxŐ#��BqŕUŹ�„âŔ«> Żz„����ă¸ĆoÝŁ^ń ˘‡,z켓˝Éu”F8Ί)@‚Ö¦A„ě´ ¤�^6€Ĺ°®qÂj]q€Ă°.z€����€ŐęŁMÓ˛¸Č‰í*0€����€ ĂŰĺ0‰�XLM§pYŇ������ĄJ‘† ��$ăq…GlŮ4űőR©AŠ/;H�ŔX\×ÇC{ˇ§´ÝÂ������� (Ą iX–)��ch[zŔĄ HCŰ ¶2�( »aÁ•eˇ���0†e d,lmš¶6„IL­ $�ŰkT0��������Śi*J¨ Ż6����$«ŹăôěrĂ0€�cZ–0…l–B€W9„x•�Ä�„–×żä‰ ����� ]v»…)‰��0¶6MKH&KŁ�pH˨ ´6 ˛Ř@BB H�����UěX˙ÂC�Ř,‹Yk4€�‚€­L ^ĺ�’±Ë"é�H€„,6$Xl �����DĆ´¤ ¶2�^ĺAË}VVŐ¬ľ$ ârđ×v8tZ*/ň@�HP^¶Ă$���0†eIT Ë2$MR°´iÍ����� ( ¸”)������%Ô+>čŘvĂ0@ư,Ă.6�1�A!‹].�…[™‚€ ř*S��$ăqŤ‡9,Kš X¬–†Ö����TpńQŹ�„pŕ«!�áŔëút±‚0ŕRFś-- � .e ���€\ř*S` ו�áŔW™ČaY˛9(¶Ő4·üní]`���Hp©ĆhW€„*/´´@1,Kš@‚Â`× ”±ĺĹ ����AŃ]ëĐcX0A@PpéŽi‘TJJ‘Ž� ľę���*jŐ(éÉęc}|ü*O°…Ô`ZÚ@ ”`ł@aX–0‰$Řl ��ò¤ ò¤ "�ư,i‚` Ë’&�� ( ¸”)��� 2¦‡ˇZŰĺĐ6=L´Ü¤4U[y %Ôµ ÇĄö&T���‚ÂT]8ř¶} %Řl ��°XiJĄ ¤ 0„›ťq— R'X»Ůa0�”°··p &��@B\l ‡ÁŇÂ���hš./aR´ \l Q–Ul� T±aůT���������%”Ťłv,lKš@0†eI*¶6›Ű.�ÂAš–6���� ŃÜĺ; B¶m�Č0l·0�����dsřr9 .FoŰÓS{q�› B 6H€„l6�������€ �� „˛pJS������@d ‡ö‚[™‚�cXZ8 şČ\l  ( v­…FsrŐ#h4€€1[[Ҥ4­–0(M–ĄIka B ű¶"!�� ľę�����¨¨/˝âc[¦ ���������€ę\[¶pJ*aÄ.WXL ������@ ĺ…K™¨°ÝK Š [¦RL9 V˝ m¶’"ŕ%)Łő/x  0i- �€ 8đş¦A6ËbĄd”}Đ— $ s˝Ĺ �������PQ?ęŚéşĆ‰ŐuĄ�����Y<éŠáÚ妵- ŕ0-K@���Ťř+=ă^–4P)’H�¦e Ó˛¤  T±ăú—= eł�@aZ–0 t‘t­@ˇ���LZ{yRk&‰@h€Í����� (L¸”)0†eI���€Č¦4Aư,i‚�cÚ­ěrąVRiC�Ët]ă���QńŔW=B�€ĐHŮúŰ;űli•2H��€1¬·±çŕÎ+K@����¦ň҆AҰÝÂ���ŔbX–4A�����€2Ş-Ë} *†e ����������jLS[±˛,i‚���d��PRŮ8•) îjSŰÂ�ò¤ �€ 4˘–t„BôL˙u9L&�J°«[ � K ��€ 0áR¦` ��cX–4A���%Ô —2��������"KŹÇ`]€ŠzŮ»…Ćp-i‚��–++ 8^×#­xŔ—M$ŠĄ…@Â.6‘���€ 0á˘! ¸hHÜyCYÂ����� fÁ–µ‚hĚ]–4AˇÄ_2„/IaÂ^2"ŕe �������€ÔńxŚ�©łÇc|L¸”)�������(Ł^ü(S¨˛řşýY쥤P°Ů@BFl’B€Í¤Iká�������Ô¨ľĘ���RŹ…ŹC_e �Ŕbş®ń€¶xöúKy:Üä.6���(N–�������PF˝Ą}Ó†—[@��Čh€Í���ŔŔ®^Z˛XZ–0€�,†eIB .6 Ë’ĘÉŰ2‚l6��€â´,a���B .e �„ŹřKOt±���JěZC X í’}Lľm‡É��Čh€eulÚŢŕ‰ …@f&‰Ŕh€Í†P(Ă.› 'ąUs´µ0€��Đ�›Ť@koňaşµ§é¶ˇ�����€1,Kš@€ 0áR$�€ 0a[“m6‘�� (L¸” Ŕ–%MPPpѸŘD�ŔĶ7; &���€1,KšČò¤ ��@¨bÓö > °ŮD�ˇŠ¶·áiŰÍŃ¶Ę ËĆŽU‹” NÔa´•Ăt+Od3ÍZcsÚUŹaKŔaĐZ@@aĐZ şÁ)”b’H�@1Z–č¶µ0€��‚Â)űk›R)‰@qeÉ«ä ������őŞ”˙7›K fKcsÚ˛¤'ąŮD��������Y4-Ń»,i‚�ĄZ”Ťm/”’Ň`ka2H`ť&°Đ“Üě�2Ŕ•7´- ���€1[[¤áAn6‘Đ�[5G[ ������€ʆK9���JVŰ®ľ°©É�‚�¦Ë«±ˇą]$%p‚-/vL�������@P‹>ĐÍFś-- ��€1lKš ��Ll{+§Á :¦oŰiްŞe‡ť¨„„Ľb’H��ˇÂ±«ż´#N�Đ@7y˘›M$�� 0lK@��ŞŘ´üB?Á‹M$��$0ŃÍžhSĘŁj‹ž“_š,1��€ÂTݙРŰr.e"�����b˘cîŰvšL��ĂÖÂa°‹Mć–ż5ź2%��@B,,"PÜ�I!ŃMžčf ���IÔ5Ł%<Ân¤Ád‚;mh[@Hh‚‹ $��€ pł���‚pŔ­;.- �����€Č8ěƦíp¶���0†mI“9lKš ��‚„[9&\ĘhŇľ}IÁ�Hh€‹M$�$4ŔĹ&���c¶¶ ®ľQVXh���… ·2ŰŢě4����€€ 0c·MÓÜl"������3Ë4`/ú@7›H����AáT.SZhŘĘD��0†mIAaÂM†ŕf  cňíęÜ´mi�‡ÁŇŇ��������ŚĂ2L� ( hĄh ‡­Ąé0\^Ň������ ‡îZÂyÄ•ĄĄmiŘĘD��ä¸iy“SŮĘč}[†™EËͱË*—Ö6@Hh€‹„•ĘR¦áR&���Rpł)LĂĺ%ťLşÉÝl"�P,KĘÄÖŢ6:ťäMžhe2"�� 8©Şd� ˇ.6‘( ¶FÓ ›&Ë’ŤŃ�›H������ ”0áVA���@ÉbÓö = š“oŰi2� ˇ.2ă���Śa[ÂaŇÍ&���‚„Wlh]ę]6™ŤŮ˛ OňJ›H��a�ŠcŰ’ę¸aůFOPË’2Ě–% ����‚„[9���€����‘1Ú‡éĺmř /6‘���( Ű’šŕf �ŃÄľ}‹Ž‚U‘!ĂŞ•M"…AUĄ�€„¸ŘD���������� „rIĎƦo—‡A\ÜlK@Ë’ŕ" ��€ 0á¦C(4ŔE&�����@d¶a‚�… 7‚������DĆá0LPPě^Á&�vŻ„-}™H�� (p“Č�™H�HÂn2‘��AရL$�����f¶a’�Ŕ¶m$�AရA�‚Âď´Qo3•rË–�P–Ëđ$/rȰۦ˛ÜöĹ‚$¸ą9Ř–!Q˘x˘H!ÁM&r,K4'Ű’ Asňí걹ËĆ������Aa­ť&ąÉD��ö “��@PÂ>Đ‹L$��@P8ŕĹ“ŇĘrË9 In2‘( vKνׂPrš,Kś&KŁi¤ŕ& ����%LxŃ�,¦m›JęžA âd[Ň ��``Ű—ę±hďb’n2‘�(N–%š“mI���°¶m@����������”T¶č±‚%JBSĂ�����5ęŤýuÁ4 ŠaŰŇ�ŽS{‹HxŢÝK°„Ë’��€��ˇ„{ą`J"�,f{[A X ŰŐÜضĄ������@Iဝ„Cxđ" �Ń7q¶,)ĂŞe1I�ŔŔ¶/r’Ýd …&¸ÉD���@(áŢäz ŞÚA~QOÜmg˛ŔX,KD�����€Ĺ°mĂ$‚PÂ/2‘�����…Žé·ËĂ$ÍÉ/ŰCf�@FÜ$#PTKD�Ŕb¶·48…›M$�@F#ěr٧pł‰Ë’����������QŤĂa �öM&ĽČD€Ĺ°mĂ�‹aŰŇ��J8ŕCšŕ& �������(©\đÎ.ŰĂpł‰������Ăr™>Č‹LHeI€â°\†'y‘‰ČhR×›“m‰ć䲤�ËÍÉeI�����°¶m ����@Iĺ‚ŰęÜéňKx‚BF#ě¶ÁD@q°,i������B ˝č����DŘáKyLŔbض4€���…ÎUż·EŮ����°¶m �ö  ”pĐ‹›C{­ÁC¸ŮD������������ ¤ráI‡�…^t ��ư\¦ň"ă¦íwiĹ‹Dlͬ…����ĂržäE&�2šŕ‰ŤÉ/ŰCVX–4€€â`YŇ@…&¸ÉłeI���������"ăp&�`1lŰ0A����jŃa+�€PÂA/:!”pĐ‹L$ŠĂUK˛„AŔh‚››ŁË ŘĺÍNšŕ6µ- Ph‚›L¤0��PlKD€ ť“ß®ž›.K&»‰‰���€Ś&¸ÉD���@N‡·—č ���X®lî°§«_›$W`”â Ş’Z\Ö]ˇa°‰â Ş’V­-&)‰�������°Űp(:ŕE&�„x‘‰�ˇ‹¶_ ˇ]ŇTym“!‰�€â`YŇdîü¶= 2ŔM&���2šŕ& ¦——čd’ÁF2¤As7÷\÷‚M€"†d°‘Ś�U//¬’ТU/…id[J0Đ›úüĄ$F��ĹAµ¤A�ČhR÷DZ &x…MË–���˛p€››Ë’P¬vsŃ"©I"���„xŃ��„’&ę•·ĺ4™������€Ĺp؆ -đ" „.vŘ~IOÔh’›Ě8���2:ŔM&����°¶-;¦Ű’2a/d9ą,i����…#öv!‰�Śár56¶]ŤŤ]m‘¶IÉi°µ0Mv“gŰ’2a/ IŰ’2̶% â8X.Ă÷šH 8¶% "��ŠmI������� ¤rŃ‹A���@Iá 7‚���J8čM‡ �@(á 79 P¤Á@����–ëz*K’R� ”řˇ—r:Ř‹L$����…+‡V�����J8bo’��� ”pŇ›$��‹án›ä���B 'ĽÉ����Ŕjś¶i’,†í2|Jom(nN®˝ČĂbOđ& (¶Ý\n“Ôd !ŁĽČD pJ[Vcö �Ń‘ö" ��@(i˘E‚,qpkOŮk&KJa/dcrY†ÉÜ1ůK;% äL$�����%śä&�������PBąé ‡ �������ŚĂĂôI_$ĆÁeyŠ.iYµmwa±¶„ ��P1[ í´´\†AŰ2 "�����������jśÓ$ �€¨Ći›F¬\¶i ”pŔ&xˇyQÇಠ�������������”T.|Ŕ! „“Ţ`Äɶ ”0ĐaË7ů˝ ĂMËK A����ä&�ĹÁe(čüe{ĘL�@q°-Ů€]ľČ(2�����`aŘn‡rIňz·Y` A$+ČČqĐ5Á4Ů Lˇ„š4H���€PÂIo0‘ŃAŢaÓr���€ĹpنA�ˇ„“Ţ`"������jś¶iÄtą:6wŰž¦/ňě@BŠ®Š"(tH�����,†»Ëś÷­xL������X.Ű4I°X¸-OÓů�;ČH�]E"�����ŔÂp·6č’F\Y í°´\†AČh’H€Ś&y‰Dq°-C†Ů¶Ęćä˛ fŰ’ÍÉe��������`1<Z›Ę“˝ČDdt€/đ|Éť¶x!&ÄH,D‚ d2rśŞ«ĚEŃ­K{«’ĐD ����€âಠ��������D5NŰ4I����”Ô6,Z0€Ĺp٦©r¸,ěŘpůŰô3X'5—eČ0ą•ÓÔJ�Ëݱç.a#ŕŃ@WI|!3° R$[U `"dt7 U4ŃŢähpŐŤ’ŤI köÄŔT(€âT]g’$�ĹÁ¶ f[ ‡É^ä 0É L$@F“»'° Ď´· : w×d3 �Q&+Č]E"� 8Ř–a�¤.Ë0Ęmnvä&�Ĺɶ›Ű.Ăŕ0Ů–a�����ŔbşlÓ$J8Č ĺ6 7;LňŃ_č\@FŽSuťI’����������€’ĘM/ĺtŞî‰´4@ˇÜěp°H������@(á¤7u.Ë0€lű"9¶Ý4vą �ä&��P1[ -Ĺl[†A��������D5NŰ4bĺ˛M�€ĹlďR4 "�°.Ű!Đ /0‘���‹á˛¤Ód/0‘������€PŇIo8 ޏo-Ä6J$�@Fy‰�ČÂI^`"���X —«ĂŘe ‡É^`" Y¬]ކčb¶PZd ���X —mD���@(᡽LĂ;m´v1II§Ö®D+–’Ü=‘% "��J8É;nZ^ě Ĺl[†A�������‹á˛M“J8é &€PÂI^(±cĺ7ő´vł)‰Â���������B '˝á‹á˛M��,†Ë6M%a_6:Č L$������%śô†“жm6%�%śŕ }’/0‘���€Šá˛ €Ę•«Xú˛=L[ Ód/p8•Űa¸©aŇn4ób‘M�����@FyǶ_d”������†­şĚ¶4äĹ'ŰQ(mŘţ%:;�������`aXtQ$˘8t‹Á]@F˘8Ő¶‘,ŮÂ’nĄ0[.§'ÍĽuĐx`ăĐ 17 â LDČč o‘����¨0\–a�X —m äĹN{‘áař˛I"!����ŕWa'‹7I…‰;—EŮ€‚ơ(17±—·th&@0¸µě&�������XL—mD�Ax8Ľ˝¤Ódo‘����¨0]–aplË0���`1Ý­M¶ĄA��XL—«Ópą SĽÁD� 8Ův‡a{9|0_@B����@qZTŃ ��������Ęhírű[4SžtU‰±iö¦šeF��@qŇUQ$�������ˇZ8mÓ$Óe›há o0…ĆkżŃĂbChá o0X8ČLˇ…ĽQ “ĽÁD�€0�%ťŕ[ř_`"���������@Tă´M“� �”Tnú‚“p’7 d �����°0\¶i’�����(©Üô‡ ��B '}‰,W®bŃ·5ş”ÓĐŕŕ…_­= B�'Ű2 "������€P†C)‡Ë-<DŘnízJ7H��€,ä ¦PÂAŢ(…IŢ`"! y):Ŕ·đI| ĹÁe™Xl¸ý%™�%Ń`«-˛- "�dá o”ÂäŢ8űbÒ⤫˘AŔÂAŢ`"���‹U—Í»ÝŘsÁË%&—eÄqrY†AČ {Ű`Š0»,Ă �� beKß¶‡É���ČÂAŢ`"ĹÁe��������%„·Ă··é ��€PŇIŢ`"��������Q-<lÓ$!”tŇH�€PŇI_`”k Ą+,m—i€.w¸ý%=�Ł‘ąíż„©Ť”Đşť5Ž-Ş$MTE B�bá o0)á.ßÄ3dÁAŢ`P‚Á˛_T“ 1‚‰ I€�P,Ş,…٢Ę"����T}lúŻî‹`dVR苢˘Ë¸=a B����@���J:é L$Tĺ·że30 ň8NşÍŕ@ŰL•D˝˛wL€��������–ÖtÁpBfÓö2D�����,†—Ëł›‹$'‹*Ka¶¨˛Z8ČL$���@NĺŐcĂĺ;So’ 1± ����ŮAF@ d€âdQe‘YA“…&‘Ăaů®lćmi�� y ��,¦Ű2 sk—ňp¸´Ôd ĹÉeÍÉm7ÍÝ~$â9+¬·(&n%!����'—Sů*vxY>±‘��Š“Ër4UŻ-i���%zĚţeů`‚oÁ'± ±8YTY$Bö ���������JJ§ň�Óm; "�Óm™�ÂÓôĺmĐd/6™¨H�%‘ňě[3 ł7Č‚–XaËfSr\–i���°nË4����`1ݶà ����ŕÜo/ĂCjö0}ŰE‘������€ ¤“˝ÁD�������� Şeç.EÓ Ábşm‡A��Óm; "�XN·«cso˧ä‹ČH�������������B˝đ°-<´Ű)˝ČD����`cm Ă����JzX^NéE&˛poáůBI2ŮČH€,8Ř%i„}ą¨sa·e`bJo·4������˛pj·vmJ/2‘��Y ą”% â8ą,Ó ����Óm; Žł»ą§ßţ6cP$vl&V !MTE(Nt­”Űľ‰Ł±˛Ö@ ��Y8ŮL$����–k 7ôcŐżV%$PŔÝľąYÜîL�����Y0±eE•E"����E:sß%"�����������QŤ‡Ăa’�„’ž–—StOlI(N.-ĺŤ&���€PŇ˝ŃDŽË2 "����B7vzůËčs˛«’@�Y8Ůe$����TŇ˝QF`t’›ŕČ.(#QaÖÉ �(.Ë4€âŕ˛L��ŔríŇ ��ˇ„‡ň&�°n-í &2:Ů›:/Ë4��(îjAő¤,i� Ĺđjm([D������ Ş…‡í0I�����PFk§·uěiłÉ"‡É˘Ę���� Kö�€…é¶Mö ���€PŇCů��@(éˇ| �€ĹtۦA��� ”tćľ]`J"����������€’Ş÷Úż-2� Nňdw›(3U‘¢Áe™‚��˛p˛7š@@q°ÝNźŠ ’����˛$“–ÂÁŢh���� ”ôPľĐ�������@&���j<śť›^.Ó ������QŤ‡í0I%=Č/á§ö6Jv"��ŠŁ]qÜ’a‹ 5ąI�����‰Ě˛›KyŃŞ8](U�@śě 2��Pś,Ş,������€¨¶Ă$�����˝OßN“…ĄbňV~‚ŐPÚFŦąĹ(já˘Í ;TKÓĐ‹b0@ĆľjĚ�$ś¨Š$������Ŕrşm‡A������˘^x¸:7]^NźŠ ĘH���¨Nö € “Ë2 âbrY¦ŚłŰ2 "�@ÝŘáí/ÉP�TÜvçh),ýMť±ťH ¨şlLvUd¬QŃ ÔLÁpčP¶‰]D"��P1ą-Ó .&—ŰŃĎ©˙bž°ťáLW$����˛ŕd;ĘH�������,L/Ý r[V-čçŕKu3Ő,r’��������–¦U7D����`qM—ŇŁ\yYFÇäe9:”7uŽľ©#´˛ňŔ˘(”wń.;hT�ŃTP"�ádo`"�����€ĐŇCů ���,§wkÓÖžŤ}·LL(4o‘������A&4˝šűôínnÚj&���@…ɦР“U&«* áTޤsŕĄ5¶%!������P Ëeš¬\Ň'ű&rÄÝ~3Nf›" „��������–«®]J;|(_`"���X_ĘÁÉH�@…É­š‡Ém™��•+K a5vúę{h˛Ŕ@˘br[¦A��@Ĺä¶ŚŽ©×–i���������@Ô µ©Ľś~(ßŦË6 "���*ćö¶"C2x~uo˛- âbr[¦A��TLnË4����€ĺô˛MŠÉm™1·ĺO‡—*”sßÜ!�Qé¤n`0ä¤n±I˝„�����@І‡ňŁś˝*CŮŇŕ0ą-Ó UĚímE†$��TŇ©ĽÁZ:•7B §ň�����1�����€ ĘĐ^Ú¨‹ÉË2:&/Ë4�����°ś^–ôpjo0‘”p*o0‘���„–ĘŚrňĄüŢd”łŰ2‹ĘÂ�€ŠÁ—ňCx“‰ ���¨„‡íöŔ®Yii��*áTŢŕ`t˛/đl§…ąND€¤do•ŚÜ $Ä���������Zzjo…ĘLd������ ´ôÔľŔDPÂCy ap[fŢW{JłfC��SŰŇŃزĄA¤¤Éiĺ—vv®öVR°€Ú[Š I*â.C";‘€ Ű2 bTҡÁt{ háAÝcşD �������Ëáe›¦Bö-üd$‚Qr±ČIÉ6Đp`S$Á‚Ám™‚0��ŰráPŢ`b����������€¨ÇÓvT`9˝lÓ �°±vIa ��„ŐÜĂ—żL@��TÂCyg��� bđ˛L�¨Ľ,Ó ������� ęń´ÍÎéíŐsG7wÉ(���›*Ë ;‘���ÉAvµĘâ0����€ IfĹ22 "8óŢ60HÄ�¨ĺŤB:Ř·ô“Y„���@Ex(o0ŠŮm™©bp[¦AŚJxÚnč"1 ÎĽ·›tŽÝ• ¶ôÁ˝€D ��T ^•ˇmi�*᡼Á„0¸-Ó ����X˝ü-üÝŚ¤FĹW¸¤W×XNnK Â�@ĹŕKůŢÄDTÂCy‰¤„‡ň���Â����BKOí Ld�@-=•7Č�����ˇE[ţ­:ČĚ���TlŞŘ1y«˛H T nË4����°űöĺlÜb'D ���@…ÁŞĘ"1 ĘLd�����°^¶Ăä0um)0$“Ă//0�&·jÄ�����boż¨ÓBë¶<Ř Nëî‚P������*­č’` ���XN/Ű4•đ´Ý‹Ld���������€2¤§ö&2��b°\uďŇä�t*o0‘©Ü–i�*ěąöoŐAb �������������€bhoí T�–ĂË2 b�����Ëáe;Lb�����eHOí Mˇ…ű%ýT\€„¨0¸-Ó  bôĄüD"#Ł"x(Ţ@F��@{®ö÷6ŃHTRvE’(0PÄX¤n$!FĘukaűeúş 1��@EđPĽ‘ 5áAÝ@"ÂŘsÍżŁÄ�������P‘<o”! 6U9€Ű2eśÝ–iŠŰ2:¦˝-D'ďP-Mb�������ˇ{úö—ÜiŘM‘$ŔˇŰHyҲB‰€ �� ĺŤ&2��˛đĐľŠMŻ–ą¶ “0��ĹÁm9:•7šČ�@qp[¦I ����Ë…oĺ'ú"±0»UÓL3����€ĺđ˛;7Ľ,˛L @÷r‘€ M•eb����*®xËöÖE˛¸HR,6“· 1��������°4­ş,Ł"_…Ťö.†ˇĐCy‰¤„‡ň�•tpXůĄ= 9+ e1{Y¦IŞĽ,Ó-<´7’������%=µ_Ň'±­<©{Rő† Zxho`" íMť·eJÂ�����ČÂC{ى*^–iPĽ,Ó$��Tĺľýe0Sbŕ6$! ¬Š$�€,xho4 Saĺ’B+‡§ĺ D���ČÂS{Âŕe™&1�˛đÔŢB §öF—ešÄ/Ë4‰€îĺ7šdj""����� (ŇS{‰©Ăš/Šą4›�Ä‚Qł"ÜćÂĚš‰�������������€PÝ` ����µŐ®E·›l�����éiyCÓ`We™������XŢşA&†·ešÄ���‹ám™&‡©[ŻÝʇşI 8XUYŚ“‹âY‰„�@Ly$b��� 8XUYć�VM2U;Ę…ŮžK\’0� ÚČ��@ĺěeúđn'ë %hái»ťĐ+X˛-iđp‡·_˘P������������°0¬öĆť]˝ŠF@�Č‚Qłą0[ˇ8Ů®HŕĐ©t ¨’0p/żQ` �� *÷đíE4’l`Q$‘“Ň5ŕék! ���@Ĺŕe™&1P1xY¦I ���`9|UFŢe!‰©»¶5Č&ím™FśÝn§Oĺ Ä��������ŔrôŢ6Mb���,‡·«iŃŰ"ËÄ������, oUň0©ö°���XšvU–‰��‚–žÚČ�€ĚýXô‹«ŮĚ(�������° lw‘ܦ‹‰���������������������������€��������������������������� �������������������������������������������€ €�� ����������������������€���H�����@��€������P�@�P�@��@€����€���€��(@���������� ���� €��€��( €����( €� ����������� ����� @€����(����@ ��������������@€����@!��@@!@@AA����@��!���Š���� R���(� „PH�@�D���@���������”€ € �������H�@@(���@E� €@��$€��  ��$€`(�&&)` � �`’��“�0�s P@a��&���� (��LB`( ��Ŕ$�( €������� @������(�€I��€���“�Ŕ$@ ������€I���d�((��Ŕ$��Ŕ$@ˇ�@A)(“��@A��  �ŠU��(����L�� P�“� ����`Â$� &��0��E˘��������€ ( � a.• ��@Q č¤�����Ę�€ ��“ �eL��(c ŚŔ�Ę�( ��L���  �  `€!�€ ��`(��† ��  �¤ &I��\6 0`H�Ő`ŞŔ$Ŕ��@�L�����@��P�“��e�������0 LŔä2��\����“�f�����2���`&��  �� l’@€jTĘ����•�””����0™�����������������(c€2�  �`��e�C���€ ����†”1ˇ ¨�e�T�� l.»Ś0�0 Ő�€2`Â������ʨV�“ �Ŕ$�����e�C†�Ŕ$�L“Ŕ$C`r�P�Ŕ$C���P Ŕ$��s5†ŠN €2���Ŕ$��ee@€I†”AŮ��€ LÂ�P�e�L ����Ŕä2��S &”������e�C��ʆ0�e�0™����”A5�&�€I€!���0!� ‘�����C����Ő Ú��`€©Ć@P0 OÂ�C����  0L†��� �P @�T�`�0&I�������€!Ŕ��“P € ��Ŕ„I(������€!ŔL�Ő€�Ş��@�Ô–j�Ę�f®Ć$�Ę����(�(j� ����LŞA���0��Ŕ$���ÔT.d��“@5���`�&Ę(C ������Ŕ`Ş1 ��eÔ „I€ ����0 Č���“��µÁ�Tc��€!��LBŔ��Y“0�����PT& “@5�Ę��`@%L  ����&��”� T€!@�€2��(¦ Ŕ„2Ş1 C�`B�����e����@�����@Y�@`†Ú@@���”�Č����&�A ��(c lSaČp„��(���`P6L�`���Ŕ����eŔ�e��P6É”‚Ú$ e�P[PÉ$ a`���eÂ@€€2�����Ŕ”•�“ �C�Ę&��`��� $Ă$� ”PŤIĘ�€2���Ę�����&�0� Wd&LŔ��PPV €˛�Ő�P@Y€I`��(`Ô`�“�0@ŐY†” ÂL.Â�@�0 Ŕ�Ô¨�0€'`�&)›Ce€��&a�Őx†LÝĘ�C�j�������Ŕ��Tc @���€2��€2���Č2@�3„I´¨Ć$ a@�e@Y5���Ę���€ÉeĂŐ†�����Ŕ&a�0I(������¤Ś«Q„ €2�d&Ě$ a�&aH����”�ŔäÚH0PŔ\í!™ç«Í$L�„'aO‚Z �€ ���Ę�€IÉeC��`ć:L®m’!LÂ�@��&aH�L’™dŕ˛��  �(��ŔL2�€2��€!’Ę������€ÚB¦�ŔÚ�Pj @WR „ˇ �(`®ĆT›ÉĚŐdÔ�Ę��Ę��L�`((ŁTÔŐ ��0�e�e��”�����  ���������€ @&�aL Ŕ�ŔĘ`pŮÔÉĚ©m�s5Şe&��˛0�����L„I¨�0 CI‚���@m“ É“ÔF  `�YT¦CĘĘ Â† a�����†0$�����L`ČTő™I ¶�ŔLÂf†0�����L  ���� 6ŔC2$�����“0„&a��������0É a�€2Ş1�  0 µ@Ę€˛�`†0�P&KŮ€I‚P6�&”A`��P��������P)3�”QŤ!L@���P��e0�“0e!TcÂ�������ĚŐ2�Ę�†IIÂ����0 C� ŚIf�¨Ť�0ÔV €ÉL2L2ŐĘ e†00 j �@„  Â��0 3ÉPŤ “0„©�L“0���@„™„!L\m&,  Â���“0„���€˛2�(0������0WµĚ0É @„dćdÔP6jL�€2�C\��Ę <„Ŕ�€ 0 čĆdŞAÎL&Â�LÂpŮ�����������€2�P6 CŠU ”A�ʨĆĚaŕ˛'a¸lać0 bf2j@f`†0�Pa�  R Ŕ�����”AÂ��”A&a������“0„'a��@„��(0Ŕ$ —©Á`€ą f��d���0\öäŻö3źŐ‚Á‰„! �0„! e“đäĚ$e��  a���€2JH�d�LRF����Ę Ě�# ĂŔ$C.{Nf8¨A™0 Cf������€IP d–Q TÂ< ŔÚ ŚeȆ0��0ąl8ü$ A’™”‘ ef���`†0���0 C�’™d(”M5†Ě�“ K†jLʆ0�0 Cj °ě˛!™���`rŮ †ąÚĚu›çj3��Ŕ@„™2k b$ L“3OÂ�����P6„‡Ă��0 C����  ’‡”ŐŤ�Ę ™ˇ ’™”A2��&— ‡grŮđŐ’����€2H‚Z 23����@��”A2“IÂĘ y(.’§Ăá0ˇ ÂL€ a® C& ÉĚA ÂL€I€IÂ(›$‡ ��@„CĐ1†@„™��Ŕ\ŤÉ™'@s2O‚$2HF ’Ăea L���(«Í„‡Ë†Ă!L€2Łdf����Ę Ě&0„ ������#© ®6fee�0!L  ’™��Ŕ†0���Ŕpjd†€,™�L`ćËňµýŚđ`0˛ąŹžEŔَ›$3��&aę6“Ěd’!gć‹„ĂΆĂ(d&“0&0ąlęŹ4“2Hf����ÎL��`†3�µ �j2“IľlHfBäÚžžşÍ$ÚB* ��€I.{†0 !™9L�Ęŕj3ÉLd�”A2“ 5HfŔ$Ěf8L�€2Hf®ąě™Ŕpf�LÂp´A2��&a8ó$ g&L ś<¤Śj<9ĎťŚÝ 弶sF'ŻíäÁ�ŔČ ™ @m!نnLµ™“‡0&����L`8ĚeĚ“IúlsÂC2äübÂ0ś™Ŕŕ˛2L��€IÎL�€2ȵM’jĚ`BIć LÂä0��j#—©eÂL€˛âĘ$üäóĚY-/�Ŕp®¦É™a@¨ŤĂĚ“0óág Ă™ Ŕ$ gćb<s0sV‹¤b09<„ÉËrdćbĚ\bäĚ�“˛É‡‡��@m™Ă“0sf�”A€Ú8™™LÂTă9¨‘̨A2�(Łj™ĘLľ¶!çy�����Î3‡y>çMb ���`¦n3É ś™�@YYŁÉ W›ůş=Ď(��(\Ű$™ 0µ#Ë$32 3Ă_öOţč?X4ĂR ”e€4 „*"�����&09ŁV$0C`řĚ@€ ”A2€I932¸ÚčĆpfČa0WÓś3ŹPŰ|”I�Pd†śreă“'����e@fČ™ 0„‡“g0 “ŻläĚC lňe?řÁGB¨E˛†“™ �P1rć!@äÚ&ÉL�(Ł:™śy¸ ’™���PÉĚ#áś™���ś™0É™ 2�� bŐ2&”Áe3'arfL&C 6Hf�L`H˝…|Ť…3)ŁCf.›„‡O"�@$3��(\Ű$™ ��� a8ymaÂĚśgÎL(d&0„áäŃ–“(Hms&Â&GŐeČL����Ę ™ą ’“3je 0��†hăä™��@ĹHXF>ü�¨9ó��ŔäĚ\ÉL����ć˛Ń-LÎL(«ídF ¸Ú<ś Ŕ�Ę ŚÚ$<$Ăä0�����€2Hm“0����  ÂL€2Hf2É™çPoçđ L�(d&LŮkSK€çÔ6üÁ'šD0““��0†�&ĚäĚfrfPÉL�€2ęŘ\Ť'¨ŐŰ'3Ő“™���@\öó�!<‡™ś™�TŚśyć0““(b&'gp ť<Ô€džmfÔ 5ȵM’™�����fřđ”}ćÚćjĂ©ß a&LÉI�����€ óśłŢr™��L2“3jf����ă„gćśçÉIB�L2“3�@Y‡yřĚ&�!3‡‡Ož���efBóŐžůśç`Âc.Źž1�T0“““Ěä$2+K¨m8yÎLb ������€!<śóLµ yćđŕŁ(Hô–Ł$���� 6’™0����(0€2™É™!™É™ ���epŮĂá‡Ěä̤ ÂC�&<$ź™@PŰLÎL����Ę Ě�0“3*Ć9ó2Ş1ÉL†Ěp0 393����������@„‡�”Axć˛Jđ����@1Ď��0“Żmµ†P±şť™ĚsÉID�����”Áá™�������Lçśç9'†đđ—ű 0 Á" ÂLÎL�����*Ć9ó&ĚäĚ0“3€2řÚ†3s0���0“3“2Hćáä©o3É 93�0“3ĘŕđĚáÁĺž��€If®ŰŁ“<�ŔdB��eđeĎü•]±ęH(  ‚™śD��  ��(ĂC�����ÂĂ'®™|Í –e”ŕbpę·Śr}„dŐňL��0“ŻM-!�LÉ™ ”Áá™ĂLN"�0a&g&��������@YYĘś™Ëŕđ��&hˇRFľěáđ”%™93�`ÂLÎL`’™ś™�@Ůäkűg~ňźŞ€�Ę0ĎQ„D“��ĘŕËľŘÁŘ-śĽXňĚ'b� e����P‡‡€28őö拇&&���� u‘˛âĂE���É`TÁ\·yÖ¨Š��¨çĚC��0“3�Ę çrf���Lµ3ä!�LÉ™ epxepx�epx��µ… g&�LąsfÎ<‡Q;C�€2ř𳎣*B���ĘČ©·É[(,€XĹQC8´đĐŠ���j˛ŞŁŽ!�� FÚU<� N˝‘ĂC�Ŕ\Ć|Ć5*NYh’ šd1px�€!óđÉ�”Áᇡžş#€PE09‰��P‡‡�����frf.ĂC  ��������&Ěä<¤¶|ĐĂÚ’Ă3É<xÚ3ICŁ*YjŻ ŃüÁˇ¨á‘ÜŻ ���ʸÚ~ň© ��Ŕ„™|˝U�PF 39#›“úM‚n%s Úr”CŰz̮ЊUD���€ óäł.-=š‹XuŚ2„"4‰�PĆŐxŽę6"��(#_öÔWTE@9ĽX������dfrf���Č��(#‡őv’™d†śeźGúDM"�LÉI ŚČ0„Ě���&Ě\·gľěáđ€`&'`ÂLÎL�`ÂĚu{hĂ2rX–��`¬vf”‘Ăa&gć2rxeäđŔeâs¤$ e\·Ł§Žc!FŐ*ŚŔʍ¸t � EXüÁ#ŞVŚBÄL"��€˛Ę Ě€2rx&eäđL íú�á‘f΄9üHÉL"�ĘČá™™ŻíäÁGŠ8řŃC±tÄĄŤAŇ”6ĂUcD!b&�a’9ô†yp�U@óčG#Ë1XĆÁ �¨0sÎĚĹČ©7čŕ ™3‰���eäđ<MűDôTŮóXńˇ‚"���@2b°�€ 3'<L>k1‚…��j ÎL�0sÂ0ç<&Ěś90ać̉��&ĚśóD�&Ěśó"fN�� ŚśŻŰ# Ą?Űîk=bcPa e’5 ­1P5BňrÁs dćD0 ŞIĹČáA���Ęćśůá1F¬:RW!���Lj›ĎĎ8 Ŕ2¨ĆX+���@Ĺ0 ™ �PFĎ\¦çsÄ@E&Ěś9�e“OţÄ«C—����� ˘(¬8V�$«F rŕŔU#Ă4C %1X��(#‡‡”Í9óÇ…p0ú`Ť€F·é������€2rxL9ç©����(›sô[<¨" 9<5Ps„aÎś@9s"�0— Öc����*(GŚ€d5F]Z#d * €XGŚZc j„"$3'���`.ţ芪jŇŕ@Ŕ„™3'fÎ| Ęj”O<5BĚ| dćD���� Ś2aćśg�fÎyȧ~C«,Źr´ZžźńŘ\ŕZŹ(�!Ëb]ă���Ś! #F•¬FTQńg TŤ����fÎy*�����đp®ßâ*"930çśdŔmçb@�ĚśĎ!fÎ3B�PFO5rxµ%™93���&ĚśĎ30s>+ ’™|ÎÁ<#„HÉ<Ő Á�0ÉĚyN��€IfÎç 2rxŔ$3çsČA‡Ţ  fňWśáŰ»Źă’��BЍŰ,6§¬ С5B€1¨°  JłҲb:j��€ ušMd1'fÎë Ą€0™ �ž9çD€ ��`ÂLBfes>óĎq}ÄÂPZ# ڍ!ŔT8¤Ş�@9<\FBPFˇŚ�0aćś§�� Ś$ĎSíŻŽČy>ˇ ‡9Óć€Â‘vŇ€Ť \ő�@Ă–×ëń„Ş�Ŕ2IĹ¨Š ćY5ÍÖB–ž‡ dŃžp �ÂŞ‹A�†ĚO<p BUŁNd ąěA€ąěÁG=F������PAŐtěj ‚dÄ`1YŤ˘gu!¡Ck„���ˇ»řQÇ!”ŐB�š ���T¤®ŽÇ1Z6®×ř!«‚�Q5BDŐ!„Č̉������2��€ 3ç<������Pţ©cŚŚ<JĚ™LÝN´nymČč@0¦vxL¤ĂcŽ8<ćĂÚľv€P�T9ç ���€ '?q¬ ��������¨ >g1âgˇ nÜŘ@i@�����TťóhŘtŚ0vUáPA‹amÁä3“ #ş?óg` * �ĚäĎ8P•ÎJŞ1VŤ1s# �����`ÂĚ9O”‘ĂÚ’ĂC���� Ś.#_¶e‹ÉÁB��TfĎt:{•HŠ` * dÄ`@M]ńX‡ŞF�ŚA…CŠqŐ1í*¤��RŤŹ1Ž*)…U#����Ě|Ć däđ���j#‡‡ÔFÚ¸nĚWŁ83j#‡‡��Ŕś™9ç `ÎÔ›^]űÔŠˇJ�€1ř+{Ä­X��€.k ĹĐ ��@ęÁB����@ťşâcĽFÁ2¨0 ���������©#­‹,�@��5¨9ç©€9Ě|u ‚eĂ�€9Ă$ÉLćŘ-?˙ڇ˛¶*€@Ë Á��0‡™sNŚ€ÚČá!��sůŚ�������¤­r Ăčv&yµ‘ĂC�¨·ŕÉg­…U#d `<s"��0ᙏ°"aD~u ���˛T•ô6çđ ć`ć#ŚG8Őá$3'�����@mäđ�d@mäđ“Ě|Î�����Ŕf>cŐÔŐ±ťŤuQŞ !2ĘIf1hp ����€ 3źóT��@I~>c…�@ÚČá!/vř±ŽÄUŹqY��° * �����@ťşUëÇc˝0@�„U#��@Šn:*Ś - H1Xj ę¨A ÔÍź+U#�° *,�¨QUź!�0gćąę1®!���TPšŤ©?ô,^Żń��!DÔŰ١W}ŚB(aÄŞ1 )«Uăk;‹*�„0bUĂ?őř¸®ă¨ ����` XT°ę¨�¬×8°j„��!ŚX5B€1ŚÂ…°b)"ň̉��Ëźů��@2bp)KĂ�@MÝŠŹúF¬!�ѲŁ^řˇ·3˛Ť;d©gΫѰX5>V±Śe"¦fĐ<5ŞĆ …Á´p1.ŤŁ$E€1Ҳ3Ô€� FĐݵâPE°YaŤP)B�����€ ęyŚ×¸jR&-;®xÄU#������$KqÚ1T‹îôŇsĐÂ! ÔpŕWĐ[7pa@���ÉR¨8⪠aÄÚÎb- �����*XuŚ��ÔÔ­éł:TB@ă¨oŮĐ6ĂŇ4eşę8$����� ‚µőWĄ™ja@��c�HtńÇ!Q6‹×k<ZÖ$lî $')B� łöë:Í€Ƹę1®!�€1Ô€��ję~éÇń*#�!ŚqŐc\ŰlÔ…>‹×5��Ŕiɲc­q¬5B���� Ł"íęău<$�0†*«F a†_×Ça�ÂU#`lÄRŚŻzŚË‚�@v §Ůui iÄ­¸b@!ŚX5B��„0bŐ��*xęŘf±V����HĆxę.]q 1ÔÂ��’1.s+�T°ę¨Qkěő…Ç�„0bŐ!ŚX5B��Ŕ,Ĺ!,ˢ}§É) ��¬:*…««ŽC���PA뎣Ć#®!����€dŚcµ®zŚ«F���\X1JG­�ŔăŔ!ÄŠĄU#„ÍâźogŹuŃ€ĆP �����ŚqÔE�PQUĄĆ9Ě3ę…����¨ŕšÎ¨ÇzšU­Z8jŤ� z­Ź‡jĄgđZtT›Q pę–Mş„P#V�B͡ÇZ#�@#VŤ!ŤŁ^řĆxŐ#– �0†Z1ˇÜµôxÄËŽX$��ĆP+aÄŞ2†*«9ÔJgP#VŤ����@«Ž±B�� &[ńę#$›Ĺëu<D�ÂU§L���fڎc`Ő�€ V=ąŔěZJgŞ+>âÖ!�Ä�c¨Gllč«>˘ŚˇVLLµâ€���PÁŠUG�� ���HFńuŐŻřW!��ڎVP#V!�!‹ěú+~ŚUf/CD1ÔŠ€F¬:B���������@Oöz|=…XŰY¬d µâ€B±ę�€V¬:FaÄŞ#����$cuA@«Ž:B�����$c\DKg# € –Îj,|ÄUG�ÂUhÄŞ#„0bŐ€F¬:B����’1Žş �ɨ`ŐQG@+nݤK–Ťşâ€�®řk= ”­—Ŭľě!ZŰŚŞ" ĆeŹXDT6Ča¨EgX+!›ĹëŰłŁ �����!¬¨ë8°Ö�ŔjĹ� ‚µő1®u„��aÄş=ĂRŘšéKă¬u„Śa»2ş[ćP+s¨Ň1°4FÄŞ#���*X±Ö�cŚc íVČjĹ� …ŤŹíŮT—‡0bŐڎťa­8 ��€dŚ#��������PQKgG ^Š4B����PAëŽkabŚ#4fÝđ8ŢŢa,ڎV��Ä� ˘Zw|` €YG!„dڧě¨+�����*Xu/hŚW}Śk$�!ŚXkĘT+&Öjb@�`bőŇxÖ:FaÄZG���!¬ńŞŹtWćĆřş}dë˛cĂŔŠ����cq@aĹZG��� "ÝŐÇëń@ŮYĽ^Ç!�„0b­#C­8 �ƬjĹq¬ë!eőŹc]†Zq@��������HĆ8ę"€dŚŁVUë0†qŕ€`Ć8p@�PŁV¬#b­#�����@E­zš˝Ö:ë:B�����$#ő×:ȡ° şâ#®u„ŠA»Őža-{†µp@�,C-{†µp@����¤ŽqÔ��€µj|zv¬ŻúA*R¶^0c¨…���€ŠZu¬#���Haăc< –ˇV��¨ˇ;{÷E3aé€���€Ô1Ž8 €Ô1Ž8 �5bÄş=Ł]­8Žu$�����������PÁŞă¸ÁеŽ��$#ń×:-ő[÷ ľd mˇp@���0F<â#®u„€F¬i_ŻÇá4¨EĆP+ŽX±Ö4S­8 �������HĆ8ę"�HĆ8ę"���H]Ç �,Žă !„…c!cŘ:ÄŇT ¬ŰłX‹Žl˝ę1 (čć Y4¨`ÄZ�C­8 „ě _ż=;Şä©$���„bÄZG���që+��€eU[÷±}‡ŹW;) ¬Đ@ěe'°@Ą …A­X«U����@2ĆQ/iÄZG@(F¬u„�DËF}ŐTáPŐĂv¸4ŔjĹCí,ľľCV ��aĵŽP@DZľâCdÄUiĐŰěgöËNd$¨•D�ĆPVąY©łëJ™°bDŚ×öłřz‡�( jĹĹ ÝŠÂCńÖşâ€��aÄu{kĹÁÚ5›Şk„���PQ+®u„��@E•˛qĽŽ‡����ŚqÔ…×:B–ő«ţ‚«&N��€ޏÖ���HĆ8č®”]ŻHg¸V���€ ¶ězĹ` ë–=Ö[ö¸í· bĂ*=]•8Y‹PSv˝b 4†µbbZ+4†şâ‡Ý-*h kĹ€1¬�����€ .Ç��*¸xŹ�� ‚‹Çz„��!\¸ÖˇBŤ��� uSŚ1*B�0á'ÖőxŕZŹ���˛gřZ¸F����*ŘşÇ c@���TpŐc=B��cxÚE,��¨ŕŠk=B����$ă8ꂌ1ü1®+âö o´ö!m K9H@a°n±(#X#Â×z�ÇĐŞ-{Ô˘ „Sv­G�€PڍuH5e¸Öătw‘Ń@Ę®°3¸Šq3z˝ŽC@`ŔŞ����!¸Ö#�����€ ®zŹ������Śń¨_xµQ ×zL»Ţ`+n¬¬¸±Ň(��Ŕ2-„펺â@cX+��������@2ŽŁ^ �HĆqÔÍâXń€�„pŵ> #®1âş=ŁUt€���������@��\ő8^ákť2­ʍQë(ŐAĹôkýc\rÔíŚVŃ���!q­G0†µâegńëkD�ŔZŁ-’����€i '\-sÝĹA KČahES’VŽ0 C!��€ޏÖ#Âo»G]ô���0†µâák=B�����€dGÝX·ěłëz|,íDKHa 0h…2ÂU����Śá¶Äâk™ ���� 2†!< ‹kŰr KH�†ÖÂ����"cÖ ±pĘV)lwÔ!q­G!q­GČÖŠÓÚđ ׊ÓZô ע������HĆÓYըǡk=Bá×úmęś}±i!­ Á A+9LyĹ͵}¶l)H$����0†µâ������$ă8ęE���P±Şâ`\!�É8ŽxĂŞö٨é?ĹZjF«hÂ`Y<l �° őmö3»Ů‰*JˇÉ „Ëa)G1n˝( ZŰ­˘„F¬őăńş¤©µV®Ľ � S^1C[qbZĄÇе>@)\ë P ş[ă‚OÜúBS‰¤•�H(Q+Ň :@�ĂZń€�ÖŠ xhéŃ–(…« $�ch·ŘŮşâˇ4¬����@ę8V< ¨q­ŕĐŇc]�)\uHăeá*9Lye@��������¨¨«ŽÇăŃîVQ8°®ÇCZ9H�����@W\·gq­x@0±őU¦I*†¶Š=+‹@G\ëA�°¬J5eZ+������€dGÝ,Ž�H–fGE�’qc`ŕZŹ��Ćp”‡®ő����PQW=Ö4Íľ®qDU$�ˇ8âZŹ€ޏÖ#���c8nńl]z ]ëABfőşôUśÖ��0†µâ��TđŇ…ŹŐÚČmá@cÖ˝+Ĺ…â »…�á·ÝC_ń,%㤊�����@2Ž#Â×z„€ޏę 3ýz;` ������ ®z¬GŚa­x@��ăXń�„)»ľÂ8˘pŕZŹ�����\őXŔÖáĄq@�B8ĆkýA[H���ĆĐZx@€Ĺtc±~M§A+’´2 Ň`˛eÜRŁĄM#M���� Cx[ćĘͦA����` «^ &@aëzLZŚĺ‚ţ%ÂĄ $������€1´&ČĘ–N¸´‰Äbć6 ©ó‚m”aR¶tPšŘ% ]ŚZ‘!ÁRŽ(tŐABB®:H���ŔÖ�Śa]ńQ:âş>i%±ľh�� (ă·ÚĽČqtYŇd)Ň ,e ܲÁAZBµ’¦Ą $������°Ú&Ňq\śle ��ŔbhK̡-á��‹á¶‹¸đ€��° ÇŰ8Ö+|¤xŐA�,ĂzG}…ÚĘ@���€ĹĐ®đ€�������¨ÓnŤ”'Ş©-a‚Bˇ1Ü.Ó$��‹ˇ-a‚������QŤa X ñbÄk=ƢgňŐĐR(4čŞ@hĐUG şlŃU ��1�ˇ8ĆWýŻ:H���������$ăxÔ € �*ęŞÇú€Žx­h[H�����"ă¸Â���@E]ő±!��B¸âµ!X¦›Łëwˇ\Ź©HBÝĹ8¸í a@ahKx€�����@Ĺş đCÄşµm9…R �€ ŘÚ” l–(Ŕ« $$«Ž0ôŞ´•DaPZ$,ę—ýA¦0čjD € 8âe˝:z­Ç! 0¬‹&�…Ż6���ĆlYjíbÇҲР4(ŤpÚ&‚bĘ^_¦uŃ�€eucqýš&�� (xµ)ĆĐV< ������PÄëzĽ„��‚€­MA�������Śă¨ŠşđZŹ�„âŔkťfk)lwÔ+Ô¸QżěąňĄ=L K7pËĄ:––…p”FP‚Ą Ȱr±iJ°”ÉI¨}»$BB –2�( JŁ “¶Đ���€€jnx÷˝pÚŕ[7G­Ŕ4XQŻQ����� „˛`kSP¨˛cý%O$B ¶2Ă lá¤ö ”F»Ú@/ĺ �������‹•˘¤6!(Pŕ���@deZŰ M  0´…2¬´…*”`) �� (Lڱû˝‡đf'XĘ@���…[›H€ 0`kS` m ”R¨…z„ĆŁţV‹¸��Bqŕµ!�€1¬+欻ÖÇ Ť¨%C[hNËŽĆÚÍAě´ ULŰ„ĺ¤5@���`1¬…ŹAWµCkð´�'­…@¤îŠ  ��€(:Ă_—S˘ÍN´•'ĄŃ�BF –2�������€’Ę‚C›‚�X ë ° ëŠ ¤Çq˝¤´6 ˛”€,ęÖu=¸ę ˘ćÉ%1”µč���`Ö���RÇqĹ���$â쏯ń1•ňHË-L �����@(qŕŐ¦ �������€ÔĄłÇ .Ôq\ń€��HÇ€eXołĎ^×cXÚ@����������@Ôq<ę«`҂òLA����,WІÖ���jÔK>–e G|Ő´Y ®:H€Ś\6‚q× ĺ˛uĹ1®_á����@¨xčŠÓNŹk$�DŤuc……Z†uĹ���,ĂqĹĂ޲ÇőżÂQ˘ÍN´•Ąˇ1YV4Ön6š+ HJ"� …[H���X¬,ŚÚţŚŢ»‚JląUÓŘrłi��� ( ŘÚDm ���A!cŰ%¤��������@dLSŮ @ őŇNwWXx@0†«á0hk ��@P°µ)T ×���˘eÇőŻę9Ú �$aŔV���AaŔÖ¦�…#ľĘ?h+‰â¤�© $�ŚaYÂÁ–%L��+ ˇu„��!\x­G€1\ ¶6Ĺ×jŽ–F�Ŕv5™kZx@�@bŘőB¸đ€�����˘ŽÇ#< ����Ô©»_ą§¶Ń 4hŤ���% ŘÚ�ò¤^ë��€¨8đZŹ��ŠŻő�,ĂuĹ��€ŠÚ˛×WŚ��������€ ˝ă?.§C€ 0„­= Ű-Ś0iŤp´F� (LŘÚDch[z‚­ $���€  &Ą0đjS����*ę…×z������É����’ńřÔ›–-L����€Č¦0A Źř*˙ˇ ­ $�� [; »e®\Úád[H����š†ĺUě°´)›¤‰% ˇKH��0†e �����Śi ����˘Pűq '-YL[; MŤ•m4g/ŰáĐa©ÝĘÓä*Úp[Â@U´­É0�(NZŁ�����€Ĺ°,a‚�����ŐŽrS» p) ��„lm ,¦e Ş®+śX] �bËŽë_ň@@q°¬rˇÓ¶=L[&e GÜm‚,Ăŕz… Th°FCk ��(ËB8mcŹÁ—ĺiÚZłÖh����R°•�����Ó&sÖk K_]›¨É”l) �������˘Ó&���D˝4 ¨ełş.úLŰ’ °usáR¦aYÍŃŇŁÜöĹž`Ił$%‘�%XĘ@�����B ¶6��X źzIkúěî’,e ����BI)TměŹĺŤ=·ĽPH ���°–…ŽikhN–F€Q‚Ą›ŁeÚB����€PÂT–>ÔŠNáRr‚µ‹M™f­Ń�������˘Z:»¤ń—6��X,ĽÚaÚÚ@�‹iYÂdNËB�X®4µcÜfÇ۵2‘HI$Š“ĄŃ���‹áşčmK@��������j Ą|„?pW›ÚB��,Vő–‚0@ŇăřvŹB'KŁ�`1-K ��� ęâqŲL×Ȳx]LĺÂćÚ¶ “�%XĘ`±,e ����^ë4«·¸đPNËB¸XŰ]q@�€¨8đZʱâ€WQ4ŕŞ����1�����Ô¨‹Źă-ĂuŃgz-a���@Ôń8đ1”­M%ĽÖ�� T<đZ§™^í0,-‹ŮZt(Ě Hj��Ëâµ>WH���BĹG]qÚ]Px€��QńŔk}�Sř*ҶŠÁE"†-› ŘĘ@�������(ˇlŘÚ”Z°µ‰�����%” [›&lm"‡eI1vµ§4)�Ŕ-Ë*Ä´`”’ą¶mŁc¶4”¦Z+@ `íMž†KH�­Ń�B’É&*4Ŕb)XĘ@�����`1<–đQ4…_ĺ‰.6PJË- İíB)ă 5”­Ń��°–% !a+Ó���������DŹGyA:Wx@�`łZ­#�@lłăú—ž¨��%<°µ'��ŔbX–đ€�X ×������¤ŽÇCßaą{XŢä ��¨–…&–2���¤Ă°˝„( ��� ”0akSB #vąQJ @P°•!Ąřet) ���AaÂÖF1kŤp, AáĂZH€„2ěuAą´Z8ZčA.e �Pě Á@P°µ‰–%L ���ŔÄÚ›>L—6 °ó†n!h0€Ă 5@�°XŘÚaXÚ@$4ŔRˇ–2���1���”P6lm ĽÚ��� „Ţé_—Ód��ư,Ń1mK@` Ë’&����SítŁsĺER��` Ë&AaÂÖ¦ ����Śi “9[[Â�@‡áň �ŠĂ˛Đ����ŘöŇť­]y´˘1y)T�����X®4µ!��ŔjaZŇ!”đQ®đ¸Ú@�������(Ł^|´)�@ Q7Öµ0"^ë˛L×5€(z¦Ý������������”T6m ,†eI���Ő–4A����%•¶6Ąá—=ĐĄ $ 0h- �cáŇĂŇ`) ��˘ąęµ[š t9ZZLX,…�K9H×Jě >Ń­ $��$4ŔR†Ph€Ą ‚ĆäírL������… —6‘ò¤IiX–a¶´0€Ă`ilNŰZJÔZ����� ¦ě¸ţU}Ś»´0Pˇ¶n­5@��€ 0áŇ&� îjS·pĐ`��cX–a —6�`LË’&��� —v.-‹Yka„ ����‹ézËMË€m/vL�§e ���Ëi ‡ę56z€KH@qR–ô�—2�������°–%MP(aÂUmT.Â`0ŔVٶ2�¤D®mËt*ČŠH”ŮZq€Ă`­8¨č€W$������Bń_ú#• Cv×P TtŔ«$�¤xŕ«›Ł­…���€ L¸´C¨–%M €1,Kš �@¨bŹ×›|�`+9 Z � (L¸”‰Dqe€ešl+ ��„ —v@–% € 0áR†`+Ň µ0€( Ë�Lěő"‡)ŘV&����&\Ú Ş9ůr9:f$4ŔÖ Üvi§»ŘD����������€Č¦4A���@ÔŤ©\ô����”T6\şcᲄ�����QŤiI‹aYŇ�`1,KšĚٶÖÚrx°‹M$�ŠÖB†ÉVĂÖ&� ŁŚŰ.���‹aYŇdKĂa˛­Śb¶j �%<p) ��Ëi §îžŠ- B˘B“-4íjCŮÂTa©ýKž¨���������� Ş…áněiů&OT�€ŚŘĘ(f­±9mka BÚ+P`�Q€-7; &��şŘÔŢä yĐZ µW”4@���°–%M,†eI��`1ěŠm Ň�YĚÖ¶‚hr—%dś•-=ŔÍ�������Łą%M��°ÓnlZ.a�����D5¦†ĂT®jS��°–%M��ˇ„.í ¨úŮđĺ—á��@���€m/ĺ4����,†eI�ò¤ �X Ë’.eB¬´Ęph[€’H�����–áşĆ)«ë:Žř*¤Akq€��Xf×ka��éGÚ¶–i¤].É–6����%L¸”‰�JxŕR¦€|Ů@��������(©^śĘ!��”|•C@‰ľĘ$”xŔ—M$��¸«Mm ���€Ĺ°,i‚����PR˝p)‡ ���@ÔŐŹĺ4şÖ Ŕ (LŘ–Ăd[5G[ Ň µ0€����,†eI����”T/|•C� (ö]C �Ll{+§©Č�›M$ bÖ$ m™&Űl"���@(aÂĄ¨ŠaYÂ�Aá/›H��P›ľý2|� bÖ XI$$4É%<-oá�¶Š Ë�P´������QŤiI�Aa •tłle"������� 2¦ŁÜtµ—°Á� ”0áŇ̰[–t€,†eIX Ë’ŕbX–”(©˝…R X6Ěę8aż¶!•2Čq°V|LŘ×R!ٶ2…¬Ř,®˙’Gśmĺ0\ÚD@Ble"�����AaÂ]mj—0�IÔµ%$Jpĺ e � °•QĚv˝�;nX¶0Qˇ¶2‘��������@d–t€������"ă0µ&\Ú!�Śa[Ň� (L¸´C€Â„Ëj޶UlX¶0�������� „˛áŇA��…Cą¤ĂÖ&r,-L �€ 0áŇ&�&\VÇhkaP-KŁCş´‰�[ ��ö¤Y¬-J›H` Ű’ ����‚¡\Âa[&��ư-éd2ÁĄŚ8[Z@�����ĺ[›KˇĂ`[™H�ČqĂňE>PP,ŤÍi[ ��������"ă°¤ (L¶·…€®7,—0č0˝şwHżČČE%D���€Âdil»tdž//§Č�@‚ÉŇ 8YZ@Čh€­L$@Y‘2ŠYŰŇ“ÜĘD ¶Ą'ąuçd Ë4ŮV&¤ÉҤ4Y ŰĘD@Fle"��XLŰ’ °¶% ş”Óí%@�Hh€­L$@B,í0Ů•7µ-L ��2Ť®˝„���Ŕ¶%@‚ÂÝ.h,µKz’K;Lv) � š_¶O‡MÄŕR�2ěrˇ””&KŁĂPí(4 p±!$¸”‰��a��@(a­H������DµpŘŇ�‹iŰŇPpkĹ´ma�������J(§ĺt(·2…‚ćäËĺt0�4'_.§ �����AaÂM¦0Ŕ%=m_Ň������ ‡rI‡­M$���€ 0…—ňn6‘���ŚaŰŇ�`,\–‡´Č©” ĹŤŃU/Ŕ‚ć´m ����3hŰ҂Ŵmi†•mas˛-a����”†PZŃ#�����PQ/ţh‡ ���������ŹÓňA/młe Â`YÂ$a‚[™H�ö…É�—2‘���@PBij§I¬™L$��Ą!”Ąőqän› gŘË…˘1Ů–0Ă`Y¤4X–0��� wµYěeK�H€$LjŻ@ˇ D1l[J4ئ­M$�������`1ś­Ea[ ¤!”Uz„BńŔŻ6‘�����ă°ĄSѡ\´µ‰@h€K™Bˇ¶v8ŘÖ§˛…iYfcćm™#$,K@�Hh˛]lÚÚD����cض!Q‚­&»ŘDä¸aů¦>&wk]«@„ٲ„ �Hh€‹MˇĐ›H@aŞ·`¶-a˘BŰŘÜö˘Ć†Ër..���@BÝěÝl"Q,KŔa°,a˘B\l .6‘�����‚č~ąś&��@*v€­Nĺ¦m5GŰ&��������`ŚĂ–NEÜl"ĹÂĄť¦K›Ča°,a “���ư]ŤMŰ&*4ÁĹ&� ˇ\l‚)mK’2��¤J+:€Ě°›M$������@ ĺ‚[9D���� 2gc‡Űvšnm"��€ 0áf… Ë7xĆ•easÚ˛Ą'xłdadd.76������pł i°,i š%+2��”†ĐZ©ć貤şf �( Ű&€ 0áf IŕŇ“mí0ŮŦPh€‹ !ÁĹ&�������€ 0á¦) ¸•C(4¨k…MNeI“��… —vŕĹ>Đ‹Ť8[–4‰��������� „rÁMLÓí-Äa°,Ă� .6!M–%M ���0¦m&pśí°p»&�� “eI©Ž ßţ= EE°°gË’&����€1lŰ0€1lWąaŮŇD&ÓpyK�����‚č~ą<ś������Aရ¦4ŕf @P8ŔÍ&��°XYµ^y[=–®] BšŕΛږ&����@P8ŕVˇĐ·ęlKa¶ÚröĄI�������� „rÁ‹¦4ŕĹ&¤Á˛Ą'y±‰@a˛ŰbňÖNS‘n2„7›H�����… Żj‡`0 ··t�� ĽŘD˘8k@†»ÚÔ¶4‰���ŕ0ÝŢŇAHhP× 4: pł‰¦0Y¶áI^l"������Ŕ[6±—·đ`Ű4É+oj—4‰€ÂdYŇ�$4ŔÍFŕm/íéÉ^,fË’&�����… /6‘€bÚ¶4 aşZ °Ń pnoé��Š“eI�¨¶e¸°üB¨��Đ»ÝqI.áI^l"�� ˇv»ŔD������cÚ¶á����Y8lĂ����@TËŽ] Ň€‹ią ¦ĺ­ “ n6‘©5HĄd1[–4ÂlYŇ���ưmiÄ����� „rÁK9ö 0�`1,[úaxyK0P]Úizĺ ‹śĘ:5'żTČ�����'Ő’&0����B ĽtÇčŇč0ŘÍ&2���@(ရČ�����€Ĺ´mÓ»W`ˇ �‹á¶<E{�_äňŕŇŽ†{o‹«8Y–4Ałˇ”Ś´ĺ›ü0Ľ¸D Ń›Č����Ŕb¸-§éÖ&2P€movĚ��'Ë’&0����J8ŕVTqŐŢV $0˛¨“I`‚›Ťbr)‡Ci&���B x±‰ ���@NÓË[:€Mpł‰ 'Ë’&ĄI» äĄ:F—%M`� 8Y–4��XLŰ–&0�����B Ľ”C(�T=6ýö—Ă'Q�Mpł‰ ���@ĺĘQm%KV¤•—Ú–&0P,Kšf ‚µé`7›Č����ö šŕfŇ`itěfŃ7›Č�»^ Křŕ®-A«•<Ą[›H “_.1��Ë’&02šŕf€ n6!Mv˝� M`@FÜl …&¸ŮD�d4Â./ô”nm"SějD@Ą d����%đ˘)$xĺMĺ6|;(,[űeI�Mpł‰*–%M`�������„’†ĐZŃ ��°–ËđaZŢ–a����°¶m8€�,†mP��@(ဗr™a·Śr`��Nö­=›»µŇ`Ůĺ¦ĺ6|3��P,KtĚmKŔ���‹aۆ ��@(tNżÝ=w¸\Ň�������%›~ ;�� (ĚŘËŤ†$Ë’&1�������€ĘŽ˝Ľ SµF°Ń% PŠÉ@ ö¤IDč`—aŘhş´‰Đ7;� MpłgŰ’&1�����cضá @=V~łk(ζš;˝|;|hzyŃöĚ€��@B¬ě„Vf€ Ęܶ–'� ë.l™����€1,şh F rifçě—Ĺh` ����\–w÷ô8ÔćĚ„,LD ��PtU’‰(ŔŞ9‹vM,Ěş*É@ڶH˛®:ĚM‹#Ka ���P,KšŔŰ’&0��%ŕֻ٠���`1\¶4‰�¤Óáö–Nb 8Ů–4‰�������zeAZŐ†ĺ6L`€PÂ^l”k „R2�P`—3\B˘{yĹ%Űh$ŢöĹ&«8Ů–4)N¶%MÔŦíw´e ÁĘ…oż ,ťh…E0Ó KŔ�Ĺɶ¤ €, TŠÉ@¦8Ř–4ÂěŞd ŤÉ/—łsĺŇĹR[X���Mrł‰ ��§Ë’FmKšŔ�Ű’&0�€PÂAn2„An6‘����Óe`����������J*—đTˇ„z±‰Ś, TŠÉ@�¤Óěµ/B‚B“ÜŞct·ääm{ô1őKuŠŚ��ŞbÓŐŻT@d4ÁM†0 {6‘�������@(ဗr ˇ„˝fĐh�B ĽŘÄh‚›Ű’&1����–Ó%|XŢN§7ű¶ë@€Á¬«ŇÁd‚›Č��¦8ŘvcÓvI“ ^iÓ˛Ńl®úµŠ ]Ô Ŕnf"#Ł n6‘�������¤ÓámMÄ��������P$ĺ‚—rŞŘéöËh´yw7lÂŚÎT4‘e°˛ŚÄ(•ed��������P$ÁoĹ!�Ăeb�����–+†ĄL©čtxyNb��������J8ŕ­BB ĽŮ ����������@ ĺ–ž¦ĂK9��Ćp·7Č%Lb��X —mÄČč�/2„AÝ3ha„ٶDÇ䲤I �Čh‚;�€âčÚ“Ë’&12šŕĹHm‰ŽÉeI“�Ť°—‹LOňf2�����X —-Mb���������ç~z‰ž3�P1Ü-I¶0AˇIÝ3ha����`1\¶á €ĹpYŇi˛›Č��€J8Ŕ;,K+/-—4‰���������ʨw¸ü%|€��ÓeI“Ń·r:Ř‹Md�������ˇ„Ţʉ ��,¦ívř ov ��Pą˛Aj6©XŐ“ňN!Ŕ­śv+§CuĎ@ “TślKš¤â`[†DĽŘ ČhR÷ ZÄ���,¦Ë’&1�°.KšÄ���B ˝”ÓÉŢiÓrI“Mđ"U€m_äpHň>‘ťH������¦Ë6LPh‚›¨âdŰŤ Ű%Í4�PślKšÄ����B ˝ÉD�����@TËŽ]ІA]L—mÄ��������ʨwyő{aXhizyN`�Š“mI�ťěĺđamA€šŇ0é Yiiठ��@q˛-i�ÂĂôň6a¶íćb‹Ąf���€Šé˛¤ÁA^ ĄA^d"���„2Ld‹Mé•7-—!ŠĄËoáQÄÂA^d"�2:Č‹;F·%Mb��������������� Ş…Óa8 ��`1<-†—2QŘÝ{%%¨8Ů–4€â䪗dÓd/ŐąđÖžÂĹ›#[aIlnĚĹ$b�€ěňĹi)Q«<±&0 “ĽČD��ŠÓeI��€ĹtٲÇĘ©Ů@������€¨NŰ4„Io6‘��XL—m8€BIył‰ ��������PR»čM‡´¤“ĽČD����`1]¶é����Óe(�J:éÍťC×¶4ÚNÖ d�TŤĄĺ…–Ë0���b����€’Ş×đo»,ďÍjě4ő˘šD¡H,DB ���Č‚¬$#Sa¶fÍUp V"„3M$`�����(N. ť&{‘‰ �����€ĹtąL3Đnßl™�Â��Štűr)������˘Z8]¦ `Ý~‘Ăl®üe1‹Ś�dÁ©\˛c·/hÄ6*d˘iBÂŇ$6´—p����������%µSőZŃ’ČĺÚĂRÍŃm&já /Ň /2ŠŮ¶ “ÂäŞ5›ň"����ˇDŹÉß.O§y‘ ·¸±RÜn˛ ']e`�����€ ¤“Ţd"����J:éM2�@_ޢ€â¤ëRÇäU“d �Y8¸kŤVXZ.Ů1ąmĂ���dá /2ŠŮ¶M‰őš;F·mŔ�������%zL˙˛ť"{‘ŚŚJąéňwaŁf),����� L§öe™&©8ضa¦�€îňÍž"3˛ŕ�ßč.DF��������°°`UťD»"#���‚"ťäM&2������€¨N—éÔŕűjOÄR�€Ĺpą “âdۆ Lq°mĂ��� ”č1ýËĺi ;'oz㢮 `���������°.—éPŕŕ0âlۆ ��������Č��€¨Ćé4PB '˝ÉD`1\.á cňćŽq·m8tÜáň9ČÜF$Ä�‰]M`�@ň&UŔ]ľŮ,2# &Ĺmšn*0ضa�˛p7™Č��€,äM&2�PÝÚ‡čÍ22�����`aş\¦ ÄÂAŢdBÂ]ľŮ,2Pśt]”���€ ;Üţ–P�Š“j38‘ É&]Ĺ8ëş(St]4X8Č›;F·*ś&ó&b������XL—»ąárEť“ż-&‘ ÄNdÄ�@qŇuQ¦0éŞŕ4Ů›dd�������`aş\¦J:É™Č���������µ‡_Ęłcĺvul¸Ü˘ @qnm3��Ą“ĽÉD 8ąlĂ���@(é¤/2‘�����()ťôEł1۶a±pp݉,a� yé;˝üŤ›GvnlLB � öĘfćŤ"E`GĆp» $Ě‚® a�����€Št’ݏ¬ZD“Y8•Ű4˝TçČ­ )™›HDX8Č›8ŕM&2�PślŰ0‰‘…ĽÉD@ĆÎÉż«›Á&É„)Nş.ĘÄ��������AI'}‘��� ”tŇ9� ”t˛÷D–!Ń ^YŇ$Fđ¦ÎŃm&1Pśl[v ŢÚ‡á;YRl!¸+_Ô)������J:É5Z8Ŕ¤4Ŕ¤4•Ű4˝ŘD� 8Ů®Ž —Ű0‰! ��'Ű6Lbdá o0!L¶mŔ��€,䥜Nö���(N—m¤îňÍ=Iň���…ĽÁ(fŰ6Lb����„’Nň¦ĐÂAŢ`"˛4 š}[fŠ“»µA^¦Ô&J.&âą=´wąˇÝ†ęU^đ[7ŠŚ��‰&š&D4ł´„� bea‡ĄÝŢ`WĂpą ň&2������� ”tҨâä˛ “…ĽÁDFňŰ~“ )5čşIlť`,€,Ą°¸žŇ¶&C����%ťô&2���‹évÉŽÉm& ÷šČ’&1��˛”ĺ–Ű—é �Y8ČLd�����,×6;vu­H’�¨Xµw%Ú"Ň/đ“íBq·-Z˘Z@$›HDTcŁ˝Q!!a��€âä˛M!dÜ— L Z8ČK9ťĚH¨…Ľ‰ �€,ä TqrنŮĂôĺ%tLl- âb†i(oeÄMš#Wµ`–„F—’Đ�wůĹś‚1���€Ś=&˙ŇDĆ�����¨°Ňl m9Ą›Č���@qşmS˘÷ĺ‡$FňU,•6!í˛Ů!9 .Ű0‰��(NîÖ†j-ŘŐ0vą°ç¦—ß‚ ���������� (é¤/r{ČvW“±±`�������E2Ń-.ëÁ$łť Č���T«[D‰Ăä˛ “H76ÝţUܸf$a����� brٲcrۆI �¨„{M\ vI“€ŠÉe §Éľą,úo7g7b ·Ű Z™OUM)‰ H���������MrŇČćę&Q"RÂA^ĘÓMČ�TL.Ű0‰�P y)§ň€ŠÉĺęŘp· ¶Ái*o � nl´÷/* "dÜŰú€V&"���ParYÂéPŢŕ@RŘ ű·‹`ÄŚ��������KÓ¦ &b2� Qvq‘M„�P d§a«+1 ŚPa°ŞÇŢt٬ ‘X„˘PжŞ@Ä„���Š¸Í•Ě"3�Pa˛čbĂdŐe™��¨0Ůj‹Şm¬üRž«br٦I ������Ëév™&©»ý§ITŢ #����@hé$_`"*á _ŕ@����bďľg‰…$*&·«cĂĺ6 ä Ld�@% Ôdˇ,g—mšÄ���€J8ČEÇÂö·|+O™ŠÉ]o°Kš¤ŠÁ[ű^Ě@ ���P1ąlÓ$�����Ëévť“—mšÄ������„‚‡o_˛)Í€ŠŕˇÝNÁe^Ě@ ¨\¶a §éŰE2P 'Ű€„2›vóFĚc�Q(♞ ´2d:– ������€Ąév&©brنI¤„“ĽÁanm+2$1����@(řčŘ·/ÓI ����`!öň L††5ŻšQd ���Š¸Í•Ě"3����€ I&˛ŚJaré˛I ������Vs§wɨE–‘ sm+$WZ„„»wŹfŞ#&«("��Paré˛ÉađV|Š.$‰2ŮŚ ����������őÂĂeöĽtY&�������őt»b�,§ŰešŔ¨¤“ĽÁ–pÄý¶†‹Č��@Ĺä˛M“P 'wOl‰Îąk[‘!ÁžłYś¸HDˇĚl@B ����� "¨ŘBP '{I '{�€ŠÁe›&1���XŻVÇĘ_ÁA„v\Ôű"‡pÇĄí2Lb������ŔrşÝ›n[xHRlˇ!,ádor �PÄÝ~‘HŞŕdo2 Ł"śěMA í6„‹Éxfi)‡F°— ̂˖’Ë6:'^ZJÂ���������ˇĄ‡ňVş{ -îśÝĺŇ/ËŃ1ui)  'ób����������@Ň~ ?âľm`���P“<ŘE—eb�������Ŕ‚ŘËo0dvśÉ )’ «("� "śě d���–łkŰBź‚/6  "™ ŘB“ŘÓáŰE’ ������–†—.ËÄ@…ÁĺŐcG»7Á (��)‚Q­.sWl���ÁÄv0 ˛`b;)Nőu…¤ňä¶ś©�����������E|™\í’٤µN¬JfłÁÍ*É„P,J,Đ)Ú® ���������XZłH˘N������Őxş*�`9Ľ\¦C“˝ÁÄÂÉŢŕ@�����°^î†e›E6(ŕdo0 Sapë˛I �€Jxh/§áÍd�Š[:wjob@�������KĂË"ËÄ���BKĺ Č@wűE"3km‘-’IŚL>$»&j2P '{“������������d���QʧÓá �–ĂËĺ0IS—µrł‡Á ��������)‡—Ëá ���@héˇ|SŹ©{[‘!‰"îŐ÷,° …“}Â���������D=ž.‡��������P†ö˘ßŇäd@&łěćV^ÔuI" Â`Ó%‰0�*ád_ŕ@��������X˝ü&‘Pśě Č�€Šŕd_`@� Âŕ¶4-Ř m2������BKĺČT nK8ť¶Űiř –, šőb���� Nöd bpۦ Zxhwç†73����@%śě;îp· vI“����•4@±2���ËéĺîŘtű깣͛`&ŮD×$‰0��*‚“}b�����*L^ş,����`izą 21�������()|9ür154± 5ĎP^·2Q ´0Řt±qjŚŞ]0p$ĘtdlůEŚc�����¨„“}QŹ©m]!C��*ád_ŕ@ bpۦ Z8Ů8��P öd������������˘^tîÔąC§ň TĹŕ¶M“����ˇĄGŘ—1ŰŐąéĺ–’E+[H› d����@-<Ř8P öd���*FßV,ú®xu†‰ !lXń‚L CĘĚ DÄ����›ĄiŮj-/Ytˇ<±hRUlşý%= ��@Ĺŕ¶M“ň��������–ĂËĺ0‰X/Űč|éśÜ\D9™��������Ŕâš­´�şg˝��������������������������������������������������@� ������� ����@� ������������������������������‚ ���������������������€@������������$���������� �� ����(€��� ��� ���� ����� �(€���� ��@��������� �P@����� �����P��P€��@�����P !€����@@�����������@A"��€‚�€@���@ ����€���A��€�(��(�����������…���� P�����������Š�€"B€P��� �P�P!P�ˇd@ *��*H€‚ H€‚(�����H@¨�����¨�P���€ ��L� €Â„�X�&(@�(&����`†�0T �(��&��  0IA���� &�€‚ (������„š�����„� P�Ĺ*&LBˇ����(�&�����&˘P�€I��`���&˘JQŠ����“ �”Ŕ$�P�P�s5Ô$“�”Á\m�&aŔ�(�� RL2�Ŕ��� ¬ ��  �(�PV0 �e�“���e�Le�“�C�d�P€!e�L��”Ŕ€á2��C��  €2�Ę���€I�  (€I����  €I*�eŔ¤lB�����  ����“�����j#���“�“��L�Ŕ$���0 ��0`����”C �“ a®ŰL€2�¨Ť� I�`(€!��e�e�P����”MÂLÂ$¨���Ŕä˛�¨m�����L����(`ŞŐF����(›If�����Ŕ��@“�PĆ$��”Q   ���€2� l€ C��`e��������P�Ŕ����� l’2��Ę��L�€I��@ĚŐ�����„:���e“��e�0d�&I�€ �����s5†€2��&€I�†”1€!�C����� �0��€!�TjŁ„á˛!<Wc0ąl��e�P 2€I�����������0dH�P ��Č€IĘ��€!�� ��d�”P � 6�����€I��€I��€!0 �ŔĘ��€! ����C� ��0„Ş2„™ë0Ő��”QP†�P�L‚�u����`R¦¦��Ŕ$ µ0™���0����Ŕ���P6„'dL�@Ŕ��  �Ę��@�@���0 ���@L ěj0T++cÔ��ćjLÂ��“Lť a„��j#�Ŕ$<I�T��€É�0 �”��Ŕ j��“��e €ąC�������(€˛!e�`’!��ŔË Ŕ„2����Ŕä˛!Cµ‡d �0 �Ŕ$������€ ��`��������Ę„( ��`Ő€2Ş�”É€jČ �Ő�PV ��€ ������L2���������“T*�L(Ł������L@ŞAŮ@�`ʨ6Ŕ@�¸ ”��`Â@j aPV������Ŕ$@    �����€2�(2Y€2���`2&Ń��e��e��0W9 „  `“ ���TŠ �ŔL�Â����“�a€2����€2�  �€2ŞA€2����&�a�`2WŁZ `�€2¦SŤ ���aČLÉ���e������ĚŐ€0ˇ ����������((���d��0L€jL�(��`2�Ăä2P±j�P���L�ÂČ�  ����„�������(+��€I(P��P[�ž�„ˇ �&�a��`€� ����YQ�e�“�€ �„�����(��e�C€0������0 ¦lrm†�„a€�5������&Â���e0�”�Ěul€a†0�@�������ĚŐćáđ �L„�€ŠUj�(�„!¨Cµ �Ę���`†0�0 “Ă��&ˇZ �”1ąl�Lsµ!™ �€™„!<I$ — �� aHĹ&‡‡Ă ���”�0 C�„™d � a”A�†0� a� b��(@V����ĚŐd†„! ŔT{8™ąl¸ÚÚ* a.ÂĂa’2HŮT+�  @„!<!Ŕ�” Ę��&©Ť0„j0�����Ŕ$<9 A @”Í$3„�����Ę  `��“”M€jŐÂ$CjL���Ę &aĂ$ — 0�����“0„��«ˇ–™ 0“ — — *a�����&áÉa’2�P0��0�“ˆ0ePc2Ŕ�0×1%Ú�“đä0 �e�`®6OÎ< Ŕ$<9L.›Éņ0��eePöpÂ��� c¸l�e0a ĚÔ±Éá�†0„5€'g&a�€!¨e82CjLÂ�Â��†0\6„��� \mC„��Ę L5�0 C†0“ #™`C`C�€j0ŐP‹,C�€! ©4��@ )0“0����”Axrf��† 2�¨a€! �C.ľÚCĘ �����e���¨„!����dęĆp´A†d& �Lµ“kŔeCŞÁŐD�`C€j“d� aÉ<„'‡'a�( 0OOÂ�@„„! e@jm0 C����&a��Lµ™d.�C˘ �€j@�Ŕ¦\1BmL2SŤA„™«Íä̤ ‚ Â���CÂ��€ ��� Śá0sÎLÂ��e†0„®lsÎ<tŚ„2�“0„��������2\mćĚ„á˛! ”A„! �Ŕ$ áIÂ����T0� a����Pa`j �0µ g&a�`† a aŔ†0���P  �Ő Ě� a0„©[M¨6€jL2“ )#Wl’™0\6d€'‡'�C2ČeC2Ŕä˛á«=„���&ać0�(0��0 OOÂ��“0\Ű$čŘCušZ¨aŞa�`��L€2Č�j ”A�¨ąLÂ(” É ��ef��������€IP ä�Ŕ����Ŕ$e$Ă”A2SV„§n2eĚ��2�¤Śd€˛‚�Ęŕj3ÉL����`† áÉáI€IR$˛‚�@Ĺ < C��„'gVŁZţâ- ĂeĚ��  ’™0!L���\6žÉeĂá€I”A2 ¬Ŕp�“”ÍÉ ‡ą ’™�������”A2  0„ PÉL(d&�L`Ăp�����0©ŰĂáá0���Ę“™Ô ™ ”1'39L€,pmC®mHf”A®mHf��@$3��€ Ě|Ů3O&ÔF&”A2���Ŕp���P1B$3�”ÉNm@f��”A2  ’™�ľLŤŔp����������L`8 á0�Ę“yr®Ć\·őóÄ™ ��eĚÉ<9L`CPO5HfB$ó†S$3�����  ’™�PÉL���(+`�&0&eTcČ áË&ąŘČá™S·™dž†3S@$3aR6üeś8L��&0ś™��ŔfNž �@m!S·G·óĚçÉ<Ë%šOÁ$2Y‘�����Ę yĂ™ 0áĚ«Íä<O0pFŤdf”AňpŮđ™áĚ�&0ś™ aćäÂpFŤůrçĚśŁH&€2¸lŇŠ#cđäk{ôŕ@€2HfL‚Z†<„©ŰĚÉL�`Ă—M’™P†Ž‰0a�Ŕ†3�`epň���€2Hć LÎL«Íśó|F¦š��&arf��”A®m’ ™¤6˛I2��P‡epµ‡Ż6şŐF`Ô€ĚLŽ63™P‡™ą $3—1'Ďj2s1HfPÉL�����`&g&��0ÉLÎL��d&g&�L2“ó�Â�� ¶"Č€I><“3��\ŰäĚs���0‰63��&™É™ �eTc’!��“ĚäĚ��€2CĘśgrk›Ëŕ<M"”ÁeĂÂd&'�ÉŐž9 0‰¶ś™�Ŕžd&©mr°ě @m´M’‡Ë=8@2““��0ÉLÎL�����d&g&������”1'Ď“Łmrř±·äĺ^î`�Ô2jĚÉp$3�������(d&€ �  mĚŔä<„I&_Ű$�������Č��`“3C`r´A2s†':6ç<ŹćŕW‹¤D��L`rfeĚsĘž|p @äb#g��@sň<×§ÓlD�LÎĚĹ€3399"L��&093™dćş%Ł ��e &093����Ę ‘Á•ź~ňÉŃ$ĆPÉ<LN"��@ulrć!���PÉL(›„ź|ćÉ™ ”A2���ʨĆ$z;dÔ“™0É™ ś™”A˘ ęz›$ÚB®·Hš ����@Ő2|fČ™ xÎyÎĽnç™(˘É šd1c’áŃŘ7=8"��PÉL������Ę ™ ���“É  ’‘_o3źł~“°Ř#I!�eĚ—=5ęśĹ�é‘°ŞâhrÖ0H˘3ůjGR˘óčÉ-XAĹĐş8R"Ŕ1 fehÎ 9arf„Q;“¬7<+7<:€&Ŕ„™śPd&@$3d†đ<sÂäĚĘŕâá0jf���ef2a&ç!CňĚy&'Ag&g&YĚĚ������€ 3|xŞ2Ďa†r���&Ěäk{fBĹ8g.‹‡ĂL`ÂLN"�Ô–dHmf�����PA„™�PV–3( 093€2ŕĚ3���€ 39Ń[NfH�frfL2“3��ĘŕĘ93äĚ&SF’çY s0�(ä™��0ÉCňÔ7m'ĆĚeĹ•Ma&“ŚÚ2�&™ąn9ŹÎ™ˇ'���  Â3Ifrf“Ě$h›ó×9Ź����€IfrfB„‡�@„‚63s2“3���`’™ś Ú$3džóyÎL"��eµqµáĂO5 3ä<ĐŃÉOš-zr1��0ÉĚőÉňL���eÔŤIž!Ěđ™‘ÚćůYDZ*B�����É`°dĚÉóŚ‘YŮÉLµ™eĚáÇś0â§ą!)šśA˘Ia&'�€28<€28ü>óŔá |4B��•ĚóµăŇ 7Ş0Ş HI4ÉRÓčd@.üčI���  φđpÎS•3�€28<jpx*�€2ęĆ$Ď�Ęŕ‹‡ĂQ•3€2řâ©cTE��P‡g�����Ŕ\6óWË`°BˇÚćüÄ�É`°����H‡§Ęŕđ<Şśy†ÍPkŚÂ($šB˘É$‚ÉI@Lç|ž3“������@€ �&™ÉyČLÎCfr��  ���&ĚäĚ�&Ěä<jËŐ”oĚ™)Ä>ƨżĹ( 0E����Lf“ó“¬Ú9ĎRE€Ifrć%R‚ÉIe&'GĘ™çsfNd šKžçĂÚé@@¤D™Aç=9PF„™ś™��euNă\oGc9xĐqxLĐ–BF€ÚrµáĂ�¨ &g&”‘ĂC�����`Č<ü‰‹��*¨É™ ������eäđ&Ěä<€ 39ëí$ŁŰpxâĹ"Ďó4eńłĆh‹LµÍ† ŤA…!B˘94 3ç@0“ó±BöóŠ# "fNĹ�`¸¶gúLUǨm’Ć@ir+¤��d��TP5FUÔe3ź:Bdćd1ŕŃ'uéËkËyÖ����@ę’ g&LfóŃ��”M>üĂCcÄ YÄ`E!b&�`ÂĂWűg{7Ž«F(Ş"��˘jT"0ać̉€2rxÉ0 y"<ř«KM:�0aćś@9<ŐĘÎy‚ÁśD(#§Ţ˘—ÝđÔ@ĽňjQ�PF’gřş=*\ZŚś™AíLň@��“Úćü«Ć¨Š, !™I�����0aćś™�eäđ(#‡‡�Cćá3L>k *"`2QK>ç�™É™ Ëa”C�PF�€2rx���•ŘçĂóäĚŁK���PAŐU������ĘĘN`eäđ�¨ŤÔFľěç~â��������@mäđ,"?qT��Po‡ a��0g’‡OULçŃKšDŚp¬Íc žáčG���¨`,;G„�“ar±<¸9<��”‘ĂS_¶řĐ#T±jŚŞĆ ˛ćĄVĄż•PD�A2“�€z yr˝ŐŰ`ÚňyĹ7­��PÁĚ™#‡�`‚¶óˇŠ��������PF&<I–’gBÉyΙ �Ŕ„™sf.F�€ą¶áĎé٨€€"Ş"�Ŕ„™sfó<5ĆŞ¬I ”@9<„2rx�Ô–dČL�0sÎL€2’<ç$Š9Ż[fp �”qµ e!y&�Šq5&y&����µ‘Ă3���ŻmřŻö“ bPa„��0aćś™�”‘3 sÎL��0sÎL�€ 3çĚ€2rx��LĐv>T��������ÔŰ|ë€�*¨Uë8ę”I…Ơ€� ‚ŞQ#cđáŠU#��¨ C€™9ç ��0sÎS����� “���”‘/{âĂ"����’‘ĂC0ažĎxĹҡ5B��c5*ŽvͰÖx`Ő��CoěQ5Ö‚"„"ŞF�`F����”‘ĂC����¨lç䇡c¬ˇv†+ťa]ńŘX`­ÇĂš6ę‚&¦R 0F���€dÄ`U����@ęS·ęÁ«"�PAÍ9‰@9<s1rX[rđD€ą¶áOŁ�cĐ–…ąQk<j1`Ĺtv­X1̤1 CĄˇ!�€1äŕ‰ĹŔÇÎĆkŤG-šI…��!ŞFE���@2âđČR˧ޞӳŞ1P!�����j#‡g��ÔŰ!Cę-9ő6çĂś×l,šŰ,ŞÂŇćg=Ć ĘJ "DHf���0sÎL��ʸÚúíú@ž™D���L† _öĂŁ}†"B�� 1Ň.Şl38Ěë–y±#���LxÂç ĆXYbzć\Lś���� ¬Ú!óĚçĚ� lNć'>1 9<2rx*�j;Épřٲ°íçˇâČ48�€2rę7šÁ‰�������µq5ž×zę"F�@ęR;™0ÉsÖoŇÖ Á‰��µ‘Ă�€ÚČá™ÔFϤ¶9Ď9çčLµđ€€¨¨@Ä™9G����“™9§nZ"bäđÄb–#0�&Ěśó…™ó)DfÎ���Č����@fÎyj2âÔoQ� �(#9?c¬Q5j„��0sÎzCU>Zi&1IÁ䀲9g~´Ć��*XŚŘŘ h„�0a朣žÇ¨[KaY=źxÖ�����T9ź5 óś���€ 3糊`ć<TÔvýD�”UÎ×fś<@Ůɇžˇ Ăś©TMb<ęxÔC€1¨0Bˇ�ńĚgFŚr’™����eäđ“Ěó©c,bčÂËćY rĐŕD�(#gfóśr������� Śž eäđL�jKÂśy�smŽÇ(�@UcM™��$#«(#‡g�����eäÔo“˙˛^ë1 �` *RD­1��±–^:Â��€ ŞĆ1Bˇn< ŞFĹÁyÖ1Ö!��BÄ<u“4(„…ˇ×!ĘęDzŃĆŇ#Ö!�0†VŇ�L9Ď ��)ĆĆő¨k„­¶C”F4F€±x&]c!DĚs!™çD���€ 3çł*€ 3ç3B���*ő6źŹń��0FŚt‡* ÉÁB���)şĎ1˝‹K!��ڬ &3sž�� Ś~R«v3$ĎŁt„�Ë Â�€Âňůş›ÜÍĹٸ®Ç(����¶+(0j �@ęÁŞ F-hşĆ������ FUŤc-@F˛#†9ź5d 1X!@ĄŢćó ����������*Şjk$#W��@ęĂO���fÎg]µVÇZ#cPá€�c±*şĆP("jŤ��!›QýŠز¨ÂCЍŠg„¬˝ <óźăZ#�!DÔŁ1ĎČnyţ ���� ‚Şq rĐŔeŘ2©pˇ1İ3V n…ô����jęŠ?OcŽ(DÔ팪 �€ ŞĆ!�TPőµ¶X”�ŚŁjóŚ€2rř��şůŚzŐ•fRáÄ��€Ô'[Z8 aqă�Ë +�@ÚĹ•îę±đkŤ!X\ńkŤ!����� uÄન[—˛‡Qk T$óś# Ť~â?„ ˘™T8ĐT8˘™ç����ćůŚqh‰]ÉéÂZcád~ťŤ*���T°j¬ŤA$#?�5Ůâ±~DEÔŃT8 �!˘ž˛&)ç'Ô!��Bx2Ď! >PÁ39Č<‡4ř@Ć ¤°ü©xjŤ���T9źm×kz&!„şŤY­ëxPU���������’‹��� u“ăx­��€ ŞĆÓ]Tá€����’‹ 1¸�H1¸’Ąëvř3±Ö,¦ «âQ×4« 1 ��Ś\ćq>µŇLmCF@L’yÎ�Ŕnťúm;«ڱ0P:ÚnŕÂŁ±Ŕk}Ś�������¤>u/|­ŹT�B¨•fRŮYÔÂ1‚şŇ2eşÖqH�€Ř˛×úH´đ‚şEpQ:B���©#!X†8p„��HÓHk,ÄYfn=óY2áÂc\k ����@ę”\�@ę§îŇ…#���H1Ƶ°íĆ��RG¸B�@ŤZ±ÖjłcýĄ?Č���� ŃĹc‡��@ę+ uÄÁ€Ô/)b­‘X ˇńЍ���Hńaˤ#"ČóśrĐO�¶Ęg�Lň3ůăŠ)«ŚC:P:tŤ!���„°b­1�±b­1 ŚXk �������T°ę8Ö� ‚UǵĆP#ÖC��„0â¶;pá€��� ăŕ‚���PÁŞăXC���Éę8Ö­»B: �!ڍk<°ngc-ćP ��€dŚ���T°ę8Ö�T°4;B: �RtńXÇŁ4b­1Ë$�xŤÖC���@+ÖŁ1ÔÂB#ÖC��ÚěXáŹ(�°LĄ@ĹPG\ú_đ€ŠˇněĐ…` eá€�����ÉW@k]ëq\#b­1������HĆx˛k:C”Ž� ‚UÇ“`ŚĹ2F¸B° qŕ–A+"@Ý !†ŽŞ�ž1Í®+UŚĆP )ÍÖ…1B!ŚXk+"T€ÍB˙¬§™Ö[aÄZÇ����PÁŠŰîŔ…Bv+„ŰîŔ…B±Ö4ÓÖ!6wčÂ…kC������ ăŕ"�����’1.˘‚UÇ:†�ŔăŔ�¬:Ö1 ŚX·ł±něĐ…������¬:Žk�PÁ…C]Çh µp@�µŽ!�aÄşťŤµp@€1S-ŚŁ®c€1ÔÂ�Śq`š•X1c ��PÁĹ/]Ç�ŔĆÂC±Ö4S-����\zč:’C•޵Ć-řZ?Â�ĆPËÎb-������Hăŕ"€,ÍŘ,đŔ4·wńń«ť†Ą„ ���X†Zö,®möX_i�¤´p„�Ë …#1ÖCUͤ+>ƵŽ®ř×í L"®°j0 µpC•kC@#Ö:†��0†Z8 X†ZxHq\×ÇG˝`�„Š1Ö:BÂuÜş �§î ��ŔâŔEÍÖËf_ń1Ök ¨!�!›ŤŻ×ń±Š¨ę�aY]ˇ40Ó#Ô®Ht�ÂU1kC�@ ��¬:Ö1����@2ĆÁE�$c\µęXÇ1ÔÂ����� ˘VŤŹëŔZDZlŻŻń dłx}ĄI����A±*FÄĄř…����€\8ô(×��€ Öx­Çqµ! ��c¨…�ŐQǡë‡J@µŮ¸í0V{ĆÖÂ���ÄR1¬c2Ő˛gX ���¨±XUR ����Ô¨UÇq ��������RG|Ô׸Ö4S-e¨…BTŚXë,C-<¤kC���QC롂b�€P`©bŤ[WŤÓěz!Íb-h µpC-��ĆęÉŮÇ늀0„íVHd µbÄŔŇŁ®c����� §ł´ÖBŚ€"†JЎF¬u ���Śqđ’,=tµŽcaD]Çě)9äJgp˝ĆCDa`ÂÍ=ęC���0†Z1"˘®ăµŽ!DcC_·źŃ­ćĚ@ĘT G@#Ö:Ž…kC0fÝ*ĐČÖÂ1¬öL_.µâ¨5B��� „1^ëă¸j„( jáĆP ÇX±*FÄZÇ���€Íâőu|H�€06˘®ăCKŹz›E ������Śqđ’F¬u ÁX¬5ë:Fc¨…PD¨¤��HĆxĘ]8baÄZÇ€F¬1F]C�ŠFú@W{žc�����T°ę8ŽÉ���ŚńÔ˝Ö5>Öu �€F¬ő07ôk}ĘĚJ=ăě˘GÚĘ”–2†H ű‚����@#®u$‡Z1†ĆŞŇ�„"B…m6ÖŠHwë` µp@@#®u …0b]Çë¬Ă hYŃŞ������¨`ŐŁFD\ë…Aw+J‡9ÔÂ�B±®ăŻő1®J™XÁ�������@«ă@<ę>ĐjĹ@ĵŽäP ��Ś1h™67ęk|H�` µđŔ6;®˙‚2ÔJ+p€����cfڧŘQ/QGýÂ���@őĆë6Ě����P­-%Ą×:†€ƸÖ1�€eŞJÚáz{vÚ˝ h@aÄŰîŔ ��� ÄŠkŁ0âş=‹µ0ejWö° ������@«5FĵrĐ+>Ćk Ŕ¶+Żëń0 ´,‚hŐ ��� „·Ý1¤qÔ/|€��aĵŽe*zlw^x@��4Žú…„ ¤´[QúF\ë1čăŐ�����@dŚ#]Ů륏°Ą»Z‚ CYx@�‚0Ƶ¦pu]Ź´”(+8@����aŚk!C-< öĂXz�Đ8ę> �ĆP&€1”)~­?R€ HłëńÂGXĘ��!¤ŮőÂ����Śqđ‚���$cĽ����’Ąě1¨EŚxđzÔëŇ×!*+ŐŔJ3ŐÂ)S-< ��` µđ€@ ��� ˘V=Ž+9Ô€dÄC?ë X,¬5>Vµ$6čK˘b´]†I����,†Ň0A���PRiăşÍ…µôHXÚ�� *ƸÖ1����Hă#vW”�Ëb­ăÔ­ăëúÁ<ŞbŹîË, â8°¸ĚÄV §_öx\K d´j„����–ĹZăc˝FX˝Öă�–ˇ���PŁÖ¸Ö1Zfî*Ä€˘Fę€F\kšé*ü¨%5†��@TڏÖ1���±Žú…@1âZÇڎć W|Ś×mŚJÁ€e¨…�€e¨…���jÔŞÇ:†� ÔÎŽëÁ*@FZIA���°¬T‰ÝX-Ä0VUĂv/< C-<Ś•jÄu<p­#��Ŕjá+F\ëHUz \ëB(F\ëŚaŰáxé»»†Óä%ĂP® *Ł××0‰��(†Ň0AA1âZhĵ¦aŰa,=@ĹkÇ‚WŤ�BHłő ŹG]#Da°uÖ���BXqŐo»#ľâG\u(Ťi_×�!ڏÖ1C-< �����&šÄTAGTestTitle���������������������TestArtist��������������������TestAlbum�������������������������������������������������������˙�����������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/tagged.wv������������������������������������������������������������������0000664�0000000�0000000�00000225523�14447736377�0016762�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������wvpkN*����Śc�����"V��YĽ$sóü!RIFFTŽ �WAVEfmt �����D¬��±���data0Ž �BWWGVH��y�}�m�$�G����őęô������ ± ��u���e`��Šä�ů_˛ó˙ďĐý†ĺžčÍ~ś§1!"‚!!ŁG°9›™€!0"01°�� �°GŮ �ŘŔDl0[Śh@dFF�0�#1"iđÉF�#"‚¤ÁA h Áh`± „že H4 MFB#ˇŃ$“A Â4L$ĎxŔc“ aŰB , aŘ !€ôŔá5-€ `ŘL&‚I¦e21™&1 0űž›€HĚ�M&€†ĹHd=°l€Ľ´ä‘a`Ă@H€hŹAĐH‚ i,üd<[ĐXA‚¤!,`<XĐ �0~őčÉ „€�@LLDđHă°@c‘,1zôOĆŁG4 $@ „!Z¤!` ô“0$ ,=ACŔFZbŇ XXŔ‚~ĐZ` H ĆzX�¤< ŕ··— †�A €€'h i <iK°4Ö/k Ö0"Ŕ“@XĂôBXň°�„„a^$üKC C ` -<Ňzč5$Z�Öú@/a=´ $@k�€ô0´ Aż¤ A€$`,�/Z€´€Ą±4–ôX?k‘A ,`A k@ŹE€�˙z=�� , Ŕ^€´^´†„%üŹÇ˙/ýxĽ–€ ,=ÖF"釖 2�k�hřőúŮ�„!AXŔ°€Ą!ICŻ˝d,ú1l­D&D`@ ’đ�ÂX�4„_Kx, @CĆ„ A’†–�é5đxčőz`A4´ H†�`C† ÂŻ<°4 , 0đZK´�I–ýx,˝†€ i,A¤!� Ć ńë×x`aH�=¤! IC’ i,AKŹ–†Ö㬗� ‚Ö° a�k�ÂĐ˙k AÂ� ‚€%iH xAXZ‚ô?ĆK‚,=Ö´�-@ÂŹĄéč!=áˇ˙% @ C¤‡–�iŇ‚ ×„ÇC/X‚ Z€ C�ÖXxHá_ xŕ�Ň€4ĆŇZC$hKŔKC ’ţńcé…!­!hŇ’ @†�Ň€ŕ_ H�¤Đ�4ihAZz’$áÇC/iŕkaĽ Kz`A­ HcHř˙őŔŇ€�i@€0¤A°¤_Z^Ö?�I�-@ ‚„č! @� á_k é±�i@ĐC€Ť%HkHX‚°Iz< _KC ‚„%hAC‚† <$ zhüŻ~@ŇCĆXŔ Ľ K$üŇ‚�-=–°č€Ą‡4H Ľ�� ��І ’€%a/,H˙x­!,`AÂđŇĐŇkh0$`@Ŕ˙Zc@†� H’$ -zA$aýă‡^ CŻ!HŇX$k@ĐC čHŹ-=†Hk� KŔŇxaiHKCŇú˙±ôi, -H k@�$ H „_/<  €†$H‚°đ‚„%aý?–ô°°�-h - CC€€!a@ú5€˙µ ÖC xH ’AZ -ŤCKđ /ZXCŔŔ†ô€4†€˙—ôXĐŔ ‡�Ŕ°4– ’°éń­Ą‡ $A � i�†0„- �† éXC’ -@/` Z^ú<^ aICZ‚ ���€ôXŹ˙őÂxHĐXCk�Ň?$ - XXŔ ^c Z˙ăÇZ‚ AĐŇŔ/Ö€�@�Ö� hüëő�4ĆŇX‚°4– Ľ aaAŇŹz-<^Ć–€  €Ň€� ŻĄ�Hih� iačH‚„%/ý㡗†$’ÖŔK$@X 5� hü/@c  =4¤‚0^�^ĐXđ‚$HZ˙hA´Ć– aA† �0 čˇ!�ë_x� �¤ c �k,¬!Ic Z–đúÇCK°, xA’~@X†ô€~ �¤…×� = ´�I‚°$A ëCK‚$ॱ$hŔ†�04ţ%= h0�€€× Ic KXXÂú°,A‚´ a ŇCC�Ö��Đă­Ç‚0¤�4�Ż!i,A ÂKC/Húżđ^Z€$K^ôô�@Đřők @‚†�–Ö–IX‚đŇX˙řőŔK€IĆZ€0¤Ŕë1$`Đă_ZŔ¤�CKŔ’€%/K‚Ö?†Ö$` ‚^Ź%H AxHŔ�¤ÇŻX�` �ë! iHŇĐ‚  Z$ýă±Ö A„% ihhczz`áńŻ_x Ň’�„Ľ ,,Hôcെ A‚-`A  ˇi ACĐŻ×x`é!Âc�I‚ IX$ ?/a’€­!-@†ô ÂĐëĆC C‚Ö€� Ň‚€_€–†–a­üĐ/ ‚ a X�`Ť!hh@ŔĐřőëe@=HŹ…ACXzĽ HŇX‚$áôÂx I€„Ą± C€��¤‡�=¤—4†„±� €� iAŔ XX$HZřńXK€ Ľ€……Ą±$ , i` @CCx,`ý4°�C0„ĄÇ °h xi¬€ţ_ř^ôÂ$,H ô„ˇ!čńúő¬5„€…i�‚ Z´�-AÂz üK㱤± Đ ‚´ ‚ Ś@Ňc,Ľ^ĐKđ  Ň h’° éńĐ’†-@’„i€„ aHcĐă× X� Az`­!,H4–$H’ţńĐKCŇXK°-@ č!@� Ś˙_ ?đ€Ö�°4„!@ Ą!ü–€—€—ţÇĐKC‚ „°† @ŇĐ€€ˇ×Ň,�‚†�@��ŕ…± ’$HZ~<ÖŇаÖŔ’ ,A�z` @ĐţőŇ4hhŇC‚†^zh ‚– I?Z‚°�IŇX’ Ľ�C04� üzá!@† ‡ôĐ€±¤ˇ5$Ađ¤ýŇ$AX‚¤%H4 �ĐĐ�†�Ľ~a�„5����ŕŤ%H´ iaáő˙Z’�-k/A/`A ��Hchxż~á�zHa@c`X°¤±$,aa ëŔ’hz iAÂŇ�Ö€�h@z@Ŕ�ţ׏%hhHCC�ôІ†$,@ ‚´Ľ ĄŚ%Z€ %HxA�azH a@xHăőK?†0°€éIŔ’€%KŇX ZúŹ_‚,za, xA€††�Ź54�Cřµ€‡ Ax,�–€%hA´Ľ¤˙iA Ic-HÂŇ€ôĐô€ô�Ö~č_ÂĐ h¬a`aHX^ za¬%�xhIC‚$K^44„!a@z@�0  �` é!�‚° ’„%,aIúÇĐKC„×XX–0$< �k`C˙KŔC„!čőĐ€ ičAÂ’Ć’°„őʇÖ$aĽIĐ‚ z@‚ĆĆŔ˙ká$h` h�„!/=´4´4´Ľ° ýxHKŹ „$ż0°�@CXŔ˙k@Ŕ  �=°đŇ˝�,A$/Đ ca’ á k` ‡� ahݰ�`ahz@C�–Z€„IĐ‚$ýř‡~i`I/ZKĐ@€4 �c �˙’  `=€€%`aAô–„Ç$H– KĐÂ4ô† �=€˙×ë1°0$�€� A¤, ’„—€ńŔ/Hca ’$, AC�4 ý ‡�Ś˙ő ¬‡�h@CXđ ă…Ą±„…Ąˇ~ üĆIŔ’ hC†„!�€� Ť-ŕ!, ,   H‚đ‚°Ö–ţ/ ,iHÖ^ôŇK,č C€��ż~ý¬…‡Ö€ ˇ!h i@‚ HcICŇ$éÇ AĐ´ Ľ ,Ck��‚cŻA,�CЀƂ,K /ăˇ%ŕ` – Ąé! Ť5 �€��Ża AĐŔĐ�@ĐĐkH¤ˇ$,Ľ ý?†^ ‚„h X0¤! éé€˙ë…1 č! €hZ$IcI‚¤ő?ţˇ×‚„h Đ Đ ˇ…$<°€őZX€�€ô,č‡ICKC –đřĄ!A‚°4–I�@z@€0 čŻ_C°„!Ť! hHX$,H„_ú ý$HŔ ÂŇĐ ‚�C�Ś…@řőz�4@CCŔzZŔ‚„-ŕ-čÇŹµ€%=Ö‚ IX‚ A��AŔřő Ź!éˇ5�¬� I­±đ–°Ľ~üĐëőŔ aAđ€5  XĐřő‚4°0°0h X¤,A’~<´ iHđŇ‚4�ĐĐ�~˝ô˙ĐkahĆ č±$Ś$ŕ-hĽ¤ -AŔ ’ XŔŔ�zŇř×€¤Â4��°$hZ‚°$-H?z˝ĐŇc-`i,A =†°ô�ŔëĄń4 HchŤ! ŇĐ ‚^K ôc/xiŕĽH‚CĐC€‚ĆXżÖŇÖ€ /<$A‚$K–üÂ㡅H$/AX€ ‡=CC�Ć˙ka@�–†0$ AXŔ´4´aI–~H –č,�,`@�4� ŕ×/< @Đ€€±� H‚„% ˝4¤đ‚ţńXKĐĐ C/Ň–@�„!=4 ¬ˇ˙%��–††0¤hA4–$kA–~üĐZ đÂŇXÂ�k�4 ýŔxý  �†4�/@đ‚$Ťµ ëÇŔż0°ôx X‚đ‚°4 Đ� ú%ౄ! „!č5I‚$ŕ%H k„Ć KC/K C �C�~˝ĆŔ C€0 A° –° -hýʱ„,,KŇXZ�¤‡ <ô€�@Đë…, ih€�Z’„Ľá%żđřˇ%AŔ-hZĐC�hh@€ĆŻ_ř!HCC€0 =°$,HKŇxaAŻ!I˙zé±hZŔ XŇ ‡�AxH0=~˝0Ć‚�`ahÂKKC Đk/ iA~ż�A– K�, , aH�~-ý˙Đ/á±�H0 ,HŔ´�iA‚´~<ţ IZ€„%Z† Ś@‚€_�`€� �$HKCz ¬ĄÇkZŇ?^�$A°¤±$ C�Ö ăők `‚€!@xa,Ľ– Ľ€%/áńĐ’�,AXi Đ�Ćřő �ŇC��’°°°°°ÖXxAXé@  hKCC€�Ś5ôŔ€0 ˙Ą�Ň�HÂZCKŔK$a Ż˙ÇĐKŹ%’4–I‚Ć€!=4 �Că_/Ś!é!Đ�¤1°$H–đcHKCĐ‚ Ą±$  �  `üż^ iÂC€€†€%AX$ /,ýʇ^´�IXXXX¤Ҡ‡0 ¬1đż^cŔ�AH` ha, xaA’ IŇ˙x­!h á ’4°ýh�Ćż~Ťi4 `HxH H„–ĆZĐ?˙żđŔŇĐ„Ą± ÂĐ€ôCzH^Ż˙_z†�H†$ŕ,HXXKX?¤!,=´ Z$Ľ ˇ5€č!@ĐŇkĽ$<$hô„!AZ$,,HXôX , ’° @cĐ�4 a@żÖ� <†† KC ’4–$AK˙řńZĆ’ Ax ’†4°0°€ aŔë—ţ!H �¤¤KCKż�- é…ńŇăÇ’ŕiHZ�~iH€=đzh`á�ë�†�k@C Cx -@’i=~HKKŔ°-ŕ…H� az` �Z/<k@€†¤Ak`a// é¬ÇC’ Z€–†– , H‚�ý„ř-ü†4 aëHĐX „— ,éŹ%,@ á ÂK�°�� 0  ��hC�$Ic Ň‚$¬¬Ą˙ÇĐZCĐ’IxA  €€!`�˙ú5aHÂĐĐŇC ’°$AZ?~h  ICK$AX��éˇCÂÂk H0 = �^°$HZXĐ’´ţ/=° ,kZXKXÂ0Śő/Ť!`€ @ŔŔ¤HÂÂÂ^ĐÂă‡ô‚�I‚°$Ař H† Ç€ ˙…1 €0 a@/@KŔ’ I zA?~¬% I$hIĐ’�@C€đĆCÂëĆ€=°€‡„‡04$AÂ’†^ô‚¤őŹţé–†„$Ľ°� !`�†đř_K° ahh@c $`I‚´$aýx,-@xxi,a Z€!a`‚ca@Xż€^‚0h@´ H$,, ZÂúńŔkAcAk/ziŕ† Ś� HxCřő�é CCĐICK€$IĐÂzüCë5° / ˝ zŔÂĐ� �ÂŔZX �¤%ŕ%Ť%aIŔKKúŹ%iH‚ ’ ô� �€ĆĆŔúµ0Ć`á!Ň xAđđđţ1´,`iH X‚$ †�h@Ŕ€€×/ ` ¬ˇ!�0 @c  ĐŇđ¤ő˙ř±´€,KXXĐÂ4$ A‚~� ¬_�ZŔÂĐĐ�$’€—�éč%H˙ŇŇ^Ŕ‚´-=´††„!h�Ň?°0đë�¤ �€4„° H X’ éő˙xč%@–4Ö‚đŇX€ !@�€…Ć~i�‚†�ŇŔ� /K°„—đă±$ ‚°¤±$AC z@ĐĐ˙żÖ� C$IC/ ˝ ,I‚Ć?đkahKŔ’ IZ4�k��ţ—€‡=$ k�$ŕ%/A’°ţńĐk A$,,hA Đ¤†đř_żĆ 4„!č! ICKŔ‚$ ’~ - ^�^–IÂKÂŔÂŇCCxč_k<$č±� ŔC A’†^Ŕ’ IřIŇ K^Ŕ‚� a`ŤCŔ~-�˙Đ/č �€0´4–IđÂ^Ö?Ć  A’ ,A€zĽcŹĄŕőëhHCk��ݱ€×$H´ôřˇ%ŤĄˇA ’°„�‚�†� č×Ň4 !``=„Ç ’4^Ŕ ’¤<^’�I KŔZ€$ ŇŇ�„ č×�@†� @ÂÂŇXKCŇ–„%¬ - ^€$A ’‚†��Âcá!h éńŻcACĐ€4�Ć$/H‚–†^˙ă5 ,H$Ađ‚hh` @�€!Ť_/ýK�cá±€! X’„a ZúKCX‚Ć$ ˝ ±�éAŔđ‚ř×Ҥ… x,˝�ICK/Ađ ÂH´†„ICzHŇ4đŻ× €0¤H´†$,HÂđŇ?~¬A‚ÖXĐ– á± !Ś54° ýĆŻ`H†° @ŹKŔKC ’ ’ôăÇ˙ÂCđ’€%K€�hcA¬ăׯŚ7cXxТaĐĂa ÂҰ éń^& KC’ , ĐŔ€`HŔă_ݰ0 @ĐCz¬±€iż�Ľ A’ţ±4$H€%` „ˇ5�Ľ† i@ŔKÂŔ` , AŔŇĐ$/ Z˙�–HzĽ iH ‚¤‡4„ő�i�XĐKz`aHĐC $HŔ°Ľ aaaýcH ’H’Ć’4´0„5 � ýĐđzI C�,  a ZX˙xčĄ!Ľ�, Đ ´ô�, ,�ĐĐĐŔzüZ�„± �XŔŔ ? ‚áĄ!- Kř1– …Ç’�˝�I‚zÂ�‚ř ‚ ˇ! �ŇX°I$, záC/`ŤaA X´†�i�ŇŇ�„ˇ‡ţ%ý°0°��€€‡HXĆ’4–˝†–ţńXKC’K^–,h`C€! @z˝đC Đ€,$A´ ……×˙Z Ŕ $hA� h@aüúő¬…ÇŇ�†Ö� Ç i,aAxA XZ˙xh-@–€°á`a`Đ ��é‡Ćż�Ňc HCŹ…,Kc Z^đ€đ$HŔ’Ć …‡ !��h@AkéAC ’$`IŔKŔZĐ‚ô㡵†,A‚¤,¬H €~˙’ĆC‚0á!=44�Ľ† A$,I^Â?ëĄ!,Z–$,h @Ň€�@zh@ż^c� Đc zhX�~‚´†„—ĆÂKcý’A‚°IĐ‚@�éé aŕ׿XĐ€� �/’ÖĐŇX’ …Ą˙1ô ca’4–Ľ4$ ,<$��¤‡†0 ­ @†�a€†$/AX’ IZŔúńĐz=° A´�cé!h@Ŕ4†€_Ż1°0€†`H‚ /Ax/¬˙1¤_’€%A’$ †0–Ć��ÂCă_/<Ć‚0$`ĐĐŔÖIIkčńăéńx-Ś%` $ C°°đ�^Kc@k@�‚��‚$Ť%Hkŕ…IŔëk`AĐ‚ ZCĐC4 h@Ň�ôú…ÇІh@zŕ5€I€˝†´†$¬Z„A ‚$€‚č…1ô˙Z �@CzhHăA°$ KĐÂ?†´` ‚$H 0 z` @ĐŻ�¤‡ a  ZŔ ZĐ˙h­!A°4ô´ôXĐ€�aH�ô€´~Hz`aĐ€†�H ­ˇ ĄńÖ˙ʇÖ$@/@xA’ĆZ4ý€ţ_ ? �@Ŕ�H ‚$A¤-hé˙ńx-h ai,aaAxAŔĐ€4 = �ĐăýÂc,�k@c h€�ixIC ’€µ†~üXK$ ¤H0€� `Ť!ŕ×/üŔÂ�@�   K‚$Ť%,HúÇKx ŔkHŇXX h�¤`á!Ź˙ő@z !i X‚$ŤĄ5ô㡗ţ5~ŚőI$ŔX� Ť±�ŹüôXŔŇC�‚– x -@ ´ţ±�aA´0^Ŕ‚$ €0ÖĐ€� zż^x I‚†4€ő `- ˝ ±I„Ąńx¬ĄˇĄ^´†$ZĐĐ Ŕë @ @ÂĐ$ $ ŇÂ˙x¬— @$,@ ‚ 1¤1$�€„ż~Ť‡†=� ¬‡�hiH X$ŕ%`I˙x,-HC’ h X4�¬‡†�@�`üż^ăÖô€Ö0$ -`IĆ–�I’€Ç–�I´°†$ @� @�€ő�ţ×ë1� C†ô ÇÖX‚°$@Z°„<ÖK€$`  В¤‡� AH†ţ× H,<aż�aAXk/AXÂúýŇ ,HIô††ô ¬1„˙%ý€ €04Ö€†đÖX° hičáÇă˙Ąă% ÖĐ‚° Ŕ !�đKŇŔ€5 =°�@¤±$ŕ,,Ť%Ż˝ „ ’€aÂŔÂC€��Ŕż~h H€Ą´†$AÂkH’ ¬<ki,x $KzX �C˙káŇ€� a¬ˇ±Ľ ,H‚$A Z˙c,-`KŔ$AÂë!@Ŕ4 `€˙ë5ĆĐ„!@XZ$H‚đŇĐ úń~ AXŔk,HXX€4 CÂCk , Ť-BéˇÇ A�˝„ ÂôŹ ±¤!AÂҤ!„! Hzŕ=´�@�A€4�˝0´ôX‚ €_z`Ľ€ A’†^´°�@�¤˙żXŔ i@ĐCK-HŔKC’ ëÇCZ$HŔ/`AZcAŔz€5�¬„ń˙X°đ�C€4 _ $A´ţÇc- IŔ– K‚�hzC�ŕ_ŻĄ,@ŇC ZCZ€$H’ţńCż4°, $= ĐC†� hčőÂ�é!C0$A XX$h  ë<Ö¤ˇh ’°� †4�CC˙KzŚ= 5 iŚ%/z K– ýxh c $AZ€=é‡��`HŻ×XkhĐ€��XŔ‚ XxK$ýăÇzi,@ KŇX‚�� a@�4 üŻ5ôcz IXXŔŇÂKCKÂ?€˙~�/AŔkhA㥱 `hŤ! Đ€×/<ĆŇcAC€ô€„ÇÂĽ�I€„°,éÇCk‚°4¤5$ ‚0��Ćż^xŚ‚¤Ň$,H‚$,,Hë ˝ÖCkHzač/�  C€†0ŕ_k�°†^ IX4ôÂX’Ƥ…˙^‚AX ­!Ľ4ô�¬†�ă_Ż! A€0 H/HC ‚$=ÖŇĐúCz‚aičhé!i� z@� řőŇ? é!H‚†�IX$ Xđ‚¤?Ö °IĐKĆ0ú×ë!i`a`ĐŔÂŔŇđ„_�^´�ý€´�,A°¬5$č±� đ�Ŕż^ă! @k�„…5$i,A$aaýă±´ ` „ai,@A‚€őzŤ…!é‡ @AxHk–^‚ a ʇ–4$,@ ´ A= a€†0đ˙zŤ‡ @Đ€ aHKŔK€$,hAX‚Ö˙ăÇzA’ i,A$ @z€� hC˙݇ÖĐ„!aCëHI– Ľ ,é˙ń4–H°á…ń‚‚†ô Aţ_żĆAĐ0¤Ac,`ih ăĄńÂKc ’ţńc-Kia,¤!AA€†��Ö�đŻ< �$<$= ’$H‚°$H–ô?ĆŇk`Ť kh X‚4 = h@�� ˙z < ±�`=4¤ á@Ż…Ľ aAÂx –€Ą±i I†�éA�üzéX�¤ˇ!=@^X CKŔ$aáő˙x¬AŇÂX„%ŇC��hhüë5�XŇ€� Ŕ‚-@ ’4–Ië˙ńĐż�aZ´€—�ÂC �€€čAŇ€�Ś…‡ @xihAk,, x xáʵ iHXđ‚4 @� !�� 1ţ-üŔ� Ź…!=�Ňxa -Z´ …˙1Ö XX ,� �€� �ţ× ?ĆŇ4°† A‚$/HxŤ………=~ŕ×X€%H‚ hč±�@ĐC��hüz ŕú%<€€ő€$HX¤±„µ^X˙XĐŇ A ‚ÖX‚ aH ‡€ýĐKŹhĐc’4´ H‚$,/ŤőĐK $hiHK ô č!�ŔżÖC’Xz ‡4„ZZ Ąˇ%<zA$hZ–$<é5 ˇ5�üżÖX�$`,@�¤‡°I€–�- ˝€%<Z‚ h’°° XXxHúi@C˙K�€@4= †$ŕ%ŕ…-H˙Za X^†��=�ah@Ż_�$@Ň€0¤-ŕ /hAÂKŔ’¤˙ĐZCX$aA @�Ć€ @Ź˙őÂ,č!ĐĐĐkZcAŇĐ ‚´ôX’ţ°^C,,,/A hcŻ�Âř× x CĐĐ�@ŔX$ŕ% -AÂÂúÇ˝H4ô´ Ľ€5@뤬=¤‡Ć˙ZC  �ŇC h ’ KX˙ch ,,ŕ%`I$ A „‡ 1ţ_IŇC ‡�h@€ -@’°4–$ýŹ% ˝�,AÖ´�� €=°� üŻ5�XŇCk@IŔ„%KXx/ý?†^ , X‚ !�Ň� a�ôŻ…Ň�k�†�a x ´4ô‚$čő?ř—†¤ˇA ‚¤i�X€ô€€!`üŻ×x` ` @�$,,HX‚đŇX‚Ö?ř/@ Đ -<„5�¬z` =ü/é$�$ ¬Z‚°¤ˇ a Z˙xč%‚$`aihihá!é C€†�=4¤őëc� =$iH XŇ– áĄ˙ÇxI†´0–Ľ ,=$�Ň€�� Ś-`@††0¤ IĐ$/ -AĆŹ% ˝†´ , ôXC€¤1¤‡0 ˙Ť!X€±„A XK‚$Aë˝4´�Ľ4– á ‚†�ĐĐô€†€×/ ŚĄ‡4°4 =� ‚„„­±-ë?ţ὆A ‚$,†„! CŔţµ†@Âc�$ /A–Ć ZĐ?†Ö„H Đ‚ Ź5 €!ük �¤‡��4„5–iA’¤ń´ ő˙z­!h Z´ Đ�°0¤1�˙/a h @ÂC�đwvpkÂ��������"V��Ż2��YĽ$+´DźBWWGVH��y��T�ř�A����ô€ó������T ’ ��R���Š8 �ů˙÷Óü˙›ţ˙}Ú˙Żü˙ź$A$H´~K’† ­ˇ…5– c�‚�=˝= ` �ĐŔ€´ čéa ’ aIúeči , I¤±$ŕ Ŕ„!�ÂŔÂôö6 а !­!HI–ôăĺ%AŇĐ‚°„-H 5�C� �żžđ�† <��Đ€´€%H‚„%aIřń°^IK$a €04�†ôká€�€� , Iz–aIXĐ–đĂoK‚ ÂZ�žđ  =c đŰÓ4°0°04áAZ ŻÇZ€$háÇCż�A‚$ŕ ¤5`,`h=°@ż~úĽiŚhĐ4i,H„%Kc żŕiH€á ‚ž�‚´‚hh`Ť× cHzHCÂc�AcĽ Aă ÂŇX‚đ‚ţ1–Ö ‚$Z H4 á±�@Ŕ^ X‚ ÖĐCz@‚ A , ÂKă1¤ H„µ†$I€ ŔX�4ţ×kڱ i`a@Đk` X^ i,a řIXzHđ‚Ö–Ň=¬`a@ř× ?°�=°0°,iżôĐ X° `A–Z^´ !Â0¤aHcč­1đÂĂ�^ĐŔ$K¤H’€×?Ň I‚-Ť±0„5�Hx0„ýcha`éé!@ĐIŔ‚° kx ’ţÇX’€,KŔKC€�4†„I/= @† a�^€$H‚´ hIĐú˝ÖŔ‚ hA¤5 �Ŕ�4 ý€ôřő H CĐ€† H´�IkH –„˝Ö€$ I %`zHŇCĐŇ� ˙ő �=„± ,`AÂÖZ$čńC/ -@ŇX‚$k a,@ ��üë… CÂ�hcIXĐŇ´ĽĽţÇk@XX€$`I Ŕ€4 čˇ! c üë×ř!éˇő @€ I‚$¬±$AxAÂă‡^ cAĐđ‚ 5@4444„ÇĆ˙zŤHz`а�H/@xAđŇXXĐÂ?†–°†° h IĐ�€�@�� čńż^ř…±� H„a/@KC ŇôřA´ AÂ’0^Ŕ€!ahC��üŻ…ÇĐÂci@Đ€� ÂK€°°4– Ż˙ĐkXZ´4¤Ć‚^X€�~- °@C�°° `IC– AKřńĐ/`’ a  XĐĐŔ†ô ëőÂc,€4€5�„Ąˇ Â’ IXúý hAŔKŔ’ AxHzĐ€±0�á× `aHCC� z ai,A$,IăőŹ륡5„Ą!I i i@ĐCĐ€†�Ż_˙Źő/�C� iŔĽ , -K‚-A‚€ IŔZC‚††44h@�4�üë…��Ö€††€5¤±$Ť…°I˙xĽ´�č5 H^�0 z€0hüza aa =°�`A°hA đx ‚a $i��¬�„ńŻ×xô0h@ZK‚ÖX‚$,AŇ?k­!h ’ XXcĐІ�,< áńŻ—~Ś‚�@Cz x ’€°$ʇÖ đ‚  H h�ôż„†@� � -, -A„_cAŻ˙ÇC˙4–Hk,HŇXĐC�C�„ˇ˙µĆ �†� Z^‚Ľ Ň‚„ýÖX€–0^X c,h�ŇŔX�†„-<€×€�‚K^€-–4ôúÇ˙Ňc Đ‚ I$ ¬!�Ň�¤‡ôţµĆ�–‚�aH Ľ�,A^´ AZ?ţńZX�–Ć– A�Đ€ ˇˇˇ!Ľ~ý˝�@ĐŔŇC�$A‚„…,iĽ€ôʱ–�IŔŇĐŇĐ‚€54° á!�4 ńŻ50i`a`éAz@z Ľ�IĽ4–°ţńÂ^ I– , CŇŔz�ük �XĐ€ č­1$ŕi,,KŔZC’đx ‚ AkH‚­€4�éˇ!�Czüë…$ €�@Đ€°„5–Ľ€µ†´ ,ýʎ—†$�ż�, ôŔ�z�„ż–~ cCĐ‚$,hK‚$AŻńchI-`aA’ cAa¬ @�€_K� z�h` ॱ ,a - ˝€Ą±ü A‚-Z  Ź˙őëńŔhІ„ÇZŔ‚°4–4ôÂXZCú– iŕ%Ś%A†=,ŕ± ‡†ô ×€4đÂŔ Ó�Hx¬%„@ -č˙Ç/=„ Aa 4đXĐĽ0 =°°¤Hh¬!Ś544H´† A ÂzüĐKC,HÖ$�Ö€�` hč!Ť_ €0$ ‚$,,/K‚„%ýă±$ cI€–�-€! €4 ý€ô’°†0Ö�¤Ň€Ć°a xA–đřń’ H‚°iŤ% €ô4 =Ť!@˝~ ,�4 �†° Ň´° IŇŹëĄ×Ľ€…-`€ô°Ć0XĐ/=†¤i@€5°4– ĄÇ’I‚Ö˙€´†¤!aaKK =á!k�˙ka� X‚xa/@IĐ Ŕż ˙/ýk aAXI‚Śa�h@xI@� ˇ‡4€­!,Ť–†–4´¤ é@Ż!H°$`i@Ň€ô€4†ô€€_ŇCC @‚ Ť%AX Đđ ÂëÇý H‚$,HXĐŔ�¤@Ŕ€€1~˝Ť‡hÂŔĐ�4 X‚°áIÂk<†$ , ’ Â�@Ź5€!`�ż~=ZX��aŔ�iAX„$Ľ ýxĽ$` Đ–Ľ€i�ŇCŔXC0Ćż^x�’ĆXĐĐŔĐ€° hA$IXÂúńXZĐĐk`IC/`  ­€!�Â�ţ— � Ź�€0$`ič5°,K‚~�kAC XX %ŕ CÂ4 !�€~­!Â0 =4°đX´ čőĐ ‚´ <–^/ ˝�x€_� Z†4° ŕ×ţë 1�áˇ5�A’€%` X‚ôxh ´� ’á…! k�Ň�¤ţőCŻ�Â��K€ A xAúńÂĆ XKĐ‚„@4€…‡„éük <–�XxHú! a X‚ I^Â㡤!i,A‚„Ą!†`HŔCĐŔŻ… C€ôĐ0–4´€%`-@’$ü€$Â$hA’††4 ! � ŕńŻ× C„ ’4^Đ‚$,I?~¬×zh$/’�hŚĄ¤Ö€°ĆŔż^ă! A€…‡4 Z–€„đ‚ôcH 4„IĐô ‡44°†Ö~ €�, ,�€�$HkH’I’đúciŤ,¬!IÖ$ý�¬h@Đ€_Ż1 @ =Đ„„%HÂk,aáńc˝�Ľ0-` ‚„‡ ` č!ihý‚4 HX‚ I4Ö¤ ëÇCzX€„%H ŔÂŚ i@~üzá! A�Ö€††4€…Ť%,`IŔ’ őŹ×€°4đŇŔKC’Ć’† Ŕ†�ôĐ^/üŔKAŔŔ0$ IúˇĄ‡´�-KĆCřĄ‡$` X‚° €4 č!�XCřµ�@€44@z@€°,ai, ’$Hz<$IcAĐ– 4�ĐCCxCĐă_/ @Â0¤aHŇ^Ŕ$ Ň‚°¬ đ¤HŔ„ˇ!�C€€ţµ0Ć =�ÂĐа A‚$-H’ţńʵ$@$I´ H é‡4†ôĐĐ€ţ×C x,a�@ŔXŔ$,hKX Đúńżk $AŇ€�€�@€đzAzÂ��XKX°a­ˇ%H˙xč—†ai,,kZ  CC�° üZ€×��HKŇ^‚€—�˝ Ťőcŕ—† Đ‚° ŇCÂč �˝~ŤH‚��Âô–†$` ’Ć Kcýxč%` ’Ć’ IĐ €ô� hüë…°�czĐ€ A´�˝�I X˙x­!iH‚ a C†4€ő€† 4ôŻ…$ �¤ÖĐc ż�Ľ,AXXKĐë˙1đ/=$ Â$a¤‡�hţ%ŤĄé!€�@kHxAĐ–4– Ą˙ńX/@‚ ’4^�X€ ‡ 1„×Ňc, HCc hĐŔ‚ ż A¤5CŇÂ$hK đĐ�¤ Ś˙×k�Ö€� ,ü ’ A°°„Ą˙ÇKáz’°Ľ` ¬i ­ ýŔ˙zH €� €0–Ć‚aičA Z˙Ź X$ż€%Ť% Ҥ�z˙Z A€† <$ IĐ‚„%AK˙cčĄ! ´Ć$aih` ,<đŇ’~a@€ �ĆXC‚Ľ ZZXXĐř‡–H‚ -ŕI4á±�h�Xc�ÂŻ<$ €†€zH ^– IŇ‚ôŹ!˝0– ,A’´ i � Ľ�h�ÂÂŻĆ� a,<`€IŇĐ’ĆŇ^ôŹ!-°$,A XXc�„‡04ţő ř!,@A ‡¤!ič5$haAŇC’hKz ĐKX�† != á×�,�Xx€�ŕĄ!˝†đ’†–° Ixü^ ICKC/ ŇizĐ�ţ!@ř%ᥖŔÂC€0° ,`A‚°$haá�˙˙&ýŹń’†Iđ҆�A¬CŔŻ_˙KĐ @ĐŔĐ$,H–$`iýăÇ˙^X‚ IŔ X4¤‡„!č!hĽĆ44´h€0A‚$`i, ’$¬ A cIc- K‚„×CC€†Ś_�`†�‚ /za¬Ą!-,A?†– x Đ‚° †�@C�4†đú5đ�AŹ…!� %H Đ’ I’$ýxŕµ4°° h X´†KA€ô�„ńŻ×°0 aH$hAXÖ¤IĐăő‚†-`á, �€ô€��ĐÂż^c ­AxH€0$/’Ö$Ľ€Ö?~h-X4ôŇciKĐŔ @Ň�„!Ś˝0�,= á!Ŕ– A‚–†$ ’ţ´aŇ–€—�hh`a�k�€đôř× xHZcz€´4$Ľ č,haAĐŹÇZđ ZZ– č!A,`ÂC�„őŇHCŔz††^’ `I€^–°ţÇ^ZđŇа$0đ ‚0 iŕő C¤`A ,ih ’$¬?ô,Ť…%`I‚𠀆†�aýÂ�¤ˇ!=�z` �KCŇĐŇ$H Z˙ch °Ľ K `Hk�Đ€đ�üzéÇX�¬`=ôŔÂC¤őĐŇĐ‚$h ˙K‚ ihA$ ŇĐ`0„! üë…ÇX€ôĐX�KCř5˝†đŇXxAĐxŕ—†đ„… ÂK€†� � čC˙ C�i@z`a@Ŕ ‚$`-@’ -üăń’  ´€%hĆ0Ö�đ˙Ć !� xH^´ôĐ ‚$aaAŹč%–€%HX††€ő€�Ň�€˙×kü¤!@CІ†´$ŕI^‚ţ´4$ZŔ ’° Đ�đ hŕ˝ĆC€�k�Ňkhŕ…5$čH‚$Aë<´† ’Ľ44`á!@Ŕ4�á_k�0€�@KÖĐ‚$ŕ%ŕ%ŤĄ˙1đ˙ď˙ë5 A$A0$= ± Ŕżđ˙Đż„ô††0 ,iH -`a Z˙x HH’†–, ŔX€4Ť!h�x­50$@’~XC‚°4$ICKC/@/@Ź— I° Ic z�i�ÂĐĐŔ˙Ză!đ†Ň€–†°čH’ ýř $A ’ ő č A�„ńŻ…� i@Ň‚€­ˇIX$ýř±Öëˇ5$,ŕAŻ!I CÂXđë…,@Cz�Đ ă…Ć’4$a ˙˙/ý^�‚aA‚đ4$ €ô ``Ť× �,<$ý†�X’4´ AZ€–ţ±�č…!IŔ’Ć’ IŇCĐ , @ż^ú, ŕ5†„! HKX´�-Ňôú‡4„ KŔ°° €„5 Ť! ú… !�„!�€×–Ć$hAxăˇ%$/ -/�X ˇˇ‡�üká ††� $H$a ZÂ?€×X$H$ ÂĐX x, üŻ×Ch€€±�HKcI°„I ˙xč—$KăI$`HXCéi�Đř× K, ¬cAŔI‚°-HúÇc- -@xA/,hA �ŇCCC��áˇ˙%`@ �Ć H„$, ’ţńX/h,ZŔđ‚ 5 ˇÇ†�==č˙Zc@ � Ť5$hA„µ�i X ˙chI¤5„— ,A CC � <¤Çżţ…ci`zHCCŇ€ $Ľ hýă!ý˙? ĄˇŤe AC†č!a@z@řµđ€¤‡„!a`�a’€% ˝�üÖŹ‡^$K€$KC�CÂ�„ˇń/é ‚†€ Z–°°° őăÇz $`­! ZŔ H  Ź…ýZCŇ ! i@Ŕ ° KŔ ’°Ö?k kKʰ €� ,<$ý@ëĄXĐ€@  C’ Axéń‚„I?K Ľ�-`A €ô !č!�Đë5†�A � Ť! X‚ h ‚– éŔK€€ IĐŇ�¤€††„1¤AH† 1KŔKC/Ś— IXĐúÇCk$Ť%AZcaé! k@� �€~-<°0$ A�č!I–€-`IĐţ1– A‚–/a  i€†0„ˇˇ˙µđC¤‡� IŔŻ!hA^ %čÇc-AZ$a ’4 ��ÖCŔŔzzż~=’Đ�¬-,K^caiĽ°€ńc-HzhiŕĄ!IcAk€zĐ�Hŕ ,�k@ÂCk�XC AŇđ´ôĐKCZ˙c @‚°a x @‚ĆđŔÖ/ @4 CĐĐŔÂ’ A ‚^ Ŕ’ ŕAÂ’€ ¬C€0�a�ř_Â�Đ€� A$­ˇ°„$IúÇc-A‚ h ¤ńXCĐ�4� ��ţőëń aH��Z„%`-Śőx ŇúÇŹőŇĐÂŇ$ţwvpk´��������Ń��Ż2��YĽ$Ă+BWWGVH��z�}�P�ű�?����ě &������˝ ĆŚ ��W���Š1 �ů˙÷Q˙Ź˙řá·ß@Ö°a @ �é? †† ĐŔ’†° A°°4ÖĂŔ“€Ą=$AҤ,��€Ţž† �ZZ€$HXX„ĄÇʵ°� K–đ4$�„Çk�Đ��ż C€�=C‚$ŕAݰ$Az<đKC aaAK†4 h ­1Ź<ţőëŕm=ŚĄ‡ÖF€ôŔ H´€ ×Đř—~` ‚¤±á5$aHаҀ� üX¤ACzа� x°$üř5€A‚° ,K‚ hX€4�zൄAĐĐ ˇˇ,hH AÂk,,AŹÇŇ‚0^, KcIx,cĐô†đ/ @�é! 4–4$ ’ĽI?Ć$KŔ’ -` €0Ňk`ż^úÇř 4„HX°€% ŇŇŹ!- ’ ŇŇĐ‚4č±€5†��żžK‚�€� H‚$ X ă /K?kIC‚-@Z€Ą‡† `a�ÂĐĐŔŻ× =¤!�¤%aK^CKĐ‚¤ʵÖ´†$Hđ^‚ ĐCÂCk €~ ÖĐŇ�Ö‚°€,AX‚$H’~<´$`AĐ‚ -@ X @€đř×k ,<–¤,<$<´€%ŕ%` ’ Ľ° ˝H-H^�C€ ÖŔţőz c !<$ ZCXK^XŔ/čÇC˙żđK€°€% CÂ� HxÂŔż´đ4°0aĐŔđ„i,aAÂŇiK/„—†$ C ��CÂë…�, 0 h’Ć$ ’đ0^„Ąˇ„—ĆKCë� hüka@Đ44衡!@X’a-@K‚ôxŕ—�IZ µ†@� �Đ€ ôkXz4„‡�Ť%’4–„%AzA˙xh-@XZ‚đÂ$i�K@€!�˙ë…X€$ @��hHZŔ‚„$-ü㡗4$,`  ’°„ÂŔ�€őŔXxč×/üŔÂ�@zhH ÂŇX„$ ZXřńĐ/@‚°Ć$A ‚€! z���Đă-Ś!¬A ! iKC/` ZK‚Ćü‚ॡ ݱ„cA †††~˝€˙ÇúĄ1H€4 �Ҥ±°4´4$I˝�ICxAŔŇx ‚ h@ÂŔ€ ¤ÇëĄ˙Đ/Ť±H�ôĽ�áhK^?$ ˝0´4°$@KC Ň€44 = Ľ†đÂC‚0$ý„iŚ,@^Ŕ–Ľ ŤZŇ–�IXŔ’ AĐ�¬�ÂĆŻĆX†h@z`aŕ…±aihA$AZ˙xh ‚ A‚-@ÂCk�ôŔ€04ţ×�‚†�� I‚-` K´ôŹ/IĆ‚„Ih�XxŇŔ†đzé$ ��°€ KŔŇk/ýŕµ´�¬5¤…ń’ĆŇ€ôŔĐĐcá! ŔŻ@IxHz€ôĐXđ‚4´H Â’đH °°�˝€%H !�k�ÂCÂ�Öă× c,h4 `,�Đ‚ ih Đ XŇXë<´, ái, ř C�‚Â~Ix† �„! $aA xIř1´A„%,,H’†04�ĐÂĐ€^ż$�†�`’„ K– ­üXz$,,Ť% 4Ć�@z ahüë50,<´†„A€´ ,,Ť%,kaýŹ KiÂ/’¤ C $ @Ŕă_żĆ�$= a€0x Đ– ŇŇĐë ĐxiH^€–†�€�= h@ŔŔ˙’~XCCĐ�¤‡0aAФh ÂKĐ? ° H^ôZ†�az� ±ĆŻ_<–† Ś5°Ć�IcI€„%ŕ Ź~ $HX cA‚ a ż^4 á!€´4´„ˇ°°° Ľ4ôă±^ĐX H‚ ×Ŕ �Ö€0$<$�€�üú5X€�†„A$Hk’Ö–ĆúńŔŻ×’4¤ŕ%HŔŇ’Ćô€„i�z-=†¤!�Ň�Ö� ’€_đ …á1¤Ć‚AKkZŔÂ�é!��ŕ_Ż1°$� `A°° A  X’ţŹ× A‚$H‚$ �ŇCCCŇC�€˝i@cA, , XkH‚$i,IXřńŔ˙żŁńz XĽ4$=Akh@ĐĐŔ˙Zú˙7č—0$ €� Âi’°, z<¤%@k` $,ŇCÂŔ† ‡0¤Ť=–4�i°ĆôX /Ť%,ŕĄ!Iúč5 A ý„… C°ô ‡�=ţ×Ŕ Z € „…±A‚đ‚4–$`�K�I KCKżđÖ�¤ü/“A�Ň­!&XaAĐ ŇX$ “đzaHk€,A4 ‚44°đř×ôŔ z„!�I˙$KŇXú1$ –4$,AXXzX�„‡XŔ ×€44$@,�€�, IŔ$ é,Aă~II´ ,a € � á‡4�ük AŔÂCÂCĐ‚4´0–4– ż�iýxčZđ‚„%`I=° a@˙ŇCC @€Ň�¤! z IX‚đ$IŹZ Ŕ Ąˇ%K�a@ĐC€€‡đŻ…Ö4°0€5��kÂŇĐŇĐŇX’ I?ţ_x�/HŇ‚$H zHĐcazŔĆř× ˙­×† �0,Ś…HĐ‚ I€%H€- ˝ Ľ @0¤� ‡Ć/iCk��@� AXK‚$a zAúńăµ ,@Z¤%,ha†�ÂĐĐCřő�0 �K‚$aAKŔ Z~ - ’€%aa Z� ah@zCCŹ˝Ć�`á±€ÇŇ�IX– Z‚¤Ą<ôZ€ IŔ X ă%@ŔZ@ţő ˙ż€!Hc¬! ĐÂŇ ,a C´0ô xAxA¤5�0ŕ×ë A€†ô�h,X’ Ň‚$ýx¬%`K %ŤĄ…±�¬a€04„ˇń/€�, ,<đx,@$A X‚$,a ? üK–€— IŹ×CĐ€`üzé¤!C�4� @€×° IŔK^?K° ,/H XĐŔ ˇˇ˙z=0 �ŇC€„!Ť…hAX^Ň ĐŹ_AXÂ$HZC’¤‡ Ňk`üë5$h@€5�顱h ‚^€đ Ö?^XŇ xA$ ‚†0$ €€I?$@ĐŔ�¤‡�Ť%K€„%Ť% KúńXK´�-K‚´�€ô4†„řµô Ŕ�C� ,A ’°°I züĐÓk�Ż!,HX č!CŇC€ `@ż¤‡† @CC�†�=– KcIKô?ë,x -@KCK�@zh,<$ €đz, HŇ� ’°IcIÂ^‚ôă‡Ö €$HXŔ’ aa@CŇ� č5�Ť_żĆ�ACC h,aAĐë±- -Húńă% ‚I^€–†4�i�ŇC¤ţőz A Đ€4�é!H^ZZ– Iř1–$’€%A @4�Cúő¬!@c �ë!`H€´ ±$ha -A’ţńĐ/ ,’ ,AXzh, ÂĐ€!ŹýHC‚0¤HC’¤!iA$haAŹz-Ś ’Ć’ ŕő€ Çô4°†„őŇ,�ŇŔĐôŔ ,xAÖđ züř—ÂŇĽ�i -H Đ4�k�đza@€„!` h€aiH’†$ ’°ôă_‚�I– IcIx,@‚ŇĐ€�`üë5X�¤AŔ†–€ Â’° ýx¬%`A IŔ$ Ź…ˇ±Â�h@˙Ň�€…!C�x -,HZ€´° kýăÇkIŹ×а X„!h@C� `ŔŻ_/4 ¬‡4 =¤!A$/ڰ$č°hZ€–ĆÂ�aÂcé  ĐŻ…„54¬‡� aH^đŇĐ‚$Ťµ�Ť‡´€hŇ–†x�$< HzC‚  ,A,AŇX ÂK˙?†ţÂŇ„ĄˇĄ!Ŕ‚04@żHC’~ŕ5�A‚$ॡ…Ą±$HÂë?Öhéˇáŕ ! „! @xI� AxHŔ†ݎ5$ ´iýŹ—’°€aIcIx �^ �Â˙kᇤiCÂC€ô°�i ᥡ K?~ü/�ă……ˇ°€°XzđĐ�¤ÇŻ!AcaH�@�4°4$,¬! ’4–éđŇ Z€% I =¤¬éµ ` ¬A„A$,A’°~ ĽAX KCc hč! Ś…‡4^żđ€4¤ Ň€4Ć’�˝� /HX^‚~ iAŔ‚°4´° ,AŇ„…‡ Ö�~˝0 =¤!=hh` @X Ą!-�˙Ň$ڇ¤…!­!Ľ AÂ’^�ŔÂič!h¬a@€@„Ą! ’Ć’ IÂ?  AĐ‚° Ąˇ4†<¤‡†đĐżÖ�h, i�Ŕ/@ŇĐ Ąˇ—†–đ’° K^X‚–†Ö€ô„!@Âż°�Ŕ€ ýŔKC‚$AÂ$Ixýʇ^ë! X‚$HZ$ , €044đżX† Ŕ^zhAxAĐ ‚¤¬ é@ KXI€0 ¬1 �˙żĐ€� Ň�z’€—4¤IĐÂú˙1ô iż€,iHŇ?i�‚đ4 ×k�$ �@‚Ö˝0–$HZCŇ$/z K� 0 ŕýÂŹń¤‡  ahK^°° ,­˙ÇŹµiHkH‚$ ÂŇ‚4 úőÂiH�„!aCÂŇXÂÂŇX$,Iřńx ’0–AŻ! KC€†� H ¬@Ź˙őŇ�@ĐCk�‚ Ť% iAÂđÖ?~¬%‚$H^ŇĐŇŻ4 ��„ńë…„!�€ĆŇXKđ‚° ký?†–Hôđ �$<¤`= ż–Ck@Đ€„^Xh Đ‚°°iý?ĆҰ xICK4Hch=�aHĐŔ˙Zx@4 HĐ$iH‚„°$ýʱ´†° H$I‚ , ,<¤‡€!@cüŻ=$ H€�H–€%ŕ%`Iôú<ÖŇX’ i,IŹ— `H�°~`ŤIŔ @CkhhH^�~A‚đŇĐżH aAk,a �Ö�@Zżđ€@ÂC A°-@/H–€µţCż0 ĽôĐ„…h4�顡ˇˇ˙— ! @Ź�K‚„% - ’$,áÇciA€-` –€ôĐĐ€„!``Ť_/ŕ!HCC  xč,ZđKC’­üĐ/ahA–€%AX��hXcč×ÂC� k@‚0$ICZŔ ‚^C Ň?ë%�KŔŇ$ -aX€„ zŻ_  � IkŕAKC/` Ň? ĄˇZ’°4$á!H ÂŔÂCzż0H‚0@z`a Đ ÂÂÂŇXxAŕC ‚ ’�-ŕˇő€0¤H?¤‡ Çż^x@ „±4„%HX‚$H ˙c¬  ‚Ö Ň�°0 č! AzüŻ×Ŕck@ �Xx „Ąˇá ëüXk H‚€% ü‚Ć�,�4�éá×Â��é! HXxh ĐŇC/=´Ľ , üĐKCXŔ‚ IC/@k@�AXxHŇŹ× €…!�°đ 5$,,` XđúÇŔ˙żI˙ZÂX  ’†„ˇ…–°@Đ/`0„��üI IXX?K˙Â, ‚$AXkhAC‚Z áőCŔĆŇCĐ€4�KK€$ -Z‚€^Ň‚$AxA$č!A0@ř…±„ÇŇC 5�h`’€…%@KŔ’„ő/ah Đ‚„%h4„!h�ÂŔŔë×Ŕ†�i�ŇCŇŔŇĐ ŔKŔ’†^`zaH‚-KX‚ô€4 !@ Ŕú† !@CC‚4$iH’†^z Ň?€—ôĆ – I€$<04đż^Ź é! aH‚ ÂKcaIŔk˙Ŕ‚$@‚„I‚Ť±€…ŔC˙zá CĆ€ô€�zAŔK Ą±$čţCż€5$,H$HkÂX�°��†ôřµ4†4�„¬ń4$iH$aAK‚~ üŇ–�-,HÖ hc <„_/< hH0$< `A4Ö–4–´†–ţÇC˙/ü°Ax –°€ˇ…‡ = h�Â�ţ—đ€ 0h� „  K‚¤×ř1´¤± A‚$,é!�ÖC0¤‡^żđ�$�‚ @ôÂXKʵ€%H Đ?ô°�I¤±$H A€ô€€!Ľ~a<$aÂ0¤Hc ’ hi,-Ś—„őŹëµ‚4–, ‚$�XXż^Ŕ-č!aHC‚X­!A’ Z˙x¬Ą! ‚$H´4AŇ€�@ŇÂë—~<ÖÂŔÂ4 ´†° AXŇĐ ĐŇ?úéh ’�˝^–†„×’€!aŕ_I� † ĐXŇĐ„%kýcčHz¬5đ$HX�@€ �ÖC^/= 5 ±�Đư,ZŔ‚„%`éńŔ/ - ˝� Z€–’đ„‡¤Ö† Ś­‚†„! ŔkX€%` ¤Ŕ Ұ€ Ąˇa ,@†�H?ŕ׆ aÂ0 hXX€IzAXÂúńФ! ’€%AX�H a€Âř× ?$@€ô�hh,Ś%,H$H’„%¬˝„±¤!IĐ‚°$HCC z@Đř_ŻÇ† h@cCĐŔ °,A’ ­<Ö‚ H‚°4–¤± =„…!h` hCŔżÖ� =„! , Đ‚áĄ!- -ŚŇ $KX �€� h@ŔĐŔż~=é!CC€Ŕ‚†$@KCôÂXZĐŹ!I‚€%/AxaA�Ňzüë×€€5 `H @€¤ˇKŇ^ŔŇŹ‡–/@’ %H0–°0 =„!čýZř‡^‚0¤Ň€„ih X‚đđŇ?†–€Ą! – Ľ ôXk�€ô� _k  C� ¬@‚¤ˇ I$,á… ýÂĐ„…%HxAŔ‚€!@€€_KŔÂĐüwvpkÂ)��������€»��"V��YĽ$Ďr$đBWWGVH��{�}�N�ő�:����Iń*ń������Í ë ��i���Џ�ů˙±ţµĆ‚^/@X i,ICŻ˝4°ŇĐk XŇ i@z`c€đk‚ôŔŇ$@ZŔ X‚CZ€ x ’ X‚�` �0ţőŇ0ú! =H†-`IĐkh<đZC$H‚–†–†„!€ ‚đřő Ň€44@ŔŔ‚ H–4–°°4–ôxA hAxzA‚†@ Đ�ôK @C†0hZ’$hA҂֏‡Ö‚ hAÂ’„×Đ ††�Ź…xüë…ńX�é!@�,AI´ -hýřˇ_�–†„%A ’ І„‡ÖCÂë5�4 !=4 I°¤!-AÖŇ?Z˙k<†^– Ľ°€� €0°€‡„‡đkIŔX€†Ö� $` ’iAëÇŹi -x IĐô’�¬a€€Ç ăhh,� €°4´�-K$AëÇC/ Ŕ ŇXxAĐ €�HA҆Ćú=°† i@�4 @ Đ‚¤ˇ%HXXXx<¤ H–€—†$C€††0=¤‡†€-ଥŇCĐŔ$,HĐ–4–IúÇc- X$,H†„!h` @CXřők X�h`á!  ^$Ľ HKă– Z€iAX€�@� iŚ_żôX€†††0 =đ$ŕĄ!-@ ’ôŹÇë…ˇHzřH ˇ! @z`á!h�˙z=† �=‚ ’ I‚–đc, ÖX^Ŕ’ %`, Hc,�€!ü’�ih€đ40¤! ’ á-üxĽ„Ťµ†đ‚$č,é!H�†„i�ŔŻđ˙ăőŇ�¤‡ a`  Âx ‚°IúÇĐ żđ€–Ć‚°á,a,@Đ h�ŇÂk =� �h@� 5­!,,zŤ ëÇŔZа H^ZX� @€ô€Ć˙zha‚†��,X€%A‚$Ix<đ/HCxZŔ xAÂĐ€44 á`ŕ˙µđ€ =$`, AXK€–KĽ°€—ţڵ `iHX á…5ihHúihţ× ˙� CÂ�‚ A°° á5´°ţŔ/ aA4–áĄ!ah Śh��z- ` h@Ck@’4$a Đ ‚~ - ° Kc Ň€ôĐ4�z€ĆŻ�`C€0Ś% áż�-/ŕ…ő?ĆZ�ü„×Đ–�Ŕ‚�€đzá…!€�h� aih xK$=~hI´Ć‚„%i,  �ŇŹ54 ‡đëő€† h�Ň� Ľ�¬5-’ —ĆŹ±aAX^^‚�k@Ź54 �z˙Z€ =� AŔÂkK‚¤5´Ľô?ż†„aK^ �ŇC�°ĆXÂŔż^x� °4 @A X–ĽĽ~üXZŔ$A‚„ HxHz` HHŤ˝Ć ‚‚@Z ŇXxaĽáĽţÇĐ ´†„,H‚°0�AAŔ0ŕ_ AĐ€ˇ5†�’4–€$K^XřĐ‚ ihZŔ‚ …5 臀ő€0¤č_€ C i ’€%AĐ ĐŇxaýʱ´† aZ´ Aa hhz@ĐŇx˝€!H�H‚�i Đ‚đ$¬5´ô˙c C ҆~’,á!ĐĐ ¤„ńż^chhĐ€^�^z,i, ´ ڇ´ HCKC’ Xú‡ Ś……‡�H?€˙_c,€�ŇC��K’$`-@ ZXĐ?†^đ$i, Z€ÖC CŇ,`�đżÖ��cIŔ’Ć„—†$ /üă±^€¤ÇIŇĐ ‚� H,`hŔ˙0Ň€†�hX$,,haA’„őʇ^Z€đ– ZĐŔÂCÂô€�čˇýŻ5¤� ACX‚$/ihI^ŔúCk´€%hA¤C€ €ţµđ€�Ö� `IŔZŇ^Xôú˙ńxé` X‚đ‚Ö�Ö�= = �zhŕ˙ź„`A,`H, HĐ$// é×^˙řˇ—Ć KŔ’ĆŇĐ0C ţĄ`AA€‚€! řĄ‡– H’ /üchIŔ °$@ � �Đ€ôŔż~Ť1„!i I?/HcaA– ­ˇĄ˙1^‚¤—0–  ĐŔÂCk 0 Ťa€–ô aHŇ�¤‡† „—€—€_řčkhA$H‚�zĐ€ô€04ţ× != h�–4$a ‚– ĽéńCKŇI‚$é! ĐĐĐkh@züŻ<¤! 0„i,, ˝ ča ?†$ C/@‚$A �ô €ĆŻ0 HHô€�IŇĐ‚´€%A/HëüĐ/ Ľ�,i,aIăĄń‚ZC/<ahHc˙ZC°XŔĐŔ ˝i,a‘ ýxĐZ`HXXŔ ’† €0$ ,< ýř i� �$<°�@CxÂ$HôÂ˙K4´4$A/@¤ ŔC�„Ćë_ř!Â0¤¬!A^–€%/AŇŹ‡^  K’XCC‚đ ¬0°� A��€_đ‚„…Ą±ôăÇZ’€Ąˇ%@/ŕH� ‚Ć ńú<$� C���-A¤, ZŇXëÇ?Ö ŇĐ´4$ ô0 č!h iŚ˝0†�AZ´€% ˝ Ľ ëÇCK$H– †�hŚ…‡ô€ô€0„­‡†4 é! €�Ľ,Ť— I$iá ý$`KcaAA Hař_k ¬5 = @�†° ih XŇX ^˙x ŇĐ´4$ � ‡ô„ńŻ×Ŕ˙ăő‚‚ô„!� H–€$­±~Ś…AĐ xAX^4°† 1–ôĐ~ Ľ ‡ @-�/Ť%H‚ôxhaa,ihZ´4$�ŇŇĐІđkéX€ �čKZX°„ýŇ‚†$ IXĽôCŇŇ�„! ýZXz@�¬C aIŔ´4ôŇ˙HKKŔŇĐ „° A€0´~a@€4 @C롇 IĽ¤ˇ—€_ŕĄ!i,,` Â/H†°�Ň€đŇzŚH, H@ŔŔ$ ˝0–-`I~�Ň$H~AxA@€4ô††Ö/<°0$�XcH€%KX$Ľ -č@ZŔ ’ /hKA CCCĐCă_/ `4�éÖŇ$ ’4–°-¬˙ĽAĐ‚°i ř‚¤ éč—€±0$�4 ’ 5´° ……%HëŹ%A– AKŔݎ@C€ z@ż$<đ‚ŇCC��Iz,IŔ¤,-čżI´ A KcIA€  é!�ă=´�@Ŕ€� € ,/HXXŔ x ˙/K�^$IX4kh@ĐĐŔż A‚ i á ’˝ ¬ő?z X€ Ąˇ ĐŇ�ÖŇĐz  c�Ö�^řĄ!IŔ ř%@ř‡–Ć‚4$i,AxiHĐC�H?�ë üż ,@��ë! iHkŕŤµ�ü‚°ĽôŹ!-`xi/H^¬i@��ţ×CĐX� @� !i,,ŕhiHZŔĆCZŔ$ż 膀5�€0 Ś_żđCÖĐŔÂCĐCđÂĆ ¤¬CZ° ,H$HHH�@Ź_żĆCÂXz0$ڱôĐđÖXXŔ $é/�xAŔ‚° aaA¤i@�4 �˙X† =¤! aĐ A Đ$IŹŻ…ˇĄ%K$AŇ€…!�Â0¤^˙cH4 = = =$¬±€I–IZ˙xIC‚ iŤ%H  CÂ4 �zŻ4Ć€ ‡„/,ॡ„%<zA$,@ ’ a ĆXŔXxĐĐŔ˙ZúXz„!@CAŔ‚ AXŇĐ$ Ś˙gř–° H’ IÖ �„‡~-ý°†�C�†��xa,¬ˇaA’iý㡗†$ IkH’I�Ć��0 ńë×?Ćzá!aH44°†° ±Ľ A Đc-^Ŕ‚IĐÂ4°„!@ţµđC��AK‚„đ‚„%AúńŔ/i`Iʵ�I€–ŇĐĐ�h` �ř_ CÂ0 ,�/ I–A/h¬…Ç˝H$A‚$� ŇCzýÂiH0$ , áh顗†$hA¤Çż4$ ’ K4 =4Ö�„50Ö€~ CZŔ$<$� ‚„…Ľ€$é˙!I XX zH� �řő҂֤1$H$, xA’$aýXK„%ŕ,A Ň„‡ÖCCk�Đcý’�–‚†��ŇZcA´�I’Ć’$ý襱 , iiHZŔ�@Âczh,<4˙ú…X�†�i �´4ôXŇc-€$ŕ%ŕ1–, X-�Ň�¤ˇ!�XĐĐřőkŕč_Ŕ4�°đXҰ H‚„%ŕőCÂk` ŔKC¤…±4 =�, H°^z�$ `áˇA‚¤ˇ%@Z ő㡵 ^C’° � X0 üKC€� ¬1h@Z€$,A^ĆK?~č—$ -,ŕ ¤ô h AĆŻ'Ľ`4 Ť!ĐkH‚^- X‚ ×?kI€„A $ ŇCĐ€ €ĆĐŻ×C h¬AIÖ$/H‚„×Đă‡^ CKK X�ŇCC¤Çż^CCCÂ0°0°0$ „% ˝�Ľ4–ţńŔ’� ’†^€đ$ý„ÇŇІ¤ÇXzük C !a@ÂcĐ‚ h’,A’~<´^ Đ$A Đ44$`,�  Ť˝ĆC4a AX$H’€ÇĐđÂX–,A‚†�@€4†� @ă_Ż^ŔX�„…é—€Ą±áA  ř1– X°Ćđ �  €��0Öř_  á!ŔX’ ´ a X ú?^k , a Â^xé,<$Ť±�H? áőŇX�aë°ÖŔ‚Ic ‚^˙Źz ‚ AX’‚Đz�k €¤ńŻüXŇ ,‚†~X-?° X´ hAŇĐÂCŇ�X��żX€�Đ�Ŕ  a ’°iýă±´€Ą!aa/z ŇŔX� Hc@˙ë–ô�– ­1đ^đ‚ -@’„őʇ~ -Ś%HXX� �ż^cX�„±�cX‚, ˝�IXĆK° Hx ’ éˇ!á!CC㽆 €�hzhhAC Đ$ICKXx<¤iH‚° ‚†€5 ţ!Ź˙ők  Ұ …±–†$ x Âë-A‚€$H$zHCCzh�4 ŚýÂ, ­1$= h@€ I– ,A ’~<ô aZ–Ľ HÂĆĐ�„× ř˙ˇ˙ i@� ˇ!aZ€$h xI˙x,ýż?´4° IÖ† @C� �Ŕ^‚‚4„±0 ��4„%’ KĐÂÂúˇ5 I iiĽ ˝Ć4�Ŕ‚ĐŻ…‡�A„a–Ľ†¤,aIĐă‡~X ’4–$K�¤Ç�ŔŻ…1¤!h` @z„!áݎ Z‚´°~ü ź4°4¤H–€…!h�Ö¤zxűő€'`h hXC ’IC/@ Z€´~ IxáńÂÂx ĐŇĐŇ�éa��úő,hÂX�‚€I„ĄˇđZ‚ Kz’C†„ˇ! �đŻ×x` A�„!áˇ5€ ŇÂX‚°Öôʱ$A A $A� ‡4 Hah@ż^ř@zHXcHAKŇciaĽ$` ʇ– ,�/ZZ‚ � � á!h@Ŕ˙zá$�Ň�¤�đ‚ aA’ ­±´đ?ĆZŇ–Ć‚°$`Ix ­1C€đka@€ô¤‚04,`aZô’„ýŔ–� Z€´�- A�„!@Ci`řőÂŇŔ„!@�°„×Đ‚°4ô– IúŹ× €Ą!IcaAŇ€ ‡4 č!��ŕ_Ż1 @� iKXŔ ´ Iă1´ ‚$Ť%hA ‡�€ĆXŔ€ ú× Ź!i@zHCCCCú±°  ’ Ąˇ%Húńă%,xiH– -€�€0 Ť!�řµô € <†0 A„%HK$-čÇŹ˙…ŕ5$Ť%aiĽ H Đ€† ‡ôĆř—ô�� a ´,IXxüĐ/IkAă5$ŕ±� ` �€ôŔřµôÂ� @XXĐ K°i ­�o‚°†$Ť×Đk/�† 1$ @ż^ř` hĐca@x  -@’đÂ?ĆZŇ–�˝KĐŇĐŇC ‡�é…ż^ă!¤1–4, Ľ ‚^CÂÂúcŃ0 Ń‘ Ľ�A� x,�€�Ľ~á˙  Ć0†� ZCX­±°ýx ŇĐ$AĐkZ �†4�aŕ_’ĐІ�@‚$@KCZZXÂúˇ5€—0– , ’$@Xz@ŔÂŇŔĐë×€4 a€0hh xA^„…-ýă±Ö‚ X°  =Ć�=h�ż^Ź ˇ! i�K$A Đ´ -ý¬ ĐŇă-`I = ¤ üka A†�Ň’ héń– -`iýŕ%$i, KcĐC !�ÂŻ×ŔC‚�@k@i�KcIC ÂŇX‚$Aú´,z=– I^‚‚ôXÂŔřׂô†đĐ€$kAŔK’$ŕĄ˙1¤ ,ŕA’4–¤‡€…! ��Ź˙ׯ1€�kh@ĐC‚H I´ A˙ë…±hiŕ-ŕ5@ŔĐ�@Źýz`HĐ€44„! � ¤±$H‚´ ,鏗 ‚ -k ,= =$<¤ hŕ-üŔ ’4¤^ĐĐkH‚iKX?zA’,,HX i�k�Đ�hüZŔ@€Ö�H ‚$A$-/ýăńĽ€I$­aHzŚč…‡��ż^C = � -’$`-/H ˙K‚€%hA´0 顡é˙Żő‚†44 �†° H‚$Ľ I^Ŕ?ëĄ! X–­ˇĄˇ é,<4¤h@ă_żĆZ‚$<Ŕ$H - i úÇă˙…h  Ą—€  Đ��€Ćżz �ŇĐŔ€€!hŕh’ AZ„×˙Xz,, IĐ–Ľ°�Cô„5€ń˙ô€ @�h@KŇcIK‚„µ€Źő‚€%�ż ŕ%` †�†„h�úµđŔ†0 �„%@/Ś%,H– üZ’ ’°„ÂK�a@Đă_żH�ŔĆkh –Ć ţ1Ö HXŔkH c ŹC€�C�4~˝0†€Ą$ý�č±�hAX X ĐŇXŹz- áHKĐ$a`a†„‡Ö´~Ť‡`a = ,H,ih ’đĽ°�IcA‚ICzzH�đka�XŔX€°†ŇcA‚a xAXkH?^ C ‚°,ič�݇�, , ,<żđ?^Z z`é‡ ý X‚ IŔ’ =Z Đ‚° á�kŚ ¬HĐú…$ŚĄ,`HCCzhiHxéˇI‚0†$Ś%ZŔ°�k�Â� ŕ_Ż1`éôCzz hKŔZŔ’ţ1ôĆ-`Ic-/ I �Ö��Z0„…!@Ňz„A – éńŔ/HC’€$Ľ i  ZC€Â~- 4h@I‚°$HÖ^úÇŹő‚ H„$­± !€�@cHx@x˝€˙ë%ý†�Ś5†0 cIC Â’ I?Z˙küŔKC XX°-<–† =�Ö�^/ŕ!iX i�/ H„µ�Ť%A–†–€—†´0°�@††0=°Ćë�� ŇŤ%KzAX‚ôă‡ÖI$ ’� cHú5� ŔŔŻ_CX� C� i’° I^ôÂ?ë $ ’°¤ iŚ`@CCxHż� = hh@€$,A–$A/üřˇ_€,KXŔ X 1Ö€4� üzái  �$hi, z ¬Ą!-aýcH/@X€$ X’�­1°đX� `zh@xýAĐ€ Ŕ°†$H„%/AKřńX/@$ŕ­±„%Ň�a�ôţőcHc€04„! –†^Ŕ´ IúÇCż ˇ,H‚¤5$ ,<°ôĐІ��ú—Ć4¤ˇ!�† %Ť%aAZŔ’ IúÇCżôX´ ,AxA�Ai@Âcá!Ť×/Ś×€4�é�4$HŔ´�iaAxé­˙5ŔK„$AKcAC Ś……‡�Ť_C  �ô�h,Hđ-kŻ, I‚€- ˝4ôÂcACô�Ň˙ë5�, i@�@‚$H– I–đŹ±–� Đ -kh€€Ť5�č!=đŻ_ă €� Ac, , IKX¤ńÂ$ýcčĄ!, ‚^C–††44@�ô�ŤńŻđŔ‚�C0$Ľ�-@’4ô‚°ôă!˝�A‚$ i Đ‚XŔŔÖ€†Ľ~a�†�4 �KI‚$ Ň´ţńŔ/ZC Đ „×€€!@�  @ă_żĆ‚�Ň� �ĐZC’°€×Đ’Ć ZxüăĄ×„Ą±°Ľ¤ˇô�ŔÂř­!,<´44čA$ Đ– IĐúÇŔ/ I„µ†¤5°�44h�~I?Ć ‚ŇĐ0�ŔŇ4´ H´ éÇа AÂ$ K�¤$�€€! ŕ× ‚0 =`$hA‚´ ĽĆ’~üx- – hA´ != a�k`ŔĆcýzá$ 0¤Z‚°IX‚¤˝üXox aA‚đ’4�aôŔ€€!Ľ~Ť‡�A Ŕ4 % Ľ4¤×ŔKC ’ô?°´†aA‚°$HCC� C€Ư—~�KX4„!/@‚ I$ŕ1ô i,aaA’é!é5 ,`@�Ćż^c� �¤‡�H?–Ľ„±$ičA’ô㡥…!-Ś%H$ĽhHXxÂCĐ/ �zH I–aIŔ ZřńxI aŤµ†´,Đ€†0�� ŕ_k`hh �Ň� �  Z^$iAë˝Ö4¤Ľ†–€% �44�C€~-ŕ!€!á!h@cI‚đ‚đ„$IúÇcé5$¬ˇaI$C‚Ć�a�Đ�~ýÂc A€†^I’$HŻ!­…üř_ëĺa- -`A’Ć’ �†4�€ĆđKCC�¤ ,A X‚$h ’^~ĐŰ á ci I$`@Â�h zří / 4 x,h`iA-HXXĐ‚~Ľč iH аI‚ĆXzŔÂ�Ö€ŇŔŻ'<°0A�Ť!z HkK‚„%Ż<ôz=°H‚$HX‚€!� ahř—€‡ Đ H‚„×$hZkHŻ˙ń㵤ˇH‚–†–,�Đca Ź˙5Ć z@44�z,H„-’ôŹ—Đ ÂxihihA$�Â�@ ŇŹk€�HA– ,A$,h X ?zICkH„%K€„!@CŇk`HŻĆCkhH‚4 H$hKk/ =řµ0$AX¤±„é X†ôŔż~áH�¤Â¤‡´4´ čŕ%` Ňăz­A‚°, - ,<z`é$ ýZŔ‚Ň0°ô’hiŕ„-@ĽhahiHŇX‚đ€„!@��ř×Â�$�‚ŇĐ€�`AŔ’€Ąˇ°¤±ôřˇ%A´ h X€�h@Đ0Ć˙zŤ`é!�k�ÂK?$ XkŕĄ!-Hc-ʎ° ` „—€Ą!@�¤ Đ�4đż¤X�Ö€ Ö€HĐđÂ‚đ‚„…Ąń�–/ ÂKca €4 !h@CC�†ôZŔCŇ’~@€4€A$Ľ ,A ’ô?k ¤! KŔZ€`€€!�Đ�†đż~ŕ%<đ�Ň�$A ´¬iýŹë%аIŔ C��éiŚ…a�˙ëôŔŇĐĐĆ�Z€¤±„…i/¬˙ńĐ/ ‚I‚°ÖX0h`Ť!@Ź˙µđ€ HA‚ A– Ľ KřńXKC c ’�˝ H€††ôô ¬1„_K@ŇŔôCĐа†ái,IcIx / č…±¤±HË �K˙�¬� _ô†�€04AZ$A –ţÇXKC‚ Z-aHxHCC€XŔCzčőŻ14°4€�€…–ôĐ aAÂ$ýʎ— ˇĄ‡^$ €ô°4„!XŻ…�A�4„!h@$/Z°đ‚ô˙c,I€$Z‚$hA, H4†0 ýŻ×‚�H? Iđ‚IXX‚–đ?Ć’°€a ’$H ô��Â�4ô˙ZăiÂCzŔX–č,A’đ‚Ö˙? ˝i,,HXX‚$AxHú†„hüŻü44hh�k�ăA‚$Ť%,A^Ň˙ch˝† ,AX^ŇІ4 H á!=4ţ_/č@ŔÂC�á%@ $, XZĐ˙ă±– Z�~Ak z4 č!`Hc`ýZx@ h@� ih  ’ % ˝4–ô˙řńZ€%A´–~ŕ5�¬CĐĐŔ˙ká’0„… CZz, X^z,a$áđKK€Ć2^ h`aÂCk "čI/ý/�Ö€�aX‚€_$,AXüа4đ‚ aA‚ !h`Ť ¬ ż�Xz`a ‡ A’¤ˇ%ŕ%HŇ? I€%A^đ†�ĐĐ€đĆż^c@€ <€±�X ŔKiA xI˙ch˝$,ZK‚h@€��†0đŻ~†††„ ZK‚$A’°$ýxŕ—�ai,aI–,čˇőX éŻ€�Ňk� IŔ Z´-ŕőŹ×�ôÂXaI„54¬1=„!h`č˙ő/� ¬ Ŕ‚á,,,hK‚˙X/ Ľ4-h, xAC �� xüż–ĆX€� a�4$,Đ Xđ‚$á XkH‚$ � ĽĆ�XčőŇŇ€�h@‚$č5$,ičAKţńXz ‚„,A‚ aĐ0¤!ŕ׿ĆĽ ¬ˇ‡4 ’ aaA– Ië ˝,ZCZŔ‚¤1¤Xá±€!@ăׯńŔk�Z Ľ�AA–€%@/�/A‚/iH¤AxAhHX�żţ5 ` ŇĐ€�A„µ†°°I?~¬%„%ŕ%`i@z@ÂcAHxĆż^cŔ !@Ź54 ’€%,H´€őcŕ% a $/,HCC @€€5đż¤Çc �@€Ć$Ťµ�-HXÂúÇ^Ŕ$aA$ €Ö��éˇŔřׯ1† a`€0//@z=´° ,aaýă±ôżđI ×^Ŕ † ` hhhHŹ×Żc-x�€†‰Đ$a, xZ–€×ă×` H€%ZC�$ h= `,�Đřµ�h`AŇ�é!’†I– Ż I X‚$H€€0ÖŔ‚^ ŔŔŇ�$`XŔ’€—h –-ŤcIX°IŔ’4$ Czz@ĐCCúőÂx,` €ô€  Ň^’đ‚-ŤC/HŔ–�- -0á! hhh@ř_ŇX‚€Ą^ÖÂX$aA Ň?~ $Hđ‚°€!@�€đk �Ŕô = IÂ’€%hA’$I?z­!aK/H xaĐІ0„ˇˇüë×@C� �ëZÖ$,ŕ5– ­<<i Ľ€%`I ���ţ%< I� é!a`IÂkhA$­±$hýcŇÓ°$’¤±„ˇ ĐCz¬Çř_ŇŔ @�Ö€ Ľ $AZzĽ~<đK€ ’ ôĆ€!@€€üëi</a`c iA´4–,aáń˙„5$,H–�i�ŔÂ�� ýZx4$�ţwvpk˛��������˘�Ż2��YĽ$Ű”h¬BWWGVH��{�~�\�ű�?����Iń+ń������2 óô ��I���Š0 �ů˙ĺ·ZH Xk@O€ Ąˇéĺ? $A´ĆZck@4h@Â4Ţž0†„± AŇ€ô „%ZŔZŔ, $Kž°ĆÂÂ4@€ ŔĆřőÓx�$h� XCÂÖ$@’�-/`éÇ�I–†–€%i,AIc,@XŔĐ~˝hXŇC i�°Ľ hih ĐëÇŹŇ$AX´ hA€…!hC€0`üöô0°0$=@°𰰀aAŇĐ ŔKCIŇŔ K–†´� =H¬ˇá—ô/ AzHŔX€hé±°4´4´ čőAŔ ŔҤˇ Zx, i @ôÂŔÂ�4 hHI°°I’~<´ A‚$hZŇ0†¤1 Ťˇ_Ň‚�é!@�0†đ’€µ�I$Ië?^KŔëˇaAĐ Đ‚� i�‚„!��đŻ…ÇăĄACk@Ŕ ,H° I$AŹkI´†$,k I†„é! i`üë×c ­A­1@ú!a ĐëˇhAX^ŹZ Đ‚$ŕ ôXĐŔ�¬�˙Zc@�HcH‚¤ˇ×Ŕ$ŕ%@KÂ?~aKC X°° 5$`,� Ňă× HCĆ ÂIx Đ‚đ^˙XĐŔKC‚$ŕ,,Ťa,�Ň€!h�ż i@z0$ X’$ŕ%`iýcé!Ici,,HŇXZ€¤–XŔ `ükHĐCŇ €��I I^ĐŇXúńĐK�^€°hihA€0 CĐC€†ţµđC‚†4 �4$Ak,AxA‚~<^ŇX HxaĽ ICzH€„!�ĐÖK?H†4ĆÂŔ‚° hZŇ X‚~�/ ÖX‚$A’†�€0 Ť…„_K? é! zCĐCKCÂÂz -HXţ˝� X ’  ,<$ H†††ĆŻ_�Ň€4 `H-`I„%H’đÂ?ĆZ‚4¤H ×CÂCĆ€0°�Ż×�� Ö�@ZŔ‚„$aI˙cč%XX´ ,A�ôŔ€††ŇŇ˙ë5° ‡@�¤´~A$HXXKXÂúci ‚IZ’~HC†�€4ţőŔ zŇC†„‡„­!ihA$/Hxýʎ% IŔ° ’‚�CĐ€� ă_/ڇaHŔcéˇ!@C kH‚IÂ’ ˝Ö€ IcIÖÂĆ‚� ă׿€� ¤×„%`­!I’ĆúńĐK€Ö–€% Kë!Ś é!á!@ă-<Ɔ =�–° HX° aIřă%iHŇC/@ $ i�ÂXC4ţ× C@ HXĐ´4´ AZ~<ô ‚€% –†´�é�h�Âă˝đ€5�z, i,AŇX‚´KX‚đÂŹ‡^‚€ ’ĆZcA‚đĐ€�XŔ˙Zx@Đ0°�@€† - I4– /˙€^€Ć„ -@ŇCĐ€ô€4†„éýŻő‚�ô0 řK$A ÂZ˙ʱÖ‚ K^ 0$@‚ �˙ëőŔcACXĐ€�H$HŔ ’€—ĆŇ?ká$,za, Ň€†4€…‡�€ô’†€ő4 č!’ k¬5$,A’đ?ĆkZC‚° i,Aô č!�ŇŇ�4ţ_ŻÇż††4ÖC† ZĐX‚°4´ ,돥` ^XC  €�44 @€^/< ÂX��A, XkHÖđ‚° ?´$`AŔ’ ŕ—† ¬€4�éiŕ×/<� zHz` h¬aiHA–Ć’ţÇă%iHŇĐ–4´$@€�H =€50ţׯ1ĆaX H ‚�- -Hô? ˝†4´4đ XZĐ€ ˇ‡�Ź…_/üŔ‚�HŔX€†�i,A °$ -¬,@¤‡^�^€‚0 ő€�h�kĽ~Ť…!„!@�$A„°IĐôʎ—€HÖX ŔŇҰĆXXxüë×°�@Â@ŔÂ$AX‚„%Hʬ—�aihKŔ X°�@Ň€ô€đë5ĆxŔ†„!h@�Ö°Iđ‚đxI€°4$ ÂŇĐŇh=° =¤,üĐż^ă! zHĐŔ$ŕA ZC´ţńc™ 4´�˝^� ahŤ‡‘@Đá_Z@„ĄˇA’†^$aý0ô ’4$-� Đ�$ HxHŔCÖŻ!¤1 IĐ´ ^°„ÇŹ—ÖŔ Â$Hz€4 ¬@xč_ë hHcH�´4–-`á5–°°4ŔK€­!A Â’†Ö€�� x¬ICŇ€�€,//H¤×ĐúÇŹµ¤! ĐŇ$KzĐ��XÂë×Ŕ€„! H, KX° %@//ŕő?†–/@xAXXXŇ �Đ€0ĆÂ/ A€�Ś5ô†0$A‚„% ˝,I˙xčµ’ ,H‚$AĐ�¤Hch=0đ˙Kc€ C^€$/Hkča ˙Zk ŇĐ /AZ C† `ŕ…4ôza� ��@ ŔŇX‚đ Đ‚$hAÂúÇ ‚$HĐ‚�`H C€ţőă%`,č!é<�@€—�-ZXkýC�–4´ ,`-@Z0 zŔXx`a­ő‚  €A’Kđ°$hé˙ńĐ/‚IĐ–�ah€0 Ť!�řő @Ŕ4€5†°�- é5„´�˝�üúńCkĽ H° aHXx,�€�ŕőŻ1KC�ŔCđŇÖ¤±$ I’ţÇC˙hi`ICŻ!A�A� @€ţ%=†¤!�‚ Ck’€%H‚– ʵրĄ±IX^€††4 č! đë5xŤ!i�XŔŔ€   Z őă—$=´,h - �†Ö‚04$<$ üŻ×x@ÂĐŔÂC 襇„a X‚ =xI° A„%h,�Ć�ŔXĐż�­€ÖŔ ,ŕA  ˝đ˙cĽ Đ Đ– Ikh`á! ýř×/<€5aHz@4„µ†đ‚ aAĐ řż�ŕH ,K Ť±4† ˇýk= � C4Ć‚ĆX€IŔI^‚đúŹĄKCKż4$ X� =hCŇřµô ŔÂh@ Z$ Ň–„Çý‚† A c-@ C�„!č±0 @Ŕci˝ �†�ŔÂŔŇĐ 4´ ’$áÇĐ$Hc ’aIx,�Â� Śýz<¤!@ z@Đ€°4´�IXĐ–­Ľ^’ HX–4– č!@Ŕ @ă_Ż ­HcHŔĽ HŇX’ Ľ á…ü’†IKXĐ‚ CĐ€0č!��ôú…‚�Ť54 �CÂc- Ľ ±ÖĐ‚$H’ôʎ$@’4–„Ą±$  !�Đ€4đë×c�† �CĐ�H ‚ %HĐÖŹ—µž0$ih ĐkŕIc,��,<¤ż~ýËx[c‚@z‘0´H '@Z°~Ľ @’ ±$K‚„Ą @řé ĐXĐ€4 !�ž Z€$,Ť%,AëÇŔŰzhAĐ‚°°� Ť…!@� Ť_ X�ÖĐ4 !@C $hAxëńă%AX$A X ô¤‡ i�ÂĐřőxH†¤°€ŇX–4´ Ax/čĐI/H^c ŔÂC AţőÂHŇc€0H‚°$`IK´ţńx- ÂҤ±IÂC€0 ŕő Ź!k@€¤1$=´IŔ Xx iŻ<ô XCĐ$hxA€††„…!�€i�€ô4 A’ĆÂŇĐ’†–-üx¬µ�čőĐ‚° aaA ĐƆ ŔŻ €4€,,`A$H ^˙řńZZ�^´ Ľ€hŚ�€ô˙za  C†�CC´� KŔ ´ôŹÇKX†$,H‚–†¤é!� ýzŤ5°†��„‡4 H‚°„5´Ľ°đcŕ˙~ڵ Hz’AC€4�¬ˇ‡ Ť=$X�hcaŕ5„ĄÇ´€%ŕI�Zz, ‚„a X/�‚XC€˙%ŕˇ5@ zŔ° A‚„%,čÇc-‚„H Đ–X� !ý4�éč_z@Đ€ô4° ,HXŔ’ ai iüŔkXŇ’ Â�Hz¬a@úˇ×Ż14$č!éiŚ`hAC KX–° ?$- -`iH‚4ôÂC h�0$ڎ_Ż1H�@ú! c ‚$H^‚$Iú¤×cA‚ %`-`  €đ <¤ˇ_ A€ Ac¬ =,aĽá…¬Ľô˙€$@ XIŇ€!a@ĐCĆŻĄ‚44¤€4°°€%ŕaI$,Ś~A´†$H‚€�@Xk`Ż—Ź% i` hč!= `iŕ ič,ż44†$ K^‚$/�Ö€=4 ýĐř_zH€�€ô ˇa/ZXc Zú/�’€%@đÂÂX€0$�ĐĐĐ€ţ5i@¤‡�h$hzA–°đúÇCzAC–I‚�hhC� ˇ‡0đżô ‡€őІ† `A– Ľá%¬<´Ö€I°°4Ö€4 �‚�hŕő/Ś!@C‚ ’iA’đúÇ­AK„Ąˇ—Ň�i�†ô€đř_Ż!Ŕ€4�ĐĐ‚$@ ’°°˝ ?ôZC IC/K ih@��h ač×°ô€4 cᡠ’ I¤%¬?ôZZđŇĐ ĐKʵ04 `HczĽţ…ńĐ„!=4„ˇ! X´ AřaI˙xč—–†„-HX‚† á!Ŕ�4đë…$�‚@Ň/aĽhA Ť~i „%,ŕ%k„!a@ŇŔú~  ŇCCŔ€� ĐÂX Đ‚ …%üKĆ’†$, ˝Ľô @Đ€4 @ż¤˙‡^ ?´0° X AŇ$AŇúÇ ĐX–�iAX$AzH� @�€ˇńë5ĆXz,h@„!=aACŻ%/ iAz<¤AZ$Ic 4€††`ük €† �0 H°Ikaa ú1´¤!, izz zH a@řµđ zz@z�ZC‚¤!- é,,é ˝H Ň´4 = h@Ŕô€€˙őz X� `H ĽĆ^–Ć– iá@/`A´4¤ kŚ ­€5� �~˝ô‚�i�XxĐC´4¤Ľ , xIřÇĐ/@XC$,,/Â� i�Ňi�ŔŻĄ�AX€�@ „%A^ŔZĐ`-X‚„-H4„! h czh@ż„1�é  �I ĐŇX’ ˝^kčńX„i,aAKC/@€�=豄‡�ŕ_ŇX�4@Đ€�,A °„……¤­5$ ’° %H4 @0„ ŕׯ˙ˇ%=Ö€ ‡4�h@C XKXzK‚ÖŹţ_ř%’,A ĐÓC€ ‡4 �Đ€Ć/é‚�¬A ­„HX KŔKc ă±IzAc –� �¤‡ ‡ 1a�˙KŔC†„! ° A$h X’°ôcŕ…HXŔ$­ˇ5 �k�†�@żđ4ĆŇ�=h`KŔ’†–€— őʇ^‚�ia, xA !á! ¬@�†�üKŔ°††� =¤X‚I‚$A/ŕ…őŹ—H–,aaÂІ ‡ô� �˙ëő†4 h@��Ň‚$hAÂÂ’˝ ˙1–^CX´,I‚„!h�XCĐř_ż~ ‚†0¤hh@‚„ z=–ĆKxüXK†$Ť…ĄˇĄˇ�Đz@CCz@€€‡ţ×0 $�„!a/H$zAciáʵZzhiH‚i�‚ @z` hŕ-ü† h�K´ ń°Iţńk IX€$@K/k@C€�@�4 `üúő?ž$�@CzĐ„±IŔ$aA züxzX$AÂÂK4 @CŇ��CřµĆ  i�‚´< KŇĐ’†^€z Ŕ‚°IĐŇC† aHa€^żŔX€ Ç� ’$,AX$HŇ‚ţĽÖX€´†„% ˝† h€ ‡0=°~˝ € …‡�XŔ’†$AX‚°„……˝A–4´ XĐ�CC�ţ× CÂŔÂ^€^zé!I‚°­ücýŇcihAcI€^€é­1$@‚ôC^/< ­hHXX/ °€ôă±$A Ť% - IxHz` �€đ/éÖ†ĆÂ4 á!-@xAŔ’†°Ľô?k­! ‚I¤őŔÂŔŇ��Âż�ŕ5�aH�ĆŇ khKŔ ÂŇ˙ř˙'üé5I–ĆÂŇĐ�hHi@ĐŔ˙z �$ €0$`,AX†–†´�-H˙xK�I,ŇC€€! HAéńż Ň�$=°��ŇCŔ’4–°€%H‚´ Ç?Ö’4„×°hA €�€†Ö�¤ÇXř5$�k@ĐĐô€ ´�i ,iH’€%éĽ4€_Đ$K i ­¤�„!�ż^C€��I’Ć– KĐŇ˙xü’€ĄˇhA^Ckč!A �ż^c@€4 hCÂcA° ,AĐŇX‚–ôŹŻ_xč…!­ˇH „…!C€��˙zá^Ň€„ C X€, Đ‚°ôř±^€AXZ’aHx,a@Â�CŻ×4�Đc „%Z´$čÇXKC„I‚¤5$`ôXŇúőz`H�Ö€† < Ç„Ą!á5´ H¤ý°HX K– `á± ^^/Ś!AC i@xKCK˝€,iHz<¤,@°°�-=$ hHŔô�††€˙—€˙X˙ŇcĽ€�H° -�ż HĐÖ?Ć$ah cI€^CX€�Xđ„Ç˙Zxŕ…!°đô/� $H‚$`-Ś×cH°4´ HxŇŔŇaá!Đ × A �4Ö ’€…5$i,A¤ńCKIŔ„„Ąˇˇ5�é!@CŔ~-`H�Ö†„…‡ ‚Ö– H ’ Ç€%Hc ’„ Đ �Đ€0€ýAC�aH ŇĐ$,AZÂ?¤řwvpkŞ��������QD�Ż2��YĽ$s­LBWWGVH��|�|�K�ó�:����%6������Ö Ă; ��u���Š, �ů_ʇ¤aIX€4 h`á ř×-h@� ŔXôá%ŕ…%<�I�˝†đ‚„…%¬!4 Ac`áÇż~á1–’� ­@’†„%/H‚Ö?K Ŕ A $h@z@€@€đKC�  �¬5°$KŇX’°$üZÂ$ xaAZKC� @zŔŻ_c iÂІ†€ ¤…ń’ %ýăˇ×ÂĐ´�˝ A’Ň4 !�ĐCŔ^żđ� ˇ!h i�´†° kŇ úk=I$,H‚$A�ô4† @€ĆŻ_c X‚Ňz’4¤ĄˇĄˇ%hýC°$`A$aI =@Â40ŕׯ�é!hŹ A’kAX–°¤<ÖA Đ‚ ĄˇĄ‡�i i@€0 =^ż0€54aĐ€A áH ´~üĐkáń‚4–†´ hA ‡ …‡ č×k H€0´đC ŇCĐX‚°° xaAúX‚A–4¤h‚‚Xxř_ÂŔ$<´đŔ K?¤×Ŕ Xa ’ 1 — ’ ‚†4�Ň€�˙zá…!Đ�¤ @cAĆK‚-Ť%aýxhICÂ–č ’Ö€4�zĐ�đŻ×�Ćh�4„!HŇXkH°$ŤĄ<†´€AÂŇа¤!�†0¤@ ü˙Zř×€�i AŔ† ičŕ%Z–$<~h-�K Ľ K4 ŔXzh@˙Zř’4 č!h�0„A$`IŔkAxýă‡~AC ^°$hihŤˇ…ihC�4đë…$Śhh€Ś%xIŹ%AŻ!áéCK$` xA$= ¬h@ă_ x  €4 !H$ ŇÂx KŔŻ?ô ,Ť-`IĐ$<–† ‡„5 `ŕI˙?ÖKŇ Đ�`é! Đ‚a ’ôă±ôk�ÂIŇX ’†°� ŔÂCzčőC �¤ H€$/@ Â’ ¬…<^/ IxiHx Ö€4€4�ačµ� ICC0¤@$`IŔ –€—„CK„AK€^°�`=€5† ˇ˙zᇠ, ,``a@x ĐkHĐŇĐ‚$xH‚ Ť„%A†4 @X�<ô˙Ň� ` HđĐ´€%H‚„—€—đ? %ÖX‚$,iHCĐ€€! �€˙ë… † ‡€!h/@Â’ĆZ– %üă±ôżĆCxA¤ń‚ Ľ0 zca@˙’~@ŚĄ¤‡�X€…%@Z– Ť˙ˇ_X‚Ć„%,†�€��X�zýAŔ€ ¤1$i,A$i¬ KúC/’€%HX^ Ç444°Ć�Ť_/ hH�hC–�˝�iŇđ~<–°†  I‚$ HŔzh@Ŕ~˝†Cë ĐĽ4$A –€µţCKđ‚4ô‚$ha44¤$<h�ř˙ő-čÇC€† A‚ áI‚ÖŹZ˙k<Ć’ aŤ%H‚0´° ­‡ŇCx˝0  @€�@ ‚„IXаÖ?~č— Ľ€%@/<$=$č!@�ĆÂ�ţ×K�°0€0$ Ľ Z€„…%kýʱ$,�/@„% I� i�롡5�üz, H‚�� - -Kc ’ Ąń/ ^K^‚Ö� h Aż^ř!i@�‚„%@KŔÂđ$Ľô?ĆZ‚ 5$A$ ÂŔÖ€4ôĐŻ…^ÂÂC �$ŕ ’ Ľ ¬őŹÇZ„Ą! ZŔŇ4†¤Ň€4�, x˝đŔ‚^‚đô/X ,Ť%/ i Ľŕ hZĽ€±„0Hx-ý¬A4€…! °°4´čéŔK€Ö Ľ ,Ť%, I, AC‚0 é!@€5 @ŇC‚aA‚$H’„Ŕ˙ ?°$z ,­ˇ% Ck@€†�@Ż_˙^x,@Đ€�Ŕ ’Ć %Hxýxč_z - -h¬5´ €…!XŻ×hĐĐ„‡„!Ň,, ’Ź_X†$Z–†0´č!a@ÂCř…ˇ@€4 @z@ ,Ha-@ZÖx`-¤ˇ K€�HcH�=„!Ľ–ĆŔŇ�0¤‡�@�–4$aIŔ/ éHă—€A‚„°�h` �Â0°Ćż~=�,�Ň€†ôŔĐ´0´ôĐ ‚$A Ň?Ć’ ZkA$Hz`���aüza�’~HĐC€‚X°°€-HX¤őŹ!-XX´° Ľ$@ÂĐ řµ0 @€��Â�$H$/haaaIúÇĐ x ,Hđ‚đC~Hú!@i áők  =°đĐz@’,,Ť%H$Iú1đ ’Ľ IX� ˇ!�cŤ!Ť!čˇ× c,@C€4�CXŇ´ôX ’€_üÂżĆ�~A– /‚�AC€�Că×k<$@zHŔ0 !@° i,aIcIŇ?^�$AKzZi ­‡�` @Xă_C CX� @AŇŔ ‚I„%aýxč%@‚$H‚–†44¤i@‚��˙ZŹĄ C�„…‡-@’4–˝†$ýxčĄ! ‚–†´4^€�aëé�ôka�‚ aH€0$I^Ŕ´ ,IÂŹÇZ‚,H‚° Ŕ€†04� h�€ĆŻ—~@ÂXŔ„ˇ!XZô$I X?Z ‚ hAđKŹőX� @C0ôë×ă!, Az@†�Ax’�-Z‚„~<Ö´0Ö$ † Ak�†~-<ô  $Ađ‚°°„……ʵ¤± Ťđ–Ľ !@z@Â�éač×k @Ŕ4-`IKX°-čŹµÖ h’$`I~HŔX� ˇˇáő ?$ ­1$<ôІ$`ihA„ /čc-’ HŇxAxé± �  éé¬ńka�† �†4 Ľ€…×cI$Hkhýřń/=°AX ,ihAá±�@��hüZŔc iІ  „Ąˇ%@Ż!Ixýăˇ×‚¤!IÖ�H`‚ �Cż^ă! ,@Z$/H° K‚ô㡗€h I‚°¤ˇ…‡ =h� aüë5`a0 „%` ¤h ?z­!H˝†„…A  C� !üzŤkhŕ5�¬ I€$HŇX’đʎ_�–†„×-` Đ�–„ˇ!�€đë5ĆĐôX� �€ aA$ i – <^k Ađ¤ 4 ± Đ€đř_żĆăń‚ÖĐ ˇ…‡–†„A°Ľ4¤CZ‚,K$č Ź�x ŕ­1 44¤‡�X‚­!aaA‚°¤˙ńĐ/ ŇĐĆŇÂôCŇ€�4 _ , €ô č!Z´4´ H´ üCxA$A–†ô¤Ç�ĐĐĐřőÂ$ AXx¬ˇ!HIŔ„%Aë/ čĄIŇĐkhAĐ0$�0 �ż^ʰĆ4´ h áA $I˙c¬A‚$ Z€ �cé…Ç0€!üúőŔCk€„‡„! H–4$ ’ IXĐă‡^ cA$` X† h= =°0�ýZx`aH�@Ň€-@°¤ˇ%Ť% ˙ŔZ$Zá5hh`a@z€�ýzŤ‡�iC†�  ŻIXK‚–đŹÇz­‡ $AÂÂÂX�Âc�€˙µĆCІ†�Ź z A IФü’†ÖĐ‚°iAô„!@CX�„_Ż1�4�éé! $a ‚´ ĽţńCż4 I %@Kx,Ś5 HCC€_ż^°��hHc,@KŔ’€%Hž¤ˇőc`= ž€I^�„±††ô@ĐŻ…¤!hĐ€� `a °$HXđăMčZCŇ ‚€ő�@Cëˇ! Ť˝Ć�$=đ�I/Kc-�/AĐúÇÂXH^ĐXkH† iĐ€�@˙ZŔC„! ¬HA‚–�-�/A– <z Ŕ XcaA’  ,`H�4=�é‡đë×C @C€€ ,A–†´ ýc,-HC’4´aIz,�Ň€� Hh˙z=0¤! @ÂC€0 Hx ZZôŇŔ/ýŹÇKkHiZ ŇKAC� =°Ć˙úőXŇ�$ ,<$é±$@ Xz ŇúŹek€™`‰$@’ ±44°�@ô�ݰ0$@C€�$HkZ° ýxh-�K$A’ A�† ‡†ôCôza �ÖĐŔ€†ôÖ°č…±$HZcýʎ—K€´†„… / a XŇ‚4ţő$� hHáH´,,Ť%é˙ńĐZC hK˝$üĐk�€…H?ţµ�č!A‚�@C -@Â$,Ľ€%ücĽ¤± HĐ´ €ôĐ0ĆŇ€đK€4°0`Ť!@�´ h I^‚„%é˙ü A´Ć– , ŇC€Xzř× ��é!@XŔK€– ,A Ň‚ţ1´$ IX°°°€ýX� !�C€_/< €ô ˇé± 5ÖX’†^^Ŕ’ CZX/ Â¤5°0$ý€±�@ř× ˙ż„‡hCCzH$ IXŇĐ ĐzüĐKC‚ai, x Hc,@CCz˝đŔŇKAú!¬` X´†$,zĐ €$aĽIŔZCX‚���€˙ZzŚ% €�@k$HŇX XXĐÖc`-Ś%` Đ‚i Az`Đ€ ˙/��ÂŔÂC�Ć$ZzihIăő@ż†€¤±°ĽIC€„‡4„!@?čńŻ Ŕ44 -@‚I´° ý�ô°H -�zh�� @ĐC݆† =CĐz,KŔ$AZ‚´ô?†^x’4^$ Ň€4��4  Ś˙ők@†��€’ AZC’$AZ’ţc˝ôXX€$A’° AÂ�ÖCC0ţők h,`,č5ô4 A %’$hé˝4­±° á°�H CzHĐĐř×ÂC = €° `A‚„…-@/á˙ń/ ,iHXXCKŔ’ hX†ÖŔđř×ÂŔëA=¤‚0 °¤ˇ%@/’ĆüŇ€€—†„¤!i@�¬@zŚ…µô� �„!`,<$A ICKŔKôřˇ—†Ć’€%/KŇ€†�C€ ńŻ×X�¤�aH- KŔKŔKúĽ�,HŔ‚$H @zŇŔXŔż$< 5€5 ˇ!�€�- I$IĐ´Ö˙c¬ ‚°$H Ö�éˇ!č1$<°Ćż~Ť IH�„—†ôx X’ -ý? %¬!ič5$A І€ő€ôŔĐ€� ýzá‡ŔĐ�` ŕA‚„%/ -aýĐKZzHKŹ%A ^4„! CĐú—€ HxH„!I°€—�-,HZăÇX$’ IĐ´đcA Xx á ch AŇC$K‚°iK‚?ôAk,,/Ť% `, Hx`á!ŕ_ ,č!Ť5 `¬ˇA 5$H˝ ¬?–$Â$HKCK�@Cëa�€˝đ?đK, , á! XC$ŕ%KĐzüciAŔ‚°4– Ąˇ !¬é!@�„‡„ő€€� �c x$Ľ ,/Ť%ýʱA° ’0¤hHcH €ĆŻ H†0¤,A‚-/ - ŇŹ‡^ ‚ÖĐÂ^‚$hHCc Ŕ€ô/���@ú! xi,aaA xaA ˙ziH xihiH��azŚ…ˇˇ‡�Ť_/ý zHĐC0Đ´�-`I„µţÇŹ˙µʵ ±°€°`‰h, �Ax,č5Häע˙ü"�@z�@ŇĐ$,KK‚ÖŹÇZ $ X ! HxHŔ† ÇŻ…5`CĐ€0°�áŕ Â’Ć’ őă±° HŔKCZŔ ô H, `a�˙ZcA€† �ÂHŇĐ‚°„IÂchaxi/HI� h@�ô��ŔŻĄ AC‚ …ń’€$IXX XŹŇ Ŕ‚¬…±–†^ �Ň�Ö� ‡��˙Z @Czhh@„IX$-hýă‡^kxAŔ’ ’Ö Ż H†�Ś˙µ0 !é‡4°đŔ††h A Đ‚„…Ą±€$HŔ‚iA‚ C0čŤ_żĆŔÂ0ah` �AđŇ$AZř襇IĐkH ’ A€ôCxý†�A`a� ‚ K–¤±´ Ç?ţ—~H °čč5„×€�ÂCk ŔŻţë0¤!Ź=�‚ HŔ ĆZĐcH‚¤!a Đ X‚ @ĐĐ4�¬‡††°^z� C AhiHKŹ%-@zzýăˇ%ÂŇÖ$H4 @xH†0üZŔc‚h@��-’ x ’$iýă±´ ŤĄ±$h/HŇ€�@�†4��ŔŔżĆŔ � ’„°đ–ÖX Ň?†ÖZK^ŇkH @  @x@˙z=¤! €—†´†´4$-@KŹ_‚€…h Đ ^Ŕ¤ €4đŻ AŇ‚�ŕ% ü¤5´ áĽô?ú�­!AxŇZ‚� Â�a@řőz`, � é! I°4ôđ ‚?Ö‚H‚$`I’ôŔ†ÖCC‚Ö ?$=$�Ň�a@$hZ‚°iAúÇX’ H^€$i,čĄÇX� ˇˇˇˇ˙%ýŔŇC @‚††„ ^Ŕ’€—„@KcIŹ%A– ˝$`H�€5† ‡†0ţőúh-üX†0¤‡ ‡$@$,/H´~ i’Ć–,  �†4��züëˇ=Ö�@�ĆĐ�^C–€%h//čÇÂĐ H‚ÖĐ‚†�CzHŔŔř_ Â� , €�,HÖ’ ×^‚0Ňk$H°$€= �ĐŔ˙úőŔ�† 1ÖĐ´† aIcIÂ’đĐ ¤5¤h ’�=¬‡0@ÂŻ„ˇő€4†  a X¤č KÂŹ‡^Ň ­! Z€Ö�„! @z` �€ĆŻ_c@€�AAŔx– A ’°$<~,-x’° IÂ4 �4†„‡†€_Kţ˙wvpkĆ)���������w�"V��YĽ$küBWWGVH��}�{�Q�ő�>����žđ•đ������c Q A ��W���Šş�Á°ĆđĽ�, XđŇX’ţńĐk AX‚ĽAK, €�@CCĐż¤ Đ4„±°,ičA’°-ý?/-@aaAÂ’Zc, AC  üż€0ÖĐ€�áA’ aai,-@ŹŇKZ€$,`­HHXŔÂA˙zé0�AŇXÖĐ ^‚iýă‡Ö„,HĆKŔ �k� H?„­Ç†�Ň�hhihA‚´�-hzáÇCK C$HkH �¤¤Ćř×k`ŇCŇCC€~hZK -@/čǰ€Ą!-H–†=$hCŇCCřµ0 €4 Ť!z,,Aă%,/ -Axé ˝€ZđŇ�  �4¤° ˇńŻ AĐ4 Ť!Ľ Ađ$ ëńŹĄ` ^zKK�€0��Ć˙ …!a`á!`HHC Ŕ/’-HÂZ˙řˇ×X$i, xiH�4CĐ‚„Çż~Ť1hÂŔ€� xAŔKC’Ľ°€őxh Ň$` „5 @ � ńë…1¤!a`k�Â$` ’ a Ň^?~č%„%//`ĐŔ€��„ńŻ…1Ö„! @C€% I‚i//ýchIŔ‚$`-HXÂ�  ŔżĐŇŹĄé!a�†° h’°°-aI?ř%hH‚-Ť%ŤĄ!‚4 ˝Ŕ/ -<H�@CC ' ݱ4^c Ň^˙XzH € ݎ �†�@cč×Ň㱯1 €-@ÂŇXÂđ°?ô A$H’€Ą1`=„!ič!=ţ×Ň@‚0 i„%HÂZŔúńc˝4đ IŔK€„…!č!á! @�~-`@ Ś…ˇ!=` ‚$H‚$Iúńc˝4$AĐ‚ %`-��hh@�††0€˝~hX0„! ´°€×Xđ‚„……ő㇧% đA xĐ @Ź54 @Đë…1 IX‚„…aIŔ’Ć’đřˇ×ÂaA°$@�A�ŤńŻ_ŹA�¤‡4ôX€—0¤Ą$HX0Z‚aK„Iúˇ……ˇ!=°đđĐ˙ú! c ACĐ€� HŔ‚€—^´°€őxh XXŇĐ^´� i4�i�đzéACĐĐ ¬-=đK/ZŔ Âú!ĐŇC ‚°aA € ­ =4¤ń˙‚ô¤i` �´$@’ Ľ,aéڵôĐ$’ X‚đX�4 čAč_ë@C€ ‡I´ 5–$,¬- ŇX‚°$`I�` @ÂĐĐ€^/<°�ÂĐ A‚$/Ť…%hAZřc-=ôÂĐ ~AX‚é!†�i�ř_k�‚4�i�X % K^KÂţĽAXŔđ‚ÖІ†€ő€�hh@Ŕ륀=°�@hAXKĐ‚ „%üʱ¤!IC–†–zá €0@�˝~á‡� C†�– ,i,AKc Zʇ^’ ŕ—†´�˝ !é^zH üZ$�đ† °ÖŔKCKC/@cŕ%@° –4i@z`a` @Ŕôă- XX€†€…H– A’=^‚HkH’Ć’°ôŔ !h��áˇń˙Z€ �k@C��ZXC$ ’„%čő˙ă_ ˝� ´€%aá±�@ĐŇ�4 ŕ˙µĆ ôý° AĐ‚áIÂ~<––†„AKŔ ’4 h�4 �~˝ôxh �hh@�´ KŔ’ áIë˙ÇX/ÂŇĐđ‚$AÂĐŔzhĐ€€é˙őÂcHč!k’ÖŔZC XđţÇX$ /@ZCKCŇ CÖ€††�č×€ ! ,  A‚-,@K^ú?ÖaA‚° k@C€�€� Ŕ˙Ză!@ĐC€��ĐXIĐ‚-/I˙ŹÇë%@ ĐŇci/„!čˇ!�0 ýzŤ ,č‡ýX€Ą± Ż!a  Ň˙x¬—�á…ˇ%`aA �CĐĐ€ô†4�üż¤`AC€†ô€„‡,HAKŔ´ ýă±–° ±°č…ń‚ô¤1´0Ć�A?đ˙z=ŇC€ôŔX´ ˇ ´ ¬<–^  -Ś%H4 Đđţőúż4$ I?đ€0$HKŔ$H‚ÖX? ń‚ KCKCKŹ% I, �AAă 釖@’€%@’�- ZĐăÇZŇŔ’K–4–°�HŇC€�=$ ż4 a�é!A$ XĐ‚°„%üKkKCxŇ KŔ¤‡�€†€!Ľ~ŤAC†4„!č!AĐŇŔZkA$Aʇ–€ihAŇX’€�, i@ú!ĐŻ5† !ô <$=$ ‚„$AKŔ/üx¬A‚ Ąˇ%Ťµ …×�¤‡� kŕő† @€†�@‚°€×IkA’ ÇCZ†-,Ż5$@Đ€�á!čŔř׿đ �é……‡° K -` Z~üĐK†$A‚$Ť…!=444~ýÂx,4€ ÂĐ – čh ÂZřÇă%A$hAX Đ�Ŕ€��ř_†4 a�ÂXŔÂ’Ľ4–$,ĽţńŹ—„ń´, Z€ -< đzé1$�   €4– Ľ h Đ ˙ZX€° A‚ 5 @Ŕ0 �ô/�¤A0@k, –,I–đřÇzA Z^¤1$ Ac€†ôŔż^C�� –a-@ݱđ‚Öxý?K ‚°€°I‚„ ahHH? =đ˙ZC4 @�¤%,ZŔ‚$a ë?–^€ ’ĆZ€ ``CÂCĐ€4ţőÂŔ˙ĐżÖc€5�hIŇ^Ŕ’ őŹ’ HŇX’ ,CĐ€†04`�~˝0’°0�é,< %Ň– K‚´ţńx  hihA ±0�0Ťˇ_/Ś €�azHZ‚$,,,aaAZ~�z Ŕ$AxK�h é!=€…Ś˙őz`X„!č!�ZŔ ’°°4–$ŕ%á<^KcAZ’° AĐĐŔZĐŔÂCĐă_˙ëń€%b ‚^Đ$KCKCZĐ?Ë Đ ŔK–†°� `éxC˙ú1‘  h`A‚Ľ4$A $ýřˇ—4„Ą! Z€$† <´Ć€!@Ż<´¤A‚�I‚$HX‚$aaýřÇkAĆ’ IX‚4$ Ak�ŇŔđë×CzĽÖ�„!= =đđ$HX-ëǰ - -zA †¤ŇĐ�čµ�üŹőZC4 `, A‚ ihiH–€5X’’ AxA‚� CĐ€�a@�Ć˙Zx`Ŕ��,AĐŇc /ZXĐ‚ţńxI‚ư¤ˇ Ą!cAxHŇ ,<ţ׆ @Đ€�aŔŇC/ ˝€Ľ x €´�a ’4ôŇôŔ†„!@�=ţ×/Ś!‚¤€ ॱ°4´ ZZúÇ­’†–†„—†°ô€ A‚Ňáő H€†@C€† HX– a ÂKŔ˙Cë5 °-` kC€†0 Ť˙őë@‚0� Ľ ,ŕaI$,éǽր$Ň’ÖĐ !C€4�Đké1$ €��ÂŔ´AKcIX ?za’Ć$AŻ!aaÂ0 �ôzéX�h@Xc@X´ ,č5$ ZÂ˙Ŕ’ I‚I  hi��4� ýú5†   ü$Ľ€  -HŇ?†–h’IX҆††ôŔCC�4~ý,@0¤Ŕ X Ľ4´ áýx,-@X´†„$¤‡� ¬!=~ý CÂ0Ża/`AxKŇ ř-xAz, ‚ô¤‡† „˙Ť± @C~† I^°-AŔ –€%AX€4 é!@čih@ŇK0Ö€$`­!IĐ K‚¤ -iŕK° °„! @Ŕ0„× ¤AÂ�`AXŔđŇXxA ’ţÇX Ť%/ič%� �@CĐ€đ€ţµ4°�@��@h@kH~AÂÂŇX ZX˙ch ‚đ$I$icCë1°04 `Ż—~@Đ4 a@Iđ‚đ‚ôʎ%`ihAxAx ĐX$<@Ŕ˙zá i@X�´† Đ‚„…%Hzý˙Ň ’° ĽIZĐ€ ŇŇc¬ńŻ<$@€4 €° HxA‚$iýŹż† K–„, i` @�@üŻ5ZiXCĆ$AxAĐ „%üz Ľ hA¤ `Ť!č!čˇ!ŕ_҆@C€H X‚$A’ÖX’¤<ô’Ć‚ hi,aA€0 =¤ ^ż0†„±�`= č c ‚^C ’ %Húc-„a  €0$`¬aCŔ^˙xh †�č° H„%AZ‚~<đK$,ŕ%ŕ%HKĐ�é!CCŔĐŔř˝Ćk`a€„  ~X cI‚–ţż0„°�- -,Hx€ô4° @hü݇$ ,č!H éˇ!� 4Ö¤hAŇŹK ‚ aKĐ´�@�¤†† ¤ńú…A’�‚–†–�I‚$a Ňă‡^Ň„5$Iđ€ô„!�€ôĐĐż~k@X�`Ť%H– ,¬±$A?ëH´†°° ,=aHCĐ c,Ťý/ @C‚Ň€ aAĐŇŔ/ Zzýăˇ%’†´�I¤‡4 =€× ��đż„1 @�Ś…ˇ±€%/KX°$H?K ¤5$,H‚°4ô†Ť!Ź5 ŕőҬ!@�= ` A Đ‚á%`-`éʵ,ZC ’ I�4Đ €ôă_/< €  €†´0^– A Â’„Źő‚ `IŔÂÂÂÂÂÂX€†† C€úµ€ €0=¤@’ a ‚– I’~üX/$aA ZXŇ€††0�€đ~ýúz’€±44�Ż!, - -H¤=~¬µ†,A-,= h@zHAx, Ť-<°0$h@ĐŔ€ôXĆ‹@XĐô´ô?^ ‚„H‚°, cŔ€„‡Ö˙°�Dz "=@Đ ’�- – cK$HXXXX^z@�Âż�‚ÖXZz耗�-/<ziŕŇ’ aAC°†á! ë é!@�ÖĆ‚haĽa XZ˙?†– ` XIXĆŇC€�hhhÂ˙†@€†� H^I’-,aáńýŇĐÂX$hA’��°Ć€ôĐ€0 ˝đ�� AzĐĐ$,aA ÂKŔKřńĐŇX ,A � aHcH†04ţ_ŇH‚��ĐĐđŇ$,hAX´¤˙đk=°° A Ň‚°�=Â�Ś˝ôĽ°††0= `H4– X ^řÇĐKC‚¤±$ŕ ˝0$=$�44„é=Ö�¤ˇ±=°0° ’€%KĐ‚Ö?~ü/=†~=$HI^�¤, AŹ…  /AŹ5$�„!c’„Ą±i iAXŇ?ĆŇ$@KCđЄǂ ˙ @Đc ŔzH IŔ„%,,HŹk X°$` ’°€±€±€!�€ô�Öż^ú5� Đ€^�´°†$ XZŔchih’ č5$ �@cCĐŇŇZ€ÂÂđŔ–†$ŕ°  KĐă_$ ˝†-=Ö‚ @C€�@ĐÂĐĐŻ…‡ �  ŇC A$ ’$,¬Ľ4$aAÂÂŇX‚�=¤ˇˇˇˇ axý€†°@� = %ŕ%KĐ‚˝€ĄüXK€€µ� /44@�†<hŚýA€�¬1 @ X�-=–$H’ CK�iZ^¤‡°�0¤‡†ţµ0�k@† „,Ť%,AÂk,aá…ńK ,zA^� A?4č‡4€˝đC0z,��-K°$Ť– …őŹÇZëˇH° aA� @C€† Çż^x@ !IHCXôđ‚$hA’ôʱ$h I Ąˇ CCCCŔŔ€4„ńŻĄÇô0$<�–°°€—€%hAxA˙zAŔ°$@ë,�€4�z@ŔŻĄ€0„!襱°�I–€ôŹ� KkZŇ‚ @Ň�¤1¤‡0„_K˙üZxŚ AK€–�IÖ–„őă±$’ Hđ‚A�04 1~ýXx,h�ÂĐ�-HŔ Â’ IxŤĄ˝ÖcAX´ Hx4€5�C��@ă× 0� !Ax ’°$hAKřôÂxXZ K€$<ŔXĐ€€á×k<¤!€0 HŇ$A’Ľ iAř1´–†°4– Z¤ €0 cč_ ʱ† �ô„ÇK-Ť…°„%HúÇc˝ ’€%/@’Ć C€0�čׯÇCÂĐz¬őX�H„Ą± a ŇŹ‡^‚4$KK� C€�@†đë… @€ i�‚^c ˝ ’ ,Ť%ýăÇz­-�KZŔ¤HŹ…!hôđŻ<° €�=´ _’†^Kz 2ţ1LŻA$ HX Ŕ !@� =ŕׯń€hÂŔ�- ° ’°„CKŇăHkH‚ih` @ĐC zřőŇ˙cüKx,�Ň�Ö€†€%Ś$@ ‚°„őŹ I’ H‚đ$=4  Ň�Öż^ú1–0$=°�hzHŔ†^zaآa‚Ć $`A‚iŇŔ I?$`ř%=4$�‚††0Ö€†aAI‚$AŻ<ô °A x -AK CĐ�¤~˝Ć€ @� hŚ… $ ‚$ ZXř1– i,,H$ Ź @��a@zřµôxĽ�€�� %`I´¤±$IúńĐëőŔZ-aĽhZ00¤‡¤¤ˇˇ_Ň‚ �4 �´Ö–Ć Â„IÂŹÇK$@ ‚°°€ő„!á±0¤Đú5đX€ i@� �/`Aă%` XŇX’ô?ŻĆ‚ 5°Ö i,=°0aHAk@Ŕë~Ұ†–� @‚¤±,iHÂŇÖ?z 4$, IXz, AĐŔ†@Đ ëő�–~H€�Đ�Ľ�aiż0– xi< á`AK–  ’ĆXz`a`CzükéX�‚†0�aH K i,­!ýxč—xiKC$’0 釀ő�ż�0ÖHxAĐ´†–�-Kă±$ZC‚´0–° � IXxż^CŇC � hH°IiAX?zAŔŇĐŇŔ/ ĽHzX°đ�ëđ˙Đż4K‚0 X$ Đ‚„iaڱ AKŔ ‚$č± !@CC� ˇ!¬_C°0°�Ś�Đ´ H‚$i,-üxĽ$`aÂKC’  ��ô€�ŕ_€�@€%Ađ‚$IZXřńxá5$¬± áĽ AC€†��k �†~-=†hCÂCĐ$i¬č5$-`iëÇC/a,iH„— é!é Ŕ„á!č—4 i@ô–†-H$a ëÇüZZ€$,aa Ň @�ôĆŔÂă×/<Ć‚�Ha= = ,A‚đ–€%H’ţńř_C ‚„,i, X� � i@€Xă×€�A� �†^Z„—�-,HŇŹ‡^k�/X‚°IĐŔÂŔÂ�Hc`á!Ľ~ᇠĐ é!@Xđ$Ak,aaAă‡ô‚0–ai, ’�€��� h ýzŤ C�4�Â’0ÖŇ$A ŇÂŹ!˝�,H‚°$A’44 h�Xc€ĆŻ_�ci@ĐĐŔĐ ĄÇ ’€°$H ˙Ŕ–†°Ť$A XŔXĐCÂŔ� ż~=� �†�AZkA$AÖÂŹ—ő°0–¤ÇK- ‚¤‡4€5� ż`ŇcazH  Đ‚€%’$h ?†^„ ’$Ť„±††„ˇˇ!�c˙zá @� Ť!„%HX$H’ ×?~x{ŇĂI„,Ac�„é±0€5ĆŻ'ý� � i�ŇŔZ´ X Đ‚ôĂĐ“† A $ i=�Ň ˇˇA/ �~z€4�’đ ’„-H’°~xXOŔ°°Ć$h h@ĐË0žĆ4 ńëí_đ&<H€�†ÖZX€%Až°€×Ľ^ ŔZŚ@X€% �XŔcAc,€ńŻ_Źd @zH’ĐŇĐ´€…ĽDđúđ A–�-�/h@cCëˇ!@ ú% AC ađĐkZ€$ -K^?ôư AxZ†¤0é¬ai= ,čč!h@XCX€°4$ih X?$a Đ‚ á € č�Ŕx˝€!4 Zż K áaýxh X$K€%�0�č!@ŔŻ€0´†4†„!Iđ$,Hxi,ý?†~é! ‚€_Âx � @�†đż„A0 @XH ŔK­5Ö?úŤ ŇŇ$ k�K, HÂŔ˙z=†„!é!@�4 Hk,ŕA’ĆZ€^Ŕc,ü˙ţ^´ ॱ°4$@XX€04^ż0€†A�¤,<A�-=¤Ą‡^Ć˙żô�üŤE@˛°ÂŇ�$`HŔ~ Ұ č5 h,HC$ŕ%` ë4´4đҤ±$HXĐ$ HŇŇÂ˙Ň�$�X� i�‚°�  xAXÂôH A’° ­!hHŔ4†„ĆĐż H� �€0€ő´€%A XZ$=~ŕ—�Ľ†$AZcI @€†04��˙Zx`c€44 ¬,AÂÂÂ’ %čőŹŻ%XZzĽ 5´ A ĐCÂCzz`­ a€„‡4 ýi,AxiH–€—„`I$ -Ť%H‚¤0@�á_k ,<�4 @$haAKŔK$éCK‚ ’„…I� 耆đř_/üݎ!a�ôX$iĽ€…ׄ%Az<đ’Ć‚„5´Ľ ,ĐŔ�`¬@züëcé!A CĐ€ ŕŤµ†đŇ-čń´0 ICK€�aHC� = ýŔ˙zhA,=�a`’€%H‚°°„¬Çë…ˇH¤ˇ%` ­€ X�üŻ…1$ HŇ�‚ ai,, -AX‚ô?€%iZ€I¤hĐC� ˇaüŻ~ŕ…‡¤¬ˇˇ!�‚,A‚„%`I‚ôcŕ%°¤±$ŕ% �Đ�đżĆCkh�@Đ‚ ,hAxaA Ň?řµ†°€IŔ ´0°4°đô�a@˙zŤ^xHÂC҆ ,` XŇĐ $ ˙zAĆ‚„,A‚° �Ö� ˝~a�‚�ca�4IX–Ľ° IXú-I�^ Z–€—~`a`€¤1�ř x‚€! �Â�$`IŔŇŇ‚$aIú ý‚€…AKcI/¬‡� H@ú˙őz aha@z` =caAŔ°¤!˝†$áń^€ ´�˝ ‡�ŔÂ�@ éńż–~� �a@ÂŔĐ c-Ś— ZŔôxH˙˙¦ńĽ4°,H‚„!ahHüŻ!i@°€!hh@€ ICZđ ’°ţ±�hA aa X’0caŇ�4†đŻ… ��ŔaI$h XKXÂŹÇz –�˝/HŇxAŔ4Ś54ĆXŻ×„!é ŇŔ¤,,H‚„$hýă‡^ Cđđ‚,�ôCÂŔż€=$= h–�˝�IXK‚Ö˙�^k‚ IŔ =¤± =@˙kA†Śő�h,`AĐZZŇXÖŹ~ I/Hkč54°‚�@ĐCĐk˝†h`=4"=„ -$ú,č1¤’ hAx/cAC€0¤H@Ň/ `aHC€†~ C/@‚IĐ–ţ¤Ą‡$AĐ‚´€—Đ„ř˙µĆ hHÂ�@ÂŇ$H‚´ éh ‚°°$č…č!Ź5 `Ŕř˙%ý€ C€€!=°�,A ^C’i úÇĐ ŇXŔ„%`-@�@ĐŇ€ˇˇ-ü4°�ëő ±ai,A´ /üx¬aZ– -KXCC�`H�đŻ× =¤a€$HĐ‚„………%HŹř%`Kôô– ‡�XĐ€€ˇ˝^x@Â�€°4$é±–†^ µĆ?€—„±¤±iZ‚4A = ��đŻ×Ŕh@z@C ,H°° %`-H˙chI$A’°$č5 = ôĐÂ˙Z €�@€0đ‚ 5$­!iAÂZĐ˙ă_xŕ%k,,Ť%a �ŇAxzüŻ�@Đ�hhhhH‚ I -Ť%iáʵ­-/AZX€5 ař˝†@  I‚đ‚$ŤĄ5ôôú˙Đż4°H°aa @zH‚ !`@ă˝ €44¤‡�CX€„-` ’$áÇc-’€Ą±¤±-� = i ř×ÂCŔ =°@KXIĐ‚„¤<Ö i,A°4–đĐz�ŇCC��ahŕ˙%ýĐĐzh @€4 č5-’ ĽĽ°đŕ—K€4–,i,€ô¤ CżX€�Xx „„%,ॱô?Ć’4đ ŔáĄ!AzHŇ€†�a` hüKz@ č!ahĐŹ%`A4´°Ć$ ?ĆŇÂĐŇCZŔ ôĐÂŔ C�„µ ˙ú%<¤A� ú±,„%ŕ…áőcHÂđ„ …Ľ�AC��ř×CKŇ4 �†–^$/zA?Ć/° HX– K  C‚´„‡4�ÂŔĆÂđ %`I‚~ڵ� $ŕ%@  ‡44 AhúµđŔ‚†�é!hhC^đ‚„…%H’ţ1–A‚°,AÖФ@Ŕ€0ţ%áÇ‚ô††�@é!ZXŇX$ICK€„I$-@�  Đă-<‚0Ö°¤ˇA/` ZÂ?– iH$ ZĐC†0 ˙Ż…ÇX†„i� ÇK^ü‚$, K˙ř ÂŇX‚ @x=� hč!`üë5ÖІ†�a`C’†´�iAĐ´ ýxčĄ!Ľ�á ’ �ĐĐCx¬ ýŻő� zHú!`= - - I‚đŇŹz IKĐ�,�ŔÂC�„é%ŕ± !h@Đé!�X$ Zc KÖ?†–†$ K^­‡��@xŔë×��,= h@Đ€�,AXXXФ……Ą˙1ô €^-`i, Z€�CĐŇŔ�=ţő‚4 �‚XxHŔ X -@KcIĐë -KC’Ć^Ŕ’†€54đ�Ö�°Ö˘€ Đ�KC’Ć$A^ôă! /@X–aIXxH�4 �ĐĐă˝đ€ !á!Ŕ @ Đ$I$IëüĐk AÂ^ŔZŔK0$��¤ˇ‡†044~ýÂx,HŇ� �°° ’$, ë �^°°€µ†–€_@kh`= ˇaŕׯ1 c€�h@€°áĽ4´IX x Ľ€…hAĐ ~a éi��4~˝đŔÂ0¤€�ŕA Ŕ/Z‚–ĆŇúÇC/$H°$`i i�� h@�ţőz Ac a,`H´�Ľ4ô‚° …¬ÇżZ�^°€%€� c, �~˝0�AzXŔz@�´†­!­!i -HúńC/‚ xihAÂ44h@� ˇ_/ý�„!�„!@Cđ‚4–Ö$hičőă‡^X€ ,H‚$A ŇĐŔ�= Ľ^úA†�CĐZ€„Ľ,/K?K -`IC/ ,= ŔÂC€� iĽ–€@�4�‚ÖĐ$aaA’ …őʇôk‚° IXĐ�=‚�üka@Ź% ,�€�@€$-ڵ hai, zýŹaĽAÂŇĐ ´ôŔ€…‡ ,ŕ!ŕ_C��@C’ ­!I‚–Ć’Ö?~ŕ˙µ~<ÖŇ$Hइ@� @4~- ţ˙wvpk°��������"Í�Ż2��YĽ$ş;łBWWGVH��~�{�M�ň�C����žđ•đ������¸ č ��f���Š/ �ůo˙ŇËX€¤H’4$HĐ‚°$Ťőx,ICĽ€…a- i`€�a@� _ÂC H€ŕ%@ Đ’†^Ŕ饇$ŕŕA đ@xHX/`@ !h, X‚„%HÂZŔúńĐ’ H‚°  hh¬€†0� ŕ˝�¬aH,<$,KcIŔKCK¤<¤—´�I K€^Ŕ�€ ‚đŻŔÂXĐkhC$ik aIŔK€^˙řˇ%ZKX° Ŕ† <$=Ć‚Đë…�ih�h,HC’†–†´ , ˙¬…±,=ôHX^€† @CŇ�„!čÇż^xX�°0°04¤$@ X IX?Ň˙Żń€$ZŔŇĐ X4éˇ!a@ĐCż¤˙Đż ZCC Âđ$HŇX´~ üżđ/X–€%,ŕ…ˇ…Ç�„ǿ„! €444$é±IŔ„×IZ$A´€% AІ ŔřµđĐ €�Đ‚° Z^c Ň돗K�^€đ X‚�  ×k�ĐĐ�i,Hc Â$ ëǰ�-@Ż!I‚ �4 `CCXż† @�44 CŻ-x ĐkH ’~<^‚¤! ’Ľ4^ Ki@z@ĐCú%@�€ô€4°Ć‚°4–Ö„$AëÇŔK€¤± X Ŕ/h€5�� 1ü’�h€ ˇ‡AZCxA–˝đcHK�^C ‚– IXXÂŔÂ�4 ŕ!üz=�i@€€5�`H$,Hđ‚´ô㡤± ’ÖX’° @ ¬1 <˙za zHz@�  aiH‚$,,,AZ?~č%�/@’ Ľ iŤXCC�°ĐĆŻ¬ˇ!@C�A‚$KÖ‚°¤ő?°č5°° ,aᬅ!HX�ż�Ň€ z@„…HŇX– %¬ü4$ X¤AŔ€ô€ô0°đ�ţµ0�ŇCC��= =´�˝’$ŕ%H’¤/,@‚$,AK0¤c h�ÂĐ�ţő0$<$ KŔ’/A’Ć KŔKřÇX’�IŇ´€��c @ĐCřőë˙ˇ44¤€�=^$A’ IX’ôIK ­ˇ%Ť¤Ś��h@Đř×ë!a¬!`HcC�  k, XZCZÂúÇC/ ŔZK– Zcŕ5†�a€0°€Ç˙zŤAĐC„ˇ!x ‚ €—€µ†ô㡗†$@đ‚ a€0¤‡ aH€Ćż~Ť‡ hHCCzci` ´�˝†$AÖŹ‡– ŤIC/@ ¤‡ HXĐĐř× ?° !@€ô4­…H cIKX˙Ľ¤‡$` $’�h�¬!h@ă×K˙ŔŇ�–††� ŤĄ! ‚´0–$`IúńŔŻ5 A‚° ’ 5 @�¤‚€ ,č!é!` @� !HX´ ,A xýxŕ— !I€$H‚4 !�ĆŔŇŔŻ× aĐ AXÖ´€%Ťµ aý�´AXĐô’¤!hHŹ…!@Aaż^c@Ŕ‚¤Ľ A´ zýʎ%,Ś% I‚đŇ� é!@Ŕ˙ZŔCŇCÂ0°€Ç4– K^ IÂŹÇZ�IŔ’†´4$ ,<$�ĆŔŇCë0 é Ň $`IŔK^ëńŔ/A€´�Ľ-@k=i �†Ö/ @ 4¤!IC ´ /Hë<Ö Ŕ –€%HX0 z@Đk�Đă_ż† @�„!@‚ -K‚„µ ,éÇż4 A’„iéĄ1ô4ĆÂŔ€^  C‚¤°0 5IŔ$ż€¤Ľ�AA X„ !CŔCCŔŔ˙ë^ĐC‚�hŇCxahA°¤ˇ—€őxü/`,H’° I´0¤!aHk��ŕýĐĆŇCŔĐĐ0¤!ZKŔ ’€— ý�^„A XxŤ…%@„± ‡ �ôZ¤é!��HkZŔŇX$ K˙řĄ!,=–aIŔKĐÖ€ 5 ĽĆ€đ/á! a €ôŔÂC°€I€^€^Ŕ ʇ– i/H�¤ éi�Âđza@4 Ŕ‚A „_„%ýʇ^‚€ai, Z„!hz@C€đŻ5��A��,HŇX ‚´ -héüXK A XZC/4 �4��Că_żđÂXÂCÂC€¤±$ -A‚– IúÇŹ×ŇĐ‚ a ’$,ŇC�„!�đř_/<ĆXŔ H˝0–4– –­˙ńXKŔ c  xAÂ�AXđŔk�^/ŕ!4h�Ň�´aA’†–4ôÂ˙˝ĆŇIŔ’Ć�€4†Ö`˙ë× ĐCXŔ ‚$HXô‚°¤˙?^z ,h,AXĽ @C€€! Ľţ…c­Ac,�€�č5° HÂ^-üch Ŕ„%H‚Ö CĐ€4 €~üŻĆ° †  ŤiHÂŇа$ŕ%ý˙ŻZĐĐ °°€hhH� @ĆŔ˙ká^ŔĐ�¬  $’IĐ ˙Ň‚ŕ Ľ , XÂC‚ ih�ĆŻ_c@€ !�XĐ€IŔKC ÂKCK?řĄ! ĆZ¤H €� CĐ~-Ś!€5†�Đ‚¤±$A’°°­˝ ` ÂkH X H� �€�Ś_ż^° Đ€0� H$<ZZŇXZŔ㡵4$Ż!Ix=Ö‚ Ç‚�` �4�éÇż–CXx, @z@�–†$HŔ $AKCʇ^’ H$a Ň€ €���4Ćż~áHŔ�†ÖXŇX°, ĐZ€ÖŹţ×úáe˝ačiH„ ‚ôX’XŔ„ńú5H‚0$``Đ‚€ ‚„%čđ,ҤH �€ôX0~ýôđ�AÖ C�–€% - I‚°I/Ľ^Â-`A–0XxIř±` HH‚$` – Ľ€ÇciA€´†$HŇXŇ€†� Ŕ� <ţׯÇ-Śh° A° ’°­Z Z€$ -AX ˇ!@�„<$Ľ^x` �$AZCKC/@’ %üx­!AĐ´4¤HŔ� hhĐC� _Ň h��@Ňk,aa Ż—4–°ţ1đzaŕK i,aŚč! @€�衽ƭA$@ X‚° Z– @/` ŇxKz ih,�Â0á! č×�đ�é…ˇ!z ’Ć’†$HúÇŹ× €aAXZzh @ Ç44áˇ˙őŔ~, a`€—†$ŕ/` X? A‚°�I,‚ �XŔzcŤ-< AŔ @XŇ$Z$ýăń’ XŔ„Ą±=¤ˇ!@C€@ýkáAC„ˇ! ˝†°¤!iŤĄ±áýŹÇ/ X†´�I–Ň€�І„˙Zx IŇŔ€„!` x ‚´0^X ýc,-@‚¤ˇ×I’Ć�á±�@ Ż€5@�ĆÂ�4´�-Z€$ xi,ýřÇ˙ZʎĆ-Z† @�¤‡4�¬1ţőz Ö€ ‡�za,Ť…héˇEzĽěB‹D‚ A‚°HŔ† €ô€0ţ×k<„5°†�H€H‚ÖÖ-zý?$hčŕHK‚AŔ i@CCţµ0 � Đ€4 =°ôX$/Ť%ič ú1¤,$,HŇX�Đ Ň Z/�C„ „—�-,`-KÂZăÇC/A$ Â’4–�€0 CCzč×K˙ŔŇ€  hh` ZC Z„%¬üXzaHŇ„IzAé!CІ�=đż^x@ ! €�` xI€– AZÖÂ˙K’†$ŕaA ‚Ö‚†= �ĐŔż^  ĽĆ …5$AX‚„%HÂŇ˙ř±^€ ’ -` C†4 AŔż^x� CX€4† �ZX$A¤ýʱ– IZôŇCKH,<ú!` @ăׯ‡€5� Ż!,A¤ˇ˝ţÇCK˙ÂŹ±¤!-@ @Đ€4 = @řő¤4 a`CĐ€$ -,/ëńʵÖ° /H^Ŕ ‡444¤¤‡0ţ×~,HŇ�é! č5° ,řA’ éńĐ’†„h ŇÂXŇ �¤‡�CĐ€Ö ‚  k@ŇCZCĐ$ x ^úýŇŔ‚aA‚$a, `á!é0¤‡Ć˙‚Ś ‚X„Ą! ’ čAëÇŔK€ ÂŇX‚ ő€„‡Ö 5�h-= ‚Ö€††�h ‚$zAX‚Ć/i`I-HK‚´0đ�i�Ň, @Ŕż�Xz@Â4�é-@ŇXÂÂ^ŇĐ/H˙’A Z€–0ÂŔÂ��CŔ/ iHCC�  @°$ -IŔKXÂŇ?~ c Âđ‚$,AôX a@Ż A€0 i HH-HÂÂÂ’ ×?~h- Ľ ±„ /`é!0¤CCŤ˝đ€ C††�=đŇŔKC’, ř%`=ŇŇ€^’$@’@� ! �4�Ť×żţÖÂC@C� `hIca Â$-`Iú1 —0˝†¤5ô4¤!�‚�@cč_k�ÂôŔ€�@Ň„„%H xaAëüaKŔ’€°†† €€! Ť˝† aĐ †° iHK€^€´¬ÇCZŔ$zA‚$`€! �Đ�ôř׿Ć €„‡@Đ‚I‚$,,aIúŹőÖ ’I€�AcŇ~˝†„!€ c-@ZZ^‚$,-üʱ–† ,/ -Đ€0@†€!üúő� =$�zHxĐ€^€ h Đ´4Öă‡ôk`A$ŕ%/ C�¤Ö€ýđż4† !hc hč! hKCŻ!aA X0†$,xAĐ‚- Ľ0 =4č!Ň˙ú54„!h@/Đ ŔKCK˙¤ő?Ć’Ć€_€¤ń‚$�=é‡�ĐŔŻ×˙Đ’‚ !Ś…é!`i’�I‚$,éÇŇ€–– ,K‚k�4¤‡†ôřµ€IŹ…±††�=ÖĐаAZ€´ ¬ÇŔK€ICZ–Ć‚�H Ż@�€_ ‚4 hh�Ś% ŇÂKŔ’ …ÇCZx顥!I C‚‚đ� i á_Ňc, , ACk@’†„A ŇĐ/` � Ľ @’€%hAôŔk� aCĐŹ-ýŔk@€ ‡�CCŔ‚ Ť%,AX’ é 4đŇŔK€$Ť%�€4�¬�Â�4~-=†^Ɔ ‡�-=$ai,Ľ AZĐ?ĆŇÂ$@´ ńŇ€!a CCÂë A� @ŇX’†^Z$HŇŹziHô„— Ľ Ť�Ň‚~` =°Ćké,@C€�@I’$,HŇÖÂŹ‡–ŕĄ!-@KA�@ŔŔCCcüż^řI�ah�ŇŔ ŇĐii, zýʇ– A$ŕ%/,hHc€� �đë Ť±���Ć�^�ÖX$, Z‚?ô ,Ť%AZŔ 5�€† <„_Ż1 aH‚ H€$H Đ X’„Ą˝ H IXĐ‚ C€�Ť! ŕ_ c`�@Ŕci,iHŻ´ ¬éŹő$ Iô„—�h@CŇXŇúő†°đŔ A‚€$HĐŇĐ ‚– Ś… A‚$ॱ 54¤ˇ!�ÂŔÂCCĐx˝ô  0Ň´€%KÂŇxéüĐ/=¤5°A’€% Ň���@ř_ ¬!h† ,A°° I‚–đă±–€ XkhA’ HH <ÖĐ� üZŔ�ôŔk é…^–†$ ˝ hAŇ˙ZŇ4ôÂX’ ĽHAz€4 50ÖKC°�@�@CIX–IÂŇ˙xhIÖXX‚4¤@xHŔ 1¤˙ĄĆ‚0¤ ! Â’€%A’ô˙cčiH Ŕ/Z�h@�°đĐcá!h�˙z?$ca` Ż-=ô‚ ZŔ’€_˙xH/hHX$ 0$�X  × ?$�ZcH$,ŕA Đ‚iič1°–^„%HXĐ č‡Ö�„! áI? ÂŔ€€!`A‚„Ľ° áéڵ4$KŔ$A‚đ0�€� áőŻń��Hi�Xc@kHX^‚ … kጥzah ’  Ň�Aʱ ÇXă=$¬4†„!HŇC $IŔKŇ˙c C/�/@ Đ X$錅…‡ ˇż^x@4°�XcH^ ZŔđŇX‚ô?†^řZĆA�°ôŇ€� hüŻ…H�¤,<$�X°€$zAĐ‚ôʇ^€­±Ľ4$ HXƆ�üŻ…H�HđXÂÂ^– ZđXK-@ŇXŇĐ X€�hhŔX�†4�ýZŔ éxa� ¤±„,AX‚$AZ˙ʇ^ ĐIŔ€4†4 ý€4��˙Żő� �Ö��Xx ‚´€…-/áڵ4$Z– č5$ �=¤1čŤ˙ׂ0´�hhh,H’IŔ/`iŻüĐ/h,H°° -č±4 =¤A¬ˇÖ‚~ C� ŇcA´ôđ–„CK$` Â$ih `azHÂđkŤ!XX€%` ‚´�I‚– ˝K€–�-K�ô4� =°† ×ŇH † ¬ŕĄ_´€%HÂÂ~ ˝ @ X I°€! zh@ĐAx@˙K@�€�=Ađ‚´4–´ĆÖŹ^݇„5´ ,hAX‚†� a€ <ôŻ…‡�A�44`Hzah c-`aA ÂK˙ă±´†,KŔ’€%�Ň €�Czh@Ż_c@‚0 @z@‚$`a X‚$ Ňă!-HCKCZ^‚đ Zxk@ xHŔĐřő c�ĐĐ�,H´€%hA’ţÇ/ A , X‚ �cé!h A˙kŤ‡ÖC@zhzh I’Ö$Ť%I˙c ŔIiA‚ €ĆXŔiŕőŻ1� CĐІ� /X^ŇŇciA˙Xz/x ÂZ€^Ň€� hh˝ôŇŔ Ŕ€^a顼 ’žwvpkĽ��������Ń˙�Ż2��YĽ$_:ůŻBWWGVH���{�Q�ď�;����~€������ ��l���Š5 �ů˙wöă@ż�HkHXÖ @ _ ‚�Â0� c ÂŇĐ Ąˇ%H?k Đ$HŇ€�� �Đđka iH‚° AĐŇĐŇXZ€^Ŕc`- A X$H¤ 0�ĐCř×x X�† ‡0„­!,AÂ$ /čŹő° hA‚–Ć’4 ihCĐC� ˝ĆC€4 č!�^/HŔ„—�iA’ţc­H°° -HX€đxC€ŇCë!üż4„!hk I€—€µ€%áÇŔK°a Z �C€„h`=�=ţőżĆch 0$ C‚$H„…-Hxé˙ńĐż4Ľ� ’ h= Ť!i�ŇŇ� ńŻ×ŔCŇ�´€0=°�- °¤ˇ%hýŹú—  5´ Ľ�ACĆĆô `üŻ…Ö°‚ HŹ%@/�Z$IcéÇŔk A‚°4´ Ľ ,@ĐŔ�i@�4 i�‚0$`Hzhhx cI^Ň–ţńĐZ�ôÂĐ I4Ak@�@Cúő € �� Hk’†$A’Ć’~üĐK$` Z€–€†�éÂĐ�ŕ_Źé!@zHxh= `, -xihA$IX˙ch-@XŔ i,i@ �‚Я׀± �H‚„—Ć„—†–ô˙zi,˝†$AŇŔX€ő�4ôk�i�„­_Ŕ IđŇXŇ?~Ľ–€,HX–4´ ‡ôđĐ�¤„!üZŔ„±�a�ÖŔXôX a x Z˙㡗4đ‚†^�~AKÂXĐ !?ôŔĆż^ň 0€ � ‚$`I€–€´ţÇĐZCZzHđ ¤!@z�a€đzá €�Cа H-AX’°ôʎµ†¤±IX‚đ�CcC� ýk <„!a`á!@CC´ H’ Ľá%üxh-Đ‚I ÂÂô `¬@�đżc€ő�@‚$ ’„¬¬Ą±Ö˙x¬Ą±hA^kŕ… �0�züŻĆC= �� !a Đ‚„%,,,=~<~i Ľ†$H$HŇŇ ĐCC� ü˙Zř^xa@�€4–°i -K^‚ţÇĐK„%�ż0–,h@XXŔţő ?Ć �a`ih ^–Ć’€¤ýÂÖ$Ľ†°aé�  C€��ř×Âch�é…ˇ!hč5 H°, úü/<†^C$HÂAŇ�č!a@Cú…Ň€ ˇ!`HŹ/ڵ�I‚„×XÂúńĐk K�^Ň´�i��hhCă_ cHĐ4 @€– hAă…Ą!-HŔK?Z‚AxZ–hHŔ††0 hčńŻ_Ź €�hĽhihA X‚ôxHZ€IC/@KŹ—��€¤„ńŻ…`€†��€0$,AXXXĐ‚˝�=~č%AŔ‚-/@Â�@CCÂ�4đŻ×C @ŇC€†° Z€–�­5$iýăˇőXđ cI- C� � =ţ—ôx,é!aH44$­! ’€$ĽĆ’ţÇKř…!IŔ‚$AZcAcĽ444@˙뇴đ� -<aH ŔK€$KĐ‚¤@KÂxAc­!á,A @‚04==ţőx,hHC€�@zXZ€ IŔ Â’ţ¤%�K€–†–€… i0$ �€IŇĐ ‡4�i,AX‚ Ľ IĐZăÇĐ’�-@’Ć xAXzHCĐC†4† _/< ��Śa –4–„%áÇ– @KCKŔ xAz,�ĆXXx�ţőÂ,@€†�=ÖĐ €Iz¬hAX‚´đŹń$ KCKŔ4 `CŻ_c@Â�^`A–†^€–†¤čőŹKŻaK–°  €0¤ŇK�@ô€4†4đ$A‚´€¤ő˙ZkHŔ  /H ú!éHcHĆż€!A @€ ai, ř, K˙xüżđŔ„,AxAX°đX†�H`Ť!Ľ0¤!z0$`IŔKŔ’$éü€^CIXĐÂka ! AcHcx˝ô�é!h�† ŕŕ% KĐ‚¤- K4Ö‚°4–đ�€04„ˇÇë—Ć�aH�†4�C/�zx ’ …˝ţ é@ ‚´€% / A4 !=  =ţ× c,@�¤¤ iHXĆ’ Ň‚ţ1´,ZŔ’ iAŇ�†ü~­€ `= ‡†,A´€% /¬˙ń–Ƃ$ŕ%H’ C†4†0 ü˙ú4 @zc @€ H‚„—†–ĆZĐ‚ôʎ…Ą‡$H¤ €�@Ö�†ôë50HĐ€�@Đ ‚„%Ax-`IK˙?ë—KŔ„%A’¤€ÖCé‡4�@żđCĐ€†$ –­±$á ʇ– 5°$@KZô†�@��a`˙zᇀ5€5 ah@zZC’h ’ô?Ćz ‚$H‚^CZ€†0$=Ć� C˙Ż5X�¤A €´�I , ZţńăµÖĆ„%HŇxá…‡@Ŕzh€đđř׿đ�@€�@$aA’Ć’ iAř1´A’Ć X Đ„aHi@X€~-< H �Ŕkhz ŔK€^€~<–^CK ­ˇ%`A0¤‡†~˝đ�´°0°�Ś� X°4´¬-A$,Z AAkhh@€ô�ţ_ŻńĐ˙ăőŇŇ €† a’ ,HXXŔúÇ‚~I° ,=„5�  CĐĐţµ€„ˇő ±0°€±Ľ I‚ áaýca,HxiH^’444 á!é^ř!ř—0°�H Z,ÁX�’€IŔ„őxhiHX€đ ŔK$aHĐC~� ż4@€±0Ŕ$hŤ%,KKŇŹ‡ÖđÂX‚° ÂŇ€ô€ é!h�đzá! ,= ő€�¬`AŔ°a ^0zAC  KŹ%A €�aŇCC˙˙&= @0 €€%ż€……-/Ż?– °ai, €ôC†4Ćc =„_k�k`4„!Ŕ–†$H ^€Ŕ  X‚$, i@ú!A€^/< ! Đ€°h а$AKú@Z$AÂZCKĐ‚ôŔ†ô†��zhŕ-ڱ�HA�ż�aaA  ’„׏^ …ń– ‚ CC˙ë—°0�H/ ˝�I$ᥱÖ˙†đ$H–I‚4 `ĐCC��üŻ_ŹA�h�k ,`Ľ¬őĐ  -㇖H‚° I‚ `` `˙ú…ÇXCđĐzhc A‚ Z %HZ˙ăÇKŻ-�/Z ­i�ŇCzĐ€0ôë5†„±�@�„!,HŔKŔ$A ŇÂ˙€´HKăIĐ‚†< ,`h�đë<° Ұ XŇX X‚$aýřˇ_€,AĐ‚´†^C �€ô€4†0ôú5HĆ�@$HK Đkha úô-@KiŤ!=¤ÇŔ� á×k ,<–¤$ , A‚ zř%@Zř1¤†$Z’$`i`,� ˇ€úµ€‡ é!@z,/@ŇĐ X‚$AëÇŻH^cAŇZ ‡€� �0ţők<° ‡@†€! X$/ iAë­˙×<ÖkZŔđ i@ôôŔÂĐ˙z,AI�Đ$A‚ A Ф ÖX°¤ˇ%Ť%h44=„±ţőX =é! ŔŔŇĐ$Ň´4–ôʱ$HC$hAĐ C†ÖŔĐż4�A��� Đ I‚– %ýă±Öđ$A– iCz¬ˇ‡ôôŔ�đż¤ôXCz, X$Z´ KĐc`-`A¤±$A ĐĐĐz�Ň‚Âđú…1é!aHĐ€€µ–€%ŕ KXX˙chIK’„á%ŕ=$=°đ0ţ—€Ç é! i`,A hAĐ‚$,¬?¤%h,Ť%/,Hř…­ŕ…i@ú!�úĄX��i AaHZĐXđ˝ ¬˝  Ö$HXzXŔ„i@Âř× ?đÂÖ� hK/ aAŇĐ‚IúĐŇĐ„%` ’ A€¤€0 �řőÂXz4 AC’†^CxA‚$ ú1¤˙×c ˝�IK‚„Ą, AŔ„éńkč5�i@Â4 = @ Ą—†$ ^?~čµ’€%@ $,hŚĄ5 ˇ! áׄ ¬ˇ!�ŇA ŕĄ!-Hc-Z?†$h hAŔ X^xH€ôCĐ ĐCă_CđŔ =°�€^�–, Â’ a=Ň€—†$,H„!HH ˙zŤ@€ HŔ‚ H„%/AK˙c¬Ą! X‚°$Ťµ ¬Ť…!č!�4ôZ€Xzŕ…€!@A$KZŇX’0Ň$H„-HXĐ€…„5$-á=°��€ˇaAX¤Ľ¤˙?– ,=ô‚°4ôK �€0�ţő¤!@Ŕô€ô€$,H„-H Zú˙ńăµ4$A‚$a ÂK~`a�k ŇŔř_Ż!HCC€�@‚° Zzič, züĐZzX‚$A’°0 ᇄ! aŔ~˝đ€ @ XŔ‚ , ’¤Ľţ±0$ „µ†´Ľ cC€XxCřµ4 Ť±� HcHzh $ ĐKCKôă‡^k`A–4ô‚ a †„5 ŔŻĆ�,<$�€ĄˇĄ!a Đ $<~¬%X‚ II€5  č!üë5đ�Ai ’Ć’€% ˝ ,Ť%aýăÇŇkÂҰ,AŇ�†�@ĐŻ~H�$ � H$ ’-Ť%IÂăŻ%h hih X$�Đc k�ĐĐ�ô/ �¤‡�HX°$`I$­±đúÇŹ—¤!I° IŹ—Ć€†4�€ô€0~ýÂă±=�¬ĐcAkHŇ$ KcIxüXK’�˝�ĽĽ AC ih@Đ^˙H€†�€±  ’4–¤ń‚„ÇŔZxAC/�/ -�44�caŕ_żđ’¤!�°^C ‚$hzŇú˝Ö€$HŔ Ą!�‚€ ¬˝đ˙oX/é‡�  x @‚€ü´�­Ź%A$K€´†°40 ¬ ĆżX†hô†–Zz,a€_¤E˙0HCAŻ% -, Đ�é…‡ ü/�4°�@–€—€$/K‚ôch ‚€—–h€!a@�ÖÂ˙’¤5 � ` đ I$-<x­! k,Ť$ 4°�@� ��†đŻ5†�ACkč!��Ľ !I° …I?ZkH’$`IXŔŇ€ô�Ö€0�Âc üŻ×xŕ5 a !�а-@/@ úÇc-HđŇ I‚� �@Ŕ€~ý,�„!č!=„Ą±IŔKCKcIXúŚĄ×ŔÂÂKŹ%,HX€†�@Ź˙őÂĽ0A‚ ˝0$ihK€^¤ÇŔK°A’°Ľ@€†�C��@ă˙µ†@�Ö�Ć€i’a ZXÂú ­` Â$IXx ĐC� €đú×ŔC„é5† !hA‚đ’†–„-¬˙CK„ IŔ ’ @€4�hh@Ŕř˙§ŇŹ ¬C�ô´�˝0´ IŔK^˙˙°�I$H’4Ö‚� i�� �€Ć˙ú5€4hh@Ŕ€Ľ°~xiH– ýř±Ö’�iZ´ �zHC� éˇ!�ż^ú$ h­±° ĄˇIXXĐŹO/ „%’a@ÂXcHXŻ×k<¤‡¤54a’ , é5°đKĐăţĄ €Ľ HÖ h`a�aŔż^Ź×€ �ŇC€�X‚$ZŇ %čÇCŻ5 HX° AÂ�¤1´4 i�z˝€´@€đĐ€$ Â’�iAX‚´ţŹ— A‚$hZ�@�`¬‡0=ţ× Ź!i€�=ÖĐ´IK‚Ö´ čÇCkA/Ť%ॱI¤‡�` hh€Ć˙z <$h�H¤ń°ai, řý㡵�, ‚-ŔX€ŇŇ�„ˇń˙záÇx =€†°4$,H‚ %hý?†Ö‚†$Ť-@’ �Đ ŔXx€ôŔż~Ťˇ!HihHŔ$ xKŔ’ĆZŔŇ?K‚/H4^† �€…Đ˙ZŹ!a,č!ŔXŔŔ$A¤ˇ%`IŔ/ý?Ż,h,Ť%H¤±� ĐC€ �ôkáa k`,�caHŇC’�üK˝ hA˙�Ö° A°hAx‚ Ť!Ľ~a�Â44°0 = ÂŇ$H´€×?Z‚4´€I„%@€†��4 aŚ˙×kڱ A��Ҥǒ€—�˝�-Aú° Đ Đđ ¬ z@��ŕ_ x`é!hCĐŇ�^ĐX/K°°°„ -iHX€_ -@Ň�é Hŕ˝Ć€ �ŇC�444 ,`a - ’$,é?–^ ’€%A ’ iĐ0¤�řő ?,`HC„ĆÂ’ K„%ýřń’Ö$ŕa­!a᱄!=$ý††�Ľ~ý/h` �� –†°ICŻ!-@Ź!- aAza, xÖ���züka aa€…AĐXŇ㥱 ’¤hač5I€–€…%`4 CĐ� ˝@­,<$  -`  – Ľ<Z X€$Ň‚€�¤1��đŻ~XC�€5†�@CX ´�iA’°$ýăÇëĄ!AXKK‚�hh�=°đ4đë× ŔÂCk�X�^Ŕ‚ĆKc Â$aých  xAcI �€� ř×kŚÇ0^‚ I4– ’ -Hx<´€% ’$hAĐĆ i@ţőë1€…!�= @kh’áIkhé ýÂXŇc-`A‚$�� A�<ţ×ë�X� !�€0$, xŤ%ݱ„…ĽţńŔ˙?áÇX ‚„,aKXŔ„…‡„‡„×~h  Đ€��´†$HX°° Ľ ő?†^ ‚° AX‚°�@zC€4†ŕ˙wvpkč��������€2� 1��YĽ$«Ý4‰BWWGVH���}�R�đ�=����„đ‰đ������´  ��^���ŠË �ČëăµôŔ@€0¤H€^KX Ąˇ ­üŇ A$,KCC€�@C°z-= hH4 !`h ^KZ‚$AzüĐz ha,aAXŇX� = Ť!@ăőŇcHĐ€„‡°ĐФˇH$/hAú/ h ‚4^‚$@C€4† ` áőŇcH† ý�€ -@°$AZţ˝4„%Ś— , K�h@ŔŔ€0ţő C�� `H^°° IÂ’$ý?ĆZ‚ 5$IŔZŔ‚ ÇXŔCÂŔzč!�ĐCż^C‚$ H0đKz KX$¬5ôcŕ—�I€–†$A†„‡„ˇˇˇ hüë…1„…Ą‚�@�$,/H‚$ KÂ? ˝† 5´€%,/�@z@�� Ťńż^c�†4 ! a´ i, K‚$á%üă±^’ H Đ’ĆŇXxH†��˙ZІ†�@Đ€€×,A$-HŇúÇŹőZ-@$i,I4 @顡!<0đ˙úôŔ‚‚�@Ć’ hAă%`IđŇ˙ăhĽ4$AÖÂX‚Ö�°0aĐ�@ă_݇$= h` � ĐŇC Z�ţkáCK°¤_€$ iC ˇ ,ý4^żđ€ �ÖĐРǰ¤— ŕ%K?–$@I°€Ąđ�Ö�°ôz-ýŔ Đ�zHŇXXĆ’ , xé˝HŔI‚$�Ö� h�Xc@ř_kŕ± h@€ @$A’ IĐ´=X/hhAX‚¤…IC� ¬ <$ �˙za<$ ††€! -’AK‚$iA˙x¬%h K´€%AC€°�Ś…‡ ôëŹ% ‚†Ś%h xaA‚– ýă±–€%@$A�@€�=„!�C˙zŤ‡�, , €0´° A Â’€—€—đ?ĆZ kH‚$héń4Ö !�ô� ŕ_˙z<HX��z,`aZ–4ô‚° ő?ZŻ! XX€´ ŕ� Axü/`i ­H ’ A ° %ŕĄ˙ńc˝4$Z¤, ŇĐ€`Hxzŕ˙ő?đX‚††0¤KC°€…IĐ‚ţ^€—�-HX0AX†� ŕ˝I,č! †A‚-@’¤ˇ—†Ćü’†°4´Ć‚^C ‚0$ýŔkč!ú× 0A°´ ` ‚ -?ôĆI–  HAc¬Ź%ýÂÂÂÖ�č! ` X‚, X$áőʇ^‚€Ą±áĄ!-  Ź�¤CzüzAëA�† ŤA A ‚´4ôÂ˙€´4$ZZZCĐ€ ‡� @úńŻĆŔŇ��@z€¬5„Ą±$ éH ?^ Ŕ ICKC/�k@€Ö€0č!=đż^c@‚�HX°¤!Ľ4´ aAôřˇ%xi/KCKCÂC Aú!@€†ô ‚ô0$č‡@°$` X‚$Hë $ ‚°„i„!@�†40„ׯ1� CĐcahhhh°4$ ’4ô‚„Ç$aĽ x X ‚ <–Ňzŕ˙%ýKŇ€4�€�-`A„$hIř1đZ�´€IK á!@Ŕ�h�zř—ô�¤ Ź…!�Đ µ†đÂ^XŔŇ~ -IŹ%HKĐ´� @€‚� =„_żĆxĽ�H ‚04$ॡa ’°° éʵ,@-H°0��č!`ÂżÖŔŔÂ@¤h/H XÂ’Ćŕ%H´ ,a/CÂ�¤±đ�=ôë…Ň�ŇCŔk,`aA„°´Ćʎ—†­!a „! `áÇ `zż^C°đô€„‡Ť%H^ Ň?†^‚ ’ A�4 Ťˇ5† ˇŻ_˙X ˇ!č! aX�–€Ą±¤±$HŇ?†^ŔŇC ŇXx/ZX�Ľđ€ÖŔż �„‡„!,ŕ5$ - I‚đŇ˙c¬A A ‚°¤Xx`´^ŔC‚† A? @‚-@ ‚–4–ôʇ^’ HÂ’€—H4�éÖ€�˝^x` ­ �~`ZzH XĆKŇXʵ�A°áI$�€„‡ 1¤üŻ…–~„5��$ŕIŔ’° iýă‡ÖÂX$A’ Ą!@zĐ ‡0`üżĆxi@€�c @�I–Ľ ¬iüŔKC$K‚$I‚€!�€0�@ čők`@ĐĆĐzŚ5 ˇ‡–†IđÂÂÂÂú˝Ť%’-@/ é!@��Hú×�aH0° i,A’€—€— ­˙ńciA a ’´Ć �† 1�Că˝đĆ  hhH‚$ -ičI‚^řÇCż�ICK€–€°„!Ť±�=č! �Âř×Ň˙˝ CCzHҤ±áĽ ëCz ÂZC’ �XC€đż’0Ö„!€0H´†–ĆŇ‚đ‚$áő?Zݎ±A ÖXĐ Â ``a@Đż„!ŚĐ °čAZXŔKôŹ_’€IŔ ‚¤!�Đ��€�=đż hCĐC�ÖXX/ xKX^Ň˙xč—ĆZ�ÖÂX’Ć’�H `H aükéĆ‚�ĐC’Ć„…%@/z`I€IiŤ%�Ňc,Ť! ��hüza@Ck��^€ĆK^–¤ńÂúÇC/ Ľ ` ‚–ĆÂ0–đ�` �Ň^ Ň h�Ň H– hi,IĐÂú<–$’ ¬…ń�é54 @cHcŤ˙ő�†h@� ’, ’°°„%čCZŔ‚ ’°-@‚�Đ�4€ˇ_˙‚ �Xc`a,aAĐ Đ‚$,IřńĐKđ– á…-€��€� @xŕ˙őCݎ‡4Ö€€!@¬ˇˇ×$H ‚´ ő?^’€Ic K„ `,�††0 �ż^ŔC‚�@C�4 ,ičH ĐđÖ?ţ±^ë!aAŔ/@Z€–0 @z@ĐĐĐĐŔż^x�KA�č!a XXŔÂÂ~AX^Źč%@– H Đ‚�A �� `üŻ×c iXcHXđ‚4– aIôăˇ%HC X° Ľ ¤ÇX� ahüë… -<$ Âa X‚$A ’ôř_Ұ ,hAxaAci i@xż^�† A  †–€%`-ŕĄ˙ńXK�^Â/`aaAK° €44°�Aż� I,`` @c ` ^¤ ˝ ´ ,IĐ‚�A‚Ć4††ÖK? Ŕ€� @C-ŚĄA/Kié!I€–�˝ôX°ĆX€4�€0ţő†� C�¤ ˝0–°°°°°Ixé˙dž^�^Â/@ ‚^� C€��Ż_ú˙ükŤ‡¤, A‚ A‚„%ŕ%ŕ%<†–†€% -Ť%A/� € �ĆđĆ˙� ’~@� !`AŔ$A’„Ö˙xé!IŔ°Ö´ ô†04`@x˝0�i4†„µ†°°€—�˝ AKú˙1ÖŇC K´4$ ‚XŔ0 �ţ_Ż1°�H‚h@^€đ X^^ÂÂúCK°H ĐŇĐ‚ 4 �€ř×/üŔ‚†�AŔÂŇ-@’Ľ„…Ą-A´ haAÂKŔXzô€� á×€�i@€0 h xAĐŇĐ ’°„%,ýă±´€H-AĐk i@z`a@CŔ~ükC€4 �Ň�°4$A$I‚–„×?z K°°I �¤‡†4†� �Đ˙úőŔXC€4�HCŔ’�˝�Ľ¤ˇ˝đ? -‚-`-@ ¤€đzI ~Ŕa -H$ /čńC/’€%ŤÖX †Ö‚�Ś5 ˙z @C hh` CđŇX‚$,,/é˙ńX/ĐÂX‚° ôCІ ˇaCř—ô ¤Đ /@Z %ŕ×?–ÂKŹ…Ľ�i/H ! a¬ˇ Cřµ0� zH Axa Đ Đ‚$écI hZ¤±‚�@€đř_ €± 1�@�¤,H‚–Ć’ —ţÇă%AX€$H‚°ÖŔŇ zhCCă_Ż14„±0 ŕA–€×’°­?¤—$AŇĐ ÂŇxi„!ah@ĐĐŻ…‡ @�¤‡�@�$aaA’ -H’$ýř±–$Ś% Xkhi, � i�Đ�4Ćż^ă!H@XxHÂ’†– a x x ?†– ,`a/ -A CĐ‚đ0 =�üżô€ô¤¬@CŔĐ–€%HÖĐ$Ľ~<đKCX’ ´0 @� řőëă%=AŇÖ€$H–†´4´„/=°¤!A‚ -H„!éé! @ÂřőÂřÇzé!aHC� €^ °IĐ‚đúńXZC– H$A�$ HCëˇ! üëˇ5`aô¤ÂÂX /` ’„ĄCK° ’-Ť44 `Hx�^/ŚÇZk�ŇC� hhaKŔ’ĆZ°¤Ś%A$ X°é!C�„Ç€4~˝đ€@�Đ$ Z^ÖŇXú1𒆼€a ’ i�†ô€� ¬‡^/<HCc aH‚xiH‚ Iđţ1–Ö$KKX‚„…!`á!CŔz�Âk€†4��h@ÂŇXXKXKX‚ôă‡^$H´4– A� `HHhh@xüŻ_ăhÂ�C^€° KX–ĆŹ±$’ Ľ h xA�†ô0= h@˙0°�` @� ’ …Ą±„% ŇăZKC^XCݱ° ë!@Cú!��`üŻ_˙é…‡ @C‚‚z hi/H$,Aʵ�­%KŔ’†^‚Ö� @CëÇŻ†H†°đč!`AC ‚$ŕ%HĐôă±´0–€%` ’ € 0¤‡†ôZú C�€0aI^XĐ$-/ýʇ~ €–^‚ - - �4°Ć€±�˝�cA4 !�zA°, ’$ýřˇ—Ť%Hđ‚$ h@� @˙z=K4 `H�ÖÂxaAô´Ľô˙zih ’ aA `hCCĐ�„‡đŻcA� ¬Hai, XX‚°I’ţŹ— , -Ki@z@ĐÖŇř˝đÂXXxH/@xAz¬%‚^Ŕ‚„ő˙�Ö‚ ż ŕ$hŇ���k�°^ 4ý AŇ$xIŔ’„őŹ!-„$, ZŇ † ‡0¤1°đĐřׯ1°đĐk�XŔXaA ‹ Ľ4ŕEŤ ҰhaA$h4¤¤¤ĐŻ…˙z �4$ z@zHXC–€%hAú1đ˙Oř-HCK€$I€�X ë H�h�4€IŔ’Ć’$H ë/ a X° IĐ‚4 = č!�C�€ýz=��k`,`¬ Z^Đ‚$I˙x¬%HC$Ak,h�44 `ĐC€đë…€…i�‚‚†^CxZ /`I‚ôřˇ×^�ô’°€�€4�H˙zá1–† ‚4$aŇ$IĐ‚ôxŕ—�IcIŔ XkhIC€4€5†„éŻ CŇ, Ŕ4$H‚-HX’ µţŹő‚€…5´4¤ - €…0 ŕőzCi`A€—€$,AŇú˙1¤%@´Ć´�AŇŔ ‡€!�ă˙ő ? �CŔX’ Ąˇ%H‚– -Ꮧְ€%H´4–0€€!<ţ˝‚4�i�€ôXX’ÖŔKŔ’ ……ő˙zi,´ ,Ť— �Â�Ś…ˇˇ Ť˝0 @Â4@‚†^zA$H–ô˙Xzż�A’€% xi,Ť!cC� a@ż~ŤŇĐŔ€ô€€č…ń‚$ŕ-@/ ŤţĄ‡A ‚$/��¬ k@ýZŔŔ@z`a@ÂCK¤H’ IÂŇ˙ř%‚„­!- -�CX€†0 ż^x` Ň€†�=@X€–�IX‚¤I˙Ň €-H’°i@�4†„1Ö� đ˙Za€��0´4–Öđ$Ľ -ü㡗4„ĄˇĄÇ’4^x†44=„!á! ý˙Ň� A?$= @°4–†´ hA’ Ś%i/`aK$�‚@‚€€˙×ÂA€� €H’,,IcI ’ţńăµÖŔ Ą!-Ť…°�@C€��Ň€~-=KCĐ€ ‡�Ś5 h’Ć’a zá˙1^ ‚¤ˇI$, HH‚ô 1ţ×/üKŇ <�@Ŕ˝–° KŔ?¤µ´0– ’ �°đ�ĐCřőÂÖ€4 ! h@K‚-H‚–†–ýx赆°€%@ݎč5@zhH züë×C4¤,<$ A°Ö^Ŕ„%HX˙ŇŇ„ń¤…±$ Aݰ€!h` řµ`�€ �,éńđŇcIC/h, ˙€´�aAZ A aŤ±�H ‡đżÖÂ4 @�„!ZCxé±$ŕA ‚Ö?ř˙w„Ŕ/@XŔ’† �Ň�a¤ÇżÖ€† @€†� a,`KŔ°¬5$éÇă_z° A’ Ľ� a ¬‡ AÂŔż0´0 ,�€� @^€iZ˝†?Ö I-@ÂĆ‚XXxHŔ€~-< i `,@’ Ľ€%@/@’¤ ­×�– ¬±„5–° i@Ň€�Ŕ~˝đZ†„×�¤‡$h$,ŕa ?Ćk HX€°H zH�¤Aë%< h�AiHcAZ€$HŇX‚ĆŔ ‚ AÂK^€@€4€5�Ŕă×ŇX€Ć4†4  ‚4¤5-hh釄! ‚ AH°ô„±�ôx˝ @ÂĐ„!, ,X†A„‡^C €Â €„!Ak=4–�,� ‚4ř˙APETAGEXĐ��g��������� �������� �������Album�TestAlbum �������Artist�TestArtist �������Title�TestTitleAPETAGEXĐ��g���������€��������TAGTestTitle���������������������TestArtist��������������������TestAlbum�������������������������������������������������������˙�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/test.it��������������������������������������������������������������������0000664�0000000�0000000�00000001204�14447736377�0016452�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������IMPMtest song name����������������� ��€0}€�������Ndä @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@˙˙ô���D��”��ä��4�������×>Y ĺ��×>é"3 ��×>ďşë��IMPS�������������@�@This is a sample name.������������������« ����������„������IMPS�������������@�@In module file formats������������������« ����������„������IMPS�������������@�@sample names are abused�����������������« ����������„������IMPS�������������@�@as multiline comments.������������������« ����������„������IMPS�������������@�@ ���������������������������������������« ����������„��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/test.mod�������������������������������������������������������������������0000664�0000000�0000000�00000006074�14447736377�0016627�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������title of song�������Instrument names���������@���are abused as������������@���comments in��������������@���module file formats.�����@���-+-+-+-+-+-+-+-+-+-+-+���@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@����������������������������@�����������������������������������������������������������������������������������������������������������������������������������8CHN����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/test.ogg�������������������������������������������������������������������0000664�0000000�0000000�00000010470�14447736377�0016617�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������OggS���������¶Űż;����Zëfvorbis����D¬������€µ�����¸OggS����������¶Űż;���9<ač}˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙vorbis���Xiph.Org libVorbis I 20050304������unicodetag=öäüoΣø���unusualtag=usual value���unusualtag=another valuevorbis%BCV�@��$s*FĄs„BPăBÎkěBL‚2L[Ë%s!¤ B[(ĐU��@��‡Ax„ŠA!„%=X’'=!„9x„iA!„B!„B!„E9h’'A„ă08 ĺ8ř„E9X'Ač „B¸š¬9!„$5HP9č„Â,(Š‚Ä0¸„5(Ś‚ä0ČÔ BšI5ř„gAx„iA!„$AHAČ„FAX’9¸„ËA¨„*9„ 4d��� ˘(Š˘( ˛ �Č��@QÇqÉ‘ɱ  Y����� HФHŽäH’$Y’%Y’%Y’扪,˲,˲,Ë2˛ �H��PQ Eq Y�d�� 8ŠĄXŠĄhŠçŽ„†¬�€����4CS<G”DĎTU×¶m۶m۶m۶m۶m[–e Y�@��Ňif©0BCV���€Š0Ä€ĐU��@��€J˘ ­9ßśă YšJ±9śHµy’›Šą9çśsÎÉćś1Î9眢śY š ­9çśÄ Y š ­9çś'±yĐš*­9çśqÎé`śĆ9çś&­yšŤµ9çś­iŽšK±9çśHąyR›Kµ9çśsÎ9çśsÎ9çśęĹéśÎ9眨˝ą–›ĐĹ9çśOĆéŢśÎ9çśsÎ9çśsÎ9çś 4d���@†ŤaÜ)Ňçh Fb2éA÷č0 śBęŃčh¤”:%•qRJ' Y���@!…RH!…RH!…b!†rĘ)§ ‚J*©¨˘Ś2Ë,łĚ2Ë,łĚ:쬳; 1ÄC+­ÄRSm5ÖXkî9çš´VZk­µRJ)Ą”R BCV� ��BdQH!…b)§śr *¨€ĐU�� �€����OňŃŃŃŃŃńĎ%Q%Q-Ó25ÓSEUue×–uY·}[Ř…]÷}Ý÷}ÝřuaX–eY–eY–eY–eY–eY– 4d���� „BH!…RH)ĆsĚ9č$” Y������pGqÉ‘I˛$KŇ$ÍŇ,Oó4O=QEÓ4UŃ]Q7mQ6eÓ5]S6]UVmW–m[¶uŰ—eŰ÷}ß÷}ß÷}ß÷}ß÷}]BCV���:’#)’")’ă8Ž$I@hČ*�@�@��Šâ(Žă8’$I’%i’gy–¨™šé™ž*Ş@hČ*���@������ЦxŠ©xЍxŽč’h™–¨©š+ʦ캮뺮뺮뺮뺮뺮뺮뺮뺮뺮뺮뺮 „†¬�$��t$Gr$GR$ER$Gr€ĐU�€ �€��Ă1$Er,ËŇ4Oó4O=Ń=ÓSEWtĐU�� �€������ ɰËŃM%ŐR-US-ŐREŐSUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUMÓ4M Y ��S--Ćš ‹$bŇj« c R쥱H*gµ·Ę1…µ^‡”Q{©$cŠAĚ-¤Đ)&­ÖTB…¤c*RR 4d…�šŕp@˛,@˛,�������4 Đ<°4�������$M,O4Ď�������������������������������������������������������������������@Ň4@ó<@ó<�������Đ<đ<đD�������,Ď4Ń<Q�������������������������������������������������������������������@Ň4@ó<@ó<�������°<đDĐ<�������,Ď<Q<Ń����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ŕ��`!˛"��pH$ ’ÍH–M¦Á4’eAÓ i0M����������$M¦AÓ Š�IÓ iĐ4"����������’¦AÓ iE€¤iĐ4hD����������Ď4!ŠE&Ŕ3M"D¦ ������������������������p��0ˇ ˛"��p8Še�€ă8–��ŽăX��X–%Š��`Yš(������������������������������������������������������������������p��0ˇ ˛��p(ŠeDZ,ŕ8–$ɲ�–Đ<€¦D���(p��°ASbq€BCV�Q��ű,ME’¤iš'Š$IÓ<OišçyžiÂó<Ď4!Š˘hšEQ4M¦iŞ*0MU��Pŕ��`¦Äâ�…†¬�B�ŠbYšćyž'Ц©š$IÓ<OEŃ4MSUI’¦yž(Š˘iš¦Ş˛,Mó<QEÓTUU…¦yž(Š˘iŞŞęÂó<OEŃ4UŐuáyž'Š˘hšŞęşEQ4MÓTMUu] ЦišŞŞŞ® DOMSU]×u牢iŞŞ«ş.MÓTUUu]Y¦iŞŞëĘ2@UUŐu]W–ŞŞŞ®ëş˛ PU×u]Y–e�®ëş˛,Ë����Ś “Ś*‹°Ń„ @ˇ!+€(��Ŕ¦SĘ0&!¤Ć$„B&%ĄŇRŞ ¤RR)„TJ*%Ł”Rj)UR)©” B*%•R��Ř�Ř…PhČJ� �€0F)ĆsN"¤cÎ9'RŠ1çś“J1ćśsÎI)sĚ9礔Î9çśsRJćśsÎ9)ĄsÎ9çś”RJçśsNJ)%„ÎA'Ą”Ň9çś��Tŕ��`ŁČć#A…†¬�R� ŽcYšćy˘hš–$išçyž(š¦&Išćyž'ŠŞÉó<OEŃ4U•çyž(Š˘iŞ*×EÓ4MUU]˛,ЦišŞęş0MÓTU×u]¦iŞŞëş.l[UUŐue¶­ŞŞęş˛ \×ueŮ–,»®ěÚ˛��đ� VG8) ,4d%��@B!eB !„”R ��p��0ˇ ˛�H��ڱÖZk­µÖ@g­µÖZk­€ĚZk­µÖZk­µÖZk­µÖRk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk­µÖZk-Ą”RJ)Ą”RJ)Ą”RJ)Ą”RJ�úU8�ř?ذ:ÂIŃX`ˇ!+€p��ŔĄs B)ĄT1ćśtTZ‹±B1ç$¤ÔZlĹsÎA(!•Öb,žsB))ĹVcQ)„RRJ-¶X‹JˇŁ’RJ­ŐXŚ1©¤ÖZ‹­ĆbŚI)´ÔZ‹1#lM©µŘj«±ck*-´cŚĹ_dl-¦Új Ć#[,-ŐZk0ĆÝ[‹Ą¶š‹1>řÚR,1Ö\��w�D‚Ť3¬$ťŽ˛� � RŠ1ĆsÎ9ç¤RŚ9ćśsBˇTŠ1ĆśsB!”Ś1ćśsB!„RJĆśsB!„RęśsB!„J)ťsB!„B)ĄB!„J(Ą¤B!„B©¤”B!„RB(!•”R!„B)%¤”R !„RBˇ„”RJ)…BĄ”’RJ)ĄJ %„R))ĄJ!”RJJ)ĄTJ ˇ„J)%Ą”RJ!„J)��8��A'UaŁ €BCV�d��˘”R)-E‚"Ą¤KFsPZЍr RÍ©RÎ ć$–1„”“T2ćB BęuL)-•BƤŘrKˇs���A�€€��3�Ŕŕ�ástG�€ DfDĂBpxP S@b‚B.�TX\¤]\@—.čâ®!!A, €śpĂox NĐ)*u ����� �đ��\�ŃĚadhlptx|€„Ś������|��$%@DD4s !"#$�€����� €���������OggS�Ŕz�����¶Űż;���fŻ}[ˇ� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/test.s3m�������������������������������������������������������������������0000664�0000000�0000000�00000001040�14447736377�0016536�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������test song name��������������������� �SCRM@}0ü�����������     ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ ���������������������������������������€€����������������������������@���« ��������������This is an instrument name.���������������������������������@���« ��������������Module file formats�����������������������������������������@���« ��������������abuse instrument names��������������������������������������@���« ��������������as multiline comments.��������������������������������������@���« �������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/test.xm��������������������������������������������������������������������0000664�0000000�0000000�00000012537�14447736377�0016475�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Extended Module: title of song�������MilkyTracker �������€���}����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����@��€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€��Instrument names��������(�����������������������������������������������������������������������������������������������������@� �@������������������������������������������� � � ���������������������������������������������������˙����������������������������������@��€��Sample����������������������������@��€��names�������������������are abused as�����������(�����������������������������������������������������������������������������������������������������@� �@������������������������������������������� � � ���������������������������������������������������˙����������������������������������@��€��are sometimes�����������comments in�������������(�����������������������������������������������������������������������������������������������������@� �@������������������������������������������� � � ���������������������������������������������������˙����������������������������������@��€��also abused as��������������������@��€��comments.����������������module file formats.��������-+-+-+-+-+-+-+-+-+-+-+��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/toc_many_children.mp3������������������������������������������������������0000664�0000000�0000000�00000026405�14447736377�0021251�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����K$CTOC�� :��toc��chapter0�chapter1�chapter2�chapter3�chapter4�chapter5�chapter6�chapter7�chapter8�chapter9�chapter10�chapter11�chapter12�chapter13�chapter14�chapter15�chapter16�chapter17�chapter18�chapter19�chapter20�chapter21�chapter22�chapter23�chapter24�chapter25�chapter26�chapter27�chapter28�chapter29�chapter30�chapter31�chapter32�chapter33�chapter34�chapter35�chapter36�chapter37�chapter38�chapter39�chapter40�chapter41�chapter42�chapter43�chapter44�chapter45�chapter46�chapter47�chapter48�chapter49�chapter50�chapter51�chapter52�chapter53�chapter54�chapter55�chapter56�chapter57�chapter58�chapter59�chapter60�chapter61�chapter62�chapter63�chapter64�chapter65�chapter66�chapter67�chapter68�chapter69�chapter70�chapter71�chapter72�chapter73�chapter74�chapter75�chapter76�chapter77�chapter78�chapter79�chapter80�chapter81�chapter82�chapter83�chapter84�chapter85�chapter86�chapter87�chapter88�chapter89�chapter90�chapter91�chapter92�chapter93�chapter94�chapter95�chapter96�chapter97�chapter98�chapter99�chapter100�chapter101�chapter102�chapter103�chapter104�chapter105�chapter106�chapter107�chapter108�chapter109�chapter110�chapter111�chapter112�chapter113�chapter114�chapter115�chapter116�chapter117�chapter118�chapter119�chapter120�chapter121�chapter122�chapter123�chapter124�chapter125�chapter126�chapter127�chapter128�TIT2��� ��toplevel tocCHAP���,��chapter0����d���d˙˙˙˙˙˙˙˙TIT2��� ��Marker 1CHAP���,��chapter1����Č���Č˙˙˙˙˙˙˙˙TIT2��� ��Marker 2CHAP���,��chapter2���,��,˙˙˙˙˙˙˙˙TIT2��� ��Marker 3CHAP���,��chapter3�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 4CHAP���,��chapter4���ô��ô˙˙˙˙˙˙˙˙TIT2��� ��Marker 5CHAP���,��chapter5���X��X˙˙˙˙˙˙˙˙TIT2��� ��Marker 6CHAP���,��chapter6���Ľ��Ľ˙˙˙˙˙˙˙˙TIT2��� ��Marker 7CHAP���,��chapter7��� �� ˙˙˙˙˙˙˙˙TIT2��� ��Marker 8CHAP���,��chapter8���„��„˙˙˙˙˙˙˙˙TIT2��� ��Marker 9CHAP���-��chapter9���č��č˙˙˙˙˙˙˙˙TIT2��� ��Marker 10CHAP���.��chapter10���L��L˙˙˙˙˙˙˙˙TIT2��� ��Marker 11CHAP���.��chapter11���°��°˙˙˙˙˙˙˙˙TIT2��� ��Marker 12CHAP���.��chapter12�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 13CHAP���.��chapter13���x��x˙˙˙˙˙˙˙˙TIT2��� ��Marker 14CHAP���.��chapter14���Ü��Ü˙˙˙˙˙˙˙˙TIT2��� ��Marker 15CHAP���.��chapter15���@��@˙˙˙˙˙˙˙˙TIT2��� ��Marker 16CHAP���.��chapter16���¤��¤˙˙˙˙˙˙˙˙TIT2��� ��Marker 17CHAP���.��chapter17�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 18CHAP���.��chapter18���l��l˙˙˙˙˙˙˙˙TIT2��� ��Marker 19CHAP���.��chapter19���Đ��Đ˙˙˙˙˙˙˙˙TIT2��� ��Marker 20CHAP���.��chapter20���4��4˙˙˙˙˙˙˙˙TIT2��� ��Marker 21CHAP���.��chapter21�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 22CHAP���.��chapter22���ü��ü˙˙˙˙˙˙˙˙TIT2��� ��Marker 23CHAP���.��chapter23��� `�� `˙˙˙˙˙˙˙˙TIT2��� ��Marker 24CHAP���.��chapter24��� Ä�� Ä˙˙˙˙˙˙˙˙TIT2��� ��Marker 25CHAP���.��chapter25��� (�� (˙˙˙˙˙˙˙˙TIT2��� ��Marker 26CHAP���.��chapter26��� Ś�� Ś˙˙˙˙˙˙˙˙TIT2��� ��Marker 27CHAP���.��chapter27��� đ�� đ˙˙˙˙˙˙˙˙TIT2��� ��Marker 28CHAP���.��chapter28��� T�� T˙˙˙˙˙˙˙˙TIT2��� ��Marker 29CHAP���.��chapter29��� ¸�� ¸˙˙˙˙˙˙˙˙TIT2��� ��Marker 30CHAP���.��chapter30��� �� ˙˙˙˙˙˙˙˙TIT2��� ��Marker 31CHAP���.��chapter31��� €�� €˙˙˙˙˙˙˙˙TIT2��� ��Marker 32CHAP���.��chapter32��� ä�� ä˙˙˙˙˙˙˙˙TIT2��� ��Marker 33CHAP���.��chapter33��� H�� H˙˙˙˙˙˙˙˙TIT2��� ��Marker 34CHAP���.��chapter34��� ¬�� ¬˙˙˙˙˙˙˙˙TIT2��� ��Marker 35CHAP���.��chapter35�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 36CHAP���.��chapter36���t��t˙˙˙˙˙˙˙˙TIT2��� ��Marker 37CHAP���.��chapter37���Ř��Ř˙˙˙˙˙˙˙˙TIT2��� ��Marker 38CHAP���.��chapter38���<��<˙˙˙˙˙˙˙˙TIT2��� ��Marker 39CHAP���.��chapter39��� �� ˙˙˙˙˙˙˙˙TIT2��� ��Marker 40CHAP���.��chapter40�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 41CHAP���.��chapter41���h��h˙˙˙˙˙˙˙˙TIT2��� ��Marker 42CHAP���.��chapter42���Ě��Ě˙˙˙˙˙˙˙˙TIT2��� ��Marker 43CHAP���.��chapter43���0��0˙˙˙˙˙˙˙˙TIT2��� ��Marker 44CHAP���.��chapter44���”��”˙˙˙˙˙˙˙˙TIT2��� ��Marker 45CHAP���.��chapter45���ř��ř˙˙˙˙˙˙˙˙TIT2��� ��Marker 46CHAP���.��chapter46���\��\˙˙˙˙˙˙˙˙TIT2��� ��Marker 47CHAP���.��chapter47���Ŕ��Ŕ˙˙˙˙˙˙˙˙TIT2��� ��Marker 48CHAP���.��chapter48���$��$˙˙˙˙˙˙˙˙TIT2��� ��Marker 49CHAP���.��chapter49�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 50CHAP���.��chapter50���ě��ě˙˙˙˙˙˙˙˙TIT2��� ��Marker 51CHAP���.��chapter51���P��P˙˙˙˙˙˙˙˙TIT2��� ��Marker 52CHAP���.��chapter52���´��´˙˙˙˙˙˙˙˙TIT2��� ��Marker 53CHAP���.��chapter53�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 54CHAP���.��chapter54���|��|˙˙˙˙˙˙˙˙TIT2��� ��Marker 55CHAP���.��chapter55���ŕ��ŕ˙˙˙˙˙˙˙˙TIT2��� ��Marker 56CHAP���.��chapter56���D��D˙˙˙˙˙˙˙˙TIT2��� ��Marker 57CHAP���.��chapter57���¨��¨˙˙˙˙˙˙˙˙TIT2��� ��Marker 58CHAP���.��chapter58��� �� ˙˙˙˙˙˙˙˙TIT2��� ��Marker 59CHAP���.��chapter59���p��p˙˙˙˙˙˙˙˙TIT2��� ��Marker 60CHAP���.��chapter60���Ô��Ô˙˙˙˙˙˙˙˙TIT2��� ��Marker 61CHAP���.��chapter61���8��8˙˙˙˙˙˙˙˙TIT2��� ��Marker 62CHAP���.��chapter62���ś��ś˙˙˙˙˙˙˙˙TIT2��� ��Marker 63CHAP���.��chapter63�������˙˙˙˙˙˙˙˙TIT2��� ��Marker 64CHAP���.��chapter64���d��d˙˙˙˙˙˙˙˙TIT2��� ��Marker 65CHAP���.��chapter65���Č��Č˙˙˙˙˙˙˙˙TIT2��� ��Marker 66CHAP���.��chapter66���,��,˙˙˙˙˙˙˙˙TIT2��� ��Marker 67CHAP���.��chapter67�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 68CHAP���.��chapter68���ô��ô˙˙˙˙˙˙˙˙TIT2��� ��Marker 69CHAP���.��chapter69���X��X˙˙˙˙˙˙˙˙TIT2��� ��Marker 70CHAP���.��chapter70���Ľ��Ľ˙˙˙˙˙˙˙˙TIT2��� ��Marker 71CHAP���.��chapter71��� �� ˙˙˙˙˙˙˙˙TIT2��� ��Marker 72CHAP���.��chapter72���„��„˙˙˙˙˙˙˙˙TIT2��� ��Marker 73CHAP���.��chapter73���č��č˙˙˙˙˙˙˙˙TIT2��� ��Marker 74CHAP���.��chapter74���L��L˙˙˙˙˙˙˙˙TIT2��� ��Marker 75CHAP���.��chapter75���°��°˙˙˙˙˙˙˙˙TIT2��� ��Marker 76CHAP���.��chapter76�����˙˙˙˙˙˙˙˙TIT2��� ��Marker 77CHAP���.��chapter77���x��x˙˙˙˙˙˙˙˙TIT2��� ��Marker 78CHAP���.��chapter78���Ü��Ü˙˙˙˙˙˙˙˙TIT2��� ��Marker 79CHAP���.��chapter79���@��@˙˙˙˙˙˙˙˙TIT2��� ��Marker 80CHAP���.��chapter80���¤��¤˙˙˙˙˙˙˙˙TIT2��� ��Marker 81CHAP���.��chapter81��� �� ˙˙˙˙˙˙˙˙TIT2��� ��Marker 82CHAP���.��chapter82��� l�� l˙˙˙˙˙˙˙˙TIT2��� ��Marker 83CHAP���.��chapter83��� Đ�� Đ˙˙˙˙˙˙˙˙TIT2��� ��Marker 84CHAP���.��chapter84���!4��!4˙˙˙˙˙˙˙˙TIT2��� ��Marker 85CHAP���.��chapter85���!��!˙˙˙˙˙˙˙˙TIT2��� ��Marker 86CHAP���.��chapter86���!ü��!ü˙˙˙˙˙˙˙˙TIT2��� ��Marker 87CHAP���.��chapter87���"`��"`˙˙˙˙˙˙˙˙TIT2��� ��Marker 88CHAP���.��chapter88���"Ä��"Ä˙˙˙˙˙˙˙˙TIT2��� ��Marker 89CHAP���.��chapter89���#(��#(˙˙˙˙˙˙˙˙TIT2��� ��Marker 90CHAP���.��chapter90���#Ś��#Ś˙˙˙˙˙˙˙˙TIT2��� ��Marker 91CHAP���.��chapter91���#đ��#đ˙˙˙˙˙˙˙˙TIT2��� ��Marker 92CHAP���.��chapter92���$T��$T˙˙˙˙˙˙˙˙TIT2��� ��Marker 93CHAP���.��chapter93���$¸��$¸˙˙˙˙˙˙˙˙TIT2��� ��Marker 94CHAP���.��chapter94���%��%˙˙˙˙˙˙˙˙TIT2��� ��Marker 95CHAP���.��chapter95���%€��%€˙˙˙˙˙˙˙˙TIT2��� ��Marker 96CHAP���.��chapter96���%ä��%ä˙˙˙˙˙˙˙˙TIT2��� ��Marker 97CHAP���.��chapter97���&H��&H˙˙˙˙˙˙˙˙TIT2��� ��Marker 98CHAP���.��chapter98���&¬��&¬˙˙˙˙˙˙˙˙TIT2��� ��Marker 99CHAP���/��chapter99���'��'˙˙˙˙˙˙˙˙TIT2��� ��Marker 100CHAP���0��chapter100���'t��'t˙˙˙˙˙˙˙˙TIT2��� ��Marker 101CHAP���0��chapter101���'Ř��'Ř˙˙˙˙˙˙˙˙TIT2��� ��Marker 102CHAP���0��chapter102���(<��(<˙˙˙˙˙˙˙˙TIT2��� ��Marker 103CHAP���0��chapter103���( ��( ˙˙˙˙˙˙˙˙TIT2��� ��Marker 104CHAP���0��chapter104���)��)˙˙˙˙˙˙˙˙TIT2��� ��Marker 105CHAP���0��chapter105���)h��)h˙˙˙˙˙˙˙˙TIT2��� ��Marker 106CHAP���0��chapter106���)Ě��)Ě˙˙˙˙˙˙˙˙TIT2��� ��Marker 107CHAP���0��chapter107���*0��*0˙˙˙˙˙˙˙˙TIT2��� ��Marker 108CHAP���0��chapter108���*”��*”˙˙˙˙˙˙˙˙TIT2��� ��Marker 109CHAP���0��chapter109���*ř��*ř˙˙˙˙˙˙˙˙TIT2��� ��Marker 110CHAP���0��chapter110���+\��+\˙˙˙˙˙˙˙˙TIT2��� ��Marker 111CHAP���0��chapter111���+Ŕ��+Ŕ˙˙˙˙˙˙˙˙TIT2��� ��Marker 112CHAP���0��chapter112���,$��,$˙˙˙˙˙˙˙˙TIT2��� ��Marker 113CHAP���0��chapter113���,��,˙˙˙˙˙˙˙˙TIT2��� ��Marker 114CHAP���0��chapter114���,ě��,ě˙˙˙˙˙˙˙˙TIT2��� ��Marker 115CHAP���0��chapter115���-P��-P˙˙˙˙˙˙˙˙TIT2��� ��Marker 116CHAP���0��chapter116���-´��-´˙˙˙˙˙˙˙˙TIT2��� ��Marker 117CHAP���0��chapter117���.��.˙˙˙˙˙˙˙˙TIT2��� ��Marker 118CHAP���0��chapter118���.|��.|˙˙˙˙˙˙˙˙TIT2��� ��Marker 119CHAP���0��chapter119���.ŕ��.ŕ˙˙˙˙˙˙˙˙TIT2��� ��Marker 120CHAP���0��chapter120���/D��/D˙˙˙˙˙˙˙˙TIT2��� ��Marker 121CHAP���0��chapter121���/¨��/¨˙˙˙˙˙˙˙˙TIT2��� ��Marker 122CHAP���0��chapter122���0 ��0 ˙˙˙˙˙˙˙˙TIT2��� ��Marker 123CHAP���0��chapter123���0p��0p˙˙˙˙˙˙˙˙TIT2��� ��Marker 124CHAP���0��chapter124���0Ô��0Ô˙˙˙˙˙˙˙˙TIT2��� ��Marker 125CHAP���0��chapter125���18��18˙˙˙˙˙˙˙˙TIT2��� ��Marker 126CHAP���0��chapter126���1ś��1ś˙˙˙˙˙˙˙˙TIT2��� ��Marker 127CHAP���0��chapter127���2���2�˙˙˙˙˙˙˙˙TIT2��� ��Marker 128CHAP���0��chapter128���2d��2d˙˙˙˙˙˙˙˙TIT2��� ��Marker 129����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙ű°Ä�����������������Info�����ô�Ęď� !$&),.1369;>@CEHJLORTXZ\_bdfilnqsux{}†ŠŤ’•—™śźˇ¤¦¨¬Ż±´¶¸»ľŔĂĹČĘĚĎŇÔŘÚÜßâäçéëîńóöřúý���:LAME3.98rÍ��������4Ŕ$LA��Ŕ�ĘďúČ}W�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙ű°Ä�Ŕ�¤��� ��4€��LAME3.98.2UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULAME3.98.2UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU˙ű˛ÄŘŔ�¤��� ��4€��UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUULAME3.98.2UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/uint8we.wav����������������������������������������������������������������0000664�0000000�0000000�00000134210�14447736377�0017263�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFF€¸��WAVEfmt (���ţ˙�@��€>���������������€��Ş�8›qdataŠ·��€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€†€†€|€‡€‚€|€y€i€€r€€€v€€€€Ś€z€{€†€‹€Ź€Ť€‡€€~€€‰€€€€m€z€€€y€s€|€€}€€„€x€u€v€}€€}€~€€Š€†€p€p€{€‚€†€€‚€|€v€€Ť€»€đ€®€^€U€R€[€^€{€›€„€‰€“€p€_€c€s€•€€€€}€{€€€s€o€‡€Ź€Ź€Ź€€€z€z€}€‡€Š€‰€€‚€€}€r€z€‰€Ť€€{€s€q€q€z€€€…€Š€„€€€~€|€€‚€€€€‚€€{€y€~€~€€Ť€€Ł€§€…€k€_€f€r€t€€„€€„€€€v€w€{€…€Š€€|€x€€‡€€Ť€‹€…€}€t€s€u€~€€€€|€|€€‚€‰€„€‰€…€€€€€or€¨€Đ€±€v€[€e€]€gy€‚€€†€‹€z€g€i€~€Ž€Ś€{€w€€‚€x€x€†€Ž€Ś€†€€y€~€‹€•€“‡€€{n€e€g€y€‡€‹€‰€}€€€€€}€x€‡€‡€su€€€ž€Ă€ą€‹€b€T€ch€j€}€†€‡€‰€~€o€m€w€€‹‚€~€|€€~€y€‰€‹€Ž€’€Ś€z€x€€€{€u€tr€q€€Ź€Š€‡†€…€„€y€x€z€r€‰€ż€Ď€ś€h€^€]€a€dz€„€€€†€t€j€o€~€Ť€†€z€{€€„z€z€€Ź€‰€€‡€Ź€}€€€}€q€q€o€n€€“€€…€‚€‚€‚€w€{€x€}€€¶€Đ€ť€l€[[€a€g€u€„€„€‡€w€lp|€Š€†€y€z‚€€€|€†€Ź€‹Ť€Ž€€€w€y…€x€q€m€q€€Ť€Š€†€€{€|w€€¤€Đ€»€~€\€Z€^€b€n€}€‰€€n€j€u€†€Š€}€v€}€…€€}€€Ś€‘€‘€Ź€€€r€t€€…€~€u€pox€‡€‰€Š€Š€‡€€z€y€~€„€Ş€Ę€µ€~€\€X€`€c€l€}€€…€Š€~€n€k€v„€†€|€x~€…€€|€€Ž€–€—€Š€u€n€v€€€}€vp€r€€†€‰€Ś€Ť€‹€}€w€{€€ś¸€Ă€˘€hWY€]€i€s€~€‡†€„€{€i€m€}€€€{€y€‚€„€€€€™ť€‹€w€k€r€~€‚€€x€r€t€{€‚€€‹€‹€w€}€†›­€Á€°€l€R€Y€Zgq€}€…€€†€€j€i€z€€„€}€w€€†€€€€‰€š€ś€Ś€z€l€m€y€‚€€{€r€u€~€„€€Ś€Ť€€z€€‡€’€Ł€˝€Â€s€S€Z€U€g€n€y€€€†€Ž€n€c€u€~€†€€€u€€€‹€„€„€Ś€•€”€‡€|€q€iy€„€{€s€y€€…€‰€†€‰€‰€€€†€€‡€—€˝€Ë€€T€WR€h€m€r€y€|Š€€t€\€r€€†€€t€}€‹€Š€Ť€Ž‰‰€‚zwk€x€„€€y€y€„€‰€€€€€Ť€‰€‚€†€‰€€Ź€¶Ë€_€[€L€`€p€vqs€‰€ž€|€_€n€z€…€„€w€|€‹€‘€—€Ś~€}€{€€xkv€€‚€€Š…€€ŠŠŠ€‰‰€„z€{Š€¶ł€c€T€^€q€u€o€j€s‘€“€r€it€€€€x€~€€ś€€x€w€}€w€o€w‡€‡„€†€€‡€€€€€€‚€Š€Š€‰€„€z€Ť€ž€€©€ž€j€\Z€b€h€g€s€{z€‡€‰€s€t€}€€€€€~€‹€–€Ž€†€zz€z€x€t€€‡€††€€€€~€€€€‡€‰€Š€€~€€‡€Ť†€Š€«€Łw€k€Z€U€i€xsg€r€Ś€Ť€yxx€z†‹€‡€‡€…€‡†}€y€z€€‚y}€…€€‰€€€„†€}{€€€Ť€Ś€~€€€„€€‘¬€w€`€T€b€o€r€r€l€v€Ť€€y€xx~‰€Ť€Š€„„€€€}€{€|€€€„€‰€†€€†€‡€€€€~€‚€Š€†„€€…€}€zvvš€Ż€—€|€icir€p€df€|€Š€€€}€}€|†~‘†€z€x€z€y}‚€„€€€‡€‰€€€‡€…€„…€€€}€€€…€€€…€…€„‚€†€‹€xja€y€—›ꀋ€[€R€f€s€vw€y€w€}€€Ť€€‡€”€‘„v€khw€Š€‹‚€†€…€}€€†€†€€€€|€‡€†€€†€ŠŠ€€|€~€€€}~€~x€v€xvy†€‘€Ź…€zv€v€w€x€vty€€…„~€†€Ž€†€v€u€z{€}€‚€„‚€€€…€…€…€„€„‡„€€…€€€€†€€‡€€€|€}€€€{€y€}€}|{€z€}~|€|€{€|€‚€†€„€…€……€…€€€~€|€~{€€€{}~€{€{€€€€€~€€€‚„€€†€†€€†…€†€„€€€€~€{{€€}€€€|z€{€€{€~€~€}€€€€€‚€~‚€€€€„„€‚‚€~€‚€€€€‚€}€€€€€}€€€€€~€€€€€€€€‚€„€~€€‚€€€~€€€€~€€~€€~€~}€€€~‚‚~€€}€‚‚€€€€€€€‚€€€€€€€€€€}€€~~€…€€€‚€€€€‚€€}€‚€€~~€€‚€|€€€€€€~€€~€~€}„€€€~„€}€€€€€€€€€€~€}~€‚€€€€€‚‚€~€€~€€€€€€€€€€~‚€€€€‚€€~€‚€€€„~€~€€€}„{€€|€€~€€€€€€~‚€}€€€€€€€€‚€€€‚€€€~€€€€€€‚€€‚~€€‚€~€€€€€~€€€~€‚€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€‚€€€€€~€€‚€}€‚€~€€€€€€€€‚‚€€€€€~€€€€€€€‚€z€~~€~‚~€~‚~€€€‚€€}‚€€€‚€‚€~€€€~€‚€€‚€}€€€~‚€€€€‚€€€€€~€€~€€€‚€~€€€€}€„€€€€€€€€€€€~€€€€€~€€‚€€€€€~€~~€‚€|…~€}€€„€€€€€€€€€€€€€€€€€€~€€~‚€~€€~€€€‚€€€€€€€€€€€€~‚~€}€€€€€€€€~€€€€€€€€€€€€€€€€~€‚€€€€€€~€€~€€€€~€€‚‚€€€€~€€€€€€€€€€€€€€‚€€€€~€€€€‚€~~€€€€€‚~€‚€}€€~€€€~€€~€€€€‚€€€‚€€€€€€€}~€€€€€‚€€€€‚€€€€€€‚€~€€€€‚€€~€€€€„€~€€€€€€€€€‚€€€‚€€€€€~€~€‚€|~€€~€‚|€‚€€€~€€~‚€}€€‚}‚€€€€€~€€‚€}€‚€~~‚€€€~€€€~€‚~€€‚}€€€~‚~€€~€„€€€€€~€€‚€~€€€~€€€~‚~~€€€€€€€€~€€~€‚€€€‚~€€}‚€€‚~}€€€‚~‚€‚~€~‚€~€€‚€}€‚€€}€‚‚€€€€~€€~€€€€€€€€€€‚€€€‚~~€}€~~€{€~€}}€~€}€€‚„€€…€…‚‚‡†‚„‚~~‚|y€xxw~v~x|x}x}|~{€„€„€†€Š€Ś€‹€€Ť€ŠŤŠ€†€y€u€s€l€l€m€k€p€t€v{€~…Ї€ŠŽ‚“‚‘„Ž™„ŚŚ‰“‰„†‡‡y‡uql‚fzkuhrgqrnqlwjn€t†z‡|€‰‹’Ť•Ť‹‹–‡††™„Š€„}‹|}}x‚t†p…f†i†j†b…nn~o||{{{€y…y…x‡y‰{Ś{‘}™~Š€ť‚„‡„ „‡Š‚Žz|sm€e†h‹e`śn˘g“qŚz‚vztj„[‰V‰\Śa”jšoŠt }Ź–¤š†‹“’’y’|‰wjxeqks^vcumva{t‚vŠt…‘€’„–Š”ŽŠ†’{šs‹p›kźi„kĄoŽv†}™€|‚†|‡mi†k…`‚b‚k€`}q|rzpz}|Š„…‹ŽŤ–’˘—­ŤźźŹ“„Źzˇt…i”YŚM~S„\sfpmjsgzaŹfśe eťr–m’z“}Ś|tlnŚr‹u—t”yʎ‹Ť”•–ś’…’—‘‡Ť‰‚tznvmtepdohobrjwo|n{‚z…~…††‚„€ŠŠ}—|“|Ž|ˇ|Ś~•€ś„„…€…„…tq‚p„f‡f‹iŹbšlžm‘n‰{~wx~t„l_‰Y‰\Ša“j”pŚsť}‘‹Ž“ š„•“Ž’}’Śx…q{tthsfvmuavlyo|j…zŚvŤ{Ž„Ź~އމЇ}”zŚy–y™w‡sźtŚw‹z—}|~}rx„m‚ho}e}i~p}h|x}vv‚‚„{„„‡……†Ť…Ź„’Ť‚™Ź›‚„–†‰‰’w–wŤv‡llxowesognblb{drl|qrzy‡‚‚І’ڕޒ‘‘Ž“ŤŤ“†•}‡z•z…x…x„wxwy{so„o†k‡m‡m‰n‹rt…x‚y~}~~‚}y†y‰xŽy‘{Śz—zŽ|Ź}—‡€’~‰~€‡€zxw€opo„i„p…no„w„s{„|{„€€…ŠŠ€’Ś€’€“‹–ЄކŤ††~x|x{rzovquktotpvnwwxtzx}|€z‚…‚†„‰‰‰ŠŠŽ‰Ž”†‹…’„ʉ‚€……‚~y~y~u}o}r~n~l~r~m~tu€u€}€z€€€€‚€Ť‹“ŹŚ“‰Ť‹€†€}€yyq‚q‚q‚l‚p‚o‚p‚v‚sz||€‚€†€‰ŠŤŽ’‹Ž€‰€Ž€…€…‚zzvpr€m€mqm~t~t~u~|}z}‚}„~„~ŠŠŹʀڀ’ŤŽ‚‚‰‚Ť„„|zxq‚q‚n‚kp€l€rtt{~{~~„~„~‰~‹~Ž~~Ś~’~Ť~Ž~~‰~Ž~…€}€zxq‚q‚okplqts‚{‚{€…„€Š‹ŽŤ‘~Ž~ŽŹŠŤ…€€}€z€w€pqnkplqst€{€{‚„~†~‹~Ś~~Ź~Ź~‘~Ť~ŹŽ‹€Ś€‡…‚|‚z‚u‚qplmmm‚r‚q‚vz}€€„€‰‹Ť‘Ž~‘~~Ž~Ź~Ť~‹~‹~†~„~€~{~y~r~pnk€m€lnq‚s‚x‚{‚€„†Š‚Ś‚‚ʒހʀʋچ‚}ztqokll€m€p€q€vz~…‰ŚŹ‘€Ź€’€€Ź‘‹Ť~Š~†~„~~~{~vqol€k€l€kopt‚x‚{‚‚„‚‡‚‹‚Ž‚‘‚‚’’Ź‘€Ž€Ś€Ś€‡…€{wr~p~l~l~k~l}m}p}s~w~{~„†€ŠŽ‘‚‘‚‘‚“Ź‘ŹŤ‚Ť‚‡‚…{€y€r€pnimjnqqwy~€…€‰€Ť€€’€‘“‘‘ŤŤ€€†€‚€|€xsonjkklqqvz}€†€‰€Ž‘’“‚’‚’‚‚ނނ‚†‚{xqp€l€j€kjmo~r~v~y~~~‚~†~Š~Ž‘’”€”€’€”ŹŤ‡†{vpnji€j€j€m€p€s€w€z€€€‡€Ś€€’€“€•€“€”€“€ŹŠ‡„€|€y€s€n€m€hiijooux{‚„‰Ź‘€“€–€•€”–‘‚Ž‚‚‡‚~‚{‚v‚n‚nhhjg€n€o€rxy€~~‡~Ž~‘~’~–—”’€’€‘€€‰€€{wnmjeigkp€o€w€y€}€„€…€Ť€’€‘€–€€“€š€”€‘€”€€Š‚zyn€k€k€c€i€giqnwy|~„~„~Ś’‘–™€“€›€•€’–‹‚‚y‚y‚m‚j‚k‚b‚i‚g‚hqnw€z€{„„Ť~”~~™~™~“~ž~’~”~”‡‹€€€w€xjjj_‚k‚d‚j‚rmzy}…€…€€”€€ť•žŹ™Ź€€‰€{€w€t€f€keakcnq€p€|€y€†Š”‘~~ś~“~ź~”••‰Š€€x€ulfi`‚g‚g‚g‚r‚o‚x‚{‚}‚…‚‚’’•€ť€“€ź—”~™~Š}Ś}}y}v}n}g~i~aeh€f€qpv{‚|‚‚‡‚‘‚’‚”‚ź‚“ź™’€›€Š€Ś€…yvoeibbje€q€q€t€}€{€‚‰‘‘–ž’€ˇ€—€”€›Ť‚x~v~n~eibcjesr€v€~€|Š‚“‚Ź‚š‚ś‚’‚¤‚‘‚—‚—‚…‚Ś‚~vt€k€ej`g~k~h}v}r}y}}}}…}Ź~‘~ʎ’€™˘Š‚ž‚Ś‚†‚Šwus‚e‚g‚i^nh€m€yr~‹”‹šžŚ§€€’€›€€€‹€rula€n€a€f€qgxwx‚~~…~•~ŹŹ¤‹ť€ť€‡€ž‡„†‚s‚r‚q‚c‚i‚j‚a‚q‚l‚q‚|‚w€€‘“‹˘~~”} }‡}™}‹}‚}„~w~p~phe€m€coq‚p‚|‚z‚}‚‚…‚Ź‚“‚ڂꕀś€‰€—€wqoifnep€r€r€|€{€~€‚†Ž€ž€Ť€—€™€—…vqojgngp€s€s€}€|‚‡‚‘‚Ť‚‚ś‚‹‚‚•‚‰‚–„€€w€q€pkgoi~o~u~t~}~}~~‚‡ŹŚŽ€™€‹€“€–“‰‚‚zspoimo€n€w€x€z€€€€‚€„€‰€‹€€Ť€Ź€€€Ž€‰€Ž€€„€€~€x€u€t€ssuuwxz{|~€€‚€€…€†€€Š‹‹Ś‹Š†~|zyx€w€v€v€v€vwxy{}„†‡‰Š‹€‹€‹€Š€‰€‡€…‚€~|{yxw€v€v€v€v€w€x€z€|€~€€€‚€„€†€‡€€Š€Š€ŠŠ‰‡…‚€~€}€{€zx€wv€vvvwxz‚|~€€‚„€†€‡€€‰€Š€Š€Š€‰€‡€…„‚€~}{~zx€w€v}v}v}vw€x€z€|~€€‚„„„†‡‚‚‰„‰„ЂЉ‚‡………„‚€|~{}|{|zxxvwuvwvzv|v~wy€z|†~€‡‚…„„†„‡…‚‰€‰‰‚‡…~„~‚€€}~|}z}y~w~w}v|v}w}x~y{}~€€‚‚„€…†‚‡‚‚„…‡‡‰†Š…Ś„–”†}z|tzuyqxjwew`wbwhxsy}{€}‚~‡€’‚™…“†Ś‡‰‡…‚€z‡t‡p†t…|„‚†~‹|Ž{yŽxŤxŠw†wxzyuzq{n}n~o€s‚w{„†‚†…‡†‡‡‡‡‡…‡†€†€…„‚~}€~~|‚{„z…yx‹xxśx©y z‰{v}t~z€seV„S…W†_†n‡z‡€††…†–…¤„¦„›‚ŹŚ€‰…}~|v{ozhyiysy~yzz{‹|•~šš€—‚Ž„z…v…t†k†c†b†j…t…z„}„€…‚Š€ŤŚ}‡|{{zz}zxzxz|{|…}Š~Ź€¦‚­ź„v…u…u…j…Z…L…M„U„aq‚}‚†‰€ž~¨}¦|—|{„{{~{v{o|m|m}s~}€Ť‹‚‹Ź•„•„„‰…„z„t„onl‚k‚ls€}€‚„~„}†}‡|†|…{‚{{||{|}}~~~€‚…‚‰‚Ť’„š„§„®„ž„…„qor‚g‚VHL€[€hw~~‰}Ś}|›|˘|ź|‘|€}}}~yq€rv~‚…‹ŹŚŠŠŤŽ†‚~‚{‚|}w€r€pru~x~|}}€}€}}„}}€~}~|~~€~€‚‚‚‚„……‰‚š‚¦‚¬ž‡t€o€siYJ~L~]~j~x~~~~‰~Ś~–~ś›‘€‚€€‚u…t†x€€‡€‰‹‚‰‡~ŠŚ€‡€}~‚€~{t€qq€v~x}zz}}~|€|€~‚‚€€~|~‚€„€„€€„‚‚‚‚„€‰€š~§®~ź}‡}t}o|t{i|Y|L}O}a~mw{€…„’š…™†…€†…††…‚„x„v|€}‡{‡z‡x†wv…wxŠy{‚|€~€€{tr†q‡uwŚyŠ}Ś~‹Š€‚‚€‚~~yw€t€ror‚r‚ryy‚|†€Ť•„ˇ†ŻŠ©Š“Ť}‘oŚsŽpŹ`‰S‹L‡[„hq{yyyqs„o‹l—pšo–sŠv{…~†„w†{ŠŹ†Ž„Ź…ŹŹŚ‡‹‰‹Š……€‚y€vrwormsnsowowtzw}z}~€‚„††Š~ŹŤ€“‹‚Ź‹…‚„„€Šx‘tťt­l®k™olqnstvveyYM‚W‚f†m‡v…t‰{ʆڔ“š“Ž‘Ť…„І‰„zyszuli…p‚j‚m‚t‚u‡xŠІ€†‚„‚}‹tsŹsŤv–xŚwŚz‘{†~†€‚~‚vs~sh€m‚m€j€qt‚w{‚€„‰Ž††¨‰˛‹ ‘‹ŤyŽr•|ŠmŤ]ŽS†R…fk}qtqsrp}hmŹl™k—ru‡y…}Ť‹†…~‰x†€‡‰‹’}‹Ž‚”†‰ŠŤŤ†…„€€†|…r‚sxosgvnwlymvsuvyz{~…‚„€†€Š|†‡‚‹‚~‹€Ž‚“‰Ś€Ś€…†€|›r«s­o–h‡nxlzn}sfw[{R~\…l„j†o‰l†s‡€‡†Š“Ź—‹‘ŤŤ’‡Š‹‹Ś…{€~{…tr€o{i|mm„n‰t‡x„{………‡†‰~†v†w‡zŠxŹvŚsŚv’|ŠŠŚ…~€{tr€p€jm‚o„osy~|…‰…”…ŁŻ‡ˇ†Ś†zŤŚr‹\WŚX‰lŚk‡hik||v„rŚq“llŤoŤoŚr‘x‹{€„†‡†‡{‡z…z†‰†Ť„چБ„Ť‚Ť‡‡€||{v~qyqtlrkvo}o}s|x}|~€‡~…€‡‡€…€…‡„Ť‚ŚŠ‚Ť‹–©€¬}–w‡qr‚m‚kfpZpZrexp}efg‡r…€†„‡Ś…„Ś†ŹŚŚŹŠŽŹŽ‰…І‰…z€z~~x€r„q€n‚k†o…p…s‚w|…€€‚€‡~†}†{‡t†t„w…y‹{Ťy‰}Ť€Ź€Š€‰~Š…€€~€z€rqo‚l‚n‚psu‚{ڀꬆž‡‹†††††…q„\Š`ŤeŠoŚgŹa‹hlŠy‡€€…~Ś{ŚtŽo“qŹnŚl†q…sŤu‡z‚€|‚{‡~‡}…†…†„‡Ť‚‹Š…Ź„Ť‚‰€|‰|‚z}v|vwvqyp|p|l}n}s~u€x€~€‚€€†‚‡…‚…‚†‚„‚†‚ŚŚŠ„ŤŽŽžŠ¦‡—‰Ś„‹}†|‚ymrboipgnlmfreviwj|w‚€„‡‹‡Ź„“…‹…Š…‹‰‹ŚŤ‹…ŚŤŚ~‡}†}€€|€yuo€n€p‚n†q„ux{~€}„z„v†w‡x†z…|„|„|‡}Š~‹€Ś€Ś€ŚŠ‚‡‡‚‚~{w‚s‚opno…r‹u•yš}ʂބЅ€‡‡s†p…s„m†p‰mŠjŠk‹kŠr‹z}‡…†€†}‰yv‰qŚoŚpŤoŚq‰t‡x„{‚€‚„…‡‚†€†…~~…‡€‰€‹~‹}Š|Šxy‡y‚y€{||x|u}q|p~op€r‚u‚y‚}‚‚„…‡‚‡†‚„„„‚†„‡‰Ž‹—‰‘ŠŽ‰Ž‡‚‡‚|€s|vxqunpnqjoipirluuzy|~‚„††‡‰†Š†Ť…ŹŹŹ‡Ť‡Š‡‹„‰Š‡€}}||x~t€p~q€np|s{vyzx}zz„{…|‡|†}†}…}„„€†‚‡‡Š‰‰„‚‚‚}yu‚qq‡oŽp•s‘vŤyŚ}‚€…}†t†u…r‡n„o‚j„h†j†m‡tŚzŠ}‰‚‰†‰‹ŤyŹvŹrŽrŠpo…su„y‚{€€…}†|†}…}‡…~„{†z…y‰xŠy‡zŠ{}|†}‚}}|yu‚rroq„sw{‚‚…‚…€€…‚„„„‰…”‡Ž†ŚŠ‰‡€‡‰{†t‡u„q‚n€m{jzhuksorvq{t~u‚z„}‡~ŠŚŽŹ„ʅމ„‡„…†„„„„‚€‰‰}|‰|}…‚~~~y{vzuzsxrzr{v{y}z}||}}…„„‚„„…„„…„†‰‡‚‰€†‚…Š|‘y‘wŚuŚs‡rvwyyt{u}qnmji„l„q‚w…|…‚……‚‡‡‹‡Ś‰Ž‡‡ŹŹŤ‰‡€…|„x„x‚v€t~t|w{y|x}z~}~€}€}{…y‚z„x„z|…{|„}†|…}†~††‚„„‚„„~„{„zxwx‚w€y€z€{}„~†€‹‘ނЄ‹‚…w…uu…p„n…m†i„j†n‚rx‚|€~…~{‹zŚyŹ{zŹyŹ{Ť~‰{‡}†„€„€‚‚~|‚{|}„}}}„|{zy„y„z‚|‚|‚}€}}}}~~~||‚||„z„}„}„|„~„€‚€‚‚‚€‚‚…Š‚Ť‚ŤŠŠ‚…‚~yu€u€ro~o€l}k~o}r}w~||~‚}…~‡}Š~ŚŽŹŹŹŤ‚І‚„‚‚€~‚}{‚{‚||€}}}€|€{zz~z~{|}~}}~~~~~€~€‚€„€„„„€„‚€‚‚‚‚€‚€€€€†‰€Ś€‹‰€‚~}wuu€q~opmm€q~t€y€~€‚„€‡€€‹€Ś€ŤŹŽ‚ŽŚ‚‰€‡€…€‚‚~~}|€|€||}€}€|{€{€z~z€z€{}}€~€~~€€€€‚€„……€„„‚€‚‚‚‚~€€€€€€€€…~‡Š€‰~‡†‚~}x€vvs€qr€p€pt€uy€~€€„‡€Š€‹€Ś€ŤŤ€Ś‹‰‡…€€€€~€~€}€}€}€|||{€z€{~{}€xz€{|~~€€€€‚€‚„„„…„€„€€‚€‚€€€€€~€‚‚„……€…€„€‚€€|€z€wu€uu€t€u€u€v‚y€{€€‚„€†€€‰€Š€Š€‰€€‡€†€…€€‚€€€€€€€€€€~€|€{€{€y€z€zz€{|}€}~€‚„€…€„„€€€‚€‚‚‚‚€‚€€€€€€€€€€€€‚‚~‚~‚~~€~}{yxx€x€x€y€z{|~€‚…†‡€€‡€†€…€„€‚€€€€€€€€€~€}€|€{€{€zz|{}}€}€~€€€€€€‚€€„€†‚€…€‚€€‚€‚€€€‚€€€€€€€€€€~~€~‚‚€€€€€€€€€€~€~~~~‚‚€€‚‚‚€‚‚‚‚‚‚€€€€€€~€~~~€~~~~‚~€€~€~€‚‚‚‚}€€‚€~‚€~~€~€~€€‚‚€‚‚‚~‚€€~€€~~~~~‚€€~€€‚€€€€€€‚~€€}€}€~€}€€€~€~‚~€€€€€‚€~‚}€€€€~‚€~€€‚|{„{„~€€|€„€|€„|~~€~€€€€€€~‚}€€€€€€€~‚~€€€€~€€€€~~€€~‚~€~€‚€€€‚~~‚~‚€€~€€€€€€€€‚€‚~€€€€€~€€€‚€}‚~€€~€‚€€~€€€€€~€€€‚‚€€€€€~€€‚~€€€€€€€}€€€€€€€€€}~~‚€€€€‚€€}~~€€‚€~€‚€}€€€‚~}€‚€€€‚€‚€‚€€€€~€~€€€~~‚‚€}~~€€€€€~€€‚€~€~€€€}€~€„€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€€€€€€€€€€€€‚€‚€€€€€€€~€‚€€€€€€€€~€€€€€€}€€€€€€€€€€€€€€~€‚‚€€€€‚€€„€‚€€€~€€€€€€‚€€€~€€~€€€€€~€}€}€}€}€€~€~€€€€€€€€€‚€‚€‚‚€€€€€€€€€€€€€€‚€‚€‚€€€}€}~~~€€~€€~€€‚€€€~}~€‚€€€€€€€€€€€€„†……~€}€€€‚€€‚€€€~€}€~€}€{€|€{€|€€€€€€€€€€~€~€€€„€†€€€€€€‚€€‚€€€€‚€€€€}€€€~€€~€}€~€~€€~€~€‚€‚€€€~€€€~…‚€€€€€€€€€€€‚€€€€€€€€€}|z||€}€~€|€~€~€~„‚‚„€‚€‚€‚‚‚~~‚~€~€€€€€~€~€‚~||}}€€€€‚€€€~‚€y€}€{{€‚€‚‚€€€„‚‚„„‚€€}~|{|}~~€€€€}~}{€|€~}€€€€€€€€‚€‚€‚‚…„‚‚‚€~|~€}}‚~‚~‚€~~€~~€‚~€~‚}}‚€‚‚‚‚}|}€}€€€€~„~†„~~‚~€~€~€~‚~~‚~€~~}||€}€‚€‚€„„…~†~‡}†~†…€‚‚‚‚}}€{zz‚xx‚xx‚y‚z{{€|€~€‚€„…‡€‰ŠŤŤŹހڀŤ…„~~z}|~vus€q€ro€u€su€zw|}‚‚†€…‰}‰|ŠzŹ{‘}““”‚Ś„‰‚„}„zt‚q€p}m{mzn{q}r€u‚xy{~€€€‚‚„…‚†‚Ѐڀހ“€”‘”އ€~€y€wr€n€pnms€tv€z€|{‚}€~|}|€{€z|‚~†‚‡€‰Ť|Źz“z‘{~’†…z{u‚s„q…rpŠrw…u€{y{wzu|v{zz~}‚~}‚‚‚…~†‡€‹€ŚŤ‚“‚Ž”††€†z|y‚us„vqtx€tz€{x…zz†x{{~u|qq‚tx‡|†‹}‹{‹{‘|‘€‹„”‡Š‰„І{„}|vv„w‡srŠx‰r…x‚z|uwzuxuxw{z}~}‚‚‡„‡~Љ€‹ŚŤ„Ž„’‚‚‹€zw€x‚wu…rvŠuŚsŽ{Ťuyzxvo|j{h}jp‚uz…~……€‰€‚Š„‹†‹‰‰‹†Ź‚Ś}~}}w…ywŠu‹r‹ws„vzzuvzsxswu|x|}~€‚‚‚‚‚‚…€†€€‡€Š‚‰‹Š‚‘Ž€Ť|~€wzwŚts”w’qŽw…yyto{fwbwc|g|n~v|„…‡‚‰‡‹‡‹‹Š‰Š„‰}zŹy{Ž~}}‡ŚwŽ{ŹxŽt‰s„w}qvwryotp{svww}|€{„‚…‚‡‚‡‚‹‚‡‚‰Ź€ŠŽ“~~Ť€‚z‰„Źw•{zt‘t…wxqkvay\t^{cwkvu}}{‰ŠŚŤ…Ť‚ڇ‹‡†Š~‡yvŤuŚwŠ|”‚†Ť‹‘w’…‘{Žy~tztsvnrlsnyrswz}y‚t…|†z…}„€€…€€†€‡€†€Š‡€‡€Š€Ť€Š€ŹŹŽ|”€™‚u’‡wyskv_sYqYx_uivt{~t‡zŚzŹ{ʂʀނڅЂ‡„‡~…y‰us†u‰yŠڇ‹Ť“‘†•‰”‰‘yچ„y|{u}nskvktnqsuyw€s„{‡vv†|…x€€~…~†€…€Š‚‡‚‰‚‰‚Ś‚‹Ž†‘Ś„’Ť—€~“‰v|mwasYuXq\qfvrt}v‡zŤtzzŹ{ނڀЄ…„‚€†{…v†t‰sv|‹Ť‰”Ź–Ž“„ŹŤ‡}wpwlkvltquvq}r‚w†sxy‡u…|y}‚~€}…~†…‡‚‰‡‚‰‚‡‚‡ŤŽ”ޙޒ}‡whw[UvVs]uipvq‚w‹sx’z‘tŹ}ŤyŠ}‰‡†„zv‡s„s‡v‰|‡‰‹†‘‡•Ś–“ŤŽ‡Žw€q~l„kvloxus{vq…qw‰tx‡z„u|y}|}}}„~„€‚†‚„„†„‰‡‚‡†‰ŠŹ‰•‰™’—†Š‰tze‡YyU|W}_rlvxr„oŤu‘t’u{ŽvŚyŠ{‰y†€„€‚z…v‚s…s…v„{‰‡‹‘•…–“ŠŽ‡Ź€Ťx…rŹm~l‚l‚owsyut„v‡n‰r‰us…z‚x€w~||x|}~€…‚„…„„„‡‡‚‡‚‰…†‹†‘–‰”Ź‹‰}‡nŚ`|W…V}Zzdqs}vsŹo’t’ttŽ{‹x‰y}…y€~€zv†s‚t…w…}„‹†‘”•…’†Ť‡‡xŽrŠm‡lŚl}o…t}yz„s‡v‰s‰os…tt€z~x}z||}z~‚‚„„„„…„‚‡‡‡Ž…“†—†•ŽŚuŤg…\ŤX€X‚`‚kxw€u‹t‘t“o‘rŹtŚsŠyz†y„}{}~yu€t„u„y…†Ť†‘‡”‡”†‹…„…|…u‰p†lŽk‰m‡q‹v}|…‚~†{‰~Šs‰u‡r„ost}u|z|y}{~}€|‚€€„‚…„„„„€„‚†††Ś‡‘•…”…Ž„„…wj†_ŽZ‡Z‡`Šj~v†}Š{Ź}’s‘uŹrŚoŠst†u„{‚y~|z}w}uu€x}„Єʑ„’…†Ś‡†‡€†y…s„p…lm…oŚs‰y…~Ś„~‡…Š€Šz†tus~n}s}t|t}{y€|‚|„„„‚‚…‚…„„‰†Ź…”†”‡‘……|oc†]†[…^Śh„q}‡~Ť‡‘|‘}}Ťs‹v‰r‡o†us€v}{yyv~u~v~z€†„‹…‚‘…Ť…„}‡x†t…q…ooq†u†z…Ś„„‡‰‰~‡‡…|‚}€}~s}v}r}o~usv‚|„y„~„„~„~…~‚‚…‡Ť’…“„‘†Š†…s…h`]„_†f„o‰z„ŠŠŹ„‘ŹzŤ‹v‰u‡u„o‚s~tzsw{uzu|x|}‚Ť‚ʆʂŤ„Š„……}x„u†rp†qr‚vz‚†„„‡‡‡‰…{~}x}u~vq€r‚vt„z„{„{€~…}€†…„Š‚…“’Ž„…‚z†o„e„`…^bi‚s„}†…ډʑ…‡ŽŤ…‹‰|‡~„uv}uzpvuutuux||z‚~‡€Ś€ŽŽŚ„‰……„~„z‚wt„rq…r„tx„}‚‚‚†‚‰…‚†‡„…‚‚€‰€~}}{~€x€u‚xq„t„v„t‚z{|~~€‚‚‡…‹‚…’…‚Š…€‚v‚k„d‚`„`„e‚l„v‚‡‚ŚŹ„ŹŹ†Ť„‹‚‰‡€…}zywyuuuyxr|tw†tŠzŤ|Ť|ډ†‚‚…~„{…x†ut„rs‚tw‚{„†‚‡‚†„‚€‚‚~†~‚~‚~†€‚‚{„yv‚xs€u~wv{‡|Ś}€Ť†„~„t…k…e„a„dhox€‡‹ŹŹ‚Ź‚ŽŤ€‹€‰€‡‚„€‚~„z€w‚v„vw‚{€|„~zŠx‹yŠwx…x‚z€|~}|€{€xvt‚ttw{~‚…„†„‡„†„…„„‚‚€€~~~~~~€}~‚~~€€‚€€‚‚†‰€Ť€ŽŤ~~y~p~j~e~d~g~l~t~{~~ŚŽ€ŽŽŤ‚Ś‚‹‰‡„}zwv‚vx{€€„‡‰Š~‰~‡„€€~}||€{€yxv~w~x~{~~~~„~…~…~…„„‚€€€‚‚€‚‚‚‚‚‚‚‚‚€‚€~€€€„€‡ŠŤŚ‰„}u€n€jghlrx€€…‰Ś~Ť~Ž~Ť~Ś~‹~Š~~†~|yw€v€wy|‚€‚„‚‡‰‚‰‚‚…‚‚€~}|€}€}€}€|{{yz{}€€€„‚‚‚€€€€~€~~~‚~‚~‚~‚€€€€~€~€‚‚†‚‰‹‚‹‚‚‚}vql€j€k€n€sy„‹ŤŤŤŚŠ€‰€‡€…‚}‚z‚xwxz€|€€…‡~‡~…~~€~~~}|||€}€}€~~}}‚}‚}‚~‚‚‚‚‚‚‚€€€‚‚‚‚‚€€€€€€€€~~€€€„‡‰Š‰†{vqnm€n€q€v€{€…‰‹ŚŚ‹‚Љ‡†„€|€z€y€x€yz}€…‡‡†„€‚€€€~€|€{€{{|~~€€€€€€€€€€€€€€€€€€€‚‚‚‚€€€€€€€€€€~€…‰€‰‡€‚~‚x|t€pn}nq€uz„„‡|Š‹~‹|‹€Š‰‡~†€„‚€}{zyyz|~€€„†‡€†€…€€}€|{{€|€|}~€€€€‚€‚‚‚€€€€€‚‚~~}€}}|~~~€~}‚~~€‚‚‚€‚€€‚€€€€€‚€€€‚€€‚…‡€‡‚„‚|€w~s~p}p|q|tzx{}|{…~‡‰€ŠŠ‰‰„…‡…‚€€}{~z}y~y~{~}€‚€„‚…‚…‚…‚‚‚‚€‚~}‚}„}…}‚}…~„~~~}€}z‚ywx‚w‚v€{{}}||‚{„|†}‡‡€‰‚…†„„„„€„}}‚{‚{}€{€}€}}‚‚„€‚€€€‚€„‚‚„‰‡€‡…||}yxxturtqyrtuxy}}{„„†…†‰‡‰‰‰†‰‡‡„†„‚‚~€{}~{|yzy~z~{}~€€‚„€„„‚€€~‚~~~~‰~…~‚~Š~„~~„€~‚yz„x†t…s„xu~v{~y}xx…z†|†Š‚‡…„‡„‚„€„€„~„||‚}{€}~~€~~‚€€‚‚€€‚€€†~‚€†‡…†€‡{…x‚xwzswvuxtvu|wz}‡‡„‰…‰†…‡…‰~‡}…{{€|}}{}zz{€}‚€‚‚‚€€€…‡‚~…}†}~}€}z€y‚x„w„t…w„y‚x€}}€|z„{‡|}‡~‡€€„‚‚‚‚}|„|„|„{„}‚~€‚‚~~„‚‚‚€€€€€€€„€‡€„€€‡~€€{x„w…w…u„t‚yy|zy€w‚ww†y‰z‰|‡~†‚„~…{‡{{‰{|†„€‚€~}‚}„}„}‚~€€€€‚‚‚…‚‚„€†~}}}y}w}v~wt€v{‚z~„„‚†€‡}‰|‰z…{†{„}~~€}y{‚|‚}~„‚…„„„„€~~~~€€„€‡€…††€~€|€x€vuv‚t„v„{…|„†|‡zxŠxy„z…{‚||}}~{€y‚{„}†~‰‚‡‚…„„€‚€€~~}}}~~„€„‚‚Š‚…‚†„€~€|yxtt~v~u}x}}~‚€…‚„„„‰†~{~{{{z{z~{~|€€‚‚„„„„……„…„„€‚‚~~€€~‚~…~…~‰†€…€†€€~€{€wws€vv€v€|€~€€€„†‰‚‰‡„‚€~~||z|z{{{|{~{€{‚|‚}„~……‚„„„…‚†€†€……~„€‚„†‰~„~…~„~~~}y€x€u€t€v€v€x}‚€…‡‡~‡…€€}{{‚{}€~€}‚|‚{„|…}…~„€‚‚~„„„„„‡†‚„„€€€~€|€xxv~v~vw€{€}€€€…€†‡‡…‚€€€~€|€{€{€|€}€‚………€…€~~€}}}}}„~‡…€‚~{y„xvvv‚x‚{}‚€„€…‡††„‚€~}||€}€~€€€‚€„…‚…„‚„€~|}€}€}‚~~…}…~~‚~‚}zy‚xv‚wxz|‚€„€…€†€†€„€‚}}|€|€}€~‚„…€……€…„€‚€‚€„€„€€‚€€~|{€z€y€w€w€x€z€|~‚„„……‚€€~€}}|}‚‚€‚‚‚„…………€„€„€€„€„€…„€|{zzxvxyz}€‚€€„€…€„€‚‚€~~€}}}€~€€‚€„……€…€…………€††€€‚€}{z€z€y€vx€yx€{€€€€…€€‚€‚€€€~€~€}€|€~€€€€‚€„€…€…€†€†€†€†€†€€†€‚‚€€|{zyvvy€x€z€}€‚€…€„€€€‚€€€€~€~|}€€€‚€…€…€…€‡€‡€‡€‰€…€‚‚~{z€y€v€u€wx€x{~€„€…„€„€€‚€~€~€}€}€~€€€€‚€„€…€†€‡€‰ŠŠ‡…€€|{xuuvv€w€z€}€~€„‚„……„€‚€€€~}€}€~€‚„…‡€‰€‹€Š€‡‡…€~{€x€v€u€vuwy‚{~€„€„€…€„€€€~€~€€€€€…€†€‰€‹€‰€‡€€„€€~|€x€vwuuvy€{€|€€€‚„„„…€‚€€€€€€€€‚€€„‡€‰‡€‡€‡€„‚€€€~€{€xx€v€v€v€x€z€{€~€‚€€„€€‚€‚€‚€‚€€‚€‚€‚€„†€…„€…€€‚€€€€€€{€|€{y€yx€z€z€{~€€€€€€‚‚‚‚€‚€‚€‚€‚€€„‚„€€‚€€€€~€~€}|€z€z€{€{|€}€~~€~€€€€€‚€€‚€‚‚€‚€€„€€€€€‚€‚€‚€€€€~€}€}€}€|€|€|€|€|€|€|€}€}€~€€€€€‚€€„€„€„€„€„€„€„€„€„€€€‚€‚€€€€€~€}€|€{€{€{{€{€{€{|}}~€€€€€‚€„€…€…€…€…€…€„€„€„€„€€‚€‚€€~€}€|€{€{€{€{{|€|||€}€~€~€€€‚€‚€€„„€…€…€„€„€„€„„‚~‚‚€€~~}}€|€|€{{|€|€||}€}€~~€€€€€€€‚€„€„„„€„„„„€„€‚€€€‚~€}€||{€{{|€|€|€|€}€~€~€€€€‚€„€„€„€„„„€„€„€„€€‚€€€€€~}€|€||{€{||€|€|}€~€~€€€€€‚„„€„€„„€„€„€„‚‚‚€€~}€}|€|{{€{{||}€}€~€~€€€€€‚€„€„€„€„€„„„€„€„€‚€€€€€€€~}€|€|€|€{€{{|€|}}€~€~€€€€€‚€€€„„„€„€„„„„€€‚€€€€~€}}||{€{€{€|€||€}}€~€€€€‚€€€„„„„€„€„„„€€‚€‚€€€€~~}||||{|€|€|€}€}€~€€€€€€‚€€€„€„„„„„€„„‚‚‚‚„…€„„~„~}‚||}|}{||{|z|y|z}{}|~}~~€€‚‚„„„‚„„„€„€€€€‚€‚€€~~}€|€|€|€|€|€|€|€}}}~‚‚‚€‚‚‚€}„}„|„{„{„{|}~‚€‚‚€~~‚}||€||~|~|~|~}~}~~‚€€‚‚‚€„€„„„€€‚‚‚‚€~}}|}|}{|{|{|}}~}}€~‚~~„€€‚‚‚€~~~‚‚‚‚‚‚‚€‚€€~~}~}}}}}€}~‚~~€‚€€}‚|‚|{{{|~€‚‚‚„……„€€‚€€}~}~}~}}}}~}}}‚~~~‚‚„„€‚€€‚~‚|‚{‚|}~‚‚€‚‚‚€„€€‚€~~|~|~}~|~|~|~~~€‚€€‚€€‚‚~‚‚‚‚‚€‚€‚€€€‚~}~~€€€€€‚€‚‚€€€~€}€|€}€~€€‚‚€€€€€€€€€€‚€€‚……‚€€€}€z€z€|€|€}€}€€‚€€‚€€€…€„€‚€€€€€€~€€€€€€‚€€€€€€€€€~€|€}€}€}€~€~€€€€€€€‚€‚€‚€€€€€€€€€€€€€€€€€€„€‚€€€€€~€|€{€|€|€}€~€€€€‚€‚€€„€€€€‚€€€€€€€€€€‚€€€€~€€~€|€|€|€|€}€}€~€€€€€€‚€€€‚€‚€‚€‚€€€€€€€€€€€€€€€‚€‚€‚€‚€€€€~€}€|€{€{€|€}€~€€€€€‚€‚€‚€€„€„€€€€€€€€€€€€€~€€‚€€€‚€„€„€€€€~€}€z€x€y€{€|€|€~€€€€‚€‚€„€…€…€€€‚€‚€€€€€€€€€€€€‚€‚€‚€‚€‚€€€€€~€~€}€|€}€}€}€~€~€€€€€€€€€€€€€€€€€€€€€‚€‚€€€€€€€€€€€„€„€€€€~€|€y€y€z€z€{€{€~€€€€€€…€…€„€„€„€€‚€€€€€€€€€€€€€€€‚€‚€‚€€€€€€€}€|€|€|€|€|€}€€€€€€‚€‚€‚€€€‚€€€€€€€€€€‚€€‚€€„€€‚€‚€€€€~€}€~€}€€€€€€€€€€~€}€}€|€|€|€|€}€~€€€€‚€€„€„€„€„€„€€‚€‚€€€€€€€€€€€€€€€€‚€€€€€€~€}€|€|€|€|€}€~€€€€€€€€€€‚€‚€€€‚€€€~€€€€€€€€€€‚€€„€„€€‚€‚€€€€€€€€€€€~€}€{€z€y€y€z€{€|€}€~€€€€‚€€„€„€…€…€„€€€€‚€‚€€€€€€€€€€€€€€€€€~€}€|€|€|€|€|€}€~€€€€€€‚€‚€‚€‚€‚€€‚€€€€€€€€€€€€‚€€€€€€‚€‚€€€‚€€‚€€€€€€€€€€€€€€€€€~€}€|€{€{€z€z€{€|€|€}€~€€€‚€€…€…€…€…€…€…€…€…€„€€‚€€€€€€€€€€€€~€~€~€}€}€}€}€}€}€}€~€~€€€€€€€€€€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€‚€€‚€‚€€€‚€€‚€€€€€€}€|€{€y€y€y€y€y€z€y€{€}€~€€€„€…€†€‡€‡€‡€‡€€‡€†€…€„€‚€‚€€€€€€€€~‚}{}|{{„{‚zyy†zyzz€{~|€}~€€{‚}„‚……€†€†‚†……„‚€‚€~€~~€€€€€€€‚€€‚‚~}}{€{~zy€yyz€{{~|~€„…€…‡~‡‡€€‡€‡‡†€…€„€‚~€€~€~~~}€}€~~€}€}~|€{‚{zz{€{{~|}€~~‚€€„…‚††€††~…€…„€‚€€€~~‚€‚€€€€€€‚‚}‚€€}€€~‚}~|z‚y~y‚x|x„y€y~z‚|}€„|†‡‡‚~‚€‡†‚„€}‚‚€~}}|||€|‚|‚}}}‚~}~}€}}{{|€||~}~‚~~€‚€€€„…|…†‚†{…„„„~‚€|‚~~~|„}‚€‚€€‚€€€€~€{{€z€yy‚y~yz||}€€€……‚†~‡‚‡‡‡†€†…„€€~‚}}€|‚||~|€|}}~~‚}€~~~}}}|~~~€€€€‚€‚€„€………€…„~„„‚~€~€~~€~~~€~‚€€€€‚€‚‚€~|{€zzxwwxz€{}€~…~‡€€~€‚‡€†~…€‚‚~€‚~}~}}}~}~~~‚€€€€€‚€€~‚|||€||}~~~€‚€„„„„„„~„~€‚€‚€€~~€~‚‚„€„€„…‚„‚€}|‚}‚{€y~z}z{zzzy{y~y~yy€z{}‚‚‚„…‚†‚‡‡„‡…†……†„‡Š‚‡„†€‚€~}~y}y}v~s~s~tsuw{~€†~†}†|†|†|†}„}‚~‚‚€‚‚††‹†‰‡‚‚‚}‚zx€t€q€rqr€t€v€z€€„‡‡‚‚‡‚†‚…‚„‚€€~€|€{€z„y‡y‡y‹z‰z‰{Š|†}„~€|yv„q…q†q†p†s†u†x†|…€…„†‚‰€††„~‚}€}}}}}€}}‡~~‹ŠŠ‹‡~…~~|~yvr€q€p€psux}‚€‚‚†‚‚‰‚‰‚‡‚…‚„‚‚€€€~€~€€€…€‡€Š‹€‰Š‚‰‚†‚zx€u€q~q|p{rztyvyzz~z‚{…|‡}}‰~€†„‚„…€†~†}‡}‡~†€††„…†„‰„‹‰‚€‡…~„}€}||x|v|t|s}r}r}t~w~z~}€†‡‡†„€€€€‚€‚€‚‚‚„…†‡‚†‚…„€‚€€€€~{z€w€vw€w€x€y€{~‚€‚„„‚„€}|‚{zyyy‚z‚z‚|‚}‚~‚‚‚„…††‡††€†€…€„€~‚}|€|}~}}}}~|~|~||}}€~€~€€€€€~~‚~‚~€‚‚‚‚‚‚‚‚‚‚‚€‚€‚€‚€€€~~}}€}€~€~~~‚~~„…„€„€‚|z‚x‚wwwxyz‚|‚}‚‚‚„€†€‡€‰‰‡†…‚€~}}||{||}~€€€€€€€€~}|}~€‚‚‚‚‚‚‚€€€€‚€€€~~~€€‚€€„€†€†€†€†€„€€}€z€v€t€s€s€t€v€x€z€|€~€€€€…€‡€‰€‹€Ś€Ś€Ś€Š€€…€€€€}€|€|€{€{€{€{€{€{€|€}€€€‚€„€„€€‚€€€}€|€z€z€{€}€~€€€€‚€‚€‚€‚€€€„€„€„€€‚€€€~€}€}€~€~€€€‚€€„€…€‡€€€€…€‚€}€y€u€q€p€p€q€s€v€y€|€€‚€„€€Š€Ť€Ž€Ź€Ž€Ť€Š€†€€€}€{€z€z€z€{€{€{€|€}€€€€‚€„€†€†€†€„€‚€€{€x€v€v€v€x€{€}€€€‚€€…€…€†€†€†€†€†€„€€€€}€|€{€|€}€€€€„€…€‡€‰€Š€Š€‰€†€€{€u€o€l€k€l€n€r€w€z€€‚€†€‰€Ť€€‘€’€‘€Ť€‰€…€€|€y€w€w€x€y€{€}€~€€€‚€„€…€‡€€€‡€„€€}€y€v€t€s€t€v€y€|€€‚€„€†€‡€€‡€‡€†€…€€€€~€~€~€~€~€~€€€€‚€„€†€‡€‰€Ś€Ś€Š€€€{€t€n€k€i€k€m€q€v€z€~€€‡€‹€Ź€’€“€’€€‹€†€€{€x€w€w€x€z€|€}€€‚€€†€€‰€‰€‰€‡€„€€€|€x€u€s€r€t€v€y€|€€€‚€„€…€†€†€†€…€…€„€‚€€€€€€€€€€€€€€‚€€€„€†€€‹€Ś€‹€€€z€s€l€i€h€k€n€s€y€|€€…€€Ť€€’€’€€Ť€‡€€|€x€v€v€x€{€}€€€‚€„€…€‡€€€€†€„€€~€{€y€w€v€v€w€y€z€}€€€€€€€€‚€‚€‚€‚€‚€‚€€€€€€€€€€€‚€‚€‚€‚€€†€€‰€‰€‡€€{€t€o€l€k€n€q€v€{€€€…€€‹€Ť€Ž€Ž€Ś€‰€„€€€{€y€x€x€z€}€€€€„€†€†€†€…€…€„€€€€€}€{€z€x€w€x€y€{€}€€€‚€‚€‚€‚€€€€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€‚„…{|‹Ś‚Ś€‡~€x}q€ljk€nsx„|„€~„†Š€Ś‚Ž€Ź~Ž~‹€‡‚|}~yw~v€x‚{‚„†‡‡†…„€~|€zzxx€y~z‚}€‚‚~‚€€~€~€‚‚~‚€‚‚‚€‚€‚‚‚€€€€€€€€€„Š‹‹‚‡~zt‚n~ll‚nr€w{€†€‰‹Ś€ŤŤ‹€€„€|y~x€xz€}€€€€…†‡€†…„€~€~|{yxxy{€}€€€€‚€‚}€~‚‚‚‚‚‚€‚€€€€€€€€€}€†€ŠŠ€‡}€wqnm|nqu~z~~‚‚…‡€‰‹€‹€Ś€‹‰‡~€|zxy~z‚|€€‚€„~…‚†~…€„€‚‚~€€}{~y€x€w€xz~}‚€€€‚€‚~€}€}€€€€€€€€€€‚…Š€ŚŠ€†€€€z€snll€o€sw€|€€„€‡~‰Š€‹ڂڀ‹€‰†{xw€w€y|€‚€…€†‚††…}‚‚€€~€{zxw€wy|€~€€„€„€„„€€‚‚€‚€€€€€€€€€€€€€€€‚†€‰€‹€Ś‰€†€€z€s€o€mlosw|€€…€€‰‚‹€Ś€Ś€ŚŠ€„€€€}€y€xwx€{}€€€„€…€„„€€‚‚‚€€€€€}{y€w€w€x€z}€„„€„„€„€€€‚€‚€€€€€€€€€€‚…€‡€‰€‹€‰†~zu€p€n€mps‚w|€‚€„€†‡‚‰€‹€ŚŚ‹‰†‚~€{€yxy€{}€‚€‚€‚€‚‚€€‚€€~|z€x€w€x€y{}€„€„„„€…€„€„‚€‚€€€~€~€€€€€€€€€€€€€„‡‹€Š‡‚|€v€rp€o€q€uw€{}€€€€‚€…€‡€‹Ť€Ž€Ť€‹€‡„€€€}€{{€{€|}€}€}€}€~€€€‚€„…€††€„€€€}€{€z€y€xx€yz€|~€„…€…€†€†€…€„€€‚€€€€€~€~~€~€€€€€€€€€€€€€€€€†€‡€€€…€€}€y€v€u€u€u€v€w€x€y€{€}€€†€‰€‹Ś€‹€Š€€…€„€‚€€€€~€|€{€z€z€{€}~€€€€€€‚€‚€€„€…€„‚|ywwx€z€|€~€€€€‚„†‡‡…€~~€€~~~‚‚€‚‚€„„„€„‚‚‚}|€{|~|~|~|~|~}~~}~|||€}€€€€‚€‚‚‚‚„‚„„„‚†‚‰€Ś€Ť€Š€„€|€vr~r~t}u~wy|€€~‚~~€€~€~€~€‚€‚„‚„‚„‚†‰Ť’‘‹‚xt€rrrqs€w€}€€‡‡„€€~€{€z€z€|€}€€‚€€„€„€€€‚€„€‰Ź€–€’€€}€t€t€t€t€s€p€s€y€‚€Š€‹€Š€„€}€{€w€w€y€~€„€„€‚€~€{€}€€€„€„€€€Ś€›€¦€ €€e€V€_€s€€…€€†€Ť€‘€‹€y€j€h€o€|€€€‰€‡€€z€v€y€€€†€…€‚€}€z€}€€Ť€ť€Ş€¤€‡€e€T€[€q€‚€Š€Ś€Ž€Ť€„€w€m€k€w€‚€€‡€‚€€{€y€z€€‡€€„€}€w€x€z€€€…€€Š€”€¦€¨€Ť€f€P€Y€t€†€Ś€Ś€€Ź€€o€c€j€}€Ť€Ź€‡€€€z€u€s€x€…€Ť€Ś€€w€t€u€{€€€€†€Ś€Ą€®€“€j€N€[€u€…€‰€Š€”€”€€h€]€m€…€Ž€Ś€†€€}€q€n€x€‰€€‰€‚€z€s€r€y€…€Š€‡€€‡€ź€˛€›€p€S€[€u€€‚€‹€€™€€e€`€p€„€€€‹€‰€~€n€k€y€‡€Ś€Š€‡€€q€n€x€‡€‰€‚€€†€—€°€Ł€|€^€Y€n€v€}€Ś€™€›€€g€f€n€{€€€•€“€€€j€g€u€€‰€Ź€€„€p€j€v€€‡€…€€€‹€˘€Ż€‘€n€[€e€s€u€€–€ť€Ť€q€h€n€s€y€‚€’€—€€u€j€p€w€€€Ť€“€Ś€y€n€r€z€‚€…€†€„€‚€Ś€¤€Ş€‰€k€`€k€q€s€‡€™€™€„€o€o€r€p€v€†€•€‘€†€€p€i€p€€‘€€‰€€t€q€s€€€€…€€€Ź€¤€¦€€n€f€l€n€t€‹€€‘€}€r€s€r€r€}€Ť€’€†€|€}€y€m€v€†€Ž€€€€€y€t€x€€€…€€€€„€€”€ˇ€–€}€j€k€t€x€…€‘€’€€s€r€t€v€|€‡€Ś€…€z€w€u€s€{€…€‰€‡€€€|€y€|€€€€€€€†€€ź€€~€o€m€t€u€€€€Ź€€u€u€v€t€{€‡€Ś€…€}€{€w€q€y€€†€†€…€…€}€w€z€~€€€€€‚€„€€“€ž€‘€y€q€t€x€y€‡€Ź€†€y€u€y€x€x€€‡€‚€z€{€~€z€v€€‚€€€‡€‡€|€z€|€}€€€‚€…€…€„€Ž€€Ť€|€x€z€{€x€„€‰€€z€z€~€z€y€€€‚€}€{€~€€y€v€~€€€€†€‰€…€{€{€}€~€€€€…€‚€…€Ź€“€Ť€€€z€z€y€z€€†€€|€{€}€y€z€€€€}€}€€|€v€z€}€€‚€‡€‰€€}€|€}€€€„€€€‰€’€’€…€}€{€{€y€~€‡€€~€{€|€{€x€|€€€~€}€€€w€w€}€|€€…€‰€…€€~€|€~€€€€€€†€Ť€’€Ť€€€|€}€z€{€€†€€€|€|€|€y€z€~€€}€~€€z‚v{‚|||‰|‡‡}~†‚|vpu|ʑڇŠ}‡}€}zyy}y…„„~…{†}‚{‚w€{~~{~|{}}y}x}‚„…‚‚…~€}€€„„~~†ڔЀ}~~yz‚†€z~|}u~z€€~z€|€~y~w|‚€‚‚†~~~€€€€‚‚…€…~Ś€’Ś~}€€xz‚€†‚y‚~|vy~€{€{}y~x{‚‚€~†€~~€€€€…€…€‹€‘Ž~|z…y„€‚…€~x~}~v€x}~€|€y€‚{x€z~‚‚‚‡‚‡~}€}€€‚„€„€…€Š€Ź€…‚z|€x€~€‚~†€z€z€€x€wz~€x€}|€y€z|~…‚‡‚€€€€‚€‚€„„€‰Ś~ŹŚz€€y}€}‡‚w€~yz~xy€z‚z‚|{|z€€…‚„…‚€€€~‚€€Š€Š‹}€y€{z€{y€z€{€w€}€~z{€z}}€}…~…€€€€‚‡€‹€‹€Ź…}z€||~|{zz{€x€z}{{€z~|€~€~‚‚„€…„€€€‚€‚„€€‡‰€Ť€‹€€~€|}‚{€€€€}‚zy{{yz||}{~{z}€€€€‚‚€„€……‚„€„€„€€‚‚€…‡€Š†~‚€€€€~}}‚~‚}‚{€z~{~{}{{~zz€z€{}€€‚‚‚‚‚„€„€„€€€„…}‡~‰„‚‚‚€€~~}€z€y€xxyxxyyz}~€€‚‚„…‚…€†€†~†~……€†€‡€‰€€…€„€„‚‚€‚~€}€}€{€x€wv€v€w€wwxxz€|~€‚„€…†‡€‡€‡‚‡€‡†€†€‡€€‰€‡…„€€~€||{€x€v€uu€v€v€vwyz|€~€€€‚€„…€†‡€€‡€†€†€‡‡…€„€‚€€~€|€{€{€xw€uu€v€v€v€x€y€z€{}€€€‚€„€…€†€‡€€€€€‡€†€…€†€†€†€…€„€€€€|€{€{y€w€v€u€vv€v€w€y€z{€}€€€…†‡€€‡€†€…€………‚„„‚€}{zy‚x‚w‚vvvv€w€y{|}~‚}„|†{‡|}€„…‡„†…~„{„z{‚|‚}‚€~}€{‚z„z‡y‰yŠxŠx‰x†yz{{|x~vv€vx‚z|…†‡‡„‡„†„††…‚„„€‚~€~€€€‚~†}|‹|Ť{Ž{Ź{Ž{‰{‚{z|q|j}e~df€jpu‚|‚‡„Ś„‘„“„”„‘„Ť‡€{‚w‚vu€x€z}„~‡~Š~Ś~Ť}Ž}Ť}Š}…}~x~r~omnr€w€{€†‚‡‚‡‚†‚…‚‚€~||}‚}‚‚€‚€€…€†€€Ť€’š–~Ť~nc[[`~hpw}‚€€Ž€”€™™•Ś‚v‚oknt{€†€€Š€Ś€Ź€‘€‘€Źyroo€q€v€z€}€€€€„€†€†€„€‚€€{€z€y€z€|€€€€‚€€„€†€‡€‡‡†„€Ť”—”†t€e€[€Y€b€n€z€††‡‰‹Šu€k€i€n€x€†€•€”€Ź„‚‚~€yt€s€w€}€†€Ś€Ť€‰€€y€t€s€v€{€€€€€€€€€€€€€€€€€€€‚€‚€€‚€‚€‚€‚€€€€”€™€€“€€€l€_€W€Z€g€v€€€‰€‹€‰€‹€‹€Ś€Ś€€~€s€l€g€n€z€€”€š€—€Ź€‡€||{€{€y€v€v€{€€Ť€••Ž€s€i€h€n€w€€‡€€†€‚€~~~€€€‚€€‚€€€€€€…€‡†…‹‘€‘€Ź€„€t€g€_€_€g€u‰Ť€‹€€†€„€€€|€v€r€q€u€€Š€“€–€“€‹€‚€z€v€w€z€|€~€€€€†€Ś€€Ž€†€{€n€h€j€r€}€€Ť€‹€†€€€{€z€{€}€€€€€€€€€€‚€‚€€€€€‚€€…€„€‚€‡€€”€’€‹€y€j€`€^€f€t€‚€‰€Ť€Š€…€€‚€€€~€w€r€r€u€€€Ś€”€—€’€€}€v€t€w€|€€‚€‚€‚€‚€…€€Š€‹€‡€~€u€n€l€q€{€„€‰€‹€‡€€}€z€z€|€€€€€€€‚€‚€‚€‚€‚€€€€€‚€€€€‚€€‘€•€€‡€w€i€a€d€m€y€…€‰€‰€†€€€‚€‚€€€}€w€t€v€}€†€Ź€“€€‰€€x€v€x€~€‚€…€„€‚€€€€„€…€„€€{€w€v€w€|€€„€„€€€}€|€}€~€€€€€€€€€€€€‚€‚€‚€‚€‚€‚€€€€€€€€€€…€Ś€”€’€Ś€€q€f€c€i€r€~€‡€‰€€„€€€€€€€}€{€w€x€|€„€‹€€€‰€€z€v€x€}€€†€‡€…€€€€€€€€€€~€}€€~€€€€~€~€|€|€|€~€€€€‚€€€€€~€€~€€€€€€€€‚€‚€‚€‚€€‚€€€€€€€€€€€‚€‚€„€Ś€“€€‰€}€n€e€f€m€w€€€‰€…€€€~€€€€~€|€z€z€~€‡€‹€Ž€Ś€„€}€x€x€|€‚€‡€‡€†€‚€~€}€~€€€€€€€€€€€€€€€}€z€y€z€}€‚€„€„€‚€~€|€|€}€€€‚€‚€‚€€€€€€€€‚€€€‚€€€}€~€€€€„€„€€„€‹€Ž€‹€…€z€p€i€k€r€z€„€†€†€‚€€€~€}€€€€€}€|€~€€‡€Š€Š€‡€€|€z|€}„€…€€~€{|€~€‚€€€€€|€|€~€‚€„€„€‚€}€z€y€{€~€‚€€€€|€|€~€€„€„€€€€}‚‚€‚~…~~z~‚~€‚€‚†Š‚Š…€€y€ttvz€}€€€‚€€€}}€~€„‡€†„€‚€€€‚‚€€€€€€€€€€~€}~€€€‚€‚‚€‚€„€‡€†€|s€m€n€x€„€Ž€Ť€€}€vu{€…€Ś€Ž€‡€€xy~…Ї€{y€{€€€…€†„|€y€~…€ŚހЀu€o€n€t€{‚€„€‚€€€}~€€„€„€€€}€{€|€€†€‰€€„€€||€†€…€~‚~€€€€}|}€€‚€„€‚€}{|~…€‰‰€Š€€€q€j€h€v€‚’€’€Š€€€swx‡ŤŽ‚‚|‚x‚t‚‚…ŚŚ‚€yt~x~}~†}‰}‡~~{~x~z€…€‡€„€€€„†€„€}€vp€qx‚‚І€‚{{~‚„„€‚~€~}„}†|†{‚{~{{|}|€}„~†„€}{|€‚€‚€}€~‚‚‚‚‚‚„||~…‡‚†‚‰‚u‚p€n~x}|{Źzz€{u{x{x|…~‰‹€†}zu~‰€‰€‚}‚xz}‚„~}‚‚‚‚‚‚€‚€‚„…}‡|…||{{v{t{u|z}€}~…‚€€€~€€€€€€‚‚„„„‚‚‚~~‚‚‚„‚„€€~€€€€~~}€|}}€~~}}}}~~€€€€€€€€€€€€€‚€‚€‚‚‚‚‚„‡‚‚€zt‚ry€€Ť‹€€y€zy„~„€‡€‚~}|{~x€~‡…€‚}{€~€€€€‚€€}}‚€‚€‚€‚€€€~~„€…†‡€‡€}wtuz€€‚†~~~~~€€~€‚‚€‚€~‚„€‚€~~€€€€€€€€€€€€€~€~~€€€~€~€€€~€€€€€‚~€‚€~€‚€€€~€}€€€‚€~€€€‚€€€€€€€‚€€€€‚€€~€€€€€€€€€€€€€€€€€‚€€„€{€w€u€{}€‹€…€z€||€…„„€€}~|{‚‚‚€€~€€€~€€€€€‚€€~€~‚€‚€€~€~~€~‚~„‚‚~€}~€‚‚‚€~€|‚€„€|€|~€€€‚‚€€‚€‚„†„}€{yz€€…~€}}€€‚‚€€~€‚‚€}~€‚‚‚}~€€€~€€‚€€~€€€€€~€€‚€€€€€}€‚€€€‚€€€€~~‚}€}€‚‚‚€€~€€€€€€‚€€€€€~~„~‚}€|{€~€„‚€~‚€~~€€‚‚€€€€€€€€€€€~‚}€‚€€€~€~€‚~€}‚‚‚‚~€~€€~€~€~~€€€‚€€‚€‚€}}|€~€€†„€}}~€‚€‚€€~€‚€€€~~€‚€€€€‚‚€€€€€~€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€~€€~€‚€€|~€€€€‚€€€€€€€€€€€€}‚€€~€€€€€€}€€‚€~€~€€€€€€€€€~€€‚€‚€€€€€‚€~€€€‚€€~€€‚‚€€‚€€‚}€~€‚€~~€€€€~‚€€~€‚€€~€€€€‚€€€€€€€~€€€€~€€€€€€€€€€‚€~€€€€€~€€€~€}‚‚€}~„|€‚€|„}€‚€}}‚‚€‚~€~~€€‚€~€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€~~€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€~€€€€€€€€€~€~€€€‚{€|€€€‚€€€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€€‚€€€€€~€~€~€~€~}€}€€€€€€€€€€€€€€€€‚€‚€„„€…€†€‰‡€€}€z€z€{€z€w€vx€{}~€€€‚€‚€€~€~€€€€€€‚‚€„…€†€‹€€’€‹€€€{€|~€x€p€m€p€vx€z€}€‚€†€Š€Š‡€€€~€|€y€y€|€~€€‚€…€†€†€…„€„€†Ť“€€y€{€€€rjnwy€w€w~‡€Ś€Ś€€„‚€‚€€€{€v€w€|}€z€~€„€†€…€…€†…†€Ť”€‘€€z~€}oj€q€x€v€r€v€€€‰‹Š‡€…€…€~€w€u€z€}€z{€‚€†€†…€…€†…€„€„€‹€“€“€‡|~„€€p€i€p€y€vorŠ€‹€‡†€€„€|€w€x€}€}€zx€~€€‚„€‰€€„€€€€“€‹€~€~‡€…sg€q€}€v€i€n€€€‰€…€€‡€Ť€Š€|{||€yy€|€€€~€€Š„€€€„€‡„€†€‘€”†€{€„Šzjo€}wj€m€„€~€€‹Ś€€€€€z€{~€€€€}€††€€„€€~€€‘€€Š~€…Ś€}…l„rz‚}~q€s~€z€z€€‚{€w€yz€|€}€~‚‡€‚€„€„€}|€Ś€’Ž€…€‡€€o€p~€qr€€„€y€z……{w|€{x€y€~€…€„€…€†€‚„€…€}€€„~ޕЂ€‡u€p€|€~rs€€~€w{€„€{{€}€y‚xz~„„€†€‡€„€…€†‚€~€~€€Š€“€Ť€‡€‰€zp€{€€ur‚}€x~y~€€|€z|€}w‚w€~€€‚€‚‚€†‚„€€}€€†€€€…€‹€}€r€{€t€t€}€}€v€x€‚€{z€€}€v€w€~€Š€…€…€„€€„€„~€}€€†€Ť€…‰„€yx€}yw€z|€y€w€{€}€z€~}€x€x€~~€~€€‡€†€„…€†…€…€„€€€€€€€‰€‘€…Ś€‚€w€z€~€w€v€|€}w€w€~€y€|€€y€w€|€}€{€€€†€…€„€†€‡€„€…€†€„€‚€€€€‚€€Ž€‰€Ś€€€y€}€{ux€}z€w€{~€z€{€€}€x€{€|€y€}€‚€€€‡‡„…€‡€„…€€€€€€€„Ť‹€…€Ť€„y€~€}€v€x~€y€w€{€}€x€|€€€{€z€|€z€x€~€€…€‡€…€…€‡€…€„……€€€€~€€€€‡€‹€€‹€€}€€~wy€|€y€x€{€y€y€|€}€{€}€|€y€{€}€}€€…€„€…€‡€…€…€†€…€…„€€€€€€€€€‰€€‡€Ś€€~€‚€z€x€}€z€w€{€y€w€{€|€z€}€}€y€{€|{€€€‚€…€†€…€†€‡€…€†€†€‚€‚€€~€€€€€‚€€‡€‹€€€€y€{€}€x€z€z€w€y€{€z€|€~€z€{€|€z€~€€€€…€…€„€‡€†€†€‡€†€…€„€‚€€€€€€€€€†€†€‰€€‚€€€€z€~€{€x€|€x€w€z€x€z€}€{€{€|€z€|€€€€„„€†€†€…€‡€†€†€†€€‚€€€€€€€€…€…€€€‚€„€€€|€€z€z€|€w€x€y€w€z€{€z€|€{€z€}€}€€€€€…€…€…€†€‡€†€‡€†€„€€€€€€€€€€„€‡€†€€„€€€}€€{€{€{€w€x€x€w€z€z€z€|€z€{€}€}€€‚€€…€…€…€†€†€‡€‡€†€…€€€€€€€€€‚€„€†€†€…€„€€€~€}€|€{€x€x€w€w€y€y€z€{€z€{€|€~€€€‚€€„€…€…€†€†€‡€‡€†€…€„€‚€€€€€€€€„€†€…€†€„€‚€€€~€}€|€z€x€w€v€v€w€x€y€z€z€{€|€~€€€‚€„€„€…€†€†€‡€‡€€‡€†€„€€‚€€€€€€‚€„€…€…€…€€€€~€}€|€z€x€w€v€v€x€y€z€z€z€{€}€€€€„€…€…€†€†€‡€‡€‡€†€…€„€‚€€€€€€€€‚€„€…€…€…€€€€€~€}€|€z€x€w€v€w€x€y€z€z€{€{€}€€€€„€…€…€†€†€‡€‡€‡€†€…€„€‚€€€€€€€‚€…€…€…€„€€€€€~€}€{€y€w€v€v€w€x€y€z€z€z€{€}€€€€„€…€…€†€‡€‡€‡€‡€†€…€„€‚€€€€€€€€…€…€…€„€‚€€€€}€|€z€x€w€v€v€w€x€y€z€z€{€|€~€€€‚€€„€…€†€†€‡€‡€‡€‡€†€…€€‚€€€€€€‚€€…€…€„€€€€€~€}€|€z€x€w€v€v€w€x€y€z€{€{€}€~€€€‚€„€…€…€†€†€‡€‡€‡€‡€†€„€€‚€€€€€‚€„€…€…€„€€€€€~€|€{€y€w€v€v€w€w€y€y€z€{€{€}€€€€„€…€†€†€‡€‡€€€‡€†€„€€€€€€‚€„€„€„€€‚€€€€}€|€z€x€w€v€v€w€x€y€y€z€{€|€~€€€‚€„€…€†€†€‡€‡€€€€‡€…€„€‚€€€€€‚€„€„€€‚€€€€~€}€{€y€x€w€v€w€w€x€y€z€z€{€}€€€€„€…€†€‡€‡€€€€€†€…€„€‚€€€€‚€€€€‚€€€€~€}€{€y€x€w€w€w€w€x€x€y€z€{€|€~€€€‚€„€…€†€‡€€€‰€‰€€‡€†€„€€‚€‚€€€‚€‚€‚€‚€€€€~€}€{€z€y€x€w€v€v€w€x€y€z€{€|€~€€€‚€„€†€‡€€€‰€‰€‰€€€†€…€„€‚€€€€€€€€‚€€€€€}€|€z€z€y€x€w€w€w€w€x€z€{€|€}€€€€‚€„€†€‡€€€‰€€€€‡€†€…€„€‚€€€€€€€€€€€€~€|€{€z€z€y€y€x€w€w€x€y€{€|€~€€€€€‚€„€†€‡€€€€€‡€‡€‡€†€…€€‚€€€€€€€€€~€}€|€|€{€{€{€{€z€z€z€z€{€|€}€~€€€€€€€€„€…€†€†€†€†€…€…€…€…€„€„€‚€€€€€€€€€€€~€~€~€}€}€}€}€|€|€|€|€|€|€}€~€~€€€€€€€‚€€„€„€„€…€…€…€„€„€„€€€‚€€€€€€~€~€~€~€~€~€~€~€~€~€~€~€~€~€~€~€~€€€€€€€€€€€€€€€‚€‚€‚€€€€€€‚€‚€‚€‚€€€€€€€€€€€€~€~€~€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€~€~€€€€€€€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€~€~€~€~€~€€€€€€€€€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€{€w€x€€…€…€€~€€€„€†€…€‚€€€„€‚€z€t€v€~€€„€€€€€€‰€…€€}€€€€€|€z€|€~€€„€„€‚€€€€€€€€€€~€~€€€…€„€~€x€y€}€‚€€€€}€}€€…€‡€…€€€€„€‚€€}€}€~€€€~€}€~€€€€€€€€€€€€‚€‚€€€€‚€‚€€€€€~€~€~€~€}€}€~€€€€€€€€€€€€‚€€€€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€~€~€€€€€€€€€€€€€‚€€€€€~€}€}€}€~€~€~€~€€€€€‚€€€€€‚€‚€‚€‚€€€€€€€~€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€‚€‚€‚€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€~€~€~€~€~€~€€€€€€€€€‚€‚€‚€‚€‚€€€€~€}€}€~€~€~€~€€€€€€€€€‚€‚€‚€€€€€€€€€€€€€€~€~€€€€€€€€€€€€‚€€€€€€€€€€€€€~€~€~€€€€€€€€€€€€€€€‚€€€‚€€€€€€€€€€€€~€~€~€~€~€€€€€€€€‚€‚€‚€€€€€€‚€‚€€€€€~€€€€~€~€€€€€€€€€€€€‚€‚€€€€€€€€€€€€€€~€~€~€€€€€€€€€€€‚€‚€‚€‚€€€€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€‚€€€€€€€€€€€€€~€}€~€€‚€‚€€€~€~€€€‚€‚€€€€€~€€€‚€‚€‚€€€€~€~€€€‚€€€€~€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€€€€€€€‚€‚€‚€‚€‚€€€€€€€€€~€~€~€}€}€}€}€}€}€}€~€~€€€€€€€€€€€€€‚€‚€€„€„€„€€€‚€‚€‚€‚€‚€€€€‚€€„€‚€€€}€z€y€x€y€z€{€|€|€}€}€~€~€~€}€}€~€€€‚€„€…€†€‡€‡€†€…€…€„€„€€€‚€€€€€…€†€…€‚€}€w€s€q€r€v€z€}€€€€€€€}€|€{€{€|€~€€…€€Š€Š€‰€‡€…€€€€€€‚€‚€€€€€„€‡€‡€†€€{€u€q€q€s€w€{€~€€€€€€€€~€}€{€z€{€}€€€…€€Š€Š€‰€‡€…€„€€‚€‚€€€€€€€€€€„€€‰€€…€€x€s€p€q€t€x€|€€€‚€‚€€€~€|€y€x€y€|€€€…€€‹€‹€‰€‡€…€€‚€€€€€€€€€€€€„€‰€Ś€‹€‡€€z€s€p€p€s€w€|€€€€„€„€‚€€{€w€u€v€y€~€€€‹€Ś€Ś€Š€‡€„€‚€€€€~€~€€€€€€‚€†€Š€Ť€Ś€‡€€€x€r€n€o€s€w€}€€…€†€†€€€z€u€r€s€v€|€€€Ś€Ž€Ť€‹€€…€€€}€}€}€~€€€€‚€‚€…€Š€Ť€Ť€‰€‚€z€s€n€n€q€v€|€€„€‡€‡€…€€|€v€r€q€s€y€€€†€‹€Ž€Ź€Ť€Š€‡€€€}€{€|€}€€€€‚€€„€†€‹€Ť€Ś€€€€x€r€n€o€s€x€~€€†€‡€‡€„€€€z€t€q€q€t€y€€‡€Ś€Ž€Ź€Ž€Š€†€‚€~€|€{€{€|€€€€‚€€€…€‰€Ť€Ś€Š€€{€t€o€o€r€w€}€‚€…€‡€‡€…€€{€u€q€p€r€w€~€…€Š€Ž€Ź€Ž€Ś€€„€€€}€{€{€|€~€€€‚€€€€„€‰€Ś€‹€‰€‚€z€t€p€p€t€y€~€€†€€†€„€€z€t€q€q€s€y€€€†€‹€Ž€Ž€Ť€‹€‡€€€}€|€|€}€~€€€‚€‚€‚€‚€€„€‰€‹€Š€†€€x€s€q€s€w€|€‚€…€‡€‡€„€€€{€v€r€q€s€w€}€€€Ś€Ť€Ť€‹€€„€€~€}€}€}€€€€€‚€‚€€€€€€„€‰€Š€‰€…€~€w€s€r€t€y€}€€†€‡€…€‚€~€y€u€r€r€u€z€€…€‰€Ś€Ť€‹€‰€†€€€€~€~€~€€€€€€€€€€€€€†€Š€Š€€‚€|€u€r€s€w€|€€…€†€…€‚€~€z€v€t€s€u€y€~€€€‹€Ś€‹€‰€†€€€€€€€€€€€€€€€€€€~€~€~€€†€Š€‹€‰€€{€u€r€s€x€}€‚€†€†€„€€€|€y€v€t€u€w€z€€„€€Š€‹€Š€‡€…€€€€€€€€€€€€€€~€~€}€}€€„€Š€Ť€‹€†€~€v€r€r€v€}€‚€…€†€„€€}€y€w€u€u€w€z€~€€‡€‰€Š€‰€‡€…€€‚€‚€‚€‚€‚€€€€€~€~€}€}€}€~€~€€€†€‹€Ť€Š€€{€t€r€s€y€€„€‡€†€‚€~€{€x€v€u€v€x€|€€…€€‰€‰€‡€…€€€€€„€€‚€€€~€}€}€}€}€}€}€~€€‡€Ś€Ť€Š€‚€y€s€q€t€{€‚€†€€†€€|€y€v€u€u€w€z€€€†€€€†€„€€€„€…€…€…€€‚€€~€}€}€}€}€~€~€~€~€€€‰€Ś€Ś€†€€w€r€s€x€€€†€€‡€‚€|€x€u€t€v€x€{€€‚€„€†€†€„€€€„€…€†€‡€†€„€€€}€|€}€}€~€~€~€~€~€~€€€€Ś€‹€†€~€w€t€u€{€‚€‡€€…€€y€u€t€v€y€{€~€€€‚€€€€€„€„€†€‡€‡€‡€…€€€€~€}€}€~€~€~€~€}€}€}€~€€€„€‰€‹€‹€†€€y€v€w€|€‚€†€†€‚€|€w€t€u€x€{€~€€€€€€€‚€€„€…€†€‡€‡€‡€†€„€€€~€}€~€~€~€}€|€|€|€}€~€€€€‚€†€Š€Ť€‹€…€}€w€u€y€€…€‡€„€}€w€t€t€w€|€€€~€}€~€€…€‡€€‡€…€…€…€†€…€„€€€}€}€}€}€}€|€{€|€}€~€€€€€€€„€Š€Ź€Ź€‰€€€x€t€w€~€…€‡€„€}€v€s€t€y€}€€~€{€{€}€‚€†€Š€Š€‡€…€„€…€…€†€…€‚€€€}€|€|€|€|€{€|€|€}€}€~€~€€€€‚€†€‹€Ź€€Š€€y€u€w€}€€„€€{€v€u€w€z€}€}€{€z€{€€„€€‰€€†€…€†€‡€‡€†€€€€}€}€|€{€{€{€{€|€|€}€}€~€€€€‚€„€†€Š€Ž€‘€Ž€…€{€t€t€x€€„€‚€}€w€u€v€z€}€}€{€y€{€€…€‰€Š€€…€„€‡€‰€‰€†€€~€|€}€~€~€|€z€y€z€{€|€}€}€~€€€‚€„€„€„€†€‹€€“€Ť€€u€o€r€y€€„€€€y€u€v€z€~€~€{€x€x€}€…€‹€Ś€‰€…€€…€‰€‹€Š€€}€z€{€}€~€~€|€z€z€{€|€|€|€}€€€‚€€€€„€†€Š€Ž€‘€Ź€†€z€q€p€v€|€€€€€|€y€x€{€~€}€z€x€y€~€„€‰€Š€‡€…€…€‡€‰€‰€†€‚€€€~€}€}€|€{€z€|€}€~€|€{€{€|€~€€‚€‚€‚€‚€„€…€†€‡€‰€Ś€Ž€‹€€v€o€q€x€~€€€€|€y€{€}€€{€x€x€|€‚€‡€‰€‡€…€„€†€‰€‰€†€‚€€€€€€}€z€y€{€~€€~€|€{€{€~€€€€€€‚€€…€…€…€…€†€€Ś€Ś€‡€|€r€o€u€|€€€€}€{€|€€€}€x€w€{€‚€†€‡€…€€„€†€€€…€‚€€€€€€€€~€|€{€{€}€~€~€}€}€}€~€€€€€€€€„€„€€€„€…€†€€‰€‰€„€z€s€r€x€}€€}€}€~€~€€~€{€y€z€~€€…€„€€„€†€‡€†€„€€‚€‚€‚€€€}€|€|€}€}€~€~€~€~€~€~€~€~€€€‚€€‚€‚€€€„€„€„€†€€‰€‡€~€u€r€w€}€€|€{€~€€€€€~€{€y€z€~€‚€„€€‚€€‡€‡€†€€‚€€„€€€€~€~€~€~€}€|€}€~€~€~€}€}€~€€€€€€€€‚€€€€€„€„€€„€†€€€€x€t€x€}€~€{€z€~€‚€‚€}€z€z€}€€€€€€€‚€…€‡€†€€‚€€…€…€‚€€€€€€~€|€|€}€€€~€}€~€€€€~€€€‚€‚€‚€‚€‚€€„€„€€€€†€€‡€€v€u€{€€|€x€z€€„€€€z€z€~€€€€€~€€€„€…€…€„€€„€†€…€‚€€€€€€€€~€|€}€~€~€}€}€}€~€€~€~€~€€€€€€€‚€€€€€€€„€†€€†€~€w€x€}€}€y€w€|€€‚€}€y€}€€€€}€|€€€€„€€€„€†€…€„€€€‚€‚€‚€€€}€|€|€}€}€}€~€€€~€~€~€€€€€€€‚€‚€‚€€€„€€€€€…€‡€…€~€y€z€~€}€x€w€}€‚€€€{€z€€‚€€|€}€‚€€‚€€€€†€‡€…€€€€‚€€€€€€~€}€}€}€}€~€~€~€~€€€€€€€€€€‚€€€€€€€€„€†€†€€|€{€}€~€y€w€{€€€€{€z€€‚€€|€}€‚€€€€€‚€†€†€„€€…€…€‚€€€€€€€€~€}€}€~€}€}€}€~€~€~€~€€€€€€€€€€€‚€‚€‚€‚€€€‚€‚€‚€…€†€€€}€~€~€{€x€{€~€€|€z€~€€€€}€~€€‚€€€~€€„€…€€€…€…€„€€‚€‚€€€~€~€~€~€}€}€~€~€~€~€€€€€€€€€€€€€€‚€€€‚€‚€€…€…€€€€€€€€€|€{€}€~€}€{€{€~€~€}€}€€€€€€€€‚€€€€„€…€„€€€€€€€€€€~€}€}€}€~€}€}€~€€€€€€€€€€€€€€‚€‚€‚€‚€€„€„€„€€‚€‚€€€~€}€}€}€|€{€{€|€|€|€|€~€€€€€€€‚€€€„€…€„€„€„€„€„€€‚€€€€€~€}€}€}€|€|€}€}€~€~€€€€€€€€€‚€‚€‚€€€„€„€„€„€„€€€€€~€~€}€|€{€z€z€z€{€|€}€~€~€€€€€‚€€„€„€…€…€…€…€…€„€„€€‚€€€€~€}€}€|€|€|€|€|€}€}€~€€€€€€€‚€€€€€€„€„€…€„€„€€€€€~€}€|€{€z€z€z€z€{€|€}€~€~€€€€€‚€€„€…€…€…€…€…€…€„€„€€€€€€~€}€|€|€|€{€|€|€}€~€~€€€€€€€‚€€€€€€„€„€…€„€„€€€€€€~€}€|€{€z€y€z€z€{€|€}€~€€€€€‚€€„€…€…€…€…€…€…€„€„€€‚€€€~€}€|€|€{€{€{€|€|€}€~€€€€€€€‚€‚€€€€€„€„€„€„€„€€‚€€€~€}€|€{€z€z€z€z€{€|€}€~€€€€€€‚€„€„€…€…€…€…€…€…€„€€‚€€€€€~€}€|€{€{€{€{€|€}€~€€€€€€‚€€€€€€€€„€€„€€‚€€€€€~€|€|€{€{€z€z€{€{€|€}€~€€€€€‚€€„€„€…€…€…€…€…€…€„€€‚€€€€~€}€}€|€{€{€{€{€|€}€~€€€€€€€‚€€€„€„€„€€€€€€€€€€€~€}€|€|€{€{€{€{€{€|€}€~€€€€€€‚€€€„€„€„€„€„€„€€€‚€€€€€~€}€}€|€|€|€|€}€}€~€€€€€€€€‚€‚€€€€€‚€‚€‚€‚€‚€‚€‚€€€€€€~€}€}€|€|€{€|€|€|€}€~€€€€€€€‚€€€„€„€„€„€„€€€‚€‚€€€€€~€~€}€}€}€}€}€~€~€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€‚€‚€‚€‚€€€€€€€€~€~€~€}€}€}€}€}€}€~€~€€€€€€€€€€‚€‚€‚€‚€‚€‚€‚€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€€€€€€€€€€€~€~€}€}€}€}€~€~€€€€€€€€€€‚€‚€‚€‚€€€€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€‚€‚€‚€‚€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€afsp]���AFspdate: 2003-01-30 03:28:45 UTC�user: kabal@CAPELLA�program: CopyAudio�loudspeakers: FL FR��LISTL���INFOICRD���2003-01-30 03:28:45 UTC�ISFT ���CopyAudio�ICMT���kabal@CAPELLA�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/unsupported-extension.xx���������������������������������������������������0000664�0000000�0000000�00000000400�14447736377�0022115�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/unsynch.id3����������������������������������������������������������������0000664�0000000�0000000�00000000500�14447736377�0017223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3�€��0TIT2���5��ţ˙��M�y� �b�a�b�e� �j�u�s�t� �c�a�r�e�s� �f�o�r� �m�eTPE1�����ţ˙��N�i�n�a� �S�i�m�o�n�eTALB�����ţ˙��1�0�0�%� �J�a�z�zTRCK�����ţ˙��0�3TLEN���@�ţ˙��2�1�6�0�0�0˙ű �đĆH�����I���� ,����^%Ŕ���˙˙˙˙˙˙˙˙˙˙˙˙˙ĺ˙¬ü  >}GËż˙˙˙˙˙˙˙˙˙˙˙˙˙ňă†5�0}ĺÁ÷Kż˙˙˙˙˙˙˙˙˙˙˙˙˙ş›ůR"JŘ\Ä»˙˙˙˙˙˙˙˙˙˙˙˙˙ÓCĺś‚g������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/w000.mp3�������������������������������������������������������������������0000664�0000000�0000000�00000001000�14447736377�0016236�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ID3����%COMM���W���eng�Promo Only - www.promoonly.com - Distribution of this file is strictly prohibited.TBPM������128TCON������(3)TENC������Promo Only OnLineTIT2��� ���Knowing YouTMED������004099TPE1������Sergio Galoyan f. Tamra KeenanTPUB������RobbinsW000�����lukas.lalinsky@example.com____TRCK������1TALB��� ���Knowing You���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/xing.mp3�������������������������������������������������������������������0000664�0000000�0000000�00000020020�14447736377�0016520�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������˙űd�đu�=�@��€€"ÜŚ`�1€ @Ś�?ËĽN«(ăř|ráü™ür„ďDO xťűK†ŘĄ2â×ěM˛w”±ę3ęŠĹ•Ż™Qv.Ň ĘsRÄÜ„»î$˙űdŹđyA�Ă� 0�#�¸���4�`Ŕ���ś ADYŞa ^O-c7 šE‘­íbíJ!Sw“uk‹örA%5Ä:´=Í´jwË0l%RPÉn@MD] uŘ•Ń˙űd ŹđoA€`�� €0������=� €���ç[ńÚ[6mŃe´s’|ćŐčÖ !ĆĐ)V®+”Ž -Ż.˝XÚ¤¨4ŞĎąđR«[ˇâŻ"[™”ëK• !Îm‹µ˙űdđj�Á€Ŕ�� 0���¤€��<� Ŕ���ŁÚú=ŤĎ|TóV‹‹YrKăç“>ÍŽľńŔpęu1ĹD{·-ŁÖeRa¶7t‹fĆT×bú)JT*˛˘¤vŠ©Űö¸ű˙űdŹđkB�@���0��Ľ€��=�`Ŕ���P•«”Td˙ˇZOÔáz S–¶—GmĚ=F*=)2g—µ˛K¨ĚŤ´ËęY +ci7ŁbŐpý§yÄnďÂ˙űd ŹđdA€@�� `0���ě���0�a����ĺUĹ^´!6˝´2zö)Şü}Hµ˘:ň]Xą7ÚNqíUÇlđ™ąλcjk„´)h{Řech·čľ…*Ěk€T˙űd(đjA€@�� Ŕ0������8€ €��{T:TäVuÜw0őÇQląKőJ©4ĄŤ8Ů'ŠŐŢ‹á†}D9Ž’ĂűÚ<íÚĚ!ŻcW=ńvŇEÖÇF­âčŁbźJ˙űd/đz�Á€Ŕ��  0���Ŕ€��9� Ŕ���\ĄEŇ7i…îęÇ*˘of81˘›×CQIx˘™˛ç°D1ŰÜ,‡Q,<_/§m ±uŇ,ÁV)öŐJȆݕZůkËU ˙űd6đSB�@�� €0���Ě���7€ €��†o*âikP)¤U1u(“1wR+TÔQÔ t­ë»‹–<Ţ» ˇ˘jď2ŔĹű9ÁNâ¸Ő¸ŞŘ„©üąÇ[ÝJĹ˙űd>đlB�`��` ���ś���5€ Ŕ��� ™ŘµŇĨâ3ś`:4\ęĘČ´"ˇbśY Óž¸«"‚0-d/uďŇĄmgučő„ΔšB(Ů‘ńtĐn”¶á˙űdEđyA€ ��  0�#�¸���4� €ŚHG*°ď¨PŽőęŁĚżębŤ7xx¤ĄĘrűŤm…ŞC—ŮMM÷ţ•¦ç©m*Ěşt ę­A±"(BÍŰT†Ą.?8•şE˙űdKŹđ`�Á€@��Ŕ ���ä���:€ €Hm~Ë©µŚ˝›—2 NPĄŽrYĐŞŤ1E…叼»˝ďŤXĄRîZa°éĄ”˝ŞĆ mVî‹ß˛ĘńŰŇ-Cžö8Řş™˙űdQŹđz�Á€Ŕ�� @0���P@�8€ Ŕ���»InÍ űź*™ÂY#V$ś.ú9ŁŻsgnF‘‚ť˘Ě›?ÔşŁbíRä…\ľVkµo’*ŇU(VâćźIi±Ž{˛˙űdXŹđXA€@�� `0���Ř€��/� Ŕ���,Ş`śrŃ˝¶ MŠvĹX÷ˇşú*<Ö>YLzJ1öץĺ/›;Ň ©ą´µ ]&Řu¨Šp‹+¬ČýCî­±¨ §”˙űdbđz�Á�@��@��t���:� €���:D\©ŰŘ=XY‰´zSsW˘ŐÎN‹}x­^Ăw]!F ďUĚFY×­űÚ$FçĐt‡e Q;1¤F÷!-UPYołL˙űdgŹđt�Á€A�ŕ ��Ľ���4€ Ŕ���ĽÍě jČ6VÓ”*{Űź‘8×^ÚűŹÍ(¤ó“rmÚÂ&‹^±H“XîěRőF¬µKŕAý"Դðč"Ďj˘ů#:* ˙űdmŹđv�Á€Ŕ�� €0���„���2�`Ŕ�Ś�‡ĚŻĘŇaŃr-X‡Ę±+84ΕÇúT1±XqĺǸ’Qs›ş‹醥Ă–ݩKe˛+™ Î]ŃŰęSá*c—RŔ¸˛˙űduđuA€ ��@ �"�Ě���-€ Ŕ���|©A‘uĚ�OŃŢ€řom6˛¦1ć«W�´ŕŐŔϨp®„±řłĎ9˝ XÚѵů¶9}ä©ő$í©KSµ<žÓ¸ĺ•‡ŘňB˙űd|đ`�Â�@�� 0���Ô���5€ ŔŘi´Óu ¶dŤČ5µ·'2ÓhańµęąŽż2ąą$!Ä/& Ép˝4  ”¬vÝZÝcŘçÎ9ĚŞf¶r˙űdŹđf�Á€@��ŕ ��¸���;€`@��ŠÝM93b†ĄR˘qĎŚ]Íą(µu2"*+bŐ­ÇŐ?C\Ť(ts’űŞKÍŐ¨V6ńĂ'ŇŰ]9Ú[h;s‚=ăP˙űd‰ŹđqA€ ��  �����.�`Ŕ��BÇď2ĘŔĹEáL“v<ÍíFŤT!ĎőńĘĎ©$%sĎŤmňN›ş—±”´şĹwŐóôzj Ó` LĆ$´Ňúř`Sqcb˙űd‘ŹđoA€ ��Ŕ �#�°€��=€ €���Ë0FŹť?ˇÉxņú^aW+5B.c›HyŁĽVĄçŞ)Bބҩ4U  ňŮŰsYz!㏋Źć]őja{†ë®Öł`6p˙űd—đ^A€`�� ` ��Ľ���9�`Ŕ��p­KP¦ĺ©lw4ŰiĐŢĆČ=Ç [qUJ1*«rv_•®Ą\×V…j”EÚ.ç"íذ°ě†şŽ+Ї lŇ‘ÎÁn`˙űdžŹđdA€@�� @ ��Ř@�=�`€��Ćş#kQŻqĺUĄ)8Yëšă¦ĐşQąIöĺ…Ë4 wšUk’….MÖ RÓüË ¤ĺăÎ5;ßY;R‹ÎäŚ˙űdĄđz�Á�Ŕ��  0��� €��;€ €��� ľ•±ŹE˛жäz†¦QuVüŁTşqW9ަv ^®Ř±•¦}ăN­~HX”ň¸|˛\¤6łŠJŻyyNg0ÉU˙űdŞŹđu�Á�Ŕ�� `@���Đ���+�!����™Íě˛E5ťNb2@m† 9HFÖG.9WlutÉBiÂhU†Ą• ©KÖ­3N¬2‡ 1şo ŰčÎ- #Š˝Í{S˙űd´đfA� ��`0��ä€��3€ Ŕ���zǦć^Tľ©Čkő QÂMIűć(M@@ε°xžsË 4ą§uk=DÇPŇË~ć5ˇ3‚FŇW`ĺTx[©<˙űdşđzA� �� €0���č€��1€`Ŕ���ÁĘŁ“#AMoěc.ĘŞIKnÁč±5P4«Š5+8?em¸×ś·Y˙Ńww¶1śĆqĐ@Ô$ŐŇT)Ůq.…żŠ˙űdŔŹđ\B�`�� 0���¸���;�`€��ąMBśp™*PĽÉ«ÖŠiN¶7ú*Ôd^D|« aţĄíŇź(F~h[ţűzQŻHŞőÁÄÍ­Hi÷Şy…†"˙űdÇŹđsA�`�� Ŕ ��ä���7�`Ŕ��Ezűv˙µ*źS{Ż^Č[byżžŇU ±Šk C'™Ňí-[V¤HVQO?UB‰QQWˇĚ‰M (7fA®pbŲŇä1w”ś Y’˙űdÍŹđiA€ ���0���´���7€`€���ą0“ˇš4ÜB†č4U–­[«ÎdŢă7ű&?Ä%s›Ů’6|”ÚG| Ŕ1/k{&Ńó]iăËĄ÷)G‚hl6>ć6˙űdÔđgA�Ŕ�� Ŕ #&¸€��<� €���Ô(kŃěrčśůqÎt¸)–)ŕG©»§ yňN ĽŃJälz… €¬C†µŞ)Ň’Ęą3* 7Ż©9‡˘x„˙űdŰđrA€ ���@���¬���3€ Ŕ��h«­ą(¨UĆš´›,rµ ÚEËęĎĐĐT7—_۰}L)¶¬!™!˛IŠľä;§ć˙˙đěIĂfw›Ő=pÁ^íS Żß_ú˙űdáŹđo�Á€Ŕ���0���ŕ���-�a����mťWI¦n ž‰¬ŤqŃ­ =gŃë—yÓ+0VĚŞ'LĚ9 (ÖµHs÷oZ‡kklłhžÁ0Ź‚˘î,ĘT>ç˙űdčđ†�Á�@�� �#�Ař���9€`€���«–YĚŽ­ŰüŰ\“fmy$'îĹôŠ@ĂWÔHbF¨b´‹VŔ«yá˘ÚŚqšÁeÜl«¬)É Ég čj’¬˙űdéđˇ�Ŕ�ŕ���c�B(���G�`@�Śz'Ú8jF@,Í Z•Y&î&BrVŽŁI¨Ëĺ킡˙gů×Úó­?ů]´“}vţŹŻwóŮo:-Ď[<R±`ŕ˙űdćđyA€ �� 0#8�„@�8€`€��dI›*Tčµ Ř’@’Ď„ę(ęĄ!“µrP•Ăůé:ŤtTPŔU[Ňó‡Đ°ęuÍ~ě&$>‡8V°Jč˙űdéđˇ�Ŕ€Á ���Aü`�?� @±‡1i2™ŠŢi¶y‘/Żé9µqř]Şé·“ŽUB ˇLË™8bF@˙SXÇ2Çr¶ýË«wŞą~xÓyĂ˙űdçŹđŤ�Á�Ŕ��  ���°���C�`€���wlxš:i×LĽď)ž®­˙_Ęöą d(ĐŰfcĺSIKiŇÚ†ť&ç”á=AďÝ׳mŐďúR˙©_|(eô»˙űdčŹđś@€ �Ŕ���B<@?�`@�Ś�tÝĎŇý ;LôéíĹĹ&„jÎ˙µV©ż˝řŽ÷ę‘yŹ#<NjkŤß’ż“»nř¨_hˇőť—=Vç¦L–cZÖ$C˙űdçđ}�Á€Ŕ��  #&P)D€D€`@��R]sźq%­kÜÖ˘Îü9źč›KŞŮËĹűÝ—Eŕń~ AÓűű•<‰”ÍtÖ¨“›óAÝä…Ą/4ZzM©K·˝,z¨2˙űdçŹđŠA�Ŕ��ŕ#8„@�?€ €��ĽäË˝±Ë{é¬<l|Ť?hu>öř˙˛3|2m‰×bÎb6ST™Ă™ vm <˘eÍ(d6äÎĐë>*ÇL…˙űdčđ�Á�Ŕ�� ���B\�@H€ŔŚŕxĽűĐ(Ĺ'‰ěp±(Ĺ ţ—iĘÔĎŘ^ů¶íŻôZîYÍNF 9Î<Ŕćo!’˘dŘ}µ˝ę­ŐT\e-B´˙űdćŹđ‰A�Á�` �"�`�A�`@��qA!öÖ€şř€űŚö(–ĄÎ}’íyłĂ V4<×Gtďăâ3yM{G¤×»Ű÷ďżĐďk+:ĄĄílgĎ%M&˙űdçŹđwA�Ŕ��Ŕ #8\€�L� @Ś™ĄŻ—v틨Ü˙>ď5Š Ö^çA×)¬xf.łŹpň蕺”n÷Jšk”*X|­Śukť–°h}®&Ę˙űdćđj�Á�Ŕ��  �#�P„`H€`@�?”ú˙íŻîžl5=ŁF’Č÷Ťö©ű93/`¨đ˘t¬Ižiő&‡4ŕ͇śÓaQŘr¬Ë__˙á{™˘ÖP’Éýď®˙űdçŹđ’�Ŕ€Á � #8AĚ`�4�`ŔŚ�,1{ o:+Őiůle.YnĘ ľýţB¦Ąâ)ÎVdąř¨V2R.Éyă˸^ńďXĐ÷-üßsëĹĎţÖgĐŃĘżQ¶Ţ˙űdéŹđź�Ŕ€Á`��AŘ€��:€`€���ŕkíĽŕÜrüFRNú´;vuéHŽeč8âC§-6*ôŻI·ťlxH<+śˇđ˝lq÷“L°|貔p9—r»KÖظˇ˙űdéđź@�Â7đ#$Č �E€`@��čÁ˘;ڍ}őŢLđPF‹Í‡’ ňc€ŹŚLµcZö˛F«±V¦S:™ęVúޛà ‘:4*©ÔĎ&⬏m@ç˙űdčđ–@€ˇ`��� €��C€`€��.Ź]ýPËňűťÍÚí iËüµUĂM2¶°s™ŮTŁ0óq ‡ęĄ i0ś0+&©ctdC˝´4„dYö´hQĚ"–źŹ ˙űdçđŤ@€Á�ŕ���B ���G�`��Ś˙ÉFeőˇÚ»źĚż÷öUU |„[ő,a›©ŔÂĂRmj"lŮÁ Âţˇ2‹<7Hôˇ[2¶w2ÄŠ<ĺŇuJ˙űdćŹđ‹@€ˇ�@ #8���I� @��ĹÂN*Ná‡ĎĂe‰´ű©<Ť}’Ů^qG_÷˝ŻQ˛.î/MËĂÖáy’źťů};(˛Bäs.&RЬ˙űdćŹđ~�Á�@��Ŕ ��8��N€ �Śác…¸Î]űZ˛çüçxŮ)őjmŠ6…ÓöDäśňşleÎ(At:Ą w‹¶)SEŠt4\9ô5h{…Ž»śuOAěQ !˙űdçđmA€ ��� #8h��H� @ ™»:®IőgŢ‚©YęY;‹áő* Ł}ܶę˙l˙Iîr.;Wµw¤™{ŢüĽF=/ł› ›íëëŇ=ÔáÉMCşä˙Ű˙űdçđŚA� ��  #$ ���I� @��µöÇeőG˝†&›/ň§jĘď7µ Ş(Ęš_](y¤9 “bË(Ë“÷.ăhˇRěSâˇ‹ë ” k>,Fó Xöjq•PlŁ˙űdćŹđŚA� �� €0���T€��J� @��Ö&ŠTÖ´w&ŤigE”•›2lôśď¸]âűHkĹĹçuąuĹ%Ô‰4€5™ŘÔĽx„¨©ęŮ™,ŁëY˙űdćđ‡�Á�Ŕ��` �"����F� @�ÇŠ(ĂĘžŞÁšPm—¨šUF­¦@î“*v•ˇđ·JąĎ˙C†±ˇŹ7öýwl;´x`v'.X÷"e©gŚ8‡1×˙űdçŹđŹ@€Á�Ŕ"8Č€��D€ @���®.†Ąo&•SdÉ­Ąő"…Ę+Ť]"€'®×ˇéyh ...úÄlŐP¤ÉĐâ)C>·AXĂĹSj”Htˇ‹XČ˙űdčđ—�Ŕ�ÁAČ�#&B$���F�`@�ŚÁÁ—!aÎş^YĘ%°«ŐϵC“(µ [“uB7ąkCbŢ]Ej)Zy işA&ˇ=*ŕ—śÇ˙+i°˙÷sO‘’˙űdćđ~�Á�Ŕ��� ���D����I� @��ń¦ýRü–<Żí›6ÚN-Ţý/ŘßŰ€łŢ÷;,ďť?'jYMÝóŔĘBńBŕŦđÇČ^ˇ’OJV¨ięéMÁĹ˙űdćđA�ˇ 0���\€�J� €�Ś«×qnat9B† QzU ˝.*4¬ąIrô©ÍäÁ9<ďu•Ś÷źÇöoĆf–~üu±b+¦<†É”­CÔô-);O˙űdćđ~A€ ��@0��€��?€`€�Ś�€HB\ě)KÓmUE‰Ş ¦˘Ěm盡 ˘\Xc¨U©)ŚRJbłČQ‘"…Ů\(<:ő§>ŢÎX(äY_eµ—ţýŠ˙űdçŹđ…�Á�Á�` �� @�E� €ŕős­ëâ-^×8›ţyČsţKĐëŐ!âqV d:Ż‚đ@(BRĄ)Ź`ë7,ŔäsÝ8¤ŽCaf%&ˇ\ÓM Ň™¦¤řń˙űdčđ“�Á�Ŕ��@��c�B$���<€`€���ěR[O*YŐ+©áT9Š<µ„Ě�vĺ)™iů‹Wj×+něyí÷¸uôkš1朗˙k8Ë;,k«v»Ż}ť¬?9_l˙űdçŹđŹA�Ŕ��€ ���$���E€ €ęrŕ>Ol˙]ÚąĎ˙~»ö¤‰ *–ĄÎzXA‚×µ. JE­ń–”§LBjÔŠm,L> ź˙G´{żˇz‘M÷Ő3Ő­7˙űdçđ}�Á€@��  ��p`M�`�Ś"o㯉wČ™6ďĚsŁâ×Úzűń}Ű ›KĹfć¨( SIsÝĽńł`v­ÓlYAˇč‰&Ў«P]Uâ“éĹEÇ.®˙űdćŹđŽ�Á�Ŕ�`#&ŕ€��@€ €��mţď™F mô|öMmáQ7żRč;A-ŢĺEkDŁźEÚ»5Łúç[îtŽjwSźţ˙˝hCbŽI±ű‡ľ×8Í_BĹ˙űdçŹđŚA� ��€ ���B @�D€`@Ś�s+;)É˙ĺ3gÓ­DďîŞ ăo\ŤkxFaęe‹E`Píjóti§kă™Č˙Fiąż¸J¨őĽr źhĄ­qŽqZŞU˙űdçŹđA� ��Ŕ���P`J€ @Ś™\t-»öÝű{µßonAĹšř[Z©ězw°šŇÚí] ű)SóL"Ň0_:yŤ?RÖƤp˝o%–ľŮoŢwľřëxůRä‰i˙űdćŹđŠ�Ŕ€Á�ŕ ���(@�@€ €���;Ëío-•ć)żdꦾ®y2U”° ˛zB‘fśQ÷• őÔ˛¶H׹'Ô¶0‘,őÓfŁGŠ6RĚ™řT“śTRŐ7¨Ď˙űdçđ@€Á�� ��BD��H€ @��9 0üvP‰W6A›N˘ĄŔuŚ‘ÝéýÜf—żÁĆm( Órî·†ť-íÍx5Z˝ĚuÄÔY#¦€nÂʽ̎b@˙űdćđA�@�� `���8€�L�`@��“ádŹ�ĄbĘDăÉ-€‚Š|r$$X„˘JPő-ČYČ“2µ„Ţ9­>äI¬T7bćŤĚkČŹĆ)J:u˙űdćŹđ�Á€@��@��$���I� €��jAĂ/¨._ZŇ0ŕXY—\§©JĆ5ŠĹŇ*ck ŤqΕ°k73}ŻMUü±ßí—ýߺǨQҒ𠶸XŞ —˙űdçđuA€Ŕ��Ŕ ���Ař„@�H€`@�Ş=ťk!·gö\Ô/d,fú†g‘19Ô­ <µHÔ,!y!ş˙vŕp±"v1b€I€íýnüMööósŮw>¦×żýt˙űdçŹđ…�Á�Ŕ����"�B @�H€ @�/úMcÔ2Gń~­MýŹ ÂPçýřńjÜÖĹ]Ţ4iu´`pAP˛B]1±é/Ř75A�ÝR%QŤŢ€š<ŃÂŹxUë˙űdçđpA€Ŕ��Ŕ @�p@L€`�Ś Ĺép¸ĘŕvĎ8ů…Ťb*Ó˛yĂŔ NöĐöŽCĐOĎŁRcŤ”â;oýoµşĆAÝÔ¤Ě}Łš8sg^Xj_±˙űdćŹđŚA�Ŕ��Ŕ �#�Đ`�?�`@��#‘iÂ2€V´t–2“ŹKÚ…¦°Yas$Aık9ö©ÚĘ )g/«0÷ŃţîwÝG_Ý5Üt‹aúÇ ŁŠĄc…Ş6„Ö˙űdčŹđ—�Ŕ€á@đ#�B$„`�F�`@Ś�ˇU!ĺ.=—±Śj©]ę| ów‚8Ü[·e)»l^Žźl‰IĆDp›U’UrŃÓŁ+UŃ­óŚ3†ŔŠľ5e)r7ąË6<óÜ˙űdćđŠ�Á�Ŕ��€ "�€��E� @��yOóĺ´Xing����B@�B@����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/zero-length-mdat.m4a�������������������������������������������������������0000664�0000000�0000000�00000010645�14447736377�0020732�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000��������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ftypmp42����M4A mp42isom������Mmoov���lmvhd����Ô>Ŕ—Ô>Ŕ—�_�‡Ö��������������������������������������������@��������������������������������<trak���\tkhd���Ô>Ŕ—Ô>Ŕ—��������‡Ö���������������������������������������������@�������������Řmdia��� mdhd����Ô>Ŕ—Ô>Ŕ—��V"��`�UÄ�����4hdlr��������soun������������Sound Media Handler���|minf���smhd�����������$dinf���dref���������� url �����@stbl���lstsd����������\mp4a���������������������V"�����8esds����€€€'���€€€@���`Č��W@€€€VĺĄH�€€€���stts����������������(stsc����������������������������tstsz�����������������ó���l���e���^���Ą���¦���u���^���u���|���p���e������ť���ť���~���r���|���€���§���ś��������stco���������}�� O���ťudta���Ťmeta�������"hdlr��������mdirappl�������������_ilst���0©too���(data�������Nero AAC codec / 1.5.4.0���'©nam���data�������Sine wave 440Hz���Xtra���free����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mdat���������Đ@­îA\����8�äš8>ODßDŘ‘łI뤇  ˙ţťë8)ďwç˙íżďŇ'µÝß˙޵‡ůhh€@Ń�˘D  4 HHOĘ~Sňź”ôÓM4ÓM4ÓM1¸‰‡ňoâ6ç’‡ŠÜH"DŇ NV6 Kx^K€·›­ĺ)çžyçžzéŻ}Č�úäĂé‹íp.új˙×ĺŻÜÚCëę+/ŐhZ¤·őłh’Ş'Y&šJ’ŮśQ żźźd`<ţ}t0F*§®ČčŁŰp�ĆůOqöDfěc@ŹKÓNskFi(kŃťÔ����+ďT�ŕ>÷Ö–("¨wäWN­ń«üZŰXÉĹÂ?ŕ'}ýáÉđÔÔÔ´yG†ÔuÉeőAÉ ä,~î­M:–™´Á`®–”® Ž8âĚîîâŃTńL' "E+­·J…%�Ä€`Â80�€7@ B €D@>¸â™[jCÁ-Ä(—ňŹ—ţ·żÄőśö±»{Ş <łËŐÓ,ň–yg–yaaaaaP"6«[…KŞÁ­2(!RbߥV�tc`�760 !�€B ˙EŞ‹mc8#Ą¨düőľ%űłóá ÎZÂjG’´ěÓłNÍ;4ěÓłNÍ;%žYĺžZ%žYĺAFrő “T \3€‡ă!��`V�560 *íĺUśůśŻT)%‘ď\L‡ä_ׄ˛ rl|¸¸ŃJ';CťˇÎ­®­Ť4[äľóäľi¦üďůş/Ý7٦ši¦šd“o§&ši¦ši—4Ř.i¦\Ó`·ši°^a2Í'˛7´cłdöčýٱmɧËhÝj¬N“ł\D]4Đ~$âQ2Ë-ĆËŻÖä{méałV�t`€.`�560  Iü©S9ťd–J -$Ľ#ćr™ÁąÇB©čČ'…ÄĺXśU†zv9¬sVĘU)TĄQ“D”I@ŔŔŔß«hc`ŔČ‘DoŠ ĺŞË–)•Łă(ć@…¨źš¤e2?"8€+´Ţ…gŤU5bťQ®™÷Ą§ ~bŕü!§Nţ»Ä%Ŕć´/TĐíHţ‹3hĐ8�� `�ŕ&560 $Š& �"!˙2\Ў�A.Éu2®řöI[/d<(S]5Ó]5Ó]5Ó]5Ó]5Ó]5Ó]5µfLFFüď<óĎ<óy䥏0&”ŇH0sLĘ­Şść I`k á NaJHCN@uÄ� 79 Ś �„ @úýĺ{ÜKĐ‹mC8#™ă.2Cň‘=ߊ‡›ýď}(­ýë=íýíű x0ŕžyçžyçťJRiÔ ŞEr$„N!tĐ!Ů`Ó P] ŔŔ&760 Rţ}Ü)Ŕ‰ŰĆpaDń=`—ź~E>×­Ž/źËçeÖ]eÖ]eÖ]eÖ]eÖBÂÇĺ8@u3�$ "¬„�•Ó¬AX®L*hŕ˛@EČ%4ÜPvëIY]���,�&760 RýxÎd<€kmHc8.)!·ĺä~7| '=*•\@Ë<łňřů|rĎ,áaaaaaaaěť ľ€pD˘ĄćDrĐ)5kČeÖ±h€îXw\.Ad/tcŰß*UËf÷ ®�+©�Ak�2760 LŻű÷,§˛-µ!ŚŕŁâx9伻ĂČRôwÂňľżŻĆYĺžYĺžYĺžYĺ‰g–<đ$U�šŻZÖ4*nNŚ —$;¦wĚ!^ë…ČČNp€íŇ#Ł@ŕ�€762 Ś €D@?sŇÖŕ…¶Ä!ŇĆ ŹÍŽCűizp—iĹKśÖ€ňKăâăâăâă˝~őűÔQEQEP`Zµ X^"Ŕn.”V®q Z�ŃQ€�&560 $Ž-ó%ÄLˇŔÉpÎ�Oć× ÍÂËiU,$šI¤šI¤šI¤šI¤šI¤˘I¤šIť¤˘Ižj¦ËQEQEH! HŠ(“ UU5!P¤¤ąQž ęn+‰xP=”˘µP"W0ą$$Ş4�� �Ŕ�8*560 ŠHţa‹2´ !H ŔŽO‰ő‡®I+ćŠ ¬ś¬ś¬šŞ›Ş4¨µF“8×Kµt×MtÖŐłłĚěţO§ź›ßO=o}9ÝÜÇXĆ<cĆ{Î62R|'ÁžkIßZrśĄ)ĘÎ{pç¶9ńfĘҲŢ{ ËgJQ<”éşÖgJ“Y[&të×÷Ó P]€�Ŕ 560 $”*í­URŰ.]PŇd˛>I'ęO»äUĚľ](Á]5Ó»^í~wźÝ»_+íľŰí;NÓ#¶ňľÓ##žyçťSΩÔyçžyçžp©ŐÔyΩΩÄęťJťGž—ľńľWľŢwSµ7äŤ7×ýµ)v˙iKUu.4yi &MńŤŻô‹ ší\—Šńë–Ą/Ł@ŕ�� €€.76' B�…`@˙ô¬É „[lCÁÄLü–çҵ¦'ď¨G/‘ËŇiőr%Č–‚h&‚hB‚hB‚h&„*´ťf�?Żh$]| / Áe§Ťr·¨@'Rő\ËA¬©j&U2şéC®N—«¦ť€ č@,�@760 (Š�‡Ç˙3Ä´pUD«[jC8 (¤sÚúŚ™Äp t)ЧBť�ŔŔŔŔŔŔŔŔŔÂËčŮDVHŮ,#o€­“žJ‹NĹ™¨µbd eť ‘@-ç3n]űggM��0� 760 Rü»ă!ÂÂQ¶Đ†0#ĄačýX—ŕ/ä Îfř>WN®ť]:şd°±,ňΰ°°°°±ůBI Ő¤•ŻH/p@% “ RdÍC*µťä¦F% •ÂAĐ D^j’ý5XiĐ(�®Ś`…0�ŕ760 PýUY ĘkmHc8)f<đŇ?şďTÜă%Ü&§x/źĚçó9üĚüÍe}dx‘âAdńdAo›@b�ôR("µ�ˇ\* łPŤ@â.–ÎZ*Ń0™Ná§eÎŇürß{®ť��@Q€�"560 C5Źůó•&sç¸áA ˘T8‰t-Y?ľ>C#zÔ· ňYQcE+7E›˘‹]5čÄ•zů%E~)O>𥗡—ü˛Ë,˛Ë,˛Ë˝u2™7,˛Ë*8˘F1H ˘+“„!y ęŕ…Đ„/^űcOG?WĚ©Iłŕ˘ěkÓ ”7bî”6ná N„f¸4ʍpěŢäÁ�uÄ`�ŕ.W¶ÔČ!„ýŰŃóÓŰŕŇ,RÖÚŠń]–Yd–;)Í!ÜÁë‘ĹšÔŚaµÇ @ařź!^‘ ‘ČBi÷Ső˝Ź±ó7M«¨Fĺ±<EĆ~ş$żÇř‹ç÷?Ć…¸@ŚV± "DX‰†ĹÖDClČ–°&XŞČÂ1ŚŤ€"� �0›ĘÝD#mÄr“! ˇN˙륗z·đ>šÓ˙é?ćęƸşüŽžŢË4@ h€@Ń�˘Cv˘h€@Ń�‰&‘RÁŹ6Jk'„„S>Ąř÷â1†ű±­hě)hš†\očYO]Çr+Nˇ{žŤ¬żS>ÝKŽk©ůL©jŚ©4¸—~4ö©vYş‡ţXuW`ţO=l?—ň·źůâŽŔĂüĄŞŘlČu‰H~ŕŚ%đÝD2q6pЦŞbLZiE čĽP ‹%ty‡'S|ÔeÓć+›ѵT“WÖMšµU׆â9! ĺĘç¦M ¦âQjë#ŘvE4˙”ýo ™§@ ş0@ €€�Đ÷ď[gü|}Ł@€�0€�������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/zero-size-chunk.wav��������������������������������������������������������0000664�0000000�0000000�00000002000�14447736377�0020704�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������RIFF���WAVEfmt �����D¬��±���data������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/zero-sized-padding.flac����������������������������������������������������0000664�0000000�0000000�00000011124�14447736377�0021465�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������fLaC���"������ ÄBđ�zŔˇ±A÷f鄚ĂŰ0˘ <w�(���������TITLE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX���˙řY�k������Š˙řYl������‡˙˙řYe������ľe˙řYb������)˙řYw������ÍQ˙řYp������Z$˙řYy������cľ˙řY~������ôË˙řYS������+9˙řY T������ĽL˙řY ]������…Ö˙řY Z������Ł˙řY O������öâ˙řY H������a—˙řYA������X ˙řYF������Ďx˙řY������gě˙řY������đ™˙řY������É˙řY������^v˙řY������ş7˙řY�������-B˙řY ������Ř˙řY������­˙řY#������\_˙řY$������Ë*˙řY-������ň°˙řY*������eĹ˙řY?������„˙řY8������ń˙řY1������/k˙řY6������¸˙řY ‹������ţF˙řY!Ś������i3˙řY"…������P©˙řy#ż������XE��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/data/zerodiv.ape����������������������������������������������������������������0000664�0000000�0000000�00000001662�14447736377�0017316�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MAC –��˙˙�� ����”���¬���ŘTc���������G‘óđ`#g¬eWîj|Đ��� � 2��%�@���D¬�� ���bŕ�ĆÉ�Ł© �“ŠŤ�ĎI�¶�ýţ�ĐÓ�~ˇ� g�č5!�ë$�†¬&�†H)�´,�?č.�đ…1�xµ3�n&6�łú8�¨Ú;�*»>�ünA�4D�ĘG� óI�T˝L‚‰O�›VR�0MU�âíW�~„Z�ă1]�})`�ôb�RIFF¤Ę˘�WEVEfmt �����D¬��±B���data€Ę˘�•ÂNŢ �~æ+ić•!\rÉú 2‹-ČÓ Ě~x‡ÜFŔm¬˝•ç0‡0±ăPcy ŕę kj»ń'@ií¤ľ› CŢűłb"ň Cüҧś×`Çw|ľčŹ–¨¸S|Ľbă-â N5—u}™i2C¶ŽZşŰę1‘°nPçzSˇŞşe”ŕľż:×Ú g_źíMnÎ÷©<���¸é2Ú%y1Ţ®yp }šÚîËQă^7¸˛Kzw˘éâ«ëŮV([6SĘ÷!YHh{ ölj:´áëüś<ń(eťË±çHKÓý=+đmRÔq)<‹Ŕ­ }ÁŮÍ÷´J'l:uďm5  î‹<OŹł˙QÄÎĽ‚őŢs(5‰mÇL•ÓąĚi(ąe+ꨔ™s żËÄčá<šu0AéřÖNb9íS‰Hërj1AÉ 9J‹]Ăbîěď/śS ´Ćţ_ľV‡üówÁQ&çš„¤7' üa&N…9ÉČh˙ŚČ3Í •<_i΋!)ş6Ä`s˙&°ćç{··ó íËf3H`W›˛°IŮűť Č —˙˘˙/R¤ŽťńŢÂpŹ«°D2Áďs‚Uh’Îă­3^8AA�|@ő0°Sýäb…aQť::·pýúśĘ †76j Sş8zŦ7Ý4zŐf7őţV¨ł›B…ŽŽë„g¶+€ldDHŤš_A˛T“Ďě´HZvuěHÍłćş|Ś˛Ű K|Ó|ł0(›|ăź^´Ľec497‹ gÝgÝϨ­8ru:EVéž›L—ö§]ŕ�mŘ×®má u…čÎćm¶ăŽŰfĐr)Ŕő;DŇ™Xäď_ť������������������������������������������������������������������������������taglib-1.13.1/tests/data/zerodiv.mpc����������������������������������������������������������������0000664�0000000�0000000�00000000625�14447736377�0017326�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MPCKSH•úÁ‰‡D�€������Album�BaHlads�������Artist�just for test�������Gełre�Ballad�������Title�mp�������Track�1����������Ti[le�d� ����c s…8 est with˙˙˙˙s�����ë�Track�1�������Year�?000APETAGE_Đ��©��^tack�1�������Year�?000APETAG)flad6� �����T�le�d� �����[i[le�mpc s…8 est wit˙˙tags�����ë�Track�1�������Yeaü�?000APETAG)_І��©������€��ac\�1�������Year�?000APETAGEXĐ��©������€��€������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/main.cpp������������������������������������������������������������������������0000664�0000000�0000000�00000006673�14447736377�0015673�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <stdlib.h> #include <string.h> #include <fstream> #include <stdexcept> #include <cppunit/TestResult.h> #include <cppunit/TestResultCollector.h> #include <cppunit/TestRunner.h> #include <cppunit/extensions/TestFactoryRegistry.h> #include <cppunit/BriefTestProgressListener.h> #include <cppunit/CompilerOutputter.h> #include <cppunit/XmlOutputter.h> int main(int argc, char* argv[]) { std::string testPath = (argc > 1) ? std::string(argv[1]) : ""; // Create the event manager and test controller CppUnit::TestResult controller; // Add a listener that collects test result CppUnit::TestResultCollector result; controller.addListener(&result); // Add a listener that print dots as test run. CppUnit::BriefTestProgressListener progress; controller.addListener(&progress); // Add the top suite to the test runner CppUnit::TestRunner runner; runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); try { std::cout << "Running " << testPath; runner.run(controller, testPath); std::cerr << std::endl; // Print test in a compiler compatible format. CppUnit::CompilerOutputter outputter(&result, std::cerr); outputter.write(); #if defined(_MSC_VER) && _MSC_VER > 1500 char *xml = NULL; ::_dupenv_s(&xml, NULL, "CPPUNIT_XML"); #else char *xml = ::getenv("CPPUNIT_XML"); #endif if(xml && !::strcmp(xml, "1")) { std::ofstream xmlfileout("cpptestresults.xml"); CppUnit::XmlOutputter xmlout(&result, xmlfileout); xmlout.write(); } #if defined(_MSC_VER) && _MSC_VER > 1500 ::free(xml); #endif } catch(std::invalid_argument &e){ std::cerr << std::endl << "ERROR: " << e.what() << std::endl; return 0; } return result.wasSuccessful() ? 0 : 1; } ���������������������������������������������������������������������taglib-1.13.1/tests/plainfile.h���������������������������������������������������������������������0000664�0000000�0000000�00000004360�14447736377�0016346�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifndef TAGLIB_PLAINFILE_H #define TAGLIB_PLAINFILE_H #include <tfile.h> using namespace TagLib; //! File subclass that gives tests access to filesystem operations class PlainFile : public File { public: explicit PlainFile(FileName name) : File(name) { } Tag *tag() const { return NULL; } AudioProperties *audioProperties() const { return NULL; } bool save() { return false; } void truncate(long length) { File::truncate(length); } ByteVector readAll() { seek(0, End); long end = tell(); seek(0); return readBlock(end); } }; #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_aiff.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000013417�14447736377�0016705�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2009 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tbytevectorlist.h> #include <aifffile.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestAIFF : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestAIFF); CPPUNIT_TEST(testAiffProperties); CPPUNIT_TEST(testAiffCProperties); CPPUNIT_TEST(testSaveID3v2); CPPUNIT_TEST(testSaveID3v23); CPPUNIT_TEST(testDuplicateID3v2); CPPUNIT_TEST(testFuzzedFile1); CPPUNIT_TEST(testFuzzedFile2); CPPUNIT_TEST_SUITE_END(); public: void testAiffProperties() { RIFF::AIFF::File f(TEST_FILE_PATH_C("empty.aiff")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(67, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(706, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(2941U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isAiffC()); } void testAiffCProperties() { RIFF::AIFF::File f(TEST_FILE_PATH_C("alaw.aifc")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(37, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(355, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(1622U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(true, f.audioProperties()->isAiffC()); CPPUNIT_ASSERT_EQUAL(ByteVector("ALAW"), f.audioProperties()->compressionType()); CPPUNIT_ASSERT_EQUAL(String("SGI CCITT G.711 A-law"), f.audioProperties()->compressionName()); } void testSaveID3v2() { ScopedFileCopy copy("empty", ".aiff"); string newname = copy.fileName(); { RIFF::AIFF::File f(newname.c_str()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); f.tag()->setTitle(L"TitleXXX"); f.save(); CPPUNIT_ASSERT(f.hasID3v2Tag()); } { RIFF::AIFF::File f(newname.c_str()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String(L"TitleXXX"), f.tag()->title()); f.tag()->setTitle(""); f.save(); CPPUNIT_ASSERT(!f.hasID3v2Tag()); } { RIFF::AIFF::File f(newname.c_str()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); } } void testSaveID3v23() { ScopedFileCopy copy("empty", ".aiff"); string newname = copy.fileName(); String xxx = ByteVector(254, 'X'); { RIFF::AIFF::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); f.tag()->setTitle(xxx); f.tag()->setArtist("Artist A"); f.save(ID3v2::v3); CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); } { RIFF::AIFF::File f2(newname.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)3, f2.tag()->header()->majorVersion()); CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); } } void testDuplicateID3v2() { ScopedFileCopy copy("duplicate_id3v2", ".aiff"); // duplicate_id3v2.aiff has duplicate ID3v2 tag chunks. // title() returns "Title2" if can't skip the second tag. RIFF::AIFF::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String("Title1"), f.tag()->title()); f.save(); CPPUNIT_ASSERT_EQUAL(7030L, f.length()); CPPUNIT_ASSERT_EQUAL(-1L, f.find("Title2")); } void testFuzzedFile1() { RIFF::AIFF::File f(TEST_FILE_PATH_C("segfault.aif")); CPPUNIT_ASSERT(f.isValid()); } void testFuzzedFile2() { RIFF::AIFF::File f(TEST_FILE_PATH_C("excessive_alloc.aif")); CPPUNIT_ASSERT(f.isValid()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestAIFF); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_ape.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000022453�14447736377�0016545�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2010 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <apetag.h> #include <id3v1tag.h> #include <tstringlist.h> #include <tbytevectorlist.h> #include <tpropertymap.h> #include <apefile.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestAPE : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestAPE); CPPUNIT_TEST(testProperties399); CPPUNIT_TEST(testProperties399Tagged); CPPUNIT_TEST(testProperties399Id3v2); CPPUNIT_TEST(testProperties396); CPPUNIT_TEST(testProperties390); CPPUNIT_TEST(testFuzzedFile1); CPPUNIT_TEST(testFuzzedFile2); CPPUNIT_TEST(testStripAndProperties); CPPUNIT_TEST(testRepeatedSave); CPPUNIT_TEST_SUITE_END(); public: void testProperties399() { APE::File f(TEST_FILE_PATH_C("mac-399.ape")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(192, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(156556U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(3990, f.audioProperties()->version()); } void testProperties399Tagged() { APE::File f(TEST_FILE_PATH_C("mac-399-tagged.ape")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(192, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(156556U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(3990, f.audioProperties()->version()); } void testProperties399Id3v2() { APE::File f(TEST_FILE_PATH_C("mac-399-id3v2.ape")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(192, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(156556U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(3990, f.audioProperties()->version()); } void testProperties396() { APE::File f(TEST_FILE_PATH_C("mac-396.ape")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(162496U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(3960, f.audioProperties()->version()); } void testProperties390() { APE::File f(TEST_FILE_PATH_C("mac-390-hdr.ape")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(15, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(15630, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(689262U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(3900, f.audioProperties()->version()); } void testFuzzedFile1() { APE::File f(TEST_FILE_PATH_C("longloop.ape")); CPPUNIT_ASSERT(f.isValid()); } void testFuzzedFile2() { APE::File f(TEST_FILE_PATH_C("zerodiv.ape")); CPPUNIT_ASSERT(f.isValid()); } void testStripAndProperties() { ScopedFileCopy copy("mac-399", ".ape"); { APE::File f(copy.fileName().c_str()); f.APETag(true)->setTitle("APE"); f.ID3v1Tag(true)->setTitle("ID3v1"); f.save(); } { APE::File f(copy.fileName().c_str()); CPPUNIT_ASSERT_EQUAL(String("APE"), f.properties()["TITLE"].front()); f.strip(APE::File::APE); CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); f.strip(APE::File::ID3v1); CPPUNIT_ASSERT(f.properties().isEmpty()); } } void testProperties() { PropertyMap tags; tags["ALBUM"] = StringList("Album"); tags["ALBUMARTIST"] = StringList("Album Artist"); tags["ALBUMARTISTSORT"] = StringList("Album Artist Sort"); tags["ALBUMSORT"] = StringList("Album Sort"); tags["ARTIST"] = StringList("Artist"); tags["ARTISTS"] = StringList("Artists"); tags["ARTISTSORT"] = StringList("Artist Sort"); tags["ASIN"] = StringList("ASIN"); tags["BARCODE"] = StringList("Barcode"); tags["CATALOGNUMBER"] = StringList("Catalog Number 1").append("Catalog Number 2"); tags["COMMENT"] = StringList("Comment"); tags["DATE"] = StringList("2021-01-10"); tags["DISCNUMBER"] = StringList("3/5"); tags["GENRE"] = StringList("Genre"); tags["ISRC"] = StringList("UKAAA0500001"); tags["LABEL"] = StringList("Label 1").append("Label 2"); tags["MEDIA"] = StringList("Media"); tags["MUSICBRAINZ_ALBUMARTISTID"] = StringList("MusicBrainz_AlbumartistID"); tags["MUSICBRAINZ_ALBUMID"] = StringList("MusicBrainz_AlbumID"); tags["MUSICBRAINZ_ARTISTID"] = StringList("MusicBrainz_ArtistID"); tags["MUSICBRAINZ_RELEASEGROUPID"] = StringList("MusicBrainz_ReleasegroupID"); tags["MUSICBRAINZ_RELEASETRACKID"] = StringList("MusicBrainz_ReleasetrackID"); tags["MUSICBRAINZ_TRACKID"] = StringList("MusicBrainz_TrackID"); tags["ORIGINALDATE"] = StringList("2021-01-09"); tags["RELEASECOUNTRY"] = StringList("Release Country"); tags["RELEASESTATUS"] = StringList("Release Status"); tags["RELEASETYPE"] = StringList("Release Type"); tags["SCRIPT"] = StringList("Script"); tags["TITLE"] = StringList("Title"); tags["TRACKNUMBER"] = StringList("2/3"); ScopedFileCopy copy("mac-399", ".ape"); { APE::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); CPPUNIT_ASSERT(properties.isEmpty()); f.setProperties(tags); f.save(); } { const APE::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); if (tags != properties) { CPPUNIT_ASSERT_EQUAL(tags.toString(), properties.toString()); } CPPUNIT_ASSERT(tags == properties); } } void testRepeatedSave() { ScopedFileCopy copy("mac-399", ".ape"); { APE::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasAPETag()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); f.APETag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.save(); f.APETag()->setTitle("0"); f.save(); f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.APETag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); f.save(); } { APE::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasAPETag()); CPPUNIT_ASSERT(f.hasID3v1Tag()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestAPE); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_apetag.cpp�����������������������������������������������������������������0000664�0000000�0000000�00000015701�14447736377�0017237�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2010 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tstringlist.h> #include <tbytevectorlist.h> #include <tpropertymap.h> #include <apefile.h> #include <apetag.h> #include <tdebug.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestAPETag : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestAPETag); CPPUNIT_TEST(testIsEmpty); CPPUNIT_TEST(testIsEmpty2); CPPUNIT_TEST(testPropertyInterface1); CPPUNIT_TEST(testPropertyInterface2); CPPUNIT_TEST(testInvalidKeys); CPPUNIT_TEST(testTextBinary); CPPUNIT_TEST(testID3v1Collision); CPPUNIT_TEST_SUITE_END(); public: void testIsEmpty() { APE::Tag tag; CPPUNIT_ASSERT(tag.isEmpty()); tag.addValue("COMPOSER", "Mike Oldfield"); CPPUNIT_ASSERT(!tag.isEmpty()); } void testIsEmpty2() { APE::Tag tag; CPPUNIT_ASSERT(tag.isEmpty()); tag.setArtist("Mike Oldfield"); CPPUNIT_ASSERT(!tag.isEmpty()); } void testPropertyInterface1() { APE::Tag tag; PropertyMap dict = tag.properties(); CPPUNIT_ASSERT(dict.isEmpty()); dict["ARTIST"] = String("artist 1"); dict["ARTIST"].append("artist 2"); dict["TRACKNUMBER"].append("17"); tag.setProperties(dict); CPPUNIT_ASSERT_EQUAL(String("17"), tag.itemListMap()["TRACK"].values()[0]); CPPUNIT_ASSERT_EQUAL(2u, tag.itemListMap()["ARTIST"].values().size()); CPPUNIT_ASSERT_EQUAL(String("artist 1 artist 2"), tag.artist()); CPPUNIT_ASSERT_EQUAL(17u, tag.track()); const APE::Item &textItem = tag.itemListMap()["TRACK"]; CPPUNIT_ASSERT_EQUAL(APE::Item::Text, textItem.type()); CPPUNIT_ASSERT(!textItem.isEmpty()); CPPUNIT_ASSERT_EQUAL(9 + 5 + 2, textItem.size()); } void testPropertyInterface2() { APE::Tag tag; APE::Item item1 = APE::Item("TRACK", "17"); tag.setItem("TRACK", item1); APE::Item item2 = APE::Item(); item2.setType(APE::Item::Binary); ByteVector binaryData1("first"); item2.setBinaryData(binaryData1); tag.setItem("TESTBINARY", item2); PropertyMap properties = tag.properties(); CPPUNIT_ASSERT_EQUAL(1u, properties.unsupportedData().size()); CPPUNIT_ASSERT(properties.contains("TRACKNUMBER")); CPPUNIT_ASSERT(!properties.contains("TRACK")); CPPUNIT_ASSERT(tag.itemListMap().contains("TESTBINARY")); CPPUNIT_ASSERT_EQUAL(binaryData1, tag.itemListMap()["TESTBINARY"].binaryData()); ByteVector binaryData2("second"); tag.setData("TESTBINARY", binaryData2); const APE::Item &binaryItem = tag.itemListMap()["TESTBINARY"]; CPPUNIT_ASSERT_EQUAL(APE::Item::Binary, binaryItem.type()); CPPUNIT_ASSERT(!binaryItem.isEmpty()); CPPUNIT_ASSERT_EQUAL(9 + 10 + static_cast<int>(binaryData2.size()), binaryItem.size()); CPPUNIT_ASSERT_EQUAL(binaryData2, binaryItem.binaryData()); tag.removeUnsupportedProperties(properties.unsupportedData()); CPPUNIT_ASSERT(!tag.itemListMap().contains("TESTBINARY")); APE::Item item3 = APE::Item("TRACKNUMBER", "29"); tag.setItem("TRACKNUMBER", item3); properties = tag.properties(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, properties["TRACKNUMBER"].size()); CPPUNIT_ASSERT_EQUAL(String("17"), properties["TRACKNUMBER"][0]); CPPUNIT_ASSERT_EQUAL(String("29"), properties["TRACKNUMBER"][1]); } void testInvalidKeys() { PropertyMap properties; properties["A"] = String("invalid key: one character"); properties["MP+"] = String("invalid key: forbidden string"); properties[L"\x1234\x3456"] = String("invalid key: Unicode"); properties["A B~C"] = String("valid key: space and tilde"); properties["ARTIST"] = String("valid key: normal one"); APE::Tag tag; PropertyMap unsuccessful = tag.setProperties(properties); CPPUNIT_ASSERT_EQUAL((unsigned int)3, unsuccessful.size()); CPPUNIT_ASSERT(unsuccessful.contains("A")); CPPUNIT_ASSERT(unsuccessful.contains("MP+")); CPPUNIT_ASSERT(unsuccessful.contains(L"\x1234\x3456")); CPPUNIT_ASSERT_EQUAL((unsigned int)2, tag.itemListMap().size()); tag.addValue("VALID KEY", "Test Value 1"); tag.addValue("INVALID KEY \x7f", "Test Value 2"); tag.addValue(L"INVALID KEY \x1234\x3456", "Test Value 3"); CPPUNIT_ASSERT_EQUAL((unsigned int)3, tag.itemListMap().size()); } void testTextBinary() { APE::Item item = APE::Item("DUMMY", "Test Text"); CPPUNIT_ASSERT_EQUAL(String("Test Text"), item.toString()); CPPUNIT_ASSERT_EQUAL(ByteVector(), item.binaryData()); ByteVector data("Test Data"); item.setBinaryData(data); CPPUNIT_ASSERT(item.values().isEmpty()); CPPUNIT_ASSERT_EQUAL(String(), item.toString()); CPPUNIT_ASSERT_EQUAL(data, item.binaryData()); item.setValue("Test Text 2"); CPPUNIT_ASSERT_EQUAL(String("Test Text 2"), item.toString()); CPPUNIT_ASSERT_EQUAL(ByteVector(), item.binaryData()); } void testID3v1Collision() { ScopedFileCopy copy("no-tags", ".mpc"); string newname = copy.fileName(); { APE::File f(newname.c_str()); f.APETag(true)->setArtist("Filltointersect "); f.APETag()->setTitle("Filltointersect "); f.save(); } { APE::File f(newname.c_str()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestAPETag); ���������������������������������������������������������������taglib-1.13.1/tests/test_asf.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000035625�14447736377�0016556�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tstringlist.h> #include <tbytevectorlist.h> #include <tpropertymap.h> #include <asffile.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestASF : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestASF); CPPUNIT_TEST(testAudioProperties); CPPUNIT_TEST(testLosslessProperties); CPPUNIT_TEST(testRead); CPPUNIT_TEST(testSaveMultipleValues); CPPUNIT_TEST(testSaveStream); CPPUNIT_TEST(testSaveLanguage); CPPUNIT_TEST(testDWordTrackNumber); CPPUNIT_TEST(testSaveLargeValue); CPPUNIT_TEST(testSavePicture); CPPUNIT_TEST(testSaveMultiplePictures); CPPUNIT_TEST(testProperties); CPPUNIT_TEST(testPropertiesAllSupported); CPPUNIT_TEST(testRepeatedSave); CPPUNIT_TEST_SUITE_END(); public: void testAudioProperties() { ASF::File f(TEST_FILE_PATH_C("silence-1.wma")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3712, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(48000, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(ASF::Properties::WMA2, f.audioProperties()->codec()); CPPUNIT_ASSERT_EQUAL(String("Windows Media Audio 9.1"), f.audioProperties()->codecName()); CPPUNIT_ASSERT_EQUAL(String("64 kbps, 48 kHz, stereo 2-pass CBR"), f.audioProperties()->codecDescription()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); } void testLosslessProperties() { ASF::File f(TEST_FILE_PATH_C("lossless.wma")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3549, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(1152, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(ASF::Properties::WMA9Lossless, f.audioProperties()->codec()); CPPUNIT_ASSERT_EQUAL(String("Windows Media Audio 9.2 Lossless"), f.audioProperties()->codecName()); CPPUNIT_ASSERT_EQUAL(String("VBR Quality 100, 44 kHz, 2 channel 16 bit 1-pass VBR"), f.audioProperties()->codecDescription()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); } void testRead() { ASF::File f(TEST_FILE_PATH_C("silence-1.wma")); CPPUNIT_ASSERT_EQUAL(String("test"), f.tag()->title()); } void testSaveMultipleValues() { ScopedFileCopy copy("silence-1", ".wma"); string newname = copy.fileName(); { ASF::File f(newname.c_str()); ASF::AttributeList values; values.append("Foo"); values.append("Bar"); f.tag()->setAttribute("WM/AlbumTitle", values); f.save(); } { ASF::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(2, (int)f.tag()->attributeListMap()["WM/AlbumTitle"].size()); } } void testDWordTrackNumber() { ScopedFileCopy copy("silence-1", ".wma"); string newname = copy.fileName(); { ASF::File f(newname.c_str()); CPPUNIT_ASSERT(!f.tag()->contains("WM/TrackNumber")); f.tag()->setAttribute("WM/TrackNumber", (unsigned int)(123)); f.save(); } { ASF::File f(newname.c_str()); CPPUNIT_ASSERT(f.tag()->contains("WM/TrackNumber")); CPPUNIT_ASSERT_EQUAL(ASF::Attribute::DWordType, f.tag()->attribute("WM/TrackNumber").front().type()); CPPUNIT_ASSERT_EQUAL((unsigned int)123, f.tag()->track()); f.tag()->setTrack(234); f.save(); } { ASF::File f(newname.c_str()); CPPUNIT_ASSERT(f.tag()->contains("WM/TrackNumber")); CPPUNIT_ASSERT_EQUAL(ASF::Attribute::UnicodeType, f.tag()->attribute("WM/TrackNumber").front().type()); CPPUNIT_ASSERT_EQUAL((unsigned int)234, f.tag()->track()); } } void testSaveStream() { ScopedFileCopy copy("silence-1", ".wma"); string newname = copy.fileName(); { ASF::File f(newname.c_str()); ASF::Attribute attr("Foo"); attr.setStream(43); f.tag()->setAttribute("WM/AlbumTitle", attr); f.save(); } { ASF::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(43, f.tag()->attribute("WM/AlbumTitle").front().stream()); } } void testSaveLanguage() { ScopedFileCopy copy("silence-1", ".wma"); string newname = copy.fileName(); { ASF::File f(newname.c_str()); ASF::Attribute attr("Foo"); attr.setStream(32); attr.setLanguage(56); f.tag()->setAttribute("WM/AlbumTitle", attr); f.save(); } { ASF::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(32, f.tag()->attribute("WM/AlbumTitle").front().stream()); CPPUNIT_ASSERT_EQUAL(56, f.tag()->attribute("WM/AlbumTitle").front().language()); } } void testSaveLargeValue() { ScopedFileCopy copy("silence-1", ".wma"); string newname = copy.fileName(); { ASF::File f(newname.c_str()); ASF::Attribute attr(ByteVector(70000, 'x')); f.tag()->setAttribute("WM/Blob", attr); f.save(); } { ASF::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(ByteVector(70000, 'x'), f.tag()->attribute("WM/Blob").front().toByteVector()); } } void testSavePicture() { ScopedFileCopy copy("silence-1", ".wma"); string newname = copy.fileName(); { ASF::File f(newname.c_str()); ASF::Picture picture; picture.setMimeType("image/jpeg"); picture.setType(ASF::Picture::FrontCover); picture.setDescription("description"); picture.setPicture("data"); f.tag()->setAttribute("WM/Picture", picture); f.save(); } { ASF::File f(newname.c_str()); ASF::AttributeList values2 = f.tag()->attribute("WM/Picture"); CPPUNIT_ASSERT_EQUAL((unsigned int)1, values2.size()); ASF::Attribute attr2 = values2.front(); ASF::Picture picture2 = attr2.toPicture(); CPPUNIT_ASSERT(picture2.isValid()); CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), picture2.mimeType()); CPPUNIT_ASSERT_EQUAL(ASF::Picture::FrontCover, picture2.type()); CPPUNIT_ASSERT_EQUAL(String("description"), picture2.description()); CPPUNIT_ASSERT_EQUAL(ByteVector("data"), picture2.picture()); } } void testSaveMultiplePictures() { ScopedFileCopy copy("silence-1", ".wma"); string newname = copy.fileName(); { ASF::File f(newname.c_str()); ASF::AttributeList values; ASF::Picture picture; picture.setMimeType("image/jpeg"); picture.setType(ASF::Picture::FrontCover); picture.setDescription("description"); picture.setPicture("data"); values.append(ASF::Attribute(picture)); ASF::Picture picture2; picture2.setMimeType("image/png"); picture2.setType(ASF::Picture::BackCover); picture2.setDescription("back cover"); picture2.setPicture("PNG data"); values.append(ASF::Attribute(picture2)); f.tag()->setAttribute("WM/Picture", values); f.save(); } { ASF::File f(newname.c_str()); ASF::AttributeList values2 = f.tag()->attribute("WM/Picture"); CPPUNIT_ASSERT_EQUAL((unsigned int)2, values2.size()); ASF::Picture picture3 = values2[1].toPicture(); CPPUNIT_ASSERT(picture3.isValid()); CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), picture3.mimeType()); CPPUNIT_ASSERT_EQUAL(ASF::Picture::FrontCover, picture3.type()); CPPUNIT_ASSERT_EQUAL(String("description"), picture3.description()); CPPUNIT_ASSERT_EQUAL(ByteVector("data"), picture3.picture()); ASF::Picture picture4 = values2[0].toPicture(); CPPUNIT_ASSERT(picture4.isValid()); CPPUNIT_ASSERT_EQUAL(String("image/png"), picture4.mimeType()); CPPUNIT_ASSERT_EQUAL(ASF::Picture::BackCover, picture4.type()); CPPUNIT_ASSERT_EQUAL(String("back cover"), picture4.description()); CPPUNIT_ASSERT_EQUAL(ByteVector("PNG data"), picture4.picture()); } } void testProperties() { ASF::File f(TEST_FILE_PATH_C("silence-1.wma")); PropertyMap tags = f.properties(); tags["TRACKNUMBER"] = StringList("2"); tags["DISCNUMBER"] = StringList("3"); tags["BPM"] = StringList("123"); tags["ARTIST"] = StringList("Foo Bar"); f.setProperties(tags); tags = f.properties(); CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.tag()->artist()); CPPUNIT_ASSERT_EQUAL(StringList("Foo Bar"), tags["ARTIST"]); CPPUNIT_ASSERT(f.tag()->contains("WM/BeatsPerMinute")); CPPUNIT_ASSERT_EQUAL(1u, f.tag()->attributeListMap()["WM/BeatsPerMinute"].size()); CPPUNIT_ASSERT_EQUAL(String("123"), f.tag()->attribute("WM/BeatsPerMinute").front().toString()); CPPUNIT_ASSERT_EQUAL(StringList("123"), tags["BPM"]); CPPUNIT_ASSERT(f.tag()->contains("WM/TrackNumber")); CPPUNIT_ASSERT_EQUAL(1u, f.tag()->attributeListMap()["WM/TrackNumber"].size()); CPPUNIT_ASSERT_EQUAL(String("2"), f.tag()->attribute("WM/TrackNumber").front().toString()); CPPUNIT_ASSERT_EQUAL(StringList("2"), tags["TRACKNUMBER"]); CPPUNIT_ASSERT(f.tag()->contains("WM/PartOfSet")); CPPUNIT_ASSERT_EQUAL(1u, f.tag()->attributeListMap()["WM/PartOfSet"].size()); CPPUNIT_ASSERT_EQUAL(String("3"), f.tag()->attribute("WM/PartOfSet").front().toString()); CPPUNIT_ASSERT_EQUAL(StringList("3"), tags["DISCNUMBER"]); } void testPropertiesAllSupported() { PropertyMap tags; tags["ACOUSTID_ID"] = StringList("Acoustid ID"); tags["ACOUSTID_FINGERPRINT"] = StringList("Acoustid Fingerprint"); tags["ALBUM"] = StringList("Album"); tags["ALBUMARTIST"] = StringList("Album Artist"); tags["ALBUMARTISTSORT"] = StringList("Album Artist Sort"); tags["ALBUMSORT"] = StringList("Album Sort"); tags["ARTIST"] = StringList("Artist"); tags["ARTISTS"] = StringList("Artists"); tags["ARTISTSORT"] = StringList("Artist Sort"); tags["ASIN"] = StringList("ASIN"); tags["BARCODE"] = StringList("Barcode"); tags["BPM"] = StringList("123"); tags["CATALOGNUMBER"] = StringList("Catalog Number"); tags["COMMENT"] = StringList("Comment"); tags["COMPOSER"] = StringList("Composer"); tags["CONDUCTOR"] = StringList("Conductor"); tags["COPYRIGHT"] = StringList("2021 Copyright"); tags["DATE"] = StringList("2021-01-03 12:29:23"); tags["DISCNUMBER"] = StringList("3/5"); tags["DISCSUBTITLE"] = StringList("Disc Subtitle"); tags["ENCODEDBY"] = StringList("Encoded by"); tags["GENRE"] = StringList("Genre"); tags["WORK"] = StringList("Grouping"); tags["ISRC"] = StringList("UKAAA0500001"); tags["LABEL"] = StringList("Label"); tags["LANGUAGE"] = StringList("eng"); tags["LYRICIST"] = StringList("Lyricist"); tags["LYRICS"] = StringList("Lyrics"); tags["MEDIA"] = StringList("Media"); tags["MOOD"] = StringList("Mood"); tags["MUSICBRAINZ_ALBUMARTISTID"] = StringList("MusicBrainz_AlbumartistID"); tags["MUSICBRAINZ_ALBUMID"] = StringList("MusicBrainz_AlbumID"); tags["MUSICBRAINZ_ARTISTID"] = StringList("MusicBrainz_ArtistID"); tags["MUSICBRAINZ_RELEASEGROUPID"] = StringList("MusicBrainz_ReleasegroupID"); tags["MUSICBRAINZ_RELEASETRACKID"] = StringList("MusicBrainz_ReleasetrackID"); tags["MUSICBRAINZ_TRACKID"] = StringList("MusicBrainz_TrackID"); tags["MUSICBRAINZ_WORKID"] = StringList("MusicBrainz_WorkID"); tags["MUSICIP_PUID"] = StringList("MusicIP PUID"); tags["ORIGINALDATE"] = StringList("2021-01-03 13:52:19"); tags["PRODUCER"] = StringList("Producer"); tags["RELEASECOUNTRY"] = StringList("Release Country"); tags["RELEASESTATUS"] = StringList("Release Status"); tags["RELEASETYPE"] = StringList("Release Type"); tags["REMIXER"] = StringList("Remixer"); tags["SCRIPT"] = StringList("Script"); tags["SUBTITLE"] = StringList("Subtitle"); tags["TITLE"] = StringList("Title"); tags["TITLESORT"] = StringList("Title Sort"); tags["TRACKNUMBER"] = StringList("2/4"); ScopedFileCopy copy("silence-1", ".wma"); { ASF::File f(copy.fileName().c_str()); ASF::Tag *asfTag = f.tag(); asfTag->setTitle(""); asfTag->attributeListMap().clear(); f.save(); } { ASF::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); CPPUNIT_ASSERT(properties.isEmpty()); f.setProperties(tags); f.save(); } { const ASF::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); if (tags != properties) { CPPUNIT_ASSERT_EQUAL(tags.toString(), properties.toString()); } CPPUNIT_ASSERT(tags == properties); } } void testRepeatedSave() { ScopedFileCopy copy("silence-1", ".wma"); { ASF::File f(copy.fileName().c_str()); f.tag()->setTitle(longText(128 * 1024)); f.save(); CPPUNIT_ASSERT_EQUAL(297578L, f.length()); f.tag()->setTitle(longText(16 * 1024)); f.save(); CPPUNIT_ASSERT_EQUAL(68202L, f.length()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestASF); �����������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_bytevector.cpp�������������������������������������������������������������0000664�0000000�0000000�00000051616�14447736377�0020171�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #define _USE_MATH_DEFINES #include <cmath> #include <tbytevector.h> #include <tbytevectorlist.h> #include <cppunit/extensions/HelperMacros.h> using namespace std; using namespace TagLib; class TestByteVector : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestByteVector); CPPUNIT_TEST(testByteVector); CPPUNIT_TEST(testFind1); CPPUNIT_TEST(testFind2); CPPUNIT_TEST(testFind3); CPPUNIT_TEST(testRfind1); CPPUNIT_TEST(testRfind2); CPPUNIT_TEST(testRfind3); CPPUNIT_TEST(testToHex); CPPUNIT_TEST(testIntegerConversion); CPPUNIT_TEST(testFloatingPointConversion); CPPUNIT_TEST(testReplace); CPPUNIT_TEST(testReplaceAndDetach); CPPUNIT_TEST(testIterator); CPPUNIT_TEST(testResize); CPPUNIT_TEST(testAppend1); CPPUNIT_TEST(testAppend2); CPPUNIT_TEST(testBase64); CPPUNIT_TEST_SUITE_END(); public: void testByteVector() { ByteVector s1("foo"); CPPUNIT_ASSERT(ByteVectorList::split(s1, " ").size() == 1); ByteVector s2("f"); CPPUNIT_ASSERT(ByteVectorList::split(s2, " ").size() == 1); CPPUNIT_ASSERT(ByteVector().isEmpty()); CPPUNIT_ASSERT_EQUAL(0U, ByteVector().size()); CPPUNIT_ASSERT(ByteVector("asdf").clear().isEmpty()); CPPUNIT_ASSERT_EQUAL(0U, ByteVector("asdf").clear().size()); CPPUNIT_ASSERT_EQUAL(ByteVector(), ByteVector("asdf").clear()); ByteVector i("blah blah"); ByteVector j("blah"); CPPUNIT_ASSERT(i.containsAt(j, 5, 0)); CPPUNIT_ASSERT(i.containsAt(j, 6, 1)); CPPUNIT_ASSERT(i.containsAt(j, 6, 1, 3)); i.clear(); CPPUNIT_ASSERT(i.isEmpty()); } void testFind1() { CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO")); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 0)); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 1)); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 2)); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 3)); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find("SggO", 4)); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 5)); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 6)); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 7)); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find("SggO", 8)); // Intentional out-of-bounds access. ByteVector v("0123456789x"); v.resize(10); v.data()[10] = 'x'; CPPUNIT_ASSERT_EQUAL(-1, v.find("789x", 7)); } void testFind2() { CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01", 1).find("\x01")); CPPUNIT_ASSERT_EQUAL(0, ByteVector("\x01\x02", 2).find("\x01\x02")); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01", 1).find("\x02")); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("\x01\x02", 2).find("\x01\x03")); } void testFind3() { CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S')); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 0)); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 1)); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 2)); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 3)); CPPUNIT_ASSERT_EQUAL(4, ByteVector("....SggO."). find('S', 4)); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 5)); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 6)); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 7)); CPPUNIT_ASSERT_EQUAL(-1, ByteVector("....SggO."). find('S', 8)); } void testRfind1() { CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 0)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 1)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 2)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 3)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 4)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 5)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 6)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 7)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS", 8)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind("OggS")); } void testRfind2() { ByteVector r0("**************"); ByteVector r1("OggS**********"); ByteVector r2("**********OggS"); ByteVector r3("OggS******OggS"); ByteVector r4("OggS*OggS*OggS"); CPPUNIT_ASSERT_EQUAL(-1, r0.find("OggS")); CPPUNIT_ASSERT_EQUAL(-1, r0.rfind("OggS")); CPPUNIT_ASSERT_EQUAL(0, r1.find("OggS")); CPPUNIT_ASSERT_EQUAL(0, r1.rfind("OggS")); CPPUNIT_ASSERT_EQUAL(10, r2.find("OggS")); CPPUNIT_ASSERT_EQUAL(10, r2.rfind("OggS")); CPPUNIT_ASSERT_EQUAL(0, r3.find("OggS")); CPPUNIT_ASSERT_EQUAL(10, r3.rfind("OggS")); CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS")); CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS", 0)); CPPUNIT_ASSERT_EQUAL(5, r4.rfind("OggS", 7)); CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS", 12)); } void testRfind3() { CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 0)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 1)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 2)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 3)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 4)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 5)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 6)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 7)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O', 8)); CPPUNIT_ASSERT_EQUAL(1, ByteVector(".OggS....").rfind('O')); } void testToHex() { ByteVector v("\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f", 16); CPPUNIT_ASSERT_EQUAL(ByteVector("f0e1d2c3b4a5968778695a4b3c2d1e0f"), v.toHex()); } void testIntegerConversion() { const ByteVector data("\x00\xff\x01\xff\x00\xff\x01\xff\x00\xff\x01\xff\x00\xff", 14); CPPUNIT_ASSERT_EQUAL((short)0x00ff, data.toShort()); CPPUNIT_ASSERT_EQUAL((short)0xff00, data.toShort(false)); CPPUNIT_ASSERT_EQUAL((short)0xff01, data.toShort(5U)); CPPUNIT_ASSERT_EQUAL((short)0x01ff, data.toShort(5U, false)); CPPUNIT_ASSERT_EQUAL((short)0xff, data.toShort(13U)); CPPUNIT_ASSERT_EQUAL((short)0xff, data.toShort(13U, false)); CPPUNIT_ASSERT_EQUAL((unsigned short)0x00ff, data.toUShort()); CPPUNIT_ASSERT_EQUAL((unsigned short)0xff00, data.toUShort(false)); CPPUNIT_ASSERT_EQUAL((unsigned short)0xff01, data.toUShort(5U)); CPPUNIT_ASSERT_EQUAL((unsigned short)0x01ff, data.toUShort(5U, false)); CPPUNIT_ASSERT_EQUAL((unsigned short)0xff, data.toUShort(13U)); CPPUNIT_ASSERT_EQUAL((unsigned short)0xff, data.toUShort(13U, false)); CPPUNIT_ASSERT_EQUAL(0x00ff01ffU, data.toUInt()); CPPUNIT_ASSERT_EQUAL(0xff01ff00U, data.toUInt(false)); CPPUNIT_ASSERT_EQUAL(0xff01ff00U, data.toUInt(5U)); CPPUNIT_ASSERT_EQUAL(0x00ff01ffU, data.toUInt(5U, false)); CPPUNIT_ASSERT_EQUAL(0x00ffU, data.toUInt(12U)); CPPUNIT_ASSERT_EQUAL(0xff00U, data.toUInt(12U, false)); CPPUNIT_ASSERT_EQUAL(0x00ff01U, data.toUInt(0U, 3U)); CPPUNIT_ASSERT_EQUAL(0x01ff00U, data.toUInt(0U, 3U, false)); CPPUNIT_ASSERT_EQUAL(0xff01ffU, data.toUInt(5U, 3U)); CPPUNIT_ASSERT_EQUAL(0xff01ffU, data.toUInt(5U, 3U, false)); CPPUNIT_ASSERT_EQUAL(0x00ffU, data.toUInt(12U, 3U)); CPPUNIT_ASSERT_EQUAL(0xff00U, data.toUInt(12U, 3U, false)); CPPUNIT_ASSERT_EQUAL((long long)0x00ff01ff00ff01ffULL, data.toLongLong()); CPPUNIT_ASSERT_EQUAL((long long)0xff01ff00ff01ff00ULL, data.toLongLong(false)); CPPUNIT_ASSERT_EQUAL((long long)0xff01ff00ff01ff00ULL, data.toLongLong(5U)); CPPUNIT_ASSERT_EQUAL((long long)0x00ff01ff00ff01ffULL, data.toLongLong(5U, false)); CPPUNIT_ASSERT_EQUAL((long long)0x00ffU, data.toLongLong(12U)); CPPUNIT_ASSERT_EQUAL((long long)0xff00U, data.toLongLong(12U, false)); } void testFloatingPointConversion() { const double Tolerance = 1.0e-7; const ByteVector pi32le("\xdb\x0f\x49\x40", 4); CPPUNIT_ASSERT(std::abs(pi32le.toFloat32LE(0) - M_PI) < Tolerance); CPPUNIT_ASSERT_EQUAL(pi32le, ByteVector::fromFloat32LE(pi32le.toFloat32LE(0))); const ByteVector pi32be("\x40\x49\x0f\xdb", 4); CPPUNIT_ASSERT(std::abs(pi32be.toFloat32BE(0) - M_PI) < Tolerance); CPPUNIT_ASSERT_EQUAL(pi32be, ByteVector::fromFloat32BE(pi32be.toFloat32BE(0))); const ByteVector pi64le("\x18\x2d\x44\x54\xfb\x21\x09\x40", 8); CPPUNIT_ASSERT(std::abs(pi64le.toFloat64LE(0) - M_PI) < Tolerance); CPPUNIT_ASSERT_EQUAL(pi64le, ByteVector::fromFloat64LE(pi64le.toFloat64LE(0))); const ByteVector pi64be("\x40\x09\x21\xfb\x54\x44\x2d\x18", 8); CPPUNIT_ASSERT(std::abs(pi64be.toFloat64BE(0) - M_PI) < Tolerance); CPPUNIT_ASSERT_EQUAL(pi64be, ByteVector::fromFloat64BE(pi64be.toFloat64BE(0))); const ByteVector pi80le("\x00\xc0\x68\x21\xa2\xda\x0f\xc9\x00\x40", 10); CPPUNIT_ASSERT(std::abs(pi80le.toFloat80LE(0) - M_PI) < Tolerance); const ByteVector pi80be("\x40\x00\xc9\x0f\xda\xa2\x21\x68\xc0\x00", 10); CPPUNIT_ASSERT(std::abs(pi80be.toFloat80BE(0) - M_PI) < Tolerance); } void testReplace() { { ByteVector a("abcdabf"); a.replace(ByteVector(""), ByteVector("<a>")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); } { ByteVector a("abcdabf"); a.replace(ByteVector("foobartoolong"), ByteVector("<a>")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); } { ByteVector a("abcdabf"); a.replace(ByteVector("xx"), ByteVector("yy")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); } { ByteVector a("abcdabf"); a.replace(ByteVector("a"), ByteVector("x")); CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a); a.replace(ByteVector("x"), ByteVector("a")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); } { ByteVector a("abcdabf"); a.replace('a', 'x'); CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a); a.replace('x', 'a'); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); } { ByteVector a("abcdabf"); a.replace(ByteVector("ab"), ByteVector("xy")); CPPUNIT_ASSERT_EQUAL(ByteVector("xycdxyf"), a); a.replace(ByteVector("xy"), ByteVector("ab")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); } { ByteVector a("abcdabf"); a.replace(ByteVector("a"), ByteVector("<a>")); CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>bf"), a); a.replace(ByteVector("<a>"), ByteVector("a")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); } { ByteVector a("abcdabf"); a.replace(ByteVector("b"), ByteVector("<b>")); CPPUNIT_ASSERT_EQUAL(ByteVector("a<b>cda<b>f"), a); a.replace(ByteVector("<b>"), ByteVector("b")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), a); } { ByteVector a("abcdabc"); a.replace(ByteVector("c"), ByteVector("<c>")); CPPUNIT_ASSERT_EQUAL(ByteVector("ab<c>dab<c>"), a); a.replace(ByteVector("<c>"), ByteVector("c")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabc"), a); } { ByteVector a("abcdaba"); a.replace(ByteVector("a"), ByteVector("<a>")); CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>b<a>"), a); a.replace(ByteVector("<a>"), ByteVector("a")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdaba"), a); } } void testReplaceAndDetach() { { ByteVector a("abcdabf"); ByteVector b = a; a.replace(ByteVector("a"), ByteVector("x")); CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b); } { ByteVector a("abcdabf"); ByteVector b = a; a.replace('a', 'x'); CPPUNIT_ASSERT_EQUAL(ByteVector("xbcdxbf"), a); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b); } { ByteVector a("abcdabf"); ByteVector b = a; a.replace(ByteVector("ab"), ByteVector("xy")); CPPUNIT_ASSERT_EQUAL(ByteVector("xycdxyf"), a); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b); } { ByteVector a("abcdabf"); ByteVector b = a; a.replace(ByteVector("a"), ByteVector("<a>")); CPPUNIT_ASSERT_EQUAL(ByteVector("<a>bcd<a>bf"), a); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabf"), b); } { ByteVector a("ab<c>dab<c>"); ByteVector b = a; a.replace(ByteVector("<c>"), ByteVector("c")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcdabc"), a); CPPUNIT_ASSERT_EQUAL(ByteVector("ab<c>dab<c>"), b); } } void testIterator() { ByteVector v1("taglib"); ByteVector v2 = v1; ByteVector::Iterator it1 = v1.begin(); ByteVector::Iterator it2 = v2.begin(); CPPUNIT_ASSERT_EQUAL('t', *it1); CPPUNIT_ASSERT_EQUAL('t', *it2); std::advance(it1, 4); std::advance(it2, 4); *it2 = 'I'; CPPUNIT_ASSERT_EQUAL('i', *it1); CPPUNIT_ASSERT_EQUAL('I', *it2); CPPUNIT_ASSERT_EQUAL(ByteVector("taglib"), v1); CPPUNIT_ASSERT_EQUAL(ByteVector("taglIb"), v2); ByteVector::ReverseIterator it3 = v1.rbegin(); ByteVector::ReverseIterator it4 = v2.rbegin(); CPPUNIT_ASSERT_EQUAL('b', *it3); CPPUNIT_ASSERT_EQUAL('b', *it4); std::advance(it3, 4); std::advance(it4, 4); *it4 = 'A'; CPPUNIT_ASSERT_EQUAL('a', *it3); CPPUNIT_ASSERT_EQUAL('A', *it4); CPPUNIT_ASSERT_EQUAL(ByteVector("taglib"), v1); CPPUNIT_ASSERT_EQUAL(ByteVector("tAglIb"), v2); ByteVector v3; v3 = ByteVector("0123456789").mid(3, 4); it1 = v3.begin(); it2 = v3.end() - 1; CPPUNIT_ASSERT_EQUAL('3', *it1); CPPUNIT_ASSERT_EQUAL('6', *it2); it3 = v3.rbegin(); it4 = v3.rend() - 1; CPPUNIT_ASSERT_EQUAL('6', *it3); CPPUNIT_ASSERT_EQUAL('3', *it4); } void testResize() { ByteVector a = ByteVector("0123456789"); ByteVector b = a.mid(3, 4); b.resize(6, 'A'); CPPUNIT_ASSERT_EQUAL((unsigned int)6, b.size()); CPPUNIT_ASSERT_EQUAL('6', b[3]); CPPUNIT_ASSERT_EQUAL('A', b[4]); CPPUNIT_ASSERT_EQUAL('A', b[5]); b.resize(10, 'B'); CPPUNIT_ASSERT_EQUAL((unsigned int)10, b.size()); CPPUNIT_ASSERT_EQUAL('6', b[3]); CPPUNIT_ASSERT_EQUAL('B', b[6]); CPPUNIT_ASSERT_EQUAL('B', b[9]); b.resize(3, 'C'); CPPUNIT_ASSERT_EQUAL((unsigned int)3, b.size()); CPPUNIT_ASSERT_EQUAL(-1, b.find('C')); b.resize(3); CPPUNIT_ASSERT_EQUAL((unsigned int)3, b.size()); // Check if a and b were properly detached. CPPUNIT_ASSERT_EQUAL((unsigned int)10, a.size()); CPPUNIT_ASSERT_EQUAL('3', a[3]); CPPUNIT_ASSERT_EQUAL('5', a[5]); // Special case that refCount == 1 and d->offset != 0. ByteVector c = ByteVector("0123456789").mid(3, 4); c.resize(6, 'A'); CPPUNIT_ASSERT_EQUAL((unsigned int)6, c.size()); CPPUNIT_ASSERT_EQUAL('6', c[3]); CPPUNIT_ASSERT_EQUAL('A', c[4]); CPPUNIT_ASSERT_EQUAL('A', c[5]); c.resize(10, 'B'); CPPUNIT_ASSERT_EQUAL((unsigned int)10, c.size()); CPPUNIT_ASSERT_EQUAL('6', c[3]); CPPUNIT_ASSERT_EQUAL('B', c[6]); CPPUNIT_ASSERT_EQUAL('B', c[9]); c.resize(3, 'C'); CPPUNIT_ASSERT_EQUAL((unsigned int)3, c.size()); CPPUNIT_ASSERT_EQUAL(-1, c.find('C')); } void testAppend1() { ByteVector v1("foo"); v1.append("bar"); CPPUNIT_ASSERT_EQUAL(ByteVector("foobar"), v1); ByteVector v2("foo"); v2.append("b"); CPPUNIT_ASSERT_EQUAL(ByteVector("foob"), v2); ByteVector v3; v3.append("b"); CPPUNIT_ASSERT_EQUAL(ByteVector("b"), v3); ByteVector v4("foo"); v4.append(v1); CPPUNIT_ASSERT_EQUAL(ByteVector("foofoobar"), v4); ByteVector v5("foo"); v5.append('b'); CPPUNIT_ASSERT_EQUAL(ByteVector("foob"), v5); ByteVector v6; v6.append('b'); CPPUNIT_ASSERT_EQUAL(ByteVector("b"), v6); ByteVector v7("taglib"); ByteVector v8 = v7; v7.append("ABC"); CPPUNIT_ASSERT_EQUAL(ByteVector("taglibABC"), v7); v7.append('1'); v7.append('2'); v7.append('3'); CPPUNIT_ASSERT_EQUAL(ByteVector("taglibABC123"), v7); CPPUNIT_ASSERT_EQUAL(ByteVector("taglib"), v8); } void testAppend2() { ByteVector a("1234"); a.append(a); CPPUNIT_ASSERT_EQUAL(ByteVector("12341234"), a); } void testBase64() { ByteVector sempty; ByteVector t0("a"); // test 1 byte ByteVector t1("any carnal pleasure."); ByteVector t2("any carnal pleasure"); ByteVector t3("any carnal pleasur"); ByteVector s0("a"); // test 1 byte ByteVector s1("any carnal pleasure."); ByteVector s2("any carnal pleasure"); ByteVector s3("any carnal pleasur"); ByteVector eempty; ByteVector e0("YQ=="); ByteVector e1("YW55IGNhcm5hbCBwbGVhc3VyZS4="); ByteVector e2("YW55IGNhcm5hbCBwbGVhc3VyZQ=="); ByteVector e3("YW55IGNhcm5hbCBwbGVhc3Vy"); // Encode CPPUNIT_ASSERT_EQUAL(eempty, sempty.toBase64()); CPPUNIT_ASSERT_EQUAL(e0, s0.toBase64()); CPPUNIT_ASSERT_EQUAL(e1, s1.toBase64()); CPPUNIT_ASSERT_EQUAL(e2, s2.toBase64()); CPPUNIT_ASSERT_EQUAL(e3, s3.toBase64()); // Decode CPPUNIT_ASSERT_EQUAL(sempty, ByteVector::fromBase64(eempty)); CPPUNIT_ASSERT_EQUAL(s0, ByteVector::fromBase64(e0)); CPPUNIT_ASSERT_EQUAL(s1, ByteVector::fromBase64(e1)); CPPUNIT_ASSERT_EQUAL(s2, ByteVector::fromBase64(e2)); CPPUNIT_ASSERT_EQUAL(s3, ByteVector::fromBase64(e3)); CPPUNIT_ASSERT_EQUAL(t0, ByteVector::fromBase64(s0.toBase64())); CPPUNIT_ASSERT_EQUAL(t1, ByteVector::fromBase64(s1.toBase64())); CPPUNIT_ASSERT_EQUAL(t2, ByteVector::fromBase64(s2.toBase64())); CPPUNIT_ASSERT_EQUAL(t3, ByteVector::fromBase64(s3.toBase64())); ByteVector all((unsigned int)256); // in order { for(int i = 0; i < 256; i++){ all[i]=(unsigned char)i; } ByteVector b64 = all.toBase64(); ByteVector original = ByteVector::fromBase64(b64); CPPUNIT_ASSERT_EQUAL(all,original); } // reverse { for(int i = 0; i < 256; i++){ all[i]=(unsigned char)255-i; } ByteVector b64 = all.toBase64(); ByteVector original = ByteVector::fromBase64(b64); CPPUNIT_ASSERT_EQUAL(all,original); } // all zeroes { for(int i = 0; i < 256; i++){ all[i]=0; } ByteVector b64 = all.toBase64(); ByteVector original = ByteVector::fromBase64(b64); CPPUNIT_ASSERT_EQUAL(all,original); } // all ones { for(int i = 0; i < 256; i++){ all[i]=(unsigned char)0xff; } ByteVector b64 = all.toBase64(); ByteVector original = ByteVector::fromBase64(b64); CPPUNIT_ASSERT_EQUAL(all,original); } // Missing end bytes { // No missing bytes ByteVector m0("YW55IGNhcm5hbCBwbGVhc3VyZQ=="); CPPUNIT_ASSERT_EQUAL(s2,ByteVector::fromBase64(m0)); // 1 missing byte ByteVector m1("YW55IGNhcm5hbCBwbGVhc3VyZQ="); CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(m1)); // 2 missing bytes ByteVector m2("YW55IGNhcm5hbCBwbGVhc3VyZQ"); CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(m2)); // 3 missing bytes ByteVector m3("YW55IGNhcm5hbCBwbGVhc3VyZ"); CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(m3)); } // Grok invalid characters { ByteVector invalid("abd\x00\x01\x02\x03\x04"); CPPUNIT_ASSERT_EQUAL(sempty,ByteVector::fromBase64(invalid)); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVector); ������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_bytevectorlist.cpp���������������������������������������������������������0000664�0000000�0000000�00000005076�14447736377�0021064�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2009 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevector.h> #include <tbytevectorlist.h> #include <cppunit/extensions/HelperMacros.h> using namespace std; using namespace TagLib; class TestByteVectorList : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestByteVectorList); CPPUNIT_TEST(testSplitSingleChar); CPPUNIT_TEST(testSplitSingleChar_2); CPPUNIT_TEST_SUITE_END(); public: void testSplitSingleChar() { ByteVector v("a b"); ByteVectorList l = ByteVectorList::split(v, " "); CPPUNIT_ASSERT_EQUAL((unsigned int)2, l.size()); CPPUNIT_ASSERT_EQUAL(ByteVector("a"), l[0]); CPPUNIT_ASSERT_EQUAL(ByteVector("b"), l[1]); } void testSplitSingleChar_2() { ByteVector v("a"); ByteVectorList l = ByteVectorList::split(v, " "); CPPUNIT_ASSERT_EQUAL((unsigned int)1, l.size()); CPPUNIT_ASSERT_EQUAL(ByteVector("a"), l[0]); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVectorList); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_bytevectorstream.cpp�������������������������������������������������������0000664�0000000�0000000�00000010732�14447736377�0021377�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tbytevectorstream.h> #include <cppunit/extensions/HelperMacros.h> using namespace std; using namespace TagLib; class TestByteVectorStream : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestByteVectorStream); CPPUNIT_TEST(testInitialData); CPPUNIT_TEST(testWriteBlock); CPPUNIT_TEST(testWriteBlockResize); CPPUNIT_TEST(testReadBlock); CPPUNIT_TEST(testRemoveBlock); CPPUNIT_TEST(testInsert); CPPUNIT_TEST(testSeekEnd); CPPUNIT_TEST_SUITE_END(); public: void testInitialData() { ByteVector v("abcd"); ByteVectorStream stream(v); CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), *stream.data()); } void testWriteBlock() { ByteVector v("abcd"); ByteVectorStream stream(v); stream.seek(1); stream.writeBlock(ByteVector("xx")); CPPUNIT_ASSERT_EQUAL(ByteVector("axxd"), *stream.data()); } void testWriteBlockResize() { ByteVector v("abcd"); ByteVectorStream stream(v); stream.seek(3); stream.writeBlock(ByteVector("xx")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcxx"), *stream.data()); stream.seek(5); stream.writeBlock(ByteVector("yy")); CPPUNIT_ASSERT_EQUAL(ByteVector("abcxxyy"), *stream.data()); } void testReadBlock() { ByteVector v("abcd"); ByteVectorStream stream(v); CPPUNIT_ASSERT_EQUAL(ByteVector("a"), stream.readBlock(1)); CPPUNIT_ASSERT_EQUAL(ByteVector("bc"), stream.readBlock(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("d"), stream.readBlock(3)); CPPUNIT_ASSERT_EQUAL(ByteVector(""), stream.readBlock(3)); } void testRemoveBlock() { ByteVector v("abcd"); ByteVectorStream stream(v); stream.removeBlock(1, 1); CPPUNIT_ASSERT_EQUAL(ByteVector("acd"), *stream.data()); stream.removeBlock(0, 2); CPPUNIT_ASSERT_EQUAL(ByteVector("d"), *stream.data()); stream.removeBlock(0, 2); CPPUNIT_ASSERT_EQUAL(ByteVector(""), *stream.data()); } void testInsert() { ByteVector v("abcd"); ByteVectorStream stream(v); stream.insert(ByteVector("xx"), 1, 1); CPPUNIT_ASSERT_EQUAL(ByteVector("axxcd"), *stream.data()); stream.insert(ByteVector("yy"), 0, 2); CPPUNIT_ASSERT_EQUAL(ByteVector("yyxcd"), *stream.data()); stream.insert(ByteVector("foa"), 3, 2); CPPUNIT_ASSERT_EQUAL(ByteVector("yyxfoa"), *stream.data()); stream.insert(ByteVector("123"), 3, 0); CPPUNIT_ASSERT_EQUAL(ByteVector("yyx123foa"), *stream.data()); } void testSeekEnd() { ByteVector v("abcdefghijklmnopqrstuvwxyz"); ByteVectorStream stream(v); CPPUNIT_ASSERT_EQUAL(26L, stream.length()); stream.seek(-4, IOStream::End); CPPUNIT_ASSERT_EQUAL(ByteVector("w"), stream.readBlock(1)); stream.seek(-25, IOStream::End); CPPUNIT_ASSERT_EQUAL(ByteVector("b"), stream.readBlock(1)); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVectorStream); ��������������������������������������taglib-1.13.1/tests/test_file.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000011703�14447736377�0016713�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tfile.h> #include <cppunit/extensions/HelperMacros.h> #include "plainfile.h" #include "utils.h" using namespace TagLib; class TestFile : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestFile); CPPUNIT_TEST(testFindInSmallFile); CPPUNIT_TEST(testRFindInSmallFile); CPPUNIT_TEST(testSeek); CPPUNIT_TEST(testTruncate); CPPUNIT_TEST_SUITE_END(); public: void testFindInSmallFile() { ScopedFileCopy copy("empty", ".ogg"); std::string name = copy.fileName(); { PlainFile file(name.c_str()); file.seek(0); file.writeBlock(ByteVector("0123456239", 10)); file.truncate(10); } { PlainFile file(name.c_str()); CPPUNIT_ASSERT_EQUAL(10l, file.length()); CPPUNIT_ASSERT_EQUAL(2l, file.find(ByteVector("23", 2))); CPPUNIT_ASSERT_EQUAL(2l, file.find(ByteVector("23", 2), 2)); CPPUNIT_ASSERT_EQUAL(7l, file.find(ByteVector("23", 2), 3)); file.seek(0); const ByteVector v = file.readBlock(file.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)10, v.size()); CPPUNIT_ASSERT_EQUAL((long)v.find("23"), file.find("23")); CPPUNIT_ASSERT_EQUAL((long)v.find("23", 2), file.find("23", 2)); CPPUNIT_ASSERT_EQUAL((long)v.find("23", 3), file.find("23", 3)); } } void testRFindInSmallFile() { ScopedFileCopy copy("empty", ".ogg"); std::string name = copy.fileName(); { PlainFile file(name.c_str()); file.seek(0); file.writeBlock(ByteVector("0123456239", 10)); file.truncate(10); } { PlainFile file(name.c_str()); CPPUNIT_ASSERT_EQUAL(10l, file.length()); CPPUNIT_ASSERT_EQUAL(7l, file.rfind(ByteVector("23", 2))); CPPUNIT_ASSERT_EQUAL(7l, file.rfind(ByteVector("23", 2), 7)); CPPUNIT_ASSERT_EQUAL(2l, file.rfind(ByteVector("23", 2), 6)); file.seek(0); const ByteVector v = file.readBlock(file.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)10, v.size()); CPPUNIT_ASSERT_EQUAL((long)v.rfind("23"), file.rfind("23")); CPPUNIT_ASSERT_EQUAL((long)v.rfind("23", 7), file.rfind("23", 7)); CPPUNIT_ASSERT_EQUAL((long)v.rfind("23", 6), file.rfind("23", 6)); } } void testSeek() { ScopedFileCopy copy("empty", ".ogg"); std::string name = copy.fileName(); PlainFile f(name.c_str()); CPPUNIT_ASSERT_EQUAL((long)0, f.tell()); CPPUNIT_ASSERT_EQUAL((long)4328, f.length()); f.seek(100, File::Beginning); CPPUNIT_ASSERT_EQUAL((long)100, f.tell()); f.seek(100, File::Current); CPPUNIT_ASSERT_EQUAL((long)200, f.tell()); f.seek(-300, File::Current); CPPUNIT_ASSERT_EQUAL((long)200, f.tell()); f.seek(-100, File::End); CPPUNIT_ASSERT_EQUAL((long)4228, f.tell()); f.seek(-100, File::Current); CPPUNIT_ASSERT_EQUAL((long)4128, f.tell()); f.seek(300, File::Current); CPPUNIT_ASSERT_EQUAL((long)4428, f.tell()); } void testTruncate() { ScopedFileCopy copy("empty", ".ogg"); std::string name = copy.fileName(); { PlainFile f(name.c_str()); CPPUNIT_ASSERT_EQUAL(4328L, f.length()); f.truncate(2000); CPPUNIT_ASSERT_EQUAL(2000L, f.length()); } { PlainFile f(name.c_str()); CPPUNIT_ASSERT_EQUAL(2000L, f.length()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestFile); �������������������������������������������������������������taglib-1.13.1/tests/test_fileref.cpp����������������������������������������������������������������0000664�0000000�0000000�00000031176�14447736377�0017416�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <fileref.h> #include <oggflacfile.h> #include <vorbisfile.h> #include <mpegfile.h> #include <mpcfile.h> #include <asffile.h> #include <speexfile.h> #include <flacfile.h> #include <trueaudiofile.h> #include <mp4file.h> #include <wavfile.h> #include <apefile.h> #include <aifffile.h> #include <wavpackfile.h> #include <opusfile.h> #include <xmfile.h> #include <tfilestream.h> #include <tbytevectorstream.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; namespace { class DummyResolver : public FileRef::FileTypeResolver { public: virtual File *createFile(FileName fileName, bool, AudioProperties::ReadStyle) const { return new Ogg::Vorbis::File(fileName); } }; class DummyStreamResolver : public FileRef::StreamTypeResolver { public: virtual File *createFile(FileName, bool, AudioProperties::ReadStyle) const { return 0; } virtual File *createFileFromStream(IOStream *s, bool, AudioProperties::ReadStyle) const { return new MP4::File(s); } }; } class TestFileRef : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestFileRef); CPPUNIT_TEST(testASF); CPPUNIT_TEST(testMusepack); CPPUNIT_TEST(testVorbis); CPPUNIT_TEST(testSpeex); CPPUNIT_TEST(testFLAC); CPPUNIT_TEST(testMP3); CPPUNIT_TEST(testOGA_FLAC); CPPUNIT_TEST(testOGA_Vorbis); CPPUNIT_TEST(testMP4_1); CPPUNIT_TEST(testMP4_2); CPPUNIT_TEST(testMP4_3); CPPUNIT_TEST(testMP4_4); CPPUNIT_TEST(testTrueAudio); CPPUNIT_TEST(testAPE); CPPUNIT_TEST(testWav); CPPUNIT_TEST(testAIFF_1); CPPUNIT_TEST(testAIFF_2); CPPUNIT_TEST(testWavPack); CPPUNIT_TEST(testOpus); CPPUNIT_TEST(testUnsupported); CPPUNIT_TEST(testCreate); CPPUNIT_TEST(testAudioProperties); CPPUNIT_TEST(testDefaultFileExtensions); CPPUNIT_TEST(testFileResolver); CPPUNIT_TEST_SUITE_END(); public: template <typename T> void fileRefSave(const string &filename, const string &ext) { ScopedFileCopy copy(filename, ext); string newname = copy.fileName(); { FileRef f(newname.c_str()); CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); CPPUNIT_ASSERT(!f.isNull()); f.tag()->setArtist("test artist"); f.tag()->setTitle("test title"); f.tag()->setGenre("Test!"); f.tag()->setAlbum("albummmm"); f.tag()->setComment("a comment"); f.tag()->setTrack(5); f.tag()->setYear(2020); f.save(); } { FileRef f(newname.c_str()); CPPUNIT_ASSERT(!f.isNull()); CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("test artist")); CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("test title")); CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("Test!")); CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("albummmm")); CPPUNIT_ASSERT_EQUAL(f.tag()->comment(), String("a comment")); CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)5); CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2020); f.tag()->setArtist("ttest artist"); f.tag()->setTitle("ytest title"); f.tag()->setGenre("uTest!"); f.tag()->setAlbum("ialbummmm"); f.tag()->setComment("another comment"); f.tag()->setTrack(7); f.tag()->setYear(2080); f.save(); } { FileRef f(newname.c_str()); CPPUNIT_ASSERT(!f.isNull()); CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("ttest artist")); CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("ytest title")); CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("uTest!")); CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("ialbummmm")); CPPUNIT_ASSERT_EQUAL(f.tag()->comment(), String("another comment")); CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)7); CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2080); } { FileStream fs(newname.c_str()); FileRef f(&fs); CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); CPPUNIT_ASSERT(!f.isNull()); CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("ttest artist")); CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("ytest title")); CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("uTest!")); CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("ialbummmm")); CPPUNIT_ASSERT_EQUAL(f.tag()->comment(), String("another comment")); CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)7); CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2080); f.tag()->setArtist("test artist"); f.tag()->setTitle("test title"); f.tag()->setGenre("Test!"); f.tag()->setAlbum("albummmm"); f.tag()->setComment("a comment"); f.tag()->setTrack(5); f.tag()->setYear(2020); f.save(); } ByteVector fileContent; { FileStream fs(newname.c_str()); FileRef f(&fs); CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); CPPUNIT_ASSERT(!f.isNull()); CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("test artist")); CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("test title")); CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("Test!")); CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("albummmm")); CPPUNIT_ASSERT_EQUAL(f.tag()->comment(), String("a comment")); CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)5); CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2020); fs.seek(0); fileContent = fs.readBlock(fs.length()); } { ByteVectorStream bs(fileContent); FileRef f(&bs); CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); CPPUNIT_ASSERT(!f.isNull()); CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("test artist")); CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("test title")); CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("Test!")); CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("albummmm")); CPPUNIT_ASSERT_EQUAL(f.tag()->comment(), String("a comment")); CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)5); CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2020); f.tag()->setArtist("ttest artist"); f.tag()->setTitle("ytest title"); f.tag()->setGenre("uTest!"); f.tag()->setAlbum("ialbummmm"); f.tag()->setComment("another comment"); f.tag()->setTrack(7); f.tag()->setYear(2080); f.save(); fileContent = *bs.data(); } { ByteVectorStream bs(fileContent); FileRef f(&bs); CPPUNIT_ASSERT(dynamic_cast<T*>(f.file())); CPPUNIT_ASSERT(!f.isNull()); CPPUNIT_ASSERT_EQUAL(f.tag()->artist(), String("ttest artist")); CPPUNIT_ASSERT_EQUAL(f.tag()->title(), String("ytest title")); CPPUNIT_ASSERT_EQUAL(f.tag()->genre(), String("uTest!")); CPPUNIT_ASSERT_EQUAL(f.tag()->album(), String("ialbummmm")); CPPUNIT_ASSERT_EQUAL(f.tag()->comment(), String("another comment")); CPPUNIT_ASSERT_EQUAL(f.tag()->track(), (unsigned int)7); CPPUNIT_ASSERT_EQUAL(f.tag()->year(), (unsigned int)2080); } } void testMusepack() { fileRefSave<MPC::File>("click", ".mpc"); } void testASF() { fileRefSave<ASF::File>("silence-1", ".wma"); } void testVorbis() { fileRefSave<Ogg::Vorbis::File>("empty", ".ogg"); } void testSpeex() { fileRefSave<Ogg::Speex::File>("empty", ".spx"); } void testFLAC() { fileRefSave<FLAC::File>("no-tags", ".flac"); } void testMP3() { fileRefSave<MPEG::File>("xing", ".mp3"); } void testTrueAudio() { fileRefSave<TrueAudio::File>("empty", ".tta"); } void testMP4_1() { fileRefSave<MP4::File>("has-tags", ".m4a"); } void testMP4_2() { fileRefSave<MP4::File>("no-tags", ".m4a"); } void testMP4_3() { fileRefSave<MP4::File>("no-tags", ".3g2"); } void testMP4_4() { fileRefSave<MP4::File>("blank_video", ".m4v"); } void testWav() { fileRefSave<RIFF::WAV::File>("empty", ".wav"); } void testOGA_FLAC() { fileRefSave<Ogg::FLAC::File>("empty_flac", ".oga"); } void testOGA_Vorbis() { fileRefSave<Ogg::Vorbis::File>("empty_vorbis", ".oga"); } void testAPE() { fileRefSave<APE::File>("mac-399", ".ape"); } void testAIFF_1() { fileRefSave<RIFF::AIFF::File>("empty", ".aiff"); } void testAIFF_2() { fileRefSave<RIFF::AIFF::File>("alaw", ".aifc"); } void testWavPack() { fileRefSave<WavPack::File>("click", ".wv"); } void testOpus() { fileRefSave<Ogg::Opus::File>("correctness_gain_silent_output", ".opus"); } void testUnsupported() { FileRef f1(TEST_FILE_PATH_C("no-extension")); CPPUNIT_ASSERT(f1.isNull()); FileRef f2(TEST_FILE_PATH_C("unsupported-extension.xx")); CPPUNIT_ASSERT(f2.isNull()); } void testCreate() { // This is deprecated. But worth it to test. File *f = FileRef::create(TEST_FILE_PATH_C("empty_vorbis.oga")); CPPUNIT_ASSERT(dynamic_cast<Ogg::Vorbis::File*>(f)); delete f; f = FileRef::create(TEST_FILE_PATH_C("xing.mp3")); CPPUNIT_ASSERT(dynamic_cast<MPEG::File*>(f)); delete f; f = FileRef::create(TEST_FILE_PATH_C("test.xm")); CPPUNIT_ASSERT(dynamic_cast<XM::File*>(f)); delete f; } void testAudioProperties() { FileRef f(TEST_FILE_PATH_C("xing.mp3")); const AudioProperties *audioProperties = f.audioProperties(); CPPUNIT_ASSERT_EQUAL(2, audioProperties->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(2064, audioProperties->lengthInMilliseconds()); } void testDefaultFileExtensions() { const StringList extensions = FileRef::defaultFileExtensions(); CPPUNIT_ASSERT(extensions.contains("mpc")); CPPUNIT_ASSERT(extensions.contains("wma")); CPPUNIT_ASSERT(extensions.contains("ogg")); CPPUNIT_ASSERT(extensions.contains("spx")); CPPUNIT_ASSERT(extensions.contains("flac")); CPPUNIT_ASSERT(extensions.contains("mp3")); CPPUNIT_ASSERT(extensions.contains("tta")); CPPUNIT_ASSERT(extensions.contains("m4a")); CPPUNIT_ASSERT(extensions.contains("3g2")); CPPUNIT_ASSERT(extensions.contains("m4v")); CPPUNIT_ASSERT(extensions.contains("wav")); CPPUNIT_ASSERT(extensions.contains("oga")); CPPUNIT_ASSERT(extensions.contains("ape")); CPPUNIT_ASSERT(extensions.contains("aiff")); CPPUNIT_ASSERT(extensions.contains("aifc")); CPPUNIT_ASSERT(extensions.contains("wv")); CPPUNIT_ASSERT(extensions.contains("opus")); CPPUNIT_ASSERT(extensions.contains("xm")); } void testFileResolver() { { FileRef f(TEST_FILE_PATH_C("xing.mp3")); CPPUNIT_ASSERT(dynamic_cast<MPEG::File *>(f.file()) != NULL); } DummyResolver resolver; FileRef::addFileTypeResolver(&resolver); { FileRef f(TEST_FILE_PATH_C("xing.mp3")); CPPUNIT_ASSERT(dynamic_cast<Ogg::Vorbis::File *>(f.file()) != NULL); } DummyStreamResolver streamResolver; FileRef::addFileTypeResolver(&streamResolver); { FileStream s(TEST_FILE_PATH_C("xing.mp3")); FileRef f(&s); CPPUNIT_ASSERT(dynamic_cast<MP4::File *>(f.file()) != NULL); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestFileRef); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_flac.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000055065�14447736377�0016712�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2009 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tstringlist.h> #include <tbytevectorlist.h> #include <tpropertymap.h> #include <flacfile.h> #include <xiphcomment.h> #include <id3v1tag.h> #include <id3v2tag.h> #include <cppunit/extensions/HelperMacros.h> #include "plainfile.h" #include "utils.h" using namespace std; using namespace TagLib; class TestFLAC : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestFLAC); CPPUNIT_TEST(testSignature); CPPUNIT_TEST(testMultipleCommentBlocks); CPPUNIT_TEST(testReadPicture); CPPUNIT_TEST(testAddPicture); CPPUNIT_TEST(testReplacePicture); CPPUNIT_TEST(testRemoveAllPictures); CPPUNIT_TEST(testRepeatedSave1); CPPUNIT_TEST(testRepeatedSave2); CPPUNIT_TEST(testRepeatedSave3); CPPUNIT_TEST(testSaveMultipleValues); CPPUNIT_TEST(testDict); CPPUNIT_TEST(testProperties); CPPUNIT_TEST(testInvalid); CPPUNIT_TEST(testAudioProperties); CPPUNIT_TEST(testZeroSizedPadding1); CPPUNIT_TEST(testZeroSizedPadding2); CPPUNIT_TEST(testShrinkPadding); CPPUNIT_TEST(testSaveID3v1); CPPUNIT_TEST(testUpdateID3v2); CPPUNIT_TEST(testEmptyID3v2); CPPUNIT_TEST(testStripTags); CPPUNIT_TEST(testRemoveXiphField); CPPUNIT_TEST(testEmptySeekTable); CPPUNIT_TEST(testPictureStoredAfterComment); CPPUNIT_TEST_SUITE_END(); public: void testSignature() { FLAC::File f(TEST_FILE_PATH_C("no-tags.flac")); CPPUNIT_ASSERT_EQUAL(ByteVector("a1b141f766e9849ac3db1030a20a3c77"), f.audioProperties()->signature().toHex()); } void testMultipleCommentBlocks() { ScopedFileCopy copy("multiple-vc", ".flac"); string newname = copy.fileName(); { FLAC::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(String("Artist 1"), f.tag()->artist()); f.tag()->setArtist("The Artist"); f.save(); } { FLAC::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(String("The Artist"), f.tag()->artist()); CPPUNIT_ASSERT_EQUAL(69L, f.find("Artist")); CPPUNIT_ASSERT_EQUAL(-1L, f.find("Artist", 70)); } } void testReadPicture() { ScopedFileCopy copy("silence-44-s", ".flac"); string newname = copy.fileName(); FLAC::File f(newname.c_str()); List<FLAC::Picture *> lst = f.pictureList(); CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); FLAC::Picture *pic = lst.front(); CPPUNIT_ASSERT_EQUAL(FLAC::Picture::FrontCover, pic->type()); CPPUNIT_ASSERT_EQUAL(1, pic->width()); CPPUNIT_ASSERT_EQUAL(1, pic->height()); CPPUNIT_ASSERT_EQUAL(24, pic->colorDepth()); CPPUNIT_ASSERT_EQUAL(0, pic->numColors()); CPPUNIT_ASSERT_EQUAL(String("image/png"), pic->mimeType()); CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic->description()); CPPUNIT_ASSERT_EQUAL((unsigned int)150, pic->data().size()); } void testAddPicture() { ScopedFileCopy copy("silence-44-s", ".flac"); string newname = copy.fileName(); { FLAC::File f(newname.c_str()); List<FLAC::Picture *> lst = f.pictureList(); CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); FLAC::Picture *newpic = new FLAC::Picture(); newpic->setType(FLAC::Picture::BackCover); newpic->setWidth(5); newpic->setHeight(6); newpic->setColorDepth(16); newpic->setNumColors(7); newpic->setMimeType("image/jpeg"); newpic->setDescription("new image"); newpic->setData("JPEG data"); f.addPicture(newpic); f.save(); } { FLAC::File f(newname.c_str()); List<FLAC::Picture *> lst = f.pictureList(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, lst.size()); FLAC::Picture *pic = lst[0]; CPPUNIT_ASSERT_EQUAL(FLAC::Picture::FrontCover, pic->type()); CPPUNIT_ASSERT_EQUAL(1, pic->width()); CPPUNIT_ASSERT_EQUAL(1, pic->height()); CPPUNIT_ASSERT_EQUAL(24, pic->colorDepth()); CPPUNIT_ASSERT_EQUAL(0, pic->numColors()); CPPUNIT_ASSERT_EQUAL(String("image/png"), pic->mimeType()); CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic->description()); CPPUNIT_ASSERT_EQUAL((unsigned int)150, pic->data().size()); pic = lst[1]; CPPUNIT_ASSERT_EQUAL(FLAC::Picture::BackCover, pic->type()); CPPUNIT_ASSERT_EQUAL(5, pic->width()); CPPUNIT_ASSERT_EQUAL(6, pic->height()); CPPUNIT_ASSERT_EQUAL(16, pic->colorDepth()); CPPUNIT_ASSERT_EQUAL(7, pic->numColors()); CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), pic->mimeType()); CPPUNIT_ASSERT_EQUAL(String("new image"), pic->description()); CPPUNIT_ASSERT_EQUAL(ByteVector("JPEG data"), pic->data()); } } void testReplacePicture() { ScopedFileCopy copy("silence-44-s", ".flac"); string newname = copy.fileName(); { FLAC::File f(newname.c_str()); List<FLAC::Picture *> lst = f.pictureList(); CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); FLAC::Picture *newpic = new FLAC::Picture(); newpic->setType(FLAC::Picture::BackCover); newpic->setWidth(5); newpic->setHeight(6); newpic->setColorDepth(16); newpic->setNumColors(7); newpic->setMimeType("image/jpeg"); newpic->setDescription("new image"); newpic->setData("JPEG data"); f.removePictures(); f.addPicture(newpic); f.save(); } { FLAC::File f(newname.c_str()); List<FLAC::Picture *> lst = f.pictureList(); CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); FLAC::Picture *pic = lst[0]; CPPUNIT_ASSERT_EQUAL(FLAC::Picture::BackCover, pic->type()); CPPUNIT_ASSERT_EQUAL(5, pic->width()); CPPUNIT_ASSERT_EQUAL(6, pic->height()); CPPUNIT_ASSERT_EQUAL(16, pic->colorDepth()); CPPUNIT_ASSERT_EQUAL(7, pic->numColors()); CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), pic->mimeType()); CPPUNIT_ASSERT_EQUAL(String("new image"), pic->description()); CPPUNIT_ASSERT_EQUAL(ByteVector("JPEG data"), pic->data()); } } void testRemoveAllPictures() { ScopedFileCopy copy("silence-44-s", ".flac"); string newname = copy.fileName(); { FLAC::File f(newname.c_str()); List<FLAC::Picture *> lst = f.pictureList(); CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); f.removePictures(); f.save(); } { FLAC::File f(newname.c_str()); List<FLAC::Picture *> lst = f.pictureList(); CPPUNIT_ASSERT_EQUAL((unsigned int)0, lst.size()); } } void testRepeatedSave1() { ScopedFileCopy copy("silence-44-s", ".flac"); string newname = copy.fileName(); { FLAC::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(String("Silence"), f.tag()->title()); f.tag()->setTitle("NEW TITLE"); f.save(); CPPUNIT_ASSERT_EQUAL(String("NEW TITLE"), f.tag()->title()); f.tag()->setTitle("NEW TITLE 2"); f.save(); CPPUNIT_ASSERT_EQUAL(String("NEW TITLE 2"), f.tag()->title()); } { FLAC::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(String("NEW TITLE 2"), f.tag()->title()); } } void testRepeatedSave2() { ScopedFileCopy copy("no-tags", ".flac"); FLAC::File f(copy.fileName().c_str()); f.ID3v2Tag(true)->setTitle("0123456789"); f.save(); CPPUNIT_ASSERT_EQUAL(5735L, f.length()); f.save(); CPPUNIT_ASSERT_EQUAL(5735L, f.length()); CPPUNIT_ASSERT(f.find("fLaC") >= 0); } void testRepeatedSave3() { ScopedFileCopy copy("no-tags", ".flac"); FLAC::File f(copy.fileName().c_str()); f.xiphComment()->setTitle(longText(8 * 1024)); f.save(); CPPUNIT_ASSERT_EQUAL(12862L, f.length()); f.save(); CPPUNIT_ASSERT_EQUAL(12862L, f.length()); } void testSaveMultipleValues() { ScopedFileCopy copy("silence-44-s", ".flac"); string newname = copy.fileName(); { FLAC::File f(newname.c_str()); f.xiphComment(true)->addField("ARTIST", "artist 1", true); f.xiphComment(true)->addField("ARTIST", "artist 2", false); f.save(); } { FLAC::File f(newname.c_str()); Ogg::FieldListMap m = f.xiphComment()->fieldListMap(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, m["ARTIST"].size()); CPPUNIT_ASSERT_EQUAL(String("artist 1"), m["ARTIST"][0]); CPPUNIT_ASSERT_EQUAL(String("artist 2"), m["ARTIST"][1]); } } void testDict() { // test unicode & multiple values with dict interface ScopedFileCopy copy("silence-44-s", ".flac"); string newname = copy.fileName(); { FLAC::File f(newname.c_str()); PropertyMap dict; dict["ARTIST"].append("artøst 1"); dict["ARTIST"].append("artöst 2"); f.setProperties(dict); f.save(); } { FLAC::File f(newname.c_str()); PropertyMap dict = f.properties(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, dict["ARTIST"].size()); CPPUNIT_ASSERT_EQUAL(String("artøst 1"), dict["ARTIST"][0]); CPPUNIT_ASSERT_EQUAL(String("artöst 2"), dict["ARTIST"][1]); } } void testProperties() { PropertyMap tags; tags["ALBUM"] = StringList("Album"); tags["ALBUMARTIST"] = StringList("Album Artist"); tags["ALBUMARTISTSORT"] = StringList("Album Artist Sort"); tags["ALBUMSORT"] = StringList("Album Sort"); tags["ARTIST"] = StringList("Artist"); tags["ARTISTS"] = StringList("Artists"); tags["ARTISTSORT"] = StringList("Artist Sort"); tags["ASIN"] = StringList("ASIN"); tags["BARCODE"] = StringList("Barcode"); tags["CATALOGNUMBER"] = StringList("Catalog Number 1").append("Catalog Number 2"); tags["COMMENT"] = StringList("Comment"); tags["DATE"] = StringList("2021-01-10"); tags["DISCNUMBER"] = StringList("3"); tags["DISCTOTAL"] = StringList("5"); tags["GENRE"] = StringList("Genre"); tags["ISRC"] = StringList("UKAAA0500001"); tags["LABEL"] = StringList("Label 1").append("Label 2"); tags["MEDIA"] = StringList("Media"); tags["MUSICBRAINZ_ALBUMARTISTID"] = StringList("MusicBrainz_AlbumartistID"); tags["MUSICBRAINZ_ALBUMID"] = StringList("MusicBrainz_AlbumID"); tags["MUSICBRAINZ_ARTISTID"] = StringList("MusicBrainz_ArtistID"); tags["MUSICBRAINZ_RELEASEGROUPID"] = StringList("MusicBrainz_ReleasegroupID"); tags["MUSICBRAINZ_RELEASETRACKID"] = StringList("MusicBrainz_ReleasetrackID"); tags["MUSICBRAINZ_TRACKID"] = StringList("MusicBrainz_TrackID"); tags["ORIGINALDATE"] = StringList("2021-01-09"); tags["RELEASECOUNTRY"] = StringList("Release Country"); tags["RELEASESTATUS"] = StringList("Release Status"); tags["RELEASETYPE"] = StringList("Release Type"); tags["SCRIPT"] = StringList("Script"); tags["TITLE"] = StringList("Title"); tags["TRACKNUMBER"] = StringList("2"); tags["TRACKTOTAL"] = StringList("4"); ScopedFileCopy copy("no-tags", ".flac"); { FLAC::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); CPPUNIT_ASSERT(properties.isEmpty()); f.setProperties(tags); f.save(); } { const FLAC::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); if (tags != properties) { CPPUNIT_ASSERT_EQUAL(tags.toString(), properties.toString()); } CPPUNIT_ASSERT(tags == properties); } } void testInvalid() { ScopedFileCopy copy("silence-44-s", ".flac"); PropertyMap map; map[L"H\x00c4\x00d6"] = String("bla"); FLAC::File f(copy.fileName().c_str()); PropertyMap invalid = f.setProperties(map); CPPUNIT_ASSERT_EQUAL((unsigned int)1, invalid.size()); CPPUNIT_ASSERT_EQUAL((unsigned int)0, f.properties().size()); } void testAudioProperties() { FLAC::File f(TEST_FILE_PATH_C("sinewave.flac")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(145, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(156556ULL, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL( ByteVector("\xcf\xe3\xd9\xda\xba\xde\xab\x2c\xbf\x2c\xa2\x35\x27\x4b\x7f\x76"), f.audioProperties()->signature()); } void testZeroSizedPadding1() { ScopedFileCopy copy("zero-sized-padding", ".flac"); FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); } void testZeroSizedPadding2() { ScopedFileCopy copy("silence-44-s", ".flac"); { FLAC::File f(copy.fileName().c_str()); f.xiphComment()->setTitle("ABC"); f.save(); } { FLAC::File f(copy.fileName().c_str()); f.xiphComment()->setTitle(std::string(3067, 'X').c_str()); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); } } void testShrinkPadding() { ScopedFileCopy copy("no-tags", ".flac"); { FLAC::File f(copy.fileName().c_str()); f.xiphComment()->setTitle(longText(128 * 1024)); f.save(); CPPUNIT_ASSERT(f.length() > 128 * 1024); } { FLAC::File f(copy.fileName().c_str()); f.xiphComment()->setTitle("0123456789"); f.save(); CPPUNIT_ASSERT(f.length() < 8 * 1024); } } void testSaveID3v1() { ScopedFileCopy copy("no-tags", ".flac"); ByteVector audioStream; { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); CPPUNIT_ASSERT_EQUAL((long)4692, f.length()); f.seek(0x0100); audioStream = f.readBlock(4436); f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.save(); CPPUNIT_ASSERT(f.hasID3v1Tag()); CPPUNIT_ASSERT_EQUAL((long)4820, f.length()); f.seek(0x0100); CPPUNIT_ASSERT_EQUAL(audioStream, f.readBlock(4436)); } } void testUpdateID3v2() { ScopedFileCopy copy("no-tags", ".flac"); { FLAC::File f(copy.fileName().c_str()); f.ID3v2Tag(true)->setTitle("0123456789"); f.save(); } { FLAC::File f(copy.fileName().c_str()); f.ID3v2Tag()->setTitle("ABCDEFGHIJ"); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT_EQUAL(String("ABCDEFGHIJ"), f.ID3v2Tag()->title()); } } void testEmptyID3v2() { ScopedFileCopy copy("no-tags", ".flac"); { FLAC::File f(copy.fileName().c_str()); f.ID3v2Tag(true); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); } } void testStripTags() { ScopedFileCopy copy("silence-44-s", ".flac"); { FLAC::File f(copy.fileName().c_str()); f.xiphComment(true)->setTitle("XiphComment Title"); f.ID3v1Tag(true)->setTitle("ID3v1 Title"); f.ID3v2Tag(true)->setTitle("ID3v2 Title"); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasXiphComment()); CPPUNIT_ASSERT(f.hasID3v1Tag()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String("XiphComment Title"), f.xiphComment()->title()); CPPUNIT_ASSERT_EQUAL(String("ID3v1 Title"), f.ID3v1Tag()->title()); CPPUNIT_ASSERT_EQUAL(String("ID3v2 Title"), f.ID3v2Tag()->title()); f.strip(FLAC::File::ID3v2); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasXiphComment()); CPPUNIT_ASSERT(f.hasID3v1Tag()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String("XiphComment Title"), f.xiphComment()->title()); CPPUNIT_ASSERT_EQUAL(String("ID3v1 Title"), f.ID3v1Tag()->title()); f.strip(FLAC::File::ID3v1); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasXiphComment()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String("XiphComment Title"), f.xiphComment()->title()); f.strip(FLAC::File::XiphComment); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasXiphComment()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); CPPUNIT_ASSERT(f.xiphComment()->isEmpty()); CPPUNIT_ASSERT_EQUAL(String("reference libFLAC 1.1.0 20030126"), f.xiphComment()->vendorID()); } } void testRemoveXiphField() { ScopedFileCopy copy("silence-44-s", ".flac"); { FLAC::File f(copy.fileName().c_str()); f.xiphComment(true)->setTitle("XiphComment Title"); f.ID3v2Tag(true)->setTitle("ID3v2 Title"); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT_EQUAL(String("XiphComment Title"), f.xiphComment()->title()); f.xiphComment()->removeFields("TITLE"); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT_EQUAL(String(), f.xiphComment()->title()); } } void testEmptySeekTable() { ScopedFileCopy copy("empty-seektable", ".flac"); { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); f.xiphComment(true)->setTitle("XiphComment Title"); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); f.seek(42); const ByteVector data = f.readBlock(4); CPPUNIT_ASSERT_EQUAL(ByteVector("\x03\x00\x00\x00", 4), data); } } void testPictureStoredAfterComment() { // Blank.png from https://commons.wikimedia.org/wiki/File:Blank.png const unsigned char blankPngData[] = { 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x08, 0x06, 0x00, 0x00, 0x00, 0x9d, 0x74, 0x66, 0x1a, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1, 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0e, 0xc3, 0x00, 0x00, 0x0e, 0xc3, 0x01, 0xc7, 0x6f, 0xa8, 0x64, 0x00, 0x00, 0x00, 0x0c, 0x49, 0x44, 0x41, 0x54, 0x18, 0x57, 0x63, 0xc0, 0x01, 0x18, 0x18, 0x00, 0x00, 0x1a, 0x00, 0x01, 0x82, 0x92, 0x4d, 0x60, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; const ByteVector picData(reinterpret_cast<const char *>(blankPngData), sizeof(blankPngData)); ScopedFileCopy copy("no-tags", ".flac"); { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); CPPUNIT_ASSERT(!f.hasXiphComment()); CPPUNIT_ASSERT(f.pictureList().isEmpty()); FLAC::Picture *pic = new FLAC::Picture; pic->setData(picData); pic->setType(FLAC::Picture::FrontCover); pic->setMimeType("image/png"); pic->setDescription("blank.png"); pic->setWidth(3); pic->setHeight(2); pic->setColorDepth(32); pic->setNumColors(0); f.addPicture(pic); f.xiphComment(true)->setTitle("Title"); f.save(); } { FLAC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); CPPUNIT_ASSERT(f.hasXiphComment()); const List<FLAC::Picture *> pictures = f.pictureList(); CPPUNIT_ASSERT_EQUAL(1U, pictures.size()); CPPUNIT_ASSERT_EQUAL(picData, pictures[0]->data()); CPPUNIT_ASSERT_EQUAL(FLAC::Picture::FrontCover, pictures[0]->type()); CPPUNIT_ASSERT_EQUAL(String("image/png"), pictures[0]->mimeType()); CPPUNIT_ASSERT_EQUAL(String("blank.png"), pictures[0]->description()); CPPUNIT_ASSERT_EQUAL(3, pictures[0]->width()); CPPUNIT_ASSERT_EQUAL(2, pictures[0]->height()); CPPUNIT_ASSERT_EQUAL(32, pictures[0]->colorDepth()); CPPUNIT_ASSERT_EQUAL(0, pictures[0]->numColors()); CPPUNIT_ASSERT_EQUAL(String("Title"), f.xiphComment(false)->title()); } const unsigned char expectedHeadData[] = { 'f', 'L', 'a', 'C', 0x00, 0x00, 0x00, 0x22, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x10, 0x0a, 0xc4, 0x42, 0xf0, 0x00, 0x02, 0x7a, 0xc0, 0xa1, 0xb1, 0x41, 0xf7, 0x66, 0xe9, 0x84, 0x9a, 0xc3, 0xdb, 0x10, 0x30, 0xa2, 0x0a, 0x3c, 0x77, 0x04, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 'T', 'I', 'T', 'L', 'E', '=', 'T', 'i', 't', 'l', 'e', 0x06, 0x00, 0x00, 0xa9, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 'i', 'm', 'a', 'g', 'e', '/', 'p', 'n', 'g', 0x00, 0x00, 0x00, 0x09, 'b', 'l', 'a', 'n', 'k', '.', 'p', 'n', 'g', 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77 }; ByteVector expectedData(reinterpret_cast<const char *>(expectedHeadData), sizeof(expectedHeadData)); expectedData.append(picData); const ByteVector fileData = PlainFile(copy.fileName().c_str()).readAll(); CPPUNIT_ASSERT(fileData.startsWith(expectedData)); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestFLAC); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_flacpicture.cpp������������������������������������������������������������0000664�0000000�0000000�00000012523�14447736377�0020276�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2010 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tstringlist.h> #include <tbytevectorlist.h> #include <flacfile.h> #include <flacmetadatablock.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestFLACPicture : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestFLACPicture); CPPUNIT_TEST(testParse); CPPUNIT_TEST(testPassThrough); CPPUNIT_TEST_SUITE_END(); public: void testParse() { const unsigned char data[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x08, 0x41, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x2E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xD6, 0x0B, 0x1C, 0x0A, 0x36, 0x06, 0x08, 0x44, 0x3D, 0x32, 0x00, 0x00, 0x00, 0x1D, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4D, 0x50, 0xEF, 0x64, 0x25, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x05, 0xFE, 0x02, 0xFE, 0xDC, 0xCC, 0x59, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 }; const char *pdata = reinterpret_cast<const char*>(data); FLAC::Picture pic(ByteVector(pdata, 199)); CPPUNIT_ASSERT_EQUAL(3, int(pic.type())); CPPUNIT_ASSERT_EQUAL(1, pic.width()); CPPUNIT_ASSERT_EQUAL(1, pic.height()); CPPUNIT_ASSERT_EQUAL(24, pic.colorDepth()); CPPUNIT_ASSERT_EQUAL(0, pic.numColors()); CPPUNIT_ASSERT_EQUAL(String("image/png"), pic.mimeType()); CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic.description()); CPPUNIT_ASSERT_EQUAL((unsigned int)150, pic.data().size()); } void testPassThrough() { const unsigned char data[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x08, 0x41, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x2E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xD6, 0x0B, 0x1C, 0x0A, 0x36, 0x06, 0x08, 0x44, 0x3D, 0x32, 0x00, 0x00, 0x00, 0x1D, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4D, 0x50, 0xEF, 0x64, 0x25, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x05, 0xFE, 0x02, 0xFE, 0xDC, 0xCC, 0x59, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 }; const char *pdata = reinterpret_cast<const char*>(data); FLAC::Picture pic(ByteVector(pdata, 199)); CPPUNIT_ASSERT_EQUAL(ByteVector(pdata, 199), pic.render()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestFLACPicture); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_flacunknownmetadatablock.cpp�����������������������������������������������0000664�0000000�0000000�00000005217�14447736377�0023040�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tstringlist.h> #include <tbytevectorlist.h> #include <flacunknownmetadatablock.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestFLACUnknownMetadataBlock : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestFLACUnknownMetadataBlock); CPPUNIT_TEST(testAccessors); CPPUNIT_TEST_SUITE_END(); public: void testAccessors() { ByteVector data("abc\x01", 4); FLAC::UnknownMetadataBlock block(42, data); CPPUNIT_ASSERT_EQUAL(42, block.code()); CPPUNIT_ASSERT_EQUAL(data, block.data()); CPPUNIT_ASSERT_EQUAL(data, block.render()); ByteVector data2("xxx", 3); block.setCode(13); block.setData(data2); CPPUNIT_ASSERT_EQUAL(13, block.code()); CPPUNIT_ASSERT_EQUAL(data2, block.data()); CPPUNIT_ASSERT_EQUAL(data2, block.render()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestFLACUnknownMetadataBlock); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_id3v1.cpp������������������������������������������������������������������0000664�0000000�0000000�00000006321�14447736377�0016722�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tstring.h> #include <mpegfile.h> #include <id3v1tag.h> #include <id3v1genres.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestID3v1 : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestID3v1); CPPUNIT_TEST(testStripWhiteSpace); CPPUNIT_TEST(testGenres); CPPUNIT_TEST(testRenamedGenres); CPPUNIT_TEST_SUITE_END(); public: void testStripWhiteSpace() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); { MPEG::File f(newname.c_str()); f.ID3v1Tag(true)->setArtist("Artist "); f.save(); } { MPEG::File f(newname.c_str()); CPPUNIT_ASSERT(f.ID3v1Tag(false)); CPPUNIT_ASSERT_EQUAL(String("Artist"), f.ID3v1Tag(false)->artist()); } } void testGenres() { CPPUNIT_ASSERT_EQUAL(String("Darkwave"), ID3v1::genre(50)); CPPUNIT_ASSERT_EQUAL(100, ID3v1::genreIndex("Humour")); CPPUNIT_ASSERT(ID3v1::genreList().contains("Heavy Metal")); CPPUNIT_ASSERT_EQUAL(79, ID3v1::genreMap()["Hard Rock"]); } void testRenamedGenres() { CPPUNIT_ASSERT_EQUAL(String("Bebop"), ID3v1::genre(85)); CPPUNIT_ASSERT_EQUAL(85, ID3v1::genreIndex("Bebop")); CPPUNIT_ASSERT_EQUAL(85, ID3v1::genreIndex("Bebob")); ID3v1::Tag tag; tag.setGenre("Hardcore"); CPPUNIT_ASSERT_EQUAL(String("Hardcore Techno"), tag.genre()); CPPUNIT_ASSERT_EQUAL(129U, tag.genreNumber()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v1); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_id3v2.cpp������������������������������������������������������������������0000664�0000000�0000000�00000204754�14447736377�0016735�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ /*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <id3v2tag.h> #include <mpegfile.h> #include <id3v2frame.h> #include <uniquefileidentifierframe.h> #include <textidentificationframe.h> #include <attachedpictureframe.h> #include <unsynchronizedlyricsframe.h> #include <synchronizedlyricsframe.h> #include <eventtimingcodesframe.h> #include <generalencapsulatedobjectframe.h> #include <relativevolumeframe.h> #include <popularimeterframe.h> #include <urllinkframe.h> #include <ownershipframe.h> #include <unknownframe.h> #include <chapterframe.h> #include <tableofcontentsframe.h> #include <commentsframe.h> #include <podcastframe.h> #include <privateframe.h> #include <tdebug.h> #include <tpropertymap.h> #include <tzlib.h> #include <cppunit/extensions/HelperMacros.h> #include "plainfile.h" #include "utils.h" using namespace std; using namespace TagLib; class PublicFrame : public ID3v2::Frame { public: PublicFrame() : ID3v2::Frame(ByteVector("XXXX\0\0\0\0\0\0", 10)) {} String readStringField(const ByteVector &data, String::Type encoding, int *position = 0) { return ID3v2::Frame::readStringField(data, encoding, position); } virtual String toString() const { return String(); } virtual void parseFields(const ByteVector &) {} virtual ByteVector renderFields() const { return ByteVector(); } }; class TestID3v2 : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestID3v2); CPPUNIT_TEST(testUnsynchDecode); CPPUNIT_TEST(testDowngradeUTF8ForID3v23_1); CPPUNIT_TEST(testDowngradeUTF8ForID3v23_2); CPPUNIT_TEST(testUTF16BEDelimiter); CPPUNIT_TEST(testUTF16Delimiter); CPPUNIT_TEST(testReadStringField); CPPUNIT_TEST(testParseAPIC); CPPUNIT_TEST(testParseAPIC_UTF16_BOM); CPPUNIT_TEST(testParseAPICv22); CPPUNIT_TEST(testRenderAPIC); CPPUNIT_TEST(testDontRender22); CPPUNIT_TEST(testParseGEOB); CPPUNIT_TEST(testRenderGEOB); CPPUNIT_TEST(testPOPMtoString); CPPUNIT_TEST(testParsePOPM); CPPUNIT_TEST(testParsePOPMWithoutCounter); CPPUNIT_TEST(testRenderPOPM); CPPUNIT_TEST(testPOPMFromFile); CPPUNIT_TEST(testParseRelativeVolumeFrame); CPPUNIT_TEST(testRenderRelativeVolumeFrame); CPPUNIT_TEST(testParseUniqueFileIdentifierFrame); CPPUNIT_TEST(testParseEmptyUniqueFileIdentifierFrame); CPPUNIT_TEST(testRenderUniqueFileIdentifierFrame); CPPUNIT_TEST(testBrokenFrame1); CPPUNIT_TEST(testItunes24FrameSize); CPPUNIT_TEST(testParseUrlLinkFrame); CPPUNIT_TEST(testRenderUrlLinkFrame); CPPUNIT_TEST(testParseUserUrlLinkFrame); CPPUNIT_TEST(testRenderUserUrlLinkFrame); CPPUNIT_TEST(testParseOwnershipFrame); CPPUNIT_TEST(testRenderOwnershipFrame); CPPUNIT_TEST(testParseSynchronizedLyricsFrame); CPPUNIT_TEST(testParseSynchronizedLyricsFrameWithEmptyDescritpion); CPPUNIT_TEST(testRenderSynchronizedLyricsFrame); CPPUNIT_TEST(testParseEventTimingCodesFrame); CPPUNIT_TEST(testRenderEventTimingCodesFrame); CPPUNIT_TEST(testParseCommentsFrame); CPPUNIT_TEST(testRenderCommentsFrame); CPPUNIT_TEST(testParsePodcastFrame); CPPUNIT_TEST(testRenderPodcastFrame); CPPUNIT_TEST(testParsePrivateFrame); CPPUNIT_TEST(testRenderPrivateFrame); CPPUNIT_TEST(testParseUserTextIdentificationFrame); CPPUNIT_TEST(testRenderUserTextIdentificationFrame); CPPUNIT_TEST(testSaveUTF16Comment); CPPUNIT_TEST(testUpdateGenre23_1); CPPUNIT_TEST(testUpdateGenre23_2); CPPUNIT_TEST(testUpdateGenre23_3); CPPUNIT_TEST(testUpdateGenre24); CPPUNIT_TEST(testUpdateDate22); CPPUNIT_TEST(testDowngradeTo23); // CPPUNIT_TEST(testUpdateFullDate22); TODO TYE+TDA should be upgraded to TDRC together CPPUNIT_TEST(testCompressedFrameWithBrokenLength); CPPUNIT_TEST(testW000); CPPUNIT_TEST(testPropertyInterface); CPPUNIT_TEST(testPropertyInterface2); CPPUNIT_TEST(testPropertiesMovement); CPPUNIT_TEST(testPropertyGrouping); CPPUNIT_TEST(testDeleteFrame); CPPUNIT_TEST(testSaveAndStripID3v1ShouldNotAddFrameFromID3v1ToId3v2); CPPUNIT_TEST(testParseChapterFrame); CPPUNIT_TEST(testRenderChapterFrame); CPPUNIT_TEST(testParseTableOfContentsFrame); CPPUNIT_TEST(testRenderTableOfContentsFrame); CPPUNIT_TEST(testShrinkPadding); CPPUNIT_TEST(testEmptyFrame); CPPUNIT_TEST(testDuplicateTags); CPPUNIT_TEST(testParseTOCFrameWithManyChildren); CPPUNIT_TEST_SUITE_END(); public: void testUnsynchDecode() { MPEG::File f(TEST_FILE_PATH_C("unsynch.id3"), false); CPPUNIT_ASSERT(f.tag()); CPPUNIT_ASSERT_EQUAL(String("My babe just cares for me"), f.tag()->title()); } void testDowngradeUTF8ForID3v23_1() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); ID3v2::TextIdentificationFrame *f = new ID3v2::TextIdentificationFrame(ByteVector("TPE1"), String::UTF8); StringList sl; sl.append("Foo"); f->setText(sl); MPEG::File file(newname.c_str()); file.ID3v2Tag(true)->addFrame(f); file.save(MPEG::File::ID3v2, File::StripOthers, ID3v2::v3); CPPUNIT_ASSERT_EQUAL(true, file.hasID3v2Tag()); ByteVector data = f->render(); CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+6+2), data.size()); ID3v2::TextIdentificationFrame f2(data); CPPUNIT_ASSERT_EQUAL(sl, f2.fieldList()); CPPUNIT_ASSERT_EQUAL(String::UTF16, f2.textEncoding()); } void testDowngradeUTF8ForID3v23_2() { ScopedFileCopy copy("xing", ".mp3"); ID3v2::UnsynchronizedLyricsFrame *f = new ID3v2::UnsynchronizedLyricsFrame(String::UTF8); f->setText("Foo"); MPEG::File file(copy.fileName().c_str()); file.ID3v2Tag(true)->addFrame(f); file.save(MPEG::File::ID3v2, File::StripOthers, ID3v2::v3); CPPUNIT_ASSERT(file.hasID3v2Tag()); ByteVector data = f->render(); CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+3+2+2+6+2), data.size()); ID3v2::UnsynchronizedLyricsFrame f2(data); CPPUNIT_ASSERT_EQUAL(String("Foo"), f2.text()); CPPUNIT_ASSERT_EQUAL(String::UTF16, f2.textEncoding()); } void testUTF16BEDelimiter() { ID3v2::TextIdentificationFrame f(ByteVector("TPE1"), String::UTF16BE); StringList sl; sl.append("Foo"); sl.append("Bar"); f.setText(sl); ByteVector data = f.render(); CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+6+2+6), data.size()); ByteVector noBomBeData("TPE1\x00\x00\x00\x0f\x00\x00\x02" "\0F\0o\0o\0\0" "\0B\0a\0r", 25); CPPUNIT_ASSERT_EQUAL(noBomBeData, data); f.setData(data); CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.toString()); } void testUTF16Delimiter() { ID3v2::TextIdentificationFrame f(ByteVector("TPE1"), String::UTF16); StringList sl; sl.append("Foo"); sl.append("Bar"); f.setText(sl); ByteVector data = f.render(); CPPUNIT_ASSERT_EQUAL((unsigned int)(4+4+2+1+8+2+8), data.size()); ByteVector multiBomLeData("TPE1\x00\x00\x00\x13\x00\x00\x01\xff\xfe" "F\0o\0o\0\0\0" "\xff\xfe" "B\0a\0r\0", 29); CPPUNIT_ASSERT_EQUAL(multiBomLeData, data); f.setData(data); CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.toString()); ByteVector multiBomBeData("TPE1\x00\x00\x00\x13\x00\x00\x01\xfe\xff" "\0F\0o\0o\0\0" "\xfe\xff" "\0B\0a\0r", 29); f.setData(multiBomBeData); CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.toString()); ByteVector singleBomLeData("TPE1\x00\x00\x00\x13\x00\x00\x01\xff\xfe" "F\0o\0o\0\0\0" "B\0a\0r\0", 27); f.setData(singleBomLeData); CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.toString()); ByteVector singleBomBeData("TPE1\x00\x00\x00\x13\x00\x00\x01\xfe\xff" "\0F\0o\0o\0\0" "\0B\0a\0r", 27); f.setData(singleBomBeData); CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.toString()); } void testBrokenFrame1() { MPEG::File f(TEST_FILE_PATH_C("broken-tenc.id3"), false); CPPUNIT_ASSERT(f.tag()); CPPUNIT_ASSERT(!f.ID3v2Tag()->frameListMap().contains("TENC")); } void testReadStringField() { PublicFrame f; ByteVector data("abc\0", 4); String str = f.readStringField(data, String::Latin1); CPPUNIT_ASSERT_EQUAL(String("abc"), str); } // http://bugs.kde.org/show_bug.cgi?id=151078 void testParseAPIC() { ID3v2::AttachedPictureFrame f(ByteVector("APIC" "\x00\x00\x00\x07" "\x00\x00" "\x00" "m\x00" "\x01" "d\x00" "\x00", 17)); CPPUNIT_ASSERT_EQUAL(String("m"), f.mimeType()); CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::FileIcon, f.type()); CPPUNIT_ASSERT_EQUAL(String("d"), f.description()); } void testParseAPIC_UTF16_BOM() { ID3v2::AttachedPictureFrame f(ByteVector( "\x41\x50\x49\x43\x00\x02\x0c\x59\x00\x00\x01\x69\x6d\x61\x67\x65" "\x2f\x6a\x70\x65\x67\x00\x00\xfe\xff\x00\x63\x00\x6f\x00\x76\x00" "\x65\x00\x72\x00\x2e\x00\x6a\x00\x70\x00\x67\x00\x00\xff\xd8\xff", 16 * 3)); CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), f.mimeType()); CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::Other, f.type()); CPPUNIT_ASSERT_EQUAL(String("cover.jpg"), f.description()); CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\xd8\xff", 3), f.picture()); } void testParseAPICv22() { ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("PIC" "\x00\x00\x08" "\x00" "JPG" "\x01" "d\x00" "\x00", 14); ID3v2::Header header; header.setMajorVersion(2); ID3v2::AttachedPictureFrame *frame = dynamic_cast<TagLib::ID3v2::AttachedPictureFrame *>(factory->createFrame(data, &header)); CPPUNIT_ASSERT(frame); CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), frame->mimeType()); CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::FileIcon, frame->type()); CPPUNIT_ASSERT_EQUAL(String("d"), frame->description()); delete frame; } void testRenderAPIC() { ID3v2::AttachedPictureFrame f; f.setTextEncoding(String::UTF8); f.setMimeType("image/png"); f.setType(ID3v2::AttachedPictureFrame::BackCover); f.setDescription("Description"); f.setPicture("PNG data"); CPPUNIT_ASSERT_EQUAL( ByteVector("APIC" "\x00\x00\x00\x20" "\x00\x00" "\x03" "image/png\x00" "\x04" "Description\x00" "PNG data", 42), f.render()); } void testDontRender22() { ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("FOO" "\x00\x00\x08" "\x00" "JPG" "\x01" "d\x00" "\x00", 14); ID3v2::Header header; header.setMajorVersion(2); ID3v2::UnknownFrame *frame = dynamic_cast<TagLib::ID3v2::UnknownFrame*>(factory->createFrame(data, &header)); CPPUNIT_ASSERT(frame); ID3v2::Tag tag; tag.addFrame(frame); CPPUNIT_ASSERT_EQUAL((unsigned int)1034, tag.render().size()); } // http://bugs.kde.org/show_bug.cgi?id=151078 void testParseGEOB() { ID3v2::GeneralEncapsulatedObjectFrame f(ByteVector("GEOB" "\x00\x00\x00\x08" "\x00\x00" "\x00" "m\x00" "f\x00" "d\x00" "\x00", 18)); CPPUNIT_ASSERT_EQUAL(String("m"), f.mimeType()); CPPUNIT_ASSERT_EQUAL(String("f"), f.fileName()); CPPUNIT_ASSERT_EQUAL(String("d"), f.description()); } void testRenderGEOB() { ID3v2::GeneralEncapsulatedObjectFrame f; f.setTextEncoding(String::Latin1); f.setMimeType("application/octet-stream"); f.setFileName("test.bin"); f.setDescription("Description"); f.setObject(ByteVector(3, '\x01')); CPPUNIT_ASSERT_EQUAL( ByteVector("GEOB" "\x00\x00\x00\x32" "\x00\x00" "\x00" "application/octet-stream\x00" "test.bin\x00" "Description\x00" "\x01\x01\x01", 60), f.render()); } void testParsePOPM() { ID3v2::PopularimeterFrame f(ByteVector("POPM" "\x00\x00\x00\x17" "\x00\x00" "email@example.com\x00" "\x02" "\x00\x00\x00\x03", 33)); CPPUNIT_ASSERT_EQUAL(String("email@example.com"), f.email()); CPPUNIT_ASSERT_EQUAL(2, f.rating()); CPPUNIT_ASSERT_EQUAL((unsigned int)3, f.counter()); } void testParsePOPMWithoutCounter() { ID3v2::PopularimeterFrame f(ByteVector("POPM" "\x00\x00\x00\x13" "\x00\x00" "email@example.com\x00" "\x02", 29)); CPPUNIT_ASSERT_EQUAL(String("email@example.com"), f.email()); CPPUNIT_ASSERT_EQUAL(2, f.rating()); CPPUNIT_ASSERT_EQUAL((unsigned int)0, f.counter()); } void testRenderPOPM() { ID3v2::PopularimeterFrame f; f.setEmail("email@example.com"); f.setRating(2); f.setCounter(3); CPPUNIT_ASSERT_EQUAL( ByteVector("POPM" "\x00\x00\x00\x17" "\x00\x00" "email@example.com\x00" "\x02" "\x00\x00\x00\x03", 33), f.render()); } void testPOPMtoString() { ID3v2::PopularimeterFrame f; f.setEmail("email@example.com"); f.setRating(2); f.setCounter(3); CPPUNIT_ASSERT_EQUAL( String("email@example.com rating=2 counter=3"), f.toString()); } void testPOPMFromFile() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); ID3v2::PopularimeterFrame *f = new ID3v2::PopularimeterFrame(); f->setEmail("email@example.com"); f->setRating(200); f->setCounter(3); { MPEG::File foo(newname.c_str()); foo.ID3v2Tag()->addFrame(f); foo.save(); } { MPEG::File bar(newname.c_str()); CPPUNIT_ASSERT_EQUAL(String("email@example.com"), dynamic_cast<ID3v2::PopularimeterFrame *>(bar.ID3v2Tag()->frameList("POPM").front())->email()); CPPUNIT_ASSERT_EQUAL(200, dynamic_cast<ID3v2::PopularimeterFrame *>(bar.ID3v2Tag()->frameList("POPM").front())->rating()); } } // http://bugs.kde.org/show_bug.cgi?id=150481 void testParseRelativeVolumeFrame() { ID3v2::RelativeVolumeFrame f( ByteVector("RVA2" // Frame ID "\x00\x00\x00\x0B" // Frame size "\x00\x00" // Frame flags "ident\x00" // Identification "\x02" // Type of channel "\x00\x0F" // Volume adjustment "\x08" // Bits representing peak "\x45", 21)); // Peak volume CPPUNIT_ASSERT_EQUAL(String("ident"), f.identification()); CPPUNIT_ASSERT_EQUAL(15.0f / 512.0f, f.volumeAdjustment(ID3v2::RelativeVolumeFrame::FrontRight)); CPPUNIT_ASSERT_EQUAL(static_cast<short>(15), f.volumeAdjustmentIndex(ID3v2::RelativeVolumeFrame::FrontRight)); CPPUNIT_ASSERT_EQUAL((unsigned char)8, f.peakVolume(ID3v2::RelativeVolumeFrame::FrontRight).bitsRepresentingPeak); CPPUNIT_ASSERT_EQUAL(ByteVector("\x45"), f.peakVolume(ID3v2::RelativeVolumeFrame::FrontRight).peakVolume); const List<ID3v2::RelativeVolumeFrame::ChannelType> channels = f.channels(); CPPUNIT_ASSERT_EQUAL(1U, channels.size()); CPPUNIT_ASSERT_EQUAL(ID3v2::RelativeVolumeFrame::FrontRight, channels[0]); } void testRenderRelativeVolumeFrame() { ID3v2::RelativeVolumeFrame f; f.setIdentification("ident"); f.setVolumeAdjustment(15.0f / 512.0f, ID3v2::RelativeVolumeFrame::FrontRight); ID3v2::RelativeVolumeFrame::PeakVolume peakVolume; peakVolume.bitsRepresentingPeak = 8; peakVolume.peakVolume.setData("\x45"); f.setPeakVolume(peakVolume, ID3v2::RelativeVolumeFrame::FrontRight); CPPUNIT_ASSERT_EQUAL( ByteVector("RVA2" "\x00\x00\x00\x0B" "\x00\x00" "ident\x00" "\x02" "\x00\x0F" "\x08" "\x45", 21), f.render()); } void testParseUniqueFileIdentifierFrame() { ID3v2::UniqueFileIdentifierFrame f( ByteVector("UFID" // Frame ID "\x00\x00\x00\x09" // Frame size "\x00\x00" // Frame flags "owner\x00" // Owner identifier "\x00\x01\x02", 19)); // Identifier CPPUNIT_ASSERT_EQUAL(String("owner"), f.owner()); CPPUNIT_ASSERT_EQUAL(ByteVector("\x00\x01\x02", 3), f.identifier()); } void testParseEmptyUniqueFileIdentifierFrame() { ID3v2::UniqueFileIdentifierFrame f( ByteVector("UFID" // Frame ID "\x00\x00\x00\x01" // Frame size "\x00\x00" // Frame flags "\x00" // Owner identifier "", 11)); // Identifier CPPUNIT_ASSERT_EQUAL(String(), f.owner()); CPPUNIT_ASSERT_EQUAL(ByteVector(), f.identifier()); } void testRenderUniqueFileIdentifierFrame() { ID3v2::UniqueFileIdentifierFrame f("owner", "\x01\x02\x03"); CPPUNIT_ASSERT_EQUAL( ByteVector("UFID" "\x00\x00\x00\x09" "\x00\x00" "owner\x00" "\x01\x02\x03", 19), f.render()); } void testParseUrlLinkFrame() { ID3v2::UrlLinkFrame f( ByteVector("WOAF" // Frame ID "\x00\x00\x00\x12" // Frame size "\x00\x00" // Frame flags "http://example.com", 28)); // URL CPPUNIT_ASSERT_EQUAL(String("http://example.com"), f.url()); } void testRenderUrlLinkFrame() { ID3v2::UrlLinkFrame f("WOAF"); f.setUrl("http://example.com"); CPPUNIT_ASSERT_EQUAL( ByteVector("WOAF" // Frame ID "\x00\x00\x00\x12" // Frame size "\x00\x00" // Frame flags "http://example.com", 28), // URL f.render()); } void testParseUserUrlLinkFrame() { ID3v2::UserUrlLinkFrame f( ByteVector("WXXX" // Frame ID "\x00\x00\x00\x17" // Frame size "\x00\x00" // Frame flags "\x00" // Text encoding "foo\x00" // Description "http://example.com", 33)); // URL CPPUNIT_ASSERT_EQUAL(String("foo"), f.description()); CPPUNIT_ASSERT_EQUAL(String("http://example.com"), f.url()); } void testRenderUserUrlLinkFrame() { ID3v2::UserUrlLinkFrame f; f.setDescription("foo"); f.setUrl("http://example.com"); CPPUNIT_ASSERT_EQUAL( ByteVector("WXXX" // Frame ID "\x00\x00\x00\x17" // Frame size "\x00\x00" // Frame flags "\x00" // Text encoding "foo\x00" // Description "http://example.com", 33), // URL f.render()); } void testParseOwnershipFrame() { ID3v2::OwnershipFrame f( ByteVector("OWNE" // Frame ID "\x00\x00\x00\x19" // Frame size "\x00\x00" // Frame flags "\x00" // Text encoding "GBP1.99\x00" // Price paid "20120905" // Date of purchase "Beatport", 35)); // Seller CPPUNIT_ASSERT_EQUAL(String("GBP1.99"), f.pricePaid()); CPPUNIT_ASSERT_EQUAL(String("20120905"), f.datePurchased()); CPPUNIT_ASSERT_EQUAL(String("Beatport"), f.seller()); } void testRenderOwnershipFrame() { ID3v2::OwnershipFrame f; f.setPricePaid("GBP1.99"); f.setDatePurchased("20120905"); f.setSeller("Beatport"); CPPUNIT_ASSERT_EQUAL( ByteVector("OWNE" // Frame ID "\x00\x00\x00\x19" // Frame size "\x00\x00" // Frame flags "\x00" // Text encoding "GBP1.99\x00" // Price paid "20120905" // Date of purchase "Beatport", 35), // URL f.render()); } void testParseSynchronizedLyricsFrame() { ID3v2::SynchronizedLyricsFrame f( ByteVector("SYLT" // Frame ID "\x00\x00\x00\x21" // Frame size "\x00\x00" // Frame flags "\x00" // Text encoding "eng" // Language "\x02" // Time stamp format "\x01" // Content type "foo\x00" // Content descriptor "Example\x00" // 1st text "\x00\x00\x04\xd2" // 1st time stamp "Lyrics\x00" // 2nd text "\x00\x00\x11\xd7", 43)); // 2nd time stamp CPPUNIT_ASSERT_EQUAL(String::Latin1, f.textEncoding()); CPPUNIT_ASSERT_EQUAL(ByteVector("eng", 3), f.language()); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchronizedLyricsFrame::AbsoluteMilliseconds, f.timestampFormat()); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchronizedLyricsFrame::Lyrics, f.type()); CPPUNIT_ASSERT_EQUAL(String("foo"), f.description()); ID3v2::SynchronizedLyricsFrame::SynchedTextList stl = f.synchedText(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, stl.size()); CPPUNIT_ASSERT_EQUAL(String("Example"), stl[0].text); CPPUNIT_ASSERT_EQUAL((unsigned int)1234, stl[0].time); CPPUNIT_ASSERT_EQUAL(String("Lyrics"), stl[1].text); CPPUNIT_ASSERT_EQUAL((unsigned int)4567, stl[1].time); } void testParseSynchronizedLyricsFrameWithEmptyDescritpion() { ID3v2::SynchronizedLyricsFrame f( ByteVector("SYLT" // Frame ID "\x00\x00\x00\x21" // Frame size "\x00\x00" // Frame flags "\x00" // Text encoding "eng" // Language "\x02" // Time stamp format "\x01" // Content type "\x00" // Content descriptor "Example\x00" // 1st text "\x00\x00\x04\xd2" // 1st time stamp "Lyrics\x00" // 2nd text "\x00\x00\x11\xd7", 40)); // 2nd time stamp CPPUNIT_ASSERT_EQUAL(String::Latin1, f.textEncoding()); CPPUNIT_ASSERT_EQUAL(ByteVector("eng", 3), f.language()); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchronizedLyricsFrame::AbsoluteMilliseconds, f.timestampFormat()); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchronizedLyricsFrame::Lyrics, f.type()); CPPUNIT_ASSERT(f.description().isEmpty()); ID3v2::SynchronizedLyricsFrame::SynchedTextList stl = f.synchedText(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, stl.size()); CPPUNIT_ASSERT_EQUAL(String("Example"), stl[0].text); CPPUNIT_ASSERT_EQUAL((unsigned int)1234, stl[0].time); CPPUNIT_ASSERT_EQUAL(String("Lyrics"), stl[1].text); CPPUNIT_ASSERT_EQUAL((unsigned int)4567, stl[1].time); } void testRenderSynchronizedLyricsFrame() { ID3v2::SynchronizedLyricsFrame f; f.setTextEncoding(String::Latin1); f.setLanguage(ByteVector("eng", 3)); f.setTimestampFormat(ID3v2::SynchronizedLyricsFrame::AbsoluteMilliseconds); f.setType(ID3v2::SynchronizedLyricsFrame::Lyrics); f.setDescription("foo"); ID3v2::SynchronizedLyricsFrame::SynchedTextList stl; stl.append(ID3v2::SynchronizedLyricsFrame::SynchedText(1234, "Example")); stl.append(ID3v2::SynchronizedLyricsFrame::SynchedText(4567, "Lyrics")); f.setSynchedText(stl); CPPUNIT_ASSERT_EQUAL( ByteVector("SYLT" // Frame ID "\x00\x00\x00\x21" // Frame size "\x00\x00" // Frame flags "\x00" // Text encoding "eng" // Language "\x02" // Time stamp format "\x01" // Content type "foo\x00" // Content descriptor "Example\x00" // 1st text "\x00\x00\x04\xd2" // 1st time stamp "Lyrics\x00" // 2nd text "\x00\x00\x11\xd7", 43), // 2nd time stamp f.render()); } void testParseEventTimingCodesFrame() { ID3v2::EventTimingCodesFrame f( ByteVector("ETCO" // Frame ID "\x00\x00\x00\x0b" // Frame size "\x00\x00" // Frame flags "\x02" // Time stamp format "\x02" // 1st event "\x00\x00\xf3\x5c" // 1st time stamp "\xfe" // 2nd event "\x00\x36\xee\x80", 21)); // 2nd time stamp CPPUNIT_ASSERT_EQUAL(ID3v2::EventTimingCodesFrame::AbsoluteMilliseconds, f.timestampFormat()); ID3v2::EventTimingCodesFrame::SynchedEventList sel = f.synchedEvents(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, sel.size()); CPPUNIT_ASSERT_EQUAL(ID3v2::EventTimingCodesFrame::IntroStart, sel[0].type); CPPUNIT_ASSERT_EQUAL((unsigned int)62300, sel[0].time); CPPUNIT_ASSERT_EQUAL(ID3v2::EventTimingCodesFrame::AudioFileEnds, sel[1].type); CPPUNIT_ASSERT_EQUAL((unsigned int)3600000, sel[1].time); } void testRenderEventTimingCodesFrame() { ID3v2::EventTimingCodesFrame f; f.setTimestampFormat(ID3v2::EventTimingCodesFrame::AbsoluteMilliseconds); ID3v2::EventTimingCodesFrame::SynchedEventList sel; sel.append(ID3v2::EventTimingCodesFrame::SynchedEvent(62300, ID3v2::EventTimingCodesFrame::IntroStart)); sel.append(ID3v2::EventTimingCodesFrame::SynchedEvent(3600000, ID3v2::EventTimingCodesFrame::AudioFileEnds)); f.setSynchedEvents(sel); CPPUNIT_ASSERT_EQUAL( ByteVector("ETCO" // Frame ID "\x00\x00\x00\x0b" // Frame size "\x00\x00" // Frame flags "\x02" // Time stamp format "\x02" // 1st event "\x00\x00\xf3\x5c" // 1st time stamp "\xfe" // 2nd event "\x00\x36\xee\x80", 21), // 2nd time stamp f.render()); } void testParseCommentsFrame() { ID3v2::CommentsFrame f( ByteVector("COMM" "\x00\x00\x00\x14" "\x00\x00" "\x03" "deu" "Description\x00" "Text", 30)); CPPUNIT_ASSERT_EQUAL(String::UTF8, f.textEncoding()); CPPUNIT_ASSERT_EQUAL(ByteVector("deu"), f.language()); CPPUNIT_ASSERT_EQUAL(String("Description"), f.description()); CPPUNIT_ASSERT_EQUAL(String("Text"), f.text()); } void testRenderCommentsFrame() { ID3v2::CommentsFrame f; f.setTextEncoding(String::UTF16); f.setLanguage("eng"); f.setDescription("Description"); f.setText("Text"); CPPUNIT_ASSERT_EQUAL( ByteVector("COMM" "\x00\x00\x00\x28" "\x00\x00" "\x01" "eng" "\xff\xfe" "D\0e\0s\0c\0r\0i\0p\0t\0i\0o\0n\0" "\x00\x00" "\xff\xfe" "T\0e\0x\0t\0", 50), f.render()); } void testParsePodcastFrame() { ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("PCST" "\x00\x00\x00\x04" "\x00\x00" "\x00\x00\x00\x00", 14); const ID3v2::Header header; CPPUNIT_ASSERT(dynamic_cast<ID3v2::PodcastFrame *>( factory->createFrame(data, &header))); } void testRenderPodcastFrame() { ID3v2::PodcastFrame f; CPPUNIT_ASSERT_EQUAL( ByteVector("PCST" "\x00\x00\x00\x04" "\x00\x00" "\x00\x00\x00\x00", 14), f.render()); } void testParsePrivateFrame() { ID3v2::PrivateFrame f( ByteVector("PRIV" "\x00\x00\x00\x0e" "\x00\x00" "WM/Provider\x00" "TL", 24)); CPPUNIT_ASSERT_EQUAL(String("WM/Provider"), f.owner()); CPPUNIT_ASSERT_EQUAL(ByteVector("TL"), f.data()); } void testRenderPrivateFrame() { ID3v2::PrivateFrame f; f.setOwner("WM/Provider"); f.setData("TL"); CPPUNIT_ASSERT_EQUAL( ByteVector("PRIV" "\x00\x00\x00\x0e" "\x00\x00" "WM/Provider\x00" "TL", 24), f.render()); } void testParseUserTextIdentificationFrame() { ID3v2::UserTextIdentificationFrame frameWithoutDescription( ByteVector("TXXX" "\x00\x00\x00\x06" "\x00\x00\x00" "\x00" "Text", 16)); CPPUNIT_ASSERT_EQUAL(String(""), frameWithoutDescription.description()); CPPUNIT_ASSERT_EQUAL(String("Text"), frameWithoutDescription.fieldList()[1]); ID3v2::UserTextIdentificationFrame frameWithDescription( ByteVector("TXXX" "\x00\x00\x00\x11" "\x00\x00\x00" "Description\x00" "Text", 27)); CPPUNIT_ASSERT_EQUAL(String("Description"), frameWithDescription.description()); CPPUNIT_ASSERT_EQUAL(String("Text"), frameWithDescription.fieldList()[1]); } void testRenderUserTextIdentificationFrame() { ID3v2::UserTextIdentificationFrame f; f.setDescription(""); f.setText("Text"); CPPUNIT_ASSERT_EQUAL( ByteVector("TXXX" "\x00\x00\x00\x06" "\x00\x00\x00" "\x00" "Text", 16), f.render()); f.setDescription("Description"); f.setText("Text"); CPPUNIT_ASSERT_EQUAL( ByteVector("TXXX" "\x00\x00\x00\x11" "\x00\x00\x00" "Description\x00" "Text", 27), f.render()); } void testItunes24FrameSize() { MPEG::File f(TEST_FILE_PATH_C("005411.id3"), false); CPPUNIT_ASSERT(f.tag()); CPPUNIT_ASSERT(f.ID3v2Tag()->frameListMap().contains("TIT2")); CPPUNIT_ASSERT_EQUAL(String("Sunshine Superman"), f.ID3v2Tag()->frameListMap()["TIT2"].front()->toString()); } void testSaveUTF16Comment() { String::Type defaultEncoding = ID3v2::FrameFactory::instance()->defaultTextEncoding(); ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); ID3v2::FrameFactory::instance()->setDefaultTextEncoding(String::UTF16); { MPEG::File foo(newname.c_str()); foo.strip(); foo.tag()->setComment("Test comment!"); foo.save(); } { MPEG::File bar(newname.c_str()); CPPUNIT_ASSERT_EQUAL(String("Test comment!"), bar.tag()->comment()); ID3v2::FrameFactory::instance()->setDefaultTextEncoding(defaultEncoding); } } void testUpdateGenre23_1() { // "Refinement" is the same as the ID3v1 genre - duplicate ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("TCON" // Frame ID "\x00\x00\x00\x10" // Frame size "\x00\x00" // Frame flags "\x00" // Encoding "(22)Death Metal", 26); // Text ID3v2::Header header; header.setMajorVersion(3); ID3v2::TextIdentificationFrame *frame = dynamic_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, &header)); CPPUNIT_ASSERT_EQUAL((unsigned int)1, frame->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("Death Metal"), frame->fieldList()[0]); ID3v2::Tag tag; tag.addFrame(frame); CPPUNIT_ASSERT_EQUAL(String("Death Metal"), tag.genre()); } void testUpdateGenre23_2() { // "Refinement" is different from the ID3v1 genre ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("TCON" // Frame ID "\x00\x00\x00\x0d" // Frame size "\x00\x00" // Frame flags "\x00" // Encoding "(4)Eurodisco", 23); // Text ID3v2::Header header; header.setMajorVersion(3); ID3v2::TextIdentificationFrame *frame = dynamic_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, &header)); CPPUNIT_ASSERT_EQUAL((unsigned int)2, frame->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("4"), frame->fieldList()[0]); CPPUNIT_ASSERT_EQUAL(String("Eurodisco"), frame->fieldList()[1]); ID3v2::Tag tag; tag.addFrame(frame); CPPUNIT_ASSERT_EQUAL(String("Disco Eurodisco"), tag.genre()); } void testUpdateGenre23_3() { // Multiple references and a refinement ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("TCON" // Frame ID "\x00\x00\x00\x15" // Frame size "\x00\x00" // Frame flags "\x00" // Encoding "(9)(138)Viking Metal", 31); // Text ID3v2::Header header; header.setMajorVersion(3); ID3v2::TextIdentificationFrame *frame = dynamic_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, &header)); CPPUNIT_ASSERT_EQUAL(3U, frame->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("9"), frame->fieldList()[0]); CPPUNIT_ASSERT_EQUAL(String("138"), frame->fieldList()[1]); CPPUNIT_ASSERT_EQUAL(String("Viking Metal"), frame->fieldList()[2]); ID3v2::Tag tag; tag.addFrame(frame); CPPUNIT_ASSERT_EQUAL(String("Metal Black Metal Viking Metal"), tag.genre()); } void testUpdateGenre24() { ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("TCON" // Frame ID "\x00\x00\x00\x0D" // Frame size "\x00\x00" // Frame flags "\0" // Encoding "14\0Eurodisco", 23); // Text ID3v2::Header header; ID3v2::TextIdentificationFrame *frame = dynamic_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, &header)); CPPUNIT_ASSERT_EQUAL((unsigned int)2, frame->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("14"), frame->fieldList()[0]); CPPUNIT_ASSERT_EQUAL(String("Eurodisco"), frame->fieldList()[1]); ID3v2::Tag tag; tag.addFrame(frame); CPPUNIT_ASSERT_EQUAL(String("R&B Eurodisco"), tag.genre()); } void testUpdateDate22() { MPEG::File f(TEST_FILE_PATH_C("id3v22-tda.mp3"), false); CPPUNIT_ASSERT(f.tag()); CPPUNIT_ASSERT_EQUAL((unsigned int)2010, f.tag()->year()); } void testUpdateFullDate22() { MPEG::File f(TEST_FILE_PATH_C("id3v22-tda.mp3"), false); CPPUNIT_ASSERT(f.tag()); CPPUNIT_ASSERT_EQUAL(String("2010-04-03"), f.ID3v2Tag()->frameListMap()["TDRC"].front()->toString()); } void testDowngradeTo23() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); ID3v2::TextIdentificationFrame *tf; { MPEG::File foo(newname.c_str()); tf = new ID3v2::TextIdentificationFrame("TDOR", String::Latin1); tf->setText("2011-03-16"); foo.ID3v2Tag()->addFrame(tf); tf = new ID3v2::TextIdentificationFrame("TDRC", String::Latin1); tf->setText("2012-04-17T12:01"); foo.ID3v2Tag()->addFrame(tf); tf = new ID3v2::TextIdentificationFrame("TMCL", String::Latin1); tf->setText(StringList().append("Guitar").append("Artist 1").append("Drums").append("Artist 2")); foo.ID3v2Tag()->addFrame(tf); tf = new ID3v2::TextIdentificationFrame("TIPL", String::Latin1); tf->setText(StringList().append("Producer").append("Artist 3").append("Mastering").append("Artist 4")); foo.ID3v2Tag()->addFrame(tf); tf = new ID3v2::TextIdentificationFrame("TCON", String::Latin1); tf->setText(StringList().append("51").append("Noise").append("Power Noise")); foo.ID3v2Tag()->addFrame(tf); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TDRL", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TDTG", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TMOO", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TPRO", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOA", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOT", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSST", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOP", String::Latin1)); foo.save(MPEG::File::AllTags, File::StripOthers, ID3v2::v3); } { MPEG::File bar(newname.c_str()); tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TDOR").front()); CPPUNIT_ASSERT(tf); CPPUNIT_ASSERT_EQUAL((unsigned int)1, tf->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("2011"), tf->fieldList().front()); tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TDRC").front()); CPPUNIT_ASSERT(tf); CPPUNIT_ASSERT_EQUAL((unsigned int)1, tf->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("2012-04-17T12:01"), tf->fieldList().front()); tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TIPL").front()); CPPUNIT_ASSERT(tf); CPPUNIT_ASSERT_EQUAL((unsigned int)8, tf->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("Guitar"), tf->fieldList()[0]); CPPUNIT_ASSERT_EQUAL(String("Artist 1"), tf->fieldList()[1]); CPPUNIT_ASSERT_EQUAL(String("Drums"), tf->fieldList()[2]); CPPUNIT_ASSERT_EQUAL(String("Artist 2"), tf->fieldList()[3]); CPPUNIT_ASSERT_EQUAL(String("Producer"), tf->fieldList()[4]); CPPUNIT_ASSERT_EQUAL(String("Artist 3"), tf->fieldList()[5]); CPPUNIT_ASSERT_EQUAL(String("Mastering"), tf->fieldList()[6]); CPPUNIT_ASSERT_EQUAL(String("Artist 4"), tf->fieldList()[7]); tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TCON").front()); CPPUNIT_ASSERT(tf); CPPUNIT_ASSERT_EQUAL(3U, tf->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("51"), tf->fieldList()[0]); CPPUNIT_ASSERT_EQUAL(String("39"), tf->fieldList()[1]); CPPUNIT_ASSERT_EQUAL(String("Power Noise"), tf->fieldList()[2]); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TDRL")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TDTG")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TMOO")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TPRO")); #ifdef NO_ITUNES_HACKS CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOA")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOT")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOP")); #endif CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSST")); } { const ByteVector expectedId3v23Data( "ID3" "\x03\x00\x00\x00\x00\x09\x49" "TSOA" "\x00\x00\x00\x01\x00\x00\x00" "TSOT" "\x00\x00\x00\x01\x00\x00\x00" "TSOP" "\x00\x00\x00\x01\x00\x00\x00" "TORY" "\x00\x00\x00\x05\x00\x00\x00" "2011" "TYER" "\x00\x00\x00\x05\x00\x00\x00" "2012" "TDAT" "\x00\x00\x00\x05\x00\x00\x00" "1704" "TIME" "\x00\x00\x00\x05\x00\x00\x00" "1201" "IPLS" "\x00\x00\x00\x44\x00\x00\x00" "Guitar" "\x00" "Artist 1" "\x00" "Drums" "\x00" "Artist 2" "\x00" "Producer" "\x00" "Artist 3" "\x00" "Mastering" "\x00" "Artist 4" "TCON" "\x00\x00\x00\x14\x00\x00\x00" "(51)(39)Power Noise", 211); const ByteVector actualId3v23Data = PlainFile(newname.c_str()).readBlock(expectedId3v23Data.size()); CPPUNIT_ASSERT_EQUAL(expectedId3v23Data, actualId3v23Data); } ScopedFileCopy rareFramesCopy("rare_frames", ".mp3"); { MPEG::File f(rareFramesCopy.fileName().c_str()); f.save(MPEG::File::AllTags, File::StripOthers, ID3v2::v3); f.seek(f.find("TCON") + 11); CPPUNIT_ASSERT_EQUAL(ByteVector("(13)"), f.readBlock(4)); } } void testCompressedFrameWithBrokenLength() { MPEG::File f(TEST_FILE_PATH_C("compressed_id3_frame.mp3"), false); CPPUNIT_ASSERT(f.ID3v2Tag()->frameListMap().contains("APIC")); if(zlib::isAvailable()) { ID3v2::AttachedPictureFrame *frame = dynamic_cast<TagLib::ID3v2::AttachedPictureFrame*>(f.ID3v2Tag()->frameListMap()["APIC"].front()); CPPUNIT_ASSERT(frame); CPPUNIT_ASSERT_EQUAL(String("image/bmp"), frame->mimeType()); CPPUNIT_ASSERT_EQUAL(ID3v2::AttachedPictureFrame::Other, frame->type()); CPPUNIT_ASSERT_EQUAL(String(""), frame->description()); CPPUNIT_ASSERT_EQUAL((unsigned int)86414, frame->picture().size()); } else { // Skip the test if ZLIB is not installed. // The message "Compressed frames are currently not supported." will be displayed. ID3v2::UnknownFrame *frame = dynamic_cast<TagLib::ID3v2::UnknownFrame*>(f.ID3v2Tag()->frameListMap()["APIC"].front()); CPPUNIT_ASSERT(frame); } } void testW000() { MPEG::File f(TEST_FILE_PATH_C("w000.mp3"), false); CPPUNIT_ASSERT(f.ID3v2Tag()->frameListMap().contains("W000")); ID3v2::UrlLinkFrame *frame = dynamic_cast<TagLib::ID3v2::UrlLinkFrame*>(f.ID3v2Tag()->frameListMap()["W000"].front()); CPPUNIT_ASSERT(frame); CPPUNIT_ASSERT_EQUAL(String("lukas.lalinsky@example.com____"), frame->url()); } void testPropertyInterface() { ScopedFileCopy copy("rare_frames", ".mp3"); string newname = copy.fileName(); MPEG::File f(newname.c_str()); PropertyMap dict = f.ID3v2Tag(false)->properties(); CPPUNIT_ASSERT_EQUAL((unsigned int)6, dict.size()); CPPUNIT_ASSERT(dict.contains("USERTEXTDESCRIPTION1")); CPPUNIT_ASSERT(dict.contains("QuodLibet::USERTEXTDESCRIPTION2")); CPPUNIT_ASSERT_EQUAL((unsigned int)2, dict["USERTEXTDESCRIPTION1"].size()); CPPUNIT_ASSERT_EQUAL((unsigned int)2, dict["QuodLibet::USERTEXTDESCRIPTION2"].size()); CPPUNIT_ASSERT_EQUAL(String("userTextData1"), dict["USERTEXTDESCRIPTION1"][0]); CPPUNIT_ASSERT_EQUAL(String("userTextData2"), dict["USERTEXTDESCRIPTION1"][1]); CPPUNIT_ASSERT_EQUAL(String("userTextData1"), dict["QuodLibet::USERTEXTDESCRIPTION2"][0]); CPPUNIT_ASSERT_EQUAL(String("userTextData2"), dict["QuodLibet::USERTEXTDESCRIPTION2"][1]); CPPUNIT_ASSERT_EQUAL(String("Pop"), dict["GENRE"].front()); CPPUNIT_ASSERT_EQUAL(String("http://a.user.url"), dict["URL:USERURL"].front()); CPPUNIT_ASSERT_EQUAL(String("http://a.user.url/with/empty/description"), dict["URL"].front()); CPPUNIT_ASSERT_EQUAL(String("A COMMENT"), dict["COMMENT"].front()); CPPUNIT_ASSERT_EQUAL(1u, dict.unsupportedData().size()); CPPUNIT_ASSERT_EQUAL(String("UFID/supermihi@web.de"), dict.unsupportedData().front()); } void testPropertyInterface2() { ID3v2::Tag tag; ID3v2::UnsynchronizedLyricsFrame *frame1 = new ID3v2::UnsynchronizedLyricsFrame(); frame1->setDescription("test"); frame1->setText("la-la-la test"); tag.addFrame(frame1); ID3v2::UnsynchronizedLyricsFrame *frame2 = new ID3v2::UnsynchronizedLyricsFrame(); frame2->setDescription(""); frame2->setText("la-la-la nodescription"); tag.addFrame(frame2); ID3v2::AttachedPictureFrame *frame3 = new ID3v2::AttachedPictureFrame(); frame3->setDescription("test picture"); tag.addFrame(frame3); ID3v2::TextIdentificationFrame *frame4 = new ID3v2::TextIdentificationFrame("TIPL"); frame4->setText("single value is invalid for TIPL"); tag.addFrame(frame4); ID3v2::TextIdentificationFrame *frame5 = new ID3v2::TextIdentificationFrame("TMCL"); StringList tmclData; tmclData.append("VIOLIN"); tmclData.append("a violinist"); tmclData.append("PIANO"); tmclData.append("a pianist"); frame5->setText(tmclData); tag.addFrame(frame5); ID3v2::UniqueFileIdentifierFrame *frame6 = new ID3v2::UniqueFileIdentifierFrame("http://musicbrainz.org", "152454b9-19ba-49f3-9fc9-8fc26545cf41"); tag.addFrame(frame6); ID3v2::UniqueFileIdentifierFrame *frame7 = new ID3v2::UniqueFileIdentifierFrame("http://example.com", "123"); tag.addFrame(frame7); ID3v2::UserTextIdentificationFrame *frame8 = new ID3v2::UserTextIdentificationFrame(); frame8->setDescription("MusicBrainz Album Id"); frame8->setText("95c454a5-d7e0-4d8f-9900-db04aca98ab3"); tag.addFrame(frame8); PropertyMap properties = tag.properties(); CPPUNIT_ASSERT_EQUAL(3u, properties.unsupportedData().size()); CPPUNIT_ASSERT(properties.unsupportedData().contains("TIPL")); CPPUNIT_ASSERT(properties.unsupportedData().contains("APIC")); CPPUNIT_ASSERT(properties.unsupportedData().contains("UFID/http://example.com")); CPPUNIT_ASSERT(properties.contains("PERFORMER:VIOLIN")); CPPUNIT_ASSERT(properties.contains("PERFORMER:PIANO")); CPPUNIT_ASSERT_EQUAL(String("a violinist"), properties["PERFORMER:VIOLIN"].front()); CPPUNIT_ASSERT_EQUAL(String("a pianist"), properties["PERFORMER:PIANO"].front()); CPPUNIT_ASSERT(properties.contains("LYRICS")); CPPUNIT_ASSERT(properties.contains("LYRICS:TEST")); CPPUNIT_ASSERT(properties.contains("MUSICBRAINZ_TRACKID")); CPPUNIT_ASSERT_EQUAL(String("152454b9-19ba-49f3-9fc9-8fc26545cf41"), properties["MUSICBRAINZ_TRACKID"].front()); CPPUNIT_ASSERT(properties.contains("MUSICBRAINZ_ALBUMID")); CPPUNIT_ASSERT_EQUAL(String("95c454a5-d7e0-4d8f-9900-db04aca98ab3"), properties["MUSICBRAINZ_ALBUMID"].front()); tag.removeUnsupportedProperties(properties.unsupportedData()); CPPUNIT_ASSERT(tag.frameList("APIC").isEmpty()); CPPUNIT_ASSERT(tag.frameList("TIPL").isEmpty()); CPPUNIT_ASSERT_EQUAL((ID3v2::UniqueFileIdentifierFrame *)0, ID3v2::UniqueFileIdentifierFrame::findByOwner(&tag, "http://example.com")); CPPUNIT_ASSERT_EQUAL(frame6, ID3v2::UniqueFileIdentifierFrame::findByOwner(&tag, "http://musicbrainz.org")); } void testPropertiesMovement() { ID3v2::Tag tag; ID3v2::TextIdentificationFrame *frameMvnm = new ID3v2::TextIdentificationFrame("MVNM"); frameMvnm->setText("Movement Name"); tag.addFrame(frameMvnm); ID3v2::TextIdentificationFrame *frameMvin = new ID3v2::TextIdentificationFrame("MVIN"); frameMvin->setText("2/3"); tag.addFrame(frameMvin); PropertyMap properties = tag.properties(); CPPUNIT_ASSERT(properties.contains("MOVEMENTNAME")); CPPUNIT_ASSERT(properties.contains("MOVEMENTNUMBER")); CPPUNIT_ASSERT_EQUAL(String("Movement Name"), properties["MOVEMENTNAME"].front()); CPPUNIT_ASSERT_EQUAL(String("2/3"), properties["MOVEMENTNUMBER"].front()); ByteVector frameDataMvnm("MVNM" "\x00\x00\x00\x0e" "\x00\x00" "\x00" "Movement Name", 24); CPPUNIT_ASSERT_EQUAL(frameDataMvnm, frameMvnm->render()); ByteVector frameDataMvin("MVIN" "\x00\x00\x00\x04" "\x00\x00" "\x00" "2/3", 14); CPPUNIT_ASSERT_EQUAL(frameDataMvin, frameMvin->render()); ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ID3v2::Header header; ID3v2::TextIdentificationFrame *parsedFrameMvnm = dynamic_cast<ID3v2::TextIdentificationFrame *>( factory->createFrame(frameDataMvnm, &header)); ID3v2::TextIdentificationFrame *parsedFrameMvin = dynamic_cast<ID3v2::TextIdentificationFrame *>( factory->createFrame(frameDataMvin, &header)); CPPUNIT_ASSERT(parsedFrameMvnm); CPPUNIT_ASSERT(parsedFrameMvin); CPPUNIT_ASSERT_EQUAL(String("Movement Name"), parsedFrameMvnm->toString()); CPPUNIT_ASSERT_EQUAL(String("2/3"), parsedFrameMvin->toString()); tag.addFrame(parsedFrameMvnm); tag.addFrame(parsedFrameMvin); } void testPropertyGrouping() { ID3v2::Tag tag; ID3v2::TextIdentificationFrame *frameGrp1 = new ID3v2::TextIdentificationFrame("GRP1"); frameGrp1->setText("Grouping"); tag.addFrame(frameGrp1); PropertyMap properties = tag.properties(); CPPUNIT_ASSERT(properties.contains("GROUPING")); CPPUNIT_ASSERT_EQUAL(String("Grouping"), properties["GROUPING"].front()); ByteVector frameDataGrp1("GRP1" "\x00\x00\x00\x09" "\x00\x00" "\x00" "Grouping", 19); CPPUNIT_ASSERT_EQUAL(frameDataGrp1, frameGrp1->render()); ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ID3v2::Header header; ID3v2::TextIdentificationFrame *parsedFrameGrp1 = dynamic_cast<ID3v2::TextIdentificationFrame *>( factory->createFrame(frameDataGrp1, &header)); CPPUNIT_ASSERT(parsedFrameGrp1); CPPUNIT_ASSERT_EQUAL(String("Grouping"), parsedFrameGrp1->toString()); tag.addFrame(parsedFrameGrp1); } void testDeleteFrame() { ScopedFileCopy copy("rare_frames", ".mp3"); string newname = copy.fileName(); { MPEG::File f(newname.c_str()); ID3v2::Tag *t = f.ID3v2Tag(); ID3v2::Frame *frame = t->frameList("TCON")[0]; CPPUNIT_ASSERT_EQUAL(1u, t->frameList("TCON").size()); t->removeFrame(frame, true); f.save(MPEG::File::ID3v2); } { MPEG::File f2(newname.c_str()); ID3v2::Tag *t = f2.ID3v2Tag(); CPPUNIT_ASSERT(t->frameList("TCON").isEmpty()); } } void testSaveAndStripID3v1ShouldNotAddFrameFromID3v1ToId3v2() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); { MPEG::File foo(newname.c_str()); foo.tag()->setArtist("Artist"); foo.save(MPEG::File::ID3v1 | MPEG::File::ID3v2); } { MPEG::File bar(newname.c_str()); bar.ID3v2Tag()->removeFrames("TPE1"); // Should strip ID3v1 here and not add old values to ID3v2 again bar.save(MPEG::File::ID3v2, File::StripOthers); } MPEG::File f(newname.c_str()); CPPUNIT_ASSERT(!f.ID3v2Tag()->frameListMap().contains("TPE1")); } void testParseChapterFrame() { ID3v2::Header header; ByteVector chapterData = ByteVector("CHAP" // Frame ID "\x00\x00\x00\x20" // Frame size "\x00\x00" // Frame flags "\x43\x00" // Element ID ("C") "\x00\x00\x00\x03" // Start time "\x00\x00\x00\x05" // End time "\x00\x00\x00\x02" // Start offset "\x00\x00\x00\x03", 28); // End offset ByteVector embeddedFrameData = ByteVector("TIT2" // Embedded frame ID "\x00\x00\x00\x04" // Embedded frame size "\x00\x00" // Embedded frame flags "\x00" // TIT2 frame text encoding "CH1", 14); // Chapter title ID3v2::ChapterFrame f1(&header, chapterData); CPPUNIT_ASSERT_EQUAL(ByteVector("C"), f1.elementID()); CPPUNIT_ASSERT((unsigned int)0x03 == f1.startTime()); CPPUNIT_ASSERT((unsigned int)0x05 == f1.endTime()); CPPUNIT_ASSERT((unsigned int)0x02 == f1.startOffset()); CPPUNIT_ASSERT((unsigned int)0x03 == f1.endOffset()); CPPUNIT_ASSERT((unsigned int)0x00 == f1.embeddedFrameList().size()); ID3v2::ChapterFrame f2(&header, chapterData + embeddedFrameData); CPPUNIT_ASSERT_EQUAL(ByteVector("C"), f2.elementID()); CPPUNIT_ASSERT((unsigned int)0x03 == f2.startTime()); CPPUNIT_ASSERT((unsigned int)0x05 == f2.endTime()); CPPUNIT_ASSERT((unsigned int)0x02 == f2.startOffset()); CPPUNIT_ASSERT((unsigned int)0x03 == f2.endOffset()); CPPUNIT_ASSERT((unsigned int)0x01 == f2.embeddedFrameList().size()); CPPUNIT_ASSERT(f2.embeddedFrameList("TIT2").size() == 1); CPPUNIT_ASSERT(f2.embeddedFrameList("TIT2")[0]->toString() == "CH1"); } void testRenderChapterFrame() { ID3v2::Header header; ID3v2::ChapterFrame f1(&header, "CHAP"); f1.setElementID(ByteVector("\x43\x00", 2)); f1.setStartTime(3); f1.setEndTime(5); f1.setStartOffset(2); f1.setEndOffset(3); ID3v2::TextIdentificationFrame *eF = new ID3v2::TextIdentificationFrame("TIT2"); eF->setText("CH1"); f1.addEmbeddedFrame(eF); ByteVector expected = ByteVector("CHAP" // Frame ID "\x00\x00\x00\x20" // Frame size "\x00\x00" // Frame flags "\x43\x00" // Element ID "\x00\x00\x00\x03" // Start time "\x00\x00\x00\x05" // End time "\x00\x00\x00\x02" // Start offset "\x00\x00\x00\x03" // End offset "TIT2" // Embedded frame ID "\x00\x00\x00\x04" // Embedded frame size "\x00\x00" // Embedded frame flags "\x00" // TIT2 frame text encoding "CH1", 42); // Chapter title CPPUNIT_ASSERT_EQUAL(expected, f1.render()); f1.setElementID("C"); CPPUNIT_ASSERT_EQUAL(expected, f1.render()); ID3v2::FrameList frames; eF = new ID3v2::TextIdentificationFrame("TIT2"); eF->setText("CH1"); frames.append(eF); ID3v2::ChapterFrame f2(ByteVector("\x43\x00", 2), 3, 5, 2, 3, frames); CPPUNIT_ASSERT_EQUAL(expected, f2.render()); frames.clear(); eF = new ID3v2::TextIdentificationFrame("TIT2"); eF->setText("CH1"); frames.append(eF); ID3v2::ChapterFrame f3(ByteVector("C\x00", 2), 3, 5, 2, 3, frames); CPPUNIT_ASSERT_EQUAL(expected, f3.render()); frames.clear(); eF = new ID3v2::TextIdentificationFrame("TIT2"); eF->setText("CH1"); frames.append(eF); ID3v2::ChapterFrame f4("C", 3, 5, 2, 3, frames); CPPUNIT_ASSERT_EQUAL(expected, f4.render()); CPPUNIT_ASSERT(!f4.toString().isEmpty()); ID3v2::ChapterFrame f5("C", 3, 5, 2, 3); eF = new ID3v2::TextIdentificationFrame("TIT2"); eF->setText("CH1"); f5.addEmbeddedFrame(eF); CPPUNIT_ASSERT_EQUAL(expected, f5.render()); } void testParseTableOfContentsFrame() { ID3v2::Header header; ID3v2::TableOfContentsFrame f( &header, ByteVector("CTOC" // Frame ID "\x00\x00\x00\x16" // Frame size "\x00\x00" // Frame flags "\x54\x00" // Element ID ("T") "\x01" // CTOC flags "\x02" // Entry count "\x43\x00" // First entry ("C") "\x44\x00" // Second entry ("D") "TIT2" // Embedded frame ID "\x00\x00\x00\x04" // Embedded frame size "\x00\x00" // Embedded frame flags "\x00" // TIT2 frame text encoding "TC1", 32)); // Table of contents title CPPUNIT_ASSERT_EQUAL(ByteVector("T"), f.elementID()); CPPUNIT_ASSERT(!f.isTopLevel()); CPPUNIT_ASSERT(f.isOrdered()); CPPUNIT_ASSERT((unsigned int)0x02 == f.entryCount()); CPPUNIT_ASSERT_EQUAL(ByteVector("C"), f.childElements()[0]); CPPUNIT_ASSERT_EQUAL(ByteVector("D"), f.childElements()[1]); CPPUNIT_ASSERT((unsigned int)0x01 == f.embeddedFrameList().size()); CPPUNIT_ASSERT(f.embeddedFrameList("TIT2").size() == 1); CPPUNIT_ASSERT(f.embeddedFrameList("TIT2")[0]->toString() == "TC1"); f.removeChildElement("E"); // not existing CPPUNIT_ASSERT_EQUAL(2U, f.entryCount()); f.removeChildElement("C"); CPPUNIT_ASSERT_EQUAL(1U, f.entryCount()); CPPUNIT_ASSERT_EQUAL(ByteVector("D"), f.childElements()[0]); ID3v2::Frame *frame = f.embeddedFrameList("TIT2")[0]; f.removeEmbeddedFrame(frame); CPPUNIT_ASSERT(f.embeddedFrameList("TIT2").isEmpty()); } void testRenderTableOfContentsFrame() { ID3v2::Header header; ID3v2::TableOfContentsFrame f(&header, "CTOC"); f.setElementID(ByteVector("\x54\x00", 2)); f.setIsTopLevel(false); f.setIsOrdered(true); f.addChildElement(ByteVector("\x43\x00", 2)); f.addChildElement(ByteVector("\x44\x00", 2)); ID3v2::TextIdentificationFrame *eF = new ID3v2::TextIdentificationFrame("TIT2"); eF->setText("TC1"); f.addEmbeddedFrame(eF); CPPUNIT_ASSERT_EQUAL( ByteVector("CTOC" // Frame ID "\x00\x00\x00\x16" // Frame size "\x00\x00" // Frame flags "\x54\x00" // Element ID "\x01" // CTOC flags "\x02" // Entry count "\x43\x00" // First entry "\x44\x00" // Second entry "TIT2" // Embedded frame ID "\x00\x00\x00\x04" // Embedded frame size "\x00\x00" // Embedded frame flags "\x00" // TIT2 frame text encoding "TC1", 32), // Table of contents title f.render()); } void testShrinkPadding() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); { MPEG::File f(newname.c_str()); f.ID3v2Tag()->setTitle(longText(64 * 1024)); f.save(MPEG::File::ID3v2, File::StripOthers); } { MPEG::File f(newname.c_str()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(74789L, f.length()); f.ID3v2Tag()->setTitle("ABCDEFGHIJ"); f.save(MPEG::File::ID3v2, File::StripOthers); } { MPEG::File f(newname.c_str()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(9263L, f.length()); } } void testEmptyFrame() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); { MPEG::File f(newname.c_str()); ID3v2::Tag *tag = f.ID3v2Tag(true); ID3v2::UrlLinkFrame *frame1 = new ID3v2::UrlLinkFrame( ByteVector("WOAF\x00\x00\x00\x01\x00\x00\x00", 11)); tag->addFrame(frame1); ID3v2::TextIdentificationFrame *frame2 = new ID3v2::TextIdentificationFrame("TIT2"); frame2->setText("Title"); tag->addFrame(frame2); f.save(); } { MPEG::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); ID3v2::Tag *tag = f.ID3v2Tag(); CPPUNIT_ASSERT_EQUAL(String("Title"), tag->title()); CPPUNIT_ASSERT_EQUAL(true, tag->frameListMap()["WOAF"].isEmpty()); } } void testDuplicateTags() { ScopedFileCopy copy("duplicate_id3v2", ".mp3"); ByteVector audioStream; { MPEG::File f(copy.fileName().c_str()); f.seek(f.ID3v2Tag()->header()->completeTagSize()); audioStream = f.readBlock(2089); // duplicate_id3v2.mp3 has duplicate ID3v2 tags. // Sample rate will be 32000 if we can't skip the second tag. CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL((unsigned int)8049, f.ID3v2Tag()->header()->completeTagSize()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); f.ID3v2Tag()->setArtist("Artist A"); f.save(MPEG::File::ID3v2, File::StripOthers); } { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL((long)3594, f.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)1505, f.ID3v2Tag()->header()->completeTagSize()); CPPUNIT_ASSERT_EQUAL(String("Artist A"), f.ID3v2Tag()->artist()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); f.seek(f.ID3v2Tag()->header()->completeTagSize()); CPPUNIT_ASSERT_EQUAL(f.readBlock(2089), audioStream); } } void testParseTOCFrameWithManyChildren() { MPEG::File f(TEST_FILE_PATH_C("toc_many_children.mp3")); CPPUNIT_ASSERT(f.isValid()); ID3v2::Tag *tag = f.ID3v2Tag(); const ID3v2::FrameList &frames = tag->frameList(); CPPUNIT_ASSERT_EQUAL(130U, frames.size()); int i = 0; for(ID3v2::FrameList::ConstIterator it = frames.begin(); it != frames.end(); ++it, ++i) { if(i > 0) { CPPUNIT_ASSERT_EQUAL(ByteVector("CHAP"), (*it)->frameID()); const ID3v2::ChapterFrame *chapFrame = dynamic_cast<const ID3v2::ChapterFrame *>(*it); CPPUNIT_ASSERT_EQUAL(ByteVector("chapter") + ByteVector(String::number(i - 1).toCString()), chapFrame->elementID()); CPPUNIT_ASSERT_EQUAL(static_cast<unsigned int>(100 * i), chapFrame->startTime()); CPPUNIT_ASSERT_EQUAL(static_cast<unsigned int>(100 * i), chapFrame->endTime()); const ID3v2::FrameList &embeddedFrames = chapFrame->embeddedFrameList(); CPPUNIT_ASSERT_EQUAL(1U, embeddedFrames.size()); const ID3v2::TextIdentificationFrame *tit2Frame = dynamic_cast<const ID3v2::TextIdentificationFrame *>( embeddedFrames.front()); CPPUNIT_ASSERT(tit2Frame); CPPUNIT_ASSERT_EQUAL(String("Marker ") + String::number(i), tit2Frame->fieldList().front()); } else { CPPUNIT_ASSERT_EQUAL(ByteVector("CTOC"), (*it)->frameID()); const ID3v2::TableOfContentsFrame *ctocFrame = dynamic_cast<const ID3v2::TableOfContentsFrame *>(*it); CPPUNIT_ASSERT_EQUAL(ByteVector("toc"), ctocFrame->elementID()); CPPUNIT_ASSERT(!ctocFrame->isTopLevel()); CPPUNIT_ASSERT(!ctocFrame->isOrdered()); CPPUNIT_ASSERT_EQUAL(129U, ctocFrame->entryCount()); const ID3v2::FrameList &embeddedFrames = ctocFrame->embeddedFrameList(); CPPUNIT_ASSERT_EQUAL(1U, embeddedFrames.size()); const ID3v2::TextIdentificationFrame *tit2Frame = dynamic_cast<const ID3v2::TextIdentificationFrame *>( embeddedFrames.front()); CPPUNIT_ASSERT(tit2Frame); CPPUNIT_ASSERT_EQUAL(StringList("toplevel toc"), tit2Frame->fieldList()); } } CPPUNIT_ASSERT(!ID3v2::ChapterFrame::findByElementID(tag, "chap2")); CPPUNIT_ASSERT(ID3v2::ChapterFrame::findByElementID(tag, "chapter2")); CPPUNIT_ASSERT(!ID3v2::TableOfContentsFrame::findTopLevel(tag)); CPPUNIT_ASSERT(!ID3v2::TableOfContentsFrame::findByElementID(tag, "ctoc")); CPPUNIT_ASSERT(ID3v2::TableOfContentsFrame::findByElementID(tag, "toc")); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v2); ��������������������taglib-1.13.1/tests/test_info.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000005713�14447736377�0016733�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <infotag.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestInfoTag : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestInfoTag); CPPUNIT_TEST(testTitle); CPPUNIT_TEST(testNumericFields); CPPUNIT_TEST_SUITE_END(); public: void testTitle() { RIFF::Info::Tag tag; CPPUNIT_ASSERT_EQUAL(String(""), tag.title()); tag.setTitle("Test title 1"); tag.setFieldText("TEST", "Dummy Text"); CPPUNIT_ASSERT_EQUAL(String("Test title 1"), tag.title()); RIFF::Info::FieldListMap map = tag.fieldListMap(); CPPUNIT_ASSERT_EQUAL(String("Test title 1"), map["INAM"]); CPPUNIT_ASSERT_EQUAL(String("Dummy Text"), map["TEST"]); } void testNumericFields() { RIFF::Info::Tag tag; CPPUNIT_ASSERT_EQUAL((unsigned int)0, tag.track()); tag.setTrack(1234); CPPUNIT_ASSERT_EQUAL((unsigned int)1234, tag.track()); CPPUNIT_ASSERT_EQUAL(String("1234"), tag.fieldText("IPRT")); CPPUNIT_ASSERT_EQUAL((unsigned int)0, tag.year()); tag.setYear(1234); CPPUNIT_ASSERT_EQUAL((unsigned int)1234, tag.year()); CPPUNIT_ASSERT_EQUAL(String("1234"), tag.fieldText("ICRD")); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestInfoTag); �����������������������������������������������������taglib-1.13.1/tests/test_it.cpp���������������������������������������������������������������������0000664�0000000�0000000�00000012621�14447736377�0016410�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <itfile.h> #include <tstringlist.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; static const String titleBefore("test song name"); static const String titleAfter("changed title"); static const String commentBefore( "This is a sample name.\n" "In module file formats\n" "sample names are abused\n" "as multiline comments.\n" " "); static const String newComment( "This is a sample name!\n" "In module file formats\n" "sample names are abused\n" "as multiline comments.\n" "-----------------------------------\n" "The previous line is truncated but starting with this line\n" "the comment is not limeted in the line length but to 8000\n" "additional characters (bytes).\n" "\n" "This is because it is saved in the 'message' proportion of\n" "IT files."); static const String commentAfter( "This is a sample name!\n" "In module file formats\n" "sample names are abused\n" "as multiline comments.\n" "-------------------------\n" "The previous line is truncated but starting with this line\n" "the comment is not limeted in the line length but to 8000\n" "additional characters (bytes).\n" "\n" "This is because it is saved in the 'message' proportion of\n" "IT files."); class TestIT : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestIT); CPPUNIT_TEST(testReadTags); CPPUNIT_TEST(testWriteTags); CPPUNIT_TEST_SUITE_END(); public: void testReadTags() { testRead(TEST_FILE_PATH_C("test.it"), titleBefore, commentBefore); } void testWriteTags() { ScopedFileCopy copy("test", ".it"); { IT::File file(copy.fileName().c_str()); CPPUNIT_ASSERT(file.tag() != 0); file.tag()->setTitle(titleAfter); file.tag()->setComment(newComment); file.tag()->setTrackerName("won't be saved"); CPPUNIT_ASSERT(file.save()); } testRead(copy.fileName().c_str(), titleAfter, commentAfter); } private: void testRead(FileName fileName, const String &title, const String &comment) { IT::File file(fileName); CPPUNIT_ASSERT(file.isValid()); IT::Properties *p = file.audioProperties(); Mod::Tag *t = file.tag(); CPPUNIT_ASSERT(0 != p); CPPUNIT_ASSERT(0 != t); CPPUNIT_ASSERT_EQUAL( 0, p->length()); CPPUNIT_ASSERT_EQUAL( 0, p->bitrate()); CPPUNIT_ASSERT_EQUAL( 0, p->sampleRate()); CPPUNIT_ASSERT_EQUAL(64, p->channels()); CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->lengthInPatterns()); CPPUNIT_ASSERT_EQUAL(true, p->stereo()); CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->instrumentCount()); CPPUNIT_ASSERT_EQUAL((unsigned short) 5, p->sampleCount()); CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->patternCount()); CPPUNIT_ASSERT_EQUAL((unsigned short)535, p->version()); CPPUNIT_ASSERT_EQUAL((unsigned short)532, p->compatibleVersion()); CPPUNIT_ASSERT_EQUAL((unsigned short) 9, p->flags()); CPPUNIT_ASSERT_EQUAL((unsigned char)128, p->globalVolume()); CPPUNIT_ASSERT_EQUAL((unsigned char) 48, p->mixVolume()); CPPUNIT_ASSERT_EQUAL((unsigned char)125, p->tempo()); CPPUNIT_ASSERT_EQUAL((unsigned char) 6, p->bpmSpeed()); CPPUNIT_ASSERT_EQUAL((unsigned char)128, p->panningSeparation()); CPPUNIT_ASSERT_EQUAL((unsigned char) 0, p->pitchWheelDepth()); CPPUNIT_ASSERT_EQUAL(title, t->title()); CPPUNIT_ASSERT_EQUAL(String(), t->artist()); CPPUNIT_ASSERT_EQUAL(String(), t->album()); CPPUNIT_ASSERT_EQUAL(comment, t->comment()); CPPUNIT_ASSERT_EQUAL(String(), t->genre()); CPPUNIT_ASSERT_EQUAL(0U, t->year()); CPPUNIT_ASSERT_EQUAL(0U, t->track()); CPPUNIT_ASSERT_EQUAL(String("Impulse Tracker"), t->trackerName()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestIT); ���������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_list.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000005116�14447736377�0016750�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tlist.h> #include <cppunit/extensions/HelperMacros.h> using namespace std; using namespace TagLib; class TestList : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestList); CPPUNIT_TEST(testAppend); CPPUNIT_TEST(testDetach); CPPUNIT_TEST_SUITE_END(); public: void testAppend() { List<int> l1; List<int> l2; List<int> l3; l1.append(2); l2.append(3); l2.append(4); l1.append(l2); l1.prepend(1); l3.append(1); l3.append(2); l3.append(3); l3.append(4); CPPUNIT_ASSERT_EQUAL(4U, l1.size()); CPPUNIT_ASSERT(l1 == l3); } void testDetach() { List<int> l1; l1.append(1); l1.append(2); l1.append(3); l1.append(4); List<int> l2 = l1; List<int>::Iterator it = l2.find(3); *it = 33; CPPUNIT_ASSERT_EQUAL(3, l1[2]); CPPUNIT_ASSERT_EQUAL(33, l2[2]); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestList); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_map.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000005306�14447736377�0016553�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <tmap.h> #include <cppunit/extensions/HelperMacros.h> using namespace std; using namespace TagLib; class TestMap : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestMap); CPPUNIT_TEST(testInsert); CPPUNIT_TEST(testDetach); CPPUNIT_TEST_SUITE_END(); public: void testInsert() { Map<String, int> m1; m1.insert("foo", 3); m1.insert("bar", 5); CPPUNIT_ASSERT_EQUAL(2U, m1.size()); CPPUNIT_ASSERT_EQUAL(3, m1["foo"]); CPPUNIT_ASSERT_EQUAL(5, m1["bar"]); m1.insert("foo", 7); CPPUNIT_ASSERT_EQUAL(2U, m1.size()); CPPUNIT_ASSERT_EQUAL(7, m1["foo"]); CPPUNIT_ASSERT_EQUAL(5, m1["bar"]); } void testDetach() { Map<String, int> m1; m1.insert("alice", 5); m1.insert("bob", 9); m1.insert("carol", 11); Map<String, int> m2 = m1; Map<String, int>::Iterator it = m2.find("bob"); (*it).second = 99; CPPUNIT_ASSERT_EQUAL(9, m1["bob"]); CPPUNIT_ASSERT_EQUAL(99, m2["bob"]); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMap); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_mod.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000011502�14447736377�0016550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <modfile.h> #include <tpropertymap.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; static const String titleBefore("title of song"); static const String titleAfter("changed title"); static const String commentBefore( "Instrument names\n" "are abused as\n" "comments in\n" "module file formats.\n" "-+-+-+-+-+-+-+-+-+-+-+\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); static const String newComment( "This line will be truncated because it is too long for a mod instrument name.\n" "This line is ok."); static const String commentAfter( "This line will be trun\n" "This line is ok.\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); class TestMod : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestMod); CPPUNIT_TEST(testReadTags); CPPUNIT_TEST(testWriteTags); CPPUNIT_TEST(testPropertyInterface); CPPUNIT_TEST_SUITE_END(); public: void testReadTags() { testRead(TEST_FILE_PATH_C("test.mod"), titleBefore, commentBefore); } void testWriteTags() { ScopedFileCopy copy("test", ".mod"); { Mod::File file(copy.fileName().c_str()); CPPUNIT_ASSERT(file.tag() != 0); file.tag()->setTitle(titleAfter); file.tag()->setComment(newComment); CPPUNIT_ASSERT(file.save()); } testRead(copy.fileName().c_str(), titleAfter, commentAfter); CPPUNIT_ASSERT(fileEqual( copy.fileName(), TEST_FILE_PATH_C("changed.mod"))); } void testPropertyInterface() { Mod::Tag t; PropertyMap properties; properties["BLA"] = String("bla"); properties["ARTIST"] = String("artist1"); properties["ARTIST"].append("artist2"); properties["TITLE"] = String("title"); PropertyMap unsupported = t.setProperties(properties); CPPUNIT_ASSERT(unsupported.contains("BLA")); CPPUNIT_ASSERT(unsupported.contains("ARTIST")); CPPUNIT_ASSERT_EQUAL(properties["ARTIST"], unsupported["ARTIST"]); CPPUNIT_ASSERT(!unsupported.contains("TITLE")); properties = t.properties(); CPPUNIT_ASSERT_EQUAL(StringList("title"), properties["TITLE"]); } private: void testRead(FileName fileName, const String &title, const String &comment) { Mod::File file(fileName); CPPUNIT_ASSERT(file.isValid()); Mod::Properties *p = file.audioProperties(); Mod::Tag *t = file.tag(); CPPUNIT_ASSERT(0 != p); CPPUNIT_ASSERT(0 != t); CPPUNIT_ASSERT_EQUAL(0, p->length()); CPPUNIT_ASSERT_EQUAL(0, p->bitrate()); CPPUNIT_ASSERT_EQUAL(0, p->sampleRate()); CPPUNIT_ASSERT_EQUAL(8, p->channels()); CPPUNIT_ASSERT_EQUAL(31U, p->instrumentCount()); CPPUNIT_ASSERT_EQUAL((unsigned char)1, p->lengthInPatterns()); CPPUNIT_ASSERT_EQUAL(title, t->title()); CPPUNIT_ASSERT_EQUAL(String(), t->artist()); CPPUNIT_ASSERT_EQUAL(String(), t->album()); CPPUNIT_ASSERT_EQUAL(comment, t->comment()); CPPUNIT_ASSERT_EQUAL(String(), t->genre()); CPPUNIT_ASSERT_EQUAL(0U, t->year()); CPPUNIT_ASSERT_EQUAL(0U, t->track()); CPPUNIT_ASSERT_EQUAL(String("StarTrekker"), t->trackerName()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMod); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_mp4.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000063346�14447736377�0016506�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2008 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <mp4tag.h> #include <tbytevectorlist.h> #include <tbytevectorstream.h> #include <tpropertymap.h> #include <mp4atom.h> #include <mp4file.h> #include <cppunit/extensions/HelperMacros.h> #include "plainfile.h" #include "utils.h" using namespace std; using namespace TagLib; class TestMP4 : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestMP4); CPPUNIT_TEST(testPropertiesAAC); CPPUNIT_TEST(testPropertiesAACWithoutBitrate); CPPUNIT_TEST(testPropertiesALAC); CPPUNIT_TEST(testPropertiesALACWithoutBitrate); CPPUNIT_TEST(testPropertiesM4V); CPPUNIT_TEST(testFreeForm); CPPUNIT_TEST(testCheckValid); CPPUNIT_TEST(testHasTag); CPPUNIT_TEST(testIsEmpty); CPPUNIT_TEST(testUpdateStco); CPPUNIT_TEST(testSaveExisingWhenIlstIsLast); CPPUNIT_TEST(test64BitAtom); CPPUNIT_TEST(testGnre); CPPUNIT_TEST(testCovrRead); CPPUNIT_TEST(testCovrWrite); CPPUNIT_TEST(testCovrRead2); CPPUNIT_TEST(testProperties); CPPUNIT_TEST(testPropertiesAllSupported); CPPUNIT_TEST(testPropertiesMovement); CPPUNIT_TEST(testFuzzedFile); CPPUNIT_TEST(testRepeatedSave); CPPUNIT_TEST(testWithZeroLengthAtom); CPPUNIT_TEST(testEmptyValuesRemoveItems); CPPUNIT_TEST(testRemoveMetadata); CPPUNIT_TEST(testNonFullMetaAtom); CPPUNIT_TEST_SUITE_END(); public: void testPropertiesAAC() { MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3708, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); CPPUNIT_ASSERT_EQUAL(MP4::Properties::AAC, f.audioProperties()->codec()); } void testPropertiesAACWithoutBitrate() { ByteVector aacData = PlainFile(TEST_FILE_PATH_C("has-tags.m4a")).readAll(); CPPUNIT_ASSERT_GREATER(1960U, aacData.size()); CPPUNIT_ASSERT_EQUAL(ByteVector("mp4a"), aacData.mid(1890, 4)); // Set the bitrate to zero for (int offset = 1956; offset < 1960; ++offset) { aacData[offset] = 0; } ByteVectorStream aacStream(aacData); MP4::File f(&aacStream); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3708, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); CPPUNIT_ASSERT_EQUAL(MP4::Properties::AAC, f.audioProperties()->codec()); } void testPropertiesALAC() { MP4::File f(TEST_FILE_PATH_C("empty_alac.m4a")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); CPPUNIT_ASSERT_EQUAL(MP4::Properties::ALAC, f.audioProperties()->codec()); } void testPropertiesALACWithoutBitrate() { ByteVector alacData = PlainFile(TEST_FILE_PATH_C("empty_alac.m4a")).readAll(); CPPUNIT_ASSERT_GREATER(474U, alacData.size()); CPPUNIT_ASSERT_EQUAL(ByteVector("alac"), alacData.mid(446, 4)); // Set the bitrate to zero for (int offset = 470; offset < 474; ++offset) { alacData[offset] = 0; } ByteVectorStream alacStream(alacData); MP4::File f(&alacStream); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); CPPUNIT_ASSERT_EQUAL(MP4::Properties::ALAC, f.audioProperties()->codec()); } void testPropertiesM4V() { MP4::File f(TEST_FILE_PATH_C("blank_video.m4v")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(975, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(96, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isEncrypted()); CPPUNIT_ASSERT_EQUAL(MP4::Properties::AAC, f.audioProperties()->codec()); } void testCheckValid() { MP4::File f(TEST_FILE_PATH_C("empty.aiff")); CPPUNIT_ASSERT(!f.isValid()); } void testHasTag() { { MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(f.hasMP4Tag()); } ScopedFileCopy copy("no-tags", ".m4a"); { MP4::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(!f.hasMP4Tag()); f.tag()->setTitle("TITLE"); f.save(); } { MP4::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(f.hasMP4Tag()); } } void testIsEmpty() { MP4::Tag t1; CPPUNIT_ASSERT(t1.isEmpty()); t1.setArtist("Foo"); CPPUNIT_ASSERT(!t1.isEmpty()); MP4::Tag t2; t2.setItem("foo", "bar"); CPPUNIT_ASSERT(!t2.isEmpty()); } void testUpdateStco() { ScopedFileCopy copy("no-tags", ".3g2"); string filename = copy.fileName(); ByteVectorList data1; { MP4::File f(filename.c_str()); f.tag()->setArtist(ByteVector(3000, 'x')); MP4::Atoms a(&f); MP4::Atom *stco = a.find("moov")->findall("stco", true)[0]; f.seek(stco->offset + 12); ByteVector data = f.readBlock(stco->length - 12); unsigned int count = data.mid(0, 4).toUInt(); int pos = 4; while (count--) { unsigned int offset = data.mid(pos, 4).toUInt(); f.seek(offset); data1.append(f.readBlock(20)); pos += 4; } f.save(); } { MP4::File f(filename.c_str()); MP4::Atoms a(&f); MP4::Atom *stco = a.find("moov")->findall("stco", true)[0]; f.seek(stco->offset + 12); ByteVector data = f.readBlock(stco->length - 12); unsigned int count = data.mid(0, 4).toUInt(); int pos = 4, i = 0; while (count--) { unsigned int offset = data.mid(pos, 4).toUInt(); f.seek(offset); CPPUNIT_ASSERT_EQUAL(data1[i], f.readBlock(20)); pos += 4; i++; } } } void testFreeForm() { ScopedFileCopy copy("has-tags", ".m4a"); string filename = copy.fileName(); { MP4::File f(filename.c_str()); CPPUNIT_ASSERT(f.tag()->contains("----:com.apple.iTunes:iTunNORM")); f.tag()->setItem("----:org.kde.TagLib:Foo", StringList("Bar")); f.save(); } { MP4::File f(filename.c_str()); CPPUNIT_ASSERT(f.tag()->contains("----:org.kde.TagLib:Foo")); CPPUNIT_ASSERT_EQUAL(String("Bar"), f.tag()->item("----:org.kde.TagLib:Foo").toStringList().front()); f.save(); } } void testSaveExisingWhenIlstIsLast() { ScopedFileCopy copy("ilst-is-last", ".m4a"); string filename = copy.fileName(); { MP4::File f(filename.c_str()); CPPUNIT_ASSERT_EQUAL(String("82,164"), f.tag()->item("----:com.apple.iTunes:replaygain_track_minmax").toStringList().front()); CPPUNIT_ASSERT_EQUAL(String("Pearl Jam"), f.tag()->artist()); f.tag()->setComment("foo"); f.save(); } { MP4::File f(filename.c_str()); CPPUNIT_ASSERT_EQUAL(String("82,164"), f.tag()->item("----:com.apple.iTunes:replaygain_track_minmax").toStringList().front()); CPPUNIT_ASSERT_EQUAL(String("Pearl Jam"), f.tag()->artist()); CPPUNIT_ASSERT_EQUAL(String("foo"), f.tag()->comment()); } } void test64BitAtom() { ScopedFileCopy copy("64bit", ".mp4"); string filename = copy.fileName(); { MP4::File f(filename.c_str()); CPPUNIT_ASSERT_EQUAL(true, f.tag()->itemMap()["cpil"].toBool()); MP4::Atoms atoms(&f); MP4::Atom *moov = atoms.atoms[0]; CPPUNIT_ASSERT_EQUAL(long(77), moov->length); f.tag()->setItem("pgap", true); f.save(); } { MP4::File f(filename.c_str()); CPPUNIT_ASSERT_EQUAL(true, f.tag()->item("cpil").toBool()); CPPUNIT_ASSERT_EQUAL(true, f.tag()->item("pgap").toBool()); MP4::Atoms atoms(&f); MP4::Atom *moov = atoms.atoms[0]; // original size + 'pgap' size + padding CPPUNIT_ASSERT_EQUAL(long(77 + 25 + 974), moov->length); } } void testGnre() { MP4::File f(TEST_FILE_PATH_C("gnre.m4a")); CPPUNIT_ASSERT_EQUAL(TagLib::String("Ska"), f.tag()->genre()); } void testCovrRead() { MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); CPPUNIT_ASSERT(f.tag()->contains("covr")); MP4::CoverArtList l = f.tag()->item("covr").toCoverArtList(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, l.size()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); CPPUNIT_ASSERT_EQUAL((unsigned int)79, l[0].data().size()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); CPPUNIT_ASSERT_EQUAL((unsigned int)287, l[1].data().size()); } void testCovrWrite() { ScopedFileCopy copy("has-tags", ".m4a"); string filename = copy.fileName(); { MP4::File f(filename.c_str()); CPPUNIT_ASSERT(f.tag()->contains("covr")); MP4::CoverArtList l = f.tag()->item("covr").toCoverArtList(); l.append(MP4::CoverArt(MP4::CoverArt::PNG, "foo")); f.tag()->setItem("covr", l); f.save(); } { MP4::File f(filename.c_str()); CPPUNIT_ASSERT(f.tag()->contains("covr")); MP4::CoverArtList l = f.tag()->item("covr").toCoverArtList(); CPPUNIT_ASSERT_EQUAL((unsigned int)3, l.size()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); CPPUNIT_ASSERT_EQUAL((unsigned int)79, l[0].data().size()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); CPPUNIT_ASSERT_EQUAL((unsigned int)287, l[1].data().size()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[2].format()); CPPUNIT_ASSERT_EQUAL((unsigned int)3, l[2].data().size()); } } void testCovrRead2() { MP4::File f(TEST_FILE_PATH_C("covr-junk.m4a")); CPPUNIT_ASSERT(f.tag()->contains("covr")); MP4::CoverArtList l = f.tag()->item("covr").toCoverArtList(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, l.size()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); CPPUNIT_ASSERT_EQUAL((unsigned int)79, l[0].data().size()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); CPPUNIT_ASSERT_EQUAL((unsigned int)287, l[1].data().size()); } void testProperties() { MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); PropertyMap tags = f.properties(); CPPUNIT_ASSERT_EQUAL(StringList("Test Artist"), tags["ARTIST"]); tags["TRACKNUMBER"] = StringList("2/4"); tags["DISCNUMBER"] = StringList("3/5"); tags["BPM"] = StringList("123"); tags["ARTIST"] = StringList("Foo Bar"); tags["COMPILATION"] = StringList("1"); f.setProperties(tags); tags = f.properties(); CPPUNIT_ASSERT(f.tag()->contains("trkn")); CPPUNIT_ASSERT_EQUAL(2, f.tag()->item("trkn").toIntPair().first); CPPUNIT_ASSERT_EQUAL(4, f.tag()->item("trkn").toIntPair().second); CPPUNIT_ASSERT_EQUAL(StringList("2/4"), tags["TRACKNUMBER"]); CPPUNIT_ASSERT(f.tag()->contains("disk")); CPPUNIT_ASSERT_EQUAL(3, f.tag()->item("disk").toIntPair().first); CPPUNIT_ASSERT_EQUAL(5, f.tag()->item("disk").toIntPair().second); CPPUNIT_ASSERT_EQUAL(StringList("3/5"), tags["DISCNUMBER"]); CPPUNIT_ASSERT(f.tag()->contains("tmpo")); CPPUNIT_ASSERT_EQUAL(123, f.tag()->item("tmpo").toInt()); CPPUNIT_ASSERT_EQUAL(StringList("123"), tags["BPM"]); CPPUNIT_ASSERT(f.tag()->contains("\251ART")); CPPUNIT_ASSERT_EQUAL(StringList("Foo Bar"), f.tag()->item("\251ART").toStringList()); CPPUNIT_ASSERT_EQUAL(StringList("Foo Bar"), tags["ARTIST"]); CPPUNIT_ASSERT(f.tag()->contains("cpil")); CPPUNIT_ASSERT_EQUAL(true, f.tag()->item("cpil").toBool()); CPPUNIT_ASSERT_EQUAL(StringList("1"), tags["COMPILATION"]); tags["COMPILATION"] = StringList("0"); f.setProperties(tags); tags = f.properties(); CPPUNIT_ASSERT(f.tag()->contains("cpil")); CPPUNIT_ASSERT_EQUAL(false, f.tag()->item("cpil").toBool()); CPPUNIT_ASSERT_EQUAL(StringList("0"), tags["COMPILATION"]); // Empty properties do not result in access violations // when converting integers tags["TRACKNUMBER"] = StringList(); tags["DISCNUMBER"] = StringList(); tags["BPM"] = StringList(); tags["COMPILATION"] = StringList(); f.setProperties(tags); } void testPropertiesAllSupported() { PropertyMap tags; tags["ALBUM"] = StringList("Album"); tags["ALBUMARTIST"] = StringList("Album Artist"); tags["ALBUMARTISTSORT"] = StringList("Album Artist Sort"); tags["ALBUMSORT"] = StringList("Album Sort"); tags["ARTIST"] = StringList("Artist"); tags["ARTISTS"] = StringList("Artists"); tags["ARTISTSORT"] = StringList("Artist Sort"); tags["ASIN"] = StringList("ASIN"); tags["BARCODE"] = StringList("Barcode"); tags["BPM"] = StringList("123"); tags["CATALOGNUMBER"] = StringList("Catalog Number"); tags["COMMENT"] = StringList("Comment"); tags["COMPILATION"] = StringList("1"); tags["COMPOSER"] = StringList("Composer"); tags["COMPOSERSORT"] = StringList("Composer Sort"); tags["CONDUCTOR"] = StringList("Conductor"); tags["COPYRIGHT"] = StringList("2021 Copyright"); tags["DATE"] = StringList("2021-01-03 12:29:23"); tags["DISCNUMBER"] = StringList("3/5"); tags["DISCSUBTITLE"] = StringList("Disc Subtitle"); tags["DJMIXER"] = StringList("DJ Mixer"); tags["ENCODEDBY"] = StringList("Encoded by"); tags["ENGINEER"] = StringList("Engineer"); tags["GAPLESSPLAYBACK"] = StringList("1"); tags["GENRE"] = StringList("Genre"); tags["GROUPING"] = StringList("Grouping"); tags["ISRC"] = StringList("UKAAA0500001"); tags["LABEL"] = StringList("Label"); tags["LANGUAGE"] = StringList("eng"); tags["LICENSE"] = StringList("License"); tags["LYRICIST"] = StringList("Lyricist"); tags["LYRICS"] = StringList("Lyrics"); tags["MEDIA"] = StringList("Media"); tags["MIXER"] = StringList("Mixer"); tags["MOOD"] = StringList("Mood"); tags["MOVEMENTCOUNT"] = StringList("3"); tags["MOVEMENTNAME"] = StringList("Movement Name"); tags["MOVEMENTNUMBER"] = StringList("2"); tags["MUSICBRAINZ_ALBUMARTISTID"] = StringList("MusicBrainz_AlbumartistID"); tags["MUSICBRAINZ_ALBUMID"] = StringList("MusicBrainz_AlbumID"); tags["MUSICBRAINZ_ARTISTID"] = StringList("MusicBrainz_ArtistID"); tags["MUSICBRAINZ_RELEASEGROUPID"] = StringList("MusicBrainz_ReleasegroupID"); tags["MUSICBRAINZ_RELEASETRACKID"] = StringList("MusicBrainz_ReleasetrackID"); tags["MUSICBRAINZ_TRACKID"] = StringList("MusicBrainz_TrackID"); tags["MUSICBRAINZ_WORKID"] = StringList("MusicBrainz_WorkID"); tags["ORIGINALDATE"] = StringList("2021-01-03 13:52:19"); tags["PODCAST"] = StringList("1"); tags["PODCASTCATEGORY"] = StringList("Podcast Category"); tags["PODCASTDESC"] = StringList("Podcast Description"); tags["PODCASTID"] = StringList("Podcast ID"); tags["PODCASTURL"] = StringList("Podcast URL"); tags["PRODUCER"] = StringList("Producer"); tags["RELEASECOUNTRY"] = StringList("Release Country"); tags["RELEASESTATUS"] = StringList("Release Status"); tags["RELEASETYPE"] = StringList("Release Type"); tags["REMIXER"] = StringList("Remixer"); tags["SCRIPT"] = StringList("Script"); tags["SHOWSORT"] = StringList("Show Sort"); tags["SHOWWORKMOVEMENT"] = StringList("1"); tags["SUBTITLE"] = StringList("Subtitle"); tags["TITLE"] = StringList("Title"); tags["TITLESORT"] = StringList("Title Sort"); tags["TRACKNUMBER"] = StringList("2/4"); tags["TVEPISODE"] = StringList("3"); tags["TVEPISODEID"] = StringList("TV Episode ID"); tags["TVNETWORK"] = StringList("TV Network"); tags["TVSEASON"] = StringList("2"); tags["TVSHOW"] = StringList("TV Show"); tags["WORK"] = StringList("Work"); ScopedFileCopy copy("no-tags", ".m4a"); { MP4::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); CPPUNIT_ASSERT(properties.isEmpty()); f.setProperties(tags); f.save(); } { const MP4::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); if (tags != properties) { CPPUNIT_ASSERT_EQUAL(tags.toString(), properties.toString()); } CPPUNIT_ASSERT(tags == properties); } } void testPropertiesMovement() { MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); PropertyMap tags = f.properties(); tags["WORK"] = StringList("Foo"); tags["MOVEMENTNAME"] = StringList("Bar"); tags["MOVEMENTNUMBER"] = StringList("2"); tags["MOVEMENTCOUNT"] = StringList("3"); tags["SHOWWORKMOVEMENT"] = StringList("1"); f.setProperties(tags); tags = f.properties(); CPPUNIT_ASSERT(f.tag()->contains("\251wrk")); CPPUNIT_ASSERT_EQUAL(StringList("Foo"), f.tag()->item("\251wrk").toStringList()); CPPUNIT_ASSERT_EQUAL(StringList("Foo"), tags["WORK"]); CPPUNIT_ASSERT(f.tag()->contains("\251mvn")); CPPUNIT_ASSERT_EQUAL(StringList("Bar"), f.tag()->item("\251mvn").toStringList()); CPPUNIT_ASSERT_EQUAL(StringList("Bar"), tags["MOVEMENTNAME"]); CPPUNIT_ASSERT(f.tag()->contains("\251mvi")); CPPUNIT_ASSERT_EQUAL(2, f.tag()->item("\251mvi").toInt()); CPPUNIT_ASSERT_EQUAL(StringList("2"), tags["MOVEMENTNUMBER"]); CPPUNIT_ASSERT(f.tag()->contains("\251mvc")); CPPUNIT_ASSERT_EQUAL(3, f.tag()->item("\251mvc").toInt()); CPPUNIT_ASSERT_EQUAL(StringList("3"), tags["MOVEMENTCOUNT"]); CPPUNIT_ASSERT(f.tag()->contains("shwm")); CPPUNIT_ASSERT_EQUAL(true, f.tag()->item("shwm").toBool()); CPPUNIT_ASSERT_EQUAL(StringList("1"), tags["SHOWWORKMOVEMENT"]); tags["SHOWWORKMOVEMENT"] = StringList("0"); f.setProperties(tags); tags = f.properties(); CPPUNIT_ASSERT(f.tag()->contains("shwm")); CPPUNIT_ASSERT_EQUAL(false, f.tag()->item("shwm").toBool()); CPPUNIT_ASSERT_EQUAL(StringList("0"), tags["SHOWWORKMOVEMENT"]); tags["WORK"] = StringList(); tags["MOVEMENTNAME"] = StringList(); tags["MOVEMENTNUMBER"] = StringList(); tags["MOVEMENTCOUNT"] = StringList(); tags["SHOWWORKMOVEMENT"] = StringList(); f.setProperties(tags); } void testFuzzedFile() { MP4::File f(TEST_FILE_PATH_C("infloop.m4a")); // The file has an invalid atom length of 2775 in the last atom // ("free", offset 0xc521, 00000ad7 66726565), whereas the remaining file // length is 2727 bytes, therefore the file is now considered invalid. CPPUNIT_ASSERT(!f.isValid()); } void testRepeatedSave() { ScopedFileCopy copy("no-tags", ".m4a"); MP4::File f(copy.fileName().c_str()); f.tag()->setTitle("0123456789"); f.save(); f.save(); CPPUNIT_ASSERT_EQUAL(2862L, f.find("0123456789")); CPPUNIT_ASSERT_EQUAL(-1L, f.find("0123456789", 2863)); } void testWithZeroLengthAtom() { MP4::File f(TEST_FILE_PATH_C("zero-length-mdat.m4a")); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(1115, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(22050, f.audioProperties()->sampleRate()); } void testEmptyValuesRemoveItems() { const MP4::File f(TEST_FILE_PATH_C("has-tags.m4a")); MP4::Tag *tag = f.tag(); const String testTitle("Title"); const String testArtist("Artist"); const String testAlbum("Album"); const String testComment("Comment"); const String testGenre("Genre"); const String nullString; const unsigned int testYear = 2020; const unsigned int testTrack = 1; const unsigned int zeroUInt = 0; tag->setTitle(testTitle); CPPUNIT_ASSERT_EQUAL(testTitle, tag->title()); CPPUNIT_ASSERT(tag->contains("\251nam")); tag->setArtist(testArtist); CPPUNIT_ASSERT_EQUAL(testArtist, tag->artist()); CPPUNIT_ASSERT(tag->contains("\251ART")); tag->setAlbum(testAlbum); CPPUNIT_ASSERT_EQUAL(testAlbum, tag->album()); CPPUNIT_ASSERT(tag->contains("\251alb")); tag->setComment(testComment); CPPUNIT_ASSERT_EQUAL(testComment, tag->comment()); CPPUNIT_ASSERT(tag->contains("\251cmt")); tag->setGenre(testGenre); CPPUNIT_ASSERT_EQUAL(testGenre, tag->genre()); CPPUNIT_ASSERT(tag->contains("\251gen")); tag->setYear(testYear); CPPUNIT_ASSERT_EQUAL(testYear, tag->year()); CPPUNIT_ASSERT(tag->contains("\251day")); tag->setTrack(testTrack); CPPUNIT_ASSERT_EQUAL(testTrack, tag->track()); CPPUNIT_ASSERT(tag->contains("trkn")); tag->setTitle(nullString); CPPUNIT_ASSERT_EQUAL(nullString, tag->title()); CPPUNIT_ASSERT(!tag->contains("\251nam")); tag->setArtist(nullString); CPPUNIT_ASSERT_EQUAL(nullString, tag->artist()); CPPUNIT_ASSERT(!tag->contains("\251ART")); tag->setAlbum(nullString); CPPUNIT_ASSERT_EQUAL(nullString, tag->album()); CPPUNIT_ASSERT(!tag->contains("\251alb")); tag->setComment(nullString); CPPUNIT_ASSERT_EQUAL(nullString, tag->comment()); CPPUNIT_ASSERT(!tag->contains("\251cmt")); tag->setGenre(nullString); CPPUNIT_ASSERT_EQUAL(nullString, tag->genre()); CPPUNIT_ASSERT(!tag->contains("\251gen")); tag->setYear(zeroUInt); CPPUNIT_ASSERT_EQUAL(zeroUInt, tag->year()); CPPUNIT_ASSERT(!tag->contains("\251day")); tag->setTrack(zeroUInt); CPPUNIT_ASSERT_EQUAL(zeroUInt, tag->track()); CPPUNIT_ASSERT(!tag->contains("trkn")); } void testRemoveMetadata() { ScopedFileCopy copy("no-tags", ".m4a"); { MP4::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(!f.hasMP4Tag()); MP4::Tag *tag = f.tag(); CPPUNIT_ASSERT(tag->isEmpty()); tag->setTitle("TITLE"); f.save(); } { MP4::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(f.hasMP4Tag()); CPPUNIT_ASSERT(!f.tag()->isEmpty()); f.strip(); } { MP4::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(!f.hasMP4Tag()); CPPUNIT_ASSERT(f.tag()->isEmpty()); CPPUNIT_ASSERT(fileEqual( copy.fileName(), TEST_FILE_PATH_C("no-tags.m4a"))); } } void testNonFullMetaAtom() { { MP4::File f(TEST_FILE_PATH_C("non-full-meta.m4a")); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(f.hasMP4Tag()); CPPUNIT_ASSERT(f.tag()->contains("covr")); MP4::CoverArtList l = f.tag()->item("covr").toCoverArtList(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, l.size()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); CPPUNIT_ASSERT_EQUAL((unsigned int)79, l[0].data().size()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); CPPUNIT_ASSERT_EQUAL((unsigned int)287, l[1].data().size()); PropertyMap properties = f.properties(); CPPUNIT_ASSERT_EQUAL(StringList("Test Artist!!!!"), properties["ARTIST"]); CPPUNIT_ASSERT_EQUAL(StringList("FAAC 1.24"), properties["ENCODEDBY"]); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_mp4coverart.cpp������������������������������������������������������������0000664�0000000�0000000�00000005720�14447736377�0020244�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2009 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <mp4coverart.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestMP4CoverArt : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestMP4CoverArt); CPPUNIT_TEST(testSimple); CPPUNIT_TEST(testList); CPPUNIT_TEST_SUITE_END(); public: void testSimple() { MP4::CoverArt c(MP4::CoverArt::PNG, "foo"); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, c.format()); CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), c.data()); MP4::CoverArt c2(c); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, c2.format()); CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), c2.data()); MP4::CoverArt c3 = c; CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, c3.format()); CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), c3.data()); } void testList() { MP4::CoverArtList l; l.append(MP4::CoverArt(MP4::CoverArt::PNG, "foo")); l.append(MP4::CoverArt(MP4::CoverArt::JPEG, "bar")); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), l[0].data()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); CPPUNIT_ASSERT_EQUAL(ByteVector("bar"), l[1].data()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4CoverArt); ������������������������������������������������taglib-1.13.1/tests/test_mp4item.cpp����������������������������������������������������������������0000664�0000000�0000000�00000005070�14447736377�0017353�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2009 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <mp4coverart.h> #include <mp4item.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestMP4Item : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestMP4Item); CPPUNIT_TEST(testCoverArtList); CPPUNIT_TEST_SUITE_END(); public: void testCoverArtList() { MP4::CoverArtList l; l.append(MP4::CoverArt(MP4::CoverArt::PNG, "foo")); l.append(MP4::CoverArt(MP4::CoverArt::JPEG, "bar")); MP4::Item i(l); MP4::CoverArtList l2 = i.toCoverArtList(); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::PNG, l[0].format()); CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), l[0].data()); CPPUNIT_ASSERT_EQUAL(MP4::CoverArt::JPEG, l[1].format()); CPPUNIT_ASSERT_EQUAL(ByteVector("bar"), l[1].data()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4Item); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_mpc.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000015716�14447736377�0016563�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <apetag.h> #include <id3v1tag.h> #include <tstringlist.h> #include <tbytevectorlist.h> #include <tpropertymap.h> #include <mpcfile.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestMPC : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestMPC); CPPUNIT_TEST(testPropertiesSV8); CPPUNIT_TEST(testPropertiesSV7); CPPUNIT_TEST(testPropertiesSV5); CPPUNIT_TEST(testPropertiesSV4); CPPUNIT_TEST(testFuzzedFile1); CPPUNIT_TEST(testFuzzedFile2); CPPUNIT_TEST(testFuzzedFile3); CPPUNIT_TEST(testFuzzedFile4); CPPUNIT_TEST(testStripAndProperties); CPPUNIT_TEST(testRepeatedSave); CPPUNIT_TEST_SUITE_END(); public: void testPropertiesSV8() { MPC::File f(TEST_FILE_PATH_C("sv8_header.mpc")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(8, f.audioProperties()->mpcVersion()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(1497, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(66014U, f.audioProperties()->sampleFrames()); } void testPropertiesSV7() { MPC::File f(TEST_FILE_PATH_C("click.mpc")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(7, f.audioProperties()->mpcVersion()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(40, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(318, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(1760U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(14221, f.audioProperties()->trackGain()); CPPUNIT_ASSERT_EQUAL(19848, f.audioProperties()->trackPeak()); CPPUNIT_ASSERT_EQUAL(14221, f.audioProperties()->albumGain()); CPPUNIT_ASSERT_EQUAL(19848, f.audioProperties()->albumPeak()); } void testPropertiesSV5() { MPC::File f(TEST_FILE_PATH_C("sv5_header.mpc")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(5, f.audioProperties()->mpcVersion()); CPPUNIT_ASSERT_EQUAL(26, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(26371, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(1162944U, f.audioProperties()->sampleFrames()); } void testPropertiesSV4() { MPC::File f(TEST_FILE_PATH_C("sv4_header.mpc")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(4, f.audioProperties()->mpcVersion()); CPPUNIT_ASSERT_EQUAL(26, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(26371, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(1162944U, f.audioProperties()->sampleFrames()); } void testFuzzedFile1() { MPC::File f(TEST_FILE_PATH_C("zerodiv.mpc")); CPPUNIT_ASSERT(f.isValid()); } void testFuzzedFile2() { MPC::File f(TEST_FILE_PATH_C("infloop.mpc")); CPPUNIT_ASSERT(f.isValid()); } void testFuzzedFile3() { MPC::File f(TEST_FILE_PATH_C("segfault.mpc")); CPPUNIT_ASSERT(f.isValid()); } void testFuzzedFile4() { MPC::File f(TEST_FILE_PATH_C("segfault2.mpc")); CPPUNIT_ASSERT(f.isValid()); } void testStripAndProperties() { ScopedFileCopy copy("click", ".mpc"); { MPC::File f(copy.fileName().c_str()); f.APETag(true)->setTitle("APE"); f.ID3v1Tag(true)->setTitle("ID3v1"); f.save(); } { MPC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT_EQUAL(String("APE"), f.properties()["TITLE"].front()); f.strip(MPC::File::APE); CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); f.strip(MPC::File::ID3v1); CPPUNIT_ASSERT(f.properties().isEmpty()); f.save(); } { MPC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasAPETag()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); CPPUNIT_ASSERT(f.properties()["TITLE"].isEmpty()); CPPUNIT_ASSERT(f.properties().isEmpty()); } } void testRepeatedSave() { ScopedFileCopy copy("click", ".mpc"); { MPC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasAPETag()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); f.APETag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.save(); f.APETag()->setTitle("0"); f.save(); f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.APETag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); f.save(); } { MPC::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasAPETag()); CPPUNIT_ASSERT(f.hasID3v1Tag()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMPC); ��������������������������������������������������taglib-1.13.1/tests/test_mpeg.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000050145�14447736377�0016727�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tstring.h> #include <tpropertymap.h> #include <mpegfile.h> #include <id3v2tag.h> #include <id3v1tag.h> #include <apetag.h> #include <mpegproperties.h> #include <xingheader.h> #include <mpegheader.h> #include <id3v2extendedheader.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestMPEG : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestMPEG); CPPUNIT_TEST(testAudioPropertiesXingHeaderCBR); CPPUNIT_TEST(testAudioPropertiesXingHeaderVBR); CPPUNIT_TEST(testAudioPropertiesVBRIHeader); CPPUNIT_TEST(testAudioPropertiesNoVBRHeaders); CPPUNIT_TEST(testSkipInvalidFrames1); CPPUNIT_TEST(testSkipInvalidFrames2); CPPUNIT_TEST(testSkipInvalidFrames3); CPPUNIT_TEST(testVersion2DurationWithXingHeader); CPPUNIT_TEST(testSaveID3v24); CPPUNIT_TEST(testSaveID3v24WrongParam); CPPUNIT_TEST(testSaveID3v23); CPPUNIT_TEST(testDuplicateID3v2); CPPUNIT_TEST(testFuzzedFile); CPPUNIT_TEST(testFrameOffset); CPPUNIT_TEST(testStripAndProperties); CPPUNIT_TEST(testProperties); CPPUNIT_TEST(testRepeatedSave1); CPPUNIT_TEST(testRepeatedSave2); CPPUNIT_TEST(testRepeatedSave3); CPPUNIT_TEST(testEmptyID3v2); CPPUNIT_TEST(testEmptyID3v1); CPPUNIT_TEST(testEmptyAPE); CPPUNIT_TEST(testIgnoreGarbage); CPPUNIT_TEST(testExtendedHeader); CPPUNIT_TEST_SUITE_END(); public: void testAudioPropertiesXingHeaderCBR() { MPEG::File f(TEST_FILE_PATH_C("lame_cbr.mp3")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(1887, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(1887164, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(MPEG::XingHeader::Xing, f.audioProperties()->xingHeader()->type()); } void testAudioPropertiesXingHeaderVBR() { MPEG::File f(TEST_FILE_PATH_C("lame_vbr.mp3")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(1887, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(1887164, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(70, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(MPEG::XingHeader::Xing, f.audioProperties()->xingHeader()->type()); } void testAudioPropertiesVBRIHeader() { MPEG::File f(TEST_FILE_PATH_C("rare_frames.mp3")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(222, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(222198, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(233, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(MPEG::XingHeader::VBRI, f.audioProperties()->xingHeader()->type()); } void testAudioPropertiesNoVBRHeaders() { MPEG::File f(TEST_FILE_PATH_C("bladeenc.mp3")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3553, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT(!f.audioProperties()->xingHeader()); const long last = f.lastFrameOffset(); const MPEG::Header lastHeader(&f, last, false); CPPUNIT_ASSERT_EQUAL(28213L, last); CPPUNIT_ASSERT_EQUAL(209, lastHeader.frameLength()); } void testSkipInvalidFrames1() { MPEG::File f(TEST_FILE_PATH_C("invalid-frames1.mp3")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(392, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(160, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT(!f.audioProperties()->xingHeader()); } void testSkipInvalidFrames2() { MPEG::File f(TEST_FILE_PATH_C("invalid-frames2.mp3")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(314, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(192, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT(!f.audioProperties()->xingHeader()); } void testSkipInvalidFrames3() { MPEG::File f(TEST_FILE_PATH_C("invalid-frames3.mp3")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(183, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(320, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT(!f.audioProperties()->xingHeader()); } void testVersion2DurationWithXingHeader() { MPEG::File f(TEST_FILE_PATH_C("mpeg2.mp3")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(5387, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(5387285, f.audioProperties()->lengthInMilliseconds()); } void testSaveID3v24() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); String xxx = ByteVector(254, 'X'); { MPEG::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); f.tag()->setTitle(xxx); f.tag()->setArtist("Artist A"); f.save(MPEG::File::AllTags, File::StripOthers, ID3v2::v4); CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); } { MPEG::File f2(newname.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)4, f2.ID3v2Tag()->header()->majorVersion()); CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); } } void testSaveID3v24WrongParam() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); String xxx = ByteVector(254, 'X'); { MPEG::File f(newname.c_str()); f.tag()->setTitle(xxx); f.tag()->setArtist("Artist A"); f.save(MPEG::File::AllTags, true, 8); } { MPEG::File f2(newname.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)4, f2.ID3v2Tag()->header()->majorVersion()); CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); } } void testSaveID3v23() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); String xxx = ByteVector(254, 'X'); { MPEG::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); f.tag()->setTitle(xxx); f.tag()->setArtist("Artist A"); f.save(MPEG::File::AllTags, File::StripOthers, ID3v2::v3); CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); } { MPEG::File f2(newname.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)3, f2.ID3v2Tag()->header()->majorVersion()); CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); } } void testDuplicateID3v2() { MPEG::File f(TEST_FILE_PATH_C("duplicate_id3v2.mp3")); // duplicate_id3v2.mp3 has duplicate ID3v2 tags. // Sample rate will be 32000 if can't skip the second tag. CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); } void testFuzzedFile() { MPEG::File f(TEST_FILE_PATH_C("excessive_alloc.mp3")); CPPUNIT_ASSERT(f.isValid()); } void testFrameOffset() { { MPEG::File f(TEST_FILE_PATH_C("ape.mp3")); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL((long)0x0000, f.firstFrameOffset()); CPPUNIT_ASSERT_EQUAL((long)0x1FD6, f.lastFrameOffset()); } { MPEG::File f(TEST_FILE_PATH_C("ape-id3v1.mp3")); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL((long)0x0000, f.firstFrameOffset()); CPPUNIT_ASSERT_EQUAL((long)0x1FD6, f.lastFrameOffset()); } { MPEG::File f(TEST_FILE_PATH_C("ape-id3v2.mp3")); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL((long)0x041A, f.firstFrameOffset()); CPPUNIT_ASSERT_EQUAL((long)0x23F0, f.lastFrameOffset()); } } void testStripAndProperties() { ScopedFileCopy copy("xing", ".mp3"); { MPEG::File f(copy.fileName().c_str()); f.ID3v2Tag(true)->setTitle("ID3v2"); f.APETag(true)->setTitle("APE"); f.ID3v1Tag(true)->setTitle("ID3v1"); f.save(); } { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT_EQUAL(String("ID3v2"), f.properties()["TITLE"].front()); f.strip(MPEG::File::ID3v2); CPPUNIT_ASSERT_EQUAL(String("APE"), f.properties()["TITLE"].front()); f.strip(MPEG::File::APE); CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); f.strip(MPEG::File::ID3v1); CPPUNIT_ASSERT(f.properties().isEmpty()); } } void testProperties() { PropertyMap tags; tags["ALBUM"] = StringList("Album"); tags["ALBUMARTIST"] = StringList("Album Artist"); tags["ALBUMARTISTSORT"] = StringList("Album Artist Sort"); tags["ALBUMSORT"] = StringList("Album Sort"); tags["ARRANGER"] = StringList("Arranger"); tags["ARTIST"] = StringList("Artist"); tags["ARTISTSORT"] = StringList("Artist Sort"); tags["ARTISTWEBPAGE"] = StringList("Artist Web Page"); tags["ASIN"] = StringList("ASIN"); tags["AUDIOSOURCEWEBPAGE"] = StringList("Audio Source Web Page"); tags["BARCODE"] = StringList("Barcode"); tags["BPM"] = StringList("123"); tags["CATALOGNUMBER"] = StringList("Catalog Number"); tags["COMMENT"] = StringList("Comment"); tags["COMMENT:CDESC"] = StringList("Comment with Description"); tags["COMPILATION"] = StringList("1"); tags["COMPOSER"] = StringList("Composer"); tags["COMPOSERSORT"] = StringList("Composer Sort"); tags["CONDUCTOR"] = StringList("Conductor"); tags["WORK"] = StringList("Content Group"); tags["COPYRIGHT"] = StringList("2021 Copyright"); tags["COPYRIGHTURL"] = StringList("Copyright URL"); tags["DATE"] = StringList("2021-01-03 12:29:23"); tags["DISCNUMBER"] = StringList("3/5"); tags["DISCSUBTITLE"] = StringList("Disc Subtitle"); tags["DJMIXER"] = StringList("DJ Mixer"); tags["ENCODEDBY"] = StringList("Encoded by"); tags["ENCODING"] = StringList("Encoding"); tags["ENCODINGTIME"] = StringList("2021-01-03 13:48:44"); tags["ENGINEER"] = StringList("Engineer"); tags["FILETYPE"] = StringList("File Type"); tags["FILEWEBPAGE"] = StringList("File Web Page"); tags["GENRE"] = StringList("Genre"); tags["GROUPING"] = StringList("Grouping"); tags["INITIALKEY"] = StringList("Dbm"); tags["ISRC"] = StringList("UKAAA0500001"); tags["LABEL"] = StringList("Label"); tags["LANGUAGE"] = StringList("eng"); tags["LENGTH"] = StringList("1234"); tags["LYRICIST"] = StringList("Lyricist"); tags["LYRICS:LDESC"] = StringList("Lyrics"); tags["MEDIA"] = StringList("Media"); tags["MIXER"] = StringList("Mixer"); tags["MOOD"] = StringList("Mood"); tags["MOVEMENTNAME"] = StringList("Movement Name"); tags["MOVEMENTNUMBER"] = StringList("2"); tags["MUSICBRAINZ_ALBUMID"] = StringList("MusicBrainz_AlbumID"); tags["MUSICBRAINZ_ALBUMARTISTID"] = StringList("MusicBrainz_AlbumartistID"); tags["MUSICBRAINZ_ARTISTID"] = StringList("MusicBrainz_ArtistID"); tags["MUSICBRAINZ_RELEASEGROUPID"] = StringList("MusicBrainz_ReleasegroupID"); tags["MUSICBRAINZ_RELEASETRACKID"] = StringList("MusicBrainz_ReleasetrackID"); tags["MUSICBRAINZ_TRACKID"] = StringList("MusicBrainz_TrackID"); tags["MUSICBRAINZ_WORKID"] = StringList("MusicBrainz_WorkID"); tags["ORIGINALALBUM"] = StringList("Original Album"); tags["ORIGINALARTIST"] = StringList("Original Artist"); tags["ORIGINALDATE"] = StringList("2021-01-03 13:52:19"); tags["ORIGINALFILENAME"] = StringList("Original Filename"); tags["ORIGINALLYRICIST"] = StringList("Original Lyricist"); tags["OWNER"] = StringList("Owner"); tags["PAYMENTWEBPAGE"] = StringList("Payment Web Page"); tags["PERFORMER:DRUMS"] = StringList("Drummer"); tags["PERFORMER:GUITAR"] = StringList("Guitarist"); tags["PLAYLISTDELAY"] = StringList("10"); tags["PODCAST"] = StringList(); tags["PODCASTCATEGORY"] = StringList("Podcast Category"); tags["PODCASTDESC"] = StringList("Podcast Description"); tags["PODCASTID"] = StringList("Podcast ID"); tags["PODCASTURL"] = StringList("Podcast URL"); tags["PRODUCEDNOTICE"] = StringList("2021 Produced Notice"); tags["PRODUCER"] = StringList("Producer"); tags["PUBLISHERWEBPAGE"] = StringList("Publisher Web Page"); tags["RADIOSTATION"] = StringList("Radio Station"); tags["RADIOSTATIONOWNER"] = StringList("Radio Station Owner"); tags["RELEASECOUNTRY"] = StringList("Release Country"); tags["RELEASESTATUS"] = StringList("Release Status"); tags["RELEASETYPE"] = StringList("Release Type"); tags["REMIXER"] = StringList("Remixer"); tags["SCRIPT"] = StringList("Script"); tags["SUBTITLE"] = StringList("Subtitle"); tags["TITLE"] = StringList("Title"); tags["TITLESORT"] = StringList("Title Sort"); tags["TRACKNUMBER"] = StringList("2/4"); tags["URL:UDESC"] = StringList("URL"); ScopedFileCopy copy("xing", ".mp3"); { MPEG::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); CPPUNIT_ASSERT(properties.isEmpty()); f.setProperties(tags); f.save(); } { const MPEG::File f(copy.fileName().c_str()); PropertyMap properties = f.properties(); if (tags != properties) { CPPUNIT_ASSERT_EQUAL(tags.toString(), properties.toString()); } CPPUNIT_ASSERT(tags == properties); } } void testRepeatedSave1() { ScopedFileCopy copy("xing", ".mp3"); { MPEG::File f(copy.fileName().c_str()); f.ID3v2Tag(true)->setTitle(std::string(4096, 'X').c_str()); f.save(); } { MPEG::File f(copy.fileName().c_str()); f.ID3v2Tag(true)->setTitle(""); f.save(); f.ID3v2Tag(true)->setTitle(std::string(4096, 'X').c_str()); f.save(); CPPUNIT_ASSERT_EQUAL(5141L, f.firstFrameOffset()); } } void testRepeatedSave2() { ScopedFileCopy copy("xing", ".mp3"); MPEG::File f(copy.fileName().c_str()); f.ID3v2Tag(true)->setTitle("0123456789"); f.save(); f.save(); CPPUNIT_ASSERT_EQUAL(-1L, f.find("ID3", 3)); } void testRepeatedSave3() { ScopedFileCopy copy("xing", ".mp3"); { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasAPETag()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); f.APETag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.save(); f.APETag()->setTitle("0"); f.save(); f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.APETag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); f.save(); } { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasAPETag()); CPPUNIT_ASSERT(f.hasID3v1Tag()); } } void testEmptyID3v2() { ScopedFileCopy copy("xing", ".mp3"); { MPEG::File f(copy.fileName().c_str()); f.ID3v2Tag(true)->setTitle("0123456789"); f.save(MPEG::File::ID3v2); } { MPEG::File f(copy.fileName().c_str()); f.ID3v2Tag(true)->setTitle(""); f.save(MPEG::File::ID3v2, File::StripNone); } { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); } } void testEmptyID3v1() { ScopedFileCopy copy("xing", ".mp3"); { MPEG::File f(copy.fileName().c_str()); f.ID3v1Tag(true)->setTitle("0123456789"); f.save(MPEG::File::ID3v1); } { MPEG::File f(copy.fileName().c_str()); f.ID3v1Tag(true)->setTitle(""); f.save(MPEG::File::ID3v1, File::StripNone); } { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); } } void testEmptyAPE() { ScopedFileCopy copy("xing", ".mp3"); { MPEG::File f(copy.fileName().c_str()); f.APETag(true)->setTitle("0123456789"); f.save(MPEG::File::APE); } { MPEG::File f(copy.fileName().c_str()); f.APETag(true)->setTitle(""); f.save(MPEG::File::APE, File::StripNone); } { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasAPETag()); } } void testIgnoreGarbage() { const ScopedFileCopy copy("garbage", ".mp3"); { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(2255L, f.firstFrameOffset()); CPPUNIT_ASSERT_EQUAL(6015L, f.lastFrameOffset()); CPPUNIT_ASSERT_EQUAL(String("Title A"), f.ID3v2Tag()->title()); f.ID3v2Tag()->setTitle("Title B"); f.save(); } { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String("Title B"), f.ID3v2Tag()->title()); } } void testExtendedHeader() { const ScopedFileCopy copy("extended-header", ".mp3"); { MPEG::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(f.hasID3v2Tag()); ID3v2::Tag *tag = f.ID3v2Tag(); ID3v2::ExtendedHeader *ext = tag->extendedHeader(); CPPUNIT_ASSERT(ext); CPPUNIT_ASSERT_EQUAL(12U, ext->size()); CPPUNIT_ASSERT_EQUAL(String("Druids"), tag->title()); CPPUNIT_ASSERT_EQUAL(String("Excelsis"), tag->artist()); CPPUNIT_ASSERT_EQUAL(String("Vo Chrieger U Drache"), tag->album()); CPPUNIT_ASSERT_EQUAL(2013U, tag->year()); CPPUNIT_ASSERT_EQUAL(String("Folk/Power Metal"), tag->genre()); CPPUNIT_ASSERT_EQUAL(3U, tag->track()); CPPUNIT_ASSERT_EQUAL(String("2013"), f.properties().value("ORIGINALDATE").front()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMPEG); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_ogg.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000021011�14447736377�0016541�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2009 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tstringlist.h> #include <tbytevectorlist.h> #include <tpropertymap.h> #include <oggfile.h> #include <vorbisfile.h> #include <oggpageheader.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestOGG : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestOGG); CPPUNIT_TEST(testSimple); CPPUNIT_TEST(testSplitPackets1); CPPUNIT_TEST(testSplitPackets2); CPPUNIT_TEST(testDictInterface1); CPPUNIT_TEST(testDictInterface2); CPPUNIT_TEST(testAudioProperties); CPPUNIT_TEST(testPageChecksum); CPPUNIT_TEST(testPageGranulePosition); CPPUNIT_TEST_SUITE_END(); public: void testSimple() { ScopedFileCopy copy("empty", ".ogg"); string newname = copy.fileName(); { Vorbis::File f(newname.c_str()); f.tag()->setArtist("The Artist"); f.save(); } { Vorbis::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(String("The Artist"), f.tag()->artist()); } } void testSplitPackets1() { ScopedFileCopy copy("empty", ".ogg"); string newname = copy.fileName(); const String text = longText(128 * 1024, true); { Vorbis::File f(newname.c_str()); f.tag()->setTitle(text); f.save(); } { Vorbis::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(136383L, f.length()); CPPUNIT_ASSERT_EQUAL(19, f.lastPageHeader()->pageSequenceNumber()); CPPUNIT_ASSERT_EQUAL(30U, f.packet(0).size()); CPPUNIT_ASSERT_EQUAL(131127U, f.packet(1).size()); CPPUNIT_ASSERT_EQUAL(3832U, f.packet(2).size()); CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); f.tag()->setTitle("ABCDE"); f.save(); } { Vorbis::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(4370L, f.length()); CPPUNIT_ASSERT_EQUAL(3, f.lastPageHeader()->pageSequenceNumber()); CPPUNIT_ASSERT_EQUAL(30U, f.packet(0).size()); CPPUNIT_ASSERT_EQUAL(60U, f.packet(1).size()); CPPUNIT_ASSERT_EQUAL(3832U, f.packet(2).size()); CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); } } void testSplitPackets2() { ScopedFileCopy copy("empty", ".ogg"); string newname = copy.fileName(); const String text = longText(60890, true); { Vorbis::File f(newname.c_str()); f.tag()->setTitle(text); f.save(); } { Vorbis::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); f.tag()->setTitle("ABCDE"); f.save(); } { Vorbis::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); } } void testDictInterface1() { ScopedFileCopy copy("empty", ".ogg"); string newname = copy.fileName(); Vorbis::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)0, f.tag()->properties().size()); PropertyMap newTags; StringList values("value 1"); values.append("value 2"); newTags["ARTIST"] = values; f.tag()->setProperties(newTags); PropertyMap map = f.tag()->properties(); CPPUNIT_ASSERT_EQUAL((unsigned int)1, map.size()); CPPUNIT_ASSERT_EQUAL((unsigned int)2, map["ARTIST"].size()); CPPUNIT_ASSERT_EQUAL(String("value 1"), map["ARTIST"][0]); } void testDictInterface2() { ScopedFileCopy copy("test", ".ogg"); string newname = copy.fileName(); Vorbis::File f(newname.c_str()); PropertyMap tags = f.tag()->properties(); CPPUNIT_ASSERT_EQUAL((unsigned int)2, tags["UNUSUALTAG"].size()); CPPUNIT_ASSERT_EQUAL(String("usual value"), tags["UNUSUALTAG"][0]); CPPUNIT_ASSERT_EQUAL(String("another value"), tags["UNUSUALTAG"][1]); CPPUNIT_ASSERT_EQUAL( String("\xC3\xB6\xC3\xA4\xC3\xBC\x6F\xCE\xA3\xC3\xB8", String::UTF8), tags["UNICODETAG"][0]); tags["UNICODETAG"][0] = String( "\xCE\xBD\xCE\xB5\xCF\x89\x20\xCE\xBD\xCE\xB1\xCE\xBB\xCF\x85\xCE\xB5", String::UTF8); tags.erase("UNUSUALTAG"); f.tag()->setProperties(tags); CPPUNIT_ASSERT_EQUAL( String("\xCE\xBD\xCE\xB5\xCF\x89\x20\xCE\xBD\xCE\xB1\xCE\xBB\xCF\x85\xCE\xB5", String::UTF8), f.tag()->properties()["UNICODETAG"][0]); CPPUNIT_ASSERT_EQUAL(false, f.tag()->properties().contains("UNUSUALTAG")); } void testAudioProperties() { Ogg::Vorbis::File f(TEST_FILE_PATH_C("empty.ogg")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->vorbisVersion()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrateMaximum()); CPPUNIT_ASSERT_EQUAL(112000, f.audioProperties()->bitrateNominal()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrateMinimum()); } void testPageChecksum() { ScopedFileCopy copy("empty", ".ogg"); { Vorbis::File f(copy.fileName().c_str()); f.tag()->setArtist("The Artist"); f.save(); f.seek(0x50); CPPUNIT_ASSERT_EQUAL((unsigned int)0x3d3bd92d, f.readBlock(4).toUInt(0, true)); } { Vorbis::File f(copy.fileName().c_str()); f.tag()->setArtist("The Artist 2"); f.save(); f.seek(0x50); CPPUNIT_ASSERT_EQUAL((unsigned int)0xd985291c, f.readBlock(4).toUInt(0, true)); } } void testPageGranulePosition() { ScopedFileCopy copy("empty", ".ogg"); { Vorbis::File f(copy.fileName().c_str()); // Force the Vorbis comment packet to span more than one page and // check if the granule position is -1 indicating that no packets // finish on this page. f.tag()->setComment(String(ByteVector(70000, 'A'))); f.save(); f.seek(0x3a); CPPUNIT_ASSERT_EQUAL(ByteVector("OggS\0\0", 6), f.readBlock(6)); CPPUNIT_ASSERT_EQUAL(static_cast<long long>(-1), f.readBlock(8).toLongLong()); } { Vorbis::File f(copy.fileName().c_str()); // Use a small Vorbis comment package which ends on the seconds page and // check if the granule position is zero. f.tag()->setComment("A small comment"); f.save(); f.seek(0x3a); CPPUNIT_ASSERT_EQUAL(ByteVector("OggS\0\0", 6), f.readBlock(6)); CPPUNIT_ASSERT_EQUAL(static_cast<long long>(0), f.readBlock(8).toLongLong()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestOGG); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_oggflac.cpp����������������������������������������������������������������0000664�0000000�0000000�00000010422�14447736377�0017373�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2009 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tstringlist.h> #include <tbytevectorlist.h> #include <oggfile.h> #include <oggflacfile.h> #include <oggpageheader.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestOggFLAC : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestOggFLAC); CPPUNIT_TEST(testFramingBit); CPPUNIT_TEST(testFuzzedFile); CPPUNIT_TEST(testSplitPackets); CPPUNIT_TEST_SUITE_END(); public: void testFramingBit() { ScopedFileCopy copy("empty_flac", ".oga"); string newname = copy.fileName(); { Ogg::FLAC::File f(newname.c_str()); f.tag()->setArtist("The Artist"); f.save(); } { Ogg::FLAC::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(String("The Artist"), f.tag()->artist()); f.seek(0, File::End); CPPUNIT_ASSERT_EQUAL(9134L, f.tell()); } } void testFuzzedFile() { Ogg::FLAC::File f(TEST_FILE_PATH_C("segfault.oga")); CPPUNIT_ASSERT(!f.isValid()); } void testSplitPackets() { ScopedFileCopy copy("empty_flac", ".oga"); string newname = copy.fileName(); const String text = longText(128 * 1024, true); { Ogg::FLAC::File f(newname.c_str()); f.tag()->setTitle(text); f.save(); } { Ogg::FLAC::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(141141L, f.length()); CPPUNIT_ASSERT_EQUAL(21, f.lastPageHeader()->pageSequenceNumber()); CPPUNIT_ASSERT_EQUAL(51U, f.packet(0).size()); CPPUNIT_ASSERT_EQUAL(131126U, f.packet(1).size()); CPPUNIT_ASSERT_EQUAL(22U, f.packet(2).size()); CPPUNIT_ASSERT_EQUAL(8196U, f.packet(3).size()); CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds()); f.tag()->setTitle("ABCDE"); f.save(); } { Ogg::FLAC::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(9128L, f.length()); CPPUNIT_ASSERT_EQUAL(5, f.lastPageHeader()->pageSequenceNumber()); CPPUNIT_ASSERT_EQUAL(51U, f.packet(0).size()); CPPUNIT_ASSERT_EQUAL(59U, f.packet(1).size()); CPPUNIT_ASSERT_EQUAL(22U, f.packet(2).size()); CPPUNIT_ASSERT_EQUAL(8196U, f.packet(3).size()); CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestOggFLAC); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_opus.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000012704�14447736377�0016764�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tbytevectorlist.h> #include <opusfile.h> #include <oggpageheader.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestOpus : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestOpus); CPPUNIT_TEST(testAudioProperties); CPPUNIT_TEST(testReadComments); CPPUNIT_TEST(testWriteComments); CPPUNIT_TEST(testSplitPackets); CPPUNIT_TEST_SUITE_END(); public: void testAudioProperties() { Ogg::Opus::File f(TEST_FILE_PATH_C("correctness_gain_silent_output.opus")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(7, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(7737, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(36, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(48000, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(48000, f.audioProperties()->inputSampleRate()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->opusVersion()); } void testReadComments() { Ogg::Opus::File f(TEST_FILE_PATH_C("correctness_gain_silent_output.opus")); CPPUNIT_ASSERT_EQUAL(StringList("Xiph.Org Opus testvectormaker"), f.tag()->fieldListMap()["ENCODER"]); CPPUNIT_ASSERT(f.tag()->fieldListMap().contains("TESTDESCRIPTION")); CPPUNIT_ASSERT(!f.tag()->fieldListMap().contains("ARTIST")); CPPUNIT_ASSERT_EQUAL(String("libopus 0.9.11-66-g64c2dd7"), f.tag()->vendorID()); } void testWriteComments() { ScopedFileCopy copy("correctness_gain_silent_output", ".opus"); string filename = copy.fileName(); { Ogg::Opus::File f(filename.c_str()); f.tag()->setArtist("Your Tester"); f.save(); } { Ogg::Opus::File f(filename.c_str()); CPPUNIT_ASSERT_EQUAL(StringList("Xiph.Org Opus testvectormaker"), f.tag()->fieldListMap()["ENCODER"]); CPPUNIT_ASSERT(f.tag()->fieldListMap().contains("TESTDESCRIPTION")); CPPUNIT_ASSERT_EQUAL(StringList("Your Tester"), f.tag()->fieldListMap()["ARTIST"]); CPPUNIT_ASSERT_EQUAL(String("libopus 0.9.11-66-g64c2dd7"), f.tag()->vendorID()); } } void testSplitPackets() { ScopedFileCopy copy("correctness_gain_silent_output", ".opus"); string newname = copy.fileName(); const String text = longText(128 * 1024, true); { Ogg::Opus::File f(newname.c_str()); f.tag()->setTitle(text); f.save(); } { Ogg::Opus::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(167534L, f.length()); CPPUNIT_ASSERT_EQUAL(27, f.lastPageHeader()->pageSequenceNumber()); CPPUNIT_ASSERT_EQUAL(19U, f.packet(0).size()); CPPUNIT_ASSERT_EQUAL(131380U, f.packet(1).size()); CPPUNIT_ASSERT_EQUAL(5U, f.packet(2).size()); CPPUNIT_ASSERT_EQUAL(5U, f.packet(3).size()); CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(7737, f.audioProperties()->lengthInMilliseconds()); f.tag()->setTitle("ABCDE"); f.save(); } { Ogg::Opus::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(35521L, f.length()); CPPUNIT_ASSERT_EQUAL(11, f.lastPageHeader()->pageSequenceNumber()); CPPUNIT_ASSERT_EQUAL(19U, f.packet(0).size()); CPPUNIT_ASSERT_EQUAL(313U, f.packet(1).size()); CPPUNIT_ASSERT_EQUAL(5U, f.packet(2).size()); CPPUNIT_ASSERT_EQUAL(5U, f.packet(3).size()); CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(7737, f.audioProperties()->lengthInMilliseconds()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestOpus); ������������������������������������������������������������taglib-1.13.1/tests/test_propertymap.cpp������������������������������������������������������������0000664�0000000�0000000�00000015575�14447736377�0020371�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2012 by Michael Helmling email : helmling@mathematik.uni-kl.de ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tpropertymap.h> #include <tag.h> #include <apetag.h> #include <asftag.h> #include <id3v1tag.h> #include <id3v2tag.h> #include <infotag.h> #include <mp4tag.h> #include <xiphcomment.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace TagLib; class TestPropertyMap : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestPropertyMap); CPPUNIT_TEST(testInvalidKeys); CPPUNIT_TEST(testGetSetApe); CPPUNIT_TEST(testGetSetAsf); CPPUNIT_TEST(testGetSetId3v1); CPPUNIT_TEST(testGetSetId3v2); CPPUNIT_TEST(testGetSetInfo); CPPUNIT_TEST(testGetSetMp4); CPPUNIT_TEST(testGetSetXiphComment); CPPUNIT_TEST(testGetSet); CPPUNIT_TEST_SUITE_END(); public: void testInvalidKeys() { PropertyMap map1; CPPUNIT_ASSERT(map1.isEmpty()); map1[L"\x00c4\x00d6\x00dc"].append("test"); CPPUNIT_ASSERT_EQUAL(map1.size(), 1u); PropertyMap map2; map2[L"\x00c4\x00d6\x00dc"].append("test"); CPPUNIT_ASSERT(map1 == map2); CPPUNIT_ASSERT(map1.contains(map2)); map2["ARTIST"] = String("Test Artist"); CPPUNIT_ASSERT(map1 != map2); CPPUNIT_ASSERT(map2.contains(map1)); map2[L"\x00c4\x00d6\x00dc"].append("test 2"); CPPUNIT_ASSERT(!map2.contains(map1)); } template <typename T> void tagGetSet() { T tag; tag.setTitle("Test Title"); tag.setArtist("Test Artist"); tag.setAlbum("Test Album"); tag.setYear(2015); tag.setTrack(10); { PropertyMap prop = tag.properties(); CPPUNIT_ASSERT_EQUAL(String("Test Title"), prop["TITLE" ].front()); CPPUNIT_ASSERT_EQUAL(String("Test Artist"), prop["ARTIST" ].front()); CPPUNIT_ASSERT_EQUAL(String("Test Album"), prop["ALBUM" ].front()); CPPUNIT_ASSERT_EQUAL(String("2015"), prop["DATE" ].front()); CPPUNIT_ASSERT_EQUAL(String("10"), prop["TRACKNUMBER"].front()); prop["TITLE" ].front() = "Test Title 2"; prop["ARTIST" ].front() = "Test Artist 2"; prop["TRACKNUMBER"].front() = "5"; tag.setProperties(prop); } CPPUNIT_ASSERT_EQUAL(String("Test Title 2"), tag.title()); CPPUNIT_ASSERT_EQUAL(String("Test Artist 2"), tag.artist()); CPPUNIT_ASSERT_EQUAL(5U, tag.track()); CPPUNIT_ASSERT(!tag.isEmpty()); PropertyMap props = tag.properties(); CPPUNIT_ASSERT_EQUAL(StringList("Test Artist 2"), props.find("ARTIST")->second); CPPUNIT_ASSERT(props.find("COMMENT") == props.end()); props.replace("ARTIST", StringList("Test Artist 3")); CPPUNIT_ASSERT_EQUAL(StringList("Test Artist 3"), props["ARTIST"]); PropertyMap eraseMap; eraseMap.insert("ARTIST", StringList()); eraseMap.insert("ALBUM", StringList()); eraseMap.insert("TITLE", StringList()); props.erase(eraseMap); CPPUNIT_ASSERT_EQUAL(String("DATE=2015\nTRACKNUMBER=5\n"), props.toString()); tag.setProperties(PropertyMap()); CPPUNIT_ASSERT(tag.isEmpty()); CPPUNIT_ASSERT(tag.properties().isEmpty()); CPPUNIT_ASSERT_EQUAL(String(""), tag.title()); CPPUNIT_ASSERT_EQUAL(String(""), tag.artist()); CPPUNIT_ASSERT_EQUAL(String(""), tag.album()); CPPUNIT_ASSERT_EQUAL(String(""), tag.comment()); CPPUNIT_ASSERT_EQUAL(String(""), tag.genre()); CPPUNIT_ASSERT_EQUAL(0U, tag.track()); CPPUNIT_ASSERT(tag.isEmpty()); CPPUNIT_ASSERT(tag.properties().isEmpty()); } void testGetSetId3v1() { tagGetSet<ID3v1::Tag>(); } void testGetSetId3v2() { tagGetSet<ID3v2::Tag>(); } void testGetSetXiphComment() { tagGetSet<Ogg::XiphComment>(); } void testGetSetApe() { tagGetSet<APE::Tag>(); } void testGetSetAsf() { tagGetSet<ASF::Tag>(); } void testGetSetMp4() { tagGetSet<MP4::Tag>(); } void testGetSetInfo() { tagGetSet<RIFF::Info::Tag>(); } void testGetSet() { PropertyMap props; props["Title"] = String("Test Title"); StringList artists("Artist 1"); artists.append("Artist 2"); props.insert("Artist", artists); CPPUNIT_ASSERT_EQUAL(StringList("Test Title"), props.value("TITLE")); CPPUNIT_ASSERT_EQUAL(StringList("Test Title"), props.value("Title")); CPPUNIT_ASSERT_EQUAL(StringList("Test Title"), props["TITLE"]); CPPUNIT_ASSERT_EQUAL(StringList("Test Title"), props["Title"]); CPPUNIT_ASSERT(props.contains("title")); CPPUNIT_ASSERT_EQUAL(StringList("Test Title"), props.find("TITLE")->second); CPPUNIT_ASSERT_EQUAL(2U, props.size()); CPPUNIT_ASSERT(!props.isEmpty()); props.clear(); CPPUNIT_ASSERT(props.isEmpty()); CPPUNIT_ASSERT_EQUAL(StringList(), props.value("TITLE")); CPPUNIT_ASSERT_EQUAL(StringList(), props.value("Title")); CPPUNIT_ASSERT_EQUAL(artists, props.value("Title", artists)); CPPUNIT_ASSERT(!props.contains("title")); CPPUNIT_ASSERT(props.find("TITLE") == props.end()); CPPUNIT_ASSERT_EQUAL(0U, props.size()); CPPUNIT_ASSERT(props.isEmpty()); CPPUNIT_ASSERT_EQUAL(StringList(), props["TITLE"]); CPPUNIT_ASSERT_EQUAL(StringList(), props["Title"]); CPPUNIT_ASSERT(props.contains("title")); CPPUNIT_ASSERT(props.find("TITLE") != props.end()); CPPUNIT_ASSERT_EQUAL(1U, props.size()); CPPUNIT_ASSERT(!props.isEmpty()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestPropertyMap); �����������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_riff.cpp�������������������������������������������������������������������0000664�0000000�0000000�00000031534�14447736377�0016726�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2009 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <tag.h> #include <tbytevectorlist.h> #include <rifffile.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class PublicRIFF : public RIFF::File { public: PublicRIFF(FileName file) : RIFF::File(file, BigEndian) {}; unsigned int riffSize() { return RIFF::File::riffSize(); }; unsigned int chunkCount() { return RIFF::File::chunkCount(); }; unsigned int chunkOffset(unsigned int i) { return RIFF::File::chunkOffset(i); }; unsigned int chunkPadding(unsigned int i) { return RIFF::File::chunkPadding(i); }; unsigned int chunkDataSize(unsigned int i) { return RIFF::File::chunkDataSize(i); }; ByteVector chunkName(unsigned int i) { return RIFF::File::chunkName(i); }; ByteVector chunkData(unsigned int i) { return RIFF::File::chunkData(i); }; void setChunkData(unsigned int i, const ByteVector &data) { RIFF::File::setChunkData(i, data); } void setChunkData(const ByteVector &name, const ByteVector &data) { RIFF::File::setChunkData(name, data); }; virtual TagLib::Tag* tag() const { return 0; }; virtual TagLib::AudioProperties* audioProperties() const { return 0;}; virtual bool save() { return false; }; void removeChunk(unsigned int i) { RIFF::File::removeChunk(i); } void removeChunk(const ByteVector &name) { RIFF::File::removeChunk(name); } }; class TestRIFF : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestRIFF); CPPUNIT_TEST(testPadding); CPPUNIT_TEST(testLastChunkAtEvenPosition); CPPUNIT_TEST(testLastChunkAtEvenPosition2); CPPUNIT_TEST(testLastChunkAtEvenPosition3); CPPUNIT_TEST(testChunkOffset); CPPUNIT_TEST_SUITE_END(); public: void testPadding() { ScopedFileCopy copy("empty", ".aiff"); string filename = copy.fileName(); { PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x1728 + 8), f.chunkOffset(2)); f.setChunkData("TEST", "foo"); } { PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f.chunkData(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(3), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x1728 + 8), f.chunkOffset(2)); f.setChunkData("SSND", "abcd"); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(1)); CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), f.chunkData(1)); f.seek(f.chunkOffset(1)); CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), f.readBlock(4)); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f.chunkData(2)); f.seek(f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f.readBlock(3)); } { PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(1)); CPPUNIT_ASSERT_EQUAL(ByteVector("abcd"), f.chunkData(1)); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("foo"), f.chunkData(2)); } } void testLastChunkAtEvenPosition() { ScopedFileCopy copy("noise", ".aif"); string filename = copy.fileName(); { PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)(0xff0 + 8), f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); CPPUNIT_ASSERT_EQUAL(long(4400), f.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)(4399 - 8), f.riffSize()); f.setChunkData("TEST", "abcd"); CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4), f.chunkDataSize(3)); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4412 - 8), f.riffSize()); } { PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4), f.chunkDataSize(3)); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(3)); CPPUNIT_ASSERT_EQUAL(long(4412), f.length()); } } void testLastChunkAtEvenPosition2() { ScopedFileCopy copy("noise_odd", ".aif"); string filename = copy.fileName(); { PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)(0xff0 + 8), f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(2)); CPPUNIT_ASSERT_EQUAL(long(4399), f.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)(4399 - 8), f.riffSize()); f.setChunkData("TEST", "abcd"); CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4), f.chunkDataSize(3)); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4412 - 8), f.riffSize()); } { PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4), f.chunkDataSize(3)); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(3)); CPPUNIT_ASSERT_EQUAL(long(4412), f.length()); } } void testLastChunkAtEvenPosition3() { ScopedFileCopy copy("noise_odd", ".aif"); string filename = copy.fileName(); { PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)(0xff0 + 8), f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0), f.chunkPadding(2)); CPPUNIT_ASSERT_EQUAL(long(4399), f.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)(4399 - 8), f.riffSize()); f.setChunkData("TEST", "abc"); CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(3), f.chunkDataSize(3)); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4412 - 8), f.riffSize()); } { PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)(4088), f.chunkOffset(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(311), f.chunkDataSize(2)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(4408), f.chunkOffset(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(3), f.chunkDataSize(3)); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(3)); CPPUNIT_ASSERT_EQUAL((unsigned int)(1), f.chunkPadding(3)); CPPUNIT_ASSERT_EQUAL(long(4412), f.length()); } } void testChunkOffset() { ScopedFileCopy copy("empty", ".aiff"); string filename = copy.fileName(); PublicRIFF f(filename.c_str()); CPPUNIT_ASSERT_EQUAL(5928U, f.riffSize()); CPPUNIT_ASSERT_EQUAL(5936L, f.length()); CPPUNIT_ASSERT_EQUAL(ByteVector("COMM"), f.chunkName(0)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.chunkName(1)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x0026 + 8), f.chunkOffset(1)); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.chunkName(2)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x1728 + 8), f.chunkOffset(2)); const ByteVector data(0x400, ' '); f.setChunkData("SSND", data); CPPUNIT_ASSERT_EQUAL(1070U, f.riffSize()); CPPUNIT_ASSERT_EQUAL(1078L, f.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x0026 + 8), f.chunkOffset(1)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x042E + 8), f.chunkOffset(2)); f.seek(f.chunkOffset(0) - 8); CPPUNIT_ASSERT_EQUAL(ByteVector("COMM"), f.readBlock(4)); f.seek(f.chunkOffset(1) - 8); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.readBlock(4)); f.seek(f.chunkOffset(2) - 8); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.readBlock(4)); f.setChunkData(0, data); CPPUNIT_ASSERT_EQUAL(2076U, f.riffSize()); CPPUNIT_ASSERT_EQUAL(2084L, f.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x0414 + 8), f.chunkOffset(1)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x081C + 8), f.chunkOffset(2)); f.seek(f.chunkOffset(0) - 8); CPPUNIT_ASSERT_EQUAL(ByteVector("COMM"), f.readBlock(4)); f.seek(f.chunkOffset(1) - 8); CPPUNIT_ASSERT_EQUAL(ByteVector("SSND"), f.readBlock(4)); f.seek(f.chunkOffset(2) - 8); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.readBlock(4)); f.removeChunk("SSND"); CPPUNIT_ASSERT_EQUAL(1044U, f.riffSize()); CPPUNIT_ASSERT_EQUAL(1052L, f.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x0414 + 8), f.chunkOffset(1)); f.seek(f.chunkOffset(0) - 8); CPPUNIT_ASSERT_EQUAL(ByteVector("COMM"), f.readBlock(4)); f.seek(f.chunkOffset(1) - 8); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.readBlock(4)); f.removeChunk(0); CPPUNIT_ASSERT_EQUAL(12U, f.riffSize()); CPPUNIT_ASSERT_EQUAL(20L, f.length()); CPPUNIT_ASSERT_EQUAL((unsigned int)(0x000C + 8), f.chunkOffset(0)); f.seek(f.chunkOffset(0) - 8); CPPUNIT_ASSERT_EQUAL(ByteVector("TEST"), f.readBlock(4)); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestRIFF); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_s3m.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000011553�14447736377�0016501�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <s3mfile.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; static const String titleBefore("test song name"); static const String titleAfter("changed title"); static const String commentBefore( "This is an instrument name.\n" "Module file formats\n" "abuse instrument names\n" "as multiline comments.\n" " "); static const String newComment( "This is an instrument name!\n" "Module file formats\n" "abuse instrument names\n" "as multiline comments.\n" "-----------------------------------\n" "This line will be dropped and the previous is truncated."); static const String commentAfter( "This is an instrument name!\n" "Module file formats\n" "abuse instrument names\n" "as multiline comments.\n" "---------------------------"); class TestS3M : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestS3M); CPPUNIT_TEST(testReadTags); CPPUNIT_TEST(testWriteTags); CPPUNIT_TEST_SUITE_END(); public: void testReadTags() { testRead(TEST_FILE_PATH_C("test.s3m"), titleBefore, commentBefore); } void testWriteTags() { ScopedFileCopy copy("test", ".s3m"); { S3M::File file(copy.fileName().c_str()); CPPUNIT_ASSERT(file.tag() != 0); file.tag()->setTitle(titleAfter); file.tag()->setComment(newComment); file.tag()->setTrackerName("won't be saved"); CPPUNIT_ASSERT(file.save()); } testRead(copy.fileName().c_str(), titleAfter, commentAfter); CPPUNIT_ASSERT(fileEqual( copy.fileName(), TEST_FILE_PATH_C("changed.s3m"))); } private: void testRead(FileName fileName, const String &title, const String &comment) { S3M::File file(fileName); CPPUNIT_ASSERT(file.isValid()); S3M::Properties *p = file.audioProperties(); Mod::Tag *t = file.tag(); CPPUNIT_ASSERT(0 != p); CPPUNIT_ASSERT(0 != t); CPPUNIT_ASSERT_EQUAL( 0, p->length()); CPPUNIT_ASSERT_EQUAL( 0, p->bitrate()); CPPUNIT_ASSERT_EQUAL( 0, p->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, p->channels()); CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->lengthInPatterns()); CPPUNIT_ASSERT_EQUAL(false, p->stereo()); CPPUNIT_ASSERT_EQUAL((unsigned short) 5, p->sampleCount()); CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->patternCount()); CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->flags()); CPPUNIT_ASSERT_EQUAL((unsigned short)4896, p->trackerVersion()); CPPUNIT_ASSERT_EQUAL((unsigned short) 2, p->fileFormatVersion()); CPPUNIT_ASSERT_EQUAL((unsigned char) 64, p->globalVolume()); CPPUNIT_ASSERT_EQUAL((unsigned char) 48, p->masterVolume()); CPPUNIT_ASSERT_EQUAL((unsigned char)125, p->tempo()); CPPUNIT_ASSERT_EQUAL((unsigned char) 6, p->bpmSpeed()); CPPUNIT_ASSERT_EQUAL(title, t->title()); CPPUNIT_ASSERT_EQUAL(String(), t->artist()); CPPUNIT_ASSERT_EQUAL(String(), t->album()); CPPUNIT_ASSERT_EQUAL(comment, t->comment()); CPPUNIT_ASSERT_EQUAL(String(), t->genre()); CPPUNIT_ASSERT_EQUAL(0U, t->year()); CPPUNIT_ASSERT_EQUAL(0U, t->track()); CPPUNIT_ASSERT_EQUAL(String("ScreamTracker III"), t->trackerName()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestS3M); �����������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_speex.cpp������������������������������������������������������������������0000664�0000000�0000000�00000010144�14447736377�0017116�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2015 by Tsuda Kageyu email : tsuda.kageyu@gmail.com ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <speexfile.h> #include <oggpageheader.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestSpeex : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestSpeex); CPPUNIT_TEST(testAudioProperties); CPPUNIT_TEST(testSplitPackets); CPPUNIT_TEST_SUITE_END(); public: void testAudioProperties() { Ogg::Speex::File f(TEST_FILE_PATH_C("empty.spx")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(53, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(-1, f.audioProperties()->bitrateNominal()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); } void testSplitPackets() { ScopedFileCopy copy("empty", ".spx"); string newname = copy.fileName(); const String text = longText(128 * 1024, true); { Ogg::Speex::File f(newname.c_str()); f.tag()->setTitle(text); f.save(); } { Ogg::Speex::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(156330L, f.length()); CPPUNIT_ASSERT_EQUAL(23, f.lastPageHeader()->pageSequenceNumber()); CPPUNIT_ASSERT_EQUAL(80U, f.packet(0).size()); CPPUNIT_ASSERT_EQUAL(131116U, f.packet(1).size()); CPPUNIT_ASSERT_EQUAL(93U, f.packet(2).size()); CPPUNIT_ASSERT_EQUAL(93U, f.packet(3).size()); CPPUNIT_ASSERT_EQUAL(text, f.tag()->title()); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); f.tag()->setTitle("ABCDE"); f.save(); } { Ogg::Speex::File f(newname.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT_EQUAL(24317L, f.length()); CPPUNIT_ASSERT_EQUAL(7, f.lastPageHeader()->pageSequenceNumber()); CPPUNIT_ASSERT_EQUAL(80U, f.packet(0).size()); CPPUNIT_ASSERT_EQUAL(49U, f.packet(1).size()); CPPUNIT_ASSERT_EQUAL(93U, f.packet(2).size()); CPPUNIT_ASSERT_EQUAL(93U, f.packet(3).size()); CPPUNIT_ASSERT_EQUAL(String("ABCDE"), f.tag()->title()); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestSpeex); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_string.cpp�����������������������������������������������������������������0000664�0000000�0000000�00000032403�14447736377�0017302�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <tstring.h> #include <string.h> #include <cppunit/extensions/HelperMacros.h> using namespace std; using namespace TagLib; class TestString : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestString); CPPUNIT_TEST(testString); CPPUNIT_TEST(testRfind); CPPUNIT_TEST(testUTF16Encode); CPPUNIT_TEST(testUTF16Decode); CPPUNIT_TEST(testUTF16DecodeInvalidBOM); CPPUNIT_TEST(testUTF16DecodeEmptyWithBOM); CPPUNIT_TEST(testSurrogatePair); CPPUNIT_TEST(testAppendCharDetach); CPPUNIT_TEST(testAppendStringDetach); CPPUNIT_TEST(testToInt); CPPUNIT_TEST(testFromInt); CPPUNIT_TEST(testSubstr); CPPUNIT_TEST(testNewline); CPPUNIT_TEST(testUpper); CPPUNIT_TEST(testEncodeNonLatin1); CPPUNIT_TEST(testEncodeEmpty); CPPUNIT_TEST(testEncodeNonBMP); CPPUNIT_TEST(testIterator); CPPUNIT_TEST(testInvalidUTF8); CPPUNIT_TEST_SUITE_END(); public: void testString() { String s = "taglib string"; ByteVector v = "taglib string"; CPPUNIT_ASSERT(v == s.data(String::Latin1)); char str[] = "taglib string"; CPPUNIT_ASSERT(strcmp(s.toCString(), str) == 0); CPPUNIT_ASSERT(s == "taglib string"); CPPUNIT_ASSERT(s != "taglib STRING"); CPPUNIT_ASSERT(s != "taglib"); CPPUNIT_ASSERT(s != "taglib string taglib"); CPPUNIT_ASSERT(s == L"taglib string"); CPPUNIT_ASSERT(s != L"taglib STRING"); CPPUNIT_ASSERT(s != L"taglib"); CPPUNIT_ASSERT(s != L"taglib string taglib"); s.clear(); CPPUNIT_ASSERT(s.isEmpty()); String unicode("JosĂ© Carlos", String::UTF8); CPPUNIT_ASSERT(strcmp(unicode.toCString(), "Jos\xe9 Carlos") == 0); String latin = "Jos\xe9 Carlos"; CPPUNIT_ASSERT(strcmp(latin.toCString(true), "JosĂ© Carlos") == 0); String c; c = "1"; CPPUNIT_ASSERT(c == L"1"); c = L'\u4E00'; CPPUNIT_ASSERT(c == L"\u4E00"); String unicode2(unicode.to8Bit(true), String::UTF8); CPPUNIT_ASSERT(unicode == unicode2); String unicode3(L"\u65E5\u672C\u8A9E"); CPPUNIT_ASSERT(*(unicode3.toCWString() + 1) == L'\u672C'); String unicode4(L"\u65e5\u672c\u8a9e", String::UTF16BE); CPPUNIT_ASSERT(unicode4[1] == L'\u672c'); String unicode5(L"\u65e5\u672c\u8a9e", String::UTF16LE); CPPUNIT_ASSERT(unicode5[1] == L'\u2c67'); std::wstring stduni = L"\u65e5\u672c\u8a9e"; String unicode6(stduni, String::UTF16BE); CPPUNIT_ASSERT(unicode6[1] == L'\u672c'); String unicode7(stduni, String::UTF16LE); CPPUNIT_ASSERT(unicode7[1] == L'\u2c67'); CPPUNIT_ASSERT(String(" foo ").stripWhiteSpace() == String("foo")); CPPUNIT_ASSERT(String("foo ").stripWhiteSpace() == String("foo")); CPPUNIT_ASSERT(String(" foo").stripWhiteSpace() == String("foo")); CPPUNIT_ASSERT(String("foo").stripWhiteSpace() == String("foo")); CPPUNIT_ASSERT(String("f o o").stripWhiteSpace() == String("f o o")); CPPUNIT_ASSERT(String(" f o o ").stripWhiteSpace() == String("f o o")); CPPUNIT_ASSERT(memcmp(String("foo").data(String::Latin1).data(), "foo", 3) == 0); CPPUNIT_ASSERT(memcmp(String("f").data(String::Latin1).data(), "f", 1) == 0); } void testUTF16Encode() { String a("foo"); ByteVector b("\0f\0o\0o", 6); ByteVector c("f\0o\0o\0", 6); ByteVector d("\377\376f\0o\0o\0", 8); CPPUNIT_ASSERT(a.data(String::UTF16BE) != a.data(String::UTF16LE)); CPPUNIT_ASSERT(b == a.data(String::UTF16BE)); CPPUNIT_ASSERT(c == a.data(String::UTF16LE)); CPPUNIT_ASSERT_EQUAL(d, a.data(String::UTF16)); } void testUTF16Decode() { String a("foo"); ByteVector b("\0f\0o\0o", 6); ByteVector c("f\0o\0o\0", 6); ByteVector d("\377\376f\0o\0o\0", 8); CPPUNIT_ASSERT_EQUAL(a, String(b, String::UTF16BE)); CPPUNIT_ASSERT_EQUAL(a, String(c, String::UTF16LE)); CPPUNIT_ASSERT_EQUAL(a, String(d, String::UTF16)); } // this test is expected to print "TagLib: String::prepare() - // Invalid UTF16 string." on the console 3 times void testUTF16DecodeInvalidBOM() { ByteVector b(" ", 1); ByteVector c(" ", 2); ByteVector d(" \0f\0o\0o", 8); CPPUNIT_ASSERT_EQUAL(String(), String(b, String::UTF16)); CPPUNIT_ASSERT_EQUAL(String(), String(c, String::UTF16)); CPPUNIT_ASSERT_EQUAL(String(), String(d, String::UTF16)); } void testUTF16DecodeEmptyWithBOM() { ByteVector a("\377\376", 2); ByteVector b("\376\377", 2); CPPUNIT_ASSERT_EQUAL(String(), String(a, String::UTF16)); CPPUNIT_ASSERT_EQUAL(String(), String(b, String::UTF16)); } void testSurrogatePair() { // Make sure that a surrogate pair is converted into single UTF-8 char // and vice versa. const ByteVector v1("\xff\xfe\x42\xd8\xb7\xdf\xce\x91\x4b\x5c"); const ByteVector v2("\xf0\xa0\xae\xb7\xe9\x87\x8e\xe5\xb1\x8b"); const String s1(v1, String::UTF16); CPPUNIT_ASSERT_EQUAL(s1.data(String::UTF8), v2); const String s2(v2, String::UTF8); CPPUNIT_ASSERT_EQUAL(s2.data(String::UTF16), v1); const ByteVector v3("\xfe\xff\xd8\x01\x30\x42"); CPPUNIT_ASSERT(String(v3, String::UTF16).data(String::UTF8).isEmpty()); const ByteVector v4("\xfe\xff\x30\x42\xdc\x01"); CPPUNIT_ASSERT(String(v4, String::UTF16).data(String::UTF8).isEmpty()); const ByteVector v5("\xfe\xff\xdc\x01\xd8\x01"); CPPUNIT_ASSERT(String(v5, String::UTF16).data(String::UTF8).isEmpty()); } void testAppendStringDetach() { String a("a"); String b = a; a += "b"; CPPUNIT_ASSERT_EQUAL(String("ab"), a); CPPUNIT_ASSERT_EQUAL(String("a"), b); } void testAppendCharDetach() { String a("a"); String b = a; a += 'b'; CPPUNIT_ASSERT_EQUAL(String("ab"), a); CPPUNIT_ASSERT_EQUAL(String("a"), b); } void testRfind() { CPPUNIT_ASSERT_EQUAL(-1, String("foo.bar").rfind(".", 0)); CPPUNIT_ASSERT_EQUAL(-1, String("foo.bar").rfind(".", 1)); CPPUNIT_ASSERT_EQUAL(-1, String("foo.bar").rfind(".", 2)); CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 3)); CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 4)); CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 5)); CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 6)); CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".", 7)); CPPUNIT_ASSERT_EQUAL(3, String("foo.bar").rfind(".")); } void testToInt() { bool ok; CPPUNIT_ASSERT_EQUAL(String("123").toInt(&ok), 123); CPPUNIT_ASSERT_EQUAL(ok, true); CPPUNIT_ASSERT_EQUAL(String("-123").toInt(&ok), -123); CPPUNIT_ASSERT_EQUAL(ok, true); CPPUNIT_ASSERT_EQUAL(String("abc").toInt(&ok), 0); CPPUNIT_ASSERT_EQUAL(ok, false); CPPUNIT_ASSERT_EQUAL(String("1x").toInt(&ok), 1); CPPUNIT_ASSERT_EQUAL(ok, false); CPPUNIT_ASSERT_EQUAL(String("").toInt(&ok), 0); CPPUNIT_ASSERT_EQUAL(ok, false); CPPUNIT_ASSERT_EQUAL(String("-").toInt(&ok), 0); CPPUNIT_ASSERT_EQUAL(ok, false); CPPUNIT_ASSERT_EQUAL(String("123").toInt(), 123); CPPUNIT_ASSERT_EQUAL(String("-123").toInt(), -123); CPPUNIT_ASSERT_EQUAL(String("123aa").toInt(), 123); CPPUNIT_ASSERT_EQUAL(String("-123aa").toInt(), -123); CPPUNIT_ASSERT_EQUAL(String("0000").toInt(), 0); CPPUNIT_ASSERT_EQUAL(String("0001").toInt(), 1); String("2147483648").toInt(&ok); CPPUNIT_ASSERT_EQUAL(ok, false); String("-2147483649").toInt(&ok); CPPUNIT_ASSERT_EQUAL(ok, false); } void testFromInt() { CPPUNIT_ASSERT_EQUAL(String::number(0), String("0")); CPPUNIT_ASSERT_EQUAL(String::number(12345678), String("12345678")); CPPUNIT_ASSERT_EQUAL(String::number(-12345678), String("-12345678")); } void testSubstr() { CPPUNIT_ASSERT_EQUAL(String("01"), String("0123456").substr(0, 2)); CPPUNIT_ASSERT_EQUAL(String("12"), String("0123456").substr(1, 2)); CPPUNIT_ASSERT_EQUAL(String("123456"), String("0123456").substr(1, 200)); CPPUNIT_ASSERT_EQUAL(String("0123456"), String("0123456").substr(0, 7)); CPPUNIT_ASSERT_EQUAL(String("0123456"), String("0123456").substr(0, 200)); } void testNewline() { ByteVector cr("abc\x0dxyz", 7); ByteVector lf("abc\x0axyz", 7); ByteVector crlf("abc\x0d\x0axyz", 8); CPPUNIT_ASSERT_EQUAL((unsigned int)7, String(cr).size()); CPPUNIT_ASSERT_EQUAL((unsigned int)7, String(lf).size()); CPPUNIT_ASSERT_EQUAL((unsigned int)8, String(crlf).size()); CPPUNIT_ASSERT_EQUAL(L'\x0d', String(cr)[3]); CPPUNIT_ASSERT_EQUAL(L'\x0a', String(lf)[3]); CPPUNIT_ASSERT_EQUAL(L'\x0d', String(crlf)[3]); CPPUNIT_ASSERT_EQUAL(L'\x0a', String(crlf)[4]); } void testUpper() { String s1 = "tagLIB 012 strING"; String s2 = s1.upper(); CPPUNIT_ASSERT_EQUAL(String("tagLIB 012 strING"), s1); CPPUNIT_ASSERT_EQUAL(String("TAGLIB 012 STRING"), s2); } void testEncodeNonLatin1() { const String jpn(L"\u65E5\u672C\u8A9E"); CPPUNIT_ASSERT_EQUAL(ByteVector("\xE5\x2C\x9E"), jpn.data(String::Latin1)); CPPUNIT_ASSERT_EQUAL(ByteVector("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E"), jpn.data(String::UTF8)); CPPUNIT_ASSERT_EQUAL(ByteVector("\xFF\xFE\xE5\x65\x2C\x67\x9E\x8A"), jpn.data(String::UTF16)); CPPUNIT_ASSERT_EQUAL(ByteVector("\xE5\x65\x2C\x67\x9E\x8A"), jpn.data(String::UTF16LE)); CPPUNIT_ASSERT_EQUAL(ByteVector("\x65\xE5\x67\x2C\x8A\x9E"), jpn.data(String::UTF16BE)); CPPUNIT_ASSERT_EQUAL(std::string("\xE5\x2C\x9E"), jpn.to8Bit(false)); CPPUNIT_ASSERT_EQUAL(std::string("\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E"), jpn.to8Bit(true)); } void testEncodeEmpty() { const String empty; CPPUNIT_ASSERT(empty.data(String::Latin1).isEmpty()); CPPUNIT_ASSERT(empty.data(String::UTF8).isEmpty()); CPPUNIT_ASSERT_EQUAL(ByteVector("\xFF\xFE"), empty.data(String::UTF16)); CPPUNIT_ASSERT(empty.data(String::UTF16LE).isEmpty()); CPPUNIT_ASSERT(empty.data(String::UTF16BE).isEmpty()); CPPUNIT_ASSERT(empty.to8Bit(false).empty()); CPPUNIT_ASSERT(empty.to8Bit(true).empty()); } void testEncodeNonBMP() { const ByteVector a("\xFF\xFE\x3C\xD8\x50\xDD\x40\xD8\xF5\xDC\x3C\xD8\x00\xDE", 14); const ByteVector b("\xF0\x9F\x85\x90\xF0\xA0\x83\xB5\xF0\x9F\x88\x80"); CPPUNIT_ASSERT_EQUAL(b, String(a, String::UTF16).data(String::UTF8)); } void testIterator() { String s1 = "taglib string"; String s2 = s1; String::Iterator it1 = s1.begin(); String::Iterator it2 = s2.begin(); CPPUNIT_ASSERT_EQUAL(L't', *it1); CPPUNIT_ASSERT_EQUAL(L't', *it2); std::advance(it1, 4); std::advance(it2, 4); *it2 = L'I'; CPPUNIT_ASSERT_EQUAL(L'i', *it1); CPPUNIT_ASSERT_EQUAL(L'I', *it2); } void testInvalidUTF8() { CPPUNIT_ASSERT_EQUAL(String("/"), String(ByteVector("\x2F"), String::UTF8)); CPPUNIT_ASSERT(String(ByteVector("\xC0\xAF"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xE0\x80\xAF"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xF0\x80\x80\xAF"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xF8\x80\x80\x80\x80"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xFC\x80\x80\x80\x80\x80"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xC2"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xE0\x80"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xF0\x80\x80"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xF8\x80\x80\x80"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xFC\x80\x80\x80\x80"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String('\x80', String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xED\xA0\x80\xED\xB0\x80"), String::UTF8).isEmpty()); CPPUNIT_ASSERT(String(ByteVector("\xED\xB0\x80\xED\xA0\x80"), String::UTF8).isEmpty()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestString); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_synchdata.cpp��������������������������������������������������������������0000664�0000000�0000000�00000010341�14447736377�0017747�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <id3v2synchdata.h> #include <cppunit/extensions/HelperMacros.h> using namespace std; using namespace TagLib; class TestID3v2SynchData : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestID3v2SynchData); CPPUNIT_TEST(test1); CPPUNIT_TEST(test2); CPPUNIT_TEST(test3); CPPUNIT_TEST(testToUIntBroken); CPPUNIT_TEST(testToUIntBrokenAndTooLarge); CPPUNIT_TEST(testDecode1); CPPUNIT_TEST(testDecode2); CPPUNIT_TEST(testDecode3); CPPUNIT_TEST(testDecode4); CPPUNIT_TEST_SUITE_END(); public: void test1() { char data[] = { 0, 0, 0, 127 }; ByteVector v(data, 4); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::toUInt(v), (unsigned int)127); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::fromUInt(127), v); } void test2() { char data[] = { 0, 0, 1, 0 }; ByteVector v(data, 4); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::toUInt(v), (unsigned int)128); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::fromUInt(128), v); } void test3() { char data[] = { 0, 0, 1, 1 }; ByteVector v(data, 4); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::toUInt(v), (unsigned int)129); CPPUNIT_ASSERT_EQUAL(ID3v2::SynchData::fromUInt(129), v); } void testToUIntBroken() { char data[] = { 0, 0, 0, (char)-1 }; char data2[] = { 0, 0, (char)-1, (char)-1 }; CPPUNIT_ASSERT_EQUAL((unsigned int)255, ID3v2::SynchData::toUInt(ByteVector(data, 4))); CPPUNIT_ASSERT_EQUAL((unsigned int)65535, ID3v2::SynchData::toUInt(ByteVector(data2, 4))); } void testToUIntBrokenAndTooLarge() { char data[] = { 0, 0, 0, (char)-1, 0 }; ByteVector v(data, 5); CPPUNIT_ASSERT_EQUAL((unsigned int)255, ID3v2::SynchData::toUInt(v)); } void testDecode1() { ByteVector a("\xff\x00\x00", 3); a = ID3v2::SynchData::decode(a); CPPUNIT_ASSERT_EQUAL((unsigned int)2, a.size()); CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\x00", 2), a); } void testDecode2() { ByteVector a("\xff\x44", 2); a = ID3v2::SynchData::decode(a); CPPUNIT_ASSERT_EQUAL((unsigned int)2, a.size()); CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\x44", 2), a); } void testDecode3() { ByteVector a("\xff\xff\x00", 3); a = ID3v2::SynchData::decode(a); CPPUNIT_ASSERT_EQUAL((unsigned int)2, a.size()); CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\xff", 2), a); } void testDecode4() { ByteVector a("\xff\xff\xff", 3); a = ID3v2::SynchData::decode(a); CPPUNIT_ASSERT_EQUAL((unsigned int)3, a.size()); CPPUNIT_ASSERT_EQUAL(ByteVector("\xff\xff\xff", 3), a); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v2SynchData); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_trueaudio.cpp��������������������������������������������������������������0000664�0000000�0000000�00000012230�14447736377�0017771�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <id3v1tag.h> #include <id3v2tag.h> #include <tpropertymap.h> #include <trueaudiofile.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestTrueAudio : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestTrueAudio); CPPUNIT_TEST(testReadPropertiesWithoutID3v2); CPPUNIT_TEST(testReadPropertiesWithTags); CPPUNIT_TEST(testStripAndProperties); CPPUNIT_TEST(testRepeatedSave); CPPUNIT_TEST_SUITE_END(); public: void testReadPropertiesWithoutID3v2() { TrueAudio::File f(TEST_FILE_PATH_C("empty.tta")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(173, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(162496U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->ttaVersion()); } void testReadPropertiesWithTags() { TrueAudio::File f(TEST_FILE_PATH_C("tagged.tta")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3685, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(173, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(162496U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->ttaVersion()); } void testStripAndProperties() { ScopedFileCopy copy("empty", ".tta"); { TrueAudio::File f(copy.fileName().c_str()); f.ID3v2Tag(true)->setTitle("ID3v2"); f.ID3v1Tag(true)->setTitle("ID3v1"); f.save(); } { TrueAudio::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasID3v1Tag()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String("ID3v2"), f.properties()["TITLE"].front()); f.strip(TrueAudio::File::ID3v2); CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); f.strip(TrueAudio::File::ID3v1); CPPUNIT_ASSERT(f.properties().isEmpty()); f.save(); } { TrueAudio::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); CPPUNIT_ASSERT(f.properties()["TITLE"].isEmpty()); CPPUNIT_ASSERT(f.properties().isEmpty()); } } void testRepeatedSave() { ScopedFileCopy copy("empty", ".tta"); { TrueAudio::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); f.ID3v2Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.save(); f.ID3v2Tag()->setTitle("0"); f.save(); f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.ID3v2Tag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); f.save(); } { TrueAudio::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT(f.hasID3v1Tag()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestTrueAudio); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_wav.cpp��������������������������������������������������������������������0000664�0000000�0000000�00000033162�14447736377�0016574�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2010 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <id3v2tag.h> #include <infotag.h> #include <tbytevectorlist.h> #include <tbytevectorstream.h> #include <tfilestream.h> #include <tpropertymap.h> #include <wavfile.h> #include <cppunit/extensions/HelperMacros.h> #include "plainfile.h" #include "utils.h" using namespace std; using namespace TagLib; class TestWAV : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestWAV); CPPUNIT_TEST(testPCMProperties); CPPUNIT_TEST(testALAWProperties); CPPUNIT_TEST(testFloatProperties); CPPUNIT_TEST(testFloatWithoutFactChunkProperties); CPPUNIT_TEST(testZeroSizeDataChunk); CPPUNIT_TEST(testID3v2Tag); CPPUNIT_TEST(testSaveID3v23); CPPUNIT_TEST(testInfoTag); CPPUNIT_TEST(testStripTags); CPPUNIT_TEST(testDuplicateTags); CPPUNIT_TEST(testFuzzedFile1); CPPUNIT_TEST(testFuzzedFile2); CPPUNIT_TEST(testFileWithGarbageAppended); CPPUNIT_TEST(testStripAndProperties); CPPUNIT_TEST(testPCMWithFactChunk); CPPUNIT_TEST(testWaveFormatExtensible); CPPUNIT_TEST_SUITE_END(); public: void testPCMProperties() { RIFF::WAV::File f(TEST_FILE_PATH_C("empty.wav")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3675, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(32, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(1000, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(3675U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->format()); } void testALAWProperties() { RIFF::WAV::File f(TEST_FILE_PATH_C("alaw.wav")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(128, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(8000, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(8, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(28400U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(6, f.audioProperties()->format()); } void testFloatProperties() { RIFF::WAV::File f(TEST_FILE_PATH_C("float64.wav")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(97, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(5645, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(4281U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->format()); } void testFloatWithoutFactChunkProperties() { ByteVector wavData = PlainFile(TEST_FILE_PATH_C("float64.wav")).readAll(); CPPUNIT_ASSERT_EQUAL(ByteVector("fact"), wavData.mid(36, 4)); // Remove the fact chunk by renaming it to fakt wavData[38] = 'k'; ByteVectorStream wavStream(wavData); RIFF::WAV::File f(&wavStream); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(97, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(5645, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(64, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(4281U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->format()); } void testZeroSizeDataChunk() { RIFF::WAV::File f(TEST_FILE_PATH_C("zero-size-chunk.wav")); CPPUNIT_ASSERT(f.isValid()); } void testID3v2Tag() { ScopedFileCopy copy("empty", ".wav"); string filename = copy.fileName(); { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); f.ID3v2Tag()->setTitle(L"Title"); f.ID3v2Tag()->setArtist(L"Artist"); f.save(); CPPUNIT_ASSERT(f.hasID3v2Tag()); } { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String(L"Title"), f.ID3v2Tag()->title()); CPPUNIT_ASSERT_EQUAL(String(L"Artist"), f.ID3v2Tag()->artist()); f.ID3v2Tag()->setTitle(L""); f.ID3v2Tag()->setArtist(L""); f.save(); CPPUNIT_ASSERT(!f.hasID3v2Tag()); } { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String(L""), f.ID3v2Tag()->title()); CPPUNIT_ASSERT_EQUAL(String(L""), f.ID3v2Tag()->artist()); } } void testSaveID3v23() { ScopedFileCopy copy("empty", ".wav"); string newname = copy.fileName(); String xxx = ByteVector(254, 'X'); { RIFF::WAV::File f(newname.c_str()); CPPUNIT_ASSERT_EQUAL(false, f.hasID3v2Tag()); f.tag()->setTitle(xxx); f.tag()->setArtist("Artist A"); f.save(RIFF::WAV::File::AllTags, File::StripOthers, ID3v2::v3); CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag()); } { RIFF::WAV::File f2(newname.c_str()); CPPUNIT_ASSERT_EQUAL((unsigned int)3, f2.ID3v2Tag()->header()->majorVersion()); CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); } } void testInfoTag() { ScopedFileCopy copy("empty", ".wav"); string filename = copy.fileName(); { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(!f.hasInfoTag()); f.InfoTag()->setTitle(L"Title"); f.InfoTag()->setArtist(L"Artist"); f.save(); CPPUNIT_ASSERT(f.hasInfoTag()); } { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(f.hasInfoTag()); CPPUNIT_ASSERT_EQUAL(String(L"Title"), f.InfoTag()->title()); CPPUNIT_ASSERT_EQUAL(String(L"Artist"), f.InfoTag()->artist()); f.InfoTag()->setTitle(L""); f.InfoTag()->setArtist(L""); f.save(); CPPUNIT_ASSERT(!f.hasInfoTag()); } { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(f.isValid()); CPPUNIT_ASSERT(!f.hasInfoTag()); CPPUNIT_ASSERT_EQUAL(String(L""), f.InfoTag()->title()); CPPUNIT_ASSERT_EQUAL(String(L""), f.InfoTag()->artist()); } } void testStripTags() { ScopedFileCopy copy("empty", ".wav"); string filename = copy.fileName(); { RIFF::WAV::File f(filename.c_str()); f.ID3v2Tag()->setTitle("test title"); f.InfoTag()->setTitle("test title"); f.save(); } { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT(f.hasInfoTag()); f.save(RIFF::WAV::File::ID3v2, File::StripOthers); } { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT(!f.hasInfoTag()); f.ID3v2Tag()->setTitle("test title"); f.InfoTag()->setTitle("test title"); f.save(); } { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT(f.hasInfoTag()); f.save(RIFF::WAV::File::Info, File::StripOthers); } { RIFF::WAV::File f(filename.c_str()); CPPUNIT_ASSERT(!f.hasID3v2Tag()); CPPUNIT_ASSERT(f.hasInfoTag()); } } void testDuplicateTags() { ScopedFileCopy copy("duplicate_tags", ".wav"); RIFF::WAV::File f(copy.fileName().c_str()); CPPUNIT_ASSERT_EQUAL(17052L, f.length()); // duplicate_tags.wav has duplicate ID3v2/INFO tags. // title() returns "Title2" if can't skip the second tag. CPPUNIT_ASSERT(f.hasID3v2Tag()); CPPUNIT_ASSERT_EQUAL(String("Title1"), f.ID3v2Tag()->title()); CPPUNIT_ASSERT(f.hasInfoTag()); CPPUNIT_ASSERT_EQUAL(String("Title1"), f.InfoTag()->title()); f.save(); CPPUNIT_ASSERT_EQUAL(15898L, f.length()); CPPUNIT_ASSERT_EQUAL(-1L, f.find("Title2")); } void testFuzzedFile1() { RIFF::WAV::File f1(TEST_FILE_PATH_C("infloop.wav")); CPPUNIT_ASSERT(f1.isValid()); // The file has problems: // Chunk 'ISTt' has invalid size (larger than the file size). // Its properties can nevertheless be read. RIFF::WAV::Properties* properties = f1.audioProperties(); CPPUNIT_ASSERT_EQUAL(1, properties->channels()); CPPUNIT_ASSERT_EQUAL(88, properties->bitrate()); CPPUNIT_ASSERT_EQUAL(8, properties->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(11025, properties->sampleRate()); CPPUNIT_ASSERT(!f1.hasInfoTag()); CPPUNIT_ASSERT(!f1.hasID3v2Tag()); } void testFuzzedFile2() { RIFF::WAV::File f2(TEST_FILE_PATH_C("segfault.wav")); CPPUNIT_ASSERT(f2.isValid()); } void testFileWithGarbageAppended() { ScopedFileCopy copy("empty", ".wav"); ByteVector contentsBeforeModification; { FileStream stream(copy.fileName().c_str()); stream.seek(0, IOStream::End); const char garbage[] = "12345678"; stream.writeBlock(ByteVector(garbage, sizeof(garbage) - 1)); stream.seek(0); contentsBeforeModification = stream.readBlock(stream.length()); } { RIFF::WAV::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.isValid()); f.ID3v2Tag()->setTitle("ID3v2 Title"); f.InfoTag()->setTitle("INFO Title"); CPPUNIT_ASSERT(f.save()); } { RIFF::WAV::File f(copy.fileName().c_str()); f.strip(); } { FileStream stream(copy.fileName().c_str()); ByteVector contentsAfterModification = stream.readBlock(stream.length()); CPPUNIT_ASSERT_EQUAL(contentsBeforeModification, contentsAfterModification); } } void testStripAndProperties() { ScopedFileCopy copy("empty", ".wav"); { RIFF::WAV::File f(copy.fileName().c_str()); f.ID3v2Tag()->setTitle("ID3v2"); f.InfoTag()->setTitle("INFO"); f.save(); } { RIFF::WAV::File f(copy.fileName().c_str()); CPPUNIT_ASSERT_EQUAL(String("ID3v2"), f.properties()["TITLE"].front()); f.strip(RIFF::WAV::File::ID3v2); CPPUNIT_ASSERT_EQUAL(String("INFO"), f.properties()["TITLE"].front()); f.strip(RIFF::WAV::File::Info); CPPUNIT_ASSERT(f.properties().isEmpty()); } } void testPCMWithFactChunk() { RIFF::WAV::File f(TEST_FILE_PATH_C("pcm_with_fact_chunk.wav")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3675, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(32, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(1000, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(3675U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->format()); } void testWaveFormatExtensible() { RIFF::WAV::File f(TEST_FILE_PATH_C("uint8we.wav")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(2937, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(128, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(8000, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(8, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(23493U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->format()); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestWAV); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_wavpack.cpp����������������������������������������������������������������0000664�0000000�0000000�00000016615�14447736377�0017437�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2010 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <apetag.h> #include <id3v1tag.h> #include <tbytevectorlist.h> #include <tpropertymap.h> #include <wavpackfile.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestWavPack : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestWavPack); CPPUNIT_TEST(testNoLengthProperties); CPPUNIT_TEST(testMultiChannelProperties); CPPUNIT_TEST(testDsdStereoProperties); CPPUNIT_TEST(testNonStandardRateProperties); CPPUNIT_TEST(testTaggedProperties); CPPUNIT_TEST(testFuzzedFile); CPPUNIT_TEST(testStripAndProperties); CPPUNIT_TEST(testRepeatedSave); CPPUNIT_TEST_SUITE_END(); public: void testNoLengthProperties() { WavPack::File f(TEST_FILE_PATH_C("no_length.wv")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3705, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(true, f.audioProperties()->isLossless()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(163392U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1031, f.audioProperties()->version()); } void testMultiChannelProperties() { WavPack::File f(TEST_FILE_PATH_C("four_channels.wv")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3833, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(112, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(4, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isLossless()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(169031U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1031, f.audioProperties()->version()); } void testDsdStereoProperties() { WavPack::File f(TEST_FILE_PATH_C("dsd_stereo.wv")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(200, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(2096, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(8, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(true, f.audioProperties()->isLossless()); CPPUNIT_ASSERT_EQUAL(352800, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(70560U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1040, f.audioProperties()->version()); } void testNonStandardRateProperties() { WavPack::File f(TEST_FILE_PATH_C("non_standard_rate.wv")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3675, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(0, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(true, f.audioProperties()->isLossless()); CPPUNIT_ASSERT_EQUAL(1000, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(3675U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1040, f.audioProperties()->version()); } void testTaggedProperties() { WavPack::File f(TEST_FILE_PATH_C("tagged.wv")); CPPUNIT_ASSERT(f.audioProperties()); CPPUNIT_ASSERT_EQUAL(3, f.audioProperties()->lengthInSeconds()); CPPUNIT_ASSERT_EQUAL(3550, f.audioProperties()->lengthInMilliseconds()); CPPUNIT_ASSERT_EQUAL(172, f.audioProperties()->bitrate()); CPPUNIT_ASSERT_EQUAL(2, f.audioProperties()->channels()); CPPUNIT_ASSERT_EQUAL(16, f.audioProperties()->bitsPerSample()); CPPUNIT_ASSERT_EQUAL(false, f.audioProperties()->isLossless()); CPPUNIT_ASSERT_EQUAL(44100, f.audioProperties()->sampleRate()); CPPUNIT_ASSERT_EQUAL(156556U, f.audioProperties()->sampleFrames()); CPPUNIT_ASSERT_EQUAL(1031, f.audioProperties()->version()); } void testFuzzedFile() { WavPack::File f(TEST_FILE_PATH_C("infloop.wv")); CPPUNIT_ASSERT(f.isValid()); } void testStripAndProperties() { ScopedFileCopy copy("click", ".wv"); { WavPack::File f(copy.fileName().c_str()); f.APETag(true)->setTitle("APE"); f.ID3v1Tag(true)->setTitle("ID3v1"); f.save(); } { WavPack::File f(copy.fileName().c_str()); CPPUNIT_ASSERT_EQUAL(String("APE"), f.properties()["TITLE"].front()); f.strip(WavPack::File::APE); CPPUNIT_ASSERT_EQUAL(String("ID3v1"), f.properties()["TITLE"].front()); f.strip(WavPack::File::ID3v1); CPPUNIT_ASSERT(f.properties().isEmpty()); } } void testRepeatedSave() { ScopedFileCopy copy("click", ".wv"); { WavPack::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(!f.hasAPETag()); CPPUNIT_ASSERT(!f.hasID3v1Tag()); f.APETag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.save(); f.APETag()->setTitle("0"); f.save(); f.ID3v1Tag(true)->setTitle("01234 56789 ABCDE FGHIJ"); f.APETag()->setTitle("01234 56789 ABCDE FGHIJ 01234 56789 ABCDE FGHIJ 01234 56789"); f.save(); } { WavPack::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.hasAPETag()); CPPUNIT_ASSERT(f.hasID3v1Tag()); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestWavPack); �������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_xiphcomment.cpp������������������������������������������������������������0000664�0000000�0000000�00000017014�14447736377�0020330�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2009 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <string> #include <stdio.h> #include <xiphcomment.h> #include <vorbisfile.h> #include <tpropertymap.h> #include <tdebug.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; class TestXiphComment : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestXiphComment); CPPUNIT_TEST(testYear); CPPUNIT_TEST(testSetYear); CPPUNIT_TEST(testTrack); CPPUNIT_TEST(testSetTrack); CPPUNIT_TEST(testInvalidKeys1); CPPUNIT_TEST(testInvalidKeys2); CPPUNIT_TEST(testClearComment); CPPUNIT_TEST(testRemoveFields); CPPUNIT_TEST(testPicture); CPPUNIT_TEST(testLowercaseFields); CPPUNIT_TEST_SUITE_END(); public: void testYear() { Ogg::XiphComment cmt; CPPUNIT_ASSERT_EQUAL((unsigned int)0, cmt.year()); cmt.addField("YEAR", "2009"); CPPUNIT_ASSERT_EQUAL((unsigned int)2009, cmt.year()); cmt.addField("DATE", "2008"); CPPUNIT_ASSERT_EQUAL((unsigned int)2008, cmt.year()); } void testSetYear() { Ogg::XiphComment cmt; cmt.addField("YEAR", "2009"); cmt.addField("DATE", "2008"); cmt.setYear(1995); CPPUNIT_ASSERT(cmt.fieldListMap()["YEAR"].isEmpty()); CPPUNIT_ASSERT_EQUAL(String("1995"), cmt.fieldListMap()["DATE"].front()); } void testTrack() { Ogg::XiphComment cmt; CPPUNIT_ASSERT_EQUAL((unsigned int)0, cmt.track()); cmt.addField("TRACKNUM", "7"); CPPUNIT_ASSERT_EQUAL((unsigned int)7, cmt.track()); cmt.addField("TRACKNUMBER", "8"); CPPUNIT_ASSERT_EQUAL((unsigned int)8, cmt.track()); } void testSetTrack() { Ogg::XiphComment cmt; cmt.addField("TRACKNUM", "7"); cmt.addField("TRACKNUMBER", "8"); cmt.setTrack(3); CPPUNIT_ASSERT(cmt.fieldListMap()["TRACKNUM"].isEmpty()); CPPUNIT_ASSERT_EQUAL(String("3"), cmt.fieldListMap()["TRACKNUMBER"].front()); } void testInvalidKeys1() { PropertyMap map; map[""] = String("invalid key: empty string"); map["A=B"] = String("invalid key: contains '='"); map["A~B"] = String("invalid key: contains '~'"); map["A\x7F" "B"] = String("invalid key: contains '\x7F'"); map[L"A\x3456" "B"] = String("invalid key: Unicode"); Ogg::XiphComment cmt; PropertyMap unsuccessful = cmt.setProperties(map); CPPUNIT_ASSERT_EQUAL((unsigned int)5, unsuccessful.size()); CPPUNIT_ASSERT(cmt.properties().isEmpty()); } void testInvalidKeys2() { Ogg::XiphComment cmt; cmt.addField("", "invalid key: empty string"); cmt.addField("A=B", "invalid key: contains '='"); cmt.addField("A~B", "invalid key: contains '~'"); cmt.addField("A\x7F" "B", "invalid key: contains '\x7F'"); cmt.addField(L"A\x3456" "B", "invalid key: Unicode"); CPPUNIT_ASSERT_EQUAL(0U, cmt.fieldCount()); } void testClearComment() { ScopedFileCopy copy("empty", ".ogg"); { Ogg::Vorbis::File f(copy.fileName().c_str()); f.tag()->addField("COMMENT", "Comment1"); f.save(); } { Ogg::Vorbis::File f(copy.fileName().c_str()); f.tag()->setComment(""); CPPUNIT_ASSERT_EQUAL(String(""), f.tag()->comment()); } } void testRemoveFields() { Ogg::Vorbis::File f(TEST_FILE_PATH_C("empty.ogg")); f.tag()->addField("title", "Title1"); f.tag()->addField("Title", "Title1", false); f.tag()->addField("titlE", "Title2", false); f.tag()->addField("TITLE", "Title3", false); f.tag()->addField("artist", "Artist1"); f.tag()->addField("ARTIST", "Artist2", false); CPPUNIT_ASSERT_EQUAL(String("Title1 Title1 Title2 Title3"), f.tag()->title()); CPPUNIT_ASSERT_EQUAL(String("Artist1 Artist2"), f.tag()->artist()); f.tag()->removeFields("title", "Title1"); CPPUNIT_ASSERT_EQUAL(String("Title2 Title3"), f.tag()->title()); CPPUNIT_ASSERT_EQUAL(String("Artist1 Artist2"), f.tag()->artist()); f.tag()->removeFields("Artist"); CPPUNIT_ASSERT_EQUAL(String("Title2 Title3"), f.tag()->title()); CPPUNIT_ASSERT(f.tag()->artist().isEmpty()); f.tag()->removeAllFields(); CPPUNIT_ASSERT(f.tag()->title().isEmpty()); CPPUNIT_ASSERT(f.tag()->artist().isEmpty()); CPPUNIT_ASSERT_EQUAL(String("Xiph.Org libVorbis I 20050304"), f.tag()->vendorID()); } void testPicture() { ScopedFileCopy copy("empty", ".ogg"); string newname = copy.fileName(); { Vorbis::File f(newname.c_str()); FLAC::Picture *newpic = new FLAC::Picture(); newpic->setType(FLAC::Picture::BackCover); newpic->setWidth(5); newpic->setHeight(6); newpic->setColorDepth(16); newpic->setNumColors(7); newpic->setMimeType("image/jpeg"); newpic->setDescription("new image"); newpic->setData("JPEG data"); f.tag()->addPicture(newpic); f.save(); } { Vorbis::File f(newname.c_str()); List<FLAC::Picture *> lst = f.tag()->pictureList(); CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); CPPUNIT_ASSERT_EQUAL((int)5, lst[0]->width()); CPPUNIT_ASSERT_EQUAL((int)6, lst[0]->height()); CPPUNIT_ASSERT_EQUAL((int)16, lst[0]->colorDepth()); CPPUNIT_ASSERT_EQUAL((int)7, lst[0]->numColors()); CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), lst[0]->mimeType()); CPPUNIT_ASSERT_EQUAL(String("new image"), lst[0]->description()); CPPUNIT_ASSERT_EQUAL(ByteVector("JPEG data"), lst[0]->data()); } } void testLowercaseFields() { const ScopedFileCopy copy("lowercase-fields", ".ogg"); { Vorbis::File f(copy.fileName().c_str()); List<FLAC::Picture *> lst = f.tag()->pictureList(); CPPUNIT_ASSERT_EQUAL(String("TEST TITLE"), f.tag()->title()); CPPUNIT_ASSERT_EQUAL(String("TEST ARTIST"), f.tag()->artist()); CPPUNIT_ASSERT_EQUAL((unsigned int)1, lst.size()); f.save(); } { Vorbis::File f(copy.fileName().c_str()); CPPUNIT_ASSERT(f.find("METADATA_BLOCK_PICTURE") > 0); } } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestXiphComment); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/test_xm.cpp���������������������������������������������������������������������0000664�0000000�0000000�00000017462�14447736377�0016430�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2011 by Mathias Panzenböck email : grosser.meister.morti@gmx.net ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #include <xmfile.h> #include <cppunit/extensions/HelperMacros.h> #include "utils.h" using namespace std; using namespace TagLib; static const String titleBefore("title of song"); static const String titleAfter("changed title"); static const String trackerNameBefore("MilkyTracker "); static const String trackerNameAfter("TagLib"); static const String commentBefore( "Instrument names\n" "are abused as\n" "comments in\n" "module file formats.\n" "-+-+-+-+-+-+-+-+-+-+-+\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n" "Sample\n" "names\n" "are sometimes\n" "also abused as\n" "comments."); static const String newCommentShort( "Instrument names\n" "are abused as\n" "comments in\n" "module file formats.\n" "======================\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n" "Sample names\n" "are sometimes\n" "also abused as\n" "comments."); static const String newCommentLong( "Instrument names\n" "are abused as\n" "comments in\n" "module file formats.\n" "======================\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n" "Sample names\n" "are sometimes\n" "also abused as\n" "comments.\n" "\n\n\n\n\n\n\n" "TEST"); static const String commentAfter( "Instrument names\n" "are abused as\n" "comments in\n" "module file formats.\n" "======================\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" "\n\n\n" "Sample names\n" "are sometimes\n" "also abused as\n" "comments.\n"); class TestXM : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestXM); CPPUNIT_TEST(testReadTags); CPPUNIT_TEST(testReadStrippedTags); CPPUNIT_TEST(testWriteTagsShort); CPPUNIT_TEST(testWriteTagsLong); CPPUNIT_TEST_SUITE_END(); public: void testReadTags() { testRead(TEST_FILE_PATH_C("test.xm"), titleBefore, commentBefore, trackerNameBefore); } void testReadStrippedTags() { XM::File file(TEST_FILE_PATH_C("stripped.xm")); CPPUNIT_ASSERT(file.isValid()); XM::Properties *p = file.audioProperties(); Mod::Tag *t = file.tag(); CPPUNIT_ASSERT(0 != p); CPPUNIT_ASSERT(0 != t); CPPUNIT_ASSERT_EQUAL(0, p->length()); CPPUNIT_ASSERT_EQUAL(0, p->bitrate()); CPPUNIT_ASSERT_EQUAL(0, p->sampleRate()); CPPUNIT_ASSERT_EQUAL(8, p->channels()); CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->lengthInPatterns()); CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->version()); CPPUNIT_ASSERT_EQUAL((unsigned short) 0 , p->restartPosition()); CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->patternCount()); CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->instrumentCount()); CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->flags()); CPPUNIT_ASSERT_EQUAL((unsigned short) 6, p->tempo()); CPPUNIT_ASSERT_EQUAL((unsigned short)125, p->bpmSpeed()); CPPUNIT_ASSERT_EQUAL(titleBefore, t->title()); CPPUNIT_ASSERT_EQUAL(String(), t->artist()); CPPUNIT_ASSERT_EQUAL(String(), t->album()); CPPUNIT_ASSERT_EQUAL(String(), t->comment()); CPPUNIT_ASSERT_EQUAL(String(), t->genre()); CPPUNIT_ASSERT_EQUAL(0U, t->year()); CPPUNIT_ASSERT_EQUAL(0U, t->track()); CPPUNIT_ASSERT_EQUAL(String(), t->trackerName()); } void testWriteTagsShort() { testWriteTags(newCommentShort); } void testWriteTagsLong() { testWriteTags(newCommentLong); } private: void testRead(FileName fileName, const String &title, const String &comment, const String &trackerName) { XM::File file(fileName); CPPUNIT_ASSERT(file.isValid()); XM::Properties *p = file.audioProperties(); Mod::Tag *t = file.tag(); CPPUNIT_ASSERT(0 != p); CPPUNIT_ASSERT(0 != t); CPPUNIT_ASSERT_EQUAL(0, p->length()); CPPUNIT_ASSERT_EQUAL(0, p->bitrate()); CPPUNIT_ASSERT_EQUAL(0, p->sampleRate()); CPPUNIT_ASSERT_EQUAL(8, p->channels()); CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->lengthInPatterns()); CPPUNIT_ASSERT_EQUAL((unsigned short)260, p->version()); CPPUNIT_ASSERT_EQUAL((unsigned short) 0, p->restartPosition()); CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->patternCount()); CPPUNIT_ASSERT_EQUAL((unsigned short)128, p->instrumentCount()); CPPUNIT_ASSERT_EQUAL((unsigned short) 1, p->flags()); CPPUNIT_ASSERT_EQUAL((unsigned short) 6, p->tempo()); CPPUNIT_ASSERT_EQUAL((unsigned short)125, p->bpmSpeed()); CPPUNIT_ASSERT_EQUAL(title, t->title()); CPPUNIT_ASSERT_EQUAL(String(), t->artist()); CPPUNIT_ASSERT_EQUAL(String(), t->album()); CPPUNIT_ASSERT_EQUAL(comment, t->comment()); CPPUNIT_ASSERT_EQUAL(String(), t->genre()); CPPUNIT_ASSERT_EQUAL(0U, t->year()); CPPUNIT_ASSERT_EQUAL(0U, t->track()); CPPUNIT_ASSERT_EQUAL(trackerName, t->trackerName()); } void testWriteTags(const String &comment) { ScopedFileCopy copy("test", ".xm"); { XM::File file(copy.fileName().c_str()); CPPUNIT_ASSERT(file.tag() != 0); file.tag()->setTitle(titleAfter); file.tag()->setComment(comment); file.tag()->setTrackerName(trackerNameAfter); CPPUNIT_ASSERT(file.save()); } testRead(copy.fileName().c_str(), titleAfter, commentAfter, trackerNameAfter); CPPUNIT_ASSERT(fileEqual( copy.fileName(), TEST_FILE_PATH_C("changed.xm"))); } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestXM); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������taglib-1.13.1/tests/utils.h�������������������������������������������������������������������������0000664�0000000�0000000�00000010320�14447736377�0015534�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*************************************************************************** copyright : (C) 2007 by Lukas Lalinsky email : lukas@oxygene.sk ***************************************************************************/ /*************************************************************************** * This library is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License version * * 2.1 as published by the Free Software Foundation. * * * * This library 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 * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * * http://www.mozilla.org/MPL/ * ***************************************************************************/ #ifdef HAVE_CONFIG_H #include <config.h> #endif #ifdef _WIN32 #include <windows.h> #else #include <unistd.h> #include <fcntl.h> #include <sys/fcntl.h> #include <sys/stat.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <fstream> using namespace std; inline string testFilePath(const string &filename) { return string(TESTS_DIR "data/") + filename; } #define TEST_FILE_PATH_C(f) testFilePath(f).c_str() inline string copyFile(const string &filename, const string &ext) { char testFileName[1024]; #ifdef _WIN32 char tempDir[MAX_PATH + 1]; GetTempPathA(sizeof(tempDir), tempDir); wsprintfA(testFileName, "%s\\taglib-test%s", tempDir, ext.c_str()); #else snprintf(testFileName, sizeof(testFileName), "/%s/taglib-test%s", P_tmpdir, ext.c_str()); #endif string sourceFileName = testFilePath(filename) + ext; ifstream source(sourceFileName.c_str(), std::ios::binary); ofstream destination(testFileName, std::ios::binary); destination << source.rdbuf(); return string(testFileName); } inline void deleteFile(const string &filename) { remove(filename.c_str()); } inline bool fileEqual(const string &filename1, const string &filename2) { char buf1[BUFSIZ]; char buf2[BUFSIZ]; ifstream stream1(filename1.c_str(), ios_base::in | ios_base::binary); ifstream stream2(filename2.c_str(), ios_base::in | ios_base::binary); if(!stream1 && !stream2) return true; if(!stream1 || !stream2) return false; for(;;) { stream1.read(buf1, BUFSIZ); stream2.read(buf2, BUFSIZ); streamsize n1 = stream1.gcount(); streamsize n2 = stream2.gcount(); if(n1 != n2) return false; if(n1 == 0) break; if(memcmp(buf1, buf2, static_cast<size_t>(n1)) != 0) return false; } return stream1.good() == stream2.good(); } #ifdef TAGLIB_STRING_H namespace TagLib { inline String longText(size_t length, bool random = false) { const wchar_t chars[] = L"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_"; std::wstring text(length, L'X'); if(random) { for(size_t i = 0; i < length; ++i) text[i] = chars[rand() % 53]; } return String(text); } } #endif class ScopedFileCopy { public: ScopedFileCopy(const string &filename, const string &ext, bool deleteFile=true) : m_deleteFile(deleteFile), m_filename(copyFile(filename, ext)) { } ~ScopedFileCopy() { if(m_deleteFile) deleteFile(m_filename); } string fileName() const { return m_filename; } private: const bool m_deleteFile; const string m_filename; }; ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������